Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Lottery
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- paris
- Verified at
- 2024-05-30T06:53:22.662601Z
Constructor Arguments
0x0000000000000000000000006c8c9bb7e89652b1c7d4fd00b7cce1dba2361304000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b
Arg [0] (address) : 0x6c8c9bb7e89652b1c7d4fd00b7cce1dba2361304
Arg [1] (address) : 0x780fb5aca83f2e3f57ee18cc3094988ef49d8c3d
Arg [2] (address) : 0x0ca83dd56af172a1e04b667d6e64446d0b88c4a4
Arg [3] (address) : 0xbb78efaaaf9223b4840ea7defdc379a13b16399b
contracts/Lottery.sol
// SPDX-License-Identifier: Unlicensed pragma solidity 0.8.20; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "./utils/VRFConsumerBaseV2.sol"; import "./interfaces/IErinaceusVRF.sol"; import "hardhat/console.sol"; interface ILolik { function submit(address _referral) external payable returns (uint256); function swap(uint256 amount) external; function getPooledFtnByShares(uint256 _sharesAmount) external view returns (uint256); function getSharesByPooledFtn(uint256 _ftnAmount) external view returns (uint256); } contract Lottery is VRFConsumerBaseV2, Ownable { uint256 public currentPoolID; uint256 public nextPoolID; uint256 public day; // test IErinaceusVRF public erinaceusVRF; ILolik public Lolik; ILolik public LolikWithdraw; IERC20 public stFTN; uint64 public subID; uint16 public requestConfirmations; uint32 public gasLimit; bytes32 public keyHash; // tokens that are not claimed yet uint256 public remainingTokens; uint256 public teamRewards; uint256 public totalDeposit; address public team; struct Pool { uint256 poolStart; uint32 countOfWinners; uint256 totalDeposit; uint256 totalTickets; uint256 duration; uint256 lastUpdateTime; uint256[] winnersInPool; uint256 rewardForRound; PoolStatus poolStatus; } struct PoolFlag { uint256 totalDeposit; uint256 totalTickets; uint256 lastUpdateTime; } struct User { uint256 depositFTN; uint256 tickets; uint256 lastUpdatedTime; } // poolId => current user ID mapping(uint256 => uint256) public currentUserIDInPool; // poolId => Pool struct mapping(uint256 => Pool) public poolInfo; // poolId => flagId => poolFlag struct mapping(uint256 => mapping(uint256 => PoolFlag)) public poolFlag; // User address => poolID => UserID mapping(address => mapping(uint256 => uint256)) public userID; // PoolID => UserID => UserInfo mapping(uint256 => mapping(uint256 => User)) public userInfo; enum PoolStatus { notStarted, started, finished } event NewRoundAdded(uint256 indexed id, uint256 duration, uint256 start, uint256 countOfWinners); event RoundFinished(uint256 indexed id, uint256 rewardsForRound, uint256 totalDeposit); event Stake(address indexed user, uint256 amount); event UnStake(address indexed user, uint256 amount); constructor( address _erinaceusVRF, address _vaultContract, address _withdrowalContract, address _team ) VRFConsumerBaseV2(_erinaceusVRF) { erinaceusVRF = IErinaceusVRF(_erinaceusVRF); LolikWithdraw = ILolik(_withdrowalContract); Lolik = ILolik(_vaultContract); stFTN = IERC20(_vaultContract); team = _team; day = 1800; } fallback() external payable {} receive() external payable {} function vrfSetup( uint64 _subID, bytes32 _keyHash, uint32 _gasLimit, uint16 _requestConfirmations ) external onlyOwner{ subID = _subID; keyHash = _keyHash; gasLimit = _gasLimit; requestConfirmations = _requestConfirmations; } function newRound(uint256 duration, uint32 countOfWinners) external onlyOwner { currentPoolID = nextPoolID; if(currentPoolID > 0){ require( poolInfo[currentPoolID - 1].poolStatus == PoolStatus.finished, "Previous pool is not finished" ); } poolInfo[currentPoolID].duration = duration; poolInfo[currentPoolID].poolStart = block.timestamp; poolInfo[currentPoolID].poolStatus = PoolStatus.started; poolInfo[currentPoolID].countOfWinners = countOfWinners; poolInfo[currentPoolID].winnersInPool = new uint256[](countOfWinners); nextPoolID +=1; emit NewRoundAdded(currentPoolID, duration, block.timestamp, countOfWinners); } function finalizeRound() external { Pool storage pool = poolInfo[currentPoolID]; uint256 length = currentUserIDInPool[currentPoolID] / 100; require(pool.poolStart + pool.duration <= block.timestamp, "Pool is still active"); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } for (uint256 i; i <= length; i++) { poolFlag[currentPoolID][i].totalTickets += poolFlag[currentPoolID][i].totalDeposit * ((timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day); poolFlag[currentPoolID][i].lastUpdateTime = timestamp; } pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = timestamp; erinaceusVRF.requestRandomWords( keyHash, subID, requestConfirmations, gasLimit, pool.countOfWinners ); pool.poolStatus = PoolStatus.finished; pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / totalDeposit; remainingTokens += pool.rewardForRound + pool.totalDeposit; teamRewards = stFTN.balanceOf(address(this)) - remainingTokens; emit RoundFinished(currentPoolID, pool.rewardForRound, pool.totalDeposit); } function stake() external payable { Pool storage pool = poolInfo[currentPoolID]; uint256 userId = userID[msg.sender][currentPoolID]; require( pool.poolStatus == PoolStatus.started, "Pool is not started yet" ); require(pool.poolStart + pool.duration - day > block.timestamp, "Not allowed to stake on last day"); require(msg.value > 0, "Nothing to stake"); if (userId == 0) { userId = currentUserIDInPool[currentPoolID]; } User storage user = userInfo[currentPoolID][userId]; userID[msg.sender][currentPoolID] = userId; uint256 amount = Lolik.submit{value: msg.value}(address(this)); amount = Lolik.getPooledFtnByShares(amount); _updatePool(msg.sender, amount, true); userInfo[currentPoolID][userId] = User({ depositFTN: user.depositFTN += amount, tickets: user.tickets, lastUpdatedTime: block.timestamp }); totalDeposit += amount; if (userId == currentUserIDInPool[currentPoolID]) { currentUserIDInPool[currentPoolID]++; } emit Stake(msg.sender, amount); } function unstake(uint256 _amount, uint256 _poolID) external { uint256 userId = userID[msg.sender][_poolID]; User storage user = userInfo[_poolID][userId]; Pool storage pool = poolInfo[_poolID]; require(user.depositFTN >= _amount, "Insufficient deposit"); stFTN.approve(address(LolikWithdraw), _amount); LolikWithdraw.swap(_amount); if(_poolID == currentPoolID){ _updatePool(msg.sender, _amount, false); }else{ remainingTokens -= _amount; } totalDeposit -= _amount; user.depositFTN -= _amount; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } user.lastUpdatedTime = timestamp; _sendViaCall(payable(msg.sender), _amount); emit UnStake(msg.sender, _amount); } function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal virtual override { poolInfo[currentPoolID].winnersInPool = randomWords; } function claimTeamRewards() external { if(teamRewards > 0){ stFTN.approve(address(LolikWithdraw), teamRewards); LolikWithdraw.swap(teamRewards); _sendViaCall(payable(team), teamRewards); teamRewards = 0; } } function check(uint256 poolID) public view returns (uint256[] memory winingNumbers) { uint256 userId = userID[msg.sender][poolID]; Pool memory pool = poolInfo[poolID]; User memory user = userInfo[poolID][userId]; uint256 userIsInFlag = userId / 100; uint256[] memory flagRange = new uint256[](2); if (userIsInFlag > 0) { for (uint256 i; i < userIsInFlag; i++) { flagRange[0] += poolFlag[poolID][i].totalTickets; } } flagRange[1] = flagRange[0] + poolFlag[poolID][userIsInFlag].totalTickets - 1; uint256[] memory usersTicketsRange = new uint256[](2); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } if (userId > 0) { for (uint256 j = userIsInFlag * 100; j < userId; j++) { usersTicketsRange[0] += userInfo[poolID][j].tickets + userInfo[poolID][j].depositFTN * ((timestamp - userInfo[poolID][j].lastUpdatedTime) / day); } usersTicketsRange[0] += flagRange[0]; } else { usersTicketsRange[0] = flagRange[0]; } usersTicketsRange[1] = usersTicketsRange[0] + user.tickets + user.depositFTN * ((timestamp - user.lastUpdatedTime) / day) - 1; uint256[] memory tempWiningNumbers = new uint256[]( poolInfo[poolID].countOfWinners ); uint256 index; for (uint32 k; k < pool.countOfWinners; k++) { if ( usersTicketsRange[0] <= pool.winnersInPool[k] && pool.winnersInPool[k] <= usersTicketsRange[1] ) { tempWiningNumbers[index] = pool.winnersInPool[k]; index++; } } if (index > 0) { winingNumbers = new uint256[](index); for (uint256 i; i < index; i++) { winingNumbers[i] = tempWiningNumbers[i]; } } } function claim(uint256 poolID) external { uint256[] memory winningNumbers = check(poolID); Pool memory pool = poolInfo[currentPoolID]; if (winningNumbers.length > 0) { stFTN.approve(address(LolikWithdraw), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); LolikWithdraw.swap(pool.rewardForRound * winningNumbers.length / pool.countOfWinners); _sendViaCall(payable(msg.sender), pool.rewardForRound * winningNumbers.length / pool.countOfWinners); remainingTokens -= pool.rewardForRound * winningNumbers.length / pool.countOfWinners; } } function _updatePool( address userAddress, uint256 amount, bool isStake ) internal { Pool storage pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } pool.totalTickets += pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = timestamp; if (amount > 0) { if (isStake) { pool.totalDeposit += amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit += amount; poolFlag[currentPoolID][id].lastUpdateTime = timestamp; } if (user.depositFTN > 0) { user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); } if(totalDeposit + amount > 0) { pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / (totalDeposit + amount); teamRewards = stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - pool.rewardForRound; } } else { pool.totalDeposit -= amount; uint256 userId = userID[userAddress][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit -= amount; poolFlag[currentPoolID][id].lastUpdateTime = timestamp; } user.tickets += user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); if(totalDeposit - amount > 0) { pool.rewardForRound = (stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit) * pool.totalDeposit / (totalDeposit - amount); teamRewards = stFTN.balanceOf(address(this)) - remainingTokens - pool.totalDeposit - pool.rewardForRound; } } } } function getChance(address _user) public view returns (uint256 chance){ uint256 userId = userID[_user][currentPoolID]; User memory user = userInfo[currentPoolID][userId]; Pool memory pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + pool.duration) { timestamp = pool.poolStart + pool.duration; } uint256 userTickets = user.tickets + user.depositFTN * ((timestamp - user.lastUpdatedTime) / day); uint256 totalTickets = pool.totalTickets + pool.totalDeposit * ((timestamp - pool.lastUpdateTime) / day); chance = userTickets * 1e18 / totalTickets; } function _sendViaCall(address payable to, uint256 amount) internal { (bool sent, ) = to.call{value: amount}(""); if (!sent) { revert(); } } }
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } }
@openzeppelin/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); }
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
contracts/interfaces/IErinaceusVRF.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; interface IErinaceusVRF { function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 requestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external; }
contracts/utils/VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the ErinaceusVRF * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _erinaceusVRF, address _link) * @dev VRFConsumerBase(_erinaceusVRF) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see ErinaceusVRFInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (ErinaceusVRFInterface for a description of the arguments). * * @dev Once the ErinaceusVRF has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyErinaceusCanFulfill(address have, address want); // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i address private immutable erinaceusVRF; /** * @param _erinaceusVRF address of ErinaceusVRF contract */ constructor(address _erinaceusVRF) { erinaceusVRF = _erinaceusVRF; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by ErinaceusVRF when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != erinaceusVRF) { revert OnlyErinaceusCanFulfill(msg.sender, erinaceusVRF); } fulfillRandomWords(requestId, randomWords); } }
hardhat/console.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"metadata":{"useLiteralContent":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_erinaceusVRF","internalType":"address"},{"type":"address","name":"_vaultContract","internalType":"address"},{"type":"address","name":"_withdrowalContract","internalType":"address"},{"type":"address","name":"_team","internalType":"address"}]},{"type":"error","name":"OnlyErinaceusCanFulfill","inputs":[{"type":"address","name":"have","internalType":"address"},{"type":"address","name":"want","internalType":"address"}]},{"type":"event","name":"NewRoundAdded","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"duration","internalType":"uint256","indexed":false},{"type":"uint256","name":"start","internalType":"uint256","indexed":false},{"type":"uint256","name":"countOfWinners","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoundFinished","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":true},{"type":"uint256","name":"rewardsForRound","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalDeposit","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UnStake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"Lolik","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ILolik"}],"name":"LolikWithdraw","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"winingNumbers","internalType":"uint256[]"}],"name":"check","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimTeamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentUserIDInPool","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"day","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IErinaceusVRF"}],"name":"erinaceusVRF","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalizeRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"chance","internalType":"uint256"}],"name":"getChance","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"keyHash","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"newRound","inputs":[{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nextPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"}],"name":"poolFlag","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"poolStart","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"},{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"},{"type":"uint256","name":"rewardForRound","internalType":"uint256"},{"type":"uint8","name":"poolStatus","internalType":"enum Lottery.PoolStatus"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rawFulfillRandomWords","inputs":[{"type":"uint256","name":"requestId","internalType":"uint256"},{"type":"uint256[]","name":"randomWords","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"remainingTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"requestConfirmations","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stFTN","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"subID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"team","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"teamRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDeposit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userID","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"depositFTN","internalType":"uint256"},{"type":"uint256","name":"tickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdatedTime","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vrfSetup","inputs":[{"type":"uint64","name":"_subID","internalType":"uint64"},{"type":"bytes32","name":"_keyHash","internalType":"bytes32"},{"type":"uint32","name":"_gasLimit","internalType":"uint32"},{"type":"uint16","name":"_requestConfirmations","internalType":"uint16"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60a06040523480156200001157600080fd5b50604051620049e4380380620049e483398181016040528101906200003791906200031b565b838073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200008d62000081620001e560201b60201c565b620001ed60201b60201c565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610708600381905550505050506200038d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e382620002b6565b9050919050565b620002f581620002d6565b81146200030157600080fd5b50565b6000815190506200031581620002ea565b92915050565b60008060008060808587031215620003385762000337620002b1565b5b6000620003488782880162000304565b94505060206200035b8782880162000304565b93505060406200036e8782880162000304565b9250506060620003818782880162000304565b91505092959194509250565b608051614634620003b060003960008181610db50152610e0901526146346000f3fe6080604052600436106101f25760003560e01c806376ce29811161010d578063b345dc8c116100a0578063f2fde38b1161006f578063f2fde38b146106e5578063f41dfe2b1461070e578063f6153ccd14610739578063f68016b714610764578063fb2846291461078f576101f9565b8063b345dc8c14610627578063bf58390314610666578063cc4b97e114610691578063d7070ae2146106ba576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057d5780639e2c8a5b146105a8578063aec47759146105d1578063b0fb162f146105fc576101f9565b806376ce2981146104ab5780637b76ac91146104e857806385f2aef2146105135780638921b0ca1461053e576101f9565b80633a4b66f11161018557806362a58fb81161015457806362a58fb814610401578063669f0e821461042c5780636acf26b914610469578063715018a614610494576101f9565b80633a4b66f114610364578063576a31701461036e5780635f72f4501461039957806361728f39146103d6576101f9565b80632add13c7116101c15780632add13c7146102a85780633121e7d7146102d3578063379607f514610310578063390724ac14610339576101f9565b80631526fe27146101fb578063195a79401461023f5780631e820325146102685780631fe543e31461027f576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d91906135ee565b6107a6565b6040516102369897969594939291906136c0565b60405180910390f35b34801561024b57600080fd5b506102666004803603810190610261919061381a565b61080b565b005b34801561027457600080fd5b5061027d610887565b005b34801561028b57600080fd5b506102a660048036038101906102a191906139da565b610db3565b005b3480156102b457600080fd5b506102bd610e73565b6040516102ca9190613a36565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613aaf565b610e79565b6040516103079190613a36565b60405180910390f35b34801561031c57600080fd5b50610337600480360381019061033291906135ee565b61111f565b005b34801561034557600080fd5b5061034e61145d565b60405161035b9190613a36565b60405180910390f35b61036c611463565b005b34801561037a57600080fd5b50610383611913565b6040516103909190613b3b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906135ee565b611939565b6040516103cd9190613c14565b60405180910390f35b3480156103e257600080fd5b506103eb612146565b6040516103f89190613c45565b60405180910390f35b34801561040d57600080fd5b5061041661214c565b6040516104239190613c6f565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906135ee565b612166565b6040516104609190613a36565b60405180910390f35b34801561047557600080fd5b5061047e61217e565b60405161048b9190613cab565b60405180910390f35b3480156104a057600080fd5b506104a96121a4565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613cc6565b6121b8565b6040516104df9190613a36565b60405180910390f35b3480156104f457600080fd5b506104fd6121dd565b60405161050a9190613a36565b60405180910390f35b34801561051f57600080fd5b506105286121e3565b6040516105359190613d15565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613d30565b612209565b60405161057493929190613d70565b60405180910390f35b34801561058957600080fd5b50610592612240565b60405161059f9190613d15565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613d30565b612269565b005b3480156105dd57600080fd5b506105e661259c565b6040516105f39190613dc8565b60405180910390f35b34801561060857600080fd5b506106116125c2565b60405161061e9190613df2565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613d30565b6125d6565b60405161065d93929190613d70565b60405180910390f35b34801561067257600080fd5b5061067b61260d565b6040516106889190613a36565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613e0d565b612613565b005b3480156106c657600080fd5b506106cf61284f565b6040516106dc9190613a36565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613aaf565b612855565b005b34801561071a57600080fd5b506107236128d8565b6040516107309190613cab565b60405180910390f35b34801561074557600080fd5b5061074e6128fe565b60405161075b9190613a36565b60405180910390f35b34801561077057600080fd5b50610779612904565b6040516107869190613e4d565b60405180910390f35b34801561079b57600080fd5b506107a461291a565b005b600f6020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b610813612ab2565b83600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260098190555081600860006101000a81548163ffffffff021916908363ffffffff160217905550806007601c6101000a81548161ffff021916908361ffff16021790555050505050565b6000600f60006001548152602001908152602001600020905060006064600e60006001548152602001908152602001600020546108c49190613ec6565b905042826004015483600001546108db9190613ef7565b111561091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390613f88565b60405180910390fd5b6000429050826004015483600001546109359190613ef7565b42111561095357826004015483600001546109509190613ef7565b90505b60005b828111610a5357600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154836109959190613fa8565b61099f9190613ec6565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546109d39190613fdc565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610a0b9190613ef7565b92505081905550816010600060015481526020019081526020016000206000838152602001908152602001600020600201819055508080610a4b9061401e565b915050610956565b50600354836005015482610a679190613fa8565b610a719190613ec6565b8360020154610a809190613fdc565b836003016000828254610a939190613ef7565b92505081905550808360050181905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610b54959493929190614066565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610bae57610bad613649565b5b0217905550600c5483600201548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1e9190613d15565b602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906140ce565b610c699190613fa8565b610c739190613fa8565b610c7d9190613fdc565b610c879190613ec6565b836007018190555082600201548360070154610ca39190613ef7565b600a6000828254610cb49190613ef7565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d199190613d15565b602060405180830381865afa158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a91906140ce565b610d649190613fa8565b600b819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e28784600701548560020154604051610da69291906140fb565b60405180910390a2505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6557337f00000000000000000000000000000000000000000000000000000000000000006040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610e5c929190614124565b60405180910390fd5b610e6f8282612b30565b5050565b60015481565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600154815260200190815260200160002054905060006012600060015481526020019081526020016000206000838152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015610fee57602002820191906000526020600020905b815481526020019060010190808311610fda575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561102657611025613649565b5b600281111561103857611037613649565b5b8152505090506000429050816080015182600001516110579190613ef7565b42111561107557816080015182600001516110729190613ef7565b90505b600060035484604001518361108a9190613fa8565b6110949190613ec6565b84600001516110a39190613fdc565b84602001516110b29190613ef7565b905060006003548460a00151846110c99190613fa8565b6110d39190613ec6565b84604001516110e29190613fdc565b84606001516110f19190613ef7565b905080670de0b6b3a7640000836111089190613fdc565b6111129190613ec6565b9650505050505050919050565b600061112a82611939565b90506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111f657602002820191906000526020600020905b8154815260200190600101908083116111e2575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561122e5761122d613649565b5b60028111156112405761123f613649565b5b81525050905060008251111561145857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836020015163ffffffff1685518560e001516112cd9190613fdc565b6112d79190613ec6565b6040518363ffffffff1660e01b81526004016112f492919061414d565b6020604051808303816000875af1158015611313573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133791906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de826020015163ffffffff1684518460e001516113929190613fdc565b61139c9190613ec6565b6040518263ffffffff1660e01b81526004016113b89190613a36565b600060405180830381600087803b1580156113d257600080fd5b505af11580156113e6573d6000803e3d6000fd5b5050505061141933826020015163ffffffff1684518460e0015161140a9190613fdc565b6114149190613ec6565b612b61565b806020015163ffffffff1682518260e001516114359190613fdc565b61143f9190613ec6565b600a60008282546114509190613fa8565b925050819055505b505050565b60025481565b6000600f6000600154815260200190815260200160002090506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600160028111156114e7576114e6613649565b5b8260080160009054906101000a900460ff16600281111561150b5761150a613649565b5b1461154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614227565b60405180910390fd5b42600354836004015484600001546115639190613ef7565b61156d9190613fa8565b116115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490614293565b60405180910390fd5b600034116115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e7906142ff565b60405180910390fd5b6000810361161157600e600060015481526020019081526020016000205490505b60006012600060015481526020019081526020016000206000838152602001908152602001600020905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016116f09190613d15565b60206040518083038185885af115801561170e573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061173391906140ce565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016117909190613a36565b602060405180830381865afa1580156117ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d191906140ce565b90506117df33826001612bdc565b6040518060600160405280828460000160008282546117fe9190613ef7565b92505081905581526020018360010154815260200142815250601260006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505080600c60008282546118709190613ef7565b92505081905550600e600060015481526020019081526020016000205483036118bf57600e6000600154815260200190815260200160002060008154809291906118b99061401e565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516119059190613a36565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600f600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611a5857602002820191906000526020600020905b815481526020019060010190808311611a44575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611a9057611a8f613649565b5b6002811115611aa257611aa1613649565b5b8152505090506000601260008681526020019081526020016000206000848152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000606484611b089190613ec6565b90506000600267ffffffffffffffff811115611b2757611b26613897565b5b604051908082528060200260200182016040528015611b555781602001602082028036833780820191505090505b5090506000821115611bd85760005b82811015611bd6576010600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611ba857611ba761431f565b5b60200260200101818151611bbc9190613ef7565b915081815250508080611bce9061401e565b915050611b64565b505b60016010600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611c1657611c1561431f565b5b6020026020010151611c289190613ef7565b611c329190613fa8565b81600181518110611c4657611c4561431f565b5b6020026020010181815250506000600267ffffffffffffffff811115611c6f57611c6e613897565b5b604051908082528060200260200182016040528015611c9d5781602001602082028036833780820191505090505b509050600042905085608001518660000151611cb99190613ef7565b421115611cd75785608001518660000151611cd49190613ef7565b90505b6000871115611e31576000606485611cef9190613fdc565b90505b87811015611de057600354601260008c815260200190815260200160002060008381526020019081526020016000206002015483611d309190613fa8565b611d3a9190613ec6565b601260008c8152602001908152602001600020600083815260200190815260200160002060000154611d6c9190613fdc565b601260008c8152602001908152602001600020600083815260200190815260200160002060010154611d9e9190613ef7565b83600081518110611db257611db161431f565b5b60200260200101818151611dc69190613ef7565b915081815250508080611dd89061401e565b915050611cf2565b5082600081518110611df557611df461431f565b5b602002602001015182600081518110611e1157611e1061431f565b5b60200260200101818151611e259190613ef7565b91508181525050611e6e565b82600081518110611e4557611e4461431f565b5b602002602001015182600081518110611e6157611e6061431f565b5b6020026020010181815250505b6001600354866040015183611e839190613fa8565b611e8d9190613ec6565b8660000151611e9c9190613fdc565b866020015184600081518110611eb557611eb461431f565b5b6020026020010151611ec79190613ef7565b611ed19190613ef7565b611edb9190613fa8565b82600181518110611eef57611eee61431f565b5b6020026020010181815250506000600f60008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff811115611f4357611f42613897565b5b604051908082528060200260200182016040528015611f715781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015612089578860c001518163ffffffff1681518110611fad57611fac61431f565b5b602002602001015185600081518110611fc957611fc861431f565b5b60200260200101511115801561201e575084600181518110611fee57611fed61431f565b5b60200260200101518960c001518263ffffffff16815181106120135761201261431f565b5b602002602001015111155b15612076578860c001518163ffffffff16815181106120405761203f61431f565b5b602002602001015183838151811061205b5761205a61431f565b5b60200260200101818152505081806120729061401e565b9250505b80806120819061434e565b915050611f78565b506000811115612138578067ffffffffffffffff8111156120ad576120ac613897565b5b6040519080825280602002602001820160405280156120db5781602001602082028036833780820191505090505b50995060005b81811015612136578281815181106120fc576120fb61431f565b5b60200260200101518b82815181106121175761211661431f565b5b602002602001018181525050808061212e9061401e565b9150506120e1565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600e6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121ac612ab2565b6121b6600061346e565b565b6011602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060126000848152602001908152602001600020600083815260200190815260200160002090506000600f600085815260200190815260200160002090508482600001541015612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b906143c6565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b81526004016123c392919061414d565b6020604051808303816000875af11580156123e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240691906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de866040518263ffffffff1660e01b81526004016124629190613a36565b600060405180830381600087803b15801561247c57600080fd5b505af1158015612490573d6000803e3d6000fd5b5050505060015484036124ae576124a933866000612bdc565b6124c8565b84600a60008282546124c09190613fa8565b925050819055505b84600c60008282546124da9190613fa8565b92505081905550848260000160008282546124f59190613fa8565b925050819055506000429050816004015482600001546125159190613ef7565b42111561253357816004015482600001546125309190613ef7565b90505b8083600201819055506125463387612b61565b3373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac997958760405161258c9190613a36565b60405180910390a2505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6012602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600a5481565b61261b612ab2565b600254600181905550600060015411156126c65760028081111561264257612641613649565b5b600f6000600180546126549190613fa8565b815260200190815260200160002060080160009054906101000a900460ff16600281111561268557612684613649565b5b146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90614432565b60405180910390fd5b5b81600f600060015481526020019081526020016000206004018190555042600f60006001548152602001908152602001600020600001819055506001600f6000600154815260200190815260200160002060080160006101000a81548160ff0219169083600281111561273c5761273b613649565b5b021790555080600f6000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff81111561279857612797613897565b5b6040519080825280602002602001820160405280156127c65781602001602082028036833780820191505090505b50600f6000600154815260200190815260200160002060060190805190602001906127f292919061353a565b506001600260008282546128069190613ef7565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede8583428460405161284393929190614483565b60405180910390a25050565b600b5481565b61285d612ab2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c39061452c565b60405180910390fd5b6128d58161346e565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612ab057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b81526004016129a692919061414d565b6020604051808303816000875af11580156129c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e991906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612a479190613a36565b600060405180830381600087803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b50505050612aa7600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612b61565b6000600b819055505b565b612aba613532565b73ffffffffffffffffffffffffffffffffffffffff16612ad8612240565b73ffffffffffffffffffffffffffffffffffffffff1614612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2590614598565b60405180910390fd5b565b80600f600060015481526020019081526020016000206006019080519060200190612b5c92919061353a565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b87906145e9565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5050905080612bd757600080fd5b505050565b6000600f600060015481526020019081526020016000209050600042905081600401548260000154612c0e9190613ef7565b421115612c2c5781600401548260000154612c299190613ef7565b90505b600354826005015482612c3f9190613fa8565b612c499190613ec6565b8260020154612c589190613fdc565b826003016000828254612c6b9190613ef7565b9250508190555080826005018190555060008411156134675782156130815783826002016000828254612c9e9190613ef7565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601260006001548152602001908152602001600020600083815260200190815260200160002090506000606483612d359190613ec6565b905060035460106000600154815260200190815260200160002060008381526020019081526020016000206002015485612d6f9190613fa8565b612d799190613ec6565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154612dad9190613fdc565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254612de59190613ef7565b925050819055508660106000600154815260200190815260200160002060008381526020019081526020016000206000016000828254612e259190613ef7565b925050819055508360106000600154815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115612eaf57600354816002015484612e7b9190613fa8565b612e859190613ec6565b8160000154612e949190613fdc565b816001016000828254612ea79190613ef7565b925050819055505b600086600c54612ebf9190613ef7565b111561307a5785600c54612ed39190613ef7565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f3b9190613d15565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906140ce565b612f869190613fa8565b612f909190613fa8565b612f9a9190613fdc565b612fa49190613ec6565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130149190613d15565b602060405180830381865afa158015613031573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305591906140ce565b61305f9190613fa8565b6130699190613fa8565b6130739190613fa8565b600b819055505b5050613466565b838260020160008282546130959190613fa8565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060126000600154815260200190815260200160002060008381526020019081526020016000209050600060648361312c9190613ec6565b9050600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154856131669190613fa8565b6131709190613ec6565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546131a49190613fdc565b601060006001548152602001908152602001600020600083815260200190815260200160002060010160008282546131dc9190613ef7565b92505081905550866010600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461321c9190613fa8565b9250508190555083601060006001548152602001908152602001600020600083815260200190815260200160002060020181905550506003548160020154846132659190613fa8565b61326f9190613ec6565b816000015461327e9190613fdc565b8160010160008282546132919190613ef7565b92505081905550600086600c546132a89190613fa8565b11156134635785600c546132bc9190613fa8565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133249190613d15565b602060405180830381865afa158015613341573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336591906140ce565b61336f9190613fa8565b6133799190613fa8565b6133839190613fdc565b61338d9190613ec6565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133fd9190613d15565b602060405180830381865afa15801561341a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343e91906140ce565b6134489190613fa8565b6134529190613fa8565b61345c9190613fa8565b600b819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b828054828255906000526020600020908101928215613576579160200282015b8281111561357557825182559160200191906001019061355a565b5b5090506135839190613587565b5090565b5b808211156135a0576000816000905550600101613588565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6135cb816135b8565b81146135d657600080fd5b50565b6000813590506135e8816135c2565b92915050565b600060208284031215613604576136036135ae565b5b6000613612848285016135d9565b91505092915050565b613624816135b8565b82525050565b600063ffffffff82169050919050565b6136438161362a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061368957613688613649565b5b50565b600081905061369a82613678565b919050565b60006136aa8261368c565b9050919050565b6136ba8161369f565b82525050565b6000610100820190506136d6600083018b61361b565b6136e3602083018a61363a565b6136f0604083018961361b565b6136fd606083018861361b565b61370a608083018761361b565b61371760a083018661361b565b61372460c083018561361b565b61373160e08301846136b1565b9998505050505050505050565b600067ffffffffffffffff82169050919050565b61375b8161373e565b811461376657600080fd5b50565b60008135905061377881613752565b92915050565b6000819050919050565b6137918161377e565b811461379c57600080fd5b50565b6000813590506137ae81613788565b92915050565b6137bd8161362a565b81146137c857600080fd5b50565b6000813590506137da816137b4565b92915050565b600061ffff82169050919050565b6137f7816137e0565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b60008060008060808587031215613834576138336135ae565b5b600061384287828801613769565b94505060206138538782880161379f565b9350506040613864878288016137cb565b925050606061387587828801613805565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138cf82613886565b810181811067ffffffffffffffff821117156138ee576138ed613897565b5b80604052505050565b60006139016135a4565b905061390d82826138c6565b919050565b600067ffffffffffffffff82111561392d5761392c613897565b5b602082029050602081019050919050565b600080fd5b600061395661395184613912565b6138f7565b905080838252602082019050602084028301858111156139795761397861393e565b5b835b818110156139a2578061398e88826135d9565b84526020840193505060208101905061397b565b5050509392505050565b600082601f8301126139c1576139c0613881565b5b81356139d1848260208601613943565b91505092915050565b600080604083850312156139f1576139f06135ae565b5b60006139ff858286016135d9565b925050602083013567ffffffffffffffff811115613a2057613a1f6135b3565b5b613a2c858286016139ac565b9150509250929050565b6000602082019050613a4b600083018461361b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7c82613a51565b9050919050565b613a8c81613a71565b8114613a9757600080fd5b50565b600081359050613aa981613a83565b92915050565b600060208284031215613ac557613ac46135ae565b5b6000613ad384828501613a9a565b91505092915050565b6000819050919050565b6000613b01613afc613af784613a51565b613adc565b613a51565b9050919050565b6000613b1382613ae6565b9050919050565b6000613b2582613b08565b9050919050565b613b3581613b1a565b82525050565b6000602082019050613b506000830184613b2c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b8b816135b8565b82525050565b6000613b9d8383613b82565b60208301905092915050565b6000602082019050919050565b6000613bc182613b56565b613bcb8185613b61565b9350613bd683613b72565b8060005b83811015613c07578151613bee8882613b91565b9750613bf983613ba9565b925050600181019050613bda565b5085935050505092915050565b60006020820190508181036000830152613c2e8184613bb6565b905092915050565b613c3f8161377e565b82525050565b6000602082019050613c5a6000830184613c36565b92915050565b613c698161373e565b82525050565b6000602082019050613c846000830184613c60565b92915050565b6000613c9582613b08565b9050919050565b613ca581613c8a565b82525050565b6000602082019050613cc06000830184613c9c565b92915050565b60008060408385031215613cdd57613cdc6135ae565b5b6000613ceb85828601613a9a565b9250506020613cfc858286016135d9565b9150509250929050565b613d0f81613a71565b82525050565b6000602082019050613d2a6000830184613d06565b92915050565b60008060408385031215613d4757613d466135ae565b5b6000613d55858286016135d9565b9250506020613d66858286016135d9565b9150509250929050565b6000606082019050613d85600083018661361b565b613d92602083018561361b565b613d9f604083018461361b565b949350505050565b6000613db282613b08565b9050919050565b613dc281613da7565b82525050565b6000602082019050613ddd6000830184613db9565b92915050565b613dec816137e0565b82525050565b6000602082019050613e076000830184613de3565b92915050565b60008060408385031215613e2457613e236135ae565b5b6000613e32858286016135d9565b9250506020613e43858286016137cb565b9150509250929050565b6000602082019050613e62600083018461363a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ed1826135b8565b9150613edc836135b8565b925082613eec57613eeb613e68565b5b828204905092915050565b6000613f02826135b8565b9150613f0d836135b8565b9250828201905080821115613f2557613f24613e97565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b6000613f72601483613f2b565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b6000613fb3826135b8565b9150613fbe836135b8565b9250828203905081811115613fd657613fd5613e97565b5b92915050565b6000613fe7826135b8565b9150613ff2836135b8565b9250828202614000816135b8565b9150828204841483151761401757614016613e97565b5b5092915050565b6000614029826135b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405b5761405a613e97565b5b600182019050919050565b600060a08201905061407b6000830188613c36565b6140886020830187613c60565b6140956040830186613de3565b6140a2606083018561363a565b6140af608083018461363a565b9695505050505050565b6000815190506140c8816135c2565b92915050565b6000602082840312156140e4576140e36135ae565b5b60006140f2848285016140b9565b91505092915050565b6000604082019050614110600083018561361b565b61411d602083018461361b565b9392505050565b60006040820190506141396000830185613d06565b6141466020830184613d06565b9392505050565b60006040820190506141626000830185613d06565b61416f602083018461361b565b9392505050565b60008115159050919050565b61418b81614176565b811461419657600080fd5b50565b6000815190506141a881614182565b92915050565b6000602082840312156141c4576141c36135ae565b5b60006141d284828501614199565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000614211601783613f2b565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4e6f7420616c6c6f77656420746f207374616b65206f6e206c61737420646179600082015250565b600061427d602083613f2b565b915061428882614247565b602082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b60006142e9601083613f2b565b91506142f4826142b3565b602082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006143598261362a565b915063ffffffff820361436f5761436e613e97565b5b600182019050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006143b0601483613f2b565b91506143bb8261437a565b602082019050919050565b600060208201905081810360008301526143df816143a3565b9050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b600061441c601d83613f2b565b9150614427826143e6565b602082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b600061446d6144686144638461362a565b613adc565b6135b8565b9050919050565b61447d81614452565b82525050565b6000606082019050614498600083018661361b565b6144a5602083018561361b565b6144b26040830184614474565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614516602683613f2b565b9150614521826144ba565b604082019050919050565b6000602082019050818103600083015261454581614509565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614582602083613f2b565b915061458d8261454c565b602082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b600081905092915050565b50565b60006145d36000836145b8565b91506145de826145c3565b600082019050919050565b60006145f4826145c6565b915081905091905056fea2646970667358221220d7e9d010124d5532de5bfaaf634dc264b73146913901821b0309cde6b59f84cf64736f6c634300081400330000000000000000000000006c8c9bb7e89652b1c7d4fd00b7cce1dba2361304000000000000000000000000780fb5aca83f2e3f57ee18cc3094988ef49d8c3d0000000000000000000000000ca83dd56af172a1e04b667d6e64446d0b88c4a4000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b
Deployed ByteCode
0x6080604052600436106101f25760003560e01c806376ce29811161010d578063b345dc8c116100a0578063f2fde38b1161006f578063f2fde38b146106e5578063f41dfe2b1461070e578063f6153ccd14610739578063f68016b714610764578063fb2846291461078f576101f9565b8063b345dc8c14610627578063bf58390314610666578063cc4b97e114610691578063d7070ae2146106ba576101f9565b80638da5cb5b116100dc5780638da5cb5b1461057d5780639e2c8a5b146105a8578063aec47759146105d1578063b0fb162f146105fc576101f9565b806376ce2981146104ab5780637b76ac91146104e857806385f2aef2146105135780638921b0ca1461053e576101f9565b80633a4b66f11161018557806362a58fb81161015457806362a58fb814610401578063669f0e821461042c5780636acf26b914610469578063715018a614610494576101f9565b80633a4b66f114610364578063576a31701461036e5780635f72f4501461039957806361728f39146103d6576101f9565b80632add13c7116101c15780632add13c7146102a85780633121e7d7146102d3578063379607f514610310578063390724ac14610339576101f9565b80631526fe27146101fb578063195a79401461023f5780631e820325146102685780631fe543e31461027f576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d91906135ee565b6107a6565b6040516102369897969594939291906136c0565b60405180910390f35b34801561024b57600080fd5b506102666004803603810190610261919061381a565b61080b565b005b34801561027457600080fd5b5061027d610887565b005b34801561028b57600080fd5b506102a660048036038101906102a191906139da565b610db3565b005b3480156102b457600080fd5b506102bd610e73565b6040516102ca9190613a36565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613aaf565b610e79565b6040516103079190613a36565b60405180910390f35b34801561031c57600080fd5b50610337600480360381019061033291906135ee565b61111f565b005b34801561034557600080fd5b5061034e61145d565b60405161035b9190613a36565b60405180910390f35b61036c611463565b005b34801561037a57600080fd5b50610383611913565b6040516103909190613b3b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906135ee565b611939565b6040516103cd9190613c14565b60405180910390f35b3480156103e257600080fd5b506103eb612146565b6040516103f89190613c45565b60405180910390f35b34801561040d57600080fd5b5061041661214c565b6040516104239190613c6f565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906135ee565b612166565b6040516104609190613a36565b60405180910390f35b34801561047557600080fd5b5061047e61217e565b60405161048b9190613cab565b60405180910390f35b3480156104a057600080fd5b506104a96121a4565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613cc6565b6121b8565b6040516104df9190613a36565b60405180910390f35b3480156104f457600080fd5b506104fd6121dd565b60405161050a9190613a36565b60405180910390f35b34801561051f57600080fd5b506105286121e3565b6040516105359190613d15565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613d30565b612209565b60405161057493929190613d70565b60405180910390f35b34801561058957600080fd5b50610592612240565b60405161059f9190613d15565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613d30565b612269565b005b3480156105dd57600080fd5b506105e661259c565b6040516105f39190613dc8565b60405180910390f35b34801561060857600080fd5b506106116125c2565b60405161061e9190613df2565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613d30565b6125d6565b60405161065d93929190613d70565b60405180910390f35b34801561067257600080fd5b5061067b61260d565b6040516106889190613a36565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613e0d565b612613565b005b3480156106c657600080fd5b506106cf61284f565b6040516106dc9190613a36565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190613aaf565b612855565b005b34801561071a57600080fd5b506107236128d8565b6040516107309190613cab565b60405180910390f35b34801561074557600080fd5b5061074e6128fe565b60405161075b9190613a36565b60405180910390f35b34801561077057600080fd5b50610779612904565b6040516107869190613e4d565b60405180910390f35b34801561079b57600080fd5b506107a461291a565b005b600f6020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070154908060080160009054906101000a900460ff16905088565b610813612ab2565b83600760146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260098190555081600860006101000a81548163ffffffff021916908363ffffffff160217905550806007601c6101000a81548161ffff021916908361ffff16021790555050505050565b6000600f60006001548152602001908152602001600020905060006064600e60006001548152602001908152602001600020546108c49190613ec6565b905042826004015483600001546108db9190613ef7565b111561091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390613f88565b60405180910390fd5b6000429050826004015483600001546109359190613ef7565b42111561095357826004015483600001546109509190613ef7565b90505b60005b828111610a5357600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154836109959190613fa8565b61099f9190613ec6565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546109d39190613fdc565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254610a0b9190613ef7565b92505081905550816010600060015481526020019081526020016000206000838152602001908152602001600020600201819055508080610a4b9061401e565b915050610956565b50600354836005015482610a679190613fa8565b610a719190613ec6565b8360020154610a809190613fdc565b836003016000828254610a939190613ef7565b92505081905550808360050181905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600760149054906101000a900467ffffffffffffffff166007601c9054906101000a900461ffff16600860009054906101000a900463ffffffff168860010160009054906101000a900463ffffffff166040518663ffffffff1660e01b8152600401610b54959493929190614066565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b5050505060028360080160006101000a81548160ff02191690836002811115610bae57610bad613649565b5b0217905550600c5483600201548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c1e9190613d15565b602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906140ce565b610c699190613fa8565b610c739190613fa8565b610c7d9190613fdc565b610c879190613ec6565b836007018190555082600201548360070154610ca39190613ef7565b600a6000828254610cb49190613ef7565b92505081905550600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d199190613d15565b602060405180830381865afa158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a91906140ce565b610d649190613fa8565b600b819055506001547f87d39ec94082b342cc157bbd80096ad2fa03e1698a57924ad16e36709cb0e28784600701548560020154604051610da69291906140fb565b60405180910390a2505050565b7f0000000000000000000000006c8c9bb7e89652b1c7d4fd00b7cce1dba236130473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6557337f0000000000000000000000006c8c9bb7e89652b1c7d4fd00b7cce1dba23613046040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610e5c929190614124565b60405180910390fd5b610e6f8282612b30565b5050565b60015481565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600154815260200190815260200160002054905060006012600060015481526020019081526020016000206000838152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015610fee57602002820191906000526020600020905b815481526020019060010190808311610fda575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561102657611025613649565b5b600281111561103857611037613649565b5b8152505090506000429050816080015182600001516110579190613ef7565b42111561107557816080015182600001516110729190613ef7565b90505b600060035484604001518361108a9190613fa8565b6110949190613ec6565b84600001516110a39190613fdc565b84602001516110b29190613ef7565b905060006003548460a00151846110c99190613fa8565b6110d39190613ec6565b84604001516110e29190613fdc565b84606001516110f19190613ef7565b905080670de0b6b3a7640000836111089190613fdc565b6111129190613ec6565b9650505050505050919050565b600061112a82611939565b90506000600f6000600154815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111f657602002820191906000526020600020905b8154815260200190600101908083116111e2575b50505050508152602001600782015481526020016008820160009054906101000a900460ff16600281111561122e5761122d613649565b5b60028111156112405761123f613649565b5b81525050905060008251111561145857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836020015163ffffffff1685518560e001516112cd9190613fdc565b6112d79190613ec6565b6040518363ffffffff1660e01b81526004016112f492919061414d565b6020604051808303816000875af1158015611313573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133791906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de826020015163ffffffff1684518460e001516113929190613fdc565b61139c9190613ec6565b6040518263ffffffff1660e01b81526004016113b89190613a36565b600060405180830381600087803b1580156113d257600080fd5b505af11580156113e6573d6000803e3d6000fd5b5050505061141933826020015163ffffffff1684518460e0015161140a9190613fdc565b6114149190613ec6565b612b61565b806020015163ffffffff1682518260e001516114359190613fdc565b61143f9190613ec6565b600a60008282546114509190613fa8565b925050819055505b505050565b60025481565b6000600f6000600154815260200190815260200160002090506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600160028111156114e7576114e6613649565b5b8260080160009054906101000a900460ff16600281111561150b5761150a613649565b5b1461154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614227565b60405180910390fd5b42600354836004015484600001546115639190613ef7565b61156d9190613fa8565b116115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490614293565b60405180910390fd5b600034116115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e7906142ff565b60405180910390fd5b6000810361161157600e600060015481526020019081526020016000205490505b60006012600060015481526020019081526020016000206000838152602001908152602001600020905081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020819055506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1903eab34306040518363ffffffff1660e01b81526004016116f09190613d15565b60206040518083038185885af115801561170e573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061173391906140ce565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d48764e826040518263ffffffff1660e01b81526004016117909190613a36565b602060405180830381865afa1580156117ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d191906140ce565b90506117df33826001612bdc565b6040518060600160405280828460000160008282546117fe9190613ef7565b92505081905581526020018360010154815260200142815250601260006001548152602001908152602001600020600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505080600c60008282546118709190613ef7565b92505081905550600e600060015481526020019081526020016000205483036118bf57600e6000600154815260200190815260200160002060008154809291906118b99061401e565b91905055505b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516119059190613a36565b60405180910390a250505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205490506000600f600085815260200190815260200160002060405180610120016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015611a5857602002820191906000526020600020905b815481526020019060010190808311611a44575b50505050508152602001600782015481526020016008820160009054906101000a900460ff166002811115611a9057611a8f613649565b5b6002811115611aa257611aa1613649565b5b8152505090506000601260008681526020019081526020016000206000848152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000606484611b089190613ec6565b90506000600267ffffffffffffffff811115611b2757611b26613897565b5b604051908082528060200260200182016040528015611b555781602001602082028036833780820191505090505b5090506000821115611bd85760005b82811015611bd6576010600089815260200190815260200160002060008281526020019081526020016000206001015482600081518110611ba857611ba761431f565b5b60200260200101818151611bbc9190613ef7565b915081815250508080611bce9061401e565b915050611b64565b505b60016010600089815260200190815260200160002060008481526020019081526020016000206001015482600081518110611c1657611c1561431f565b5b6020026020010151611c289190613ef7565b611c329190613fa8565b81600181518110611c4657611c4561431f565b5b6020026020010181815250506000600267ffffffffffffffff811115611c6f57611c6e613897565b5b604051908082528060200260200182016040528015611c9d5781602001602082028036833780820191505090505b509050600042905085608001518660000151611cb99190613ef7565b421115611cd75785608001518660000151611cd49190613ef7565b90505b6000871115611e31576000606485611cef9190613fdc565b90505b87811015611de057600354601260008c815260200190815260200160002060008381526020019081526020016000206002015483611d309190613fa8565b611d3a9190613ec6565b601260008c8152602001908152602001600020600083815260200190815260200160002060000154611d6c9190613fdc565b601260008c8152602001908152602001600020600083815260200190815260200160002060010154611d9e9190613ef7565b83600081518110611db257611db161431f565b5b60200260200101818151611dc69190613ef7565b915081815250508080611dd89061401e565b915050611cf2565b5082600081518110611df557611df461431f565b5b602002602001015182600081518110611e1157611e1061431f565b5b60200260200101818151611e259190613ef7565b91508181525050611e6e565b82600081518110611e4557611e4461431f565b5b602002602001015182600081518110611e6157611e6061431f565b5b6020026020010181815250505b6001600354866040015183611e839190613fa8565b611e8d9190613ec6565b8660000151611e9c9190613fdc565b866020015184600081518110611eb557611eb461431f565b5b6020026020010151611ec79190613ef7565b611ed19190613ef7565b611edb9190613fa8565b82600181518110611eef57611eee61431f565b5b6020026020010181815250506000600f60008b815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff811115611f4357611f42613897565b5b604051908082528060200260200182016040528015611f715781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015612089578860c001518163ffffffff1681518110611fad57611fac61431f565b5b602002602001015185600081518110611fc957611fc861431f565b5b60200260200101511115801561201e575084600181518110611fee57611fed61431f565b5b60200260200101518960c001518263ffffffff16815181106120135761201261431f565b5b602002602001015111155b15612076578860c001518163ffffffff16815181106120405761203f61431f565b5b602002602001015183838151811061205b5761205a61431f565b5b60200260200101818152505081806120729061401e565b9250505b80806120819061434e565b915050611f78565b506000811115612138578067ffffffffffffffff8111156120ad576120ac613897565b5b6040519080825280602002602001820160405280156120db5781602001602082028036833780820191505090505b50995060005b81811015612136578281815181106120fc576120fb61431f565b5b60200260200101518b82815181106121175761211661431f565b5b602002602001018181525050808061212e9061401e565b9150506120e1565b505b505050505050505050919050565b60095481565b600760149054906101000a900467ffffffffffffffff1681565b600e6020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121ac612ab2565b6121b6600061346e565b565b6011602052816000526040600020602052806000526040600020600091509150505481565b60035481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020549050600060126000848152602001908152602001600020600083815260200190815260200160002090506000600f600085815260200190815260200160002090508482600001541015612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233b906143c6565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b81526004016123c392919061414d565b6020604051808303816000875af11580156123e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240691906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de866040518263ffffffff1660e01b81526004016124629190613a36565b600060405180830381600087803b15801561247c57600080fd5b505af1158015612490573d6000803e3d6000fd5b5050505060015484036124ae576124a933866000612bdc565b6124c8565b84600a60008282546124c09190613fa8565b925050819055505b84600c60008282546124da9190613fa8565b92505081905550848260000160008282546124f59190613fa8565b925050819055506000429050816004015482600001546125159190613ef7565b42111561253357816004015482600001546125309190613ef7565b90505b8083600201819055506125463387612b61565b3373ffffffffffffffffffffffffffffffffffffffff167fb24546d975e2628748efc9aced80665e0fad66272033e5c0ea25fd3afac997958760405161258c9190613a36565b60405180910390a2505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6007601c9054906101000a900461ffff1681565b6012602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600a5481565b61261b612ab2565b600254600181905550600060015411156126c65760028081111561264257612641613649565b5b600f6000600180546126549190613fa8565b815260200190815260200160002060080160009054906101000a900460ff16600281111561268557612684613649565b5b146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90614432565b60405180910390fd5b5b81600f600060015481526020019081526020016000206004018190555042600f60006001548152602001908152602001600020600001819055506001600f6000600154815260200190815260200160002060080160006101000a81548160ff0219169083600281111561273c5761273b613649565b5b021790555080600f6000600154815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff81111561279857612797613897565b5b6040519080825280602002602001820160405280156127c65781602001602082028036833780820191505090505b50600f6000600154815260200190815260200160002060060190805190602001906127f292919061353a565b506001600260008282546128069190613ef7565b925050819055506001547fcf30947cc5e4faa736b723018e806822835db29e1b1c2e6d140f95e19d8ede8583428460405161284393929190614483565b60405180910390a25050565b600b5481565b61285d612ab2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c39061452c565b60405180910390fd5b6128d58161346e565b50565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600860009054906101000a900463ffffffff1681565b6000600b541115612ab057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b546040518363ffffffff1660e01b81526004016129a692919061414d565b6020604051808303816000875af11580156129c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e991906141ae565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166394b918de600b546040518263ffffffff1660e01b8152600401612a479190613a36565b600060405180830381600087803b158015612a6157600080fd5b505af1158015612a75573d6000803e3d6000fd5b50505050612aa7600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b54612b61565b6000600b819055505b565b612aba613532565b73ffffffffffffffffffffffffffffffffffffffff16612ad8612240565b73ffffffffffffffffffffffffffffffffffffffff1614612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2590614598565b60405180910390fd5b565b80600f600060015481526020019081526020016000206006019080519060200190612b5c92919061353a565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b87906145e9565b60006040518083038185875af1925050503d8060008114612bc4576040519150601f19603f3d011682016040523d82523d6000602084013e612bc9565b606091505b5050905080612bd757600080fd5b505050565b6000600f600060015481526020019081526020016000209050600042905081600401548260000154612c0e9190613ef7565b421115612c2c5781600401548260000154612c299190613ef7565b90505b600354826005015482612c3f9190613fa8565b612c499190613ec6565b8260020154612c589190613fdc565b826003016000828254612c6b9190613ef7565b9250508190555080826005018190555060008411156134675782156130815783826002016000828254612c9e9190613ef7565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060015481526020019081526020016000205490506000601260006001548152602001908152602001600020600083815260200190815260200160002090506000606483612d359190613ec6565b905060035460106000600154815260200190815260200160002060008381526020019081526020016000206002015485612d6f9190613fa8565b612d799190613ec6565b601060006001548152602001908152602001600020600083815260200190815260200160002060000154612dad9190613fdc565b60106000600154815260200190815260200160002060008381526020019081526020016000206001016000828254612de59190613ef7565b925050819055508660106000600154815260200190815260200160002060008381526020019081526020016000206000016000828254612e259190613ef7565b925050819055508360106000600154815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115612eaf57600354816002015484612e7b9190613fa8565b612e859190613ec6565b8160000154612e949190613fdc565b816001016000828254612ea79190613ef7565b925050819055505b600086600c54612ebf9190613ef7565b111561307a5785600c54612ed39190613ef7565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f3b9190613d15565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906140ce565b612f869190613fa8565b612f909190613fa8565b612f9a9190613fdc565b612fa49190613ec6565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130149190613d15565b602060405180830381865afa158015613031573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305591906140ce565b61305f9190613fa8565b6130699190613fa8565b6130739190613fa8565b600b819055505b5050613466565b838260020160008282546130959190613fa8565b925050819055506000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001548152602001908152602001600020549050600060126000600154815260200190815260200160002060008381526020019081526020016000209050600060648361312c9190613ec6565b9050600354601060006001548152602001908152602001600020600083815260200190815260200160002060020154856131669190613fa8565b6131709190613ec6565b6010600060015481526020019081526020016000206000838152602001908152602001600020600001546131a49190613fdc565b601060006001548152602001908152602001600020600083815260200190815260200160002060010160008282546131dc9190613ef7565b92505081905550866010600060015481526020019081526020016000206000838152602001908152602001600020600001600082825461321c9190613fa8565b9250508190555083601060006001548152602001908152602001600020600083815260200190815260200160002060020181905550506003548160020154846132659190613fa8565b61326f9190613ec6565b816000015461327e9190613fdc565b8160010160008282546132919190613ef7565b92505081905550600086600c546132a89190613fa8565b11156134635785600c546132bc9190613fa8565b84600201548560020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133249190613d15565b602060405180830381865afa158015613341573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336591906140ce565b61336f9190613fa8565b6133799190613fa8565b6133839190613fdc565b61338d9190613ec6565b846007018190555083600701548460020154600a54600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133fd9190613d15565b602060405180830381865afa15801561341a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343e91906140ce565b6134489190613fa8565b6134529190613fa8565b61345c9190613fa8565b600b819055505b50505b5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b828054828255906000526020600020908101928215613576579160200282015b8281111561357557825182559160200191906001019061355a565b5b5090506135839190613587565b5090565b5b808211156135a0576000816000905550600101613588565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6135cb816135b8565b81146135d657600080fd5b50565b6000813590506135e8816135c2565b92915050565b600060208284031215613604576136036135ae565b5b6000613612848285016135d9565b91505092915050565b613624816135b8565b82525050565b600063ffffffff82169050919050565b6136438161362a565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061368957613688613649565b5b50565b600081905061369a82613678565b919050565b60006136aa8261368c565b9050919050565b6136ba8161369f565b82525050565b6000610100820190506136d6600083018b61361b565b6136e3602083018a61363a565b6136f0604083018961361b565b6136fd606083018861361b565b61370a608083018761361b565b61371760a083018661361b565b61372460c083018561361b565b61373160e08301846136b1565b9998505050505050505050565b600067ffffffffffffffff82169050919050565b61375b8161373e565b811461376657600080fd5b50565b60008135905061377881613752565b92915050565b6000819050919050565b6137918161377e565b811461379c57600080fd5b50565b6000813590506137ae81613788565b92915050565b6137bd8161362a565b81146137c857600080fd5b50565b6000813590506137da816137b4565b92915050565b600061ffff82169050919050565b6137f7816137e0565b811461380257600080fd5b50565b600081359050613814816137ee565b92915050565b60008060008060808587031215613834576138336135ae565b5b600061384287828801613769565b94505060206138538782880161379f565b9350506040613864878288016137cb565b925050606061387587828801613805565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138cf82613886565b810181811067ffffffffffffffff821117156138ee576138ed613897565b5b80604052505050565b60006139016135a4565b905061390d82826138c6565b919050565b600067ffffffffffffffff82111561392d5761392c613897565b5b602082029050602081019050919050565b600080fd5b600061395661395184613912565b6138f7565b905080838252602082019050602084028301858111156139795761397861393e565b5b835b818110156139a2578061398e88826135d9565b84526020840193505060208101905061397b565b5050509392505050565b600082601f8301126139c1576139c0613881565b5b81356139d1848260208601613943565b91505092915050565b600080604083850312156139f1576139f06135ae565b5b60006139ff858286016135d9565b925050602083013567ffffffffffffffff811115613a2057613a1f6135b3565b5b613a2c858286016139ac565b9150509250929050565b6000602082019050613a4b600083018461361b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7c82613a51565b9050919050565b613a8c81613a71565b8114613a9757600080fd5b50565b600081359050613aa981613a83565b92915050565b600060208284031215613ac557613ac46135ae565b5b6000613ad384828501613a9a565b91505092915050565b6000819050919050565b6000613b01613afc613af784613a51565b613adc565b613a51565b9050919050565b6000613b1382613ae6565b9050919050565b6000613b2582613b08565b9050919050565b613b3581613b1a565b82525050565b6000602082019050613b506000830184613b2c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b8b816135b8565b82525050565b6000613b9d8383613b82565b60208301905092915050565b6000602082019050919050565b6000613bc182613b56565b613bcb8185613b61565b9350613bd683613b72565b8060005b83811015613c07578151613bee8882613b91565b9750613bf983613ba9565b925050600181019050613bda565b5085935050505092915050565b60006020820190508181036000830152613c2e8184613bb6565b905092915050565b613c3f8161377e565b82525050565b6000602082019050613c5a6000830184613c36565b92915050565b613c698161373e565b82525050565b6000602082019050613c846000830184613c60565b92915050565b6000613c9582613b08565b9050919050565b613ca581613c8a565b82525050565b6000602082019050613cc06000830184613c9c565b92915050565b60008060408385031215613cdd57613cdc6135ae565b5b6000613ceb85828601613a9a565b9250506020613cfc858286016135d9565b9150509250929050565b613d0f81613a71565b82525050565b6000602082019050613d2a6000830184613d06565b92915050565b60008060408385031215613d4757613d466135ae565b5b6000613d55858286016135d9565b9250506020613d66858286016135d9565b9150509250929050565b6000606082019050613d85600083018661361b565b613d92602083018561361b565b613d9f604083018461361b565b949350505050565b6000613db282613b08565b9050919050565b613dc281613da7565b82525050565b6000602082019050613ddd6000830184613db9565b92915050565b613dec816137e0565b82525050565b6000602082019050613e076000830184613de3565b92915050565b60008060408385031215613e2457613e236135ae565b5b6000613e32858286016135d9565b9250506020613e43858286016137cb565b9150509250929050565b6000602082019050613e62600083018461363a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ed1826135b8565b9150613edc836135b8565b925082613eec57613eeb613e68565b5b828204905092915050565b6000613f02826135b8565b9150613f0d836135b8565b9250828201905080821115613f2557613f24613e97565b5b92915050565b600082825260208201905092915050565b7f506f6f6c206973207374696c6c20616374697665000000000000000000000000600082015250565b6000613f72601483613f2b565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b6000613fb3826135b8565b9150613fbe836135b8565b9250828203905081811115613fd657613fd5613e97565b5b92915050565b6000613fe7826135b8565b9150613ff2836135b8565b9250828202614000816135b8565b9150828204841483151761401757614016613e97565b5b5092915050565b6000614029826135b8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405b5761405a613e97565b5b600182019050919050565b600060a08201905061407b6000830188613c36565b6140886020830187613c60565b6140956040830186613de3565b6140a2606083018561363a565b6140af608083018461363a565b9695505050505050565b6000815190506140c8816135c2565b92915050565b6000602082840312156140e4576140e36135ae565b5b60006140f2848285016140b9565b91505092915050565b6000604082019050614110600083018561361b565b61411d602083018461361b565b9392505050565b60006040820190506141396000830185613d06565b6141466020830184613d06565b9392505050565b60006040820190506141626000830185613d06565b61416f602083018461361b565b9392505050565b60008115159050919050565b61418b81614176565b811461419657600080fd5b50565b6000815190506141a881614182565b92915050565b6000602082840312156141c4576141c36135ae565b5b60006141d284828501614199565b91505092915050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000614211601783613f2b565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4e6f7420616c6c6f77656420746f207374616b65206f6e206c61737420646179600082015250565b600061427d602083613f2b565b915061428882614247565b602082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b60006142e9601083613f2b565b91506142f4826142b3565b602082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006143598261362a565b915063ffffffff820361436f5761436e613e97565b5b600182019050919050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b60006143b0601483613f2b565b91506143bb8261437a565b602082019050919050565b600060208201905081810360008301526143df816143a3565b9050919050565b7f50726576696f757320706f6f6c206973206e6f742066696e6973686564000000600082015250565b600061441c601d83613f2b565b9150614427826143e6565b602082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b600061446d6144686144638461362a565b613adc565b6135b8565b9050919050565b61447d81614452565b82525050565b6000606082019050614498600083018661361b565b6144a5602083018561361b565b6144b26040830184614474565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614516602683613f2b565b9150614521826144ba565b604082019050919050565b6000602082019050818103600083015261454581614509565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614582602083613f2b565b915061458d8261454c565b602082019050919050565b600060208201905081810360008301526145b181614575565b9050919050565b600081905092915050565b50565b60006145d36000836145b8565b91506145de826145c3565b600082019050919050565b60006145f4826145c6565b915081905091905056fea2646970667358221220d7e9d010124d5532de5bfaaf634dc264b73146913901821b0309cde6b59f84cf64736f6c63430008140033