ERC-721
Overview
Max Total Supply
318 NFP
Holders
136
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NFPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Penis
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-08 */ // File: node_modules\@openzeppelin\contracts\utils\Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @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\access\Ownable.sol /** * @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\utils\math\Math.sol /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } /// /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 is IERC165 { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } /// /// @dev Interface for the NFT Royalty Standard /// abstract contract ERC2981 is IERC2981 { constructor() {} /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == type(IERC165).interfaceId; } } contract Penis is ERC2981, ERC721Enumerable, Ownable { using Strings for uint256; using Math for uint256; string public _provenanceHash = ""; uint256 public _tokenMaxSimultaneousPurchaseAmount = 69; uint256 public _maxTokenSupply = 69000; // Can be extended at any time uint256 public _tokenPriceWei = 0.05 ether; uint256 public _royaltyPercentage = 5; bool public _saleIsActive = false; string public _tokenBaseURI = "https://nfpenis.com/token/"; string public _extension = ".json"; constructor() ERC721("Non-Fungible Penis", "NFP") {} /* * Set provenance once it's calculated */ function setProvenanceHash(string memory provenanceHash) public onlyOwner { _provenanceHash = provenanceHash; } function setTokenMaxSimultaneousPurchaseAmount( uint256 tokenMaxSimultaneousPurchaseAmount ) public onlyOwner { _tokenMaxSimultaneousPurchaseAmount = tokenMaxSimultaneousPurchaseAmount; } function setBaseURI(string memory newTokenBaseURI, string memory extension) public onlyOwner { _tokenBaseURI = newTokenBaseURI; _extension = extension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return bytes(_tokenBaseURI).length > 0 ? string( abi.encodePacked( _tokenBaseURI, tokenId.toString(), _extension ) ) : ""; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || interfaceId == type(IERC721Metadata).interfaceId; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function changeTokenPrice(uint256 newTokenPriceWei) public onlyOwner { require(newTokenPriceWei >= 0); _tokenPriceWei = newTokenPriceWei; } function changeRoyaltyPercentage(uint256 newRoyaltyPercentage) public onlyOwner { require(newRoyaltyPercentage >= 0); _royaltyPercentage = newRoyaltyPercentage; } function listOwnedTokenIds(address owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function flipSaleState() public onlyOwner { _saleIsActive = !_saleIsActive; } function mint(uint256 numberOfTokens, address destinationAddress) public payable { require( numberOfTokens > 0, "Cannot mint 0 or a negative amount of tokens" ); require( numberOfTokens <= _tokenMaxSimultaneousPurchaseAmount, "Cannot mint so many tokens at the same time" ); require(_saleIsActive, "Sale must be active to mint tokens"); require( (totalSupply() + numberOfTokens) < _maxTokenSupply, "Purchase would exceed max supply of tokens" ); if (msg.sender != owner()) { require( (_tokenPriceWei * numberOfTokens) <= msg.value, "Ether value sent is not correct" ); } // Mint for (uint256 i = 0; i < numberOfTokens; i++) { uint256 tokenId = totalSupply(); _safeMint(destinationAddress, tokenId); } } function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override(IERC2981) returns (address Receiver, uint256 RoyaltyAmount) { Receiver = owner(); RoyaltyAmount = ((salePrice * _royaltyPercentage) / 100).max(0); } }
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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenMaxSimultaneousPurchaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"changeRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPriceWei","type":"uint256"}],"name":"changeTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"listOwnedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"destinationAddress","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"Receiver","type":"address"},{"internalType":"uint256","name":"RoyaltyAmount","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":"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":"newTokenBaseURI","type":"string"},{"internalType":"string","name":"extension","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenMaxSimultaneousPurchaseAmount","type":"uint256"}],"name":"setTokenMaxSimultaneousPurchaseAmount","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b929190620002a1565b506045600c5562010d88600d5566b1a2bc2ec50000600e556005600f556000601060006101000a81548160ff0219169083151502179055506040518060400160405280601a81526020017f68747470733a2f2f6e6670656e69732e636f6d2f746f6b656e2f00000000000081525060119080519060200190620000b0929190620002a1565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060129080519060200190620000fe929190620002a1565b503480156200010c57600080fd5b506040518060400160405280601281526020017f4e6f6e2d46756e6769626c652050656e697300000000000000000000000000008152506040518060400160405280600381526020017f4e46500000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000191929190620002a1565b508060019080519060200190620001aa929190620002a1565b505050620001cd620001c1620001d360201b60201c565b620001db60201b60201c565b620003b6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002af9062000380565b90600052602060002090601f016020900481019282620002d357600085556200031f565b82601f10620002ee57805160ff19168380011785556200031f565b828001600101855582156200031f579182015b828111156200031e57825182559160200191906001019062000301565b5b5090506200032e919062000332565b5090565b5b808211156200034d57600081600090555060010162000333565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039957607f821691505b60208210811415620003b057620003af62000351565b5b50919050565b6147e780620003c66000396000f3fe60806040526004361061021a5760003560e01c80635b7792a91161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063f64c8af414610856578063fbc94f24146108815761021a565b806395d89b41146106d05780639ea0eb44146106fb578063a22cb46514610724578063b88d4fde1461074d578063bdc267e8146107765761021a565b806370a08231116100f257806370a082311461060a578063715018a6146106475780637cc918201461065e5780638da5cb5b1461068957806394bf804d146106b45761021a565b80635b7792a91461054e5780635d893ba0146105795780636352211e146105a45780636790a9de146105e15761021a565b80632f745c59116101a65780633ccfd60b116101755780633ccfd60b1461047d57806342842e0e146104945780634bd0d89c146104bd5780634f6ccce7146104e6578063534308cc146105235761021a565b80632f745c59146103d357806334918dfd146104105780633ae1dd9d146104275780633ca4fb76146104525761021a565b806310969523116101ed57806310969523146102ed57806318160ddd1461031657806322af68751461034157806323b872dd1461036c5780632a55205a146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e7f565b6108aa565b6040516102539190612ec7565b60405180910390f35b34801561026857600080fd5b50610271610ab4565b60405161027e9190612f7b565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612fd3565b610b46565b6040516102bb9190613041565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613088565b610bcb565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131fd565b610ce3565b005b34801561032257600080fd5b5061032b610d79565b6040516103389190613255565b60405180910390f35b34801561034d57600080fd5b50610356610d86565b6040516103639190613255565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613270565b610d8c565b005b3480156103a157600080fd5b506103bc60048036038101906103b791906132c3565b610dec565b6040516103ca929190613303565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190613088565b610e2f565b6040516104079190613255565b60405180910390f35b34801561041c57600080fd5b50610425610ed4565b005b34801561043357600080fd5b5061043c610f7c565b6040516104499190612f7b565b60405180910390f35b34801561045e57600080fd5b5061046761100a565b6040516104749190612f7b565b60405180910390f35b34801561048957600080fd5b50610492611098565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613270565b611163565b005b3480156104c957600080fd5b506104e460048036038101906104df9190612fd3565b611183565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd3565b611217565b60405161051a9190613255565b60405180910390f35b34801561052f57600080fd5b50610538611288565b6040516105459190612f7b565b60405180910390f35b34801561055a57600080fd5b50610563611316565b6040516105709190613255565b60405180910390f35b34801561058557600080fd5b5061058e61131c565b60405161059b9190612ec7565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612fd3565b61132f565b6040516105d89190613041565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061332c565b6113e1565b005b34801561061657600080fd5b50610631600480360381019061062c91906133a4565b61148f565b60405161063e9190613255565b60405180910390f35b34801561065357600080fd5b5061065c611547565b005b34801561066a57600080fd5b506106736115cf565b6040516106809190613255565b60405180910390f35b34801561069557600080fd5b5061069e6115d5565b6040516106ab9190613041565b60405180910390f35b6106ce60048036038101906106c991906133d1565b6115ff565b005b3480156106dc57600080fd5b506106e56117f1565b6040516106f29190612f7b565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612fd3565b611883565b005b34801561073057600080fd5b5061074b6004803603810190610746919061343d565b611909565b005b34801561075957600080fd5b50610774600480360381019061076f919061351e565b611a8a565b005b34801561078257600080fd5b5061079d600480360381019061079891906133a4565b611aec565b6040516107aa919061365f565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190612fd3565b611b9a565b6040516107e79190612f7b565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613681565b611c45565b6040516108249190612ec7565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906133a4565b611cd9565b005b34801561086257600080fd5b5061086b611dd1565b6040516108789190613255565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612fd3565b611dd7565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097557507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ac3906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906136f0565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182611e6b565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613794565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd68261132f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613826565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611ed7565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611ed7565b611c45565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb906138b8565b60405180910390fd5b610cde8383611edf565b505050565b610ceb611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610d096115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613924565b60405180910390fd5b80600b9080519060200190610d75929190612d70565b5050565b6000600880549050905090565b600e5481565b610d9d610d97611ed7565b82611f98565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906139b6565b60405180910390fd5b610de7838383612076565b505050565b600080610df76115d5565b9150610e2660006064600f5486610e0e9190613a05565b610e189190613a8e565b6122d290919063ffffffff16565b90509250929050565b6000610e3a8361148f565b8210610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613b31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610edc611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610efa6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613924565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60128054610f89906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906136f0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b60118054611017906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611043906136f0565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b6110a0611ed7565b73ffffffffffffffffffffffffffffffffffffffff166110be6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613924565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561115f573d6000803e3d6000fd5b5050565b61117e83838360405180602001604052806000815250611a8a565b505050565b61118b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166111a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613924565b60405180910390fd5b600081101561120d57600080fd5b80600f8190555050565b6000611221610d79565b8210611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613bc3565b60405180910390fd5b6008828154811061127657611275613be3565b5b90600052602060002001549050919050565b600b8054611295906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546112c1906136f0565b801561130e5780601f106112e35761010080835404028352916020019161130e565b820191906000526020600020905b8154815290600101906020018083116112f157829003601f168201915b505050505081565b600c5481565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613c84565b60405180910390fd5b80915050919050565b6113e9611ed7565b73ffffffffffffffffffffffffffffffffffffffff166114076115d5565b73ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613924565b60405180910390fd5b8160119080519060200190611473929190612d70565b50806012908051906020019061148a929190612d70565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613d16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154f611ed7565b73ffffffffffffffffffffffffffffffffffffffff1661156d6115d5565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613924565b60405180910390fd5b6115cd60006122ec565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008211611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613da8565b60405180910390fd5b600c54821115611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613e3a565b60405180910390fd5b601060009054906101000a900460ff166116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613ecc565b60405180910390fd5b600d54826116e2610d79565b6116ec9190613eec565b1061172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613fb4565b60405180910390fd5b6117346115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117b7573482600e546117759190613a05565b11156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614020565b60405180910390fd5b5b60005b828110156117ec5760006117cc610d79565b90506117d883826123b2565b5080806117e490614040565b9150506117ba565b505050565b606060018054611800906136f0565b80601f016020809104026020016040519081016040528092919081815260200182805461182c906136f0565b80156118795780601f1061184e57610100808354040283529160200191611879565b820191906000526020600020905b81548152906001019060200180831161185c57829003601f168201915b5050505050905090565b61188b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166118a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690613924565b60405180910390fd5b80600c8190555050565b611911611ed7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906140d5565b60405180910390fd5b806005600061198c611ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a39611ed7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7e9190612ec7565b60405180910390a35050565b611a9b611a95611ed7565b83611f98565b611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad1906139b6565b60405180910390fd5b611ae6848484846123d0565b50505050565b60606000611af98361148f565b905060008167ffffffffffffffff811115611b1757611b166130d2565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b50905060005b82811015611b8f57611b5d8582610e2f565b828281518110611b7057611b6f613be3565b5b6020026020010181815250508080611b8790614040565b915050611b4b565b508092505050919050565b6060611ba582611e6b565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614167565b60405180910390fd5b600060118054611bf3906136f0565b905011611c0f5760405180602001604052806000815250611c3e565b6011611c1a8361242c565b6012604051602001611c2e93929190614257565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ce1611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611cff6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613924565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906142fa565b60405180910390fd5b611dce816122ec565b50565b600f5481565b611ddf611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611dfd6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613924565b60405180910390fd5b6000811015611e6157600080fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f528361132f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fa382611e6b565b611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd99061438c565b60405180910390fd5b6000611fed8361132f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205c57508373ffffffffffffffffffffffffffffffffffffffff1661204484610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206d575061206c8185611c45565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120968261132f565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e39061441e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906144b0565b60405180910390fd5b61216783838361258d565b612172600082611edf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c291906144d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122199190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818310156122e257816122e4565b825b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123cc8282604051806020016040528060008152506126a1565b5050565b6123db848484612076565b6123e7848484846126fc565b612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614576565b60405180910390fd5b50505050565b60606000821415612474576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612588565b600082905060005b600082146124a657808061248f90614040565b915050600a8261249f9190613a8e565b915061247c565b60008167ffffffffffffffff8111156124c2576124c16130d2565b5b6040519080825280601f01601f1916602001820160405280156124f45781602001600182028036833780820191505090505b5090505b600085146125815760018261250d91906144d0565b9150600a8561251c9190614596565b60306125289190613eec565b60f81b81838151811061253e5761253d613be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257a9190613a8e565b94506124f8565b8093505050505b919050565b612598838383612884565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125db576125d681612889565b61261a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126195761261883826128d2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265d5761265881612a3f565b61269c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461269b5761269a8282612b10565b5b5b505050565b6126ab8383612b8f565b6126b860008484846126fc565b6126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614576565b60405180910390fd5b505050565b600061271d8473ffffffffffffffffffffffffffffffffffffffff16612d5d565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612746611ed7565b8786866040518563ffffffff1660e01b8152600401612768949392919061461c565b6020604051808303816000875af19250505080156127a457506040513d601f19601f820116820180604052508101906127a1919061467d565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614576565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128df8461148f565b6128e991906144d0565b90506000600760008481526020019081526020016000205490508181146129ce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5391906144d0565b9050600060096000848152602001908152602001600020549050600060088381548110612a8357612a82613be3565b5b906000526020600020015490508060088381548110612aa557612aa4613be3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612af457612af36146aa565b5b6001900381819060005260206000200160009055905550505050565b6000612b1b8361148f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690614725565b60405180910390fd5b612c0881611e6b565b15612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614791565b60405180910390fd5b612c546000838361258d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca49190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d7c906136f0565b90600052602060002090601f016020900481019282612d9e5760008555612de5565b82601f10612db757805160ff1916838001178555612de5565b82800160010185558215612de5579182015b82811115612de4578251825591602001919060010190612dc9565b5b509050612df29190612df6565b5090565b5b80821115612e0f576000816000905550600101612df7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5c81612e27565b8114612e6757600080fd5b50565b600081359050612e7981612e53565b92915050565b600060208284031215612e9557612e94612e1d565b5b6000612ea384828501612e6a565b91505092915050565b60008115159050919050565b612ec181612eac565b82525050565b6000602082019050612edc6000830184612eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1c578082015181840152602081019050612f01565b83811115612f2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4d82612ee2565b612f578185612eed565b9350612f67818560208601612efe565b612f7081612f31565b840191505092915050565b60006020820190508181036000830152612f958184612f42565b905092915050565b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612e1d565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612e1d565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310a82612f31565b810181811067ffffffffffffffff82111715613129576131286130d2565b5b80604052505050565b600061313c612e13565b90506131488282613101565b919050565b600067ffffffffffffffff821115613168576131676130d2565b5b61317182612f31565b9050602081019050919050565b82818337600083830152505050565b60006131a061319b8461314d565b613132565b9050828152602081018484840111156131bc576131bb6130cd565b5b6131c784828561317e565b509392505050565b600082601f8301126131e4576131e36130c8565b5b81356131f484826020860161318d565b91505092915050565b60006020828403121561321357613212612e1d565b5b600082013567ffffffffffffffff81111561323157613230612e22565b5b61323d848285016131cf565b91505092915050565b61324f81612f9d565b82525050565b600060208201905061326a6000830184613246565b92915050565b60008060006060848603121561328957613288612e1d565b5b600061329786828701613073565b93505060206132a886828701613073565b92505060406132b986828701612fbe565b9150509250925092565b600080604083850312156132da576132d9612e1d565b5b60006132e885828601612fbe565b92505060206132f985828601612fbe565b9150509250929050565b60006040820190506133186000830185613032565b6133256020830184613246565b9392505050565b6000806040838503121561334357613342612e1d565b5b600083013567ffffffffffffffff81111561336157613360612e22565b5b61336d858286016131cf565b925050602083013567ffffffffffffffff81111561338e5761338d612e22565b5b61339a858286016131cf565b9150509250929050565b6000602082840312156133ba576133b9612e1d565b5b60006133c884828501613073565b91505092915050565b600080604083850312156133e8576133e7612e1d565b5b60006133f685828601612fbe565b925050602061340785828601613073565b9150509250929050565b61341a81612eac565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b6000806040838503121561345457613453612e1d565b5b600061346285828601613073565b925050602061347385828601613428565b9150509250929050565b600067ffffffffffffffff821115613498576134976130d2565b5b6134a182612f31565b9050602081019050919050565b60006134c16134bc8461347d565b613132565b9050828152602081018484840111156134dd576134dc6130cd565b5b6134e884828561317e565b509392505050565b600082601f830112613505576135046130c8565b5b81356135158482602086016134ae565b91505092915050565b6000806000806080858703121561353857613537612e1d565b5b600061354687828801613073565b945050602061355787828801613073565b935050604061356887828801612fbe565b925050606085013567ffffffffffffffff81111561358957613588612e22565b5b613595878288016134f0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135d681612f9d565b82525050565b60006135e883836135cd565b60208301905092915050565b6000602082019050919050565b600061360c826135a1565b61361681856135ac565b9350613621836135bd565b8060005b8381101561365257815161363988826135dc565b9750613644836135f4565b925050600181019050613625565b5085935050505092915050565b600060208201905081810360008301526136798184613601565b905092915050565b6000806040838503121561369857613697612e1d565b5b60006136a685828601613073565b92505060206136b785828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6136c1565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061377e602c83612eed565b915061378982613722565b604082019050919050565b600060208201905081810360008301526137ad81613771565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613810602183612eed565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138a2603883612eed565b91506138ad82613846565b604082019050919050565b600060208201905081810360008301526138d181613895565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061390e602083612eed565b9150613919826138d8565b602082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006139a0603183612eed565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1082612f9d565b9150613a1b83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5457613a536139d6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a9982612f9d565b9150613aa483612f9d565b925082613ab457613ab3613a5f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b1b602b83612eed565b9150613b2682613abf565b604082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bad602c83612eed565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c6e602983612eed565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d00602a83612eed565b9150613d0b82613ca4565b604082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b7f43616e6e6f74206d696e742030206f722061206e6567617469766520616d6f7560008201527f6e74206f6620746f6b656e730000000000000000000000000000000000000000602082015250565b6000613d92602c83612eed565b9150613d9d82613d36565b604082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f43616e6e6f74206d696e7420736f206d616e7920746f6b656e7320617420746860008201527f652073616d652074696d65000000000000000000000000000000000000000000602082015250565b6000613e24602b83612eed565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb6602283612eed565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000613ef782612f9d565b9150613f0283612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3757613f366139d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000613f9e602a83612eed565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061400a601f83612eed565b915061401582613fd4565b602082019050919050565b6000602082019050818103600083015261403981613ffd565b9050919050565b600061404b82612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407e5761407d6139d6565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140bf601983612eed565b91506140ca82614089565b602082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614151602f83612eed565b915061415c826140f5565b604082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141b4816136f0565b6141be8186614187565b945060018216600081146141d957600181146141ea5761421d565b60ff1983168652818601935061421d565b6141f385614192565b60005b83811015614215578154818901526001820191506020810190506141f6565b838801955050505b50505092915050565b600061423182612ee2565b61423b8185614187565b935061424b818560208601612efe565b80840191505092915050565b600061426382866141a7565b915061426f8285614226565b915061427b82846141a7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142e4602683612eed565b91506142ef82614288565b604082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614376602c83612eed565b91506143818261431a565b604082019050919050565b600060208201905081810360008301526143a581614369565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614408602983612eed565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061449a602483612eed565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b60006144db82612f9d565b91506144e683612f9d565b9250828210156144f9576144f86139d6565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614560603283612eed565b915061456b82614504565b604082019050919050565b6000602082019050818103600083015261458f81614553565b9050919050565b60006145a182612f9d565b91506145ac83612f9d565b9250826145bc576145bb613a5f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006145ee826145c7565b6145f881856145d2565b9350614608818560208601612efe565b61461181612f31565b840191505092915050565b60006080820190506146316000830187613032565b61463e6020830186613032565b61464b6040830185613246565b818103606083015261465d81846145e3565b905095945050505050565b60008151905061467781612e53565b92915050565b60006020828403121561469357614692612e1d565b5b60006146a184828501614668565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061470f602083612eed565b915061471a826146d9565b602082019050919050565b6000602082019050818103600083015261473e81614702565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061477b601c83612eed565b915061478682614745565b602082019050919050565b600060208201905081810360008301526147aa8161476e565b905091905056fea2646970667358221220240e0981b6cae37b8cba36be538c6b5319f6a56cea5b756b7adf3da91635255864736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80635b7792a91161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063f64c8af414610856578063fbc94f24146108815761021a565b806395d89b41146106d05780639ea0eb44146106fb578063a22cb46514610724578063b88d4fde1461074d578063bdc267e8146107765761021a565b806370a08231116100f257806370a082311461060a578063715018a6146106475780637cc918201461065e5780638da5cb5b1461068957806394bf804d146106b45761021a565b80635b7792a91461054e5780635d893ba0146105795780636352211e146105a45780636790a9de146105e15761021a565b80632f745c59116101a65780633ccfd60b116101755780633ccfd60b1461047d57806342842e0e146104945780634bd0d89c146104bd5780634f6ccce7146104e6578063534308cc146105235761021a565b80632f745c59146103d357806334918dfd146104105780633ae1dd9d146104275780633ca4fb76146104525761021a565b806310969523116101ed57806310969523146102ed57806318160ddd1461031657806322af68751461034157806323b872dd1461036c5780632a55205a146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e7f565b6108aa565b6040516102539190612ec7565b60405180910390f35b34801561026857600080fd5b50610271610ab4565b60405161027e9190612f7b565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612fd3565b610b46565b6040516102bb9190613041565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613088565b610bcb565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131fd565b610ce3565b005b34801561032257600080fd5b5061032b610d79565b6040516103389190613255565b60405180910390f35b34801561034d57600080fd5b50610356610d86565b6040516103639190613255565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613270565b610d8c565b005b3480156103a157600080fd5b506103bc60048036038101906103b791906132c3565b610dec565b6040516103ca929190613303565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190613088565b610e2f565b6040516104079190613255565b60405180910390f35b34801561041c57600080fd5b50610425610ed4565b005b34801561043357600080fd5b5061043c610f7c565b6040516104499190612f7b565b60405180910390f35b34801561045e57600080fd5b5061046761100a565b6040516104749190612f7b565b60405180910390f35b34801561048957600080fd5b50610492611098565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613270565b611163565b005b3480156104c957600080fd5b506104e460048036038101906104df9190612fd3565b611183565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd3565b611217565b60405161051a9190613255565b60405180910390f35b34801561052f57600080fd5b50610538611288565b6040516105459190612f7b565b60405180910390f35b34801561055a57600080fd5b50610563611316565b6040516105709190613255565b60405180910390f35b34801561058557600080fd5b5061058e61131c565b60405161059b9190612ec7565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612fd3565b61132f565b6040516105d89190613041565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061332c565b6113e1565b005b34801561061657600080fd5b50610631600480360381019061062c91906133a4565b61148f565b60405161063e9190613255565b60405180910390f35b34801561065357600080fd5b5061065c611547565b005b34801561066a57600080fd5b506106736115cf565b6040516106809190613255565b60405180910390f35b34801561069557600080fd5b5061069e6115d5565b6040516106ab9190613041565b60405180910390f35b6106ce60048036038101906106c991906133d1565b6115ff565b005b3480156106dc57600080fd5b506106e56117f1565b6040516106f29190612f7b565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612fd3565b611883565b005b34801561073057600080fd5b5061074b6004803603810190610746919061343d565b611909565b005b34801561075957600080fd5b50610774600480360381019061076f919061351e565b611a8a565b005b34801561078257600080fd5b5061079d600480360381019061079891906133a4565b611aec565b6040516107aa919061365f565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190612fd3565b611b9a565b6040516107e79190612f7b565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613681565b611c45565b6040516108249190612ec7565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906133a4565b611cd9565b005b34801561086257600080fd5b5061086b611dd1565b6040516108789190613255565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612fd3565b611dd7565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097557507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ac3906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906136f0565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182611e6b565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613794565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd68261132f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613826565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611ed7565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611ed7565b611c45565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb906138b8565b60405180910390fd5b610cde8383611edf565b505050565b610ceb611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610d096115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613924565b60405180910390fd5b80600b9080519060200190610d75929190612d70565b5050565b6000600880549050905090565b600e5481565b610d9d610d97611ed7565b82611f98565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906139b6565b60405180910390fd5b610de7838383612076565b505050565b600080610df76115d5565b9150610e2660006064600f5486610e0e9190613a05565b610e189190613a8e565b6122d290919063ffffffff16565b90509250929050565b6000610e3a8361148f565b8210610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613b31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610edc611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610efa6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613924565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60128054610f89906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906136f0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b60118054611017906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611043906136f0565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b6110a0611ed7565b73ffffffffffffffffffffffffffffffffffffffff166110be6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613924565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561115f573d6000803e3d6000fd5b5050565b61117e83838360405180602001604052806000815250611a8a565b505050565b61118b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166111a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613924565b60405180910390fd5b600081101561120d57600080fd5b80600f8190555050565b6000611221610d79565b8210611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613bc3565b60405180910390fd5b6008828154811061127657611275613be3565b5b90600052602060002001549050919050565b600b8054611295906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546112c1906136f0565b801561130e5780601f106112e35761010080835404028352916020019161130e565b820191906000526020600020905b8154815290600101906020018083116112f157829003601f168201915b505050505081565b600c5481565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613c84565b60405180910390fd5b80915050919050565b6113e9611ed7565b73ffffffffffffffffffffffffffffffffffffffff166114076115d5565b73ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613924565b60405180910390fd5b8160119080519060200190611473929190612d70565b50806012908051906020019061148a929190612d70565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613d16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154f611ed7565b73ffffffffffffffffffffffffffffffffffffffff1661156d6115d5565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613924565b60405180910390fd5b6115cd60006122ec565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008211611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613da8565b60405180910390fd5b600c54821115611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613e3a565b60405180910390fd5b601060009054906101000a900460ff166116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613ecc565b60405180910390fd5b600d54826116e2610d79565b6116ec9190613eec565b1061172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613fb4565b60405180910390fd5b6117346115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117b7573482600e546117759190613a05565b11156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614020565b60405180910390fd5b5b60005b828110156117ec5760006117cc610d79565b90506117d883826123b2565b5080806117e490614040565b9150506117ba565b505050565b606060018054611800906136f0565b80601f016020809104026020016040519081016040528092919081815260200182805461182c906136f0565b80156118795780601f1061184e57610100808354040283529160200191611879565b820191906000526020600020905b81548152906001019060200180831161185c57829003601f168201915b5050505050905090565b61188b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166118a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690613924565b60405180910390fd5b80600c8190555050565b611911611ed7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906140d5565b60405180910390fd5b806005600061198c611ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a39611ed7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7e9190612ec7565b60405180910390a35050565b611a9b611a95611ed7565b83611f98565b611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad1906139b6565b60405180910390fd5b611ae6848484846123d0565b50505050565b60606000611af98361148f565b905060008167ffffffffffffffff811115611b1757611b166130d2565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b50905060005b82811015611b8f57611b5d8582610e2f565b828281518110611b7057611b6f613be3565b5b6020026020010181815250508080611b8790614040565b915050611b4b565b508092505050919050565b6060611ba582611e6b565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614167565b60405180910390fd5b600060118054611bf3906136f0565b905011611c0f5760405180602001604052806000815250611c3e565b6011611c1a8361242c565b6012604051602001611c2e93929190614257565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ce1611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611cff6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613924565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906142fa565b60405180910390fd5b611dce816122ec565b50565b600f5481565b611ddf611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611dfd6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613924565b60405180910390fd5b6000811015611e6157600080fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f528361132f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fa382611e6b565b611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd99061438c565b60405180910390fd5b6000611fed8361132f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205c57508373ffffffffffffffffffffffffffffffffffffffff1661204484610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206d575061206c8185611c45565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120968261132f565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e39061441e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906144b0565b60405180910390fd5b61216783838361258d565b612172600082611edf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c291906144d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122199190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818310156122e257816122e4565b825b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123cc8282604051806020016040528060008152506126a1565b5050565b6123db848484612076565b6123e7848484846126fc565b612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614576565b60405180910390fd5b50505050565b60606000821415612474576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612588565b600082905060005b600082146124a657808061248f90614040565b915050600a8261249f9190613a8e565b915061247c565b60008167ffffffffffffffff8111156124c2576124c16130d2565b5b6040519080825280601f01601f1916602001820160405280156124f45781602001600182028036833780820191505090505b5090505b600085146125815760018261250d91906144d0565b9150600a8561251c9190614596565b60306125289190613eec565b60f81b81838151811061253e5761253d613be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257a9190613a8e565b94506124f8565b8093505050505b919050565b612598838383612884565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125db576125d681612889565b61261a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126195761261883826128d2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265d5761265881612a3f565b61269c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461269b5761269a8282612b10565b5b5b505050565b6126ab8383612b8f565b6126b860008484846126fc565b6126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614576565b60405180910390fd5b505050565b600061271d8473ffffffffffffffffffffffffffffffffffffffff16612d5d565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612746611ed7565b8786866040518563ffffffff1660e01b8152600401612768949392919061461c565b6020604051808303816000875af19250505080156127a457506040513d601f19601f820116820180604052508101906127a1919061467d565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614576565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128df8461148f565b6128e991906144d0565b90506000600760008481526020019081526020016000205490508181146129ce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5391906144d0565b9050600060096000848152602001908152602001600020549050600060088381548110612a8357612a82613be3565b5b906000526020600020015490508060088381548110612aa557612aa4613be3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612af457612af36146aa565b5b6001900381819060005260206000200160009055905550505050565b6000612b1b8361148f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690614725565b60405180910390fd5b612c0881611e6b565b15612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614791565b60405180910390fd5b612c546000838361258d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca49190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d7c906136f0565b90600052602060002090601f016020900481019282612d9e5760008555612de5565b82601f10612db757805160ff1916838001178555612de5565b82800160010185558215612de5579182015b82811115612de4578251825591602001919060010190612dc9565b5b509050612df29190612df6565b5090565b5b80821115612e0f576000816000905550600101612df7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5c81612e27565b8114612e6757600080fd5b50565b600081359050612e7981612e53565b92915050565b600060208284031215612e9557612e94612e1d565b5b6000612ea384828501612e6a565b91505092915050565b60008115159050919050565b612ec181612eac565b82525050565b6000602082019050612edc6000830184612eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1c578082015181840152602081019050612f01565b83811115612f2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4d82612ee2565b612f578185612eed565b9350612f67818560208601612efe565b612f7081612f31565b840191505092915050565b60006020820190508181036000830152612f958184612f42565b905092915050565b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612e1d565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612e1d565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310a82612f31565b810181811067ffffffffffffffff82111715613129576131286130d2565b5b80604052505050565b600061313c612e13565b90506131488282613101565b919050565b600067ffffffffffffffff821115613168576131676130d2565b5b61317182612f31565b9050602081019050919050565b82818337600083830152505050565b60006131a061319b8461314d565b613132565b9050828152602081018484840111156131bc576131bb6130cd565b5b6131c784828561317e565b509392505050565b600082601f8301126131e4576131e36130c8565b5b81356131f484826020860161318d565b91505092915050565b60006020828403121561321357613212612e1d565b5b600082013567ffffffffffffffff81111561323157613230612e22565b5b61323d848285016131cf565b91505092915050565b61324f81612f9d565b82525050565b600060208201905061326a6000830184613246565b92915050565b60008060006060848603121561328957613288612e1d565b5b600061329786828701613073565b93505060206132a886828701613073565b92505060406132b986828701612fbe565b9150509250925092565b600080604083850312156132da576132d9612e1d565b5b60006132e885828601612fbe565b92505060206132f985828601612fbe565b9150509250929050565b60006040820190506133186000830185613032565b6133256020830184613246565b9392505050565b6000806040838503121561334357613342612e1d565b5b600083013567ffffffffffffffff81111561336157613360612e22565b5b61336d858286016131cf565b925050602083013567ffffffffffffffff81111561338e5761338d612e22565b5b61339a858286016131cf565b9150509250929050565b6000602082840312156133ba576133b9612e1d565b5b60006133c884828501613073565b91505092915050565b600080604083850312156133e8576133e7612e1d565b5b60006133f685828601612fbe565b925050602061340785828601613073565b9150509250929050565b61341a81612eac565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b6000806040838503121561345457613453612e1d565b5b600061346285828601613073565b925050602061347385828601613428565b9150509250929050565b600067ffffffffffffffff821115613498576134976130d2565b5b6134a182612f31565b9050602081019050919050565b60006134c16134bc8461347d565b613132565b9050828152602081018484840111156134dd576134dc6130cd565b5b6134e884828561317e565b509392505050565b600082601f830112613505576135046130c8565b5b81356135158482602086016134ae565b91505092915050565b6000806000806080858703121561353857613537612e1d565b5b600061354687828801613073565b945050602061355787828801613073565b935050604061356887828801612fbe565b925050606085013567ffffffffffffffff81111561358957613588612e22565b5b613595878288016134f0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135d681612f9d565b82525050565b60006135e883836135cd565b60208301905092915050565b6000602082019050919050565b600061360c826135a1565b61361681856135ac565b9350613621836135bd565b8060005b8381101561365257815161363988826135dc565b9750613644836135f4565b925050600181019050613625565b5085935050505092915050565b600060208201905081810360008301526136798184613601565b905092915050565b6000806040838503121561369857613697612e1d565b5b60006136a685828601613073565b92505060206136b785828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6136c1565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061377e602c83612eed565b915061378982613722565b604082019050919050565b600060208201905081810360008301526137ad81613771565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613810602183612eed565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138a2603883612eed565b91506138ad82613846565b604082019050919050565b600060208201905081810360008301526138d181613895565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061390e602083612eed565b9150613919826138d8565b602082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006139a0603183612eed565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1082612f9d565b9150613a1b83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5457613a536139d6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a9982612f9d565b9150613aa483612f9d565b925082613ab457613ab3613a5f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b1b602b83612eed565b9150613b2682613abf565b604082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bad602c83612eed565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c6e602983612eed565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d00602a83612eed565b9150613d0b82613ca4565b604082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b7f43616e6e6f74206d696e742030206f722061206e6567617469766520616d6f7560008201527f6e74206f6620746f6b656e730000000000000000000000000000000000000000602082015250565b6000613d92602c83612eed565b9150613d9d82613d36565b604082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f43616e6e6f74206d696e7420736f206d616e7920746f6b656e7320617420746860008201527f652073616d652074696d65000000000000000000000000000000000000000000602082015250565b6000613e24602b83612eed565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb6602283612eed565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000613ef782612f9d565b9150613f0283612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3757613f366139d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000613f9e602a83612eed565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061400a601f83612eed565b915061401582613fd4565b602082019050919050565b6000602082019050818103600083015261403981613ffd565b9050919050565b600061404b82612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407e5761407d6139d6565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140bf601983612eed565b91506140ca82614089565b602082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614151602f83612eed565b915061415c826140f5565b604082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141b4816136f0565b6141be8186614187565b945060018216600081146141d957600181146141ea5761421d565b60ff1983168652818601935061421d565b6141f385614192565b60005b83811015614215578154818901526001820191506020810190506141f6565b838801955050505b50505092915050565b600061423182612ee2565b61423b8185614187565b935061424b818560208601612efe565b80840191505092915050565b600061426382866141a7565b915061426f8285614226565b915061427b82846141a7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142e4602683612eed565b91506142ef82614288565b604082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614376602c83612eed565b91506143818261431a565b604082019050919050565b600060208201905081810360008301526143a581614369565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614408602983612eed565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061449a602483612eed565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b60006144db82612f9d565b91506144e683612f9d565b9250828210156144f9576144f86139d6565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614560603283612eed565b915061456b82614504565b604082019050919050565b6000602082019050818103600083015261458f81614553565b9050919050565b60006145a182612f9d565b91506145ac83612f9d565b9250826145bc576145bb613a5f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006145ee826145c7565b6145f881856145d2565b9350614608818560208601612efe565b61461181612f31565b840191505092915050565b60006080820190506146316000830187613032565b61463e6020830186613032565b61464b6040830185613246565b818103606083015261465d81846145e3565b905095945050505050565b60008151905061467781612e53565b92915050565b60006020828403121561469357614692612e1d565b5b60006146a184828501614668565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061470f602083612eed565b915061471a826146d9565b602082019050919050565b6000602082019050818103600083015261473e81614702565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061477b601c83612eed565b915061478682614745565b602082019050919050565b600060208201905081810360008301526147aa8161476e565b905091905056fea2646970667358221220240e0981b6cae37b8cba36be538c6b5319f6a56cea5b756b7adf3da91635255864736f6c634300080b0033
Deployed Bytecode Sourcemap
46802:4738:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48688:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25285:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26978:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26501:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47468:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39719:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47106:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28037:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51245:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;39300:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50132:91;;;;;;;;;;;;;:::i;:::-;;47304:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47239:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49190:143;;;;;;;;;;;;;:::i;:::-;;28484:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49511:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39909:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46925:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46968:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47199:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24892:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47824:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24535:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2525:94;;;;;;;;;;;;;:::i;:::-;;47030:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1874:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50231:1006;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25454:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47601:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27358:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28740:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49727:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48031:585;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27756:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2774:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47155:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49341:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48688:494;48845:4;48902:26;48887:41;;;:11;:41;;;;:98;;;;48960:25;48945:40;;;:11;:40;;;;48887:98;:155;;;;49017:25;49002:40;;;:11;:40;;;;48887:155;:222;;;;49074:35;49059:50;;;:11;:50;;;;48887:222;:287;;;;49141:33;49126:48;;;:11;:48;;;;48887:287;48867:307;;48688:494;;;:::o;25285:100::-;25339:13;25372:5;25365:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25285:100;:::o;26978:308::-;27099:7;27146:16;27154:7;27146;:16::i;:::-;27124:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27254:15;:24;27270:7;27254:24;;;;;;;;;;;;;;;;;;;;;27247:31;;26978:308;;;:::o;26501:411::-;26582:13;26598:23;26613:7;26598:14;:23::i;:::-;26582:39;;26646:5;26640:11;;:2;:11;;;;26632:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26740:5;26724:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26749:37;26766:5;26773:12;:10;:12::i;:::-;26749:16;:37::i;:::-;26724:62;26702:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26883:21;26892:2;26896:7;26883:8;:21::i;:::-;26571:341;26501:411;;:::o;47468:125::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47571:14:::1;47553:15;:32;;;;;;;;;;;;:::i;:::-;;47468:125:::0;:::o;39719:113::-;39780:7;39807:10;:17;;;;39800:24;;39719:113;:::o;47106:42::-;;;;:::o;28037:376::-;28246:41;28265:12;:10;:12::i;:::-;28279:7;28246:18;:41::i;:::-;28224:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28377:28;28387:4;28393:2;28397:7;28377:9;:28::i;:::-;28037:376;;;:::o;51245:292::-;51380:16;51398:21;51448:7;:5;:7::i;:::-;51437:18;;51482:47;51527:1;51518:3;51496:18;;51484:9;:30;;;;:::i;:::-;51483:38;;;;:::i;:::-;51482:44;;:47;;;;:::i;:::-;51466:63;;51245:292;;;;;:::o;39300:343::-;39442:7;39497:23;39514:5;39497:16;:23::i;:::-;39489:5;:31;39467:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39609:12;:19;39622:5;39609:19;;;;;;;;;;;;;;;:26;39629:5;39609:26;;;;;;;;;;;;39602:33;;39300:343;;;;:::o;50132:91::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:13:::1;;;;;;;;;;;50201:14;50185:13;;:30;;;;;;;;;;;;;;;;;;50132:91::o:0;47304:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47239:58::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49190:143::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49238:15:::1;49256:21;49238:39;;49296:10;49288:28;;:37;49317:7;49288:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49227:106;49190:143::o:0;28484:185::-;28622:39;28639:4;28645:2;28649:7;28622:39;;;;;;;;;;;;:16;:39::i;:::-;28484:185;;;:::o;49511:208::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49657:1:::1;49633:20;:25;;49625:34;;;::::0;::::1;;49691:20;49670:18;:41;;;;49511:208:::0;:::o;39909:320::-;40029:7;40084:30;:28;:30::i;:::-;40076:5;:38;40054:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;40204:10;40215:5;40204:17;;;;;;;;:::i;:::-;;;;;;;;;;40197:24;;39909:320;;;:::o;46925:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46968:55::-;;;;:::o;47199:33::-;;;;;;;;;;;;;:::o;24892:326::-;25009:7;25034:13;25050:7;:16;25058:7;25050:16;;;;;;;;;;;;;;;;;;;;;25034:32;;25116:1;25099:19;;:5;:19;;;;25077:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25205:5;25198:12;;;24892:326;;;:::o;47824:199::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47967:15:::1;47951:13;:31;;;;;;;;;;;;:::i;:::-;;48006:9;47993:10;:22;;;;;;;;;;;;:::i;:::-;;47824:199:::0;;:::o;24535:295::-;24652:7;24716:1;24699:19;;:5;:19;;;;24677:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24806:9;:16;24816:5;24806:16;;;;;;;;;;;;;;;;24799:23;;24535:295;;;:::o;2525:94::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2590:21:::1;2608:1;2590:9;:21::i;:::-;2525:94::o:0;47030:38::-;;;;:::o;1874:87::-;1920:7;1947:6;;;;;;;;;;;1940:13;;1874:87;:::o;50231:1006::-;50385:1;50368:14;:18;50346:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;50509:35;;50491:14;:53;;50469:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;50634:13;;;;;;;;;;;50626:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50754:15;;50736:14;50720:13;:11;:13::i;:::-;:30;;;;:::i;:::-;50719:50;50697:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;50870:7;:5;:7::i;:::-;50856:21;;:10;:21;;;50852:193;;50957:9;50938:14;50921;;:31;;;;:::i;:::-;50920:46;;50894:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50852:193;51079:9;51074:156;51098:14;51094:1;:18;51074:156;;;51134:15;51152:13;:11;:13::i;:::-;51134:31;;51180:38;51190:18;51210:7;51180:9;:38::i;:::-;51119:111;51114:3;;;;;:::i;:::-;;;;51074:156;;;;50231:1006;;:::o;25454:104::-;25510:13;25543:7;25536:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:104;:::o;47601:215::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47774:34:::1;47736:35;:72;;;;47601:215:::0;:::o;27358:327::-;27505:12;:10;:12::i;:::-;27493:24;;:8;:24;;;;27485:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27605:8;27560:18;:32;27579:12;:10;:12::i;:::-;27560:32;;;;;;;;;;;;;;;:42;27593:8;27560:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27658:8;27629:48;;27644:12;:10;:12::i;:::-;27629:48;;;27668:8;27629:48;;;;;;:::i;:::-;;;;;;;;27358:327;;:::o;28740:365::-;28929:41;28948:12;:10;:12::i;:::-;28962:7;28929:18;:41::i;:::-;28907:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29058:39;29072:4;29078:2;29082:7;29091:5;29058:13;:39::i;:::-;28740:365;;;;:::o;49727:397::-;49817:16;49851:23;49877:16;49887:5;49877:9;:16::i;:::-;49851:42;;49906:25;49948:15;49934:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49906:58;;49982:9;49977:112;49997:15;49993:1;:19;49977:112;;;50048:29;50068:5;50075:1;50048:19;:29::i;:::-;50034:8;50043:1;50034:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;50014:3;;;;;:::i;:::-;;;;49977:112;;;;50108:8;50101:15;;;;49727:397;;;:::o;48031:585::-;48149:13;48202:16;48210:7;48202;:16::i;:::-;48180:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;48356:1;48332:13;48326:27;;;;;:::i;:::-;;;:31;:282;;;;;;;;;;;;;;;;;48449:13;48489:18;:7;:16;:18::i;:::-;48534:10;48406:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48326:282;48306:302;;48031:585;;;:::o;27756:214::-;27898:4;27927:18;:25;27946:5;27927:25;;;;;;;;;;;;;;;:35;27953:8;27927:35;;;;;;;;;;;;;;;;;;;;;;;;;27920:42;;27756:214;;;;:::o;2774:229::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2897:1:::1;2877:22;;:8;:22;;;;2855:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2976:19;2986:8;2976:9;:19::i;:::-;2774:229:::0;:::o;47155:37::-;;;;:::o;49341:162::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49449:1:::1;49429:16;:21;;49421:30;;;::::0;::::1;;49479:16;49462:14;:33;;;;49341:162:::0;:::o;30652:127::-;30717:4;30769:1;30741:30;;:7;:16;30749:7;30741:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30734:37;;30652:127;;;:::o;670:98::-;723:7;750:10;743:17;;670:98;:::o;34775:174::-;34877:2;34850:15;:24;34866:7;34850:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34933:7;34929:2;34895:46;;34904:23;34919:7;34904:14;:23::i;:::-;34895:46;;;;;;;;;;;;34775:174;;:::o;30946:452::-;31075:4;31119:16;31127:7;31119;:16::i;:::-;31097:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31218:13;31234:23;31249:7;31234:14;:23::i;:::-;31218:39;;31287:5;31276:16;;:7;:16;;;:64;;;;31333:7;31309:31;;:20;31321:7;31309:11;:20::i;:::-;:31;;;31276:64;:113;;;;31357:32;31374:5;31381:7;31357:16;:32::i;:::-;31276:113;31268:122;;;30946:452;;;;:::o;34042:615::-;34215:4;34188:31;;:23;34203:7;34188:14;:23::i;:::-;:31;;;34166:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;34321:1;34307:16;;:2;:16;;;;34299:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34377:39;34398:4;34404:2;34408:7;34377:20;:39::i;:::-;34481:29;34498:1;34502:7;34481:8;:29::i;:::-;34542:1;34523:9;:15;34533:4;34523:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34571:1;34554:9;:13;34564:2;34554:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34602:2;34583:7;:16;34591:7;34583:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34641:7;34637:2;34622:27;;34631:4;34622:27;;;;;;;;;;;;34042:615;;;:::o;3411:107::-;3469:7;3501:1;3496;:6;;:14;;3509:1;3496:14;;;3505:1;3496:14;3489:21;;3411:107;;;;:::o;3011:173::-;3067:16;3086:6;;;;;;;;;;;3067:25;;3112:8;3103:6;;:17;;;;;;;;;;;;;;;;;;3167:8;3136:40;;3157:8;3136:40;;;;;;;;;;;;3056:128;3011:173;:::o;31740:110::-;31816:26;31826:2;31830:7;31816:26;;;;;;;;;;;;:9;:26::i;:::-;31740:110;;:::o;29987:352::-;30144:28;30154:4;30160:2;30164:7;30144:9;:28::i;:::-;30205:48;30228:4;30234:2;30238:7;30247:5;30205:22;:48::i;:::-;30183:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;29987:352;;;;:::o;4612:723::-;4668:13;4898:1;4889:5;:10;4885:53;;;4916:10;;;;;;;;;;;;;;;;;;;;;4885:53;4948:12;4963:5;4948:20;;4979:14;5004:78;5019:1;5011:4;:9;5004:78;;5037:8;;;;;:::i;:::-;;;;5068:2;5060:10;;;;;:::i;:::-;;;5004:78;;;5092:19;5124:6;5114:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5092:39;;5142:154;5158:1;5149:5;:10;5142:154;;5186:1;5176:11;;;;;:::i;:::-;;;5253:2;5245:5;:10;;;;:::i;:::-;5232:2;:24;;;;:::i;:::-;5219:39;;5202:6;5209;5202:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5282:2;5273:11;;;;;:::i;:::-;;;5142:154;;;5320:6;5306:21;;;;;4612:723;;;;:::o;40842:589::-;40986:45;41013:4;41019:2;41023:7;40986:26;:45::i;:::-;41064:1;41048:18;;:4;:18;;;41044:187;;;41083:40;41115:7;41083:31;:40::i;:::-;41044:187;;;41153:2;41145:10;;:4;:10;;;41141:90;;41172:47;41205:4;41211:7;41172:32;:47::i;:::-;41141:90;41044:187;41259:1;41245:16;;:2;:16;;;41241:183;;;41278:45;41315:7;41278:36;:45::i;:::-;41241:183;;;41351:4;41345:10;;:2;:10;;;41341:83;;41372:40;41400:2;41404:7;41372:27;:40::i;:::-;41341:83;41241:183;40842:589;;;:::o;32077:321::-;32207:18;32213:2;32217:7;32207:5;:18::i;:::-;32258:54;32289:1;32293:2;32297:7;32306:5;32258:22;:54::i;:::-;32236:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32077:321;;;:::o;35514:980::-;35669:4;35690:15;:2;:13;;;:15::i;:::-;35686:801;;;35759:2;35743:36;;;35802:12;:10;:12::i;:::-;35837:4;35864:7;35894:5;35743:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35722:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36118:1;36101:6;:13;:18;36097:320;;;36144:108;;;;;;;;;;:::i;:::-;;;;;;;;36097:320;36367:6;36361:13;36352:6;36348:2;36344:15;36337:38;35722:710;35992:41;;;35982:51;;;:6;:51;;;;35975:58;;;;;35686:801;36471:4;36464:11;;35514:980;;;;;;;:::o;37066:126::-;;;;:::o;42154:164::-;42258:10;:17;;;;42231:15;:24;42247:7;42231:24;;;;;;;;;;;:44;;;;42286:10;42302:7;42286:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:164;:::o;42945:1002::-;43225:22;43275:1;43250:22;43267:4;43250:16;:22::i;:::-;:26;;;;:::i;:::-;43225:51;;43287:18;43308:17;:26;43326:7;43308:26;;;;;;;;;;;;43287:47;;43455:14;43441:10;:28;43437:328;;43486:19;43508:12;:18;43521:4;43508:18;;;;;;;;;;;;;;;:34;43527:14;43508:34;;;;;;;;;;;;43486:56;;43592:11;43559:12;:18;43572:4;43559:18;;;;;;;;;;;;;;;:30;43578:10;43559:30;;;;;;;;;;;:44;;;;43709:10;43676:17;:30;43694:11;43676:30;;;;;;;;;;;:43;;;;43471:294;43437:328;43861:17;:26;43879:7;43861:26;;;;;;;;;;;43854:33;;;43905:12;:18;43918:4;43905:18;;;;;;;;;;;;;;;:34;43924:14;43905:34;;;;;;;;;;;43898:41;;;43040:907;;42945:1002;;:::o;44242:1079::-;44495:22;44540:1;44520:10;:17;;;;:21;;;;:::i;:::-;44495:46;;44552:18;44573:15;:24;44589:7;44573:24;;;;;;;;;;;;44552:45;;44924:19;44946:10;44957:14;44946:26;;;;;;;;:::i;:::-;;;;;;;;;;44924:48;;45010:11;44985:10;44996;44985:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45121:10;45090:15;:28;45106:11;45090:28;;;;;;;;;;;:41;;;;45262:15;:24;45278:7;45262:24;;;;;;;;;;;45255:31;;;45297:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44313:1008;;;44242:1079;:::o;41732:221::-;41817:14;41834:20;41851:2;41834:16;:20::i;:::-;41817:37;;41892:7;41865:12;:16;41878:2;41865:16;;;;;;;;;;;;;;;:24;41882:6;41865:24;;;;;;;;;;;:34;;;;41939:6;41910:17;:26;41928:7;41910:26;;;;;;;;;;;:35;;;;41806:147;41732:221;;:::o;32734:382::-;32828:1;32814:16;;:2;:16;;;;32806:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32887:16;32895:7;32887;:16::i;:::-;32886:17;32878:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32949:45;32978:1;32982:2;32986:7;32949:20;:45::i;:::-;33024:1;33007:9;:13;33017:2;33007:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33055:2;33036:7;:16;33044:7;33036:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33100:7;33096:2;33075:33;;33092:1;33075:33;;;;;;;;;;;;32734:382;;:::o;14179:387::-;14239:4;14447:12;14514:7;14502:20;14494:28;;14557:1;14550:4;:8;14543:15;;;14179:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:474::-;8604:6;8612;8661:2;8649:9;8640:7;8636:23;8632:32;8629:119;;;8667:79;;:::i;:::-;8629:119;8787:1;8812:53;8857:7;8848:6;8837:9;8833:22;8812:53;:::i;:::-;8802:63;;8758:117;8914:2;8940:53;8985:7;8976:6;8965:9;8961:22;8940:53;:::i;:::-;8930:63;;8885:118;8536:474;;;;;:::o;9016:332::-;9137:4;9175:2;9164:9;9160:18;9152:26;;9188:71;9256:1;9245:9;9241:17;9232:6;9188:71;:::i;:::-;9269:72;9337:2;9326:9;9322:18;9313:6;9269:72;:::i;:::-;9016:332;;;;;:::o;9354:834::-;9442:6;9450;9499:2;9487:9;9478:7;9474:23;9470:32;9467:119;;;9505:79;;:::i;:::-;9467:119;9653:1;9642:9;9638:17;9625:31;9683:18;9675:6;9672:30;9669:117;;;9705:79;;:::i;:::-;9669:117;9810:63;9865:7;9856:6;9845:9;9841:22;9810:63;:::i;:::-;9800:73;;9596:287;9950:2;9939:9;9935:18;9922:32;9981:18;9973:6;9970:30;9967:117;;;10003:79;;:::i;:::-;9967:117;10108:63;10163:7;10154:6;10143:9;10139:22;10108:63;:::i;:::-;10098:73;;9893:288;9354:834;;;;;:::o;10194:329::-;10253:6;10302:2;10290:9;10281:7;10277:23;10273:32;10270:119;;;10308:79;;:::i;:::-;10270:119;10428:1;10453:53;10498:7;10489:6;10478:9;10474:22;10453:53;:::i;:::-;10443:63;;10399:117;10194:329;;;;:::o;10529:474::-;10597:6;10605;10654:2;10642:9;10633:7;10629:23;10625:32;10622:119;;;10660:79;;:::i;:::-;10622:119;10780:1;10805:53;10850:7;10841:6;10830:9;10826:22;10805:53;:::i;:::-;10795:63;;10751:117;10907:2;10933:53;10978:7;10969:6;10958:9;10954:22;10933:53;:::i;:::-;10923:63;;10878:118;10529:474;;;;;:::o;11009:116::-;11079:21;11094:5;11079:21;:::i;:::-;11072:5;11069:32;11059:60;;11115:1;11112;11105:12;11059:60;11009:116;:::o;11131:133::-;11174:5;11212:6;11199:20;11190:29;;11228:30;11252:5;11228:30;:::i;:::-;11131:133;;;;:::o;11270:468::-;11335:6;11343;11392:2;11380:9;11371:7;11367:23;11363:32;11360:119;;;11398:79;;:::i;:::-;11360:119;11518:1;11543:53;11588:7;11579:6;11568:9;11564:22;11543:53;:::i;:::-;11533:63;;11489:117;11645:2;11671:50;11713:7;11704:6;11693:9;11689:22;11671:50;:::i;:::-;11661:60;;11616:115;11270:468;;;;;:::o;11744:307::-;11805:4;11895:18;11887:6;11884:30;11881:56;;;11917:18;;:::i;:::-;11881:56;11955:29;11977:6;11955:29;:::i;:::-;11947:37;;12039:4;12033;12029:15;12021:23;;11744:307;;;:::o;12057:410::-;12134:5;12159:65;12175:48;12216:6;12175:48;:::i;:::-;12159:65;:::i;:::-;12150:74;;12247:6;12240:5;12233:21;12285:4;12278:5;12274:16;12323:3;12314:6;12309:3;12305:16;12302:25;12299:112;;;12330:79;;:::i;:::-;12299:112;12420:41;12454:6;12449:3;12444;12420:41;:::i;:::-;12140:327;12057:410;;;;;:::o;12486:338::-;12541:5;12590:3;12583:4;12575:6;12571:17;12567:27;12557:122;;12598:79;;:::i;:::-;12557:122;12715:6;12702:20;12740:78;12814:3;12806:6;12799:4;12791:6;12787:17;12740:78;:::i;:::-;12731:87;;12547:277;12486:338;;;;:::o;12830:943::-;12925:6;12933;12941;12949;12998:3;12986:9;12977:7;12973:23;12969:33;12966:120;;;13005:79;;:::i;:::-;12966:120;13125:1;13150:53;13195:7;13186:6;13175:9;13171:22;13150:53;:::i;:::-;13140:63;;13096:117;13252:2;13278:53;13323:7;13314:6;13303:9;13299:22;13278:53;:::i;:::-;13268:63;;13223:118;13380:2;13406:53;13451:7;13442:6;13431:9;13427:22;13406:53;:::i;:::-;13396:63;;13351:118;13536:2;13525:9;13521:18;13508:32;13567:18;13559:6;13556:30;13553:117;;;13589:79;;:::i;:::-;13553:117;13694:62;13748:7;13739:6;13728:9;13724:22;13694:62;:::i;:::-;13684:72;;13479:287;12830:943;;;;;;;:::o;13779:114::-;13846:6;13880:5;13874:12;13864:22;;13779:114;;;:::o;13899:184::-;13998:11;14032:6;14027:3;14020:19;14072:4;14067:3;14063:14;14048:29;;13899:184;;;;:::o;14089:132::-;14156:4;14179:3;14171:11;;14209:4;14204:3;14200:14;14192:22;;14089:132;;;:::o;14227:108::-;14304:24;14322:5;14304:24;:::i;:::-;14299:3;14292:37;14227:108;;:::o;14341:179::-;14410:10;14431:46;14473:3;14465:6;14431:46;:::i;:::-;14509:4;14504:3;14500:14;14486:28;;14341:179;;;;:::o;14526:113::-;14596:4;14628;14623:3;14619:14;14611:22;;14526:113;;;:::o;14675:732::-;14794:3;14823:54;14871:5;14823:54;:::i;:::-;14893:86;14972:6;14967:3;14893:86;:::i;:::-;14886:93;;15003:56;15053:5;15003:56;:::i;:::-;15082:7;15113:1;15098:284;15123:6;15120:1;15117:13;15098:284;;;15199:6;15193:13;15226:63;15285:3;15270:13;15226:63;:::i;:::-;15219:70;;15312:60;15365:6;15312:60;:::i;:::-;15302:70;;15158:224;15145:1;15142;15138:9;15133:14;;15098:284;;;15102:14;15398:3;15391:10;;14799:608;;;14675:732;;;;:::o;15413:373::-;15556:4;15594:2;15583:9;15579:18;15571:26;;15643:9;15637:4;15633:20;15629:1;15618:9;15614:17;15607:47;15671:108;15774:4;15765:6;15671:108;:::i;:::-;15663:116;;15413:373;;;;:::o;15792:474::-;15860:6;15868;15917:2;15905:9;15896:7;15892:23;15888:32;15885:119;;;15923:79;;:::i;:::-;15885:119;16043:1;16068:53;16113:7;16104:6;16093:9;16089:22;16068:53;:::i;:::-;16058:63;;16014:117;16170:2;16196:53;16241:7;16232:6;16221:9;16217:22;16196:53;:::i;:::-;16186:63;;16141:118;15792:474;;;;;:::o;16272:180::-;16320:77;16317:1;16310:88;16417:4;16414:1;16407:15;16441:4;16438:1;16431:15;16458:320;16502:6;16539:1;16533:4;16529:12;16519:22;;16586:1;16580:4;16576:12;16607:18;16597:81;;16663:4;16655:6;16651:17;16641:27;;16597:81;16725:2;16717:6;16714:14;16694:18;16691:38;16688:84;;;16744:18;;:::i;:::-;16688:84;16509:269;16458:320;;;:::o;16784:231::-;16924:34;16920:1;16912:6;16908:14;16901:58;16993:14;16988:2;16980:6;16976:15;16969:39;16784:231;:::o;17021:366::-;17163:3;17184:67;17248:2;17243:3;17184:67;:::i;:::-;17177:74;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17021:366;;;:::o;17393:419::-;17559:4;17597:2;17586:9;17582:18;17574:26;;17646:9;17640:4;17636:20;17632:1;17621:9;17617:17;17610:47;17674:131;17800:4;17674:131;:::i;:::-;17666:139;;17393:419;;;:::o;17818:220::-;17958:34;17954:1;17946:6;17942:14;17935:58;18027:3;18022:2;18014:6;18010:15;18003:28;17818:220;:::o;18044:366::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:419::-;18582:4;18620:2;18609:9;18605:18;18597:26;;18669:9;18663:4;18659:20;18655:1;18644:9;18640:17;18633:47;18697:131;18823:4;18697:131;:::i;:::-;18689:139;;18416:419;;;:::o;18841:243::-;18981:34;18977:1;18969:6;18965:14;18958:58;19050:26;19045:2;19037:6;19033:15;19026:51;18841:243;:::o;19090:366::-;19232:3;19253:67;19317:2;19312:3;19253:67;:::i;:::-;19246:74;;19329:93;19418:3;19329:93;:::i;:::-;19447:2;19442:3;19438:12;19431:19;;19090:366;;;:::o;19462:419::-;19628:4;19666:2;19655:9;19651:18;19643:26;;19715:9;19709:4;19705:20;19701:1;19690:9;19686:17;19679:47;19743:131;19869:4;19743:131;:::i;:::-;19735:139;;19462:419;;;:::o;19887:182::-;20027:34;20023:1;20015:6;20011:14;20004:58;19887:182;:::o;20075:366::-;20217:3;20238:67;20302:2;20297:3;20238:67;:::i;:::-;20231:74;;20314:93;20403:3;20314:93;:::i;:::-;20432:2;20427:3;20423:12;20416:19;;20075:366;;;:::o;20447:419::-;20613:4;20651:2;20640:9;20636:18;20628:26;;20700:9;20694:4;20690:20;20686:1;20675:9;20671:17;20664:47;20728:131;20854:4;20728:131;:::i;:::-;20720:139;;20447:419;;;:::o;20872:236::-;21012:34;21008:1;21000:6;20996:14;20989:58;21081:19;21076:2;21068:6;21064:15;21057:44;20872:236;:::o;21114:366::-;21256:3;21277:67;21341:2;21336:3;21277:67;:::i;:::-;21270:74;;21353:93;21442:3;21353:93;:::i;:::-;21471:2;21466:3;21462:12;21455:19;;21114:366;;;:::o;21486:419::-;21652:4;21690:2;21679:9;21675:18;21667:26;;21739:9;21733:4;21729:20;21725:1;21714:9;21710:17;21703:47;21767:131;21893:4;21767:131;:::i;:::-;21759:139;;21486:419;;;:::o;21911:180::-;21959:77;21956:1;21949:88;22056:4;22053:1;22046:15;22080:4;22077:1;22070:15;22097:348;22137:7;22160:20;22178:1;22160:20;:::i;:::-;22155:25;;22194:20;22212:1;22194:20;:::i;:::-;22189:25;;22382:1;22314:66;22310:74;22307:1;22304:81;22299:1;22292:9;22285:17;22281:105;22278:131;;;22389:18;;:::i;:::-;22278:131;22437:1;22434;22430:9;22419:20;;22097:348;;;;:::o;22451:180::-;22499:77;22496:1;22489:88;22596:4;22593:1;22586:15;22620:4;22617:1;22610:15;22637:185;22677:1;22694:20;22712:1;22694:20;:::i;:::-;22689:25;;22728:20;22746:1;22728:20;:::i;:::-;22723:25;;22767:1;22757:35;;22772:18;;:::i;:::-;22757:35;22814:1;22811;22807:9;22802:14;;22637:185;;;;:::o;22828:230::-;22968:34;22964:1;22956:6;22952:14;22945:58;23037:13;23032:2;23024:6;23020:15;23013:38;22828:230;:::o;23064:366::-;23206:3;23227:67;23291:2;23286:3;23227:67;:::i;:::-;23220:74;;23303:93;23392:3;23303:93;:::i;:::-;23421:2;23416:3;23412:12;23405:19;;23064:366;;;:::o;23436:419::-;23602:4;23640:2;23629:9;23625:18;23617:26;;23689:9;23683:4;23679:20;23675:1;23664:9;23660:17;23653:47;23717:131;23843:4;23717:131;:::i;:::-;23709:139;;23436:419;;;:::o;23861:231::-;24001:34;23997:1;23989:6;23985:14;23978:58;24070:14;24065:2;24057:6;24053:15;24046:39;23861:231;:::o;24098:366::-;24240:3;24261:67;24325:2;24320:3;24261:67;:::i;:::-;24254:74;;24337:93;24426:3;24337:93;:::i;:::-;24455:2;24450:3;24446:12;24439:19;;24098:366;;;:::o;24470:419::-;24636:4;24674:2;24663:9;24659:18;24651:26;;24723:9;24717:4;24713:20;24709:1;24698:9;24694:17;24687:47;24751:131;24877:4;24751:131;:::i;:::-;24743:139;;24470:419;;;:::o;24895:180::-;24943:77;24940:1;24933:88;25040:4;25037:1;25030:15;25064:4;25061:1;25054:15;25081:228;25221:34;25217:1;25209:6;25205:14;25198:58;25290:11;25285:2;25277:6;25273:15;25266:36;25081:228;:::o;25315:366::-;25457:3;25478:67;25542:2;25537:3;25478:67;:::i;:::-;25471:74;;25554:93;25643:3;25554:93;:::i;:::-;25672:2;25667:3;25663:12;25656:19;;25315:366;;;:::o;25687:419::-;25853:4;25891:2;25880:9;25876:18;25868:26;;25940:9;25934:4;25930:20;25926:1;25915:9;25911:17;25904:47;25968:131;26094:4;25968:131;:::i;:::-;25960:139;;25687:419;;;:::o;26112:229::-;26252:34;26248:1;26240:6;26236:14;26229:58;26321:12;26316:2;26308:6;26304:15;26297:37;26112:229;:::o;26347:366::-;26489:3;26510:67;26574:2;26569:3;26510:67;:::i;:::-;26503:74;;26586:93;26675:3;26586:93;:::i;:::-;26704:2;26699:3;26695:12;26688:19;;26347:366;;;:::o;26719:419::-;26885:4;26923:2;26912:9;26908:18;26900:26;;26972:9;26966:4;26962:20;26958:1;26947:9;26943:17;26936:47;27000:131;27126:4;27000:131;:::i;:::-;26992:139;;26719:419;;;:::o;27144:231::-;27284:34;27280:1;27272:6;27268:14;27261:58;27353:14;27348:2;27340:6;27336:15;27329:39;27144:231;:::o;27381:366::-;27523:3;27544:67;27608:2;27603:3;27544:67;:::i;:::-;27537:74;;27620:93;27709:3;27620:93;:::i;:::-;27738:2;27733:3;27729:12;27722:19;;27381:366;;;:::o;27753:419::-;27919:4;27957:2;27946:9;27942:18;27934:26;;28006:9;28000:4;27996:20;27992:1;27981:9;27977:17;27970:47;28034:131;28160:4;28034:131;:::i;:::-;28026:139;;27753:419;;;:::o;28178:230::-;28318:34;28314:1;28306:6;28302:14;28295:58;28387:13;28382:2;28374:6;28370:15;28363:38;28178:230;:::o;28414:366::-;28556:3;28577:67;28641:2;28636:3;28577:67;:::i;:::-;28570:74;;28653:93;28742:3;28653:93;:::i;:::-;28771:2;28766:3;28762:12;28755:19;;28414:366;;;:::o;28786:419::-;28952:4;28990:2;28979:9;28975:18;28967:26;;29039:9;29033:4;29029:20;29025:1;29014:9;29010:17;29003:47;29067:131;29193:4;29067:131;:::i;:::-;29059:139;;28786:419;;;:::o;29211:221::-;29351:34;29347:1;29339:6;29335:14;29328:58;29420:4;29415:2;29407:6;29403:15;29396:29;29211:221;:::o;29438:366::-;29580:3;29601:67;29665:2;29660:3;29601:67;:::i;:::-;29594:74;;29677:93;29766:3;29677:93;:::i;:::-;29795:2;29790:3;29786:12;29779:19;;29438:366;;;:::o;29810:419::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30063:9;30057:4;30053:20;30049:1;30038:9;30034:17;30027:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29810:419;;;:::o;30235:305::-;30275:3;30294:20;30312:1;30294:20;:::i;:::-;30289:25;;30328:20;30346:1;30328:20;:::i;:::-;30323:25;;30482:1;30414:66;30410:74;30407:1;30404:81;30401:107;;;30488:18;;:::i;:::-;30401:107;30532:1;30529;30525:9;30518:16;;30235:305;;;;:::o;30546:229::-;30686:34;30682:1;30674:6;30670:14;30663:58;30755:12;30750:2;30742:6;30738:15;30731:37;30546:229;:::o;30781:366::-;30923:3;30944:67;31008:2;31003:3;30944:67;:::i;:::-;30937:74;;31020:93;31109:3;31020:93;:::i;:::-;31138:2;31133:3;31129:12;31122:19;;30781:366;;;:::o;31153:419::-;31319:4;31357:2;31346:9;31342:18;31334:26;;31406:9;31400:4;31396:20;31392:1;31381:9;31377:17;31370:47;31434:131;31560:4;31434:131;:::i;:::-;31426:139;;31153:419;;;:::o;31578:181::-;31718:33;31714:1;31706:6;31702:14;31695:57;31578:181;:::o;31765:366::-;31907:3;31928:67;31992:2;31987:3;31928:67;:::i;:::-;31921:74;;32004:93;32093:3;32004:93;:::i;:::-;32122:2;32117:3;32113:12;32106:19;;31765:366;;;:::o;32137:419::-;32303:4;32341:2;32330:9;32326:18;32318:26;;32390:9;32384:4;32380:20;32376:1;32365:9;32361:17;32354:47;32418:131;32544:4;32418:131;:::i;:::-;32410:139;;32137:419;;;:::o;32562:233::-;32601:3;32624:24;32642:5;32624:24;:::i;:::-;32615:33;;32670:66;32663:5;32660:77;32657:103;;;32740:18;;:::i;:::-;32657:103;32787:1;32780:5;32776:13;32769:20;;32562:233;;;:::o;32801:175::-;32941:27;32937:1;32929:6;32925:14;32918:51;32801:175;:::o;32982:366::-;33124:3;33145:67;33209:2;33204:3;33145:67;:::i;:::-;33138:74;;33221:93;33310:3;33221:93;:::i;:::-;33339:2;33334:3;33330:12;33323:19;;32982:366;;;:::o;33354:419::-;33520:4;33558:2;33547:9;33543:18;33535:26;;33607:9;33601:4;33597:20;33593:1;33582:9;33578:17;33571:47;33635:131;33761:4;33635:131;:::i;:::-;33627:139;;33354:419;;;:::o;33779:234::-;33919:34;33915:1;33907:6;33903:14;33896:58;33988:17;33983:2;33975:6;33971:15;33964:42;33779:234;:::o;34019:366::-;34161:3;34182:67;34246:2;34241:3;34182:67;:::i;:::-;34175:74;;34258:93;34347:3;34258:93;:::i;:::-;34376:2;34371:3;34367:12;34360:19;;34019:366;;;:::o;34391:419::-;34557:4;34595:2;34584:9;34580:18;34572:26;;34644:9;34638:4;34634:20;34630:1;34619:9;34615:17;34608:47;34672:131;34798:4;34672:131;:::i;:::-;34664:139;;34391:419;;;:::o;34816:148::-;34918:11;34955:3;34940:18;;34816:148;;;;:::o;34970:141::-;35019:4;35042:3;35034:11;;35065:3;35062:1;35055:14;35099:4;35096:1;35086:18;35078:26;;34970:141;;;:::o;35141:845::-;35244:3;35281:5;35275:12;35310:36;35336:9;35310:36;:::i;:::-;35362:89;35444:6;35439:3;35362:89;:::i;:::-;35355:96;;35482:1;35471:9;35467:17;35498:1;35493:137;;;;35644:1;35639:341;;;;35460:520;;35493:137;35577:4;35573:9;35562;35558:25;35553:3;35546:38;35613:6;35608:3;35604:16;35597:23;;35493:137;;35639:341;35706:38;35738:5;35706:38;:::i;:::-;35766:1;35780:154;35794:6;35791:1;35788:13;35780:154;;;35868:7;35862:14;35858:1;35853:3;35849:11;35842:35;35918:1;35909:7;35905:15;35894:26;;35816:4;35813:1;35809:12;35804:17;;35780:154;;;35963:6;35958:3;35954:16;35947:23;;35646:334;;35460:520;;35248:738;;35141:845;;;;:::o;35992:377::-;36098:3;36126:39;36159:5;36126:39;:::i;:::-;36181:89;36263:6;36258:3;36181:89;:::i;:::-;36174:96;;36279:52;36324:6;36319:3;36312:4;36305:5;36301:16;36279:52;:::i;:::-;36356:6;36351:3;36347:16;36340:23;;36102:267;35992:377;;;;:::o;36375:583::-;36597:3;36619:92;36707:3;36698:6;36619:92;:::i;:::-;36612:99;;36728:95;36819:3;36810:6;36728:95;:::i;:::-;36721:102;;36840:92;36928:3;36919:6;36840:92;:::i;:::-;36833:99;;36949:3;36942:10;;36375:583;;;;;;:::o;36964:225::-;37104:34;37100:1;37092:6;37088:14;37081:58;37173:8;37168:2;37160:6;37156:15;37149:33;36964:225;:::o;37195:366::-;37337:3;37358:67;37422:2;37417:3;37358:67;:::i;:::-;37351:74;;37434:93;37523:3;37434:93;:::i;:::-;37552:2;37547:3;37543:12;37536:19;;37195:366;;;:::o;37567:419::-;37733:4;37771:2;37760:9;37756:18;37748:26;;37820:9;37814:4;37810:20;37806:1;37795:9;37791:17;37784:47;37848:131;37974:4;37848:131;:::i;:::-;37840:139;;37567:419;;;:::o;37992:231::-;38132:34;38128:1;38120:6;38116:14;38109:58;38201:14;38196:2;38188:6;38184:15;38177:39;37992:231;:::o;38229:366::-;38371:3;38392:67;38456:2;38451:3;38392:67;:::i;:::-;38385:74;;38468:93;38557:3;38468:93;:::i;:::-;38586:2;38581:3;38577:12;38570:19;;38229:366;;;:::o;38601:419::-;38767:4;38805:2;38794:9;38790:18;38782:26;;38854:9;38848:4;38844:20;38840:1;38829:9;38825:17;38818:47;38882:131;39008:4;38882:131;:::i;:::-;38874:139;;38601:419;;;:::o;39026:228::-;39166:34;39162:1;39154:6;39150:14;39143:58;39235:11;39230:2;39222:6;39218:15;39211:36;39026:228;:::o;39260:366::-;39402:3;39423:67;39487:2;39482:3;39423:67;:::i;:::-;39416:74;;39499:93;39588:3;39499:93;:::i;:::-;39617:2;39612:3;39608:12;39601:19;;39260:366;;;:::o;39632:419::-;39798:4;39836:2;39825:9;39821:18;39813:26;;39885:9;39879:4;39875:20;39871:1;39860:9;39856:17;39849:47;39913:131;40039:4;39913:131;:::i;:::-;39905:139;;39632:419;;;:::o;40057:223::-;40197:34;40193:1;40185:6;40181:14;40174:58;40266:6;40261:2;40253:6;40249:15;40242:31;40057:223;:::o;40286:366::-;40428:3;40449:67;40513:2;40508:3;40449:67;:::i;:::-;40442:74;;40525:93;40614:3;40525:93;:::i;:::-;40643:2;40638:3;40634:12;40627:19;;40286:366;;;:::o;40658:419::-;40824:4;40862:2;40851:9;40847:18;40839:26;;40911:9;40905:4;40901:20;40897:1;40886:9;40882:17;40875:47;40939:131;41065:4;40939:131;:::i;:::-;40931:139;;40658:419;;;:::o;41083:191::-;41123:4;41143:20;41161:1;41143:20;:::i;:::-;41138:25;;41177:20;41195:1;41177:20;:::i;:::-;41172:25;;41216:1;41213;41210:8;41207:34;;;41221:18;;:::i;:::-;41207:34;41266:1;41263;41259:9;41251:17;;41083:191;;;;:::o;41280:237::-;41420:34;41416:1;41408:6;41404:14;41397:58;41489:20;41484:2;41476:6;41472:15;41465:45;41280:237;:::o;41523:366::-;41665:3;41686:67;41750:2;41745:3;41686:67;:::i;:::-;41679:74;;41762:93;41851:3;41762:93;:::i;:::-;41880:2;41875:3;41871:12;41864:19;;41523:366;;;:::o;41895:419::-;42061:4;42099:2;42088:9;42084:18;42076:26;;42148:9;42142:4;42138:20;42134:1;42123:9;42119:17;42112:47;42176:131;42302:4;42176:131;:::i;:::-;42168:139;;41895:419;;;:::o;42320:176::-;42352:1;42369:20;42387:1;42369:20;:::i;:::-;42364:25;;42403:20;42421:1;42403:20;:::i;:::-;42398:25;;42442:1;42432:35;;42447:18;;:::i;:::-;42432:35;42488:1;42485;42481:9;42476:14;;42320:176;;;;:::o;42502:98::-;42553:6;42587:5;42581:12;42571:22;;42502:98;;;:::o;42606:168::-;42689:11;42723:6;42718:3;42711:19;42763:4;42758:3;42754:14;42739:29;;42606:168;;;;:::o;42780:360::-;42866:3;42894:38;42926:5;42894:38;:::i;:::-;42948:70;43011:6;43006:3;42948:70;:::i;:::-;42941:77;;43027:52;43072:6;43067:3;43060:4;43053:5;43049:16;43027:52;:::i;:::-;43104:29;43126:6;43104:29;:::i;:::-;43099:3;43095:39;43088:46;;42870:270;42780:360;;;;:::o;43146:640::-;43341:4;43379:3;43368:9;43364:19;43356:27;;43393:71;43461:1;43450:9;43446:17;43437:6;43393:71;:::i;:::-;43474:72;43542:2;43531:9;43527:18;43518:6;43474:72;:::i;:::-;43556;43624:2;43613:9;43609:18;43600:6;43556:72;:::i;:::-;43675:9;43669:4;43665:20;43660:2;43649:9;43645:18;43638:48;43703:76;43774:4;43765:6;43703:76;:::i;:::-;43695:84;;43146:640;;;;;;;:::o;43792:141::-;43848:5;43879:6;43873:13;43864:22;;43895:32;43921:5;43895:32;:::i;:::-;43792:141;;;;:::o;43939:349::-;44008:6;44057:2;44045:9;44036:7;44032:23;44028:32;44025:119;;;44063:79;;:::i;:::-;44025:119;44183:1;44208:63;44263:7;44254:6;44243:9;44239:22;44208:63;:::i;:::-;44198:73;;44154:127;43939:349;;;;:::o;44294:180::-;44342:77;44339:1;44332:88;44439:4;44436:1;44429:15;44463:4;44460:1;44453:15;44480:182;44620:34;44616:1;44608:6;44604:14;44597:58;44480:182;:::o;44668:366::-;44810:3;44831:67;44895:2;44890:3;44831:67;:::i;:::-;44824:74;;44907:93;44996:3;44907:93;:::i;:::-;45025:2;45020:3;45016:12;45009:19;;44668:366;;;:::o;45040:419::-;45206:4;45244:2;45233:9;45229:18;45221:26;;45293:9;45287:4;45283:20;45279:1;45268:9;45264:17;45257:47;45321:131;45447:4;45321:131;:::i;:::-;45313:139;;45040:419;;;:::o;45465:178::-;45605:30;45601:1;45593:6;45589:14;45582:54;45465:178;:::o;45649:366::-;45791:3;45812:67;45876:2;45871:3;45812:67;:::i;:::-;45805:74;;45888:93;45977:3;45888:93;:::i;:::-;46006:2;46001:3;45997:12;45990:19;;45649:366;;;:::o;46021:419::-;46187:4;46225:2;46214:9;46210:18;46202:26;;46274:9;46268:4;46264:20;46260:1;46249:9;46245:17;46238:47;46302:131;46428:4;46302:131;:::i;:::-;46294:139;;46021:419;;;:::o
Swarm Source
ipfs://240e0981b6cae37b8cba36be538c6b5319f6a56cea5b756b7adf3da916352558
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.