ERC-721
Overview
Max Total Supply
2,065 WDoods
Holders
360
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 WDoodsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WomenDoods
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-16 */ /** *Submitted for verification at Etherscan.io on 2022-01-15 */ // IERC165.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // ERC721S.sol pragma solidity ^0.8.10; abstract contract ERC721S is Context, ERC165, IERC721, IERC721Metadata { using Address for address; string private _name; string private _symbol; address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count = 0; uint length = _owners.length; for( uint i = 0; i < length; ++i ){ if( owner == _owners[i] ){ ++count; } } delete length; return count; } 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; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721S.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); } function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } 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); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } 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); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } 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); } 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"); } function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721S.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } 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" ); } 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); _owners.push(to); emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal virtual { address owner = ERC721S.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _owners[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721S.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); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721S.ownerOf(tokenId), to, tokenId); } 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; } } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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); } } } } // ERC721Enum.sol pragma solidity ^0.8.10; abstract contract ERC721Enum is ERC721S, IERC721Enumerable { function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721S) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) { require(index < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ){ if( count == index ) return i; else ++count; } } require(false, "ERC721Enum: owner ioob"); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { require(0 < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob"); uint256 tokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function totalSupply() public view virtual override returns (uint256) { return _owners.length; } function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob"); return index; } } // ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // PaymentSplitter.sol pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + _totalReleased; uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account]; require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account] + payment; _totalReleased = _totalReleased + payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // Pausable.sol pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Doods.sol pragma solidity ^0.8.10; contract WomenDoods is ERC721Enum, Ownable, Pausable, ReentrancyGuard { using Strings for uint256; string public baseURI; uint256 public cost = 0.008 ether; uint256 public maxSupply = 7000; uint256 public maxFree = 1000; uint256 public nftPerAddressLimit = 20; bool public status = true; mapping(address => uint256) public addressMintedBalance; constructor() ERC721S("Women Doods", "WDoods"){ setBaseURI(""); } function _baseURI() internal view virtual returns (string memory) { return baseURI; } function mint(uint256 _mintAmount) public payable nonReentrant{ uint256 s = totalSupply(); require(_mintAmount > 0, "Cant mint 0" ); require(_mintAmount <= 20, "Cant mint more then maxmint" ); require(s + _mintAmount <= maxSupply, "Cant go over supply" ); require(msg.value >= cost * _mintAmount); for (uint256 i = 0; i < _mintAmount; ++i) { _safeMint(msg.sender, s + i, ""); } delete s; } function mintfree(uint256 _mintAmount) public payable nonReentrant{ uint256 s = totalSupply(); uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); require(_mintAmount > 0, "Cant mint 0" ); require(_mintAmount <= 10, "Cant mint more then maxmint" ); require(s + _mintAmount <= maxFree, "Cant go over supply" ); for (uint256 i = 0; i < _mintAmount; ++i) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, s + i, ""); } delete s; } function gift(uint[] calldata quantity, address[] calldata recipient) external onlyOwner{ require(quantity.length == recipient.length, "Provide quantities and recipients" ); uint totalQuantity = 0; uint256 s = totalSupply(); for(uint i = 0; i < quantity.length; ++i){ totalQuantity += quantity[i]; } require( s + totalQuantity <= maxSupply, "Too many" ); delete totalQuantity; for(uint i = 0; i < recipient.length; ++i){ for(uint j = 0; j < quantity[i]; ++j){ _safeMint( recipient[i], s++, "" ); } } delete s; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : ""; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxFree(uint256 _newMaxFree) public onlyOwner { maxFree = _newMaxFree; } function setmaxSupply(uint256 _newMaxSupply) public onlyOwner { maxSupply = _newMaxSupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setSaleStatus(bool _status) public onlyOwner { status = _status; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintfree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxFree","type":"uint256"}],"name":"setmaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052661c6bf526340000600855611b586009556103e8600a556014600b556001600c60006101000a81548160ff0219169083151502179055503480156200004857600080fd5b506040518060400160405280600b81526020017f576f6d656e20446f6f64730000000000000000000000000000000000000000008152506040518060400160405280600681526020017f57446f6f647300000000000000000000000000000000000000000000000000008152508160009080519060200190620000cd929190620002f5565b508060019080519060200190620000e6929190620002f5565b50505062000109620000fd6200015260201b60201c565b6200015a60201b60201c565b6000600560146101000a81548160ff02191690831515021790555060016006819055506200014c604051806020016040528060008152506200022060201b60201c565b6200048d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002306200015260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000256620002cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a69062000406565b60405180910390fd5b8060079080519060200190620002c7929190620002f5565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003039062000457565b90600052602060002090601f01602090048101928262000327576000855562000373565b82601f106200034257805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037257825182559160200191906001019062000355565b5b50905062000382919062000386565b5090565b5b80821115620003a157600081600090555060010162000387565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620003ee602083620003a5565b9150620003fb82620003b6565b602082019050919050565b600060208201905081810360008301526200042181620003df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200047057607f821691505b6020821081141562000487576200048662000428565b5b50919050565b614732806200049d6000396000f3fe6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5034b741161006f578063d5034b74146107f0578063d5abeb0114610819578063d897833e14610844578063e985e9c51461086d578063f2fde38b146108aa57610225565b8063a22cb4651461070d578063b88d4fde14610736578063ba7d2c761461075f578063c87b56dd1461078a578063d0eb26b0146107c757610225565b80638462151c116100f25780638462151c146106355780638da5cb5b1461067257806395d89b411461069d57806396ea3a47146106c8578063a0712d68146106f157610225565b80636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610225565b8063228025e8116101b157806344a0d68a1161017557806344a0d68a14610494578063485a68a3146104bd5780634f6ccce7146104e857806355f804b3146105255780635c975abb1461054e57610225565b8063228025e8146103d257806323b872dd146103fb5780632f745c59146104245780633ccfd60b1461046157806342842e0e1461046b57610225565b8063095ea7b3116101f8578063095ea7b3146102eb57806313faede61461031457806318160ddd1461033f57806318cae2691461036a578063200d2ed2146103a757610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063084dcc69146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612df7565b6108d3565b60405161025e9190612e3f565b60405180910390f35b34801561027357600080fd5b5061027c61094d565b6040516102899190612ef3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612f4b565b6109df565b6040516102c69190612fb9565b60405180910390f35b6102e960048036038101906102e49190612f4b565b610a64565b005b3480156102f757600080fd5b50610312600480360381019061030d9190613000565b610cd1565b005b34801561032057600080fd5b50610329610de9565b604051610336919061304f565b60405180910390f35b34801561034b57600080fd5b50610354610def565b604051610361919061304f565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061306a565b610dfc565b60405161039e919061304f565b60405180910390f35b3480156103b357600080fd5b506103bc610e14565b6040516103c99190612e3f565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190612f4b565b610e27565b005b34801561040757600080fd5b50610422600480360381019061041d9190613097565b610ead565b005b34801561043057600080fd5b5061044b60048036038101906104469190613000565b610f0d565b604051610458919061304f565b60405180910390f35b610469611056565b005b34801561047757600080fd5b50610492600480360381019061048d9190613097565b61114b565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190612f4b565b61116b565b005b3480156104c957600080fd5b506104d26111f1565b6040516104df919061304f565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190612f4b565b6111f7565b60405161051c919061304f565b60405180910390f35b34801561053157600080fd5b5061054c6004803603810190610547919061321f565b61124a565b005b34801561055a57600080fd5b506105636112e0565b6040516105709190612e3f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190612f4b565b6112f7565b6040516105ad9190612fb9565b60405180910390f35b3480156105c257600080fd5b506105cb6113b4565b6040516105d89190612ef3565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061306a565b611442565b604051610615919061304f565b60405180910390f35b34801561062a57600080fd5b50610633611568565b005b34801561064157600080fd5b5061065c6004803603810190610657919061306a565b6115f0565b6040516106699190613326565b60405180910390f35b34801561067e57600080fd5b506106876116e9565b6040516106949190612fb9565b60405180910390f35b3480156106a957600080fd5b506106b2611713565b6040516106bf9190612ef3565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906133fe565b6117a5565b005b61070b60048036038101906107069190612f4b565b6119c0565b005b34801561071957600080fd5b50610734600480360381019061072f91906134ab565b611b5d565b005b34801561074257600080fd5b5061075d6004803603810190610758919061358c565b611cde565b005b34801561076b57600080fd5b50610774611d40565b604051610781919061304f565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190612f4b565b611d46565b6040516107be9190612ef3565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190612f4b565b611ded565b005b3480156107fc57600080fd5b5061081760048036038101906108129190612f4b565b611e73565b005b34801561082557600080fd5b5061082e611ef9565b60405161083b919061304f565b60405180910390f35b34801561085057600080fd5b5061086b6004803603810190610866919061360f565b611eff565b005b34801561087957600080fd5b50610894600480360381019061088f919061363c565b611f98565b6040516108a19190612e3f565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061306a565b61202c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610946575061094582612124565b5b9050919050565b60606000805461095c906136ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610988906136ab565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82612206565b610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061374f565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026006541415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906137bb565b60405180910390fd5b60026006819055506000610abc610def565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548382610b11919061380a565b1115610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906138ac565b60405180910390fd5b60008311610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613918565b60405180910390fd5b600a831115610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090613984565b60405180910390fd5b600a548383610be8919061380a565b1115610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906139f0565b60405180910390fd5b60005b83811015610cbf57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c8490613a10565b9190505550610cae338285610c99919061380a565b6040518060200160405280600081525061228e565b80610cb890613a10565b9050610c2c565b50600091505050600160068190555050565b6000610cdc826112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613acb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956122e9565b611f98565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190613b5d565b60405180910390fd5b610de483836122f1565b505050565b60085481565b6000600280549050905090565b600d6020528060005260406000206000915090505481565b600c60009054906101000a900460ff1681565b610e2f6122e9565b73ffffffffffffffffffffffffffffffffffffffff16610e4d6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613bc9565b60405180910390fd5b8060098190555050565b610ebe610eb86122e9565b826123aa565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613c5b565b60405180910390fd5b610f08838383612488565b505050565b6000610f1883611442565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cc7565b60405180910390fd5b6000805b60028054905081101561100c5760028181548110610f7e57610f7d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffb5783821415610fee578092505050611050565b81610ff890613a10565b91505b8061100590613a10565b9050610f5d565b50600061104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613cc7565b60405180910390fd5b505b92915050565b61105e6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661107c6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613bc9565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f890613d47565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b61116683838360405180602001604052806000815250611cde565b505050565b6111736122e9565b73ffffffffffffffffffffffffffffffffffffffff166111916116e9565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613bc9565b60405180910390fd5b8060088190555050565b600a5481565b6000611201610def565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613da8565b60405180910390fd5b819050919050565b6112526122e9565b73ffffffffffffffffffffffffffffffffffffffff166112706116e9565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613bc9565b60405180910390fd5b80600790805190602001906112dc929190612ce8565b5050565b6000600560149054906101000a900460ff16905090565b6000806002838154811061130e5761130d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290613e3a565b60405180910390fd5b80915050919050565b600780546113c1906136ab565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906136ab565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613ecc565b60405180910390fd5b600080600280549050905060005b8181101561155957600281815481106114dd576114dc613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611548578261154590613a10565b92505b8061155290613a10565b90506114c1565b50600090508192505050919050565b6115706122e9565b73ffffffffffffffffffffffffffffffffffffffff1661158e6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613bc9565b60405180910390fd5b6115ee6000612641565b565b60606115fb82611442565b60001061163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613cc7565b60405180910390fd5b600061164883611442565b905060008167ffffffffffffffff811115611666576116656130f4565b5b6040519080825280602002602001820160405280156116945781602001602082028036833780820191505090505b50905060005b828110156116de576116ac8582610f0d565b8282815181106116bf576116be613ce7565b5b60200260200101818152505080806116d690613a10565b91505061169a565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611722906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906136ab565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b6117ad6122e9565b73ffffffffffffffffffffffffffffffffffffffff166117cb6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613bc9565b60405180910390fd5b818190508484905014611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613f5e565b60405180910390fd5b600080611874610def565b905060005b868690508110156118bc5786868281811061189757611896613ce7565b5b90506020020135836118a9919061380a565b9250806118b590613a10565b9050611879565b5060095482826118cc919061380a565b111561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fca565b60405180910390fd5b6000915060005b848490508110156119b35760005b87878381811061193557611934613ce7565b5b905060200201358110156119a15761199086868481811061195957611958613ce7565b5b905060200201602081019061196e919061306a565b848061197990613a10565b95506040518060200160405280600081525061228e565b8061199a90613a10565b9050611922565b50806119ac90613a10565b9050611914565b5060009050505050505050565b60026006541415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd906137bb565b60405180910390fd5b60026006819055506000611a18610def565b905060008211611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613918565b60405180910390fd5b6014821115611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890613984565b60405180910390fd5b6009548282611ab0919061380a565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae8906139f0565b60405180910390fd5b81600854611aff9190613fea565b341015611b0b57600080fd5b60005b82811015611b4c57611b3b338284611b26919061380a565b6040518060200160405280600081525061228e565b80611b4590613a10565b9050611b0e565b506000905050600160068190555050565b611b656122e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca90614090565b60405180910390fd5b8060046000611be06122e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c8d6122e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cd29190612e3f565b60405180910390a35050565b611cef611ce96122e9565b836123aa565b611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590613c5b565b60405180910390fd5b611d3a84848484612707565b50505050565b600b5481565b6060611d5182612206565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614122565b60405180910390fd5b6000611d9a612763565b90506000815111611dba5760405180602001604052806000815250611de5565b80611dc4846127f5565b604051602001611dd592919061417e565b6040516020818303038152906040525b915050919050565b611df56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e136116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613bc9565b60405180910390fd5b80600b8190555050565b611e7b6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e996116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690613bc9565b60405180910390fd5b80600a8190555050565b60095481565b611f076122e9565b73ffffffffffffffffffffffffffffffffffffffff16611f256116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613bc9565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120346122e9565b73ffffffffffffffffffffffffffffffffffffffff166120526116e9565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614214565b60405180910390fd5b61212181612641565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ff57506121fe82612956565b5b9050919050565b6000600280549050821080156122875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061224357612242613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b61229883836129c0565b6122a56000848484612b48565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db906142a6565b60405180910390fd5b505050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612364836112f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123b582612206565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90614338565b60405180910390fd5b60006123ff836112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246e57508373ffffffffffffffffffffffffffffffffffffffff16612456846109df565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247f575061247e8185611f98565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a8826112f7565b73ffffffffffffffffffffffffffffffffffffffff16146124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f5906143ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125659061445c565b60405180910390fd5b612579838383612cd0565b6125846000826122f1565b816002828154811061259957612598613ce7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612712848484612488565b61271e84848484612b48565b61275d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612754906142a6565b60405180910390fd5b50505050565b606060078054612772906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906136ab565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050905090565b6060600082141561283d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612951565b600082905060005b6000821461286f57808061285890613a10565b915050600a8261286891906144ab565b9150612845565b60008167ffffffffffffffff81111561288b5761288a6130f4565b5b6040519080825280601f01601f1916602001820160405280156128bd5781602001600182028036833780820191505090505b5090505b6000851461294a576001826128d691906144dc565b9150600a856128e59190614510565b60306128f1919061380a565b60f81b81838151811061290757612906613ce7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561294391906144ab565b94506128c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061458d565b60405180910390fd5b612a3981612206565b15612a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a70906145f9565b60405180910390fd5b612a8560008383612cd0565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b698473ffffffffffffffffffffffffffffffffffffffff16612cd5565b15612cc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b926122e9565b8786866040518563ffffffff1660e01b8152600401612bb4949392919061466e565b6020604051808303816000875af1925050508015612bf057506040513d601f19601f82011682018060405250810190612bed91906146cf565b60015b612c73573d8060008114612c20576040519150601f19603f3d011682016040523d82523d6000602084013e612c25565b606091505b50600081511415612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906142a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc8565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612cf4906136ab565b90600052602060002090601f016020900481019282612d165760008555612d5d565b82601f10612d2f57805160ff1916838001178555612d5d565b82800160010185558215612d5d579182015b82811115612d5c578251825591602001919060010190612d41565b5b509050612d6a9190612d6e565b5090565b5b80821115612d87576000816000905550600101612d6f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd481612d9f565b8114612ddf57600080fd5b50565b600081359050612df181612dcb565b92915050565b600060208284031215612e0d57612e0c612d95565b5b6000612e1b84828501612de2565b91505092915050565b60008115159050919050565b612e3981612e24565b82525050565b6000602082019050612e546000830184612e30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e94578082015181840152602081019050612e79565b83811115612ea3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ec582612e5a565b612ecf8185612e65565b9350612edf818560208601612e76565b612ee881612ea9565b840191505092915050565b60006020820190508181036000830152612f0d8184612eba565b905092915050565b6000819050919050565b612f2881612f15565b8114612f3357600080fd5b50565b600081359050612f4581612f1f565b92915050565b600060208284031215612f6157612f60612d95565b5b6000612f6f84828501612f36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa382612f78565b9050919050565b612fb381612f98565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612f98565b8114612fe857600080fd5b50565b600081359050612ffa81612fd4565b92915050565b6000806040838503121561301757613016612d95565b5b600061302585828601612feb565b925050602061303685828601612f36565b9150509250929050565b61304981612f15565b82525050565b60006020820190506130646000830184613040565b92915050565b6000602082840312156130805761307f612d95565b5b600061308e84828501612feb565b91505092915050565b6000806000606084860312156130b0576130af612d95565b5b60006130be86828701612feb565b93505060206130cf86828701612feb565b92505060406130e086828701612f36565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312c82612ea9565b810181811067ffffffffffffffff8211171561314b5761314a6130f4565b5b80604052505050565b600061315e612d8b565b905061316a8282613123565b919050565b600067ffffffffffffffff82111561318a576131896130f4565b5b61319382612ea9565b9050602081019050919050565b82818337600083830152505050565b60006131c26131bd8461316f565b613154565b9050828152602081018484840111156131de576131dd6130ef565b5b6131e98482856131a0565b509392505050565b600082601f830112613206576132056130ea565b5b81356132168482602086016131af565b91505092915050565b60006020828403121561323557613234612d95565b5b600082013567ffffffffffffffff81111561325357613252612d9a565b5b61325f848285016131f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61329d81612f15565b82525050565b60006132af8383613294565b60208301905092915050565b6000602082019050919050565b60006132d382613268565b6132dd8185613273565b93506132e883613284565b8060005b8381101561331957815161330088826132a3565b975061330b836132bb565b9250506001810190506132ec565b5085935050505092915050565b6000602082019050818103600083015261334081846132c8565b905092915050565b600080fd5b600080fd5b60008083601f840112613368576133676130ea565b5b8235905067ffffffffffffffff81111561338557613384613348565b5b6020830191508360208202830111156133a1576133a061334d565b5b9250929050565b60008083601f8401126133be576133bd6130ea565b5b8235905067ffffffffffffffff8111156133db576133da613348565b5b6020830191508360208202830111156133f7576133f661334d565b5b9250929050565b6000806000806040858703121561341857613417612d95565b5b600085013567ffffffffffffffff81111561343657613435612d9a565b5b61344287828801613352565b9450945050602085013567ffffffffffffffff81111561346557613464612d9a565b5b613471878288016133a8565b925092505092959194509250565b61348881612e24565b811461349357600080fd5b50565b6000813590506134a58161347f565b92915050565b600080604083850312156134c2576134c1612d95565b5b60006134d085828601612feb565b92505060206134e185828601613496565b9150509250929050565b600067ffffffffffffffff821115613506576135056130f4565b5b61350f82612ea9565b9050602081019050919050565b600061352f61352a846134eb565b613154565b90508281526020810184848401111561354b5761354a6130ef565b5b6135568482856131a0565b509392505050565b600082601f830112613573576135726130ea565b5b813561358384826020860161351c565b91505092915050565b600080600080608085870312156135a6576135a5612d95565b5b60006135b487828801612feb565b94505060206135c587828801612feb565b93505060406135d687828801612f36565b925050606085013567ffffffffffffffff8111156135f7576135f6612d9a565b5b6136038782880161355e565b91505092959194509250565b60006020828403121561362557613624612d95565b5b600061363384828501613496565b91505092915050565b6000806040838503121561365357613652612d95565b5b600061366185828601612feb565b925050602061367285828601612feb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c357607f821691505b602082108114156136d7576136d661367c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613739602c83612e65565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137a5601f83612e65565b91506137b08261376f565b602082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061381582612f15565b915061382083612f15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613855576138546137db565b5b828201905092915050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613896601c83612e65565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000613902600b83612e65565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b600061396e601b83612e65565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b60006139da601383612e65565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1b82612f15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4e57613a4d6137db565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ab5602183612e65565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b47603883612e65565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bb3602083612e65565b9150613bbe82613b7d565b602082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c45603183612e65565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613cb1601683612e65565b9150613cbc82613c7b565b602082019050919050565b60006020820190508181036000830152613ce081613ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000613d31600083613d16565b9150613d3c82613d21565b600082019050919050565b6000613d5282613d24565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d92601783612e65565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e24602983612e65565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613eb6602a83612e65565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f50726f76696465207175616e74697469657320616e6420726563697069656e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f48602183612e65565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000613fb4600883612e65565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b6000613ff582612f15565b915061400083612f15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614039576140386137db565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061407a601983612e65565b915061408582614044565b602082019050919050565b600060208201905081810360008301526140a98161406d565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061410c602183612e65565b9150614117826140b0565b604082019050919050565b6000602082019050818103600083015261413b816140ff565b9050919050565b600081905092915050565b600061415882612e5a565b6141628185614142565b9350614172818560208601612e76565b80840191505092915050565b600061418a828561414d565b9150614196828461414d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141fe602683612e65565b9150614209826141a2565b604082019050919050565b6000602082019050818103600083015261422d816141f1565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614290603283612e65565b915061429b82614234565b604082019050919050565b600060208201905081810360008301526142bf81614283565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614322602c83612e65565b915061432d826142c6565b604082019050919050565b6000602082019050818103600083015261435181614315565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006143b4602983612e65565b91506143bf82614358565b604082019050919050565b600060208201905081810360008301526143e3816143a7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614446602483612e65565b9150614451826143ea565b604082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b682612f15565b91506144c183612f15565b9250826144d1576144d061447c565b5b828204905092915050565b60006144e782612f15565b91506144f283612f15565b925082821015614505576145046137db565b5b828203905092915050565b600061451b82612f15565b915061452683612f15565b9250826145365761453561447c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614577602083612e65565b915061458282614541565b602082019050919050565b600060208201905081810360008301526145a68161456a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006145e3601c83612e65565b91506145ee826145ad565b602082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061464082614619565b61464a8185614624565b935061465a818560208601612e76565b61466381612ea9565b840191505092915050565b60006080820190506146836000830187612faa565b6146906020830186612faa565b61469d6040830185613040565b81810360608301526146af8184614635565b905095945050505050565b6000815190506146c981612dcb565b92915050565b6000602082840312156146e5576146e4612d95565b5b60006146f3848285016146ba565b9150509291505056fea2646970667358221220f0162183b5aefb668e24a4d594a24a006529953a5049ba5f06873e8c2ac2802664736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5034b741161006f578063d5034b74146107f0578063d5abeb0114610819578063d897833e14610844578063e985e9c51461086d578063f2fde38b146108aa57610225565b8063a22cb4651461070d578063b88d4fde14610736578063ba7d2c761461075f578063c87b56dd1461078a578063d0eb26b0146107c757610225565b80638462151c116100f25780638462151c146106355780638da5cb5b1461067257806395d89b411461069d57806396ea3a47146106c8578063a0712d68146106f157610225565b80636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610225565b8063228025e8116101b157806344a0d68a1161017557806344a0d68a14610494578063485a68a3146104bd5780634f6ccce7146104e857806355f804b3146105255780635c975abb1461054e57610225565b8063228025e8146103d257806323b872dd146103fb5780632f745c59146104245780633ccfd60b1461046157806342842e0e1461046b57610225565b8063095ea7b3116101f8578063095ea7b3146102eb57806313faede61461031457806318160ddd1461033f57806318cae2691461036a578063200d2ed2146103a757610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063084dcc69146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612df7565b6108d3565b60405161025e9190612e3f565b60405180910390f35b34801561027357600080fd5b5061027c61094d565b6040516102899190612ef3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612f4b565b6109df565b6040516102c69190612fb9565b60405180910390f35b6102e960048036038101906102e49190612f4b565b610a64565b005b3480156102f757600080fd5b50610312600480360381019061030d9190613000565b610cd1565b005b34801561032057600080fd5b50610329610de9565b604051610336919061304f565b60405180910390f35b34801561034b57600080fd5b50610354610def565b604051610361919061304f565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061306a565b610dfc565b60405161039e919061304f565b60405180910390f35b3480156103b357600080fd5b506103bc610e14565b6040516103c99190612e3f565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190612f4b565b610e27565b005b34801561040757600080fd5b50610422600480360381019061041d9190613097565b610ead565b005b34801561043057600080fd5b5061044b60048036038101906104469190613000565b610f0d565b604051610458919061304f565b60405180910390f35b610469611056565b005b34801561047757600080fd5b50610492600480360381019061048d9190613097565b61114b565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190612f4b565b61116b565b005b3480156104c957600080fd5b506104d26111f1565b6040516104df919061304f565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190612f4b565b6111f7565b60405161051c919061304f565b60405180910390f35b34801561053157600080fd5b5061054c6004803603810190610547919061321f565b61124a565b005b34801561055a57600080fd5b506105636112e0565b6040516105709190612e3f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190612f4b565b6112f7565b6040516105ad9190612fb9565b60405180910390f35b3480156105c257600080fd5b506105cb6113b4565b6040516105d89190612ef3565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061306a565b611442565b604051610615919061304f565b60405180910390f35b34801561062a57600080fd5b50610633611568565b005b34801561064157600080fd5b5061065c6004803603810190610657919061306a565b6115f0565b6040516106699190613326565b60405180910390f35b34801561067e57600080fd5b506106876116e9565b6040516106949190612fb9565b60405180910390f35b3480156106a957600080fd5b506106b2611713565b6040516106bf9190612ef3565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906133fe565b6117a5565b005b61070b60048036038101906107069190612f4b565b6119c0565b005b34801561071957600080fd5b50610734600480360381019061072f91906134ab565b611b5d565b005b34801561074257600080fd5b5061075d6004803603810190610758919061358c565b611cde565b005b34801561076b57600080fd5b50610774611d40565b604051610781919061304f565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190612f4b565b611d46565b6040516107be9190612ef3565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190612f4b565b611ded565b005b3480156107fc57600080fd5b5061081760048036038101906108129190612f4b565b611e73565b005b34801561082557600080fd5b5061082e611ef9565b60405161083b919061304f565b60405180910390f35b34801561085057600080fd5b5061086b6004803603810190610866919061360f565b611eff565b005b34801561087957600080fd5b50610894600480360381019061088f919061363c565b611f98565b6040516108a19190612e3f565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061306a565b61202c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610946575061094582612124565b5b9050919050565b60606000805461095c906136ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610988906136ab565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82612206565b610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061374f565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026006541415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906137bb565b60405180910390fd5b60026006819055506000610abc610def565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548382610b11919061380a565b1115610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906138ac565b60405180910390fd5b60008311610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613918565b60405180910390fd5b600a831115610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090613984565b60405180910390fd5b600a548383610be8919061380a565b1115610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906139f0565b60405180910390fd5b60005b83811015610cbf57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c8490613a10565b9190505550610cae338285610c99919061380a565b6040518060200160405280600081525061228e565b80610cb890613a10565b9050610c2c565b50600091505050600160068190555050565b6000610cdc826112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613acb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956122e9565b611f98565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190613b5d565b60405180910390fd5b610de483836122f1565b505050565b60085481565b6000600280549050905090565b600d6020528060005260406000206000915090505481565b600c60009054906101000a900460ff1681565b610e2f6122e9565b73ffffffffffffffffffffffffffffffffffffffff16610e4d6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613bc9565b60405180910390fd5b8060098190555050565b610ebe610eb86122e9565b826123aa565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613c5b565b60405180910390fd5b610f08838383612488565b505050565b6000610f1883611442565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cc7565b60405180910390fd5b6000805b60028054905081101561100c5760028181548110610f7e57610f7d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffb5783821415610fee578092505050611050565b81610ff890613a10565b91505b8061100590613a10565b9050610f5d565b50600061104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613cc7565b60405180910390fd5b505b92915050565b61105e6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661107c6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613bc9565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f890613d47565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b61116683838360405180602001604052806000815250611cde565b505050565b6111736122e9565b73ffffffffffffffffffffffffffffffffffffffff166111916116e9565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613bc9565b60405180910390fd5b8060088190555050565b600a5481565b6000611201610def565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613da8565b60405180910390fd5b819050919050565b6112526122e9565b73ffffffffffffffffffffffffffffffffffffffff166112706116e9565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613bc9565b60405180910390fd5b80600790805190602001906112dc929190612ce8565b5050565b6000600560149054906101000a900460ff16905090565b6000806002838154811061130e5761130d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290613e3a565b60405180910390fd5b80915050919050565b600780546113c1906136ab565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906136ab565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613ecc565b60405180910390fd5b600080600280549050905060005b8181101561155957600281815481106114dd576114dc613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611548578261154590613a10565b92505b8061155290613a10565b90506114c1565b50600090508192505050919050565b6115706122e9565b73ffffffffffffffffffffffffffffffffffffffff1661158e6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613bc9565b60405180910390fd5b6115ee6000612641565b565b60606115fb82611442565b60001061163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613cc7565b60405180910390fd5b600061164883611442565b905060008167ffffffffffffffff811115611666576116656130f4565b5b6040519080825280602002602001820160405280156116945781602001602082028036833780820191505090505b50905060005b828110156116de576116ac8582610f0d565b8282815181106116bf576116be613ce7565b5b60200260200101818152505080806116d690613a10565b91505061169a565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611722906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906136ab565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b6117ad6122e9565b73ffffffffffffffffffffffffffffffffffffffff166117cb6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613bc9565b60405180910390fd5b818190508484905014611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613f5e565b60405180910390fd5b600080611874610def565b905060005b868690508110156118bc5786868281811061189757611896613ce7565b5b90506020020135836118a9919061380a565b9250806118b590613a10565b9050611879565b5060095482826118cc919061380a565b111561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fca565b60405180910390fd5b6000915060005b848490508110156119b35760005b87878381811061193557611934613ce7565b5b905060200201358110156119a15761199086868481811061195957611958613ce7565b5b905060200201602081019061196e919061306a565b848061197990613a10565b95506040518060200160405280600081525061228e565b8061199a90613a10565b9050611922565b50806119ac90613a10565b9050611914565b5060009050505050505050565b60026006541415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd906137bb565b60405180910390fd5b60026006819055506000611a18610def565b905060008211611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613918565b60405180910390fd5b6014821115611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890613984565b60405180910390fd5b6009548282611ab0919061380a565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae8906139f0565b60405180910390fd5b81600854611aff9190613fea565b341015611b0b57600080fd5b60005b82811015611b4c57611b3b338284611b26919061380a565b6040518060200160405280600081525061228e565b80611b4590613a10565b9050611b0e565b506000905050600160068190555050565b611b656122e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca90614090565b60405180910390fd5b8060046000611be06122e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c8d6122e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cd29190612e3f565b60405180910390a35050565b611cef611ce96122e9565b836123aa565b611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590613c5b565b60405180910390fd5b611d3a84848484612707565b50505050565b600b5481565b6060611d5182612206565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8790614122565b60405180910390fd5b6000611d9a612763565b90506000815111611dba5760405180602001604052806000815250611de5565b80611dc4846127f5565b604051602001611dd592919061417e565b6040516020818303038152906040525b915050919050565b611df56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e136116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613bc9565b60405180910390fd5b80600b8190555050565b611e7b6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e996116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690613bc9565b60405180910390fd5b80600a8190555050565b60095481565b611f076122e9565b73ffffffffffffffffffffffffffffffffffffffff16611f256116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613bc9565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120346122e9565b73ffffffffffffffffffffffffffffffffffffffff166120526116e9565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614214565b60405180910390fd5b61212181612641565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ff57506121fe82612956565b5b9050919050565b6000600280549050821080156122875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061224357612242613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b61229883836129c0565b6122a56000848484612b48565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db906142a6565b60405180910390fd5b505050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612364836112f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123b582612206565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90614338565b60405180910390fd5b60006123ff836112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246e57508373ffffffffffffffffffffffffffffffffffffffff16612456846109df565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247f575061247e8185611f98565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a8826112f7565b73ffffffffffffffffffffffffffffffffffffffff16146124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f5906143ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125659061445c565b60405180910390fd5b612579838383612cd0565b6125846000826122f1565b816002828154811061259957612598613ce7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612712848484612488565b61271e84848484612b48565b61275d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612754906142a6565b60405180910390fd5b50505050565b606060078054612772906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906136ab565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050905090565b6060600082141561283d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612951565b600082905060005b6000821461286f57808061285890613a10565b915050600a8261286891906144ab565b9150612845565b60008167ffffffffffffffff81111561288b5761288a6130f4565b5b6040519080825280601f01601f1916602001820160405280156128bd5781602001600182028036833780820191505090505b5090505b6000851461294a576001826128d691906144dc565b9150600a856128e59190614510565b60306128f1919061380a565b60f81b81838151811061290757612906613ce7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561294391906144ab565b94506128c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061458d565b60405180910390fd5b612a3981612206565b15612a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a70906145f9565b60405180910390fd5b612a8560008383612cd0565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b698473ffffffffffffffffffffffffffffffffffffffff16612cd5565b15612cc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b926122e9565b8786866040518563ffffffff1660e01b8152600401612bb4949392919061466e565b6020604051808303816000875af1925050508015612bf057506040513d601f19601f82011682018060405250810190612bed91906146cf565b60015b612c73573d8060008114612c20576040519150601f19603f3d011682016040523d82523d6000602084013e612c25565b606091505b50600081511415612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906142a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc8565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612cf4906136ab565b90600052602060002090601f016020900481019282612d165760008555612d5d565b82601f10612d2f57805160ff1916838001178555612d5d565b82800160010185558215612d5d579182015b82811115612d5c578251825591602001919060010190612d41565b5b509050612d6a9190612d6e565b5090565b5b80821115612d87576000816000905550600101612d6f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd481612d9f565b8114612ddf57600080fd5b50565b600081359050612df181612dcb565b92915050565b600060208284031215612e0d57612e0c612d95565b5b6000612e1b84828501612de2565b91505092915050565b60008115159050919050565b612e3981612e24565b82525050565b6000602082019050612e546000830184612e30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e94578082015181840152602081019050612e79565b83811115612ea3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ec582612e5a565b612ecf8185612e65565b9350612edf818560208601612e76565b612ee881612ea9565b840191505092915050565b60006020820190508181036000830152612f0d8184612eba565b905092915050565b6000819050919050565b612f2881612f15565b8114612f3357600080fd5b50565b600081359050612f4581612f1f565b92915050565b600060208284031215612f6157612f60612d95565b5b6000612f6f84828501612f36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa382612f78565b9050919050565b612fb381612f98565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612f98565b8114612fe857600080fd5b50565b600081359050612ffa81612fd4565b92915050565b6000806040838503121561301757613016612d95565b5b600061302585828601612feb565b925050602061303685828601612f36565b9150509250929050565b61304981612f15565b82525050565b60006020820190506130646000830184613040565b92915050565b6000602082840312156130805761307f612d95565b5b600061308e84828501612feb565b91505092915050565b6000806000606084860312156130b0576130af612d95565b5b60006130be86828701612feb565b93505060206130cf86828701612feb565b92505060406130e086828701612f36565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312c82612ea9565b810181811067ffffffffffffffff8211171561314b5761314a6130f4565b5b80604052505050565b600061315e612d8b565b905061316a8282613123565b919050565b600067ffffffffffffffff82111561318a576131896130f4565b5b61319382612ea9565b9050602081019050919050565b82818337600083830152505050565b60006131c26131bd8461316f565b613154565b9050828152602081018484840111156131de576131dd6130ef565b5b6131e98482856131a0565b509392505050565b600082601f830112613206576132056130ea565b5b81356132168482602086016131af565b91505092915050565b60006020828403121561323557613234612d95565b5b600082013567ffffffffffffffff81111561325357613252612d9a565b5b61325f848285016131f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61329d81612f15565b82525050565b60006132af8383613294565b60208301905092915050565b6000602082019050919050565b60006132d382613268565b6132dd8185613273565b93506132e883613284565b8060005b8381101561331957815161330088826132a3565b975061330b836132bb565b9250506001810190506132ec565b5085935050505092915050565b6000602082019050818103600083015261334081846132c8565b905092915050565b600080fd5b600080fd5b60008083601f840112613368576133676130ea565b5b8235905067ffffffffffffffff81111561338557613384613348565b5b6020830191508360208202830111156133a1576133a061334d565b5b9250929050565b60008083601f8401126133be576133bd6130ea565b5b8235905067ffffffffffffffff8111156133db576133da613348565b5b6020830191508360208202830111156133f7576133f661334d565b5b9250929050565b6000806000806040858703121561341857613417612d95565b5b600085013567ffffffffffffffff81111561343657613435612d9a565b5b61344287828801613352565b9450945050602085013567ffffffffffffffff81111561346557613464612d9a565b5b613471878288016133a8565b925092505092959194509250565b61348881612e24565b811461349357600080fd5b50565b6000813590506134a58161347f565b92915050565b600080604083850312156134c2576134c1612d95565b5b60006134d085828601612feb565b92505060206134e185828601613496565b9150509250929050565b600067ffffffffffffffff821115613506576135056130f4565b5b61350f82612ea9565b9050602081019050919050565b600061352f61352a846134eb565b613154565b90508281526020810184848401111561354b5761354a6130ef565b5b6135568482856131a0565b509392505050565b600082601f830112613573576135726130ea565b5b813561358384826020860161351c565b91505092915050565b600080600080608085870312156135a6576135a5612d95565b5b60006135b487828801612feb565b94505060206135c587828801612feb565b93505060406135d687828801612f36565b925050606085013567ffffffffffffffff8111156135f7576135f6612d9a565b5b6136038782880161355e565b91505092959194509250565b60006020828403121561362557613624612d95565b5b600061363384828501613496565b91505092915050565b6000806040838503121561365357613652612d95565b5b600061366185828601612feb565b925050602061367285828601612feb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c357607f821691505b602082108114156136d7576136d661367c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613739602c83612e65565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137a5601f83612e65565b91506137b08261376f565b602082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061381582612f15565b915061382083612f15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613855576138546137db565b5b828201905092915050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613896601c83612e65565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000613902600b83612e65565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b600061396e601b83612e65565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b60006139da601383612e65565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1b82612f15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4e57613a4d6137db565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ab5602183612e65565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b47603883612e65565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bb3602083612e65565b9150613bbe82613b7d565b602082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c45603183612e65565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613cb1601683612e65565b9150613cbc82613c7b565b602082019050919050565b60006020820190508181036000830152613ce081613ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000613d31600083613d16565b9150613d3c82613d21565b600082019050919050565b6000613d5282613d24565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d92601783612e65565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e24602983612e65565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613eb6602a83612e65565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f50726f76696465207175616e74697469657320616e6420726563697069656e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f48602183612e65565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000613fb4600883612e65565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b6000613ff582612f15565b915061400083612f15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614039576140386137db565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061407a601983612e65565b915061408582614044565b602082019050919050565b600060208201905081810360008301526140a98161406d565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061410c602183612e65565b9150614117826140b0565b604082019050919050565b6000602082019050818103600083015261413b816140ff565b9050919050565b600081905092915050565b600061415882612e5a565b6141628185614142565b9350614172818560208601612e76565b80840191505092915050565b600061418a828561414d565b9150614196828461414d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141fe602683612e65565b9150614209826141a2565b604082019050919050565b6000602082019050818103600083015261422d816141f1565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614290603283612e65565b915061429b82614234565b604082019050919050565b600060208201905081810360008301526142bf81614283565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614322602c83612e65565b915061432d826142c6565b604082019050919050565b6000602082019050818103600083015261435181614315565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006143b4602983612e65565b91506143bf82614358565b604082019050919050565b600060208201905081810360008301526143e3816143a7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614446602483612e65565b9150614451826143ea565b604082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b682612f15565b91506144c183612f15565b9250826144d1576144d061447c565b5b828204905092915050565b60006144e782612f15565b91506144f283612f15565b925082821015614505576145046137db565b5b828203905092915050565b600061451b82612f15565b915061452683612f15565b9250826145365761453561447c565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614577602083612e65565b915061458282614541565b602082019050919050565b600060208201905081810360008301526145a68161456a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006145e3601c83612e65565b91506145ee826145ad565b602082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061464082614619565b61464a8185614624565b935061465a818560208601612e76565b61466381612ea9565b840191505092915050565b60006080820190506146836000830187612faa565b6146906020830186612faa565b61469d6040830185613040565b81810360608301526146af8184614635565b905095945050505050565b6000815190506146c981612dcb565b92915050565b6000602082840312156146e5576146e4612d95565b5b60006146f3848285016146ba565b9150509291505056fea2646970667358221220f0162183b5aefb668e24a4d594a24a006529953a5049ba5f06873e8c2ac2802664736f6c634300080a0033
Deployed Bytecode Sourcemap
48040:3239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32272:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11390:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12024:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49027:599;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11606:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48171:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33433:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48358:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48326:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50829:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12722:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32503:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51119:151;;;:::i;:::-;;13067:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50645:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48246:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33549:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50932:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42537:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11145:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48146:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10725:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47365:94;;;;;;;;;;;;;:::i;:::-;;33009:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46714:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11496:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49631:560;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48599:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12251:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13258:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48284:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50197:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50536:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50730:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48208:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51033:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12552:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47614:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32272:225;32375:4;32414:35;32399:50;;;:11;:50;;;;:90;;;;32453:36;32477:11;32453:23;:36::i;:::-;32399:90;32392:97;;32272:225;;;:::o;11390:100::-;11444:13;11477:5;11470:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11390:100;:::o;12024:221::-;12100:7;12128:16;12136:7;12128;:16::i;:::-;12120:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12213:15;:24;12229:7;12213:24;;;;;;;;;;;;;;;;;;;;;12206:31;;12024:221;;;:::o;49027:599::-;35456:1;36052:7;;:19;;36044:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35456:1;36185:7;:18;;;;49098:9:::1;49110:13;:11;:13::i;:::-;49098:25;;49134:24;49161:20;:32;49182:10;49161:32;;;;;;;;;;;;;;;;49134:59;;49246:18;;49231:11;49212:16;:30;;;;:::i;:::-;:52;;49204:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49324:1;49310:11;:15;49302:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;49370:2;49355:11;:17;;49347:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49437:7;;49422:11;49418:1;:15;;;;:::i;:::-;:26;;49410:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49479:9;49474:135;49498:11;49494:1;:15;49474:135;;;49531:20;:32;49552:10;49531:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;49571:32;49581:10;49597:1;49593;:5;;;;:::i;:::-;49571:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;49511:3;;;;:::i;:::-;;;49474:135;;;;49613:8;;;49093:533;;35412:1:::0;36364:7;:22;;;;49027:599;:::o;11606:412::-;11687:13;11703:24;11719:7;11703:15;:24::i;:::-;11687:40;;11752:5;11746:11;;:2;:11;;;;11738:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;11846:5;11830:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;11855:37;11872:5;11879:12;:10;:12::i;:::-;11855:16;:37::i;:::-;11830:62;11808:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;11989:21;11998:2;12002:7;11989:8;:21::i;:::-;11676:342;11606:412;;:::o;48171:33::-;;;;:::o;33433:110::-;33494:7;33521;:14;;;;33514:21;;33433:110;:::o;48358:55::-;;;;;;;;;;;;;;;;;:::o;48326:25::-;;;;;;;;;;;;;:::o;50829:100::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50911:13:::1;50899:9;:25;;;;50829:100:::0;:::o;12722:339::-;12917:41;12936:12;:10;:12::i;:::-;12950:7;12917:18;:41::i;:::-;12909:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13025:28;13035:4;13041:2;13045:7;13025:9;:28::i;:::-;12722:339;;;:::o;32503:500::-;32592:15;32636:24;32654:5;32636:17;:24::i;:::-;32628:5;:32;32620:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32698:10;32724:6;32719:226;32736:7;:14;;;;32732:1;:18;32719:226;;;32785:7;32793:1;32785:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32776:19;;:5;:19;;;32772:162;;;32829:5;32820;:14;32816:102;;;32865:1;32858:8;;;;;;32816:102;32911:7;;;;:::i;:::-;;;32772:162;32752:3;;;;:::i;:::-;;;32719:226;;;;32963:5;32955:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;32609:394;32503:500;;;;;:::o;51119:151::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51169:12:::1;51195:10;51187:24;;51219:21;51187:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51168:77;;;51257:7;51249:16;;;::::0;::::1;;51164:106;51119:151::o:0;13067:185::-;13205:39;13222:4;13228:2;13232:7;13205:39;;;;;;;;;;;;:16;:39::i;:::-;13067:185;;;:::o;50645:80::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50712:8:::1;50705:4;:15;;;;50645:80:::0;:::o;48246:29::-;;;;:::o;33549:194::-;33624:7;33660:24;:22;:24::i;:::-;33652:5;:32;33644:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33730:5;33723:12;;33549:194;;;:::o;50932:98::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51014:11:::1;51004:7;:21;;;;;;;;;;;;:::i;:::-;;50932:98:::0;:::o;42537:86::-;42584:4;42608:7;;;;;;;;;;;42601:14;;42537:86;:::o;11145:239::-;11217:7;11237:13;11253:7;11261;11253:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11237:32;;11305:1;11288:19;;:5;:19;;;;11280:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11371:5;11364:12;;;11145:239;;;:::o;48146:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10725:414::-;10797:7;10842:1;10825:19;;:5;:19;;;;10817:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;10902:10;10927:11;10941:7;:14;;;;10927:28;;10971:6;10966:119;10987:6;10983:1;:10;10966:119;;;11026:7;11034:1;11026:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11017:19;;:5;:19;;;11013:61;;;11053:7;;;;:::i;:::-;;;11013:61;10995:3;;;;:::i;:::-;;;10966:119;;;;11095:13;;;11126:5;11119:12;;;;10725:414;;;:::o;47365:94::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47430:21:::1;47448:1;47430:9;:21::i;:::-;47365:94::o:0;33009:418::-;33068:16;33109:24;33127:5;33109:17;:24::i;:::-;33105:1;:28;33097:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33171:18;33192:16;33202:5;33192:9;:16::i;:::-;33171:37;;33219:25;33261:10;33247:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33219:53;;33288:9;33283:111;33307:10;33303:1;:14;33283:111;;;33353:29;33373:5;33380:1;33353:19;:29::i;:::-;33339:8;33348:1;33339:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;33319:3;;;;;:::i;:::-;;;;33283:111;;;;33411:8;33404:15;;;;33009:418;;;:::o;46714:87::-;46760:7;46787:6;;;;;;;;;;;46780:13;;46714:87;:::o;11496:104::-;11552:13;11585:7;11578:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11496:104;:::o;49631:560::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49751:9:::1;;:16;;49732:8;;:15;;:35;49724:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49811:18;49838:9:::0;49850:13:::1;:11;:13::i;:::-;49838:25;;49872:6;49868:81;49888:8;;:15;;49884:1;:19;49868:81;;;49932:8;;49941:1;49932:11;;;;;;;:::i;:::-;;;;;;;;49915:28;;;;;:::i;:::-;;;49905:3;;;;:::i;:::-;;;49868:81;;;;49983:9;;49966:13;49962:1;:17;;;;:::i;:::-;:30;;49953:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50011:20;;;50040:6;50036:137;50056:9;;:16;;50052:1;:20;50036:137;;;50088:6;50084:84;50104:8;;50113:1;50104:11;;;;;;;:::i;:::-;;;;;;;;50100:1;:15;50084:84;;;50127:34;50138:9;;50148:1;50138:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50152:3;;;;;:::i;:::-;;;50127:34;;;;;;;;;;;::::0;:9:::1;:34::i;:::-;50117:3;;;;:::i;:::-;;;50084:84;;;;50074:3;;;;:::i;:::-;;;50036:137;;;;50177:8;;;49719:472;;49631:560:::0;;;;:::o;48599:419::-;35456:1;36052:7;;:19;;36044:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35456:1;36185:7;:18;;;;48666:9:::1;48678:13;:11;:13::i;:::-;48666:25;;48718:1;48704:11;:15;48696:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;48764:2;48749:11;:17;;48741:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48831:9;;48816:11;48812:1;:15;;;;:::i;:::-;:28;;48804:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48898:11;48891:4;;:18;;;;:::i;:::-;48878:9;:31;;48870:40;;;::::0;::::1;;48920:9;48915:86;48939:11;48935:1;:15;48915:86;;;48963:32;48973:10;48989:1;48985;:5;;;;:::i;:::-;48963:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;48952:3;;;;:::i;:::-;;;48915:86;;;;49005:8;;;48661:357;35412:1:::0;36364:7;:22;;;;48599:419;:::o;12251:295::-;12366:12;:10;:12::i;:::-;12354:24;;:8;:24;;;;12346:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;12466:8;12421:18;:32;12440:12;:10;:12::i;:::-;12421:32;;;;;;;;;;;;;;;:42;12454:8;12421:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;12519:8;12490:48;;12505:12;:10;:12::i;:::-;12490:48;;;12529:8;12490:48;;;;;;:::i;:::-;;;;;;;;12251:295;;:::o;13258:328::-;13433:41;13452:12;:10;:12::i;:::-;13466:7;13433:18;:41::i;:::-;13425:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13539:39;13553:4;13559:2;13563:7;13572:5;13539:13;:39::i;:::-;13258:328;;;;:::o;48284:38::-;;;;:::o;50197:327::-;50270:13;50301:16;50309:7;50301;:16::i;:::-;50293:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50363:28;50394:10;:8;:10::i;:::-;50363:41;;50450:1;50425:14;50419:28;:32;:100;;;;;;;;;;;;;;;;;50478:14;50494:18;:7;:16;:18::i;:::-;50461:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50419:100;50412:107;;;50197:327;;;:::o;50536:104::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50628:6:::1;50607:18;:27;;;;50536:104:::0;:::o;50730:92::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50806:11:::1;50796:7;:21;;;;50730:92:::0;:::o;48208:31::-;;;;:::o;51033:83::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51104:7:::1;51095:6;;:16;;;;;;;;;;;;;;;;;;51033:83:::0;:::o;12552:164::-;12649:4;12673:18;:25;12692:5;12673:25;;;;;;;;;;;;;;;:35;12699:8;12673:35;;;;;;;;;;;;;;;;;;;;;;;;;12666:42;;12552:164;;;;:::o;47614:192::-;46945:12;:10;:12::i;:::-;46934:23;;:7;:5;:7::i;:::-;:23;;;46926:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47723:1:::1;47703:22;;:8;:22;;;;47695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47779:19;47789:8;47779:9;:19::i;:::-;47614:192:::0;:::o;10414:305::-;10516:4;10568:25;10553:40;;;:11;:40;;;;:105;;;;10625:33;10610:48;;;:11;:48;;;;10553:105;:158;;;;10675:36;10699:11;10675:23;:36::i;:::-;10553:158;10533:178;;10414:305;;;:::o;13915:155::-;13980:4;14014:7;:14;;;;14004:7;:24;:58;;;;;14060:1;14032:30;;:7;14040;14032:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;14004:58;13997:65;;13915:155;;;:::o;14538:321::-;14668:18;14674:2;14678:7;14668:5;:18::i;:::-;14719:54;14750:1;14754:2;14758:7;14767:5;14719:22;:54::i;:::-;14697:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;14538:321;;;:::o;9685:98::-;9738:7;9765:10;9758:17;;9685:98;:::o;16067:175::-;16169:2;16142:15;:24;16158:7;16142:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;16226:7;16222:2;16187:47;;16196:24;16212:7;16196:15;:24::i;:::-;16187:47;;;;;;;;;;;;16067:175;;:::o;14073:349::-;14166:4;14191:16;14199:7;14191;:16::i;:::-;14183:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14267:13;14283:24;14299:7;14283:15;:24::i;:::-;14267:40;;14337:5;14326:16;;:7;:16;;;:51;;;;14370:7;14346:31;;:20;14358:7;14346:11;:20::i;:::-;:31;;;14326:51;:87;;;;14381:32;14398:5;14405:7;14381:16;:32::i;:::-;14326:87;14318:96;;;14073:349;;;;:::o;15547:517::-;15707:4;15679:32;;:24;15695:7;15679:15;:24::i;:::-;:32;;;15671:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;15790:1;15776:16;;:2;:16;;;;15768:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15846:39;15867:4;15873:2;15877:7;15846:20;:39::i;:::-;15950:29;15967:1;15971:7;15950:8;:29::i;:::-;16009:2;15990:7;15998;15990:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;16048:7;16044:2;16029:27;;16038:4;16029:27;;;;;;;;;;;;15547:517;;;:::o;47814:173::-;47870:16;47889:6;;;;;;;;;;;47870:25;;47915:8;47906:6;;:17;;;;;;;;;;;;;;;;;;47970:8;47939:40;;47960:8;47939:40;;;;;;;;;;;;47859:128;47814:173;:::o;13597:315::-;13754:28;13764:4;13770:2;13774:7;13754:9;:28::i;:::-;13801:48;13824:4;13830:2;13834:7;13843:5;13801:22;:48::i;:::-;13793:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;13597:315;;;;:::o;48501:93::-;48552:13;48582:7;48575:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48501:93;:::o;43996:723::-;44052:13;44282:1;44273:5;:10;44269:53;;;44300:10;;;;;;;;;;;;;;;;;;;;;44269:53;44332:12;44347:5;44332:20;;44363:14;44388:78;44403:1;44395:4;:9;44388:78;;44421:8;;;;;:::i;:::-;;;;44452:2;44444:10;;;;;:::i;:::-;;;44388:78;;;44476:19;44508:6;44498:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44476:39;;44526:154;44542:1;44533:5;:10;44526:154;;44570:1;44560:11;;;;;:::i;:::-;;;44637:2;44629:5;:10;;;;:::i;:::-;44616:2;:24;;;;:::i;:::-;44603:39;;44586:6;44593;44586:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44666:2;44657:11;;;;;:::i;:::-;;;44526:154;;;44704:6;44690:21;;;;;43996:723;;;;:::o;1643:157::-;1728:4;1767:25;1752:40;;;:11;:40;;;;1745:47;;1643:157;;;:::o;14862:346::-;14956:1;14942:16;;:2;:16;;;;14934:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;15015:16;15023:7;15015;:16::i;:::-;15014:17;15006:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;15077:45;15106:1;15110:2;15114:7;15077:20;:45::i;:::-;15133:7;15146:2;15133:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15192:7;15188:2;15167:33;;15184:1;15167:33;;;;;;;;;;;;14862:346;;:::o;16245:799::-;16400:4;16421:15;:2;:13;;;:15::i;:::-;16417:620;;;16473:2;16457:36;;;16494:12;:10;:12::i;:::-;16508:4;16514:7;16523:5;16457:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16453:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16716:1;16699:6;:13;:18;16695:272;;;16742:60;;;;;;;;;;:::i;:::-;;;;;;;;16695:272;16917:6;16911:13;16902:6;16898:2;16894:15;16887:38;16453:529;16590:41;;;16580:51;;;:6;:51;;;;16573:58;;;;;16417:620;17021:4;17014:11;;16245:799;;;;;;;:::o;17047:126::-;;;;:::o;24822:387::-;24882:4;25090:12;25157:7;25145:20;25137:28;;25200:1;25193:4;:8;25186:15;;;24822: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:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:117::-;10993:1;10990;10983:12;11007:117;11116:1;11113;11106:12;11147:568;11220:8;11230:6;11280:3;11273:4;11265:6;11261:17;11257:27;11247:122;;11288:79;;:::i;:::-;11247:122;11401:6;11388:20;11378:30;;11431:18;11423:6;11420:30;11417:117;;;11453:79;;:::i;:::-;11417:117;11567:4;11559:6;11555:17;11543:29;;11621:3;11613:4;11605:6;11601:17;11591:8;11587:32;11584:41;11581:128;;;11628:79;;:::i;:::-;11581:128;11147:568;;;;;:::o;11738:::-;11811:8;11821:6;11871:3;11864:4;11856:6;11852:17;11848:27;11838:122;;11879:79;;:::i;:::-;11838:122;11992:6;11979:20;11969:30;;12022:18;12014:6;12011:30;12008:117;;;12044:79;;:::i;:::-;12008:117;12158:4;12150:6;12146:17;12134:29;;12212:3;12204:4;12196:6;12192:17;12182:8;12178:32;12175:41;12172:128;;;12219:79;;:::i;:::-;12172:128;11738:568;;;;;:::o;12312:934::-;12434:6;12442;12450;12458;12507:2;12495:9;12486:7;12482:23;12478:32;12475:119;;;12513:79;;:::i;:::-;12475:119;12661:1;12650:9;12646:17;12633:31;12691:18;12683:6;12680:30;12677:117;;;12713:79;;:::i;:::-;12677:117;12826:80;12898:7;12889:6;12878:9;12874:22;12826:80;:::i;:::-;12808:98;;;;12604:312;12983:2;12972:9;12968:18;12955:32;13014:18;13006:6;13003:30;13000:117;;;13036:79;;:::i;:::-;13000:117;13149:80;13221:7;13212:6;13201:9;13197:22;13149:80;:::i;:::-;13131:98;;;;12926:313;12312:934;;;;;;;:::o;13252:116::-;13322:21;13337:5;13322:21;:::i;:::-;13315:5;13312:32;13302:60;;13358:1;13355;13348:12;13302:60;13252:116;:::o;13374:133::-;13417:5;13455:6;13442:20;13433:29;;13471:30;13495:5;13471:30;:::i;:::-;13374:133;;;;:::o;13513:468::-;13578:6;13586;13635:2;13623:9;13614:7;13610:23;13606:32;13603:119;;;13641:79;;:::i;:::-;13603:119;13761:1;13786:53;13831:7;13822:6;13811:9;13807:22;13786:53;:::i;:::-;13776:63;;13732:117;13888:2;13914:50;13956:7;13947:6;13936:9;13932:22;13914:50;:::i;:::-;13904:60;;13859:115;13513:468;;;;;:::o;13987:307::-;14048:4;14138:18;14130:6;14127:30;14124:56;;;14160:18;;:::i;:::-;14124:56;14198:29;14220:6;14198:29;:::i;:::-;14190:37;;14282:4;14276;14272:15;14264:23;;13987:307;;;:::o;14300:410::-;14377:5;14402:65;14418:48;14459:6;14418:48;:::i;:::-;14402:65;:::i;:::-;14393:74;;14490:6;14483:5;14476:21;14528:4;14521:5;14517:16;14566:3;14557:6;14552:3;14548:16;14545:25;14542:112;;;14573:79;;:::i;:::-;14542:112;14663:41;14697:6;14692:3;14687;14663:41;:::i;:::-;14383:327;14300:410;;;;;:::o;14729:338::-;14784:5;14833:3;14826:4;14818:6;14814:17;14810:27;14800:122;;14841:79;;:::i;:::-;14800:122;14958:6;14945:20;14983:78;15057:3;15049:6;15042:4;15034:6;15030:17;14983:78;:::i;:::-;14974:87;;14790:277;14729:338;;;;:::o;15073:943::-;15168:6;15176;15184;15192;15241:3;15229:9;15220:7;15216:23;15212:33;15209:120;;;15248:79;;:::i;:::-;15209:120;15368:1;15393:53;15438:7;15429:6;15418:9;15414:22;15393:53;:::i;:::-;15383:63;;15339:117;15495:2;15521:53;15566:7;15557:6;15546:9;15542:22;15521:53;:::i;:::-;15511:63;;15466:118;15623:2;15649:53;15694:7;15685:6;15674:9;15670:22;15649:53;:::i;:::-;15639:63;;15594:118;15779:2;15768:9;15764:18;15751:32;15810:18;15802:6;15799:30;15796:117;;;15832:79;;:::i;:::-;15796:117;15937:62;15991:7;15982:6;15971:9;15967:22;15937:62;:::i;:::-;15927:72;;15722:287;15073:943;;;;;;;:::o;16022:323::-;16078:6;16127:2;16115:9;16106:7;16102:23;16098:32;16095:119;;;16133:79;;:::i;:::-;16095:119;16253:1;16278:50;16320:7;16311:6;16300:9;16296:22;16278:50;:::i;:::-;16268:60;;16224:114;16022:323;;;;:::o;16351:474::-;16419:6;16427;16476:2;16464:9;16455:7;16451:23;16447:32;16444:119;;;16482:79;;:::i;:::-;16444:119;16602:1;16627:53;16672:7;16663:6;16652:9;16648:22;16627:53;:::i;:::-;16617:63;;16573:117;16729:2;16755:53;16800:7;16791:6;16780:9;16776:22;16755:53;:::i;:::-;16745:63;;16700:118;16351:474;;;;;:::o;16831:180::-;16879:77;16876:1;16869:88;16976:4;16973:1;16966:15;17000:4;16997:1;16990:15;17017:320;17061:6;17098:1;17092:4;17088:12;17078:22;;17145:1;17139:4;17135:12;17166:18;17156:81;;17222:4;17214:6;17210:17;17200:27;;17156:81;17284:2;17276:6;17273:14;17253:18;17250:38;17247:84;;;17303:18;;:::i;:::-;17247:84;17068:269;17017:320;;;:::o;17343:231::-;17483:34;17479:1;17471:6;17467:14;17460:58;17552:14;17547:2;17539:6;17535:15;17528:39;17343:231;:::o;17580:366::-;17722:3;17743:67;17807:2;17802:3;17743:67;:::i;:::-;17736:74;;17819:93;17908:3;17819:93;:::i;:::-;17937:2;17932:3;17928:12;17921:19;;17580:366;;;:::o;17952:419::-;18118:4;18156:2;18145:9;18141:18;18133:26;;18205:9;18199:4;18195:20;18191:1;18180:9;18176:17;18169:47;18233:131;18359:4;18233:131;:::i;:::-;18225:139;;17952:419;;;:::o;18377:181::-;18517:33;18513:1;18505:6;18501:14;18494:57;18377:181;:::o;18564:366::-;18706:3;18727:67;18791:2;18786:3;18727:67;:::i;:::-;18720:74;;18803:93;18892:3;18803:93;:::i;:::-;18921:2;18916:3;18912:12;18905:19;;18564:366;;;:::o;18936:419::-;19102:4;19140:2;19129:9;19125:18;19117:26;;19189:9;19183:4;19179:20;19175:1;19164:9;19160:17;19153:47;19217:131;19343:4;19217:131;:::i;:::-;19209:139;;18936:419;;;:::o;19361:180::-;19409:77;19406:1;19399:88;19506:4;19503:1;19496:15;19530:4;19527:1;19520:15;19547:305;19587:3;19606:20;19624:1;19606:20;:::i;:::-;19601:25;;19640:20;19658:1;19640:20;:::i;:::-;19635:25;;19794:1;19726:66;19722:74;19719:1;19716:81;19713:107;;;19800:18;;:::i;:::-;19713:107;19844:1;19841;19837:9;19830:16;;19547:305;;;;:::o;19858:178::-;19998:30;19994:1;19986:6;19982:14;19975:54;19858:178;:::o;20042:366::-;20184:3;20205:67;20269:2;20264:3;20205:67;:::i;:::-;20198:74;;20281:93;20370:3;20281:93;:::i;:::-;20399:2;20394:3;20390:12;20383:19;;20042:366;;;:::o;20414:419::-;20580:4;20618:2;20607:9;20603:18;20595:26;;20667:9;20661:4;20657:20;20653:1;20642:9;20638:17;20631:47;20695:131;20821:4;20695:131;:::i;:::-;20687:139;;20414:419;;;:::o;20839:161::-;20979:13;20975:1;20967:6;20963:14;20956:37;20839:161;:::o;21006:366::-;21148:3;21169:67;21233:2;21228:3;21169:67;:::i;:::-;21162:74;;21245:93;21334:3;21245:93;:::i;:::-;21363:2;21358:3;21354:12;21347:19;;21006:366;;;:::o;21378:419::-;21544:4;21582:2;21571:9;21567:18;21559:26;;21631:9;21625:4;21621:20;21617:1;21606:9;21602:17;21595:47;21659:131;21785:4;21659:131;:::i;:::-;21651:139;;21378:419;;;:::o;21803:177::-;21943:29;21939:1;21931:6;21927:14;21920:53;21803:177;:::o;21986:366::-;22128:3;22149:67;22213:2;22208:3;22149:67;:::i;:::-;22142:74;;22225:93;22314:3;22225:93;:::i;:::-;22343:2;22338:3;22334:12;22327:19;;21986:366;;;:::o;22358:419::-;22524:4;22562:2;22551:9;22547:18;22539:26;;22611:9;22605:4;22601:20;22597:1;22586:9;22582:17;22575:47;22639:131;22765:4;22639:131;:::i;:::-;22631:139;;22358:419;;;:::o;22783:169::-;22923:21;22919:1;22911:6;22907:14;22900:45;22783:169;:::o;22958:366::-;23100:3;23121:67;23185:2;23180:3;23121:67;:::i;:::-;23114:74;;23197:93;23286:3;23197:93;:::i;:::-;23315:2;23310:3;23306:12;23299:19;;22958:366;;;:::o;23330:419::-;23496:4;23534:2;23523:9;23519:18;23511:26;;23583:9;23577:4;23573:20;23569:1;23558:9;23554:17;23547:47;23611:131;23737:4;23611:131;:::i;:::-;23603:139;;23330:419;;;:::o;23755:233::-;23794:3;23817:24;23835:5;23817:24;:::i;:::-;23808:33;;23863:66;23856:5;23853:77;23850:103;;;23933:18;;:::i;:::-;23850:103;23980:1;23973:5;23969:13;23962:20;;23755:233;;;:::o;23994:220::-;24134:34;24130:1;24122:6;24118:14;24111:58;24203:3;24198:2;24190:6;24186:15;24179:28;23994:220;:::o;24220:366::-;24362:3;24383:67;24447:2;24442:3;24383:67;:::i;:::-;24376:74;;24459:93;24548:3;24459:93;:::i;:::-;24577:2;24572:3;24568:12;24561:19;;24220:366;;;:::o;24592:419::-;24758:4;24796:2;24785:9;24781:18;24773:26;;24845:9;24839:4;24835:20;24831:1;24820:9;24816:17;24809:47;24873:131;24999:4;24873:131;:::i;:::-;24865:139;;24592:419;;;:::o;25017:243::-;25157:34;25153:1;25145:6;25141:14;25134:58;25226:26;25221:2;25213:6;25209:15;25202:51;25017:243;:::o;25266:366::-;25408:3;25429:67;25493:2;25488:3;25429:67;:::i;:::-;25422:74;;25505:93;25594:3;25505:93;:::i;:::-;25623:2;25618:3;25614:12;25607:19;;25266:366;;;:::o;25638:419::-;25804:4;25842:2;25831:9;25827:18;25819:26;;25891:9;25885:4;25881:20;25877:1;25866:9;25862:17;25855:47;25919:131;26045:4;25919:131;:::i;:::-;25911:139;;25638:419;;;:::o;26063:182::-;26203:34;26199:1;26191:6;26187:14;26180:58;26063:182;:::o;26251:366::-;26393:3;26414:67;26478:2;26473:3;26414:67;:::i;:::-;26407:74;;26490:93;26579:3;26490:93;:::i;:::-;26608:2;26603:3;26599:12;26592:19;;26251:366;;;:::o;26623:419::-;26789:4;26827:2;26816:9;26812:18;26804:26;;26876:9;26870:4;26866:20;26862:1;26851:9;26847:17;26840:47;26904:131;27030:4;26904:131;:::i;:::-;26896:139;;26623:419;;;:::o;27048:236::-;27188:34;27184:1;27176:6;27172:14;27165:58;27257:19;27252:2;27244:6;27240:15;27233:44;27048:236;:::o;27290:366::-;27432:3;27453:67;27517:2;27512:3;27453:67;:::i;:::-;27446:74;;27529:93;27618:3;27529:93;:::i;:::-;27647:2;27642:3;27638:12;27631:19;;27290:366;;;:::o;27662:419::-;27828:4;27866:2;27855:9;27851:18;27843:26;;27915:9;27909:4;27905:20;27901:1;27890:9;27886:17;27879:47;27943:131;28069:4;27943:131;:::i;:::-;27935:139;;27662:419;;;:::o;28087:172::-;28227:24;28223:1;28215:6;28211:14;28204:48;28087:172;:::o;28265:366::-;28407:3;28428:67;28492:2;28487:3;28428:67;:::i;:::-;28421:74;;28504:93;28593:3;28504:93;:::i;:::-;28622:2;28617:3;28613:12;28606:19;;28265:366;;;:::o;28637:419::-;28803:4;28841:2;28830:9;28826:18;28818:26;;28890:9;28884:4;28880:20;28876:1;28865:9;28861:17;28854:47;28918:131;29044:4;28918:131;:::i;:::-;28910:139;;28637:419;;;:::o;29062:180::-;29110:77;29107:1;29100:88;29207:4;29204:1;29197:15;29231:4;29228:1;29221:15;29248:147;29349:11;29386:3;29371:18;;29248:147;;;;:::o;29401:114::-;;:::o;29521:398::-;29680:3;29701:83;29782:1;29777:3;29701:83;:::i;:::-;29694:90;;29793:93;29882:3;29793:93;:::i;:::-;29911:1;29906:3;29902:11;29895:18;;29521:398;;;:::o;29925:379::-;30109:3;30131:147;30274:3;30131:147;:::i;:::-;30124:154;;30295:3;30288:10;;29925:379;;;:::o;30310:173::-;30450:25;30446:1;30438:6;30434:14;30427:49;30310:173;:::o;30489:366::-;30631:3;30652:67;30716:2;30711:3;30652:67;:::i;:::-;30645:74;;30728:93;30817:3;30728:93;:::i;:::-;30846:2;30841:3;30837:12;30830:19;;30489:366;;;:::o;30861:419::-;31027:4;31065:2;31054:9;31050:18;31042:26;;31114:9;31108:4;31104:20;31100:1;31089:9;31085:17;31078:47;31142:131;31268:4;31142:131;:::i;:::-;31134:139;;30861:419;;;:::o;31286:228::-;31426:34;31422:1;31414:6;31410:14;31403:58;31495:11;31490:2;31482:6;31478:15;31471:36;31286:228;:::o;31520:366::-;31662:3;31683:67;31747:2;31742:3;31683:67;:::i;:::-;31676:74;;31759:93;31848:3;31759:93;:::i;:::-;31877:2;31872:3;31868:12;31861:19;;31520:366;;;:::o;31892:419::-;32058:4;32096:2;32085:9;32081:18;32073:26;;32145:9;32139:4;32135:20;32131:1;32120:9;32116:17;32109:47;32173:131;32299:4;32173:131;:::i;:::-;32165:139;;31892:419;;;:::o;32317:229::-;32457:34;32453:1;32445:6;32441:14;32434:58;32526:12;32521:2;32513:6;32509:15;32502:37;32317:229;:::o;32552:366::-;32694:3;32715:67;32779:2;32774:3;32715:67;:::i;:::-;32708:74;;32791:93;32880:3;32791:93;:::i;:::-;32909:2;32904:3;32900:12;32893:19;;32552:366;;;:::o;32924:419::-;33090:4;33128:2;33117:9;33113:18;33105:26;;33177:9;33171:4;33167:20;33163:1;33152:9;33148:17;33141:47;33205:131;33331:4;33205:131;:::i;:::-;33197:139;;32924:419;;;:::o;33349:220::-;33489:34;33485:1;33477:6;33473:14;33466:58;33558:3;33553:2;33545:6;33541:15;33534:28;33349:220;:::o;33575:366::-;33717:3;33738:67;33802:2;33797:3;33738:67;:::i;:::-;33731:74;;33814:93;33903:3;33814:93;:::i;:::-;33932:2;33927:3;33923:12;33916:19;;33575:366;;;:::o;33947:419::-;34113:4;34151:2;34140:9;34136:18;34128:26;;34200:9;34194:4;34190:20;34186:1;34175:9;34171:17;34164:47;34228:131;34354:4;34228:131;:::i;:::-;34220:139;;33947:419;;;:::o;34372:158::-;34512:10;34508:1;34500:6;34496:14;34489:34;34372:158;:::o;34536:365::-;34678:3;34699:66;34763:1;34758:3;34699:66;:::i;:::-;34692:73;;34774:93;34863:3;34774:93;:::i;:::-;34892:2;34887:3;34883:12;34876:19;;34536:365;;;:::o;34907:419::-;35073:4;35111:2;35100:9;35096:18;35088:26;;35160:9;35154:4;35150:20;35146:1;35135:9;35131:17;35124:47;35188:131;35314:4;35188:131;:::i;:::-;35180:139;;34907:419;;;:::o;35332:348::-;35372:7;35395:20;35413:1;35395:20;:::i;:::-;35390:25;;35429:20;35447:1;35429:20;:::i;:::-;35424:25;;35617:1;35549:66;35545:74;35542:1;35539:81;35534:1;35527:9;35520:17;35516:105;35513:131;;;35624:18;;:::i;:::-;35513:131;35672:1;35669;35665:9;35654:20;;35332:348;;;;:::o;35686:175::-;35826:27;35822:1;35814:6;35810:14;35803:51;35686:175;:::o;35867:366::-;36009:3;36030:67;36094:2;36089:3;36030:67;:::i;:::-;36023:74;;36106:93;36195:3;36106:93;:::i;:::-;36224:2;36219:3;36215:12;36208:19;;35867:366;;;:::o;36239:419::-;36405:4;36443:2;36432:9;36428:18;36420:26;;36492:9;36486:4;36482:20;36478:1;36467:9;36463:17;36456:47;36520:131;36646:4;36520:131;:::i;:::-;36512:139;;36239:419;;;:::o;36664:220::-;36804:34;36800:1;36792:6;36788:14;36781:58;36873:3;36868:2;36860:6;36856:15;36849:28;36664:220;:::o;36890:366::-;37032:3;37053:67;37117:2;37112:3;37053:67;:::i;:::-;37046:74;;37129:93;37218:3;37129:93;:::i;:::-;37247:2;37242:3;37238:12;37231:19;;36890:366;;;:::o;37262:419::-;37428:4;37466:2;37455:9;37451:18;37443:26;;37515:9;37509:4;37505:20;37501:1;37490:9;37486:17;37479:47;37543:131;37669:4;37543:131;:::i;:::-;37535:139;;37262:419;;;:::o;37687:148::-;37789:11;37826:3;37811:18;;37687:148;;;;:::o;37841:377::-;37947:3;37975:39;38008:5;37975:39;:::i;:::-;38030:89;38112:6;38107:3;38030:89;:::i;:::-;38023:96;;38128:52;38173:6;38168:3;38161:4;38154:5;38150:16;38128:52;:::i;:::-;38205:6;38200:3;38196:16;38189:23;;37951:267;37841:377;;;;:::o;38224:435::-;38404:3;38426:95;38517:3;38508:6;38426:95;:::i;:::-;38419:102;;38538:95;38629:3;38620:6;38538:95;:::i;:::-;38531:102;;38650:3;38643:10;;38224:435;;;;;:::o;38665:225::-;38805:34;38801:1;38793:6;38789:14;38782:58;38874:8;38869:2;38861:6;38857:15;38850:33;38665:225;:::o;38896:366::-;39038:3;39059:67;39123:2;39118:3;39059:67;:::i;:::-;39052:74;;39135:93;39224:3;39135:93;:::i;:::-;39253:2;39248:3;39244:12;39237:19;;38896:366;;;:::o;39268:419::-;39434:4;39472:2;39461:9;39457:18;39449:26;;39521:9;39515:4;39511:20;39507:1;39496:9;39492:17;39485:47;39549:131;39675:4;39549:131;:::i;:::-;39541:139;;39268:419;;;:::o;39693:237::-;39833:34;39829:1;39821:6;39817:14;39810:58;39902:20;39897:2;39889:6;39885:15;39878:45;39693:237;:::o;39936:366::-;40078:3;40099:67;40163:2;40158:3;40099:67;:::i;:::-;40092:74;;40175:93;40264:3;40175:93;:::i;:::-;40293:2;40288:3;40284:12;40277:19;;39936:366;;;:::o;40308:419::-;40474:4;40512:2;40501:9;40497:18;40489:26;;40561:9;40555:4;40551:20;40547:1;40536:9;40532:17;40525:47;40589:131;40715:4;40589:131;:::i;:::-;40581:139;;40308:419;;;:::o;40733:231::-;40873:34;40869:1;40861:6;40857:14;40850:58;40942:14;40937:2;40929:6;40925:15;40918:39;40733:231;:::o;40970:366::-;41112:3;41133:67;41197:2;41192:3;41133:67;:::i;:::-;41126:74;;41209:93;41298:3;41209:93;:::i;:::-;41327:2;41322:3;41318:12;41311:19;;40970:366;;;:::o;41342:419::-;41508:4;41546:2;41535:9;41531:18;41523:26;;41595:9;41589:4;41585:20;41581:1;41570:9;41566:17;41559:47;41623:131;41749:4;41623:131;:::i;:::-;41615:139;;41342:419;;;:::o;41767:228::-;41907:34;41903:1;41895:6;41891:14;41884:58;41976:11;41971:2;41963:6;41959:15;41952:36;41767:228;:::o;42001:366::-;42143:3;42164:67;42228:2;42223:3;42164:67;:::i;:::-;42157:74;;42240:93;42329:3;42240:93;:::i;:::-;42358:2;42353:3;42349:12;42342:19;;42001:366;;;:::o;42373:419::-;42539:4;42577:2;42566:9;42562:18;42554:26;;42626:9;42620:4;42616:20;42612:1;42601:9;42597:17;42590:47;42654:131;42780:4;42654:131;:::i;:::-;42646:139;;42373:419;;;:::o;42798:223::-;42938:34;42934:1;42926:6;42922:14;42915:58;43007:6;43002:2;42994:6;42990:15;42983:31;42798:223;:::o;43027:366::-;43169:3;43190:67;43254:2;43249:3;43190:67;:::i;:::-;43183:74;;43266:93;43355:3;43266:93;:::i;:::-;43384:2;43379:3;43375:12;43368:19;;43027:366;;;:::o;43399:419::-;43565:4;43603:2;43592:9;43588:18;43580:26;;43652:9;43646:4;43642:20;43638:1;43627:9;43623:17;43616:47;43680:131;43806:4;43680:131;:::i;:::-;43672:139;;43399:419;;;:::o;43824:180::-;43872:77;43869:1;43862:88;43969:4;43966:1;43959:15;43993:4;43990:1;43983:15;44010:185;44050:1;44067:20;44085:1;44067:20;:::i;:::-;44062:25;;44101:20;44119:1;44101:20;:::i;:::-;44096:25;;44140:1;44130:35;;44145:18;;:::i;:::-;44130:35;44187:1;44184;44180:9;44175:14;;44010:185;;;;:::o;44201:191::-;44241:4;44261:20;44279:1;44261:20;:::i;:::-;44256:25;;44295:20;44313:1;44295:20;:::i;:::-;44290:25;;44334:1;44331;44328:8;44325:34;;;44339:18;;:::i;:::-;44325:34;44384:1;44381;44377:9;44369:17;;44201:191;;;;:::o;44398:176::-;44430:1;44447:20;44465:1;44447:20;:::i;:::-;44442:25;;44481:20;44499:1;44481:20;:::i;:::-;44476:25;;44520:1;44510:35;;44525:18;;:::i;:::-;44510:35;44566:1;44563;44559:9;44554:14;;44398:176;;;;:::o;44580:182::-;44720:34;44716:1;44708:6;44704:14;44697:58;44580:182;:::o;44768:366::-;44910:3;44931:67;44995:2;44990:3;44931:67;:::i;:::-;44924:74;;45007:93;45096:3;45007:93;:::i;:::-;45125:2;45120:3;45116:12;45109:19;;44768:366;;;:::o;45140:419::-;45306:4;45344:2;45333:9;45329:18;45321:26;;45393:9;45387:4;45383:20;45379:1;45368:9;45364:17;45357:47;45421:131;45547:4;45421:131;:::i;:::-;45413:139;;45140:419;;;:::o;45565:178::-;45705:30;45701:1;45693:6;45689:14;45682:54;45565:178;:::o;45749:366::-;45891:3;45912:67;45976:2;45971:3;45912:67;:::i;:::-;45905:74;;45988:93;46077:3;45988:93;:::i;:::-;46106:2;46101:3;46097:12;46090:19;;45749:366;;;:::o;46121:419::-;46287:4;46325:2;46314:9;46310:18;46302:26;;46374:9;46368:4;46364:20;46360:1;46349:9;46345:17;46338:47;46402:131;46528:4;46402:131;:::i;:::-;46394:139;;46121:419;;;:::o;46546:98::-;46597:6;46631:5;46625:12;46615:22;;46546:98;;;:::o;46650:168::-;46733:11;46767:6;46762:3;46755:19;46807:4;46802:3;46798:14;46783:29;;46650:168;;;;:::o;46824:360::-;46910:3;46938:38;46970:5;46938:38;:::i;:::-;46992:70;47055:6;47050:3;46992:70;:::i;:::-;46985:77;;47071:52;47116:6;47111:3;47104:4;47097:5;47093:16;47071:52;:::i;:::-;47148:29;47170:6;47148:29;:::i;:::-;47143:3;47139:39;47132:46;;46914:270;46824:360;;;;:::o;47190:640::-;47385:4;47423:3;47412:9;47408:19;47400:27;;47437:71;47505:1;47494:9;47490:17;47481:6;47437:71;:::i;:::-;47518:72;47586:2;47575:9;47571:18;47562:6;47518:72;:::i;:::-;47600;47668:2;47657:9;47653:18;47644:6;47600:72;:::i;:::-;47719:9;47713:4;47709:20;47704:2;47693:9;47689:18;47682:48;47747:76;47818:4;47809:6;47747:76;:::i;:::-;47739:84;;47190:640;;;;;;;:::o;47836:141::-;47892:5;47923:6;47917:13;47908:22;;47939:32;47965:5;47939:32;:::i;:::-;47836:141;;;;:::o;47983:349::-;48052:6;48101:2;48089:9;48080:7;48076:23;48072:32;48069:119;;;48107:79;;:::i;:::-;48069:119;48227:1;48252:63;48307:7;48298:6;48287:9;48283:22;48252:63;:::i;:::-;48242:73;;48198:127;47983:349;;;;:::o
Swarm Source
ipfs://f0162183b5aefb668e24a4d594a24a006529953a5049ba5f06873e8c2ac28026
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.