More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 3,396 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15766442 | 29 days ago | IN | 0 CRO | 0.23327465 | ||||
Set Approval For... | 14961931 | 82 days ago | IN | 0 CRO | 0.23320536 | ||||
Set Approval For... | 13933286 | 150 days ago | IN | 0 CRO | 0.23327465 | ||||
Set Approval For... | 13903892 | 152 days ago | IN | 0 CRO | 0.14686057 | ||||
Set Approval For... | 13566495 | 174 days ago | IN | 0 CRO | 0.23327465 | ||||
Set Approval For... | 13204661 | 197 days ago | IN | 0 CRO | 0.23327465 | ||||
Set Approval For... | 13180618 | 199 days ago | IN | 0 CRO | 0.12258262 | ||||
Safe Transfer Fr... | 12768563 | 226 days ago | IN | 0 CRO | 0.64398612 | ||||
Approve | 12261849 | 259 days ago | IN | 0 CRO | 0.2916072 | ||||
Approve | 12261848 | 259 days ago | IN | 0 CRO | 0.291486 | ||||
Set Approval For... | 11912119 | 281 days ago | IN | 0 CRO | 0.46641072 | ||||
Set Approval For... | 11714511 | 294 days ago | IN | 0 CRO | 0.4665493 | ||||
Set Approval For... | 11450097 | 311 days ago | IN | 0 CRO | 0.21290533 | ||||
Set Approval For... | 11096471 | 334 days ago | IN | 0 CRO | 0.21355868 | ||||
Set Approval For... | 11039007 | 338 days ago | IN | 0 CRO | 0.2136751 | ||||
Set Approval For... | 11038976 | 338 days ago | IN | 0 CRO | 0.21367516 | ||||
Set Approval For... | 11038125 | 338 days ago | IN | 0 CRO | 0.21367688 | ||||
Set Approval For... | 11005928 | 340 days ago | IN | 0 CRO | 0.21381202 | ||||
Set Approval For... | 10833155 | 352 days ago | IN | 0 CRO | 0.21410082 | ||||
Set Approval For... | 10314198 | 385 days ago | IN | 0 CRO | 0.21855916 | ||||
Set Approval For... | 10297424 | 387 days ago | IN | 0 CRO | 0.21522061 | ||||
Set Approval For... | 10273409 | 388 days ago | IN | 0 CRO | 0.21527104 | ||||
Set Approval For... | 10139912 | 397 days ago | IN | 0 CRO | 0.21555105 | ||||
Transfer From | 9999319 | 406 days ago | IN | 0 CRO | 0.4672719 | ||||
Transfer From | 9999317 | 406 days ago | IN | 0 CRO | 0.46727191 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6168660 | 656 days ago | 100 CRO | ||||
5897534 | 674 days ago | 100 CRO | ||||
5897503 | 674 days ago | 180 CRO | ||||
5897503 | 674 days ago | 54 CRO | ||||
5897503 | 674 days ago | 66 CRO | ||||
5897499 | 674 days ago | 180 CRO | ||||
5897499 | 674 days ago | 54 CRO | ||||
5897499 | 674 days ago | 66 CRO | ||||
5669718 | 689 days ago | 100 CRO | ||||
5669685 | 689 days ago | 180 CRO | ||||
5669685 | 689 days ago | 54 CRO | ||||
5669685 | 689 days ago | 66 CRO | ||||
5633391 | 692 days ago | 100 CRO | ||||
5633374 | 692 days ago | 180 CRO | ||||
5633374 | 692 days ago | 54 CRO | ||||
5633374 | 692 days ago | 66 CRO | ||||
5533855 | 698 days ago | 180 CRO | ||||
5533855 | 698 days ago | 54 CRO | ||||
5533855 | 698 days ago | 66 CRO | ||||
5471730 | 702 days ago | 100 CRO | ||||
5427515 | 705 days ago | 100 CRO | ||||
5427511 | 705 days ago | 100 CRO | ||||
5427498 | 705 days ago | 360 CRO | ||||
5427498 | 705 days ago | 108 CRO | ||||
5427498 | 705 days ago | 132 CRO |
Loading...
Loading
Contract Name:
TokenNFT
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-08-21 */ pragma solidity ^0.8.15; 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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 ); } interface IWETH { function deposit() external payable; } library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } 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; } } } 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); } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } 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); } } 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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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); } } } } 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); } 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface EyeToken { function life(address to, uint256 amount) external; } 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; } 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); /** * @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); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } 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); } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; } // Compiler will pack the following // _currentIndex and _burnCounter into a single 256bit word. // The tokenId of the next token to be minted. uint128 internal _currentIndex = 1; // The number of tokens burned. uint128 internal _burnCounter; // 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) internal _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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return (_currentIndex - 1) - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). 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 tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex - 1; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). 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) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @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) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if ( safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = uint128(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 || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = 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)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn 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)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @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); } /** * @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 TransferToNonERC721ReceiverImplementer(); } 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. * And also called before burning one token. * * 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`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ 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. * And also called after one token has been burned. * * 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` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract TokenNFT is ERC721A, Ownable { using SafeMath for uint256; using Strings for uint256; using SafeERC20 for IERC20; string public baseURI; string public baseExtension = ".json"; uint256 public maxSupply; uint256 public cost; uint256 public pcost; uint256 public acost = 75 ether; uint256 public reward; address public dev = 0x4335DF414426645fB63fC2c52926119D56990AcF; address public leader = 0x4058451968d4FD8032f5c4b56bD882B928b17992; address public wcro = 0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23; address public token = 0x3Ae323792EAA7e537Ce015A760E1f69Bbd94499e; address public bacc = 0xa57a7B5F8067156C2DbB06cf5e4d8aCEF17aeE64; address public router = 0x145863Eb42Cf62847A6Ca784e6416C1682b1b2Ae; mapping(address => bool) public whiteList; mapping(address => bool) public free; mapping(uint256 => bool) public activate; mapping (uint256 => nftData) public tokenToData; struct nftData{ uint256 lastReflections; uint256 tokenRank; uint256 stampTime; uint256 curReward; } EyeToken tokeneye = EyeToken(0x3Ae323792EAA7e537Ce015A760E1f69Bbd94499e); constructor() ERC721A("Crorus Member NFT", "CRORUS") { setBaseURI( "https://nyc3.digitaloceanspaces.com/cronosbay/crorusjson/" ); maxSupply = 3333; cost = 450 ether; pcost = 300 ether; } function setRank(uint256[] memory tkid, uint256[] memory rkid) public onlyOwner{ require(tkid.length == rkid.length, "token and rank"); for (uint256 i = 0; i < tkid.length; i++){ tokenToData[tkid[i]].tokenRank = rkid[i]; } } function mint(uint256 _mintAmount) external payable{ uint256 supply = totalSupply(); require(supply + _mintAmount <= maxSupply, "SoldOUT"); uint256 croAm = cost * _mintAmount; require(msg.value == croAm); uint256 am = croAm.mul(6000).div(10000); uint256 ma = croAm.sub(am); uint256 adm = ma.mul(4500).div(10000); uint256 cfm = ma.sub(adm); _payout(leader, cfm); _payout(dev, adm); _approveTokenIfNeeded(token, router); _approveTokenIfNeeded(wcro, router); _approveTokenIfNeeded(bacc, router); IWETH(wcro).deposit{value: am}(); (uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(0xdFd9DadF4E58c70560b1c45545a87edeA1778562).getReserves(); uint baccAmount = _swapbacccro(am); uint256 lionAm = IUniswapV2Router01(router).quote(baccAmount,reserve1, reserve0); tokeneye.life(address(this), lionAm); IUniswapV2Router02(router).addLiquidity(bacc, token, baccAmount, lionAm, 0, 0, address(this), block.timestamp +30); _safeMint(msg.sender, _mintAmount); } function _payout(address _recipient, uint256 _amount) internal { // attempt to send the funds to the recipient (bool success, ) = payable(_recipient).call{value: _amount, gas: 50000}( "" ); require(success); } function _swapbacccro(uint256 value) internal returns (uint) { IUniswapV2Router02 dex = IUniswapV2Router02(router); address[] memory path = new address[](2); path[0] = wcro; path[1] = bacc; uint256[] memory am = dex.swapExactTokensForTokens(value,0, path, address(this), block.timestamp+30); return am[1]; } function whiteUser(address[] memory usr) public onlyOwner{ for (uint256 i = 0; i < usr.length; i++) { whiteList[usr[i]] = true; } } function whiteMint(uint256 _mintAmount) external payable{ uint256 supply = totalSupply(); require(whiteList[msg.sender] == true); require(supply + _mintAmount <= maxSupply, "SoldOUT"); uint256 croAm = pcost * _mintAmount; require(msg.value == croAm); uint256 am = croAm.mul(6000).div(10000); uint256 ma = croAm.sub(am); uint256 adm = ma.mul(3500).div(10000); uint256 cfm = ma.sub(adm); _payout(leader, cfm); _payout(dev, adm); _approveTokenIfNeeded(token, router); _approveTokenIfNeeded(wcro, router); _approveTokenIfNeeded(bacc, router); IWETH(wcro).deposit{value: am}(); (uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(0xdFd9DadF4E58c70560b1c45545a87edeA1778562).getReserves(); uint baccAmount = _swapbacccro(am); uint256 lionAm = IUniswapV2Router01(router).quote(baccAmount,reserve1, reserve0); tokeneye.life(address(this), lionAm); IUniswapV2Router02(router).addLiquidity(bacc, token, baccAmount, lionAm, 0, 0, address(this), block.timestamp +30); _safeMint(msg.sender, _mintAmount); } function calcCost(uint256 _mintAmount) public view returns (uint256){ return _mintAmount * cost; } function calwCost(uint256 _mintAmount) public view returns (uint256){ return _mintAmount * pcost; } function calaCost(uint256 _mintAmount) public view returns (uint256){ return _mintAmount * acost; } function royalties() public payable { uint256 croAm = msg.value; uint256 am = croAm.mul(6000).div(10000); uint256 ma = croAm.sub(am); uint256 adm = ma.mul(4000).div(10000); uint256 cfm = ma.sub(adm); _payout(leader, cfm); _payout(dev, adm); _approveTokenIfNeeded(token, router); _approveTokenIfNeeded(wcro, router); _approveTokenIfNeeded(bacc, router); IWETH(wcro).deposit{value: am}(); (uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(0xdFd9DadF4E58c70560b1c45545a87edeA1778562).getReserves(); uint baccAmount = _swapbacccro(am); uint256 lionAm = IUniswapV2Router01(router).quote(baccAmount,reserve1, reserve0); tokeneye.life(address(this), lionAm); IUniswapV2Router02(router).addLiquidity(bacc, token, baccAmount, lionAm, 0, 0, address(this), block.timestamp +30); } function getRewards(uint256[] memory tokenIds) public view returns (uint256 rewards) { for (uint256 i = 0; i < tokenIds.length; i++) { uint256 pol = tokenToData[tokenIds[i]].curReward.mul(tokenToData[tokenIds[i]].tokenRank).div(maxSupply); uint256 lop = block.number - tokenToData[tokenIds[i]].stampTime; uint256 lo = pol.mul(lop); rewards += lo - tokenToData[tokenIds[i]].lastReflections; } } function getRewardsToken(uint256 tokenIdsRewards) public view returns (uint256 rewards) { uint256 pol = tokenToData[tokenIdsRewards].curReward.mul(tokenToData[tokenIdsRewards].tokenRank).div(maxSupply); uint256 lop = block.number - tokenToData[tokenIdsRewards].stampTime; uint256 lo = pol.mul(lop); rewards += lo - tokenToData[tokenIdsRewards].lastReflections; } function claimRewards(uint256[] memory tokenIds) external { uint256 rewards = getRewards(tokenIds); for (uint256 i = 0; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Owner Invalid"); tokenToData[tokenIds[i]].lastReflections += rewards; } tokeneye.life(msg.sender, rewards); } function activateRewards(uint256[] memory tokenIds) external payable{ require(msg.value == acost * tokenIds.length); uint256 cs = acost * tokenIds.length; for (uint256 i = 0; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "Owner Invalid"); require(activate[tokenIds[i]] == false, "unactivated"); tokenToData[tokenIds[i]].stampTime = block.number; tokenToData[tokenIds[i]].curReward = reward; activate[tokenIds[i]] = true; } _approveTokenIfNeeded(token, router); _approveTokenIfNeeded(wcro, router); _approveTokenIfNeeded(bacc, router); IWETH(wcro).deposit{value: msg.value}(); (uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(0xdFd9DadF4E58c70560b1c45545a87edeA1778562).getReserves(); uint baccAmount = _swapbacccro(cs); uint256 lionAm = IUniswapV2Router01(router).quote(baccAmount,reserve1, reserve0); tokeneye.life(address(this), lionAm); IUniswapV2Router02(router).addLiquidity(bacc, token, baccAmount, lionAm, 0, 0, address(this), block.timestamp +30); } function claimAllRewards() public { uint count = balanceOf(msg.sender); uint256 balance = 0; for(uint i = 0; i < count; i++){ uint tokenId = tokenOfOwnerByIndex(msg.sender, i); balance += (getRewardsToken(tokenId)); tokenToData[tokenId].lastReflections += (getRewardsToken(tokenId)); } tokeneye.life(msg.sender, balance); } function claimToken(address tokn, uint256[] memory tokenIds ) public { uint256 balance = 0; for(uint i = 0; i < tokenIds.length; i++){ require(ownerOf(tokenIds[i]) == msg.sender, "Owner Invalid"); balance += (getRewardsToken(tokenIds[i])); tokenToData[tokenIds[i]].lastReflections += (getRewardsToken(tokenIds[i])); } tokeneye.life(address(this), balance); _approveTokenIfNeeded(token, router); _swaptToken(balance, tokn, msg.sender); } function _swaptToken(uint256 value, address tkn, address usr) internal{ if (tkn == bacc){ IUniswapV2Router02 dex = IUniswapV2Router02(router); address[] memory path = new address[](2); path[0] = token; path[1] = bacc; dex.swapExactTokensForTokensSupportingFeeOnTransferTokens(value,0, path, usr, block.timestamp+30); }else{ IUniswapV2Router02 dex = IUniswapV2Router02(router); address[] memory path = new address[](3); path[0] = token; path[1] = bacc; path[2] = tkn; dex.swapExactTokensForTokensSupportingFeeOnTransferTokens(value,0, path, usr, block.timestamp+30); } } function estReward(address tken) external view returns(uint){ if (tken == bacc){ IUniswapV2Router02 dex = IUniswapV2Router02(router); address[] memory path = new address[](2); path[0] = token; path[1] = bacc; uint count = balanceOf(msg.sender); uint256 balance = 0; for(uint i = 0; i < count; i++){ uint tokenId = tokenOfOwnerByIndex(msg.sender, i); balance += (getRewardsToken(tokenId)); } return dex.getAmountsOut(balance, path)[1]; }else{ IUniswapV2Router02 dex = IUniswapV2Router02(router); address[] memory path = new address[](3); path[0] = token; path[1] = bacc; path[2] = tken; uint count = balanceOf(msg.sender); uint256 balance = 0; for(uint i = 0; i < count; i++){ uint tokenId = tokenOfOwnerByIndex(msg.sender, i); balance += (getRewardsToken(tokenId)); } return dex.getAmountsOut(balance, path)[2]; } } function _approveTokenIfNeeded(address tokn, address rouer) private { if (IERC20(tokn).allowance(address(this), rouer) == 0) { IERC20(tokn).approve(rouer, type(uint).max); } } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function changeReward(uint256 newReward, uint256 newCost, uint256 newaCost) public onlyOwner{ reward = newReward; cost = newCost; acost = newaCost; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function recoverToken(address _token) external onlyOwner { uint256 balance = IERC20(_token).balanceOf(address(this)); require(balance != 0, "Operations: Cannot recover zero balance"); IERC20(_token).transfer(address(msg.sender), balance); } function recoverNonFungibleToken(address _token, uint256 _tokenId) external onlyOwner { IERC721(_token).transferFrom( address(this), address(msg.sender), _tokenId ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"acost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"activateRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bacc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"calaCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"calcCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"calwCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReward","type":"uint256"},{"internalType":"uint256","name":"newCost","type":"uint256"},{"internalType":"uint256","name":"newaCost","type":"uint256"}],"name":"changeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokn","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tken","type":"address"}],"name":"estReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"free","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getRewards","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdsRewards","type":"uint256"}],"name":"getRewardsToken","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"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":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverNonFungibleToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalties","outputs":[],"stateMutability":"payable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tkid","type":"uint256[]"},{"internalType":"uint256[]","name":"rkid","type":"uint256[]"}],"name":"setRank","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":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"uint256"}],"name":"tokenToData","outputs":[{"internalType":"uint256","name":"lastReflections","type":"uint256"},{"internalType":"uint256","name":"tokenRank","type":"uint256"},{"internalType":"uint256","name":"stampTime","type":"uint256"},{"internalType":"uint256","name":"curReward","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":"wcro","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whiteMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"usr","type":"address[]"}],"name":"whiteUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
600080546001600160801b031916600117905560c06040526005608090815264173539b7b760d91b60a0526009906200003990826200035d565b50680410d586a20a4c0000600d55600f80546001600160a01b0319908116734335df414426645fb63fc2c52926119d56990acf17909155601080548216734058451968d4fd8032f5c4b56bd882b928b17992179055601180548216735c7f8a570d578ed84e63fdfa7b1ee72deae1ae23179055601280548216733ae323792eaa7e537ce015a760e1f69bbd94499e90811790915560138054831673a57a7b5f8067156c2dbb06cf5e4d8acef17aee6417905560148054831673145863eb42cf62847a6ca784e6416c1682b1b2ae179055601980549092161790553480156200012057600080fd5b506040518060400160405280601181526020017010dc9bdc9d5cc813595b58995c88139195607a1b8152506040518060400160405280600681526020016543524f52555360d01b81525081600190816200017b91906200035d565b5060026200018a82826200035d565b505050620001a7620001a1620001f160201b60201c565b620001f5565b620001cb604051806060016040528060398152602001620046e56039913962000247565b610d05600a556818650127cc3dc80000600b55681043561a8829300000600c5562000429565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03163314620002a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6008620002b482826200035d565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002e357607f821691505b6020821081036200030457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200035857600081815260208120601f850160051c81016020861015620003335750805b601f850160051c820191505b8181101562000354578281556001016200033f565b5050505b505050565b81516001600160401b03811115620003795762000379620002b8565b62000391816200038a8454620002ce565b846200030a565b602080601f831160018114620003c95760008415620003b05750858301515b600019600386901b1c1916600185901b17855562000354565b600085815260208120601f198616915b82811015620003fa57888601518255948401946001909101908401620003d9565b5085821015620004195787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6142ac80620004396000396000f3fe6080604052600436106103765760003560e01c80636d4f819c116101d1578063b260c42a11610102578063da3ef23f116100a0578063f2fde38b1161006f578063f2fde38b14610a28578063f490177214610a48578063f887ea4014610a68578063fc0c546a14610a8857600080fd5b8063da3ef23f14610997578063e985e9c5146109b7578063edf8d6a914610a00578063f053dc5c14610a2057600080fd5b8063c6682862116100dc578063c66828621461091c578063c87b56dd14610931578063c9b5bb1714610951578063d5abeb011461098157600080fd5b8063b260c42a146108ac578063b88d4fde146108dc578063bb0fd147146108fc57600080fd5b80639a3609131161016f578063a22cb46511610149578063a22cb465146107ea578063ae3d54141461080a578063af2dd0e61461086c578063afc16d331461088c57600080fd5b80639a360913146107975780639be65a60146107b7578063a0712d68146107d757600080fd5b806378e064c5116101ab57806378e064c51461072e5780638da5cb5b1461074457806391cca3db1461076257806395d89b411461078257600080fd5b80636d4f819c146106d957806370a08231146106f9578063715018a61461071957600080fd5b8063402eadd6116102ab57806355f804b3116102495780635eac6239116102235780635eac6239146106645780636266a39f146106845780636352211e146106a45780636c0360eb146106c457600080fd5b806355f804b314610611578063588a3ccb146106315780635aa136201461064457600080fd5b8063473a6d5211610285578063473a6d52146105a857806347d6b593146105c85780634acf32ea146105db5780634f6ccce7146105f157600080fd5b8063402eadd61461054857806340eedabb1461056857806342842e0e1461058857600080fd5b8063228cb733116103185780632f745c59116102f25780632f745c59146104d0578063372c12b1146104f05780633ccfd60b146105205780633cd972ac1461052857600080fd5b8063228cb7331461047a57806323b872dd146104905780632710c470146104b057600080fd5b8063095ea7b311610354578063095ea7b31461040a5780630b83a7271461042c57806313faede61461044157806318160ddd1461046557600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613780565b610aa8565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610b15565b6040516103a791906137f5565b3480156103de57600080fd5b506103f26103ed366004613808565b610ba7565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a610425366004613838565b610beb565b005b34801561043857600080fd5b5061042a610c78565b34801561044d57600080fd5b50610457600b5481565b6040519081526020016103a7565b34801561047157600080fd5b50610457610d5f565b34801561048657600080fd5b50610457600e5481565b34801561049c57600080fd5b5061042a6104ab366004613862565b610d82565b3480156104bc57600080fd5b506104576104cb36600461389e565b610d8d565b3480156104dc57600080fd5b506104576104eb366004613838565b6110e2565b3480156104fc57600080fd5b5061039b61050b36600461389e565b60156020526000908152604090205460ff1681565b61042a6111d6565b34801561053457600080fd5b50610457610543366004613808565b61127d565b34801561055457600080fd5b5061042a610563366004613922565b61130e565b34801561057457600080fd5b506010546103f2906001600160a01b031681565b34801561059457600080fd5b5061042a6105a3366004613862565b6113a4565b3480156105b457600080fd5b506104576105c3366004613808565b6113bf565b61042a6105d6366004613808565b6113cf565b3480156105e757600080fd5b50610457600c5481565b3480156105fd57600080fd5b5061045761060c366004613808565b6117bb565b34801561061d57600080fd5b5061042a61062c366004613a15565b61187e565b61042a61063f366004613ac3565b6118b4565b34801561065057600080fd5b506013546103f2906001600160a01b031681565b34801561067057600080fd5b5061042a61067f366004613ac3565b611d48565b34801561069057600080fd5b5061042a61069f366004613af7565b611dfd565b3480156106b057600080fd5b506103f26106bf366004613808565b611e35565b3480156106d057600080fd5b506103c5611e47565b3480156106e557600080fd5b506104576106f4366004613808565b611ed5565b34801561070557600080fd5b5061045761071436600461389e565b611ee5565b34801561072557600080fd5b5061042a611f33565b34801561073a57600080fd5b50610457600d5481565b34801561075057600080fd5b506007546001600160a01b03166103f2565b34801561076e57600080fd5b50600f546103f2906001600160a01b031681565b34801561078e57600080fd5b506103c5611f69565b3480156107a357600080fd5b5061042a6107b2366004613b23565b611f78565b3480156107c357600080fd5b5061042a6107d236600461389e565b6120ef565b61042a6107e5366004613808565b612258565b3480156107f657600080fd5b5061042a610805366004613b7e565b612300565b34801561081657600080fd5b5061084c610825366004613808565b60186020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a7565b34801561087857600080fd5b506011546103f2906001600160a01b031681565b34801561089857600080fd5b5061042a6108a7366004613bb5565b612395565b3480156108b857600080fd5b5061039b6108c7366004613808565b60176020526000908152604090205460ff1681565b3480156108e857600080fd5b5061042a6108f7366004613c0e565b61246d565b34801561090857600080fd5b5061042a610917366004613838565b6124a7565b34801561092857600080fd5b506103c561250a565b34801561093d57600080fd5b506103c561094c366004613808565b612517565b34801561095d57600080fd5b5061039b61096c36600461389e565b60166020526000908152604090205460ff1681565b34801561098d57600080fd5b50610457600a5481565b3480156109a357600080fd5b5061042a6109b2366004613a15565b6125e5565b3480156109c357600080fd5b5061039b6109d2366004613c89565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0c57600080fd5b50610457610a1b366004613808565b61261b565b61042a61262b565b348015610a3457600080fd5b5061042a610a4336600461389e565b61297b565b348015610a5457600080fd5b50610457610a63366004613ac3565b612a13565b348015610a7457600080fd5b506014546103f2906001600160a01b031681565b348015610a9457600080fd5b506012546103f2906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610ad957506001600160e01b03198216635b5e139f60e01b145b80610af457506001600160e01b0319821663780e9d6360e01b145b80610b0f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b2490613cbc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5090613cbc565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb282612b4b565b610bcf576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bf682611e35565b9050806001600160a01b0316836001600160a01b031603610c2a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c4a5750610c4881336109d2565b155b15610c68576040516367d9dca160e11b815260040160405180910390fd5b610c73838383612b7f565b505050565b6000610c8333611ee5565b90506000805b82811015610cf5576000610c9d33836110e2565b9050610ca88161127d565b610cb29084613d06565b9250610cbd8161127d565b60008281526018602052604081208054909190610cdb908490613d06565b90915550829150610ced905081613d1e565b915050610c89565b506019546040516304925c1d60e21b8152336004820152602481018390526001600160a01b03909116906312497074906044015b600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b505050505050565b6000546001600160801b03600160801b8204811691811691909103600019011690565b610c73838383612bdb565b6013546000906001600160a01b0390811690831603610f30576014546040805160028082526060820183526001600160a01b0390931692600092602083019080368337505060125482519293506001600160a01b031691839150600090610df657610df6613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110610e2757610e27613d37565b60200260200101906001600160a01b031690816001600160a01b0316815250506000610e5233611ee5565b90506000805b82811015610e97576000610e6c33836110e2565b9050610e778161127d565b610e819084613d06565b9250508080610e8f90613d1e565b915050610e58565b5060405163d06ca61f60e01b81526001600160a01b0385169063d06ca61f90610ec69084908790600401613d91565b600060405180830381865afa158015610ee3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0b9190810190613daa565b600181518110610f1d57610f1d613d37565b6020026020010151945050505050919050565b601454604080516003808252608082019092526001600160a01b039092169160009160208201606080368337505060125482519293506001600160a01b031691839150600090610f8257610f82613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110610fb357610fb3613d37565b60200260200101906001600160a01b031690816001600160a01b0316815250508381600281518110610fe757610fe7613d37565b60200260200101906001600160a01b031690816001600160a01b031681525050600061101233611ee5565b90506000805b8281101561105757600061102c33836110e2565b90506110378161127d565b6110419084613d06565b925050808061104f90613d1e565b915050611018565b5060405163d06ca61f60e01b81526001600160a01b0385169063d06ca61f906110869084908790600401613d91565b600060405180830381865afa1580156110a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110cb9190810190613daa565b600281518110610f1d57610f1d613d37565b919050565b60006110ed83611ee5565b821061110c576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561037657600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061118457506111ce565b80516001600160a01b03161561119957805192505b876001600160a01b0316836001600160a01b0316036111cc578684036111c557509350610b0f92505050565b6001909301925b505b60010161111d565b6007546001600160a01b031633146112095760405162461bcd60e51b815260040161120090613e2f565b60405180910390fd5b600061121d6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611267576040519150601f19603f3d011682016040523d82523d6000602084013e61126c565b606091505b505090508061127a57600080fd5b50565b600a5460008281526018602052604081206001810154600390910154919283926112b1926112ab9190612df8565b90612e04565b600084815260186020526040812060020154919250906112d19043613e64565b905060006112df8383612df8565b6000868152601860205260409020549091506112fb9082613e64565b6113059085613d06565b95945050505050565b6007546001600160a01b031633146113385760405162461bcd60e51b815260040161120090613e2f565b60005b81518110156113a05760016015600084848151811061135c5761135c613d37565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061139881613d1e565b91505061133b565b5050565b610c738383836040518060200160405280600081525061246d565b6000600b5482610b0f9190613e7b565b60006113d9610d5f565b3360009081526015602052604090205490915060ff1615156001146113fd57600080fd5b600a5461140a8383613d06565b11156114425760405162461bcd60e51b815260206004820152600760248201526614dbdb1913d55560ca1b6044820152606401611200565b600082600c546114529190613e7b565b905080341461146057600080fd5b60006114746127106112ab84611770612df8565b905060006114828383612e10565b905060006114986127106112ab84610dac612df8565b905060006114a68383612e10565b6010549091506114bf906001600160a01b031682612e1c565b600f546114d5906001600160a01b031683612e1c565b6012546014546114f1916001600160a01b039081169116612e81565b60115460145461150d916001600160a01b039081169116612e81565b601354601454611529916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157957600080fd5b505af115801561158d573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156115e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160b9190613eb1565b5091509150600061161b87612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a59190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e337009350908216911685856000803061173b42601e613d06565b6040518963ffffffff1660e01b815260040161175e989796959493929190613f1a565b6060604051808303816000875af115801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190613f63565b5050506117ae338c61306e565b5050505050505050505050565b6000805481906117d6906001906001600160801b0316613f91565b6001600160801b031690506000805b8281101561186457600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061185b578583036118545750949350505050565b6001909201915b506001016117e5565b506040516329c8c00760e21b815260040160405180910390fd5b6007546001600160a01b031633146118a85760405162461bcd60e51b815260040161120090613e2f565b60086113a08282613fff565b8051600d546118c39190613e7b565b34146118ce57600080fd5b60008151600d546118df9190613e7b565b905060005b8251811015611a7057336001600160a01b031661191984838151811061190c5761190c613d37565b6020026020010151611e35565b6001600160a01b03161461193f5760405162461bcd60e51b8152600401611200906140be565b6017600084838151811061195557611955613d37565b60209081029190910181015182528101919091526040016000205460ff16156119ae5760405162461bcd60e51b815260206004820152600b60248201526a1d5b9858dd1a5d985d195960aa1b6044820152606401611200565b43601860008584815181106119c5576119c5613d37565b6020026020010151815260200190815260200160002060020181905550600e54601860008584815181106119fb576119fb613d37565b6020026020010151815260200190815260200160002060030181905550600160176000858481518110611a3057611a30613d37565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a6890613d1e565b9150506118e4565b50601254601454611a8d916001600160a01b039081169116612e81565b601154601454611aa9916001600160a01b039081169116612e81565b601354601454611ac5916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190613eb1565b50915091506000611bb784612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e3370093509082169116858560008030611cd742601e613d06565b6040518963ffffffff1660e01b8152600401611cfa989796959493929190613f1a565b6060604051808303816000875af1158015611d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3d9190613f63565b505050505050505050565b6000611d5382612a13565b905060005b8251811015610cf557336001600160a01b0316611d8084838151811061190c5761190c613d37565b6001600160a01b031614611da65760405162461bcd60e51b8152600401611200906140be565b8160186000858481518110611dbd57611dbd613d37565b602002602001015181526020019081526020016000206000016000828254611de59190613d06565b90915550819050611df581613d1e565b915050611d58565b6007546001600160a01b03163314611e275760405162461bcd60e51b815260040161120090613e2f565b600e92909255600b55600d55565b6000611e4082613088565b5192915050565b60088054611e5490613cbc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090613cbc565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081565b6000600c5482610b0f9190613e7b565b60006001600160a01b038216611f0e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b03163314611f5d5760405162461bcd60e51b815260040161120090613e2f565b611f6760006131aa565b565b606060028054610b2490613cbc565b6000805b825181101561206357336001600160a01b0316611fa484838151811061190c5761190c613d37565b6001600160a01b031614611fca5760405162461bcd60e51b8152600401611200906140be565b611fec838281518110611fdf57611fdf613d37565b602002602001015161127d565b611ff69083613d06565b915061200d838281518110611fdf57611fdf613d37565b6018600085848151811061202357612023613d37565b60200260200101518152602001908152602001600020600001600082825461204b9190613d06565b9091555081905061205b81613d1e565b915050611f7c565b506019546040516304925c1d60e21b8152306004820152602481018390526001600160a01b0390911690631249707490604401600060405180830381600087803b1580156120b057600080fd5b505af11580156120c4573d6000803e3d6000fd5b50506012546014546120e493506001600160a01b03918216925016612e81565b610c738184336131fc565b6007546001600160a01b031633146121195760405162461bcd60e51b815260040161120090613e2f565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612160573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121849190613f01565b9050806000036121e65760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201526662616c616e636560c81b6064820152608401611200565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044015b6020604051808303816000875af1158015612234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7391906140e5565b6000612262610d5f565b600a549091506122728383613d06565b11156122aa5760405162461bcd60e51b815260206004820152600760248201526614dbdb1913d55560ca1b6044820152606401611200565b600082600b546122ba9190613e7b565b90508034146122c857600080fd5b60006122dc6127106112ab84611770612df8565b905060006122ea8383612e10565b905060006114986127106112ab84611194612df8565b336001600160a01b038316036123295760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146123bf5760405162461bcd60e51b815260040161120090613e2f565b80518251146124015760405162461bcd60e51b815260206004820152600e60248201526d746f6b656e20616e642072616e6b60901b6044820152606401611200565b60005b8251811015610c735781818151811061241f5761241f613d37565b60200260200101516018600085848151811061243d5761243d613d37565b6020026020010151815260200190815260200160002060010181905550808061246590613d1e565b915050612404565b612478848484612bdb565b612484848484846133c5565b6124a1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146124d15760405162461bcd60e51b815260040161120090613e2f565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401610d29565b60098054611e5490613cbc565b606061252282612b4b565b6125865760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611200565b60006125906134c8565b905060008151116125b057604051806020016040528060008152506125de565b806125ba846134d7565b60096040516020016125ce93929190614102565b6040516020818303038152906040525b9392505050565b6007546001600160a01b0316331461260f5760405162461bcd60e51b815260040161120090613e2f565b60096113a08282613fff565b6000600d5482610b0f9190613e7b565b3460006126406127106112ab84611770612df8565b9050600061264e8383612e10565b905060006126646127106112ab84610fa0612df8565b905060006126728383612e10565b60105490915061268b906001600160a01b031682612e1c565b600f546126a1906001600160a01b031683612e1c565b6012546014546126bd916001600160a01b039081169116612e81565b6011546014546126d9916001600160a01b039081169116612e81565b6013546014546126f5916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561274557600080fd5b505af1158015612759573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190613eb1565b509150915060006127e787612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128719190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b1580156128be57600080fd5b505af11580156128d2573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e337009350908216911685856000803061290742601e613d06565b6040518963ffffffff1660e01b815260040161292a989796959493929190613f1a565b6060604051808303816000875af1158015612949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296d9190613f63565b505050505050505050505050565b6007546001600160a01b031633146129a55760405162461bcd60e51b815260040161120090613e2f565b6001600160a01b038116612a0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611200565b61127a816131aa565b6000805b8251811015612b45576000612a99600a546112ab60186000888781518110612a4157612a41613d37565b602002602001015181526020019081526020016000206001015460186000898881518110612a7157612a71613d37565b6020026020010151815260200190815260200160002060030154612df890919063ffffffff16565b9050600060186000868581518110612ab357612ab3613d37565b602002602001015181526020019081526020016000206002015443612ad89190613e64565b90506000612ae68383612df8565b905060186000878681518110612afe57612afe613d37565b602002602001015181526020019081526020016000206000015481612b239190613e64565b612b2d9086613d06565b94505050508080612b3d90613d1e565b915050612a17565b50919050565b600080546001600160801b031682108015610b0f575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612be682613088565b80519091506000906001600160a01b0316336001600160a01b03161480612c1457508151612c1490336109d2565b80612c2f575033612c2484610ba7565b6001600160a01b0316145b905080612c4f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614612c845760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416612cab57604051633a954ecd60e21b815260040160405180910390fd5b612cbb6000848460000151612b7f565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612dae576000546001600160801b0316811015612dae57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60006125de8284613e7b565b60006125de82846141b8565b60006125de8284613e64565b6000826001600160a01b03168261c35090604051600060405180830381858888f193505050503d8060008114612e6e576040519150601f19603f3d011682016040523d82523d6000602084013e612e73565b606091505b5050905080610c7357600080fd5b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e90604401602060405180830381865afa158015612ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef19190613f01565b6000036113a05760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401612215565b6014546040805160028082526060820183526000936001600160a01b03169284929190602083019080368337505060115482519293506001600160a01b031691839150600090612f8057612f80613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612fb157612fb1613d37565b6001600160a01b03928316602091820292909201015260009083166338ed173986838530612fe042601e613d06565b6040518663ffffffff1660e01b81526004016130009594939291906141cc565b6000604051808303816000875af115801561301f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130479190810190613daa565b90508060018151811061305c5761305c613d37565b60200260200101519350505050919050565b6113a08282604051806020016040528060008152506135d7565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561319157600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061318f5780516001600160a01b031615613126579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561318a579392505050565b613126565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6013546001600160a01b039081169083160361330e576014546040805160028082526060820183526001600160a01b0390931692600092602083019080368337505060125482519293506001600160a01b03169183915060009061326257613262613d37565b6001600160a01b03928316602091820292909201015260135482519116908290600190811061329357613293613d37565b6001600160a01b0392831660209182029290920101528216635c11d79586600084876132c042601e613d06565b6040518663ffffffff1660e01b81526004016132e09594939291906141cc565b600060405180830381600087803b1580156132fa57600080fd5b505af1158015611d3d573d6000803e3d6000fd5b601454604080516003808252608082019092526001600160a01b039092169160009160208201606080368337505060125482519293506001600160a01b03169183915060009061336057613360613d37565b6001600160a01b03928316602091820292909201015260135482519116908290600190811061339157613391613d37565b60200260200101906001600160a01b031690816001600160a01b031681525050838160028151811061329357613293613d37565b60006001600160a01b0384163b156134bc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613409903390899088908890600401614208565b6020604051808303816000875af1925050508015613444575060408051601f3d908101601f1916820190925261344191810190614245565b60015b6134a2573d808015613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50805160000361349a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506134c0565b5060015b949350505050565b606060088054610b2490613cbc565b6060816000036134fe5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613528578061351281613d1e565b91506135219050600a836141b8565b9150613502565b6000816001600160401b03811115613542576135426138b9565b6040519080825280601f01601f19166020018201604052801561356c576020820181803683370190505b5090505b84156134c057613581600183613e64565b915061358e600a86614262565b613599906030613d06565b60f81b8183815181106135ae576135ae613d37565b60200101906001600160f81b031916908160001a9053506135d0600a866141b8565b9450613570565b610c7383838360016000546001600160801b03166001600160a01b03851661361157604051622e076360e81b815260040160405180910390fd5b836000036136325760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156137445760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561371a575061371860008884886133c5565b155b15613738576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016136c3565b50600080546001600160801b0319166001600160801b0392909216919091179055612df1565b6001600160e01b03198116811461127a57600080fd5b60006020828403121561379257600080fd5b81356125de8161376a565b60005b838110156137b85781810151838201526020016137a0565b838111156124a15750506000910152565b600081518084526137e181602086016020860161379d565b601f01601f19169290920160200192915050565b6020815260006125de60208301846137c9565b60006020828403121561381a57600080fd5b5035919050565b80356001600160a01b03811681146110dd57600080fd5b6000806040838503121561384b57600080fd5b61385483613821565b946020939093013593505050565b60008060006060848603121561387757600080fd5b61388084613821565b925061388e60208501613821565b9150604084013590509250925092565b6000602082840312156138b057600080fd5b6125de82613821565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138f7576138f76138b9565b604052919050565b60006001600160401b03821115613918576139186138b9565b5060051b60200190565b6000602080838503121561393557600080fd5b82356001600160401b0381111561394b57600080fd5b8301601f8101851361395c57600080fd5b803561396f61396a826138ff565b6138cf565b81815260059190911b8201830190838101908783111561398e57600080fd5b928401925b828410156139b3576139a484613821565b82529284019290840190613993565b979650505050505050565b60006001600160401b038311156139d7576139d76138b9565b6139ea601f8401601f19166020016138cf565b90508281528383830111156139fe57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613a2757600080fd5b81356001600160401b03811115613a3d57600080fd5b8201601f81018413613a4e57600080fd5b6134c0848235602084016139be565b600082601f830112613a6e57600080fd5b81356020613a7e61396a836138ff565b82815260059290921b84018101918181019086841115613a9d57600080fd5b8286015b84811015613ab85780358352918301918301613aa1565b509695505050505050565b600060208284031215613ad557600080fd5b81356001600160401b03811115613aeb57600080fd5b6134c084828501613a5d565b600080600060608486031215613b0c57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613b3657600080fd5b613b3f83613821565b915060208301356001600160401b03811115613b5a57600080fd5b613b6685828601613a5d565b9150509250929050565b801515811461127a57600080fd5b60008060408385031215613b9157600080fd5b613b9a83613821565b91506020830135613baa81613b70565b809150509250929050565b60008060408385031215613bc857600080fd5b82356001600160401b0380821115613bdf57600080fd5b613beb86838701613a5d565b93506020850135915080821115613c0157600080fd5b50613b6685828601613a5d565b60008060008060808587031215613c2457600080fd5b613c2d85613821565b9350613c3b60208601613821565b92506040850135915060608501356001600160401b03811115613c5d57600080fd5b8501601f81018713613c6e57600080fd5b613c7d878235602084016139be565b91505092959194509250565b60008060408385031215613c9c57600080fd5b613ca583613821565b9150613cb360208401613821565b90509250929050565b600181811c90821680613cd057607f821691505b602082108103612b4557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613d1957613d19613cf0565b500190565b600060018201613d3057613d30613cf0565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613d865781516001600160a01b031687529582019590820190600101613d61565b509495945050505050565b8281526040602082015260006134c06040830184613d4d565b60006020808385031215613dbd57600080fd5b82516001600160401b03811115613dd357600080fd5b8301601f81018513613de457600080fd5b8051613df261396a826138ff565b81815260059190911b82018301908381019087831115613e1157600080fd5b928401925b828410156139b357835182529284019290840190613e16565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015613e7657613e76613cf0565b500390565b6000816000190483118215151615613e9557613e95613cf0565b500290565b80516001600160701b03811681146110dd57600080fd5b600080600060608486031215613ec657600080fd5b613ecf84613e9a565b9250613edd60208501613e9a565b9150604084015163ffffffff81168114613ef657600080fd5b809150509250925092565b600060208284031215613f1357600080fd5b5051919050565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b600080600060608486031215613f7857600080fd5b8351925060208401519150604084015190509250925092565b60006001600160801b0383811690831681811015613fb157613fb1613cf0565b039392505050565b601f821115610c7357600081815260208120601f850160051c81016020861015613fe05750805b601f850160051c820191505b81811015610d5757828155600101613fec565b81516001600160401b03811115614018576140186138b9565b61402c816140268454613cbc565b84613fb9565b602080601f83116001811461406157600084156140495750858301515b600019600386901b1c1916600185901b178555610d57565b600085815260208120601f198616915b8281101561409057888601518255948401946001909101908401614071565b50858210156140ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252600d908201526c13dddb995c88125b9d985b1a59609a1b604082015260600190565b6000602082840312156140f757600080fd5b81516125de81613b70565b6000845160206141158285838a0161379d565b8551918401916141288184848a0161379d565b855492019160009061413981613cbc565b60018281168015614151576001811461416657614192565b60ff1984168752821515830287019450614192565b896000528560002060005b8481101561418a57815489820152908301908701614171565b505082870194505b50929a9950505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826141c7576141c76141a2565b500490565b85815284602082015260a0604082015260006141eb60a0830186613d4d565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061423b908301846137c9565b9695505050505050565b60006020828403121561425757600080fd5b81516125de8161376a565b600082614271576142716141a2565b50069056fea26469706673582212205c0f5021331fc1bafc99467030af874ca8cc5aec43c8af313f95d9b1e446931364736f6c634300080f003368747470733a2f2f6e7963332e6469676974616c6f6365616e7370616365732e636f6d2f63726f6e6f736261792f63726f7275736a736f6e2f
Deployed Bytecode
0x6080604052600436106103765760003560e01c80636d4f819c116101d1578063b260c42a11610102578063da3ef23f116100a0578063f2fde38b1161006f578063f2fde38b14610a28578063f490177214610a48578063f887ea4014610a68578063fc0c546a14610a8857600080fd5b8063da3ef23f14610997578063e985e9c5146109b7578063edf8d6a914610a00578063f053dc5c14610a2057600080fd5b8063c6682862116100dc578063c66828621461091c578063c87b56dd14610931578063c9b5bb1714610951578063d5abeb011461098157600080fd5b8063b260c42a146108ac578063b88d4fde146108dc578063bb0fd147146108fc57600080fd5b80639a3609131161016f578063a22cb46511610149578063a22cb465146107ea578063ae3d54141461080a578063af2dd0e61461086c578063afc16d331461088c57600080fd5b80639a360913146107975780639be65a60146107b7578063a0712d68146107d757600080fd5b806378e064c5116101ab57806378e064c51461072e5780638da5cb5b1461074457806391cca3db1461076257806395d89b411461078257600080fd5b80636d4f819c146106d957806370a08231146106f9578063715018a61461071957600080fd5b8063402eadd6116102ab57806355f804b3116102495780635eac6239116102235780635eac6239146106645780636266a39f146106845780636352211e146106a45780636c0360eb146106c457600080fd5b806355f804b314610611578063588a3ccb146106315780635aa136201461064457600080fd5b8063473a6d5211610285578063473a6d52146105a857806347d6b593146105c85780634acf32ea146105db5780634f6ccce7146105f157600080fd5b8063402eadd61461054857806340eedabb1461056857806342842e0e1461058857600080fd5b8063228cb733116103185780632f745c59116102f25780632f745c59146104d0578063372c12b1146104f05780633ccfd60b146105205780633cd972ac1461052857600080fd5b8063228cb7331461047a57806323b872dd146104905780632710c470146104b057600080fd5b8063095ea7b311610354578063095ea7b31461040a5780630b83a7271461042c57806313faede61461044157806318160ddd1461046557600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613780565b610aa8565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610b15565b6040516103a791906137f5565b3480156103de57600080fd5b506103f26103ed366004613808565b610ba7565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a610425366004613838565b610beb565b005b34801561043857600080fd5b5061042a610c78565b34801561044d57600080fd5b50610457600b5481565b6040519081526020016103a7565b34801561047157600080fd5b50610457610d5f565b34801561048657600080fd5b50610457600e5481565b34801561049c57600080fd5b5061042a6104ab366004613862565b610d82565b3480156104bc57600080fd5b506104576104cb36600461389e565b610d8d565b3480156104dc57600080fd5b506104576104eb366004613838565b6110e2565b3480156104fc57600080fd5b5061039b61050b36600461389e565b60156020526000908152604090205460ff1681565b61042a6111d6565b34801561053457600080fd5b50610457610543366004613808565b61127d565b34801561055457600080fd5b5061042a610563366004613922565b61130e565b34801561057457600080fd5b506010546103f2906001600160a01b031681565b34801561059457600080fd5b5061042a6105a3366004613862565b6113a4565b3480156105b457600080fd5b506104576105c3366004613808565b6113bf565b61042a6105d6366004613808565b6113cf565b3480156105e757600080fd5b50610457600c5481565b3480156105fd57600080fd5b5061045761060c366004613808565b6117bb565b34801561061d57600080fd5b5061042a61062c366004613a15565b61187e565b61042a61063f366004613ac3565b6118b4565b34801561065057600080fd5b506013546103f2906001600160a01b031681565b34801561067057600080fd5b5061042a61067f366004613ac3565b611d48565b34801561069057600080fd5b5061042a61069f366004613af7565b611dfd565b3480156106b057600080fd5b506103f26106bf366004613808565b611e35565b3480156106d057600080fd5b506103c5611e47565b3480156106e557600080fd5b506104576106f4366004613808565b611ed5565b34801561070557600080fd5b5061045761071436600461389e565b611ee5565b34801561072557600080fd5b5061042a611f33565b34801561073a57600080fd5b50610457600d5481565b34801561075057600080fd5b506007546001600160a01b03166103f2565b34801561076e57600080fd5b50600f546103f2906001600160a01b031681565b34801561078e57600080fd5b506103c5611f69565b3480156107a357600080fd5b5061042a6107b2366004613b23565b611f78565b3480156107c357600080fd5b5061042a6107d236600461389e565b6120ef565b61042a6107e5366004613808565b612258565b3480156107f657600080fd5b5061042a610805366004613b7e565b612300565b34801561081657600080fd5b5061084c610825366004613808565b60186020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a7565b34801561087857600080fd5b506011546103f2906001600160a01b031681565b34801561089857600080fd5b5061042a6108a7366004613bb5565b612395565b3480156108b857600080fd5b5061039b6108c7366004613808565b60176020526000908152604090205460ff1681565b3480156108e857600080fd5b5061042a6108f7366004613c0e565b61246d565b34801561090857600080fd5b5061042a610917366004613838565b6124a7565b34801561092857600080fd5b506103c561250a565b34801561093d57600080fd5b506103c561094c366004613808565b612517565b34801561095d57600080fd5b5061039b61096c36600461389e565b60166020526000908152604090205460ff1681565b34801561098d57600080fd5b50610457600a5481565b3480156109a357600080fd5b5061042a6109b2366004613a15565b6125e5565b3480156109c357600080fd5b5061039b6109d2366004613c89565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0c57600080fd5b50610457610a1b366004613808565b61261b565b61042a61262b565b348015610a3457600080fd5b5061042a610a4336600461389e565b61297b565b348015610a5457600080fd5b50610457610a63366004613ac3565b612a13565b348015610a7457600080fd5b506014546103f2906001600160a01b031681565b348015610a9457600080fd5b506012546103f2906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610ad957506001600160e01b03198216635b5e139f60e01b145b80610af457506001600160e01b0319821663780e9d6360e01b145b80610b0f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b2490613cbc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5090613cbc565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb282612b4b565b610bcf576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610bf682611e35565b9050806001600160a01b0316836001600160a01b031603610c2a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c4a5750610c4881336109d2565b155b15610c68576040516367d9dca160e11b815260040160405180910390fd5b610c73838383612b7f565b505050565b6000610c8333611ee5565b90506000805b82811015610cf5576000610c9d33836110e2565b9050610ca88161127d565b610cb29084613d06565b9250610cbd8161127d565b60008281526018602052604081208054909190610cdb908490613d06565b90915550829150610ced905081613d1e565b915050610c89565b506019546040516304925c1d60e21b8152336004820152602481018390526001600160a01b03909116906312497074906044015b600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b505050505050565b6000546001600160801b03600160801b8204811691811691909103600019011690565b610c73838383612bdb565b6013546000906001600160a01b0390811690831603610f30576014546040805160028082526060820183526001600160a01b0390931692600092602083019080368337505060125482519293506001600160a01b031691839150600090610df657610df6613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110610e2757610e27613d37565b60200260200101906001600160a01b031690816001600160a01b0316815250506000610e5233611ee5565b90506000805b82811015610e97576000610e6c33836110e2565b9050610e778161127d565b610e819084613d06565b9250508080610e8f90613d1e565b915050610e58565b5060405163d06ca61f60e01b81526001600160a01b0385169063d06ca61f90610ec69084908790600401613d91565b600060405180830381865afa158015610ee3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0b9190810190613daa565b600181518110610f1d57610f1d613d37565b6020026020010151945050505050919050565b601454604080516003808252608082019092526001600160a01b039092169160009160208201606080368337505060125482519293506001600160a01b031691839150600090610f8257610f82613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110610fb357610fb3613d37565b60200260200101906001600160a01b031690816001600160a01b0316815250508381600281518110610fe757610fe7613d37565b60200260200101906001600160a01b031690816001600160a01b031681525050600061101233611ee5565b90506000805b8281101561105757600061102c33836110e2565b90506110378161127d565b6110419084613d06565b925050808061104f90613d1e565b915050611018565b5060405163d06ca61f60e01b81526001600160a01b0385169063d06ca61f906110869084908790600401613d91565b600060405180830381865afa1580156110a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110cb9190810190613daa565b600281518110610f1d57610f1d613d37565b919050565b60006110ed83611ee5565b821061110c576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561037657600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061118457506111ce565b80516001600160a01b03161561119957805192505b876001600160a01b0316836001600160a01b0316036111cc578684036111c557509350610b0f92505050565b6001909301925b505b60010161111d565b6007546001600160a01b031633146112095760405162461bcd60e51b815260040161120090613e2f565b60405180910390fd5b600061121d6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611267576040519150601f19603f3d011682016040523d82523d6000602084013e61126c565b606091505b505090508061127a57600080fd5b50565b600a5460008281526018602052604081206001810154600390910154919283926112b1926112ab9190612df8565b90612e04565b600084815260186020526040812060020154919250906112d19043613e64565b905060006112df8383612df8565b6000868152601860205260409020549091506112fb9082613e64565b6113059085613d06565b95945050505050565b6007546001600160a01b031633146113385760405162461bcd60e51b815260040161120090613e2f565b60005b81518110156113a05760016015600084848151811061135c5761135c613d37565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061139881613d1e565b91505061133b565b5050565b610c738383836040518060200160405280600081525061246d565b6000600b5482610b0f9190613e7b565b60006113d9610d5f565b3360009081526015602052604090205490915060ff1615156001146113fd57600080fd5b600a5461140a8383613d06565b11156114425760405162461bcd60e51b815260206004820152600760248201526614dbdb1913d55560ca1b6044820152606401611200565b600082600c546114529190613e7b565b905080341461146057600080fd5b60006114746127106112ab84611770612df8565b905060006114828383612e10565b905060006114986127106112ab84610dac612df8565b905060006114a68383612e10565b6010549091506114bf906001600160a01b031682612e1c565b600f546114d5906001600160a01b031683612e1c565b6012546014546114f1916001600160a01b039081169116612e81565b60115460145461150d916001600160a01b039081169116612e81565b601354601454611529916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157957600080fd5b505af115801561158d573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156115e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160b9190613eb1565b5091509150600061161b87612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a59190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e337009350908216911685856000803061173b42601e613d06565b6040518963ffffffff1660e01b815260040161175e989796959493929190613f1a565b6060604051808303816000875af115801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190613f63565b5050506117ae338c61306e565b5050505050505050505050565b6000805481906117d6906001906001600160801b0316613f91565b6001600160801b031690506000805b8281101561186457600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061185b578583036118545750949350505050565b6001909201915b506001016117e5565b506040516329c8c00760e21b815260040160405180910390fd5b6007546001600160a01b031633146118a85760405162461bcd60e51b815260040161120090613e2f565b60086113a08282613fff565b8051600d546118c39190613e7b565b34146118ce57600080fd5b60008151600d546118df9190613e7b565b905060005b8251811015611a7057336001600160a01b031661191984838151811061190c5761190c613d37565b6020026020010151611e35565b6001600160a01b03161461193f5760405162461bcd60e51b8152600401611200906140be565b6017600084838151811061195557611955613d37565b60209081029190910181015182528101919091526040016000205460ff16156119ae5760405162461bcd60e51b815260206004820152600b60248201526a1d5b9858dd1a5d985d195960aa1b6044820152606401611200565b43601860008584815181106119c5576119c5613d37565b6020026020010151815260200190815260200160002060020181905550600e54601860008584815181106119fb576119fb613d37565b6020026020010151815260200190815260200160002060030181905550600160176000858481518110611a3057611a30613d37565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a6890613d1e565b9150506118e4565b50601254601454611a8d916001600160a01b039081169116612e81565b601154601454611aa9916001600160a01b039081169116612e81565b601354601454611ac5916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190613eb1565b50915091506000611bb784612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e3370093509082169116858560008030611cd742601e613d06565b6040518963ffffffff1660e01b8152600401611cfa989796959493929190613f1a565b6060604051808303816000875af1158015611d19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3d9190613f63565b505050505050505050565b6000611d5382612a13565b905060005b8251811015610cf557336001600160a01b0316611d8084838151811061190c5761190c613d37565b6001600160a01b031614611da65760405162461bcd60e51b8152600401611200906140be565b8160186000858481518110611dbd57611dbd613d37565b602002602001015181526020019081526020016000206000016000828254611de59190613d06565b90915550819050611df581613d1e565b915050611d58565b6007546001600160a01b03163314611e275760405162461bcd60e51b815260040161120090613e2f565b600e92909255600b55600d55565b6000611e4082613088565b5192915050565b60088054611e5490613cbc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8090613cbc565b8015611ecd5780601f10611ea257610100808354040283529160200191611ecd565b820191906000526020600020905b815481529060010190602001808311611eb057829003601f168201915b505050505081565b6000600c5482610b0f9190613e7b565b60006001600160a01b038216611f0e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b6007546001600160a01b03163314611f5d5760405162461bcd60e51b815260040161120090613e2f565b611f6760006131aa565b565b606060028054610b2490613cbc565b6000805b825181101561206357336001600160a01b0316611fa484838151811061190c5761190c613d37565b6001600160a01b031614611fca5760405162461bcd60e51b8152600401611200906140be565b611fec838281518110611fdf57611fdf613d37565b602002602001015161127d565b611ff69083613d06565b915061200d838281518110611fdf57611fdf613d37565b6018600085848151811061202357612023613d37565b60200260200101518152602001908152602001600020600001600082825461204b9190613d06565b9091555081905061205b81613d1e565b915050611f7c565b506019546040516304925c1d60e21b8152306004820152602481018390526001600160a01b0390911690631249707490604401600060405180830381600087803b1580156120b057600080fd5b505af11580156120c4573d6000803e3d6000fd5b50506012546014546120e493506001600160a01b03918216925016612e81565b610c738184336131fc565b6007546001600160a01b031633146121195760405162461bcd60e51b815260040161120090613e2f565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612160573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121849190613f01565b9050806000036121e65760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201526662616c616e636560c81b6064820152608401611200565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044015b6020604051808303816000875af1158015612234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7391906140e5565b6000612262610d5f565b600a549091506122728383613d06565b11156122aa5760405162461bcd60e51b815260206004820152600760248201526614dbdb1913d55560ca1b6044820152606401611200565b600082600b546122ba9190613e7b565b90508034146122c857600080fd5b60006122dc6127106112ab84611770612df8565b905060006122ea8383612e10565b905060006114986127106112ab84611194612df8565b336001600160a01b038316036123295760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146123bf5760405162461bcd60e51b815260040161120090613e2f565b80518251146124015760405162461bcd60e51b815260206004820152600e60248201526d746f6b656e20616e642072616e6b60901b6044820152606401611200565b60005b8251811015610c735781818151811061241f5761241f613d37565b60200260200101516018600085848151811061243d5761243d613d37565b6020026020010151815260200190815260200160002060010181905550808061246590613d1e565b915050612404565b612478848484612bdb565b612484848484846133c5565b6124a1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146124d15760405162461bcd60e51b815260040161120090613e2f565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401610d29565b60098054611e5490613cbc565b606061252282612b4b565b6125865760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611200565b60006125906134c8565b905060008151116125b057604051806020016040528060008152506125de565b806125ba846134d7565b60096040516020016125ce93929190614102565b6040516020818303038152906040525b9392505050565b6007546001600160a01b0316331461260f5760405162461bcd60e51b815260040161120090613e2f565b60096113a08282613fff565b6000600d5482610b0f9190613e7b565b3460006126406127106112ab84611770612df8565b9050600061264e8383612e10565b905060006126646127106112ab84610fa0612df8565b905060006126728383612e10565b60105490915061268b906001600160a01b031682612e1c565b600f546126a1906001600160a01b031683612e1c565b6012546014546126bd916001600160a01b039081169116612e81565b6011546014546126d9916001600160a01b039081169116612e81565b6013546014546126f5916001600160a01b039081169116612e81565b601160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561274557600080fd5b505af1158015612759573d6000803e3d6000fd5b505050505060008073dfd9dadf4e58c70560b1c45545a87edea17785626001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190613eb1565b509150915060006127e787612f2e565b601454604051632b58577b60e21b8152600481018390526001600160701b038086166024830152861660448201529192506000916001600160a01b039091169063ad615dec90606401602060405180830381865afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128719190613f01565b6019546040516304925c1d60e21b8152306004820152602481018390529192506001600160a01b031690631249707490604401600060405180830381600087803b1580156128be57600080fd5b505af11580156128d2573d6000803e3d6000fd5b50506014546013546012546001600160a01b03928316945063e8e337009350908216911685856000803061290742601e613d06565b6040518963ffffffff1660e01b815260040161292a989796959493929190613f1a565b6060604051808303816000875af1158015612949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296d9190613f63565b505050505050505050505050565b6007546001600160a01b031633146129a55760405162461bcd60e51b815260040161120090613e2f565b6001600160a01b038116612a0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611200565b61127a816131aa565b6000805b8251811015612b45576000612a99600a546112ab60186000888781518110612a4157612a41613d37565b602002602001015181526020019081526020016000206001015460186000898881518110612a7157612a71613d37565b6020026020010151815260200190815260200160002060030154612df890919063ffffffff16565b9050600060186000868581518110612ab357612ab3613d37565b602002602001015181526020019081526020016000206002015443612ad89190613e64565b90506000612ae68383612df8565b905060186000878681518110612afe57612afe613d37565b602002602001015181526020019081526020016000206000015481612b239190613e64565b612b2d9086613d06565b94505050508080612b3d90613d1e565b915050612a17565b50919050565b600080546001600160801b031682108015610b0f575050600090815260036020526040902054600160e01b900460ff161590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612be682613088565b80519091506000906001600160a01b0316336001600160a01b03161480612c1457508151612c1490336109d2565b80612c2f575033612c2484610ba7565b6001600160a01b0316145b905080612c4f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614612c845760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416612cab57604051633a954ecd60e21b815260040160405180910390fd5b612cbb6000848460000151612b7f565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116612dae576000546001600160801b0316811015612dae57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60006125de8284613e7b565b60006125de82846141b8565b60006125de8284613e64565b6000826001600160a01b03168261c35090604051600060405180830381858888f193505050503d8060008114612e6e576040519150601f19603f3d011682016040523d82523d6000602084013e612e73565b606091505b5050905080610c7357600080fd5b604051636eb1769f60e11b81523060048201526001600160a01b03828116602483015283169063dd62ed3e90604401602060405180830381865afa158015612ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef19190613f01565b6000036113a05760405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015283169063095ea7b390604401612215565b6014546040805160028082526060820183526000936001600160a01b03169284929190602083019080368337505060115482519293506001600160a01b031691839150600090612f8057612f80613d37565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612fb157612fb1613d37565b6001600160a01b03928316602091820292909201015260009083166338ed173986838530612fe042601e613d06565b6040518663ffffffff1660e01b81526004016130009594939291906141cc565b6000604051808303816000875af115801561301f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130479190810190613daa565b90508060018151811061305c5761305c613d37565b60200260200101519350505050919050565b6113a08282604051806020016040528060008152506135d7565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561319157600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061318f5780516001600160a01b031615613126579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561318a579392505050565b613126565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6013546001600160a01b039081169083160361330e576014546040805160028082526060820183526001600160a01b0390931692600092602083019080368337505060125482519293506001600160a01b03169183915060009061326257613262613d37565b6001600160a01b03928316602091820292909201015260135482519116908290600190811061329357613293613d37565b6001600160a01b0392831660209182029290920101528216635c11d79586600084876132c042601e613d06565b6040518663ffffffff1660e01b81526004016132e09594939291906141cc565b600060405180830381600087803b1580156132fa57600080fd5b505af1158015611d3d573d6000803e3d6000fd5b601454604080516003808252608082019092526001600160a01b039092169160009160208201606080368337505060125482519293506001600160a01b03169183915060009061336057613360613d37565b6001600160a01b03928316602091820292909201015260135482519116908290600190811061339157613391613d37565b60200260200101906001600160a01b031690816001600160a01b031681525050838160028151811061329357613293613d37565b60006001600160a01b0384163b156134bc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613409903390899088908890600401614208565b6020604051808303816000875af1925050508015613444575060408051601f3d908101601f1916820190925261344191810190614245565b60015b6134a2573d808015613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50805160000361349a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506134c0565b5060015b949350505050565b606060088054610b2490613cbc565b6060816000036134fe5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613528578061351281613d1e565b91506135219050600a836141b8565b9150613502565b6000816001600160401b03811115613542576135426138b9565b6040519080825280601f01601f19166020018201604052801561356c576020820181803683370190505b5090505b84156134c057613581600183613e64565b915061358e600a86614262565b613599906030613d06565b60f81b8183815181106135ae576135ae613d37565b60200101906001600160f81b031916908160001a9053506135d0600a866141b8565b9450613570565b610c7383838360016000546001600160801b03166001600160a01b03851661361157604051622e076360e81b815260040160405180910390fd5b836000036136325760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156137445760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561371a575061371860008884886133c5565b155b15613738576040516368d2bf6b60e11b815260040160405180910390fd5b600191820191016136c3565b50600080546001600160801b0319166001600160801b0392909216919091179055612df1565b6001600160e01b03198116811461127a57600080fd5b60006020828403121561379257600080fd5b81356125de8161376a565b60005b838110156137b85781810151838201526020016137a0565b838111156124a15750506000910152565b600081518084526137e181602086016020860161379d565b601f01601f19169290920160200192915050565b6020815260006125de60208301846137c9565b60006020828403121561381a57600080fd5b5035919050565b80356001600160a01b03811681146110dd57600080fd5b6000806040838503121561384b57600080fd5b61385483613821565b946020939093013593505050565b60008060006060848603121561387757600080fd5b61388084613821565b925061388e60208501613821565b9150604084013590509250925092565b6000602082840312156138b057600080fd5b6125de82613821565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138f7576138f76138b9565b604052919050565b60006001600160401b03821115613918576139186138b9565b5060051b60200190565b6000602080838503121561393557600080fd5b82356001600160401b0381111561394b57600080fd5b8301601f8101851361395c57600080fd5b803561396f61396a826138ff565b6138cf565b81815260059190911b8201830190838101908783111561398e57600080fd5b928401925b828410156139b3576139a484613821565b82529284019290840190613993565b979650505050505050565b60006001600160401b038311156139d7576139d76138b9565b6139ea601f8401601f19166020016138cf565b90508281528383830111156139fe57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613a2757600080fd5b81356001600160401b03811115613a3d57600080fd5b8201601f81018413613a4e57600080fd5b6134c0848235602084016139be565b600082601f830112613a6e57600080fd5b81356020613a7e61396a836138ff565b82815260059290921b84018101918181019086841115613a9d57600080fd5b8286015b84811015613ab85780358352918301918301613aa1565b509695505050505050565b600060208284031215613ad557600080fd5b81356001600160401b03811115613aeb57600080fd5b6134c084828501613a5d565b600080600060608486031215613b0c57600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613b3657600080fd5b613b3f83613821565b915060208301356001600160401b03811115613b5a57600080fd5b613b6685828601613a5d565b9150509250929050565b801515811461127a57600080fd5b60008060408385031215613b9157600080fd5b613b9a83613821565b91506020830135613baa81613b70565b809150509250929050565b60008060408385031215613bc857600080fd5b82356001600160401b0380821115613bdf57600080fd5b613beb86838701613a5d565b93506020850135915080821115613c0157600080fd5b50613b6685828601613a5d565b60008060008060808587031215613c2457600080fd5b613c2d85613821565b9350613c3b60208601613821565b92506040850135915060608501356001600160401b03811115613c5d57600080fd5b8501601f81018713613c6e57600080fd5b613c7d878235602084016139be565b91505092959194509250565b60008060408385031215613c9c57600080fd5b613ca583613821565b9150613cb360208401613821565b90509250929050565b600181811c90821680613cd057607f821691505b602082108103612b4557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613d1957613d19613cf0565b500190565b600060018201613d3057613d30613cf0565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613d865781516001600160a01b031687529582019590820190600101613d61565b509495945050505050565b8281526040602082015260006134c06040830184613d4d565b60006020808385031215613dbd57600080fd5b82516001600160401b03811115613dd357600080fd5b8301601f81018513613de457600080fd5b8051613df261396a826138ff565b81815260059190911b82018301908381019087831115613e1157600080fd5b928401925b828410156139b357835182529284019290840190613e16565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015613e7657613e76613cf0565b500390565b6000816000190483118215151615613e9557613e95613cf0565b500290565b80516001600160701b03811681146110dd57600080fd5b600080600060608486031215613ec657600080fd5b613ecf84613e9a565b9250613edd60208501613e9a565b9150604084015163ffffffff81168114613ef657600080fd5b809150509250925092565b600060208284031215613f1357600080fd5b5051919050565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b600080600060608486031215613f7857600080fd5b8351925060208401519150604084015190509250925092565b60006001600160801b0383811690831681811015613fb157613fb1613cf0565b039392505050565b601f821115610c7357600081815260208120601f850160051c81016020861015613fe05750805b601f850160051c820191505b81811015610d5757828155600101613fec565b81516001600160401b03811115614018576140186138b9565b61402c816140268454613cbc565b84613fb9565b602080601f83116001811461406157600084156140495750858301515b600019600386901b1c1916600185901b178555610d57565b600085815260208120601f198616915b8281101561409057888601518255948401946001909101908401614071565b50858210156140ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252600d908201526c13dddb995c88125b9d985b1a59609a1b604082015260600190565b6000602082840312156140f757600080fd5b81516125de81613b70565b6000845160206141158285838a0161379d565b8551918401916141288184848a0161379d565b855492019160009061413981613cbc565b60018281168015614151576001811461416657614192565b60ff1984168752821515830287019450614192565b896000528560002060005b8481101561418a57815489820152908301908701614171565b505082870194505b50929a9950505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826141c7576141c76141a2565b500490565b85815284602082015260a0604082015260006141eb60a0830186613d4d565b6001600160a01b0394909416606083015250608001529392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061423b908301846137c9565b9695505050505050565b60006020828403121561425757600080fd5b81516125de8161376a565b600082614271576142716141a2565b50069056fea26469706673582212205c0f5021331fc1bafc99467030af874ca8cc5aec43c8af313f95d9b1e446931364736f6c634300080f0033
Deployed Bytecode Sourcemap
63654:13622:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46604:422;;;;;;;;;;-1:-1:-1;46604:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;46604:422:0;;;;;;;;49301:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50909:246::-;;;;;;;;;;-1:-1:-1;50909:246:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;50909:246:0;1528:203:1;50469:373:0;;;;;;;;;;-1:-1:-1;50469:373:0;;;;;:::i;:::-;;:::i;:::-;;72381:412;;;;;;;;;;;;;:::i;63910:19::-;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;63910:19:0;2173:177:1;43747:282:0;;;;;;;;;;;;;:::i;64001:21::-;;;;;;;;;;;;;;;;51885:170;;;;;;;;;;-1:-1:-1;51885:170:0;;;;;:::i;:::-;;:::i;74105:1164::-;;;;;;;;;;-1:-1:-1;74105:1164:0;;;;;:::i;:::-;;:::i;45383:1148::-;;;;;;;;;;-1:-1:-1;45383:1148:0;;;;;:::i;:::-;;:::i;64471:41::-;;;;;;;;;;-1:-1:-1;64471:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;76582:155;;;:::i;70391:435::-;;;;;;;;;;-1:-1:-1;70391:435:0;;;;;:::i;:::-;;:::i;67225:167::-;;;;;;;;;;-1:-1:-1;67225:167:0;;;;;:::i;:::-;;:::i;64105:66::-;;;;;;;;;;-1:-1:-1;64105:66:0;;;;-1:-1:-1;;;;;64105:66:0;;;52127:185;;;;;;;;;;-1:-1:-1;52127:185:0;;;;;:::i;:::-;;:::i;68598:112::-;;;;;;;;;;-1:-1:-1;68598:112:0;;;;;:::i;:::-;;:::i;67400:1190::-;;;;;;:::i;:::-;;:::i;63936:20::-;;;;;;;;;;;;;;;;44323:759;;;;;;;;;;-1:-1:-1;44323:759:0;;;;;:::i;:::-;;:::i;76128:104::-;;;;;;;;;;-1:-1:-1;76128:104:0;;;;;:::i;:::-;;:::i;71203:1170::-;;;;;;:::i;:::-;;:::i;64321:64::-;;;;;;;;;;-1:-1:-1;64321:64:0;;;;-1:-1:-1;;;;;64321:64:0;;;70834:361;;;;;;;;;;-1:-1:-1;70834:361:0;;;;;:::i;:::-;;:::i;76395:181::-;;;;;;;;;;-1:-1:-1;76395:181:0;;;;;:::i;:::-;;:::i;49109:124::-;;;;;;;;;;-1:-1:-1;49109:124:0;;;;;:::i;:::-;;:::i;63803:21::-;;;;;;;;;;;;;:::i;68716:113::-;;;;;;;;;;-1:-1:-1;68716:113:0;;;;;:::i;:::-;;:::i;47091:206::-;;;;;;;;;;-1:-1:-1;47091:206:0;;;;;:::i;:::-;;:::i;16038:103::-;;;;;;;;;;;;;:::i;63963:31::-;;;;;;;;;;;;;;;;15385:87;;;;;;;;;;-1:-1:-1;15458:6:0;;-1:-1:-1;;;;;15458:6:0;15385:87;;64035:63;;;;;;;;;;-1:-1:-1;64035:63:0;;;;-1:-1:-1;;;;;64035:63:0;;;49471:104;;;;;;;;;;;;;:::i;72801:534::-;;;;;;;;;;-1:-1:-1;72801:534:0;;;;;:::i;:::-;;:::i;76743:272::-;;;;;;;;;;-1:-1:-1;76743:272:0;;;;;:::i;:::-;;:::i;65433:1135::-;;;;;;:::i;:::-;;:::i;51228:303::-;;;;;;;;;;-1:-1:-1;51228:303:0;;;;;:::i;:::-;;:::i;64613:47::-;;;;;;;;;;-1:-1:-1;64613:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7691:25:1;;;7747:2;7732:18;;7725:34;;;;7775:18;;;7768:34;7833:2;7818:18;;7811:34;7678:3;7663:19;64613:47:0;7460:391:1;64178:64:0;;;;;;;;;;-1:-1:-1;64178:64:0;;;;-1:-1:-1;;;;;64178:64:0;;;65156:271;;;;;;;;;;-1:-1:-1;65156:271:0;;;;;:::i;:::-;;:::i;64562:40::-;;;;;;;;;;-1:-1:-1;64562:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52384:342;;;;;;;;;;-1:-1:-1;52384:342:0;;;;;:::i;:::-;;:::i;77021:252::-;;;;;;;;;;-1:-1:-1;77021:252:0;;;;;:::i;:::-;;:::i;63831:37::-;;;;;;;;;;;;;:::i;75649:473::-;;;;;;;;;;-1:-1:-1;75649:473:0;;;;;:::i;:::-;;:::i;64519:36::-;;;;;;;;;;-1:-1:-1;64519:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63877:24;;;;;;;;;;;;;;;;76238:151;;;;;;;;;;-1:-1:-1;76238:151:0;;;;;:::i;:::-;;:::i;51603:214::-;;;;;;;;;;-1:-1:-1;51603:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;51774:25:0;;;51745:4;51774:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;51603:214;68835:113;;;;;;;;;;-1:-1:-1;68835:113:0;;;;;:::i;:::-;;:::i;68956:923::-;;;:::i;16297:238::-;;;;;;;;;;-1:-1:-1;16297:238:0;;;;;:::i;:::-;;:::i;69887:496::-;;;;;;;;;;-1:-1:-1;69887:496:0;;;;;:::i;:::-;;:::i;64392:66::-;;;;;;;;;;-1:-1:-1;64392:66:0;;;;-1:-1:-1;;;;;64392:66:0;;;64249:65;;;;;;;;;;-1:-1:-1;64249:65:0;;;;-1:-1:-1;;;;;64249:65:0;;;46604:422;46751:4;-1:-1:-1;;;;;;46793:40:0;;-1:-1:-1;;;46793:40:0;;:105;;-1:-1:-1;;;;;;;46850:48:0;;-1:-1:-1;;;46850:48:0;46793:105;:172;;;-1:-1:-1;;;;;;;46915:50:0;;-1:-1:-1;;;46915:50:0;46793:172;:225;;;-1:-1:-1;;;;;;;;;;27078:40:0;;;46982:36;46773:245;46604:422;-1:-1:-1;;46604:422:0:o;49301:100::-;49355:13;49388:5;49381:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49301:100;:::o;50909:246::-;51013:7;51043:16;51051:7;51043;:16::i;:::-;51038:64;;51068:34;;-1:-1:-1;;;51068:34:0;;;;;;;;;;;51038:64;-1:-1:-1;51123:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;51123:24:0;;50909:246::o;50469:373::-;50542:13;50558:24;50574:7;50558:15;:24::i;:::-;50542:40;;50603:5;-1:-1:-1;;;;;50597:11:0;:2;-1:-1:-1;;;;;50597:11:0;;50593:48;;50617:24;;-1:-1:-1;;;50617:24:0;;;;;;;;;;;50593:48;14812:10;-1:-1:-1;;;;;50659:21:0;;;;;;:63;;-1:-1:-1;50685:37:0;50702:5;14812:10;51603:214;:::i;50685:37::-;50684:38;50659:63;50655:138;;;50746:35;;-1:-1:-1;;;50746:35:0;;;;;;;;;;;50655:138;50806:28;50815:2;50819:7;50828:5;50806:8;:28::i;:::-;50531:311;50469:373;;:::o;72381:412::-;72426:10;72439:21;72449:10;72439:9;:21::i;:::-;72426:34;;72471:15;72505:6;72501:240;72521:5;72517:1;:9;72501:240;;;72547:12;72562:34;72582:10;72594:1;72562:19;:34::i;:::-;72547:49;;72623:24;72639:7;72623:15;:24::i;:::-;72611:37;;;;:::i;:::-;;;72704:24;72720:7;72704:15;:24::i;:::-;72663:20;;;;:11;:20;;;;;:66;;:20;;;:66;;;;;:::i;:::-;;;;-1:-1:-1;72528:3:0;;-1:-1:-1;72528:3:0;;-1:-1:-1;72528:3:0;;:::i;:::-;;;;72501:240;;;-1:-1:-1;72751:8:0;;:34;;-1:-1:-1;;;72751:34:0;;72765:10;72751:34;;;10357:51:1;10424:18;;;10417:34;;;-1:-1:-1;;;;;72751:8:0;;;;:13;;10330:18:1;;72751:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72415:378;;72381:412::o;43747:282::-;43800:7;43998:12;-1:-1:-1;;;;;;;;43998:12:0;;;;43977:13;;;43976:34;;;;-1:-1:-1;;43976:34:0;43969:41;;43747:282::o;51885:170::-;52019:28;52029:4;52035:2;52039:7;52019:9;:28::i;74105:1164::-;74188:4;;74160;;-1:-1:-1;;;;;74188:4:0;;;74180:12;;;;74176:1076;;74252:6;;74298:16;;;74312:1;74298:16;;;;;;;;-1:-1:-1;;;;;74252:6:0;;;;74208:22;;74298:16;;;;;;;;-1:-1:-1;;74339:5:0;;74329:7;;;;-1:-1:-1;;;;;;74339:5:0;;74329:7;;-1:-1:-1;74339:5:0;;74329:7;;;;:::i;:::-;-1:-1:-1;;;;;74329:15:0;;;:7;;;;;;;;;:15;74369:4;;74359:7;;74369:4;;;74359;;74369;;74359:7;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;74359:14:0;;;-1:-1:-1;;;;;74359:14:0;;;;;74388:10;74401:21;74411:10;74401:9;:21::i;:::-;74388:34;;74437:15;74475:6;74471:167;74491:5;74487:1;:9;74471:167;;;74521:12;74536:34;74556:10;74568:1;74536:19;:34::i;:::-;74521:49;;74601:24;74617:7;74601:15;:24::i;:::-;74589:37;;;;:::i;:::-;;;74502:136;74498:3;;;;;:::i;:::-;;;;74471:167;;;-1:-1:-1;74655:32:0;;-1:-1:-1;;;74655:32:0;;-1:-1:-1;;;;;74655:17:0;;;;;:32;;74673:7;;74682:4;;74655:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74655:32:0;;;;;;;;;;;;:::i;:::-;74688:1;74655:35;;;;;;;;:::i;:::-;;;;;;;74648:42;;;;;;74105:1164;;;:::o;74176:1076::-;74765:6;;74811:16;;;74825:1;74811:16;;;;;;;;;-1:-1:-1;;;;;74765:6:0;;;;74721:22;;74811:16;;;;;;;;-1:-1:-1;;74852:5:0;;74842:7;;;;-1:-1:-1;;;;;;74852:5:0;;74842:7;;-1:-1:-1;74852:5:0;;74842:7;;;;:::i;:::-;-1:-1:-1;;;;;74842:15:0;;;:7;;;;;;;;;:15;74882:4;;74872:7;;74882:4;;;74872;;74882;;74872:7;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;74872:14:0;;;-1:-1:-1;;;;;74872:14:0;;;;;74911:4;74901;74906:1;74901:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;74901:14:0;;;-1:-1:-1;;;;;74901:14:0;;;;;74930:10;74943:21;74953:10;74943:9;:21::i;:::-;74930:34;;74979:15;75017:6;75013:171;75033:5;75029:1;:9;75013:171;;;75063:12;75078:34;75098:10;75110:1;75078:19;:34::i;:::-;75063:49;;75143:24;75159:7;75143:15;:24::i;:::-;75131:37;;;;:::i;:::-;;;75044:140;75040:3;;;;;:::i;:::-;;;;75013:171;;;-1:-1:-1;75205:32:0;;-1:-1:-1;;;75205:32:0;;-1:-1:-1;;;;;75205:17:0;;;;;:32;;75223:7;;75232:4;;75205:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75205:32:0;;;;;;;;;;;;:::i;:::-;75238:1;75205:35;;;;;;;;:::i;74176:1076::-;74105:1164;;;:::o;45383:1148::-;45508:7;45546:16;45556:5;45546:9;:16::i;:::-;45537:5;:25;45533:61;;45571:23;;-1:-1:-1;;;45571:23:0;;;;;;;;;;;45533:61;45605:22;45630:13;;-1:-1:-1;;;;;45630:13:0;;45605:22;;45881:557;45901:14;45897:1;:18;45881:557;;;45941:31;45975:14;;;:11;:14;;;;;;;;;45941:48;;;;;;;;;-1:-1:-1;;;;;45941:48:0;;;;-1:-1:-1;;;45941:48:0;;-1:-1:-1;;;;;45941:48:0;;;;;;;;-1:-1:-1;;;45941:48:0;;;;;;;;;;;;;;;;46008:73;;46053:8;;;46008:73;46103:14;;-1:-1:-1;;;;;46103:28:0;;46099:111;;46176:14;;;-1:-1:-1;46099:111:0;46253:5;-1:-1:-1;;;;;46232:26:0;:17;-1:-1:-1;;;;;46232:26:0;;46228:195;;46302:5;46287:11;:20;46283:85;;-1:-1:-1;46343:1:0;-1:-1:-1;46336:8:0;;-1:-1:-1;;;46336:8:0;46283:85;46390:13;;;;;46228:195;45922:516;45881:557;45917:3;;45881:557;;76582:155;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;;;;;;;;;76639:7:::1;76660;15458:6:::0;;-1:-1:-1;;;;;15458:6:0;;15385:87;76660:7:::1;-1:-1:-1::0;;;;;76652:21:0::1;76681;76652:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76638:69;;;76726:2;76718:11;;;::::0;::::1;;76627:110;76582:155::o:0;70391:435::-;70623:9;;70489:15;70579:28;;;:11;:28;;;;;:38;;;;70536;;;;;70489:15;;;;70536:97;;:82;;:38;:42;:82::i;:::-;:86;;:97::i;:::-;70644:11;70673:28;;;:11;:28;;;;;:38;;;70522:111;;-1:-1:-1;70644:11:0;70658:53;;:12;:53;:::i;:::-;70644:67;-1:-1:-1;70722:10:0;70735:12;:3;70644:67;70735:7;:12::i;:::-;70774:28;;;;:11;:28;;;;;:44;70722:25;;-1:-1:-1;70769:49:0;;70722:25;70769:49;:::i;:::-;70758:60;;;;:::i;:::-;;70391:435;-1:-1:-1;;;;;70391:435:0:o;67225:167::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;67298:9:::1;67293:92;67317:3;:10;67313:1;:14;67293:92;;;67369:4;67349:9;:17;67359:3;67363:1;67359:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;67349:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;67349:17:0;:24;;-1:-1:-1;;67349:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67329:3;::::1;::::0;::::1;:::i;:::-;;;;67293:92;;;;67225:167:::0;:::o;52127:185::-;52265:39;52282:4;52288:2;52292:7;52265:39;;;;;;;;;;;;:16;:39::i;68598:112::-;68658:7;68698:4;;68684:11;:18;;;;:::i;67400:1190::-;67467:14;67484:13;:11;:13::i;:::-;67526:10;67516:21;;;;:9;:21;;;;;;67467:30;;-1:-1:-1;67516:21:0;;:29;;:21;:29;67508:38;;;;;;67589:9;;67565:20;67574:11;67565:6;:20;:::i;:::-;:33;;67557:53;;;;-1:-1:-1;;;67557:53:0;;13359:2:1;67557:53:0;;;13341:21:1;13398:1;13378:18;;;13371:29;-1:-1:-1;;;13416:18:1;;;13409:37;13463:18;;67557:53:0;13157:330:1;67557:53:0;67621:13;67645:11;67637:5;;:19;;;;:::i;:::-;67621:35;;67688:5;67675:9;:18;67667:27;;;;;;67705:10;67718:26;67738:5;67718:15;:5;67728:4;67718:9;:15::i;:26::-;67705:39;-1:-1:-1;67755:10:0;67768:13;:5;67705:39;67768:9;:13::i;:::-;67755:26;-1:-1:-1;67792:11:0;67806:23;67823:5;67806:12;67755:26;67813:4;67806:6;:12::i;:23::-;67792:37;-1:-1:-1;67840:11:0;67854;:2;67792:37;67854:6;:11::i;:::-;67884:6;;67840:25;;-1:-1:-1;67876:20:0;;-1:-1:-1;;;;;67884:6:0;67840:25;67876:7;:20::i;:::-;67915:3;;67907:17;;-1:-1:-1;;;;;67915:3:0;67920;67907:7;:17::i;:::-;67957:5;;67964:6;;67935:36;;-1:-1:-1;;;;;67957:5:0;;;;67964:6;67935:21;:36::i;:::-;68004:4;;68010:6;;67982:35;;-1:-1:-1;;;;;68004:4:0;;;;68010:6;67982:21;:35::i;:::-;68050:4;;68056:6;;68028:35;;-1:-1:-1;;;;;68050:4:0;;;;68056:6;68028:21;:35::i;:::-;68080:4;;;;;;;;;-1:-1:-1;;;;;68080:4:0;-1:-1:-1;;;;;68074:19:0;;68101:2;68074:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68118:16;68136;68172:42;-1:-1:-1;;;;;68157:70:0;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68117:112;;;;;68240:15;68258:16;68271:2;68258:12;:16::i;:::-;68321:6;;68302:63;;-1:-1:-1;;;68302:63:0;;;;;14342:25:1;;;-1:-1:-1;;;;;14452:15:1;;;14432:18;;;14425:43;14504:15;;14484:18;;;14477:43;68240:34:0;;-1:-1:-1;68285:14:0;;-1:-1:-1;;;;;68321:6:0;;;;68302:32;;14315:18:1;;68302:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68376:8;;:36;;-1:-1:-1;;;68376:36:0;;68398:4;68376:36;;;10357:51:1;10424:18;;;10417:34;;;68285:80:0;;-1:-1:-1;;;;;;68376:8:0;;:13;;10330:18:1;;68376:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68442:6:0;;68463:4;;68469:5;;-1:-1:-1;;;;;68442:6:0;;;;-1:-1:-1;68423:39:0;;-1:-1:-1;68463:4:0;;;;68469:5;68476:10;68488:6;68442;;68510:4;68517:19;:15;68534:2;68517:19;:::i;:::-;68423:114;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;68548:34;68558:10;68570:11;68548:9;:34::i;:::-;67456:1134;;;;;;;;;;67400:1190;:::o;44323:759::-;44426:7;44476:13;;44426:7;;44476:17;;44492:1;;-1:-1:-1;;;;;44476:13:0;:17;:::i;:::-;-1:-1:-1;;;;;44451:42:0;;;44504:19;44700:9;44695:328;44715:14;44711:1;:18;44695:328;;;44755:31;44789:14;;;:11;:14;;;;;;;;;44755:48;;;;;;;;;-1:-1:-1;;;;;44755:48:0;;;;-1:-1:-1;;;44755:48:0;;-1:-1:-1;;;;;44755:48:0;;;;;;;;-1:-1:-1;;;44755:48:0;;;;;;;;;;;;;;44822:186;;44887:5;44872:11;:20;44868:85;;-1:-1:-1;44928:1:0;44323:759;-1:-1:-1;;;;44323:759:0:o;44868:85::-;44975:13;;;;;44822:186;-1:-1:-1;44731:3:0;;44695:328;;;;45051:23;;-1:-1:-1;;;45051:23:0;;;;;;;;;;;76128:104;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;76203:7:::1;:21;76213:11:::0;76203:7;:21:::1;:::i;71203:1170::-:0;71311:8;:15;71303:5;;:23;;;;:::i;:::-;71290:9;:36;71282:45;;;;;;71338:10;71359:8;:15;71351:5;;:23;;;;:::i;:::-;71338:36;;71390:9;71385:359;71409:8;:15;71405:1;:19;71385:359;;;71474:10;-1:-1:-1;;;;;71450:34:0;:20;71458:8;71467:1;71458:11;;;;;;;;:::i;:::-;;;;;;;71450:7;:20::i;:::-;-1:-1:-1;;;;;71450:34:0;;71442:60;;;;-1:-1:-1;;;71442:60:0;;;;;;;:::i;:::-;71521:8;:21;71530:8;71539:1;71530:11;;;;;;;;:::i;:::-;;;;;;;;;;;;71521:21;;;;;;;;;;-1:-1:-1;71521:21:0;;;;:30;71513:54;;;;-1:-1:-1;;;71513:54:0;;18795:2:1;71513:54:0;;;18777:21:1;18834:2;18814:18;;;18807:30;-1:-1:-1;;;18853:18:1;;;18846:41;18904:18;;71513:54:0;18593:335:1;71513:54:0;71619:12;71582:11;:24;71594:8;71603:1;71594:11;;;;;;;;:::i;:::-;;;;;;;71582:24;;;;;;;;;;;:34;;:49;;;;71683:6;;71646:11;:24;71658:8;71667:1;71658:11;;;;;;;;:::i;:::-;;;;;;;71646:24;;;;;;;;;;;:34;;:43;;;;71728:4;71704:8;:21;71713:8;71722:1;71713:11;;;;;;;;:::i;:::-;;;;;;;71704:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;71426:3;;;;;:::i;:::-;;;;71385:359;;;-1:-1:-1;71776:5:0;;71783:6;;71754:36;;-1:-1:-1;;;;;71776:5:0;;;;71783:6;71754:21;:36::i;:::-;71823:4;;71829:6;;71801:35;;-1:-1:-1;;;;;71823:4:0;;;;71829:6;71801:21;:35::i;:::-;71869:4;;71875:6;;71847:35;;-1:-1:-1;;;;;71869:4:0;;;;71875:6;71847:21;:35::i;:::-;71899:4;;;;;;;;;-1:-1:-1;;;;;71899:4:0;-1:-1:-1;;;;;71893:19:0;;71920:9;71893:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71944:16;71962;71998:42;-1:-1:-1;;;;;71983:70:0;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71943:112;;;;;72066:15;72084:16;72097:2;72084:12;:16::i;:::-;72147:6;;72128:63;;-1:-1:-1;;;72128:63:0;;;;;14342:25:1;;;-1:-1:-1;;;;;14452:15:1;;;14432:18;;;14425:43;14504:15;;14484:18;;;14477:43;72066:34:0;;-1:-1:-1;72111:14:0;;-1:-1:-1;;;;;72147:6:0;;;;72128:32;;14315:18:1;;72128:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72202:8;;:36;;-1:-1:-1;;;72202:36:0;;72224:4;72202:36;;;10357:51:1;10424:18;;;10417:34;;;72111:80:0;;-1:-1:-1;;;;;;72202:8:0;;:13;;10330:18:1;;72202:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72268:6:0;;72289:4;;72295:5;;-1:-1:-1;;;;;72268:6:0;;;;-1:-1:-1;72249:39:0;;-1:-1:-1;72289:4:0;;;;72295:5;72302:10;72314:6;72268;;72336:4;72343:19;:15;72360:2;72343:19;:::i;:::-;72249:114;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;71271:1102;;;;;71203:1170;:::o;70834:361::-;70903:15;70921:20;70932:8;70921:10;:20::i;:::-;70903:38;;70957:9;70952:191;70976:8;:15;70972:1;:19;70952:191;;;71041:10;-1:-1:-1;;;;;71017:34:0;:20;71025:8;71034:1;71025:11;;;;;;;;:::i;71017:20::-;-1:-1:-1;;;;;71017:34:0;;71009:60;;;;-1:-1:-1;;;71009:60:0;;;;;;;:::i;:::-;71124:7;71080:11;:24;71092:8;71101:1;71092:11;;;;;;;;:::i;:::-;;;;;;;71080:24;;;;;;;;;;;:40;;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;70993:3:0;;-1:-1:-1;70993:3:0;;;:::i;:::-;;;;70952:191;;76395:181;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;76498:6:::1;:18:::0;;;;76527:4:::1;:14:::0;76552:5:::1;:16:::0;76395:181::o;49109:124::-;49173:7;49200:20;49212:7;49200:11;:20::i;:::-;:25;;49109:124;-1:-1:-1;;49109:124:0:o;63803:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68716:113::-;68776:7;68816:5;;68802:11;:19;;;;:::i;47091:206::-;47155:7;-1:-1:-1;;;;;47179:19:0;;47175:60;;47207:28;;-1:-1:-1;;;47207:28:0;;;;;;;;;;;47175:60;-1:-1:-1;;;;;;47261:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;47261:27:0;;47091:206::o;16038:103::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;16103:30:::1;16130:1;16103:18;:30::i;:::-;16038:103::o:0;49471:104::-;49527:13;49560:7;49553:14;;;;;:::i;72801:534::-;72881:15;72915:6;72911:273;72931:8;:15;72927:1;:19;72911:273;;;72999:10;-1:-1:-1;;;;;72975:34:0;:20;72983:8;72992:1;72983:11;;;;;;;;:::i;72975:20::-;-1:-1:-1;;;;;72975:34:0;;72967:60;;;;-1:-1:-1;;;72967:60:0;;;;;;;:::i;:::-;73054:28;73070:8;73079:1;73070:11;;;;;;;;:::i;:::-;;;;;;;73054:15;:28::i;:::-;73042:41;;;;:::i;:::-;;;73143:28;73159:8;73168:1;73159:11;;;;;;;;:::i;73143:28::-;73098:11;:24;73110:8;73119:1;73110:11;;;;;;;;:::i;:::-;;;;;;;73098:24;;;;;;;;;;;:40;;;:74;;;;;;;:::i;:::-;;;;-1:-1:-1;72948:3:0;;-1:-1:-1;72948:3:0;;;:::i;:::-;;;;72911:273;;;-1:-1:-1;73194:8:0;;:37;;-1:-1:-1;;;73194:37:0;;73216:4;73194:37;;;10357:51:1;10424:18;;;10417:34;;;-1:-1:-1;;;;;73194:8:0;;;;:13;;10330:18:1;;73194:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73264:5:0;;73271:6;;73242:36;;-1:-1:-1;;;;;;73264:5:0;;;;-1:-1:-1;73271:6:0;73242:21;:36::i;:::-;73289:38;73301:7;73310:4;73316:10;73289:11;:38::i;76743:272::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;76829:39:::1;::::0;-1:-1:-1;;;76829:39:0;;76862:4:::1;76829:39;::::0;::::1;1674:51:1::0;76811:15:0::1;::::0;-1:-1:-1;;;;;76829:24:0;::::1;::::0;::::1;::::0;1647:18:1;;76829:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76811:57;;76887:7;76898:1;76887:12:::0;76879:64:::1;;;::::0;-1:-1:-1;;;76879:64:0;;19135:2:1;76879:64:0::1;::::0;::::1;19117:21:1::0;19174:2;19154:18;;;19147:30;19213:34;19193:18;;;19186:62;-1:-1:-1;;;19264:18:1;;;19257:37;19311:19;;76879:64:0::1;18933:403:1::0;76879:64:0::1;76954:53;::::0;-1:-1:-1;;;76954:53:0;;76986:10:::1;76954:53;::::0;::::1;10357:51:1::0;10424:18;;;10417:34;;;-1:-1:-1;;;;;76954:23:0;::::1;::::0;::::1;::::0;10330:18:1;;76954:53:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65433:1135::-:0;65495:14;65512:13;:11;:13::i;:::-;65568:9;;65495:30;;-1:-1:-1;65544:20:0;65553:11;65495:30;65544:20;:::i;:::-;:33;;65536:53;;;;-1:-1:-1;;;65536:53:0;;13359:2:1;65536:53:0;;;13341:21:1;13398:1;13378:18;;;13371:29;-1:-1:-1;;;13416:18:1;;;13409:37;13463:18;;65536:53:0;13157:330:1;65536:53:0;65600:13;65623:11;65616:4;;:18;;;;:::i;:::-;65600:34;;65666:5;65653:9;:18;65645:27;;;;;;65683:10;65696:26;65716:5;65696:15;:5;65706:4;65696:9;:15::i;:26::-;65683:39;-1:-1:-1;65733:10:0;65746:13;:5;65683:39;65746:9;:13::i;:::-;65733:26;-1:-1:-1;65770:11:0;65784:23;65801:5;65784:12;65733:26;65791:4;65784:6;:12::i;51228:303::-;14812:10;-1:-1:-1;;;;;51342:24:0;;;51338:54;;51375:17;;-1:-1:-1;;;51375:17:0;;;;;;;;;;;51338:54;14812:10;51406:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;51406:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;51406:53:0;;;;;;;;;;51475:48;;540:41:1;;;51406:42:0;;14812:10;51475:48;;513:18:1;51475:48:0;;;;;;;51228:303;;:::o;65156:271::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;65269:4:::1;:11;65254:4;:11;:26;65246:53;;;::::0;-1:-1:-1;;;65246:53:0;;19793:2:1;65246:53:0::1;::::0;::::1;19775:21:1::0;19832:2;19812:18;;;19805:30;-1:-1:-1;;;19851:18:1;;;19844:44;19905:18;;65246:53:0::1;19591:338:1::0;65246:53:0::1;65317:9;65312:108;65336:4;:11;65332:1;:15;65312:108;;;65401:4;65406:1;65401:7;;;;;;;;:::i;:::-;;;;;;;65368:11;:20;65380:4;65385:1;65380:7;;;;;;;;:::i;:::-;;;;;;;65368:20;;;;;;;;;;;:30;;:40;;;;65349:3;;;;;:::i;:::-;;;;65312:108;;52384:342:::0;52551:28;52561:4;52567:2;52571:7;52551:9;:28::i;:::-;52595:48;52618:4;52624:2;52628:7;52637:5;52595:22;:48::i;:::-;52590:129;;52667:40;;-1:-1:-1;;;52667:40:0;;;;;;;;;;;52590:129;52384:342;;;;:::o;77021:252::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;77141:124:::1;::::0;-1:-1:-1;;;77141:124:0;;77192:4:::1;77141:124;::::0;::::1;20174:34:1::0;77220:10:0::1;20224:18:1::0;;;20217:43;20276:18;;;20269:34;;;-1:-1:-1;;;;;77141:28:0;::::1;::::0;::::1;::::0;20109:18:1;;77141:124:0::1;19934:375:1::0;63831:37:0;;;;;;;:::i;75649:473::-;75767:13;75816:16;75824:7;75816;:16::i;:::-;75798:105;;;;-1:-1:-1;;;75798:105:0;;20516:2:1;75798:105:0;;;20498:21:1;20555:2;20535:18;;;20528:30;20594:34;20574:18;;;20567:62;-1:-1:-1;;;20645:18:1;;;20638:45;20700:19;;75798:105:0;20314:411:1;75798:105:0;75914:28;75945:10;:8;:10::i;:::-;75914:41;;76004:1;75979:14;75973:28;:32;:141;;;;;;;;;;;;;;;;;76045:14;76061:18;:7;:16;:18::i;:::-;76081:13;76028:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75973:141;75966:148;75649:473;-1:-1:-1;;;75649:473:0:o;76238:151::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;76348:13:::1;:33;76364:17:::0;76348:13;:33:::1;:::i;68835:113::-:0;68895:7;68935:5;;68921:11;:19;;;;:::i;68956:923::-;69019:9;69003:13;69052:26;69072:5;69052:15;69019:9;69062:4;69052:9;:15::i;:26::-;69039:39;-1:-1:-1;69089:10:0;69102:13;:5;69039:39;69102:9;:13::i;:::-;69089:26;-1:-1:-1;69126:11:0;69140:23;69157:5;69140:12;69089:26;69147:4;69140:6;:12::i;:23::-;69126:37;-1:-1:-1;69174:11:0;69188;:2;69126:37;69188:6;:11::i;:::-;69218:6;;69174:25;;-1:-1:-1;69210:20:0;;-1:-1:-1;;;;;69218:6:0;69174:25;69210:7;:20::i;:::-;69249:3;;69241:17;;-1:-1:-1;;;;;69249:3:0;69254;69241:7;:17::i;:::-;69291:5;;69298:6;;69269:36;;-1:-1:-1;;;;;69291:5:0;;;;69298:6;69269:21;:36::i;:::-;69338:4;;69344:6;;69316:35;;-1:-1:-1;;;;;69338:4:0;;;;69344:6;69316:21;:35::i;:::-;69384:4;;69390:6;;69362:35;;-1:-1:-1;;;;;69384:4:0;;;;69390:6;69362:21;:35::i;:::-;69414:4;;;;;;;;;-1:-1:-1;;;;;69414:4:0;-1:-1:-1;;;;;69408:19:0;;69435:2;69408:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69452:16;69470;69506:42;-1:-1:-1;;;;;69491:70:0;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69451:112;;;;;69574:15;69592:16;69605:2;69592:12;:16::i;:::-;69655:6;;69636:63;;-1:-1:-1;;;69636:63:0;;;;;14342:25:1;;;-1:-1:-1;;;;;14452:15:1;;;14432:18;;;14425:43;14504:15;;14484:18;;;14477:43;69574:34:0;;-1:-1:-1;69619:14:0;;-1:-1:-1;;;;;69655:6:0;;;;69636:32;;14315:18:1;;69636:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69710:8;;:36;;-1:-1:-1;;;69710:36:0;;69732:4;69710:36;;;10357:51:1;10424:18;;;10417:34;;;69619:80:0;;-1:-1:-1;;;;;;69710:8:0;;:13;;10330:18:1;;69710:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69776:6:0;;69797:4;;69803:5;;-1:-1:-1;;;;;69776:6:0;;;;-1:-1:-1;69757:39:0;;-1:-1:-1;69797:4:0;;;;69803:5;69810:10;69822:6;69776;;69844:4;69851:19;:15;69868:2;69851:19;:::i;:::-;69757:114;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;68992:887;;;;;;;;;68956:923::o;16297:238::-;15458:6;;-1:-1:-1;;;;;15458:6:0;14812:10;15606:23;15598:68;;;;-1:-1:-1;;;15598:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16400:22:0;::::1;16378:110;;;::::0;-1:-1:-1;;;16378:110:0;;22167:2:1;16378:110:0::1;::::0;::::1;22149:21:1::0;22206:2;22186:18;;;22179:30;22245:34;22225:18;;;22218:62;-1:-1:-1;;;22296:18:1;;;22289:36;22342:19;;16378:110:0::1;21965:402:1::0;16378:110:0::1;16499:28;16518:8;16499:18;:28::i;69887:496::-:0;69982:15;;70017:359;70041:8;:15;70037:1;:19;70017:359;;;70084:11;70098:89;70177:9;;70098:74;70137:11;:24;70149:8;70158:1;70149:11;;;;;;;;:::i;:::-;;;;;;;70137:24;;;;;;;;;;;:34;;;70098:11;:24;70110:8;70119:1;70110:11;;;;;;;;:::i;:::-;;;;;;;70098:24;;;;;;;;;;;:34;;;:38;;:74;;;;:::i;:89::-;70084:103;;70198:11;70227;:24;70239:8;70248:1;70239:11;;;;;;;;:::i;:::-;;;;;;;70227:24;;;;;;;;;;;:34;;;70212:12;:49;;;;:::i;:::-;70198:63;-1:-1:-1;70272:10:0;70285:12;:3;70198:63;70285:7;:12::i;:::-;70272:25;;70324:11;:24;70336:8;70345:1;70336:11;;;;;;;;:::i;:::-;;;;;;;70324:24;;;;;;;;;;;:40;;;70319:2;:45;;;;:::i;:::-;70308:56;;;;:::i;:::-;;;70063:313;;;70058:3;;;;;:::i;:::-;;;;70017:359;;;;69887:496;;;:::o;52982:144::-;53039:4;53073:13;;-1:-1:-1;;;;;53073:13:0;53063:23;;:55;;;;-1:-1:-1;;53091:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;53091:27:0;;;;53090:28;;52982:144::o;60337:196::-;60452:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;60452:29:0;-1:-1:-1;;;;;60452:29:0;;;;;;;;;60497:28;;60452:24;;60497:28;;;;;;;60337:196;;;:::o;55770:2146::-;55885:35;55923:20;55935:7;55923:11;:20::i;:::-;55999:18;;55885:58;;-1:-1:-1;55957:22:0;;-1:-1:-1;;;;;55983:34:0;14812:10;-1:-1:-1;;;;;55983:34:0;;:101;;;-1:-1:-1;56051:18:0;;56034:50;;14812:10;51603:214;:::i;56034:50::-;55983:154;;;-1:-1:-1;14812:10:0;56101:20;56113:7;56101:11;:20::i;:::-;-1:-1:-1;;;;;56101:36:0;;55983:154;55957:181;;56157:17;56152:66;;56183:35;;-1:-1:-1;;;56183:35:0;;;;;;;;;;;56152:66;56255:4;-1:-1:-1;;;;;56233:26:0;:13;:18;;;-1:-1:-1;;;;;56233:26:0;;56229:67;;56268:28;;-1:-1:-1;;;56268:28:0;;;;;;;;;;;56229:67;-1:-1:-1;;;;;56311:16:0;;56307:52;;56336:23;;-1:-1:-1;;;56336:23:0;;;;;;;;;;;56307:52;56482:49;56499:1;56503:7;56512:13;:18;;;56482:8;:49::i;:::-;-1:-1:-1;;;;;56828:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;56828:31:0;;;-1:-1:-1;;;;;56828:31:0;;;-1:-1:-1;;56828:31:0;;;;;;;56874:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;56874:29:0;;;;;;;;;;;56921:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;56966:61:0;;;;-1:-1:-1;;;57011:15:0;56966:61;;;;;;;;;;;57302:11;;;57332:24;;;;;:29;57302:11;;57332:29;57328:471;;57557:13;;-1:-1:-1;;;;;57557:13:0;57543:27;;57539:245;;;57627:18;;;57595:24;;;:11;:24;;;;;;;;:50;;57710:54;;;;-1:-1:-1;;;;;57668:96:0;-1:-1:-1;;;57668:96:0;-1:-1:-1;;;;;;57668:96:0;;;-1:-1:-1;;;;;57595:50:0;;;57668:96;;;;;;;57539:245;56803:1007;57847:7;57843:2;-1:-1:-1;;;;;57828:27:0;57837:4;-1:-1:-1;;;;;57828:27:0;;;;;;;;;;;57866:42;55874:2042;;55770:2146;;;:::o;9288:98::-;9346:7;9373:5;9377:1;9373;:5;:::i;9688:98::-;9746:7;9773:5;9777:1;9773;:5;:::i;8930:98::-;8988:7;9015:5;9019:1;9015;:5;:::i;66577:263::-;66707:12;66733:10;-1:-1:-1;;;;;66725:24:0;66757:7;66771:5;66725:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66706:99;;;66824:7;66816:16;;;;;75281:211;75364:44;;-1:-1:-1;;;75364:44:0;;75395:4;75364:44;;;22841:34:1;-1:-1:-1;;;;;22911:15:1;;;22891:18;;;22884:43;75364:22:0;;;;;22776:18:1;;75364:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75412:1;75364:49;75360:125;;75430:43;;-1:-1:-1;;;75430:43:0;;-1:-1:-1;;;;;10375:32:1;;;75430:43:0;;;10357:51:1;-1:-1:-1;;10424:18:1;;;10417:34;75430:20:0;;;;;10330:18:1;;75430:43:0;10183:274:1;66851:366:0;66967:6;;67009:16;;;67023:1;67009:16;;;;;;;;66906:4;;-1:-1:-1;;;;;66967:6:0;;66906:4;;67009:16;67023:1;67009:16;;;;;;;;-1:-1:-1;;67046:4:0;;67036:7;;;;-1:-1:-1;;;;;;67046:4:0;;67036:7;;-1:-1:-1;67046:4:0;;67036:7;;;;:::i;:::-;-1:-1:-1;;;;;67036:14:0;;;:7;;;;;;;;;:14;67071:4;;67061:7;;67071:4;;;67061;;67071;;67061:7;;;;;;:::i;:::-;-1:-1:-1;;;;;67061:14:0;;;:7;;;;;;;;;:14;67086:19;;67108:28;;;67137:5;67086:19;67146:4;67160;67167:18;:15;67183:2;67167:18;:::i;:::-;67108:78;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67108:78:0;;;;;;;;;;;;:::i;:::-;67086:100;;67204:2;67207:1;67204:5;;;;;;;;:::i;:::-;;;;;;;67197:12;;;;;66851:366;;;:::o;53135:104::-;53204:27;53214:2;53218:8;53204:27;;;;;;;;;;;;:9;:27::i;47932:1114::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;48131:13:0;;48074:7;;-1:-1:-1;;;;;48131:13:0;48124:20;;48120:859;;;48165:31;48199:17;;;:11;:17;;;;;;;;;48165:51;;;;;;;;;-1:-1:-1;;;;;48165:51:0;;;;-1:-1:-1;;;48165:51:0;;-1:-1:-1;;;;;48165:51:0;;;;;;;;-1:-1:-1;;;48165:51:0;;;;;;;;;;;;;;48235:729;;48285:14;;-1:-1:-1;;;;;48285:28:0;;48281:101;;48349:9;47932:1114;-1:-1:-1;;;47932:1114:0:o;48281:101::-;-1:-1:-1;;;48724:6:0;48769:17;;;;:11;:17;;;;;;;;;48757:29;;;;;;;;;-1:-1:-1;;;;;48757:29:0;;;;;-1:-1:-1;;;48757:29:0;;-1:-1:-1;;;;;48757:29:0;;;;;;;;-1:-1:-1;;;48757:29:0;;;;;;;;;;;;;48817:28;48813:109;;48885:9;47932:1114;-1:-1:-1;;;47932:1114:0:o;48813:109::-;48684:261;;;48146:833;48120:859;49007:31;;-1:-1:-1;;;49007:31:0;;;;;;;;;;;16696:191;16789:6;;;-1:-1:-1;;;;;16806:17:0;;;-1:-1:-1;;;;;;16806:17:0;;;;;;;16839:40;;16789:6;;;16806:17;16789:6;;16839:40;;16770:16;;16839:40;16759:128;16696:191;:::o;73343:754::-;73435:4;;-1:-1:-1;;;;;73435:4:0;;;73428:11;;;;73424:656;;73499:6;;73545:16;;;73559:1;73545:16;;;;;;;;-1:-1:-1;;;;;73499:6:0;;;;73455:22;;73545:16;;;;;;;;-1:-1:-1;;73586:5:0;;73576:7;;;;-1:-1:-1;;;;;;73586:5:0;;73576:7;;-1:-1:-1;73586:5:0;;73576:7;;;;:::i;:::-;-1:-1:-1;;;;;73576:15:0;;;:7;;;;;;;;;:15;73616:4;;73606:7;;73616:4;;;73606;;73616;;73606:7;;;;;;:::i;:::-;-1:-1:-1;;;;;73606:14:0;;;:7;;;;;;;;;:14;73635:57;;;73693:5;73699:1;73702:4;73708:3;73713:18;:15;73729:2;73713:18;:::i;:::-;73635:97;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73424:656;73807:6;;73853:16;;;73867:1;73853:16;;;;;;;;;-1:-1:-1;;;;;73807:6:0;;;;73763:22;;73853:16;;;;;;;;-1:-1:-1;;73894:5:0;;73884:7;;;;-1:-1:-1;;;;;;73894:5:0;;73884:7;;-1:-1:-1;73894:5:0;;73884:7;;;;:::i;:::-;-1:-1:-1;;;;;73884:15:0;;;:7;;;;;;;;;:15;73924:4;;73914:7;;73924:4;;;73914;;73924;;73914:7;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;73914:14:0;;;-1:-1:-1;;;;;73914:14:0;;;;;73953:3;73943:4;73948:1;73943:7;;;;;;;;:::i;61099:923::-;61254:4;-1:-1:-1;;;;;61275:13:0;;18196:19;:23;61271:744;;61328:175;;-1:-1:-1;;;61328:175:0;;-1:-1:-1;;;;;61328:36:0;;;;;:175;;14812:10;;61422:4;;61449:7;;61479:5;;61328:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61328:175:0;;;;;;;;-1:-1:-1;;61328:175:0;;;;;;;;;;;;:::i;:::-;;;61307:653;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61690:6;:13;61707:1;61690:18;61686:259;;61740:40;;-1:-1:-1;;;61740:40:0;;;;;;;;;;;61686:259;61895:6;61889:13;61880:6;61876:2;61872:15;61865:38;61307:653;-1:-1:-1;;;;;;61567:55:0;-1:-1:-1;;;61567:55:0;;-1:-1:-1;61560:62:0;;61271:744;-1:-1:-1;61999:4:0;61271:744;61099:923;;;;;;:::o;75535:108::-;75595:13;75628:7;75621:14;;;;;:::i;12907:724::-;12963:13;13185:5;13194:1;13185:10;13181:53;;-1:-1:-1;;13212:10:0;;;;;;;;;;;;-1:-1:-1;;;13212:10:0;;;;;12907:724::o;13181:53::-;13259:5;13244:12;13300:78;13307:9;;13300:78;;13333:8;;;;:::i;:::-;;-1:-1:-1;13356:10:0;;-1:-1:-1;13364:2:0;13356:10;;:::i;:::-;;;13300:78;;;13388:19;13420:6;-1:-1:-1;;;;;13410:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13410:17:0;;13388:39;;13438:154;13445:10;;13438:154;;13472:11;13482:1;13472:11;;:::i;:::-;;-1:-1:-1;13541:10:0;13549:2;13541:5;:10;:::i;:::-;13528:24;;:2;:24;:::i;:::-;13515:39;;13498:6;13505;13498:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13498:56:0;;;;;;;;-1:-1:-1;13569:11:0;13578:2;13569:11;;:::i;:::-;;;13438:154;;53603:163;53726:32;53732:2;53736:8;53746:5;53753:4;54165:20;54188:13;-1:-1:-1;;;;;54188:13:0;-1:-1:-1;;;;;54216:16:0;;54212:48;;54241:19;;-1:-1:-1;;;54241:19:0;;;;;;;;;;;54212:48;54275:8;54287:1;54275:13;54271:44;;54297:18;;-1:-1:-1;;;54297:18:0;;;;;;;;;;;54271:44;-1:-1:-1;;;;;54669:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;54728:49:0;;-1:-1:-1;;;;;54669:44:0;;;;;;;54728:49;;;;-1:-1:-1;;54669:44:0;;;;;;54728:49;;;;;;;;;;;;;;;;54795:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;54845:66:0;;;;-1:-1:-1;;;54895:15:0;54845:66;;;;;;;;;;;54795:25;;54982:389;55002:8;54998:1;:12;54982:389;;;55041:38;;55066:12;;-1:-1:-1;;;;;55041:38:0;;;55058:1;;55041:38;;55058:1;;55041:38;55124:4;:89;;;;;55154:59;55185:1;55189:2;55193:12;55207:5;55154:22;:59::i;:::-;55153:60;55124:89;55098:225;;;55263:40;;-1:-1:-1;;;55263:40:0;;;;;;;;;;;55098:225;55341:14;;;;;55012:3;54982:389;;;-1:-1:-1;55388:13:0;:37;;-1:-1:-1;;;;;;55388:37:0;-1:-1:-1;;;;;55388:37:0;;;;;;;;;;55447:60;52384:342;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:275;3082:2;3076:9;3147:2;3128:13;;-1:-1:-1;;3124:27:1;3112:40;;-1:-1:-1;;;;;3167:34:1;;3203:22;;;3164:62;3161:88;;;3229:18;;:::i;:::-;3265:2;3258:22;3011:275;;-1:-1:-1;3011:275:1:o;3291:183::-;3351:4;-1:-1:-1;;;;;3376:6:1;3373:30;3370:56;;;3406:18;;:::i;:::-;-1:-1:-1;3451:1:1;3447:14;3463:4;3443:25;;3291:183::o;3479:897::-;3563:6;3594:2;3637;3625:9;3616:7;3612:23;3608:32;3605:52;;;3653:1;3650;3643:12;3605:52;3693:9;3680:23;-1:-1:-1;;;;;3718:6:1;3715:30;3712:50;;;3758:1;3755;3748:12;3712:50;3781:22;;3834:4;3826:13;;3822:27;-1:-1:-1;3812:55:1;;3863:1;3860;3853:12;3812:55;3899:2;3886:16;3922:60;3938:43;3978:2;3938:43;:::i;:::-;3922:60;:::i;:::-;4016:15;;;4098:1;4094:10;;;;4086:19;;4082:28;;;4047:12;;;;4122:19;;;4119:39;;;4154:1;4151;4144:12;4119:39;4178:11;;;;4198:148;4214:6;4209:3;4206:15;4198:148;;;4280:23;4299:3;4280:23;:::i;:::-;4268:36;;4231:12;;;;4324;;;;4198:148;;;4365:5;3479:897;-1:-1:-1;;;;;;;3479:897:1:o;4381:407::-;4446:5;-1:-1:-1;;;;;4472:6:1;4469:30;4466:56;;;4502:18;;:::i;:::-;4540:57;4585:2;4564:15;;-1:-1:-1;;4560:29:1;4591:4;4556:40;4540:57;:::i;:::-;4531:66;;4620:6;4613:5;4606:21;4660:3;4651:6;4646:3;4642:16;4639:25;4636:45;;;4677:1;4674;4667:12;4636:45;4726:6;4721:3;4714:4;4707:5;4703:16;4690:43;4780:1;4773:4;4764:6;4757:5;4753:18;4749:29;4742:40;4381:407;;;;;:::o;4793:451::-;4862:6;4915:2;4903:9;4894:7;4890:23;4886:32;4883:52;;;4931:1;4928;4921:12;4883:52;4971:9;4958:23;-1:-1:-1;;;;;4996:6:1;4993:30;4990:50;;;5036:1;5033;5026:12;4990:50;5059:22;;5112:4;5104:13;;5100:27;-1:-1:-1;5090:55:1;;5141:1;5138;5131:12;5090:55;5164:74;5230:7;5225:2;5212:16;5207:2;5203;5199:11;5164:74;:::i;5249:662::-;5303:5;5356:3;5349:4;5341:6;5337:17;5333:27;5323:55;;5374:1;5371;5364:12;5323:55;5410:6;5397:20;5436:4;5460:60;5476:43;5516:2;5476:43;:::i;5460:60::-;5554:15;;;5640:1;5636:10;;;;5624:23;;5620:32;;;5585:12;;;;5664:15;;;5661:35;;;5692:1;5689;5682:12;5661:35;5728:2;5720:6;5716:15;5740:142;5756:6;5751:3;5748:15;5740:142;;;5822:17;;5810:30;;5860:12;;;;5773;;5740:142;;;-1:-1:-1;5900:5:1;5249:662;-1:-1:-1;;;;;;5249:662:1:o;5916:348::-;6000:6;6053:2;6041:9;6032:7;6028:23;6024:32;6021:52;;;6069:1;6066;6059:12;6021:52;6109:9;6096:23;-1:-1:-1;;;;;6134:6:1;6131:30;6128:50;;;6174:1;6171;6164:12;6128:50;6197:61;6250:7;6241:6;6230:9;6226:22;6197:61;:::i;6269:316::-;6346:6;6354;6362;6415:2;6403:9;6394:7;6390:23;6386:32;6383:52;;;6431:1;6428;6421:12;6383:52;-1:-1:-1;;6454:23:1;;;6524:2;6509:18;;6496:32;;-1:-1:-1;6575:2:1;6560:18;;;6547:32;;6269:316;-1:-1:-1;6269:316:1:o;6590:422::-;6683:6;6691;6744:2;6732:9;6723:7;6719:23;6715:32;6712:52;;;6760:1;6757;6750:12;6712:52;6783:29;6802:9;6783:29;:::i;:::-;6773:39;;6863:2;6852:9;6848:18;6835:32;-1:-1:-1;;;;;6882:6:1;6879:30;6876:50;;;6922:1;6919;6912:12;6876:50;6945:61;6998:7;6989:6;6978:9;6974:22;6945:61;:::i;:::-;6935:71;;;6590:422;;;;;:::o;7017:118::-;7103:5;7096:13;7089:21;7082:5;7079:32;7069:60;;7125:1;7122;7115:12;7140:315;7205:6;7213;7266:2;7254:9;7245:7;7241:23;7237:32;7234:52;;;7282:1;7279;7272:12;7234:52;7305:29;7324:9;7305:29;:::i;:::-;7295:39;;7384:2;7373:9;7369:18;7356:32;7397:28;7419:5;7397:28;:::i;:::-;7444:5;7434:15;;;7140:315;;;;;:::o;7856:595::-;7974:6;7982;8035:2;8023:9;8014:7;8010:23;8006:32;8003:52;;;8051:1;8048;8041:12;8003:52;8091:9;8078:23;-1:-1:-1;;;;;8161:2:1;8153:6;8150:14;8147:34;;;8177:1;8174;8167:12;8147:34;8200:61;8253:7;8244:6;8233:9;8229:22;8200:61;:::i;:::-;8190:71;;8314:2;8303:9;8299:18;8286:32;8270:48;;8343:2;8333:8;8330:16;8327:36;;;8359:1;8356;8349:12;8327:36;;8382:63;8437:7;8426:8;8415:9;8411:24;8382:63;:::i;8456:667::-;8551:6;8559;8567;8575;8628:3;8616:9;8607:7;8603:23;8599:33;8596:53;;;8645:1;8642;8635:12;8596:53;8668:29;8687:9;8668:29;:::i;:::-;8658:39;;8716:38;8750:2;8739:9;8735:18;8716:38;:::i;:::-;8706:48;;8801:2;8790:9;8786:18;8773:32;8763:42;;8856:2;8845:9;8841:18;8828:32;-1:-1:-1;;;;;8875:6:1;8872:30;8869:50;;;8915:1;8912;8905:12;8869:50;8938:22;;8991:4;8983:13;;8979:27;-1:-1:-1;8969:55:1;;9020:1;9017;9010:12;8969:55;9043:74;9109:7;9104:2;9091:16;9086:2;9082;9078:11;9043:74;:::i;:::-;9033:84;;;8456:667;;;;;;;:::o;9128:260::-;9196:6;9204;9257:2;9245:9;9236:7;9232:23;9228:32;9225:52;;;9273:1;9270;9263:12;9225:52;9296:29;9315:9;9296:29;:::i;:::-;9286:39;;9344:38;9378:2;9367:9;9363:18;9344:38;:::i;:::-;9334:48;;9128:260;;;;;:::o;9393:380::-;9472:1;9468:12;;;;9515;;;9536:61;;9590:4;9582:6;9578:17;9568:27;;9536:61;9643:2;9635:6;9632:14;9612:18;9609:38;9606:161;;9689:10;9684:3;9680:20;9677:1;9670:31;9724:4;9721:1;9714:15;9752:4;9749:1;9742:15;9778:127;9839:10;9834:3;9830:20;9827:1;9820:31;9870:4;9867:1;9860:15;9894:4;9891:1;9884:15;9910:128;9950:3;9981:1;9977:6;9974:1;9971:13;9968:39;;;9987:18;;:::i;:::-;-1:-1:-1;10023:9:1;;9910:128::o;10043:135::-;10082:3;10103:17;;;10100:43;;10123:18;;:::i;:::-;-1:-1:-1;10170:1:1;10159:13;;10043:135::o;10462:127::-;10523:10;10518:3;10514:20;10511:1;10504:31;10554:4;10551:1;10544:15;10578:4;10575:1;10568:15;10594:461;10647:3;10685:5;10679:12;10712:6;10707:3;10700:19;10738:4;10767:2;10762:3;10758:12;10751:19;;10804:2;10797:5;10793:14;10825:1;10835:195;10849:6;10846:1;10843:13;10835:195;;;10914:13;;-1:-1:-1;;;;;10910:39:1;10898:52;;10970:12;;;;11005:15;;;;10946:1;10864:9;10835:195;;;-1:-1:-1;11046:3:1;;10594:461;-1:-1:-1;;;;;10594:461:1:o;11060:332::-;11267:6;11256:9;11249:25;11310:2;11305;11294:9;11290:18;11283:30;11230:4;11330:56;11382:2;11371:9;11367:18;11359:6;11330:56;:::i;11397:881::-;11492:6;11523:2;11566;11554:9;11545:7;11541:23;11537:32;11534:52;;;11582:1;11579;11572:12;11534:52;11615:9;11609:16;-1:-1:-1;;;;;11640:6:1;11637:30;11634:50;;;11680:1;11677;11670:12;11634:50;11703:22;;11756:4;11748:13;;11744:27;-1:-1:-1;11734:55:1;;11785:1;11782;11775:12;11734:55;11814:2;11808:9;11837:60;11853:43;11893:2;11853:43;:::i;11837:60::-;11931:15;;;12013:1;12009:10;;;;12001:19;;11997:28;;;11962:12;;;;12037:19;;;12034:39;;;12069:1;12066;12059:12;12034:39;12093:11;;;;12113:135;12129:6;12124:3;12121:15;12113:135;;;12195:10;;12183:23;;12146:12;;;;12226;;;;12113:135;;12283:356;12485:2;12467:21;;;12504:18;;;12497:30;12563:34;12558:2;12543:18;;12536:62;12630:2;12615:18;;12283:356::o;12854:125::-;12894:4;12922:1;12919;12916:8;12913:34;;;12927:18;;:::i;:::-;-1:-1:-1;12964:9:1;;12854:125::o;12984:168::-;13024:7;13090:1;13086;13082:6;13078:14;13075:1;13072:21;13067:1;13060:9;13053:17;13049:45;13046:71;;;13097:18;;:::i;:::-;-1:-1:-1;13137:9:1;;12984:168::o;13492:188::-;13571:13;;-1:-1:-1;;;;;13613:42:1;;13603:53;;13593:81;;13670:1;13667;13660:12;13685:450;13772:6;13780;13788;13841:2;13829:9;13820:7;13816:23;13812:32;13809:52;;;13857:1;13854;13847:12;13809:52;13880:40;13910:9;13880:40;:::i;:::-;13870:50;;13939:49;13984:2;13973:9;13969:18;13939:49;:::i;:::-;13929:59;;14031:2;14020:9;14016:18;14010:25;14075:10;14068:5;14064:22;14057:5;14054:33;14044:61;;14101:1;14098;14091:12;14044:61;14124:5;14114:15;;;13685:450;;;;;:::o;14531:184::-;14601:6;14654:2;14642:9;14633:7;14629:23;14625:32;14622:52;;;14670:1;14667;14660:12;14622:52;-1:-1:-1;14693:16:1;;14531:184;-1:-1:-1;14531:184:1:o;14720:760::-;-1:-1:-1;;;;;15135:15:1;;;15117:34;;15187:15;;;15182:2;15167:18;;15160:43;15234:2;15219:18;;15212:34;;;;15277:2;15262:18;;15255:34;;;;15320:3;15305:19;;15298:35;;;;15097:3;15349:19;;15342:35;15414:15;;;15408:3;15393:19;;15386:44;15461:3;15446:19;;15439:35;;;;15066:3;15051:19;;14720:760::o;15485:306::-;15573:6;15581;15589;15642:2;15630:9;15621:7;15617:23;15613:32;15610:52;;;15658:1;15655;15648:12;15610:52;15687:9;15681:16;15671:26;;15737:2;15726:9;15722:18;15716:25;15706:35;;15781:2;15770:9;15766:18;15760:25;15750:35;;15485:306;;;;;:::o;15796:246::-;15836:4;-1:-1:-1;;;;;15949:10:1;;;;15919;;15971:12;;;15968:38;;;15986:18;;:::i;:::-;16023:13;;15796:246;-1:-1:-1;;;15796:246:1:o;16173:545::-;16275:2;16270:3;16267:11;16264:448;;;16311:1;16336:5;16332:2;16325:17;16381:4;16377:2;16367:19;16451:2;16439:10;16435:19;16432:1;16428:27;16422:4;16418:38;16487:4;16475:10;16472:20;16469:47;;;-1:-1:-1;16510:4:1;16469:47;16565:2;16560:3;16556:12;16553:1;16549:20;16543:4;16539:31;16529:41;;16620:82;16638:2;16631:5;16628:13;16620:82;;;16683:17;;;16664:1;16653:13;16620:82;;16894:1352;17020:3;17014:10;-1:-1:-1;;;;;17039:6:1;17036:30;17033:56;;;17069:18;;:::i;:::-;17098:97;17188:6;17148:38;17180:4;17174:11;17148:38;:::i;:::-;17142:4;17098:97;:::i;:::-;17250:4;;17314:2;17303:14;;17331:1;17326:663;;;;18033:1;18050:6;18047:89;;;-1:-1:-1;18102:19:1;;;18096:26;18047:89;-1:-1:-1;;16851:1:1;16847:11;;;16843:24;16839:29;16829:40;16875:1;16871:11;;;16826:57;18149:81;;17296:944;;17326:663;16120:1;16113:14;;;16157:4;16144:18;;-1:-1:-1;;17362:20:1;;;17480:236;17494:7;17491:1;17488:14;17480:236;;;17583:19;;;17577:26;17562:42;;17675:27;;;;17643:1;17631:14;;;;17510:19;;17480:236;;;17484:3;17744:6;17735:7;17732:19;17729:201;;;17805:19;;;17799:26;-1:-1:-1;;17888:1:1;17884:14;;;17900:3;17880:24;17876:37;17872:42;17857:58;17842:74;;17729:201;-1:-1:-1;;;;;17976:1:1;17960:14;;;17956:22;17943:36;;-1:-1:-1;16894:1352:1:o;18251:337::-;18453:2;18435:21;;;18492:2;18472:18;;;18465:30;-1:-1:-1;;;18526:2:1;18511:18;;18504:43;18579:2;18564:18;;18251:337::o;19341:245::-;19408:6;19461:2;19449:9;19440:7;19436:23;19432:32;19429:52;;;19477:1;19474;19467:12;19429:52;19509:9;19503:16;19528:28;19550:5;19528:28;:::i;20730:1230::-;20954:3;20992:6;20986:13;21018:4;21031:51;21075:6;21070:3;21065:2;21057:6;21053:15;21031:51;:::i;:::-;21145:13;;21104:16;;;;21167:55;21145:13;21104:16;21189:15;;;21167:55;:::i;:::-;21311:13;;21244:20;;;21284:1;;21349:36;21311:13;21349:36;:::i;:::-;21404:1;21421:18;;;21448:141;;;;21603:1;21598:337;;;;21414:521;;21448:141;-1:-1:-1;;21483:24:1;;21469:39;;21560:16;;21553:24;21539:39;;21528:51;;;-1:-1:-1;21448:141:1;;21598:337;21629:6;21626:1;21619:17;21677:2;21674:1;21664:16;21702:1;21716:169;21730:8;21727:1;21724:15;21716:169;;;21812:14;;21797:13;;;21790:37;21855:16;;;;21747:10;;21716:169;;;21720:3;;21916:8;21909:5;21905:20;21898:27;;21414:521;-1:-1:-1;21951:3:1;;20730:1230;-1:-1:-1;;;;;;;;;;20730:1230:1:o;22372:127::-;22433:10;22428:3;22424:20;22421:1;22414:31;22464:4;22461:1;22454:15;22488:4;22485:1;22478:15;22504:120;22544:1;22570;22560:35;;22575:18;;:::i;:::-;-1:-1:-1;22609:9:1;;22504:120::o;22938:582::-;23237:6;23226:9;23219:25;23280:6;23275:2;23264:9;23260:18;23253:34;23323:3;23318:2;23307:9;23303:18;23296:31;23200:4;23344:57;23396:3;23385:9;23381:19;23373:6;23344:57;:::i;:::-;-1:-1:-1;;;;;23437:32:1;;;;23432:2;23417:18;;23410:60;-1:-1:-1;23501:3:1;23486:19;23479:35;23336:65;22938:582;-1:-1:-1;;;22938:582:1:o;23525:489::-;-1:-1:-1;;;;;23794:15:1;;;23776:34;;23846:15;;23841:2;23826:18;;23819:43;23893:2;23878:18;;23871:34;;;23941:3;23936:2;23921:18;;23914:31;;;23719:4;;23962:46;;23988:19;;23980:6;23962:46;:::i;:::-;23954:54;23525:489;-1:-1:-1;;;;;;23525:489:1:o;24019:249::-;24088:6;24141:2;24129:9;24120:7;24116:23;24112:32;24109:52;;;24157:1;24154;24147:12;24109:52;24189:9;24183:16;24208:30;24232:5;24208:30;:::i;24273:112::-;24305:1;24331;24321:35;;24336:18;;:::i;:::-;-1:-1:-1;24370:9:1;;24273:112::o
Swarm Source
ipfs://5c0f5021331fc1bafc99467030af874ca8cc5aec43c8af313f95d9b1e4469313
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.