Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 38 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 15557055 | 788 days ago | IN | 0 ETH | 0.0004006 | ||||
Set Approval For... | 15127554 | 856 days ago | IN | 0 ETH | 0.00068519 | ||||
Transfer From | 14901307 | 894 days ago | IN | 0 ETH | 0.00249583 | ||||
Mint | 14883547 | 897 days ago | IN | 0.02 ETH | 0.00342205 | ||||
Mint | 14883546 | 897 days ago | IN | 0.02 ETH | 0.00378725 | ||||
Mint | 14883268 | 897 days ago | IN | 0 ETH | 0.00093 | ||||
Mint | 14881863 | 897 days ago | IN | 0.06 ETH | 0.00425796 | ||||
Mint | 14880435 | 898 days ago | IN | 0.02 ETH | 0.0072152 | ||||
Mint | 14880186 | 898 days ago | IN | 0.02 ETH | 0.0048074 | ||||
Mint | 14880057 | 898 days ago | IN | 0.02 ETH | 0.00665969 | ||||
Mint | 14879674 | 898 days ago | IN | 0.05 ETH | 0.01152985 | ||||
Mint | 14879637 | 898 days ago | IN | 0.03 ETH | 0.00515946 | ||||
Set Approval For... | 14879576 | 898 days ago | IN | 0 ETH | 0.00293257 | ||||
Mint | 14879359 | 898 days ago | IN | 0.01 ETH | 0.00955694 | ||||
Mint | 14879252 | 898 days ago | IN | 0.01 ETH | 0.00201408 | ||||
Mint | 14879244 | 898 days ago | IN | 0 ETH | 0.0006233 | ||||
Mint | 14879244 | 898 days ago | IN | 0 ETH | 0.00065482 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00062332 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00065484 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00065484 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00065484 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00065484 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00065484 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00234113 | ||||
Mint | 14879243 | 898 days ago | IN | 0 ETH | 0.00234113 |
Latest 10 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14883547 | 897 days ago | 0.02 ETH | ||||
14883546 | 897 days ago | 0.02 ETH | ||||
14881863 | 897 days ago | 0.06 ETH | ||||
14880435 | 898 days ago | 0.02 ETH | ||||
14880186 | 898 days ago | 0.02 ETH | ||||
14880057 | 898 days ago | 0.02 ETH | ||||
14879674 | 898 days ago | 0.05 ETH | ||||
14879637 | 898 days ago | 0.03 ETH | ||||
14879359 | 898 days ago | 0.01 ETH | ||||
14879252 | 898 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
NFT3
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-31 */ /** *Submitted for verification at Etherscan.io on 2022-04-14 */ // File: contracts/SixteenBitApes.sol // OpenZeppelin Contracts v4.4.1 (utils/math/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 generally not needed starting with Solidity 0.8, since 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; } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/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 making 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; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/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() { _transferOwnership(_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 { _transferOwnership(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" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/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; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/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); } // File: contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } //SPDX-License-Identifier: MIT //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity ^0.8.0; contract NFT3 is ERC721A, IERC2981, Ownable, ReentrancyGuard { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private tokenCounter; string private baseURI = "ipfs://QmSaKC7Etha3eCuZWosjrs8FqExgSjJTzCU55MLgSt4BXB"; address private openSeaProxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; bool private isOpenSeaProxyActive = true; uint256 public constant MAX_MINTS_PER_TX = 10; uint256 public maxSupply = 6969; address private addressReceive = 0x23BB6Db7D34471FCe9376854D781d55315c3C114; uint256 public constant PRICE = 0.01 ether; uint256 public NUM_FREE_MINTS = 99; bool public isPublicSaleActive = true; // ============ ACCESS CONTROL/SANITY MODIFIERS ============ modifier publicSaleActive() { require(isPublicSaleActive, "Public sale is not open"); _; } modifier maxMintsPerTX(uint256 numberOfTokens) { require( numberOfTokens <= MAX_MINTS_PER_TX, "Max mints per transaction exceeded" ); _; } modifier canMintNFTs(uint256 numberOfTokens) { require( totalSupply() + numberOfTokens <= maxSupply, "Not enough mints remaining to mint" ); _; } modifier freeMintsAvailable() { require( totalSupply() <= NUM_FREE_MINTS, "Not enough free mints remain" ); _; } modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) { if (totalSupply() > NUM_FREE_MINTS) { require( (price * numberOfTokens) == msg.value, "Incorrect ETH value sent" ); } _; } constructor() ERC721A("Buy this NFT or Ape'll do it", "Alldoit", 100, maxSupply) {} // ============ PUBLIC FUNCTIONS FOR MINTING ============ function mint(uint256 numberOfTokens) external payable nonReentrant isCorrectPayment(PRICE, numberOfTokens) publicSaleActive canMintNFTs(numberOfTokens) maxMintsPerTX(numberOfTokens) { payable(addressReceive).transfer(address(this).balance); _safeMint(msg.sender, numberOfTokens); } //A simple free mint function to avoid confusion //The normal mint function with a cost of 0 would work too // ============ PUBLIC READ-ONLY FUNCTIONS ============ function getBaseURI() external view returns (string memory) { return baseURI; } // ============ OWNER-ONLY ADMIN FUNCTIONS ============ function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } // function to disable gasless listings for security in case // opensea ever shuts down or is compromised function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive) external onlyOwner { isOpenSeaProxyActive = _isOpenSeaProxyActive; } function setIsPublicSaleActive(bool _isPublicSaleActive) external onlyOwner { isPublicSaleActive = _isPublicSaleActive; } function setNumFreeMints(uint256 _numfreemints) external onlyOwner { NUM_FREE_MINTS = _numfreemints; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function withdrawTokens(IERC20 token) public onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(msg.sender, balance); } // ============ SUPPORTING FUNCTIONS ============ function nextTokenId() private returns (uint256) { tokenCounter.increment(); return tokenCounter.current(); } // ============ FUNCTION OVERRIDES ============ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Get a reference to OpenSea's proxy registry contract by instantiating // the contract using the already existing address. ProxyRegistry proxyRegistry = ProxyRegistry( openSeaProxyRegistryAddress ); if ( isOpenSeaProxyActive && address(proxyRegistry.proxies(owner)) == operator ) { return true; } return super.isApprovedForAll(owner, operator); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return string(abi.encodePacked(baseURI, "/", (tokenId + 1).toString())); } /** * @dev See {IERC165-royaltyInfo}. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Nonexistent token"); return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100)); } } // These contract definitions are used to create a reference to the OpenSea // ProxyRegistry contract by using the registry's address (see isApprovedForAll). contract OwnableDelegateProxy { } contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006007556040518060600160405280603581526020016200522560359139600b90805190602001906200003e92919062000377565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550611b39600d557323bb6db7d34471fce9376854d781d55315c3c114600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506063600f556001601060006101000a81548160ff0219169083151502179055503480156200013757600080fd5b506040518060400160405280601c81526020017f4275792074686973204e4654206f7220417065276c6c20646f206974000000008152506040518060400160405280600781526020017f416c6c646f6974000000000000000000000000000000000000000000000000008152506064600d5460008111620001ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001e69062000497565b60405180910390fd5b6000821162000235576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022c9062000475565b60405180910390fd5b83600190805190602001906200024d92919062000377565b5082600290805190602001906200026692919062000377565b508160a081815250508060808181525050505050506200029b6200028f620002a960201b60201c565b620002b160201b60201c565b6001600981905550620005cd565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200038590620004ca565b90600052602060002090601f016020900481019282620003a95760008555620003f5565b82601f10620003c457805160ff1916838001178555620003f5565b82800160010185558215620003f5579182015b82811115620003f4578251825591602001919060010190620003d7565b5b50905062000404919062000408565b5090565b5b808211156200042357600081600090555060010162000409565b5090565b600062000436602783620004b9565b915062000443826200052f565b604082019050919050565b60006200045d602e83620004b9565b91506200046a826200057e565b604082019050919050565b60006020820190508181036000830152620004908162000427565b9050919050565b60006020820190508181036000830152620004b2816200044e565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004e357607f821691505b60208210811415620004fa57620004f962000500565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051614c27620005fe6000396000818161244d015281816124760152612ba3015260005050614c276000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610725578063d7224ba014610750578063e43082f71461077b578063e985e9c5146107a4578063f2fde38b146107e1576101f9565b8063a22cb4651461066b578063b88d4fde14610694578063c6a91b42146106bd578063c87b56dd146106e8576101f9565b80638da5cb5b116100dc5780638da5cb5b146105ce57806395d89b41146105f9578063982d669e14610624578063a0712d681461064f576101f9565b806370a0823114610524578063714c539814610561578063715018a61461058c5780638d859f3e146105a3576101f9565b806328cad13d1161019057806342842e0e1161015f57806342842e0e1461042f57806349df728c146104585780634f6ccce71461048157806355f804b3146104be5780636352211e146104e7576101f9565b806328cad13d146103745780632a55205a1461039d5780632f745c59146103db5780633ccfd60b14610418576101f9565b80630a00ae83116101cc5780630a00ae83146102cc57806318160ddd146102f55780631e84c4131461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061346b565b61080a565b6040516102329190613b9e565b60405180910390f35b34801561024757600080fd5b50610250610884565b60405161025d9190613bb9565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613568565b610916565b60405161029a9190613b0e565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133d1565b61099b565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613568565b610ab4565b005b34801561030157600080fd5b5061030a610b3a565b6040516103179190613efb565b60405180910390f35b34801561032c57600080fd5b50610335610b43565b6040516103429190613b9e565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906132bb565b610b56565b005b34801561038057600080fd5b5061039b60048036038101906103969190613411565b610b66565b005b3480156103a957600080fd5b506103c460048036038101906103bf91906135c2565b610bff565b6040516103d2929190613b75565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906133d1565b610c6b565b60405161040f9190613efb565b60405180910390f35b34801561042457600080fd5b5061042d610e69565b005b34801561043b57600080fd5b50610456600480360381019061045191906132bb565b610f34565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134c5565b610f54565b005b34801561048d57600080fd5b506104a860048036038101906104a39190613568565b6110ef565b6040516104b59190613efb565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061351f565b611142565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613568565b6111d8565b60405161051b9190613b0e565b60405180910390f35b34801561053057600080fd5b5061054b6004803603810190610546919061324e565b6111ee565b6040516105589190613efb565b60405180910390f35b34801561056d57600080fd5b506105766112d7565b6040516105839190613bb9565b60405180910390f35b34801561059857600080fd5b506105a1611369565b005b3480156105af57600080fd5b506105b86113f1565b6040516105c59190613efb565b60405180910390f35b3480156105da57600080fd5b506105e36113fc565b6040516105f09190613b0e565b60405180910390f35b34801561060557600080fd5b5061060e611426565b60405161061b9190613bb9565b60405180910390f35b34801561063057600080fd5b506106396114b8565b6040516106469190613efb565b60405180910390f35b61066960048036038101906106649190613568565b6114be565b005b34801561067757600080fd5b50610692600480360381019061068d9190613391565b6116e2565b005b3480156106a057600080fd5b506106bb60048036038101906106b6919061330e565b611863565b005b3480156106c957600080fd5b506106d26118bf565b6040516106df9190613efb565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613568565b6118c4565b60405161071c9190613bb9565b60405180910390f35b34801561073157600080fd5b5061073a61194c565b6040516107479190613efb565b60405180910390f35b34801561075c57600080fd5b50610765611952565b6040516107729190613efb565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613411565b611958565b005b3480156107b057600080fd5b506107cb60048036038101906107c6919061327b565b6119f1565b6040516107d89190613b9e565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061324e565b611b0b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611c03565b5b9050919050565b606060018054610893906142a4565b80601f01602080910402602001604051908101604052809291908181526020018280546108bf906142a4565b801561090c5780601f106108e15761010080835404028352916020019161090c565b820191906000526020600020905b8154815290600101906020018083116108ef57829003601f168201915b5050505050905090565b600061092182611d4d565b610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613ebb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a6826111d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e90613d9b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a36611d5a565b73ffffffffffffffffffffffffffffffffffffffff161480610a655750610a6481610a5f611d5a565b6119f1565b5b610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90613cdb565b60405180910390fd5b610aaf838383611d62565b505050565b610abc611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610ada6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613d3b565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610b61838383611e14565b505050565b610b6e611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610b8c6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613d3b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610c0b84611d4d565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190613cbb565b60405180910390fd5b30610c60610c598560056123cd565b60646123e3565b915091509250929050565b6000610c76836111ee565b8210610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613bdb565b60405180910390fd5b6000610cc1610b3a565b905060008060005b83811015610e27576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dbb57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e135786841415610e04578195505050505050610e63565b8380610e0f90614307565b9450505b508080610e1f90614307565b915050610cc9565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613e3b565b60405180910390fd5b92915050565b610e71611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610e8f6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90613d3b565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f30573d6000803e3d6000fd5b5050565b610f4f83838360405180602001604052806000815250611863565b505050565b610f5c611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790613d3b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161100b9190613b0e565b60206040518083038186803b15801561102357600080fd5b505afa158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b9190613595565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611098929190613b75565b602060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea919061343e565b505050565b60006110f9610b3a565b821061113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613c3b565b60405180910390fd5b819050919050565b61114a611d5a565b73ffffffffffffffffffffffffffffffffffffffff166111686113fc565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613d3b565b60405180910390fd5b80600b90805190602001906111d4929190612fd4565b5050565b60006111e3826123f9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613cfb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112e6906142a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611312906142a4565b801561135f5780601f106113345761010080835404028352916020019161135f565b820191906000526020600020905b81548152906001019060200180831161134257829003601f168201915b5050505050905090565b611371611d5a565b73ffffffffffffffffffffffffffffffffffffffff1661138f6113fc565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613d3b565b60405180910390fd5b6113ef60006125fc565b565b662386f26fc1000081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611435906142a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611461906142a4565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b5050505050905090565b600f5481565b60026009541415611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90613e5b565b60405180910390fd5b6002600981905550662386f26fc1000081600f54611520610b3a565b11156115745734818361153391906140c2565b14611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90613e1b565b60405180910390fd5b5b601060009054906101000a900460ff166115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613e9b565b60405180910390fd5b82600d54816115d0610b3a565b6115da919061403b565b111561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290613c5b565b60405180910390fd5b83600a811115611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790613c9b565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156116c8573d6000803e3d6000fd5b506116d333866126c2565b50505050600160098190555050565b6116ea611d5a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90613d5b565b60405180910390fd5b8060066000611765611d5a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611812611d5a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118579190613b9e565b60405180910390a35050565b61186e848484611e14565b61187a848484846126e0565b6118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090613dbb565b60405180910390fd5b50505050565b600a81565b60606118cf82611d4d565b61190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613cbb565b60405180910390fd5b600b611925600184611920919061403b565b612877565b604051602001611936929190613adf565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611960611d5a565b73ffffffffffffffffffffffffffffffffffffffff1661197e6113fc565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90613d3b565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611ae857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a809190613b0e565b60206040518083038186803b158015611a9857600080fd5b505afa158015611aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad091906134f2565b73ffffffffffffffffffffffffffffffffffffffff16145b15611af7576001915050611b05565b611b0184846129d8565b9150505b92915050565b611b13611d5a565b73ffffffffffffffffffffffffffffffffffffffff16611b316113fc565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613d3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613bfb565b60405180910390fd5b611c00816125fc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cce57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d465750611d4582612a6c565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e1f826123f9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e46611d5a565b73ffffffffffffffffffffffffffffffffffffffff161480611ea25750611e6b611d5a565b73ffffffffffffffffffffffffffffffffffffffff16611e8a84610916565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ebe5750611ebd8260000151611eb8611d5a565b6119f1565b5b905080611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790613d7b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990613d1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613c7b565b60405180910390fd5b611fef8585856001612ad6565b611fff6000848460000151611d62565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661206d919061411c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121119190613ff5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612217919061403b565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561235d5761228d81611d4d565b1561235c576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123c58686866001612adc565b505050505050565b600081836123db91906140c2565b905092915050565b600081836123f19190614091565b905092915050565b61240161305a565b61240a82611d4d565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613c1b565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106124ad5760017f0000000000000000000000000000000000000000000000000000000000000000846124a09190614150565b6124aa919061403b565b90505b60008390505b8181106125bb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a7578093505050506125f7565b5080806125b39061427a565b9150506124b3565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613e7b565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126dc828260405180602001604052806000815250612ae2565b5050565b60006127018473ffffffffffffffffffffffffffffffffffffffff16612fc1565b1561286a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261272a611d5a565b8786866040518563ffffffff1660e01b815260040161274c9493929190613b29565b602060405180830381600087803b15801561276657600080fd5b505af192505050801561279757506040513d601f19601f820116820180604052508101906127949190613498565b60015b61281a573d80600081146127c7576040519150601f19603f3d011682016040523d82523d6000602084013e6127cc565b606091505b50600081511415612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990613dbb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286f565b600190505b949350505050565b606060008214156128bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129d3565b600082905060005b600082146128f15780806128da90614307565b915050600a826128ea9190614091565b91506128c7565b60008167ffffffffffffffff81111561290d5761290c61443d565b5b6040519080825280601f01601f19166020018201604052801561293f5781602001600182028036833780820191505090505b5090505b600085146129cc576001826129589190614150565b9150600a856129679190614350565b6030612973919061403b565b60f81b8183815181106129895761298861440e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129c59190614091565b9450612943565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90613dfb565b60405180910390fd5b612b6181611d4d565b15612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890613ddb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90613edb565b60405180910390fd5b612c116000858386612ad6565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d0e9190613ff5565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d359190613ff5565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fa457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f4460008884886126e0565b612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a90613dbb565b60405180910390fd5b8180612f8e90614307565b9250508080612f9c90614307565b915050612ed3565b5080600081905550612fb96000878588612adc565b505050505050565b600080823b905060008111915050919050565b828054612fe0906142a4565b90600052602060002090601f0160209004810192826130025760008555613049565b82601f1061301b57805160ff1916838001178555613049565b82800160010185558215613049579182015b8281111561304857825182559160200191906001019061302d565b5b5090506130569190613094565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156130ad576000816000905550600101613095565b5090565b60006130c46130bf84613f3b565b613f16565b9050828152602081018484840111156130e0576130df614471565b5b6130eb848285614238565b509392505050565b600061310661310184613f6c565b613f16565b90508281526020810184848401111561312257613121614471565b5b61312d848285614238565b509392505050565b60008135905061314481614b67565b92915050565b60008135905061315981614b7e565b92915050565b60008151905061316e81614b7e565b92915050565b60008135905061318381614b95565b92915050565b60008151905061319881614b95565b92915050565b600082601f8301126131b3576131b261446c565b5b81356131c38482602086016130b1565b91505092915050565b6000813590506131db81614bac565b92915050565b6000815190506131f081614bc3565b92915050565b600082601f83011261320b5761320a61446c565b5b813561321b8482602086016130f3565b91505092915050565b60008135905061323381614bda565b92915050565b60008151905061324881614bda565b92915050565b6000602082840312156132645761326361447b565b5b600061327284828501613135565b91505092915050565b600080604083850312156132925761329161447b565b5b60006132a085828601613135565b92505060206132b185828601613135565b9150509250929050565b6000806000606084860312156132d4576132d361447b565b5b60006132e286828701613135565b93505060206132f386828701613135565b925050604061330486828701613224565b9150509250925092565b600080600080608085870312156133285761332761447b565b5b600061333687828801613135565b945050602061334787828801613135565b935050604061335887828801613224565b925050606085013567ffffffffffffffff81111561337957613378614476565b5b6133858782880161319e565b91505092959194509250565b600080604083850312156133a8576133a761447b565b5b60006133b685828601613135565b92505060206133c78582860161314a565b9150509250929050565b600080604083850312156133e8576133e761447b565b5b60006133f685828601613135565b925050602061340785828601613224565b9150509250929050565b6000602082840312156134275761342661447b565b5b60006134358482850161314a565b91505092915050565b6000602082840312156134545761345361447b565b5b60006134628482850161315f565b91505092915050565b6000602082840312156134815761348061447b565b5b600061348f84828501613174565b91505092915050565b6000602082840312156134ae576134ad61447b565b5b60006134bc84828501613189565b91505092915050565b6000602082840312156134db576134da61447b565b5b60006134e9848285016131cc565b91505092915050565b6000602082840312156135085761350761447b565b5b6000613516848285016131e1565b91505092915050565b6000602082840312156135355761353461447b565b5b600082013567ffffffffffffffff81111561355357613552614476565b5b61355f848285016131f6565b91505092915050565b60006020828403121561357e5761357d61447b565b5b600061358c84828501613224565b91505092915050565b6000602082840312156135ab576135aa61447b565b5b60006135b984828501613239565b91505092915050565b600080604083850312156135d9576135d861447b565b5b60006135e785828601613224565b92505060206135f885828601613224565b9150509250929050565b61360b81614184565b82525050565b61361a81614196565b82525050565b600061362b82613fb2565b6136358185613fc8565b9350613645818560208601614247565b61364e81614480565b840191505092915050565b600061366482613fbd565b61366e8185613fd9565b935061367e818560208601614247565b61368781614480565b840191505092915050565b600061369d82613fbd565b6136a78185613fea565b93506136b7818560208601614247565b80840191505092915050565b600081546136d0816142a4565b6136da8186613fea565b945060018216600081146136f5576001811461370657613739565b60ff19831686528186019350613739565b61370f85613f9d565b60005b8381101561373157815481890152600182019150602081019050613712565b838801955050505b50505092915050565b600061374f602283613fd9565b915061375a82614491565b604082019050919050565b6000613772602683613fd9565b915061377d826144e0565b604082019050919050565b6000613795602a83613fd9565b91506137a08261452f565b604082019050919050565b60006137b8602383613fd9565b91506137c38261457e565b604082019050919050565b60006137db602283613fd9565b91506137e6826145cd565b604082019050919050565b60006137fe602583613fd9565b91506138098261461c565b604082019050919050565b6000613821602283613fd9565b915061382c8261466b565b604082019050919050565b6000613844601183613fd9565b915061384f826146ba565b602082019050919050565b6000613867603983613fd9565b9150613872826146e3565b604082019050919050565b600061388a602b83613fd9565b915061389582614732565b604082019050919050565b60006138ad602683613fd9565b91506138b882614781565b604082019050919050565b60006138d0602083613fd9565b91506138db826147d0565b602082019050919050565b60006138f3601a83613fd9565b91506138fe826147f9565b602082019050919050565b6000613916603283613fd9565b915061392182614822565b604082019050919050565b6000613939602283613fd9565b915061394482614871565b604082019050919050565b600061395c603383613fd9565b9150613967826148c0565b604082019050919050565b600061397f601d83613fd9565b915061398a8261490f565b602082019050919050565b60006139a2602183613fd9565b91506139ad82614938565b604082019050919050565b60006139c5601883613fd9565b91506139d082614987565b602082019050919050565b60006139e8602e83613fd9565b91506139f3826149b0565b604082019050919050565b6000613a0b601f83613fd9565b9150613a16826149ff565b602082019050919050565b6000613a2e602f83613fd9565b9150613a3982614a28565b604082019050919050565b6000613a51601783613fd9565b9150613a5c82614a77565b602082019050919050565b6000613a74602d83613fd9565b9150613a7f82614aa0565b604082019050919050565b6000613a97602283613fd9565b9150613aa282614aef565b604082019050919050565b6000613aba600183613fea565b9150613ac582614b3e565b600182019050919050565b613ad98161422e565b82525050565b6000613aeb82856136c3565b9150613af682613aad565b9150613b028284613692565b91508190509392505050565b6000602082019050613b236000830184613602565b92915050565b6000608082019050613b3e6000830187613602565b613b4b6020830186613602565b613b586040830185613ad0565b8181036060830152613b6a8184613620565b905095945050505050565b6000604082019050613b8a6000830185613602565b613b976020830184613ad0565b9392505050565b6000602082019050613bb36000830184613611565b92915050565b60006020820190508181036000830152613bd38184613659565b905092915050565b60006020820190508181036000830152613bf481613742565b9050919050565b60006020820190508181036000830152613c1481613765565b9050919050565b60006020820190508181036000830152613c3481613788565b9050919050565b60006020820190508181036000830152613c54816137ab565b9050919050565b60006020820190508181036000830152613c74816137ce565b9050919050565b60006020820190508181036000830152613c94816137f1565b9050919050565b60006020820190508181036000830152613cb481613814565b9050919050565b60006020820190508181036000830152613cd481613837565b9050919050565b60006020820190508181036000830152613cf48161385a565b9050919050565b60006020820190508181036000830152613d148161387d565b9050919050565b60006020820190508181036000830152613d34816138a0565b9050919050565b60006020820190508181036000830152613d54816138c3565b9050919050565b60006020820190508181036000830152613d74816138e6565b9050919050565b60006020820190508181036000830152613d9481613909565b9050919050565b60006020820190508181036000830152613db48161392c565b9050919050565b60006020820190508181036000830152613dd48161394f565b9050919050565b60006020820190508181036000830152613df481613972565b9050919050565b60006020820190508181036000830152613e1481613995565b9050919050565b60006020820190508181036000830152613e34816139b8565b9050919050565b60006020820190508181036000830152613e54816139db565b9050919050565b60006020820190508181036000830152613e74816139fe565b9050919050565b60006020820190508181036000830152613e9481613a21565b9050919050565b60006020820190508181036000830152613eb481613a44565b9050919050565b60006020820190508181036000830152613ed481613a67565b9050919050565b60006020820190508181036000830152613ef481613a8a565b9050919050565b6000602082019050613f106000830184613ad0565b92915050565b6000613f20613f31565b9050613f2c82826142d6565b919050565b6000604051905090565b600067ffffffffffffffff821115613f5657613f5561443d565b5b613f5f82614480565b9050602081019050919050565b600067ffffffffffffffff821115613f8757613f8661443d565b5b613f9082614480565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614000826141f2565b915061400b836141f2565b9250826fffffffffffffffffffffffffffffffff038211156140305761402f614381565b5b828201905092915050565b60006140468261422e565b91506140518361422e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408657614085614381565b5b828201905092915050565b600061409c8261422e565b91506140a78361422e565b9250826140b7576140b66143b0565b5b828204905092915050565b60006140cd8261422e565b91506140d88361422e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411157614110614381565b5b828202905092915050565b6000614127826141f2565b9150614132836141f2565b92508282101561414557614144614381565b5b828203905092915050565b600061415b8261422e565b91506141668361422e565b92508282101561417957614178614381565b5b828203905092915050565b600061418f8261420e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006141d982614184565b9050919050565b60006141eb82614184565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561426557808201518184015260208101905061424a565b83811115614274576000848401525b50505050565b60006142858261422e565b9150600082141561429957614298614381565b5b600182039050919050565b600060028204905060018216806142bc57607f821691505b602082108114156142d0576142cf6143df565b5b50919050565b6142df82614480565b810181811067ffffffffffffffff821117156142fe576142fd61443d565b5b80604052505050565b60006143128261422e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561434557614344614381565b5b600182019050919050565b600061435b8261422e565b91506143668361422e565b925082614376576143756143b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614b7081614184565b8114614b7b57600080fd5b50565b614b8781614196565b8114614b9257600080fd5b50565b614b9e816141a2565b8114614ba957600080fd5b50565b614bb5816141ce565b8114614bc057600080fd5b50565b614bcc816141e0565b8114614bd757600080fd5b50565b614be38161422e565b8114614bee57600080fd5b5056fea2646970667358221220c6011b967e2d9e140c76ea935fdba4a07f4fc9a2df36f07efba2ba977ad258a264736f6c63430008070033697066733a2f2f516d53614b433745746861336543755a576f736a7273384671457867536a4a547a435535354d4c67537434425842
Deployed Bytecode
0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610725578063d7224ba014610750578063e43082f71461077b578063e985e9c5146107a4578063f2fde38b146107e1576101f9565b8063a22cb4651461066b578063b88d4fde14610694578063c6a91b42146106bd578063c87b56dd146106e8576101f9565b80638da5cb5b116100dc5780638da5cb5b146105ce57806395d89b41146105f9578063982d669e14610624578063a0712d681461064f576101f9565b806370a0823114610524578063714c539814610561578063715018a61461058c5780638d859f3e146105a3576101f9565b806328cad13d1161019057806342842e0e1161015f57806342842e0e1461042f57806349df728c146104585780634f6ccce71461048157806355f804b3146104be5780636352211e146104e7576101f9565b806328cad13d146103745780632a55205a1461039d5780632f745c59146103db5780633ccfd60b14610418576101f9565b80630a00ae83116101cc5780630a00ae83146102cc57806318160ddd146102f55780631e84c4131461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061346b565b61080a565b6040516102329190613b9e565b60405180910390f35b34801561024757600080fd5b50610250610884565b60405161025d9190613bb9565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613568565b610916565b60405161029a9190613b0e565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133d1565b61099b565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613568565b610ab4565b005b34801561030157600080fd5b5061030a610b3a565b6040516103179190613efb565b60405180910390f35b34801561032c57600080fd5b50610335610b43565b6040516103429190613b9e565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906132bb565b610b56565b005b34801561038057600080fd5b5061039b60048036038101906103969190613411565b610b66565b005b3480156103a957600080fd5b506103c460048036038101906103bf91906135c2565b610bff565b6040516103d2929190613b75565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906133d1565b610c6b565b60405161040f9190613efb565b60405180910390f35b34801561042457600080fd5b5061042d610e69565b005b34801561043b57600080fd5b50610456600480360381019061045191906132bb565b610f34565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134c5565b610f54565b005b34801561048d57600080fd5b506104a860048036038101906104a39190613568565b6110ef565b6040516104b59190613efb565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061351f565b611142565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613568565b6111d8565b60405161051b9190613b0e565b60405180910390f35b34801561053057600080fd5b5061054b6004803603810190610546919061324e565b6111ee565b6040516105589190613efb565b60405180910390f35b34801561056d57600080fd5b506105766112d7565b6040516105839190613bb9565b60405180910390f35b34801561059857600080fd5b506105a1611369565b005b3480156105af57600080fd5b506105b86113f1565b6040516105c59190613efb565b60405180910390f35b3480156105da57600080fd5b506105e36113fc565b6040516105f09190613b0e565b60405180910390f35b34801561060557600080fd5b5061060e611426565b60405161061b9190613bb9565b60405180910390f35b34801561063057600080fd5b506106396114b8565b6040516106469190613efb565b60405180910390f35b61066960048036038101906106649190613568565b6114be565b005b34801561067757600080fd5b50610692600480360381019061068d9190613391565b6116e2565b005b3480156106a057600080fd5b506106bb60048036038101906106b6919061330e565b611863565b005b3480156106c957600080fd5b506106d26118bf565b6040516106df9190613efb565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613568565b6118c4565b60405161071c9190613bb9565b60405180910390f35b34801561073157600080fd5b5061073a61194c565b6040516107479190613efb565b60405180910390f35b34801561075c57600080fd5b50610765611952565b6040516107729190613efb565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613411565b611958565b005b3480156107b057600080fd5b506107cb60048036038101906107c6919061327b565b6119f1565b6040516107d89190613b9e565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061324e565b611b0b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611c03565b5b9050919050565b606060018054610893906142a4565b80601f01602080910402602001604051908101604052809291908181526020018280546108bf906142a4565b801561090c5780601f106108e15761010080835404028352916020019161090c565b820191906000526020600020905b8154815290600101906020018083116108ef57829003601f168201915b5050505050905090565b600061092182611d4d565b610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613ebb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a6826111d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e90613d9b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a36611d5a565b73ffffffffffffffffffffffffffffffffffffffff161480610a655750610a6481610a5f611d5a565b6119f1565b5b610aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9b90613cdb565b60405180910390fd5b610aaf838383611d62565b505050565b610abc611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610ada6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613d3b565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610b61838383611e14565b505050565b610b6e611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610b8c6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613d3b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610c0b84611d4d565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190613cbb565b60405180910390fd5b30610c60610c598560056123cd565b60646123e3565b915091509250929050565b6000610c76836111ee565b8210610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613bdb565b60405180910390fd5b6000610cc1610b3a565b905060008060005b83811015610e27576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dbb57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e135786841415610e04578195505050505050610e63565b8380610e0f90614307565b9450505b508080610e1f90614307565b915050610cc9565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613e3b565b60405180910390fd5b92915050565b610e71611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610e8f6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90613d3b565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f30573d6000803e3d6000fd5b5050565b610f4f83838360405180602001604052806000815250611863565b505050565b610f5c611d5a565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6113fc565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790613d3b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161100b9190613b0e565b60206040518083038186803b15801561102357600080fd5b505afa158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b9190613595565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611098929190613b75565b602060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea919061343e565b505050565b60006110f9610b3a565b821061113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613c3b565b60405180910390fd5b819050919050565b61114a611d5a565b73ffffffffffffffffffffffffffffffffffffffff166111686113fc565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613d3b565b60405180910390fd5b80600b90805190602001906111d4929190612fd4565b5050565b60006111e3826123f9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613cfb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112e6906142a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611312906142a4565b801561135f5780601f106113345761010080835404028352916020019161135f565b820191906000526020600020905b81548152906001019060200180831161134257829003601f168201915b5050505050905090565b611371611d5a565b73ffffffffffffffffffffffffffffffffffffffff1661138f6113fc565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90613d3b565b60405180910390fd5b6113ef60006125fc565b565b662386f26fc1000081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611435906142a4565b80601f0160208091040260200160405190810160405280929190818152602001828054611461906142a4565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b5050505050905090565b600f5481565b60026009541415611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90613e5b565b60405180910390fd5b6002600981905550662386f26fc1000081600f54611520610b3a565b11156115745734818361153391906140c2565b14611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90613e1b565b60405180910390fd5b5b601060009054906101000a900460ff166115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613e9b565b60405180910390fd5b82600d54816115d0610b3a565b6115da919061403b565b111561161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290613c5b565b60405180910390fd5b83600a811115611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790613c9b565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156116c8573d6000803e3d6000fd5b506116d333866126c2565b50505050600160098190555050565b6116ea611d5a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f90613d5b565b60405180910390fd5b8060066000611765611d5a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611812611d5a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118579190613b9e565b60405180910390a35050565b61186e848484611e14565b61187a848484846126e0565b6118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090613dbb565b60405180910390fd5b50505050565b600a81565b60606118cf82611d4d565b61190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590613cbb565b60405180910390fd5b600b611925600184611920919061403b565b612877565b604051602001611936929190613adf565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611960611d5a565b73ffffffffffffffffffffffffffffffffffffffff1661197e6113fc565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb90613d3b565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611ae857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a809190613b0e565b60206040518083038186803b158015611a9857600080fd5b505afa158015611aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad091906134f2565b73ffffffffffffffffffffffffffffffffffffffff16145b15611af7576001915050611b05565b611b0184846129d8565b9150505b92915050565b611b13611d5a565b73ffffffffffffffffffffffffffffffffffffffff16611b316113fc565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613d3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613bfb565b60405180910390fd5b611c00816125fc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cce57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d465750611d4582612a6c565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e1f826123f9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e46611d5a565b73ffffffffffffffffffffffffffffffffffffffff161480611ea25750611e6b611d5a565b73ffffffffffffffffffffffffffffffffffffffff16611e8a84610916565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ebe5750611ebd8260000151611eb8611d5a565b6119f1565b5b905080611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790613d7b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6990613d1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613c7b565b60405180910390fd5b611fef8585856001612ad6565b611fff6000848460000151611d62565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661206d919061411c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121119190613ff5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612217919061403b565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561235d5761228d81611d4d565b1561235c576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123c58686866001612adc565b505050505050565b600081836123db91906140c2565b905092915050565b600081836123f19190614091565b905092915050565b61240161305a565b61240a82611d4d565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613c1b565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106124ad5760017f0000000000000000000000000000000000000000000000000000000000000064846124a09190614150565b6124aa919061403b565b90505b60008390505b8181106125bb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a7578093505050506125f7565b5080806125b39061427a565b9150506124b3565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613e7b565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126dc828260405180602001604052806000815250612ae2565b5050565b60006127018473ffffffffffffffffffffffffffffffffffffffff16612fc1565b1561286a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261272a611d5a565b8786866040518563ffffffff1660e01b815260040161274c9493929190613b29565b602060405180830381600087803b15801561276657600080fd5b505af192505050801561279757506040513d601f19601f820116820180604052508101906127949190613498565b60015b61281a573d80600081146127c7576040519150601f19603f3d011682016040523d82523d6000602084013e6127cc565b606091505b50600081511415612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990613dbb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286f565b600190505b949350505050565b606060008214156128bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129d3565b600082905060005b600082146128f15780806128da90614307565b915050600a826128ea9190614091565b91506128c7565b60008167ffffffffffffffff81111561290d5761290c61443d565b5b6040519080825280601f01601f19166020018201604052801561293f5781602001600182028036833780820191505090505b5090505b600085146129cc576001826129589190614150565b9150600a856129679190614350565b6030612973919061403b565b60f81b8183815181106129895761298861440e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129c59190614091565b9450612943565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90613dfb565b60405180910390fd5b612b6181611d4d565b15612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890613ddb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90613edb565b60405180910390fd5b612c116000858386612ad6565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d0e9190613ff5565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d359190613ff5565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fa457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f4460008884886126e0565b612f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7a90613dbb565b60405180910390fd5b8180612f8e90614307565b9250508080612f9c90614307565b915050612ed3565b5080600081905550612fb96000878588612adc565b505050505050565b600080823b905060008111915050919050565b828054612fe0906142a4565b90600052602060002090601f0160209004810192826130025760008555613049565b82601f1061301b57805160ff1916838001178555613049565b82800160010185558215613049579182015b8281111561304857825182559160200191906001019061302d565b5b5090506130569190613094565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156130ad576000816000905550600101613095565b5090565b60006130c46130bf84613f3b565b613f16565b9050828152602081018484840111156130e0576130df614471565b5b6130eb848285614238565b509392505050565b600061310661310184613f6c565b613f16565b90508281526020810184848401111561312257613121614471565b5b61312d848285614238565b509392505050565b60008135905061314481614b67565b92915050565b60008135905061315981614b7e565b92915050565b60008151905061316e81614b7e565b92915050565b60008135905061318381614b95565b92915050565b60008151905061319881614b95565b92915050565b600082601f8301126131b3576131b261446c565b5b81356131c38482602086016130b1565b91505092915050565b6000813590506131db81614bac565b92915050565b6000815190506131f081614bc3565b92915050565b600082601f83011261320b5761320a61446c565b5b813561321b8482602086016130f3565b91505092915050565b60008135905061323381614bda565b92915050565b60008151905061324881614bda565b92915050565b6000602082840312156132645761326361447b565b5b600061327284828501613135565b91505092915050565b600080604083850312156132925761329161447b565b5b60006132a085828601613135565b92505060206132b185828601613135565b9150509250929050565b6000806000606084860312156132d4576132d361447b565b5b60006132e286828701613135565b93505060206132f386828701613135565b925050604061330486828701613224565b9150509250925092565b600080600080608085870312156133285761332761447b565b5b600061333687828801613135565b945050602061334787828801613135565b935050604061335887828801613224565b925050606085013567ffffffffffffffff81111561337957613378614476565b5b6133858782880161319e565b91505092959194509250565b600080604083850312156133a8576133a761447b565b5b60006133b685828601613135565b92505060206133c78582860161314a565b9150509250929050565b600080604083850312156133e8576133e761447b565b5b60006133f685828601613135565b925050602061340785828601613224565b9150509250929050565b6000602082840312156134275761342661447b565b5b60006134358482850161314a565b91505092915050565b6000602082840312156134545761345361447b565b5b60006134628482850161315f565b91505092915050565b6000602082840312156134815761348061447b565b5b600061348f84828501613174565b91505092915050565b6000602082840312156134ae576134ad61447b565b5b60006134bc84828501613189565b91505092915050565b6000602082840312156134db576134da61447b565b5b60006134e9848285016131cc565b91505092915050565b6000602082840312156135085761350761447b565b5b6000613516848285016131e1565b91505092915050565b6000602082840312156135355761353461447b565b5b600082013567ffffffffffffffff81111561355357613552614476565b5b61355f848285016131f6565b91505092915050565b60006020828403121561357e5761357d61447b565b5b600061358c84828501613224565b91505092915050565b6000602082840312156135ab576135aa61447b565b5b60006135b984828501613239565b91505092915050565b600080604083850312156135d9576135d861447b565b5b60006135e785828601613224565b92505060206135f885828601613224565b9150509250929050565b61360b81614184565b82525050565b61361a81614196565b82525050565b600061362b82613fb2565b6136358185613fc8565b9350613645818560208601614247565b61364e81614480565b840191505092915050565b600061366482613fbd565b61366e8185613fd9565b935061367e818560208601614247565b61368781614480565b840191505092915050565b600061369d82613fbd565b6136a78185613fea565b93506136b7818560208601614247565b80840191505092915050565b600081546136d0816142a4565b6136da8186613fea565b945060018216600081146136f5576001811461370657613739565b60ff19831686528186019350613739565b61370f85613f9d565b60005b8381101561373157815481890152600182019150602081019050613712565b838801955050505b50505092915050565b600061374f602283613fd9565b915061375a82614491565b604082019050919050565b6000613772602683613fd9565b915061377d826144e0565b604082019050919050565b6000613795602a83613fd9565b91506137a08261452f565b604082019050919050565b60006137b8602383613fd9565b91506137c38261457e565b604082019050919050565b60006137db602283613fd9565b91506137e6826145cd565b604082019050919050565b60006137fe602583613fd9565b91506138098261461c565b604082019050919050565b6000613821602283613fd9565b915061382c8261466b565b604082019050919050565b6000613844601183613fd9565b915061384f826146ba565b602082019050919050565b6000613867603983613fd9565b9150613872826146e3565b604082019050919050565b600061388a602b83613fd9565b915061389582614732565b604082019050919050565b60006138ad602683613fd9565b91506138b882614781565b604082019050919050565b60006138d0602083613fd9565b91506138db826147d0565b602082019050919050565b60006138f3601a83613fd9565b91506138fe826147f9565b602082019050919050565b6000613916603283613fd9565b915061392182614822565b604082019050919050565b6000613939602283613fd9565b915061394482614871565b604082019050919050565b600061395c603383613fd9565b9150613967826148c0565b604082019050919050565b600061397f601d83613fd9565b915061398a8261490f565b602082019050919050565b60006139a2602183613fd9565b91506139ad82614938565b604082019050919050565b60006139c5601883613fd9565b91506139d082614987565b602082019050919050565b60006139e8602e83613fd9565b91506139f3826149b0565b604082019050919050565b6000613a0b601f83613fd9565b9150613a16826149ff565b602082019050919050565b6000613a2e602f83613fd9565b9150613a3982614a28565b604082019050919050565b6000613a51601783613fd9565b9150613a5c82614a77565b602082019050919050565b6000613a74602d83613fd9565b9150613a7f82614aa0565b604082019050919050565b6000613a97602283613fd9565b9150613aa282614aef565b604082019050919050565b6000613aba600183613fea565b9150613ac582614b3e565b600182019050919050565b613ad98161422e565b82525050565b6000613aeb82856136c3565b9150613af682613aad565b9150613b028284613692565b91508190509392505050565b6000602082019050613b236000830184613602565b92915050565b6000608082019050613b3e6000830187613602565b613b4b6020830186613602565b613b586040830185613ad0565b8181036060830152613b6a8184613620565b905095945050505050565b6000604082019050613b8a6000830185613602565b613b976020830184613ad0565b9392505050565b6000602082019050613bb36000830184613611565b92915050565b60006020820190508181036000830152613bd38184613659565b905092915050565b60006020820190508181036000830152613bf481613742565b9050919050565b60006020820190508181036000830152613c1481613765565b9050919050565b60006020820190508181036000830152613c3481613788565b9050919050565b60006020820190508181036000830152613c54816137ab565b9050919050565b60006020820190508181036000830152613c74816137ce565b9050919050565b60006020820190508181036000830152613c94816137f1565b9050919050565b60006020820190508181036000830152613cb481613814565b9050919050565b60006020820190508181036000830152613cd481613837565b9050919050565b60006020820190508181036000830152613cf48161385a565b9050919050565b60006020820190508181036000830152613d148161387d565b9050919050565b60006020820190508181036000830152613d34816138a0565b9050919050565b60006020820190508181036000830152613d54816138c3565b9050919050565b60006020820190508181036000830152613d74816138e6565b9050919050565b60006020820190508181036000830152613d9481613909565b9050919050565b60006020820190508181036000830152613db48161392c565b9050919050565b60006020820190508181036000830152613dd48161394f565b9050919050565b60006020820190508181036000830152613df481613972565b9050919050565b60006020820190508181036000830152613e1481613995565b9050919050565b60006020820190508181036000830152613e34816139b8565b9050919050565b60006020820190508181036000830152613e54816139db565b9050919050565b60006020820190508181036000830152613e74816139fe565b9050919050565b60006020820190508181036000830152613e9481613a21565b9050919050565b60006020820190508181036000830152613eb481613a44565b9050919050565b60006020820190508181036000830152613ed481613a67565b9050919050565b60006020820190508181036000830152613ef481613a8a565b9050919050565b6000602082019050613f106000830184613ad0565b92915050565b6000613f20613f31565b9050613f2c82826142d6565b919050565b6000604051905090565b600067ffffffffffffffff821115613f5657613f5561443d565b5b613f5f82614480565b9050602081019050919050565b600067ffffffffffffffff821115613f8757613f8661443d565b5b613f9082614480565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614000826141f2565b915061400b836141f2565b9250826fffffffffffffffffffffffffffffffff038211156140305761402f614381565b5b828201905092915050565b60006140468261422e565b91506140518361422e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408657614085614381565b5b828201905092915050565b600061409c8261422e565b91506140a78361422e565b9250826140b7576140b66143b0565b5b828204905092915050565b60006140cd8261422e565b91506140d88361422e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411157614110614381565b5b828202905092915050565b6000614127826141f2565b9150614132836141f2565b92508282101561414557614144614381565b5b828203905092915050565b600061415b8261422e565b91506141668361422e565b92508282101561417957614178614381565b5b828203905092915050565b600061418f8261420e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006141d982614184565b9050919050565b60006141eb82614184565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561426557808201518184015260208101905061424a565b83811115614274576000848401525b50505050565b60006142858261422e565b9150600082141561429957614298614381565b5b600182039050919050565b600060028204905060018216806142bc57607f821691505b602082108114156142d0576142cf6143df565b5b50919050565b6142df82614480565b810181811067ffffffffffffffff821117156142fe576142fd61443d565b5b80604052505050565b60006143128261422e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561434557614344614381565b5b600182019050919050565b600061435b8261422e565b91506143668361422e565b925082614376576143756143b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614b7081614184565b8114614b7b57600080fd5b50565b614b8781614196565b8114614b9257600080fd5b50565b614b9e816141a2565b8114614ba957600080fd5b50565b614bb5816141ce565b8114614bc057600080fd5b50565b614bcc816141e0565b8114614bd757600080fd5b50565b614be38161422e565b8114614bee57600080fd5b5056fea2646970667358221220c6011b967e2d9e140c76ea935fdba4a07f4fc9a2df36f07efba2ba977ad258a264736f6c63430008070033
Deployed Bytecode Sourcemap
57925:5776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61910:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45774:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47469:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46990:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61207:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42169:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58628:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48496:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61041:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63380:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61331:143;;;;;;;;;;;;;:::i;:::-;;48729:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61482:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42346:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60643:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45583:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44299:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60479:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19355:103;;;;;;;;;;;;;:::i;:::-;;58538:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18704:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45943:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58587:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59915:373;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47833:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48977:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58364:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63027:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58416:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53858:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60867:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62339:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19613:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61910:292;62058:4;62115:26;62100:41;;;:11;:41;;;;:94;;;;62158:36;62182:11;62158:23;:36::i;:::-;62100:94;62080:114;;61910:292;;;:::o;45774:100::-;45828:13;45861:5;45854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45774:100;:::o;47469:292::-;47573:7;47620:16;47628:7;47620;:16::i;:::-;47598:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47729:15;:24;47745:7;47729:24;;;;;;;;;;;;;;;;;;;;;47722:31;;47469:292;;;:::o;46990:413::-;47063:13;47079:24;47095:7;47079:15;:24::i;:::-;47063:40;;47128:5;47122:11;;:2;:11;;;;47114:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47223:5;47207:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47232:37;47249:5;47256:12;:10;:12::i;:::-;47232:16;:37::i;:::-;47207:62;47185:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;47367:28;47376:2;47380:7;47389:5;47367:8;:28::i;:::-;47052:351;46990:413;;:::o;61207:116::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61302:13:::1;61285:14;:30;;;;61207:116:::0;:::o;42169:100::-;42222:7;42249:12;;42242:19;;42169:100;:::o;58628:37::-;;;;;;;;;;;;;:::o;48496:162::-;48622:28;48632:4;48638:2;48642:7;48622:9;:28::i;:::-;48496:162;;;:::o;61041:158::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61172:19:::1;61151:18;;:40;;;;;;;;;;;;;;;;;;61041:158:::0;:::o;63380:318::-;63505:16;63523:21;63570:16;63578:7;63570;:16::i;:::-;63562:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63637:4;63644:45;63657:26;63670:9;63681:1;63657:12;:26::i;:::-;63685:3;63644:12;:45::i;:::-;63621:69;;;;63380:318;;;;;:::o;42877:864::-;43002:7;43043:16;43053:5;43043:9;:16::i;:::-;43035:5;:24;43027:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43109:22;43134:13;:11;:13::i;:::-;43109:38;;43158:19;43192:25;43246:9;43241:426;43265:14;43261:1;:18;43241:426;;;43301:31;43335:11;:14;43347:1;43335:14;;;;;;;;;;;43301:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43394:1;43368:28;;:9;:14;;;:28;;;43364:103;;43437:9;:14;;;43417:34;;43364:103;43506:5;43485:26;;:17;:26;;;43481:175;;;43551:5;43536:11;:20;43532:77;;;43588:1;43581:8;;;;;;;;;43532:77;43627:13;;;;;:::i;:::-;;;;43481:175;43286:381;43281:3;;;;;:::i;:::-;;;;43241:426;;;;43677:56;;;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;:::o;61331:143::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61379:15:::1;61397:21;61379:39;;61437:10;61429:28;;:37;61458:7;61429:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61368:106;61331:143::o:0;48729:177::-;48859:39;48876:4;48882:2;48886:7;48859:39;;;;;;;;;;;;:16;:39::i;:::-;48729:177;;;:::o;61482:168::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61548:15:::1;61566:5;:15;;;61590:4;61566:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61548:48;;61607:5;:14;;;61622:10;61634:7;61607:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61537:113;61482:168:::0;:::o;42346:228::-;42449:7;42490:13;:11;:13::i;:::-;42482:5;:21;42474:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42561:5;42554:12;;42346:228;;;:::o;60643:100::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60727:8:::1;60717:7;:18;;;;;;;;;;;;:::i;:::-;;60643:100:::0;:::o;45583:124::-;45647:7;45674:20;45686:7;45674:11;:20::i;:::-;:25;;;45667:32;;45583:124;;;:::o;44299:258::-;44363:7;44422:1;44405:19;;:5;:19;;;;44383:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44521:12;:19;44534:5;44521:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44513:36;;44506:43;;44299:258;;;:::o;60479:93::-;60524:13;60557:7;60550:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60479:93;:::o;19355:103::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19420:30:::1;19447:1;19420:18;:30::i;:::-;19355:103::o:0;58538:42::-;58570:10;58538:42;:::o;18704:87::-;18750:7;18777:6;;;;;;;;;;;18770:13;;18704:87;:::o;45943:104::-;45999:13;46032:7;46025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45943:104;:::o;58587:34::-;;;;:::o;59915:373::-;10511:1;11109:7;;:19;;11101:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10511:1;11242:7;:18;;;;58570:10:::1;60043:14;59552;;59536:13;:11;:13::i;:::-;:30;59532:186;;;59637:9;59618:14;59610:5;:22;;;;:::i;:::-;59609:37;59583:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59532:186;58789:18:::2;;;;;;;;;;;58781:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60106:14:::3;59179:9;;59161:14;59145:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59123:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;60145:14:::4;58407:2;58943:14;:34;;58921:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;60185:14:::5;;;;;;;;;;;60177:32;;:55;60210:21;60177:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::5;;;;;;60243:37;60253:10;60265:14;60243:9;:37::i;:::-;59261:1:::4;58846::::3;11273::::1;;10467::::0;11421:7;:22;;;;59915:373;:::o;47833:311::-;47963:12;:10;:12::i;:::-;47951:24;;:8;:24;;;;47943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48064:8;48019:18;:32;48038:12;:10;:12::i;:::-;48019:32;;;;;;;;;;;;;;;:42;48052:8;48019:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48117:8;48088:48;;48103:12;:10;:12::i;:::-;48088:48;;;48127:8;48088:48;;;;;;:::i;:::-;;;;;;;;47833:311;;:::o;48977:355::-;49136:28;49146:4;49152:2;49156:7;49136:9;:28::i;:::-;49197:48;49220:4;49226:2;49230:7;49239:5;49197:22;:48::i;:::-;49175:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;48977:355;;;;:::o;58364:45::-;58407:2;58364:45;:::o;63027:287::-;63145:13;63184:16;63192:7;63184;:16::i;:::-;63176:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63266:7;63280:24;63291:1;63281:7;:11;;;;:::i;:::-;63280:22;:24::i;:::-;63249:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63235:71;;63027:287;;;:::o;58416:31::-;;;;:::o;53858:43::-;;;;:::o;60867:166::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61004:21:::1;60981:20;;:44;;;;;;;;;;;;;;;;;;60867:166:::0;:::o;62339:617::-;62464:4;62629:27;62687;;;;;;;;;;;62629:96;;62754:20;;;;;;;;;;;:86;;;;;62832:8;62791:49;;62799:13;:21;;;62821:5;62799:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62791:49;;;62754:86;62736:154;;;62874:4;62867:11;;;;;62736:154;62909:39;62932:5;62939:8;62909:22;:39::i;:::-;62902:46;;;62339:617;;;;;:::o;19613:238::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19736:1:::1;19716:22;;:8;:22;;;;19694:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19815:28;19834:8;19815:18;:28::i;:::-;19613:238:::0;:::o;43813:422::-;43960:4;44017:25;44002:40;;;:11;:40;;;;:105;;;;44074:33;44059:48;;;:11;:48;;;;44002:105;:172;;;;44139:35;44124:50;;;:11;:50;;;;44002:172;:225;;;;44191:36;44215:11;44191:23;:36::i;:::-;44002:225;43982:245;;43813:422;;;:::o;49587:111::-;49644:4;49678:12;;49668:7;:22;49661:29;;49587:111;;;:::o;17407:98::-;17460:7;17487:10;17480:17;;17407:98;:::o;53654:196::-;53796:2;53769:15;:24;53785:7;53769:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53834:7;53830:2;53814:28;;53823:5;53814:28;;;;;;;;;;;;53654:196;;;:::o;51827:1709::-;51942:35;51980:20;51992:7;51980:11;:20::i;:::-;51942:58;;52013:22;52055:13;:18;;;52039:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52114:12;:10;:12::i;:::-;52090:36;;:20;52102:7;52090:11;:20::i;:::-;:36;;;52039:87;:154;;;;52143:50;52160:13;:18;;;52180:12;:10;:12::i;:::-;52143:16;:50::i;:::-;52039:154;52013:181;;52229:17;52207:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;52381:4;52359:26;;:13;:18;;;:26;;;52337:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:1;52470:16;;:2;:16;;;;52462:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52541:43;52563:4;52569:2;52573:7;52582:1;52541:21;:43::i;:::-;52649:49;52666:1;52670:7;52679:13;:18;;;52649:8;:49::i;:::-;52741:1;52711:12;:18;52724:4;52711:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52781:1;52753:12;:16;52766:2;52753:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52816:43;;;;;;;;52831:2;52816:43;;;;;;52842:15;52816:43;;;;;52793:11;:20;52805:7;52793:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:19;53131:1;53121:7;:11;;;;:::i;:::-;53099:33;;53188:1;53147:43;;:11;:24;53159:11;53147:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;53143:288;;;53211:20;53219:11;53211:7;:20::i;:::-;53207:213;;;53279:125;;;;;;;;53316:13;:18;;;53279:125;;;;;;53357:13;:28;;;53279:125;;;;;53252:11;:24;53264:11;53252:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207:213;53143:288;53467:7;53463:2;53448:27;;53457:4;53448:27;;;;;;;;;;;;53486:42;53507:4;53513:2;53517:7;53526:1;53486:20;:42::i;:::-;51931:1605;;;51827:1709;;;:::o;3811:98::-;3869:7;3900:1;3896;:5;;;;:::i;:::-;3889:12;;3811:98;;;;:::o;4210:::-;4268:7;4299:1;4295;:5;;;;:::i;:::-;4288:12;;4210:98;;;;:::o;44839:682::-;44927:21;;:::i;:::-;44974:16;44982:7;44974;:16::i;:::-;44966:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45050:26;45102:12;45091:7;:23;45087:103;;45177:1;45162:12;45152:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;45131:47;;45087:103;45207:12;45222:7;45207:22;;45202:242;45239:18;45231:4;:26;45202:242;;45282:31;45316:11;:17;45328:4;45316:17;;;;;;;;;;;45282:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:1;45352:28;;:9;:14;;;:28;;;45348:85;;45408:9;45401:16;;;;;;;45348:85;45267:177;45259:6;;;;;:::i;:::-;;;;45202:242;;;;45456:57;;;;;;;;;;:::i;:::-;;;;;;;;44839:682;;;;:::o;20011:191::-;20085:16;20104:6;;;;;;;;;;;20085:25;;20130:8;20121:6;;:17;;;;;;;;;;;;;;;;;;20185:8;20154:40;;20175:8;20154:40;;;;;;;;;;;;20074:128;20011:191;:::o;49706:104::-;49775:27;49785:2;49789:8;49775:27;;;;;;;;;;;;:9;:27::i;:::-;49706:104;;:::o;55529:985::-;55684:4;55705:15;:2;:13;;;:15::i;:::-;55701:806;;;55774:2;55758:36;;;55817:12;:10;:12::i;:::-;55852:4;55879:7;55909:5;55758:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55737:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56137:1;56120:6;:13;:18;56116:321;;;56163:109;;;;;;;;;;:::i;:::-;;;;;;;;56116:321;56387:6;56381:13;56372:6;56368:2;56364:15;56357:38;55737:715;56007:45;;;55997:55;;;:6;:55;;;;55990:62;;;;;55701:806;56491:4;56484:11;;55529:985;;;;;;;:::o;14939:723::-;14995:13;15225:1;15216:5;:10;15212:53;;;15243:10;;;;;;;;;;;;;;;;;;;;;15212:53;15275:12;15290:5;15275:20;;15306:14;15331:78;15346:1;15338:4;:9;15331:78;;15364:8;;;;;:::i;:::-;;;;15395:2;15387:10;;;;;:::i;:::-;;;15331:78;;;15419:19;15451:6;15441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15419:39;;15469:154;15485:1;15476:5;:10;15469:154;;15513:1;15503:11;;;;;:::i;:::-;;;15580:2;15572:5;:10;;;;:::i;:::-;15559:2;:24;;;;:::i;:::-;15546:39;;15529:6;15536;15529:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15609:2;15600:11;;;;;:::i;:::-;;;15469:154;;;15647:6;15633:21;;;;;14939:723;;;;:::o;48215:214::-;48357:4;48386:18;:25;48405:5;48386:25;;;;;;;;;;;;;;;:35;48412:8;48386:35;;;;;;;;;;;;;;;;;;;;;;;;;48379:42;;48215:214;;;;:::o;32590:207::-;32720:4;32764:25;32749:40;;;:11;:40;;;;32742:47;;32590:207;;;:::o;57002:159::-;;;;;:::o;57573:158::-;;;;;:::o;50173:1400::-;50296:20;50319:12;;50296:35;;50364:1;50350:16;;:2;:16;;;;50342:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50549:21;50557:12;50549:7;:21::i;:::-;50548:22;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:12;50623:8;:24;;50615:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50699:61;50729:1;50733:2;50737:12;50751:8;50699:21;:61::i;:::-;50773:30;50806:12;:16;50819:2;50806:16;;;;;;;;;;;;;;;50773:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50852:135;;;;;;;;50908:8;50878:11;:19;;;:39;;;;:::i;:::-;50852:135;;;;;;50967:8;50932:11;:24;;;:44;;;;:::i;:::-;50852:135;;;;;50833:12;:16;50846:2;50833:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51026:43;;;;;;;;51041:2;51026:43;;;;;;51052:15;51026:43;;;;;50998:11;:25;51010:12;50998:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51082:20;51105:12;51082:35;;51135:9;51130:325;51154:8;51150:1;:12;51130:325;;;51214:12;51210:2;51189:38;;51206:1;51189:38;;;;;;;;;;;;51268:59;51299:1;51303:2;51307:12;51321:5;51268:22;:59::i;:::-;51242:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;51429:14;;;;;:::i;:::-;;;;51164:3;;;;;:::i;:::-;;;;51130:325;;;;51482:12;51467;:27;;;;51505:60;51534:1;51538:2;51542:12;51556:8;51505:20;:60::i;:::-;50285:1288;;;50173:1400;;;:::o;21027:387::-;21087:4;21295:12;21362:7;21350:20;21342:28;;21405:1;21398:4;:8;21391:15;;;21027:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1915:167::-;1975:5;2013:6;2000:20;1991:29;;2029:47;2070:5;2029:47;:::i;:::-;1915:167;;;;:::o;2088:201::-;2174:5;2205:6;2199:13;2190:22;;2221:62;2277:5;2221:62;:::i;:::-;2088:201;;;;:::o;2309:340::-;2365:5;2414:3;2407:4;2399:6;2395:17;2391:27;2381:122;;2422:79;;:::i;:::-;2381:122;2539:6;2526:20;2564:79;2639:3;2631:6;2624:4;2616:6;2612:17;2564:79;:::i;:::-;2555:88;;2371:278;2309:340;;;;:::o;2655:139::-;2701:5;2739:6;2726:20;2717:29;;2755:33;2782:5;2755:33;:::i;:::-;2655:139;;;;:::o;2800:143::-;2857:5;2888:6;2882:13;2873:22;;2904:33;2931:5;2904:33;:::i;:::-;2800:143;;;;:::o;2949:329::-;3008:6;3057:2;3045:9;3036:7;3032:23;3028:32;3025:119;;;3063:79;;:::i;:::-;3025:119;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;2949:329;;;;:::o;3284:474::-;3352:6;3360;3409:2;3397:9;3388:7;3384:23;3380:32;3377:119;;;3415:79;;:::i;:::-;3377:119;3535:1;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3506:117;3662:2;3688:53;3733:7;3724:6;3713:9;3709:22;3688:53;:::i;:::-;3678:63;;3633:118;3284:474;;;;;:::o;3764:619::-;3841:6;3849;3857;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;4159:2;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4130:118;4287:2;4313:53;4358:7;4349:6;4338:9;4334:22;4313:53;:::i;:::-;4303:63;;4258:118;3764:619;;;;;:::o;4389:943::-;4484:6;4492;4500;4508;4557:3;4545:9;4536:7;4532:23;4528:33;4525:120;;;4564:79;;:::i;:::-;4525:120;4684:1;4709:53;4754:7;4745:6;4734:9;4730:22;4709:53;:::i;:::-;4699:63;;4655:117;4811:2;4837:53;4882:7;4873:6;4862:9;4858:22;4837:53;:::i;:::-;4827:63;;4782:118;4939:2;4965:53;5010:7;5001:6;4990:9;4986:22;4965:53;:::i;:::-;4955:63;;4910:118;5095:2;5084:9;5080:18;5067:32;5126:18;5118:6;5115:30;5112:117;;;5148:79;;:::i;:::-;5112:117;5253:62;5307:7;5298:6;5287:9;5283:22;5253:62;:::i;:::-;5243:72;;5038:287;4389:943;;;;;;;:::o;5338:468::-;5403:6;5411;5460:2;5448:9;5439:7;5435:23;5431:32;5428:119;;;5466:79;;:::i;:::-;5428:119;5586:1;5611:53;5656:7;5647:6;5636:9;5632:22;5611:53;:::i;:::-;5601:63;;5557:117;5713:2;5739:50;5781:7;5772:6;5761:9;5757:22;5739:50;:::i;:::-;5729:60;;5684:115;5338:468;;;;;:::o;5812:474::-;5880:6;5888;5937:2;5925:9;5916:7;5912:23;5908:32;5905:119;;;5943:79;;:::i;:::-;5905:119;6063:1;6088:53;6133:7;6124:6;6113:9;6109:22;6088:53;:::i;:::-;6078:63;;6034:117;6190:2;6216:53;6261:7;6252:6;6241:9;6237:22;6216:53;:::i;:::-;6206:63;;6161:118;5812:474;;;;;:::o;6292:323::-;6348:6;6397:2;6385:9;6376:7;6372:23;6368:32;6365:119;;;6403:79;;:::i;:::-;6365:119;6523:1;6548:50;6590:7;6581:6;6570:9;6566:22;6548:50;:::i;:::-;6538:60;;6494:114;6292:323;;;;:::o;6621:345::-;6688:6;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6863:1;6888:61;6941:7;6932:6;6921:9;6917:22;6888:61;:::i;:::-;6878:71;;6834:125;6621:345;;;;:::o;6972:327::-;7030:6;7079:2;7067:9;7058:7;7054:23;7050:32;7047:119;;;7085:79;;:::i;:::-;7047:119;7205:1;7230:52;7274:7;7265:6;7254:9;7250:22;7230:52;:::i;:::-;7220:62;;7176:116;6972:327;;;;:::o;7305:349::-;7374:6;7423:2;7411:9;7402:7;7398:23;7394:32;7391:119;;;7429:79;;:::i;:::-;7391:119;7549:1;7574:63;7629:7;7620:6;7609:9;7605:22;7574:63;:::i;:::-;7564:73;;7520:127;7305:349;;;;:::o;7660:357::-;7733:6;7782:2;7770:9;7761:7;7757:23;7753:32;7750:119;;;7788:79;;:::i;:::-;7750:119;7908:1;7933:67;7992:7;7983:6;7972:9;7968:22;7933:67;:::i;:::-;7923:77;;7879:131;7660:357;;;;:::o;8023:409::-;8122:6;8171:2;8159:9;8150:7;8146:23;8142:32;8139:119;;;8177:79;;:::i;:::-;8139:119;8297:1;8322:93;8407:7;8398:6;8387:9;8383:22;8322:93;:::i;:::-;8312:103;;8268:157;8023:409;;;;:::o;8438:509::-;8507:6;8556:2;8544:9;8535:7;8531:23;8527:32;8524:119;;;8562:79;;:::i;:::-;8524:119;8710:1;8699:9;8695:17;8682:31;8740:18;8732:6;8729:30;8726:117;;;8762:79;;:::i;:::-;8726:117;8867:63;8922:7;8913:6;8902:9;8898:22;8867:63;:::i;:::-;8857:73;;8653:287;8438:509;;;;:::o;8953:329::-;9012:6;9061:2;9049:9;9040:7;9036:23;9032:32;9029:119;;;9067:79;;:::i;:::-;9029:119;9187:1;9212:53;9257:7;9248:6;9237:9;9233:22;9212:53;:::i;:::-;9202:63;;9158:117;8953:329;;;;:::o;9288:351::-;9358:6;9407:2;9395:9;9386:7;9382:23;9378:32;9375:119;;;9413:79;;:::i;:::-;9375:119;9533:1;9558:64;9614:7;9605:6;9594:9;9590:22;9558:64;:::i;:::-;9548:74;;9504:128;9288:351;;;;:::o;9645:474::-;9713:6;9721;9770:2;9758:9;9749:7;9745:23;9741:32;9738:119;;;9776:79;;:::i;:::-;9738:119;9896:1;9921:53;9966:7;9957:6;9946:9;9942:22;9921:53;:::i;:::-;9911:63;;9867:117;10023:2;10049:53;10094:7;10085:6;10074:9;10070:22;10049:53;:::i;:::-;10039:63;;9994:118;9645:474;;;;;:::o;10125:118::-;10212:24;10230:5;10212:24;:::i;:::-;10207:3;10200:37;10125:118;;:::o;10249:109::-;10330:21;10345:5;10330:21;:::i;:::-;10325:3;10318:34;10249:109;;:::o;10364:360::-;10450:3;10478:38;10510:5;10478:38;:::i;:::-;10532:70;10595:6;10590:3;10532:70;:::i;:::-;10525:77;;10611:52;10656:6;10651:3;10644:4;10637:5;10633:16;10611:52;:::i;:::-;10688:29;10710:6;10688:29;:::i;:::-;10683:3;10679:39;10672:46;;10454:270;10364:360;;;;:::o;10730:364::-;10818:3;10846:39;10879:5;10846:39;:::i;:::-;10901:71;10965:6;10960:3;10901:71;:::i;:::-;10894:78;;10981:52;11026:6;11021:3;11014:4;11007:5;11003:16;10981:52;:::i;:::-;11058:29;11080:6;11058:29;:::i;:::-;11053:3;11049:39;11042:46;;10822:272;10730:364;;;;:::o;11100:377::-;11206:3;11234:39;11267:5;11234:39;:::i;:::-;11289:89;11371:6;11366:3;11289:89;:::i;:::-;11282:96;;11387:52;11432:6;11427:3;11420:4;11413:5;11409:16;11387:52;:::i;:::-;11464:6;11459:3;11455:16;11448:23;;11210:267;11100:377;;;;:::o;11507:845::-;11610:3;11647:5;11641:12;11676:36;11702:9;11676:36;:::i;:::-;11728:89;11810:6;11805:3;11728:89;:::i;:::-;11721:96;;11848:1;11837:9;11833:17;11864:1;11859:137;;;;12010:1;12005:341;;;;11826:520;;11859:137;11943:4;11939:9;11928;11924:25;11919:3;11912:38;11979:6;11974:3;11970:16;11963:23;;11859:137;;12005:341;12072:38;12104:5;12072:38;:::i;:::-;12132:1;12146:154;12160:6;12157:1;12154:13;12146:154;;;12234:7;12228:14;12224:1;12219:3;12215:11;12208:35;12284:1;12275:7;12271:15;12260:26;;12182:4;12179:1;12175:12;12170:17;;12146:154;;;12329:6;12324:3;12320:16;12313:23;;12012:334;;11826:520;;11614:738;;11507:845;;;;:::o;12358:366::-;12500:3;12521:67;12585:2;12580:3;12521:67;:::i;:::-;12514:74;;12597:93;12686:3;12597:93;:::i;:::-;12715:2;12710:3;12706:12;12699:19;;12358:366;;;:::o;12730:::-;12872:3;12893:67;12957:2;12952:3;12893:67;:::i;:::-;12886:74;;12969:93;13058:3;12969:93;:::i;:::-;13087:2;13082:3;13078:12;13071:19;;12730:366;;;:::o;13102:::-;13244:3;13265:67;13329:2;13324:3;13265:67;:::i;:::-;13258:74;;13341:93;13430:3;13341:93;:::i;:::-;13459:2;13454:3;13450:12;13443:19;;13102:366;;;:::o;13474:::-;13616:3;13637:67;13701:2;13696:3;13637:67;:::i;:::-;13630:74;;13713:93;13802:3;13713:93;:::i;:::-;13831:2;13826:3;13822:12;13815:19;;13474:366;;;:::o;13846:::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:::-;15848:3;15869:67;15933:2;15928:3;15869:67;:::i;:::-;15862:74;;15945:93;16034:3;15945:93;:::i;:::-;16063:2;16058:3;16054:12;16047:19;;15706:366;;;:::o;16078:::-;16220:3;16241:67;16305:2;16300:3;16241:67;:::i;:::-;16234:74;;16317:93;16406:3;16317:93;:::i;:::-;16435:2;16430:3;16426:12;16419:19;;16078:366;;;:::o;16450:::-;16592:3;16613:67;16677:2;16672:3;16613:67;:::i;:::-;16606:74;;16689:93;16778:3;16689:93;:::i;:::-;16807:2;16802:3;16798:12;16791:19;;16450:366;;;:::o;16822:::-;16964:3;16985:67;17049:2;17044:3;16985:67;:::i;:::-;16978:74;;17061:93;17150:3;17061:93;:::i;:::-;17179:2;17174:3;17170:12;17163:19;;16822:366;;;:::o;17194:::-;17336:3;17357:67;17421:2;17416:3;17357:67;:::i;:::-;17350:74;;17433:93;17522:3;17433:93;:::i;:::-;17551:2;17546:3;17542:12;17535:19;;17194:366;;;:::o;17566:::-;17708:3;17729:67;17793:2;17788:3;17729:67;:::i;:::-;17722:74;;17805:93;17894:3;17805:93;:::i;:::-;17923:2;17918:3;17914:12;17907:19;;17566:366;;;:::o;17938:::-;18080:3;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18177:93;18266:3;18177:93;:::i;:::-;18295:2;18290:3;18286:12;18279:19;;17938:366;;;:::o;18310:::-;18452:3;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18549:93;18638:3;18549:93;:::i;:::-;18667:2;18662:3;18658:12;18651:19;;18310:366;;;:::o;18682:::-;18824:3;18845:67;18909:2;18904:3;18845:67;:::i;:::-;18838:74;;18921:93;19010:3;18921:93;:::i;:::-;19039:2;19034:3;19030:12;19023:19;;18682:366;;;:::o;19054:::-;19196:3;19217:67;19281:2;19276:3;19217:67;:::i;:::-;19210:74;;19293:93;19382:3;19293:93;:::i;:::-;19411:2;19406:3;19402:12;19395:19;;19054:366;;;:::o;19426:::-;19568:3;19589:67;19653:2;19648:3;19589:67;:::i;:::-;19582:74;;19665:93;19754:3;19665:93;:::i;:::-;19783:2;19778:3;19774:12;19767:19;;19426:366;;;:::o;19798:::-;19940:3;19961:67;20025:2;20020:3;19961:67;:::i;:::-;19954:74;;20037:93;20126:3;20037:93;:::i;:::-;20155:2;20150:3;20146:12;20139:19;;19798:366;;;:::o;20170:::-;20312:3;20333:67;20397:2;20392:3;20333:67;:::i;:::-;20326:74;;20409:93;20498:3;20409:93;:::i;:::-;20527:2;20522:3;20518:12;20511:19;;20170:366;;;:::o;20542:::-;20684:3;20705:67;20769:2;20764:3;20705:67;:::i;:::-;20698:74;;20781:93;20870:3;20781:93;:::i;:::-;20899:2;20894:3;20890:12;20883:19;;20542:366;;;:::o;20914:::-;21056:3;21077:67;21141:2;21136:3;21077:67;:::i;:::-;21070:74;;21153:93;21242:3;21153:93;:::i;:::-;21271:2;21266:3;21262:12;21255:19;;20914:366;;;:::o;21286:::-;21428:3;21449:67;21513:2;21508:3;21449:67;:::i;:::-;21442:74;;21525:93;21614:3;21525:93;:::i;:::-;21643:2;21638:3;21634:12;21627:19;;21286:366;;;:::o;21658:400::-;21818:3;21839:84;21921:1;21916:3;21839:84;:::i;:::-;21832:91;;21932:93;22021:3;21932:93;:::i;:::-;22050:1;22045:3;22041:11;22034:18;;21658:400;;;:::o;22064:118::-;22151:24;22169:5;22151:24;:::i;:::-;22146:3;22139:37;22064:118;;:::o;22188:695::-;22466:3;22488:92;22576:3;22567:6;22488:92;:::i;:::-;22481:99;;22597:148;22741:3;22597:148;:::i;:::-;22590:155;;22762:95;22853:3;22844:6;22762:95;:::i;:::-;22755:102;;22874:3;22867:10;;22188:695;;;;;:::o;22889:222::-;22982:4;23020:2;23009:9;23005:18;22997:26;;23033:71;23101:1;23090:9;23086:17;23077:6;23033:71;:::i;:::-;22889:222;;;;:::o;23117:640::-;23312:4;23350:3;23339:9;23335:19;23327:27;;23364:71;23432:1;23421:9;23417:17;23408:6;23364:71;:::i;:::-;23445:72;23513:2;23502:9;23498:18;23489:6;23445:72;:::i;:::-;23527;23595:2;23584:9;23580:18;23571:6;23527:72;:::i;:::-;23646:9;23640:4;23636:20;23631:2;23620:9;23616:18;23609:48;23674:76;23745:4;23736:6;23674:76;:::i;:::-;23666:84;;23117:640;;;;;;;:::o;23763:332::-;23884:4;23922:2;23911:9;23907:18;23899:26;;23935:71;24003:1;23992:9;23988:17;23979:6;23935:71;:::i;:::-;24016:72;24084:2;24073:9;24069:18;24060:6;24016:72;:::i;:::-;23763:332;;;;;:::o;24101:210::-;24188:4;24226:2;24215:9;24211:18;24203:26;;24239:65;24301:1;24290:9;24286:17;24277:6;24239:65;:::i;:::-;24101:210;;;;:::o;24317:313::-;24430:4;24468:2;24457:9;24453:18;24445:26;;24517:9;24511:4;24507:20;24503:1;24492:9;24488:17;24481:47;24545:78;24618:4;24609:6;24545:78;:::i;:::-;24537:86;;24317:313;;;;:::o;24636:419::-;24802:4;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24636:419;;;:::o;25061:::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25061:419;;;:::o;25486:::-;25652:4;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25486:419;;;:::o;25911:::-;26077:4;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;25911:419;;;:::o;26336:::-;26502:4;26540:2;26529:9;26525:18;26517:26;;26589:9;26583:4;26579:20;26575:1;26564:9;26560:17;26553:47;26617:131;26743:4;26617:131;:::i;:::-;26609:139;;26336:419;;;:::o;26761:::-;26927:4;26965:2;26954:9;26950:18;26942:26;;27014:9;27008:4;27004:20;27000:1;26989:9;26985:17;26978:47;27042:131;27168:4;27042:131;:::i;:::-;27034:139;;26761:419;;;:::o;27186:::-;27352:4;27390:2;27379:9;27375:18;27367:26;;27439:9;27433:4;27429:20;27425:1;27414:9;27410:17;27403:47;27467:131;27593:4;27467:131;:::i;:::-;27459:139;;27186:419;;;:::o;27611:::-;27777:4;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27611:419;;;:::o;28036:::-;28202:4;28240:2;28229:9;28225:18;28217:26;;28289:9;28283:4;28279:20;28275:1;28264:9;28260:17;28253:47;28317:131;28443:4;28317:131;:::i;:::-;28309:139;;28036:419;;;:::o;28461:::-;28627:4;28665:2;28654:9;28650:18;28642:26;;28714:9;28708:4;28704:20;28700:1;28689:9;28685:17;28678:47;28742:131;28868:4;28742:131;:::i;:::-;28734:139;;28461:419;;;:::o;28886:::-;29052:4;29090:2;29079:9;29075:18;29067:26;;29139:9;29133:4;29129:20;29125:1;29114:9;29110:17;29103:47;29167:131;29293:4;29167:131;:::i;:::-;29159:139;;28886:419;;;:::o;29311:::-;29477:4;29515:2;29504:9;29500:18;29492:26;;29564:9;29558:4;29554:20;29550:1;29539:9;29535:17;29528:47;29592:131;29718:4;29592:131;:::i;:::-;29584:139;;29311:419;;;:::o;29736:::-;29902:4;29940:2;29929:9;29925:18;29917:26;;29989:9;29983:4;29979:20;29975:1;29964:9;29960:17;29953:47;30017:131;30143:4;30017:131;:::i;:::-;30009:139;;29736:419;;;:::o;30161:::-;30327:4;30365:2;30354:9;30350:18;30342:26;;30414:9;30408:4;30404:20;30400:1;30389:9;30385:17;30378:47;30442:131;30568:4;30442:131;:::i;:::-;30434:139;;30161:419;;;:::o;30586:::-;30752:4;30790:2;30779:9;30775:18;30767:26;;30839:9;30833:4;30829:20;30825:1;30814:9;30810:17;30803:47;30867:131;30993:4;30867:131;:::i;:::-;30859:139;;30586:419;;;:::o;31011:::-;31177:4;31215:2;31204:9;31200:18;31192:26;;31264:9;31258:4;31254:20;31250:1;31239:9;31235:17;31228:47;31292:131;31418:4;31292:131;:::i;:::-;31284:139;;31011:419;;;:::o;31436:::-;31602:4;31640:2;31629:9;31625:18;31617:26;;31689:9;31683:4;31679:20;31675:1;31664:9;31660:17;31653:47;31717:131;31843:4;31717:131;:::i;:::-;31709:139;;31436:419;;;:::o;31861:::-;32027:4;32065:2;32054:9;32050:18;32042:26;;32114:9;32108:4;32104:20;32100:1;32089:9;32085:17;32078:47;32142:131;32268:4;32142:131;:::i;:::-;32134:139;;31861:419;;;:::o;32286:::-;32452:4;32490:2;32479:9;32475:18;32467:26;;32539:9;32533:4;32529:20;32525:1;32514:9;32510:17;32503:47;32567:131;32693:4;32567:131;:::i;:::-;32559:139;;32286:419;;;:::o;32711:::-;32877:4;32915:2;32904:9;32900:18;32892:26;;32964:9;32958:4;32954:20;32950:1;32939:9;32935:17;32928:47;32992:131;33118:4;32992:131;:::i;:::-;32984:139;;32711:419;;;:::o;33136:::-;33302:4;33340:2;33329:9;33325:18;33317:26;;33389:9;33383:4;33379:20;33375:1;33364:9;33360:17;33353:47;33417:131;33543:4;33417:131;:::i;:::-;33409:139;;33136:419;;;:::o;33561:::-;33727:4;33765:2;33754:9;33750:18;33742:26;;33814:9;33808:4;33804:20;33800:1;33789:9;33785:17;33778:47;33842:131;33968:4;33842:131;:::i;:::-;33834:139;;33561:419;;;:::o;33986:::-;34152:4;34190:2;34179:9;34175:18;34167:26;;34239:9;34233:4;34229:20;34225:1;34214:9;34210:17;34203:47;34267:131;34393:4;34267:131;:::i;:::-;34259:139;;33986:419;;;:::o;34411:::-;34577:4;34615:2;34604:9;34600:18;34592:26;;34664:9;34658:4;34654:20;34650:1;34639:9;34635:17;34628:47;34692:131;34818:4;34692:131;:::i;:::-;34684:139;;34411:419;;;:::o;34836:::-;35002:4;35040:2;35029:9;35025:18;35017:26;;35089:9;35083:4;35079:20;35075:1;35064:9;35060:17;35053:47;35117:131;35243:4;35117:131;:::i;:::-;35109:139;;34836:419;;;:::o;35261:222::-;35354:4;35392:2;35381:9;35377:18;35369:26;;35405:71;35473:1;35462:9;35458:17;35449:6;35405:71;:::i;:::-;35261:222;;;;:::o;35489:129::-;35523:6;35550:20;;:::i;:::-;35540:30;;35579:33;35607:4;35599:6;35579:33;:::i;:::-;35489:129;;;:::o;35624:75::-;35657:6;35690:2;35684:9;35674:19;;35624:75;:::o;35705:307::-;35766:4;35856:18;35848:6;35845:30;35842:56;;;35878:18;;:::i;:::-;35842:56;35916:29;35938:6;35916:29;:::i;:::-;35908:37;;36000:4;35994;35990:15;35982:23;;35705:307;;;:::o;36018:308::-;36080:4;36170:18;36162:6;36159:30;36156:56;;;36192:18;;:::i;:::-;36156:56;36230:29;36252:6;36230:29;:::i;:::-;36222:37;;36314:4;36308;36304:15;36296:23;;36018:308;;;:::o;36332:141::-;36381:4;36404:3;36396:11;;36427:3;36424:1;36417:14;36461:4;36458:1;36448:18;36440:26;;36332:141;;;:::o;36479:98::-;36530:6;36564:5;36558:12;36548:22;;36479:98;;;:::o;36583:99::-;36635:6;36669:5;36663:12;36653:22;;36583:99;;;:::o;36688:168::-;36771:11;36805:6;36800:3;36793:19;36845:4;36840:3;36836:14;36821:29;;36688:168;;;;:::o;36862:169::-;36946:11;36980:6;36975:3;36968:19;37020:4;37015:3;37011:14;36996:29;;36862:169;;;;:::o;37037:148::-;37139:11;37176:3;37161:18;;37037:148;;;;:::o;37191:273::-;37231:3;37250:20;37268:1;37250:20;:::i;:::-;37245:25;;37284:20;37302:1;37284:20;:::i;:::-;37279:25;;37406:1;37370:34;37366:42;37363:1;37360:49;37357:75;;;37412:18;;:::i;:::-;37357:75;37456:1;37453;37449:9;37442:16;;37191:273;;;;:::o;37470:305::-;37510:3;37529:20;37547:1;37529:20;:::i;:::-;37524:25;;37563:20;37581:1;37563:20;:::i;:::-;37558:25;;37717:1;37649:66;37645:74;37642:1;37639:81;37636:107;;;37723:18;;:::i;:::-;37636:107;37767:1;37764;37760:9;37753:16;;37470:305;;;;:::o;37781:185::-;37821:1;37838:20;37856:1;37838:20;:::i;:::-;37833:25;;37872:20;37890:1;37872:20;:::i;:::-;37867:25;;37911:1;37901:35;;37916:18;;:::i;:::-;37901:35;37958:1;37955;37951:9;37946:14;;37781:185;;;;:::o;37972:348::-;38012:7;38035:20;38053:1;38035:20;:::i;:::-;38030:25;;38069:20;38087:1;38069:20;:::i;:::-;38064:25;;38257:1;38189:66;38185:74;38182:1;38179:81;38174:1;38167:9;38160:17;38156:105;38153:131;;;38264:18;;:::i;:::-;38153:131;38312:1;38309;38305:9;38294:20;;37972:348;;;;:::o;38326:191::-;38366:4;38386:20;38404:1;38386:20;:::i;:::-;38381:25;;38420:20;38438:1;38420:20;:::i;:::-;38415:25;;38459:1;38456;38453:8;38450:34;;;38464:18;;:::i;:::-;38450:34;38509:1;38506;38502:9;38494:17;;38326:191;;;;:::o;38523:::-;38563:4;38583:20;38601:1;38583:20;:::i;:::-;38578:25;;38617:20;38635:1;38617:20;:::i;:::-;38612:25;;38656:1;38653;38650:8;38647:34;;;38661:18;;:::i;:::-;38647:34;38706:1;38703;38699:9;38691:17;;38523:191;;;;:::o;38720:96::-;38757:7;38786:24;38804:5;38786:24;:::i;:::-;38775:35;;38720:96;;;:::o;38822:90::-;38856:7;38899:5;38892:13;38885:21;38874:32;;38822:90;;;:::o;38918:149::-;38954:7;38994:66;38987:5;38983:78;38972:89;;38918:149;;;:::o;39073:110::-;39124:7;39153:24;39171:5;39153:24;:::i;:::-;39142:35;;39073:110;;;:::o;39189:125::-;39255:7;39284:24;39302:5;39284:24;:::i;:::-;39273:35;;39189:125;;;:::o;39320:118::-;39357:7;39397:34;39390:5;39386:46;39375:57;;39320:118;;;:::o;39444:126::-;39481:7;39521:42;39514:5;39510:54;39499:65;;39444:126;;;:::o;39576:77::-;39613:7;39642:5;39631:16;;39576:77;;;:::o;39659:154::-;39743:6;39738:3;39733;39720:30;39805:1;39796:6;39791:3;39787:16;39780:27;39659:154;;;:::o;39819:307::-;39887:1;39897:113;39911:6;39908:1;39905:13;39897:113;;;39996:1;39991:3;39987:11;39981:18;39977:1;39972:3;39968:11;39961:39;39933:2;39930:1;39926:10;39921:15;;39897:113;;;40028:6;40025:1;40022:13;40019:101;;;40108:1;40099:6;40094:3;40090:16;40083:27;40019:101;39868:258;39819:307;;;:::o;40132:171::-;40171:3;40194:24;40212:5;40194:24;:::i;:::-;40185:33;;40240:4;40233:5;40230:15;40227:41;;;40248:18;;:::i;:::-;40227:41;40295:1;40288:5;40284:13;40277:20;;40132:171;;;:::o;40309:320::-;40353:6;40390:1;40384:4;40380:12;40370:22;;40437:1;40431:4;40427:12;40458:18;40448:81;;40514:4;40506:6;40502:17;40492:27;;40448:81;40576:2;40568:6;40565:14;40545:18;40542:38;40539:84;;;40595:18;;:::i;:::-;40539:84;40360:269;40309:320;;;:::o;40635:281::-;40718:27;40740:4;40718:27;:::i;:::-;40710:6;40706:40;40848:6;40836:10;40833:22;40812:18;40800:10;40797:34;40794:62;40791:88;;;40859:18;;:::i;:::-;40791:88;40899:10;40895:2;40888:22;40678:238;40635:281;;:::o;40922:233::-;40961:3;40984:24;41002:5;40984:24;:::i;:::-;40975:33;;41030:66;41023:5;41020:77;41017:103;;;41100:18;;:::i;:::-;41017:103;41147:1;41140:5;41136:13;41129:20;;40922:233;;;:::o;41161:176::-;41193:1;41210:20;41228:1;41210:20;:::i;:::-;41205:25;;41244:20;41262:1;41244:20;:::i;:::-;41239:25;;41283:1;41273:35;;41288:18;;:::i;:::-;41273:35;41329:1;41326;41322:9;41317:14;;41161:176;;;;:::o;41343:180::-;41391:77;41388:1;41381:88;41488:4;41485:1;41478:15;41512:4;41509:1;41502:15;41529:180;41577:77;41574:1;41567:88;41674:4;41671:1;41664:15;41698:4;41695:1;41688:15;41715:180;41763:77;41760:1;41753:88;41860:4;41857:1;41850:15;41884:4;41881:1;41874:15;41901:180;41949:77;41946:1;41939:88;42046:4;42043:1;42036:15;42070:4;42067:1;42060:15;42087:180;42135:77;42132:1;42125:88;42232:4;42229:1;42222:15;42256:4;42253:1;42246:15;42273:117;42382:1;42379;42372:12;42396:117;42505:1;42502;42495:12;42519:117;42628:1;42625;42618:12;42642:117;42751:1;42748;42741:12;42765:102;42806:6;42857:2;42853:7;42848:2;42841:5;42837:14;42833:28;42823:38;;42765:102;;;:::o;42873:221::-;43013:34;43009:1;43001:6;42997:14;42990:58;43082:4;43077:2;43069:6;43065:15;43058:29;42873:221;:::o;43100:225::-;43240:34;43236:1;43228:6;43224:14;43217:58;43309:8;43304:2;43296:6;43292:15;43285:33;43100:225;:::o;43331:229::-;43471:34;43467:1;43459:6;43455:14;43448:58;43540:12;43535:2;43527:6;43523:15;43516:37;43331:229;:::o;43566:222::-;43706:34;43702:1;43694:6;43690:14;43683:58;43775:5;43770:2;43762:6;43758:15;43751:30;43566:222;:::o;43794:221::-;43934:34;43930:1;43922:6;43918:14;43911:58;44003:4;43998:2;43990:6;43986:15;43979:29;43794:221;:::o;44021:224::-;44161:34;44157:1;44149:6;44145:14;44138:58;44230:7;44225:2;44217:6;44213:15;44206:32;44021:224;:::o;44251:221::-;44391:34;44387:1;44379:6;44375:14;44368:58;44460:4;44455:2;44447:6;44443:15;44436:29;44251:221;:::o;44478:167::-;44618:19;44614:1;44606:6;44602:14;44595:43;44478:167;:::o;44651:244::-;44791:34;44787:1;44779:6;44775:14;44768:58;44860:27;44855:2;44847:6;44843:15;44836:52;44651:244;:::o;44901:230::-;45041:34;45037:1;45029:6;45025:14;45018:58;45110:13;45105:2;45097:6;45093:15;45086:38;44901:230;:::o;45137:225::-;45277:34;45273:1;45265:6;45261:14;45254:58;45346:8;45341:2;45333:6;45329:15;45322:33;45137:225;:::o;45368:182::-;45508:34;45504:1;45496:6;45492:14;45485:58;45368:182;:::o;45556:176::-;45696:28;45692:1;45684:6;45680:14;45673:52;45556:176;:::o;45738:237::-;45878:34;45874:1;45866:6;45862:14;45855:58;45947:20;45942:2;45934:6;45930:15;45923:45;45738:237;:::o;45981:221::-;46121:34;46117:1;46109:6;46105:14;46098:58;46190:4;46185:2;46177:6;46173:15;46166:29;45981:221;:::o;46208:238::-;46348:34;46344:1;46336:6;46332:14;46325:58;46417:21;46412:2;46404:6;46400:15;46393:46;46208:238;:::o;46452:179::-;46592:31;46588:1;46580:6;46576:14;46569:55;46452:179;:::o;46637:220::-;46777:34;46773:1;46765:6;46761:14;46754:58;46846:3;46841:2;46833:6;46829:15;46822:28;46637:220;:::o;46863:174::-;47003:26;46999:1;46991:6;46987:14;46980:50;46863:174;:::o;47043:233::-;47183:34;47179:1;47171:6;47167:14;47160:58;47252:16;47247:2;47239:6;47235:15;47228:41;47043:233;:::o;47282:181::-;47422:33;47418:1;47410:6;47406:14;47399:57;47282:181;:::o;47469:234::-;47609:34;47605:1;47597:6;47593:14;47586:58;47678:17;47673:2;47665:6;47661:15;47654:42;47469:234;:::o;47709:173::-;47849:25;47845:1;47837:6;47833:14;47826:49;47709:173;:::o;47888:232::-;48028:34;48024:1;48016:6;48012:14;48005:58;48097:15;48092:2;48084:6;48080:15;48073:40;47888:232;:::o;48126:221::-;48266:34;48262:1;48254:6;48250:14;48243:58;48335:4;48330:2;48322:6;48318:15;48311:29;48126:221;:::o;48353:151::-;48493:3;48489:1;48481:6;48477:14;48470:27;48353:151;:::o;48510:122::-;48583:24;48601:5;48583:24;:::i;:::-;48576:5;48573:35;48563:63;;48622:1;48619;48612:12;48563:63;48510:122;:::o;48638:116::-;48708:21;48723:5;48708:21;:::i;:::-;48701:5;48698:32;48688:60;;48744:1;48741;48734:12;48688:60;48638:116;:::o;48760:120::-;48832:23;48849:5;48832:23;:::i;:::-;48825:5;48822:34;48812:62;;48870:1;48867;48860:12;48812:62;48760:120;:::o;48886:150::-;48973:38;49005:5;48973:38;:::i;:::-;48966:5;48963:49;48953:77;;49026:1;49023;49016:12;48953:77;48886:150;:::o;49042:180::-;49144:53;49191:5;49144:53;:::i;:::-;49137:5;49134:64;49124:92;;49212:1;49209;49202:12;49124:92;49042:180;:::o;49228:122::-;49301:24;49319:5;49301:24;:::i;:::-;49294:5;49291:35;49281:63;;49340:1;49337;49330:12;49281:63;49228:122;:::o
Swarm Source
ipfs://c6011b967e2d9e140c76ea935fdba4a07f4fc9a2df36f07efba2ba977ad258a2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.