More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 933,953 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Round | 329234625 | 8 mins ago | IN | 0 ETH | 0.00000478 | ||||
Execute Round | 329232176 | 18 mins ago | IN | 0 ETH | 0.00000308 | ||||
Execute Round | 329232161 | 18 mins ago | IN | 0 ETH | 0.00000723 | ||||
Execute Round | 329229704 | 29 mins ago | IN | 0 ETH | 0.00000804 | ||||
Execute Round | 329227256 | 39 mins ago | IN | 0 ETH | 0.0000026 | ||||
Execute Round | 329227236 | 39 mins ago | IN | 0 ETH | 0.00000363 | ||||
Execute Round | 329224763 | 49 mins ago | IN | 0 ETH | 0.00000192 | ||||
Execute Round | 329222341 | 1 hrs ago | IN | 0 ETH | 0.00000152 | ||||
Execute Round | 329222316 | 1 hrs ago | IN | 0 ETH | 0.00000256 | ||||
Execute Round | 329219852 | 1 hr ago | IN | 0 ETH | 0.00000332 | ||||
Execute Round | 329217414 | 1 hr ago | IN | 0 ETH | 0.0000023 | ||||
Execute Round | 329217397 | 1 hr ago | IN | 0 ETH | 0.00000428 | ||||
Execute Round | 329214990 | 1 hr ago | IN | 0 ETH | 0.00000599 | ||||
Execute Round | 329212563 | 1 hr ago | IN | 0 ETH | 0.00000423 | ||||
Execute Round | 329212539 | 1 hr ago | IN | 0 ETH | 0.00001256 | ||||
Execute Round | 329210080 | 1 hr ago | IN | 0 ETH | 0.00000354 | ||||
Execute Round | 329207642 | 2 hrs ago | IN | 0 ETH | 0.00000097 | ||||
Execute Round | 329207623 | 2 hrs ago | IN | 0 ETH | 0.00000278 | ||||
Execute Round | 329205217 | 2 hrs ago | IN | 0 ETH | 0.00000196 | ||||
Execute Round | 329202808 | 2 hrs ago | IN | 0 ETH | 0.00000044 | ||||
Execute Round | 329202785 | 2 hrs ago | IN | 0 ETH | 0.00000147 | ||||
Bet Bull | 329202699 | 2 hrs ago | IN | 0.00006212 ETH | 0.00000098 | ||||
Claim | 329201339 | 2 hrs ago | IN | 0 ETH | 0.00000087 | ||||
Bet Bear | 329201272 | 2 hrs ago | IN | 0.00011 ETH | 0.00000138 | ||||
Execute Round | 329200341 | 2 hrs ago | IN | 0 ETH | 0.00000159 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
329201339 | 2 hrs ago | 0.00037311 ETH | ||||
328671972 | 39 hrs ago | 0.00174663 ETH | ||||
328661187 | 40 hrs ago | 0.000679 ETH | ||||
328613593 | 43 hrs ago | 0.00176821 ETH | ||||
328473265 | 2 days ago | 0.00175653 ETH | ||||
328460474 | 2 days ago | 0.00088409 ETH | ||||
328443343 | 2 days ago | 0.00157962 ETH | ||||
328384643 | 2 days ago | 0.00409207 ETH | ||||
328352321 | 2 days ago | 0.00317856 ETH | ||||
328314338 | 2 days ago | 0.00161134 ETH | ||||
328300129 | 2 days ago | 0.00169575 ETH | ||||
328290631 | 2 days ago | 0.00117345 ETH | ||||
328256124 | 2 days ago | 0.00701541 ETH | ||||
328253164 | 2 days ago | 0.00477526 ETH | ||||
328220948 | 2 days ago | 0.00161942 ETH | ||||
328216381 | 2 days ago | 0.0011693 ETH | ||||
328053695 | 3 days ago | 0.00179627 ETH | ||||
328047129 | 3 days ago | 0.00117589 ETH | ||||
327995503 | 3 days ago | 0.00220507 ETH | ||||
327989511 | 3 days ago | 0.00514767 ETH | ||||
327967672 | 3 days ago | 0.00177806 ETH | ||||
327952580 | 3 days ago | 0.00115271 ETH | ||||
327940894 | 3 days ago | 0.00076273 ETH | ||||
327899144 | 3 days ago | 0.00149287 ETH | ||||
327874978 | 3 days ago | 0.00062255 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PancakeAIPrediction
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {ReentrancyGuardTransient} from "./libraries/ReentrancyGuardTransient.sol"; /** * @title PancakeAIPrediction */ contract PancakeAIPrediction is Ownable, Pausable, ReentrancyGuardTransient { using SafeERC20 for IERC20; bool public genesisLockOnce = false; bool public genesisStartOnce = false; address public adminAddress; // address of the admin address public operatorAddress; // address of the operator uint256 public bufferSeconds; // number of seconds for valid execution of a prediction round uint256 public intervalSeconds; // interval in seconds between two prediction rounds uint256 public minBetAmount; // minimum betting amount (denominated in wei) uint256 public treasuryFee; // treasury rate (e.g. 200 = 2%, 150 = 1.50%) uint256 public treasuryAmount; // treasury amount that was not claimed uint256 public currentEpoch; // current epoch for prediction round uint256 public constant MAX_TREASURY_FEE = 1000; // 10% mapping(uint256 => mapping(address => BetInfo)) public ledger; mapping(uint256 => Round) public rounds; mapping(address => uint256[]) public userRounds; enum Position { Bull, // AI correct Bear // AI wrong } struct Round { uint32 startTimestamp; // type(uint32).max is equal to timestamp 4294967295(Sunday February 7 2106 6:28:15 AM), which will meet the requirement uint32 lockTimestamp; uint32 closeTimestamp; uint128 AIPrice; uint128 lockPrice; uint128 closePrice; uint128 totalAmount; uint128 bullAmount; uint128 bearAmount; uint128 rewardBaseCalAmount; uint128 rewardAmount; bool oracleCalled; } struct BetInfo { Position position; uint128 amount; bool claimed; // default false } event BetBear(address indexed sender, uint256 indexed epoch, uint128 amount); event BetBull(address indexed sender, uint256 indexed epoch, uint128 amount); event Claim(address indexed sender, uint256 indexed epoch, uint256 amount); event EndRound(uint256 indexed epoch, uint128 price); event LockRound(uint256 indexed epoch, uint128 price); event NewAdminAddress(address indexed admin); event NewBufferAndIntervalSeconds(uint256 bufferSeconds, uint256 intervalSeconds); event NewMinBetAmount(uint256 indexed epoch, uint256 minBetAmount); event NewTreasuryFee(uint256 indexed epoch, uint256 treasuryFee); event NewOperatorAddress(address indexed operator); event Pause(uint256 indexed epoch); event RewardsCalculated( uint256 indexed epoch, uint256 rewardBaseCalAmount, uint256 rewardAmount, uint256 treasuryAmount ); event StartRound(uint256 indexed epoch, uint128 AIPrice); event TokenRecovery(address indexed token, uint256 amount); event TreasuryClaim(uint256 amount); event Unpause(uint256 indexed epoch); modifier onlyAdmin() { require(msg.sender == adminAddress, "Not admin"); _; } modifier onlyAdminOrOperator() { require(msg.sender == adminAddress || msg.sender == operatorAddress, "Not admin/operator"); _; } modifier onlyOperator() { require(msg.sender == operatorAddress, "Not operator"); _; } modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } /** * @notice Constructor * @param _adminAddress: admin address * @param _operatorAddress: operator address * @param _intervalSeconds: number of time within an interval * @param _bufferSeconds: buffer of time for resolution of price * @param _minBetAmount: minimum bet amounts (in wei) * @param _treasuryFee: treasury fee (1000 = 10%) */ constructor( address _adminAddress, address _operatorAddress, uint256 _intervalSeconds, uint256 _bufferSeconds, uint256 _minBetAmount, uint256 _treasuryFee ) Ownable(msg.sender) { require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high"); adminAddress = _adminAddress; operatorAddress = _operatorAddress; intervalSeconds = _intervalSeconds; bufferSeconds = _bufferSeconds; minBetAmount = _minBetAmount; treasuryFee = _treasuryFee; } /** * @notice Bet AI wrong * @dev In order to be compatible with previous versions, we use bear for AI wrong * @param epoch: epoch */ function betBear(uint256 epoch) external payable whenNotPaused nonReentrant notContract { require(epoch == currentEpoch, "Bet is too early/late"); Round storage round = rounds[epoch]; require(_bettable(round), "Round not bettable"); require(msg.value >= minBetAmount, "Bet amount must be greater than minBetAmount"); BetInfo storage betInfo = ledger[epoch][msg.sender]; require(betInfo.amount == 0, "Can only bet once per round"); unchecked { // Update round data uint128 amount = uint128(msg.value); round.totalAmount = round.totalAmount + amount; round.bearAmount = round.bearAmount + amount; // Update user data betInfo.position = Position.Bear; betInfo.amount = amount; userRounds[msg.sender].push(epoch); emit BetBear(msg.sender, epoch, amount); } } /** * @notice Bet AI correct * @dev In order to be compatible with previous versions, we use bull for AI correct * @param epoch: epoch */ function betBull(uint256 epoch) external payable whenNotPaused nonReentrant notContract { require(epoch == currentEpoch, "Bet is too early/late"); Round storage round = rounds[epoch]; require(_bettable(round), "Round not bettable"); require(msg.value >= minBetAmount, "Bet amount must be greater than minBetAmount"); BetInfo storage betInfo = ledger[epoch][msg.sender]; require(betInfo.amount == 0, "Can only bet once per round"); unchecked { // Update round data uint128 amount = uint128(msg.value); round.totalAmount = round.totalAmount + amount; round.bullAmount = round.bullAmount + amount; // Update user data betInfo.position = Position.Bull; betInfo.amount = amount; userRounds[msg.sender].push(epoch); emit BetBull(msg.sender, epoch, amount); } } /** * @notice Claim reward for an array of epochs * @param epochs: array of epochs */ function claim(uint256[] calldata epochs) external nonReentrant notContract { uint256 reward; // Initializes reward uint256 length = epochs.length; for (uint256 i = 0; i < length; i++) { uint256 claimEpoch = epochs[i]; Round memory round = rounds[claimEpoch]; require(round.startTimestamp != 0, "Round has not started"); require(uint32(block.timestamp) > round.closeTimestamp, "Round has not ended"); uint256 addedReward = 0; BetInfo storage betInfo = ledger[claimEpoch][msg.sender]; // Round valid, claim rewards if (round.oracleCalled) { require(claimable(claimEpoch, msg.sender), "Not eligible for claim"); addedReward = (betInfo.amount * uint256(round.rewardAmount)) / round.rewardBaseCalAmount; } // Round invalid, refund bet amount else { require(refundable(claimEpoch, msg.sender), "Not eligible for refund"); addedReward = betInfo.amount; } betInfo.claimed = true; reward += addedReward; emit Claim(msg.sender, claimEpoch, addedReward); } if (reward != 0) { _safeTransferNativeToken(address(msg.sender), reward); } } /** * @notice Start the next round n, lock price for round n-1, end round n-2 * @dev Callable by operator */ function executeRound(uint128 currentPrice, uint128 AIPrice) external whenNotPaused onlyOperator { require( genesisStartOnce && genesisLockOnce, "Can only run after genesisStartRound and genesisLockRound is triggered" ); // CurrentEpoch refers to previous round (n-1) _safeLockRound(currentEpoch, currentPrice); _safeEndRound(currentEpoch - 1, currentPrice); _calculateRewards(currentEpoch - 1); // Increment currentEpoch to current round (n) currentEpoch = currentEpoch + 1; _safeStartRound(currentEpoch, AIPrice); } /** * @notice Lock genesis round * @dev Callable by operator */ function genesisLockRound(uint128 currentPrice, uint128 AIPrice) external whenNotPaused onlyOperator { require(genesisStartOnce, "Can only run after genesisStartRound is triggered"); require(!genesisLockOnce, "Can only run genesisLockRound once"); _safeLockRound(currentEpoch, currentPrice); currentEpoch = currentEpoch + 1; _startRound(currentEpoch, AIPrice); genesisLockOnce = true; } /** * @notice Start genesis round * @dev Callable by admin or operator */ function genesisStartRound(uint128 AIPrice) external whenNotPaused onlyOperator { require(!genesisStartOnce, "Can only run genesisStartRound once"); currentEpoch = currentEpoch + 1; _startRound(currentEpoch, AIPrice); genesisStartOnce = true; } /** * @notice Claim all rewards in treasury * @dev Callable by admin */ function claimTreasury() external nonReentrant onlyAdmin { uint256 currentTreasuryAmount = treasuryAmount; treasuryAmount = 0; _safeTransferNativeToken(adminAddress, currentTreasuryAmount); emit TreasuryClaim(currentTreasuryAmount); } /** * @notice called by the admin to pause, triggers stopped state * @dev Callable by admin or operator */ function pause() external whenNotPaused onlyAdminOrOperator { _pause(); emit Pause(currentEpoch); } /** * @notice called by the admin to unpause, returns to normal state * Reset genesis state. Once paused, the rounds would need to be kickstarted by genesis * @dev Callable by admin or operator or keeper */ function unpause() external whenPaused onlyAdminOrOperator { genesisStartOnce = false; genesisLockOnce = false; _unpause(); emit Unpause(currentEpoch); } /** * @notice Set buffer and interval (in seconds) * @dev Callable by admin */ function setBufferAndIntervalSeconds(uint256 _bufferSeconds, uint256 _intervalSeconds) external whenPaused onlyAdmin { require(_bufferSeconds < _intervalSeconds, "bufferSeconds must be inferior to intervalSeconds"); bufferSeconds = _bufferSeconds; intervalSeconds = _intervalSeconds; emit NewBufferAndIntervalSeconds(_bufferSeconds, _intervalSeconds); } /** * @notice Set minBetAmount * @dev Callable by admin */ function setMinBetAmount(uint256 _minBetAmount) external whenPaused onlyAdmin { require(_minBetAmount != 0, "Must be superior to 0"); minBetAmount = _minBetAmount; emit NewMinBetAmount(currentEpoch, minBetAmount); } /** * @notice Set operator address * @dev Callable by admin */ function setOperator(address _operatorAddress) external onlyAdmin { require(_operatorAddress != address(0), "Cannot be zero address"); operatorAddress = _operatorAddress; emit NewOperatorAddress(_operatorAddress); } /** * @notice Set treasury fee * @dev Callable by admin */ function setTreasuryFee(uint256 _treasuryFee) external whenPaused onlyAdmin { require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high"); treasuryFee = _treasuryFee; emit NewTreasuryFee(currentEpoch, treasuryFee); } /** * @notice It allows the owner to recover tokens sent to the contract by mistake * @param _token: token address * @param _amount: token amount * @dev Callable by owner */ function recoverToken(address _token, uint256 _amount) external onlyOwner { IERC20(_token).safeTransfer(address(msg.sender), _amount); emit TokenRecovery(_token, _amount); } /** * @notice Set admin address * @dev Callable by owner */ function setAdmin(address _adminAddress) external onlyOwner { require(_adminAddress != address(0), "Cannot be zero address"); adminAddress = _adminAddress; emit NewAdminAddress(_adminAddress); } /** * @notice Returns round epochs and bet information for a user that has participated * @param user: user address * @param cursor: cursor * @param size: size */ function getUserRounds(address user, uint256 cursor, uint256 size) external view returns (uint256[] memory, BetInfo[] memory, uint256) { uint256 length = size; if (length > userRounds[user].length - cursor) { length = userRounds[user].length - cursor; } uint256[] memory values = new uint256[](length); BetInfo[] memory betInfo = new BetInfo[](length); for (uint256 i = 0; i < length; i++) { values[i] = userRounds[user][cursor + i]; betInfo[i] = ledger[values[i]][user]; } return (values, betInfo, cursor + length); } /** * @notice Returns round epochs length * @param user: user address */ function getUserRoundsLength(address user) external view returns (uint256) { return userRounds[user].length; } /** * @notice Get the claimable stats of specific epoch and user account * @param epoch: epoch * @param user: user address */ function claimable(uint256 epoch, address user) public view returns (bool) { BetInfo memory betInfo = ledger[epoch][user]; Round memory round = rounds[epoch]; bool AICorrect = (round.closePrice > round.lockPrice && round.AIPrice > round.lockPrice) || (round.closePrice < round.lockPrice && round.AIPrice < round.lockPrice) || (round.closePrice == round.lockPrice && round.AIPrice == round.lockPrice); return round.oracleCalled && betInfo.amount != 0 && !betInfo.claimed && ((AICorrect && betInfo.position == Position.Bull) || (!AICorrect && betInfo.position == Position.Bear)); } /** * @notice Get the refundable stats of specific epoch and user account * @param epoch: epoch * @param user: user address */ function refundable(uint256 epoch, address user) public view returns (bool) { BetInfo memory betInfo = ledger[epoch][user]; Round memory round = rounds[epoch]; return !round.oracleCalled && !betInfo.claimed && block.timestamp > uint256(round.closeTimestamp) + bufferSeconds && betInfo.amount != 0; } /** * @notice Calculate rewards for round * @param epoch: epoch */ function _calculateRewards(uint256 epoch) internal { Round storage round = rounds[epoch]; require(round.rewardBaseCalAmount == 0 && round.rewardAmount == 0, "Rewards calculated"); uint256 rewardBaseCalAmount; uint256 treasuryAmt; uint256 rewardAmount; // Bull win when AI is correct if ( (round.closePrice > round.lockPrice && round.AIPrice > round.lockPrice) || (round.closePrice < round.lockPrice && round.AIPrice < round.lockPrice) || (round.closePrice == round.lockPrice && round.AIPrice == round.lockPrice) ) { rewardBaseCalAmount = round.bullAmount; // no winner, house win if (rewardBaseCalAmount == 0) { treasuryAmt = round.totalAmount; } else { treasuryAmt = (round.totalAmount * treasuryFee) / 10000; } rewardAmount = round.totalAmount - treasuryAmt; } else { // Bear win when AI is wrong rewardBaseCalAmount = round.bearAmount; // no winner, house win if (rewardBaseCalAmount == 0) { treasuryAmt = round.totalAmount; } else { treasuryAmt = (round.totalAmount * treasuryFee) / 10000; } rewardAmount = round.totalAmount - treasuryAmt; } round.rewardBaseCalAmount = uint128(rewardBaseCalAmount); round.rewardAmount = uint128(rewardAmount); // Add to treasury treasuryAmount += treasuryAmt; emit RewardsCalculated(epoch, rewardBaseCalAmount, rewardAmount, treasuryAmt); } /** * @notice End round * @param epoch: epoch * @param price: price of the round */ function _safeEndRound(uint256 epoch, uint128 price) internal { require(rounds[epoch].lockTimestamp != 0, "Can only end round after round has locked"); require(uint32(block.timestamp) >= rounds[epoch].closeTimestamp, "Can only end round after closeTimestamp"); require( block.timestamp <= uint256(rounds[epoch].closeTimestamp) + bufferSeconds, "Can only end round within bufferSeconds" ); unchecked { Round storage round = rounds[epoch]; round.closePrice = price; round.oracleCalled = true; emit EndRound(epoch, round.closePrice); } } /** * @notice Lock round * @param epoch: epoch * @param price: price of the round */ function _safeLockRound(uint256 epoch, uint128 price) internal { Round storage round = rounds[epoch]; require(round.startTimestamp != 0, "Can only lock round after round has started"); require(uint32(block.timestamp) >= round.lockTimestamp, "Can only lock round after lockTimestamp"); require( block.timestamp <= uint256(round.lockTimestamp) + bufferSeconds, "Can only lock round within bufferSeconds" ); unchecked { round.closeTimestamp = uint32(block.timestamp + intervalSeconds); round.lockPrice = price; emit LockRound(epoch, price); } } /** * @notice Start round * Previous round n-2 must end * @param epoch: epoch * @param AIPrice: AI prediction price */ function _safeStartRound(uint256 epoch, uint128 AIPrice) internal { require(genesisStartOnce, "Can only run after genesisStartRound is triggered"); require(rounds[epoch - 2].closeTimestamp != 0, "Can only start round after round n-2 has ended"); require( uint32(block.timestamp) >= rounds[epoch - 2].closeTimestamp, "Can only start new round after round n-2 closeTimestamp" ); _startRound(epoch, AIPrice); } /** * @notice Transfer native token in a safe way * @param to: address to transfer native token to * @param value: native token amount to transfer (in wei) */ function _safeTransferNativeToken(address to, uint256 value) internal { (bool success,) = to.call{value: value}(""); require(success, "TransferHelper: TRANSFER_FAILED"); } /** * @notice Start round * Previous round n-2 must end * @param epoch: epoch * @param AIPrice: AI prediction price */ function _startRound(uint256 epoch, uint128 AIPrice) internal { unchecked { Round storage round = rounds[epoch]; round.startTimestamp = uint32(block.timestamp); round.lockTimestamp = uint32(block.timestamp + intervalSeconds); round.closeTimestamp = uint32(block.timestamp + (2 * intervalSeconds)); round.totalAmount = 0; round.AIPrice = AIPrice; } emit StartRound(epoch, AIPrice); } /** * @notice Determine if a round is valid for receiving bets * Round must have started and locked * Current timestamp must be within startTimestamp and closeTimestamp */ function _bettable(Round storage round) internal view returns (bool) { return round.startTimestamp != 0 && round.lockTimestamp != 0 && uint32(block.timestamp) > round.startTimestamp && uint32(block.timestamp) < round.lockTimestamp; } /** * @notice Returns true if `account` is a contract. * @param account: account address */ function _isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size != 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {StorageSlot} from "./StorageSlot.sol"; /** * @dev Variant of {ReentrancyGuard} that uses transient storage. * * NOTE: This variant only works on networks where EIP-1153 is available. */ abstract contract ReentrancyGuardTransient { using StorageSlot for *; // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant REENTRANCY_GUARD_STORAGE = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); /** * @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 if (_reentrancyGuardEntered()) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail REENTRANCY_GUARD_STORAGE.asBoolean().tstore(true); } function _nonReentrantAfter() private { REENTRANCY_GUARD_STORAGE.asBoolean().tstore(false); } /** * @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 REENTRANCY_GUARD_STORAGE.asBoolean().tload(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.24; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC-1967 implementation slot: * ```solidity * contract ERC1967 { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * Since version 5.1, this library also support writing and reading value types to and from transient storage. * * * Example using transient storage: * ```solidity * contract Lock { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542; * * modifier locked() { * require(!_LOCK_SLOT.asBoolean().tload()); * * _LOCK_SLOT.asBoolean().tstore(true); * _; * _LOCK_SLOT.asBoolean().tstore(false); * } * } * ``` * * TIP: Consider using this library along with {SlotDerivation}. */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct Int256Slot { int256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Int256Slot` with member `value` located at `slot`. */ function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev UDVT that represent a slot holding a address. */ type AddressSlotType is bytes32; /** * @dev Cast an arbitrary slot to a AddressSlotType. */ function asAddress(bytes32 slot) internal pure returns (AddressSlotType) { return AddressSlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a bool. */ type BooleanSlotType is bytes32; /** * @dev Cast an arbitrary slot to a BooleanSlotType. */ function asBoolean(bytes32 slot) internal pure returns (BooleanSlotType) { return BooleanSlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a bytes32. */ type Bytes32SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Bytes32SlotType. */ function asBytes32(bytes32 slot) internal pure returns (Bytes32SlotType) { return Bytes32SlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a uint256. */ type Uint256SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Uint256SlotType. */ function asUint256(bytes32 slot) internal pure returns (Uint256SlotType) { return Uint256SlotType.wrap(slot); } /** * @dev UDVT that represent a slot holding a int256. */ type Int256SlotType is bytes32; /** * @dev Cast an arbitrary slot to a Int256SlotType. */ function asInt256(bytes32 slot) internal pure returns (Int256SlotType) { return Int256SlotType.wrap(slot); } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(AddressSlotType slot) internal view returns (address value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(AddressSlotType slot, address value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(BooleanSlotType slot) internal view returns (bool value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(BooleanSlotType slot, bool value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Bytes32SlotType slot) internal view returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Bytes32SlotType slot, bytes32 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Uint256SlotType slot) internal view returns (uint256 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Uint256SlotType slot, uint256 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } /** * @dev Load the value held at location `slot` in transient storage. */ function tload(Int256SlotType slot) internal view returns (int256 value) { /// @solidity memory-safe-assembly assembly { value := tload(slot) } } /** * @dev Store `value` at location `slot` in transient storage. */ function tstore(Int256SlotType slot, int256 value) internal { /// @solidity memory-safe-assembly assembly { tstore(slot, value) } } }
{ "evmVersion": "cancun", "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"},{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"uint256","name":"_intervalSeconds","type":"uint256"},{"internalType":"uint256","name":"_bufferSeconds","type":"uint256"},{"internalType":"uint256","name":"_minBetAmount","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"}],"name":"BetBear","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"}],"name":"BetBull","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"price","type":"uint128"}],"name":"EndRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"price","type":"uint128"}],"name":"LockRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"NewAdminAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bufferSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"intervalSeconds","type":"uint256"}],"name":"NewBufferAndIntervalSeconds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBetAmount","type":"uint256"}],"name":"NewMinBetAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"NewOperatorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"NewTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardBaseCalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryAmount","type":"uint256"}],"name":"RewardsCalculated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"AIPrice","type":"uint128"}],"name":"StartRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_TREASURY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"betBear","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"betBull","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bufferSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"epochs","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"currentPrice","type":"uint128"},{"internalType":"uint128","name":"AIPrice","type":"uint128"}],"name":"executeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisLockOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"currentPrice","type":"uint128"},{"internalType":"uint128","name":"AIPrice","type":"uint128"}],"name":"genesisLockRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisStartOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"AIPrice","type":"uint128"}],"name":"genesisStartRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"cursor","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getUserRounds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"enum PancakeAIPrediction.Position","name":"position","type":"uint8"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct PancakeAIPrediction.BetInfo[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserRoundsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"intervalSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"ledger","outputs":[{"internalType":"enum PancakeAIPrediction.Position","name":"position","type":"uint8"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"refundable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint32","name":"startTimestamp","type":"uint32"},{"internalType":"uint32","name":"lockTimestamp","type":"uint32"},{"internalType":"uint32","name":"closeTimestamp","type":"uint32"},{"internalType":"uint128","name":"AIPrice","type":"uint128"},{"internalType":"uint128","name":"lockPrice","type":"uint128"},{"internalType":"uint128","name":"closePrice","type":"uint128"},{"internalType":"uint128","name":"totalAmount","type":"uint128"},{"internalType":"uint128","name":"bullAmount","type":"uint128"},{"internalType":"uint128","name":"bearAmount","type":"uint128"},{"internalType":"uint128","name":"rewardBaseCalAmount","type":"uint128"},{"internalType":"uint128","name":"rewardAmount","type":"uint128"},{"internalType":"bool","name":"oracleCalled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bufferSeconds","type":"uint256"},{"internalType":"uint256","name":"_intervalSeconds","type":"uint256"}],"name":"setBufferAndIntervalSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040525f805461ffff60a81b191690553480156200001d575f80fd5b50604051620047b1380380620047b1833981016040819052620000409162000186565b33806200006757604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b62000072816200011b565b505f805460ff60a01b191690556103e8811115620000d35760405162461bcd60e51b815260206004820152601560248201527f54726561737572792066656520746f6f2068696768000000000000000000000060448201526064016200005e565b600180546001600160a01b039788166001600160a01b0319918216179091556002805496909716951694909417909455600491909155600355600591909155600655620001df565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811462000181575f80fd5b919050565b5f805f805f8060c087890312156200019c575f80fd5b620001a7876200016a565b9550620001b7602088016200016a565b945060408701519350606087015192506080870151915060a087015190509295509295509295565b6145c480620001ed5f395ff3fe60806040526004361061025c575f3560e01c80638456cb591161014b578063c61df64a116100c6578063f2b3c8091161007c578063f7fdec2811610062578063f7fdec2814610835578063fa968eea14610867578063fc6f94681461087c575f80fd5b8063f2b3c80914610801578063f2fde38b14610816575f80fd5b8063dd1f7596116100ac578063dd1f7596146107ae578063e46c6287146107cd578063eaba2361146107ec575f80fd5b8063c61df64a1461077a578063cc32d17614610799575f80fd5b8063951fd6001161011b578063aa6b873a11610101578063aa6b873a14610729578063b29a81401461073c578063b3ab15fb1461075b575f80fd5b8063951fd600146106dc578063a0c7f71c1461070a575f80fd5b80638456cb5914610538578063890dc7661461054c5780638c65c81f1461056b5780638da5cb5b146106b3575f80fd5b80636ba4c138116101db5780637285c58b116101ab57806377e741c71161019157806377e741c7146104e55780637bf41254146105045780637d1cd04f14610523575f80fd5b80637285c58b1461045657806376671808146104d0575f80fd5b80636ba4c138146103e55780636c18859314610404578063704b6c0214610423578063715018a614610442575f80fd5b8063368acb091161023057806343b2fde51161021657806343b2fde51461038557806357fb096f146103a45780635c975abb146103b7575f80fd5b8063368acb091461035c5780633f4ba83a14610371575f80fd5b80623bdc74146102605780630f74174f14610276578063127effb2146102bc578063273867d41461030d575b5f80fd5b34801561026b575f80fd5b506102746108a8565b005b348015610281575f80fd5b505f546102a7907501000000000000000000000000000000000000000000900460ff1681565b60405190151581526020015b60405180910390f35b3480156102c7575f80fd5b506002546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b3565b348015610318575f80fd5b5061034e610327366004614157565b73ffffffffffffffffffffffffffffffffffffffff165f908152600b602052604090205490565b6040519081526020016102b3565b348015610367575f80fd5b5061034e60075481565b34801561037c575f80fd5b5061027461099f565b348015610390575f80fd5b5061027461039f36600461418f565b610aa6565b6102746103b23660046141c0565b610cf1565b3480156103c2575f80fd5b505f5474010000000000000000000000000000000000000000900460ff166102a7565b3480156103f0575f80fd5b506102746103ff3660046141d7565b6110e2565b34801561040f575f80fd5b5061027461041e3660046141c0565b6115df565b34801561042e575f80fd5b5061027461043d366004614157565b611710565b34801561044d575f80fd5b50610274611803565b348015610461575f80fd5b506104c1610470366004614246565b600960209081525f928352604080842090915290825290205460ff808216916fffffffffffffffffffffffffffffffff61010082041691710100000000000000000000000000000000009091041683565b6040516102b3939291906142cd565b3480156104db575f80fd5b5061034e60085481565b3480156104f0575f80fd5b506102746104ff3660046141c0565b611814565b34801561050f575f80fd5b506102a761051e366004614246565b611941565b34801561052e575f80fd5b5061034e60045481565b348015610543575f80fd5b50610274611b23565b348015610557575f80fd5b50610274610566366004614303565b611c03565b348015610576575f80fd5b506106316105853660046141c0565b600a6020525f90815260409020805460018201546002830154600384015460049094015463ffffffff808516956401000000008604821695680100000000000000008104909216946fffffffffffffffffffffffffffffffff6c0100000000000000000000000090930483169481841694700100000000000000000000000000000000928390048516948281169492849004811693838216938190048216929182169160ff919004168c565b6040805163ffffffff9d8e1681529b8d1660208d015299909b16988a01989098526fffffffffffffffffffffffffffffffff96871660608a0152948616608089015292851660a088015290841660c0870152831660e08601528216610100850152811661012084015216610140820152901515610160820152610180016102b3565b3480156106be575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166102e8565b3480156106e7575f80fd5b506106fb6106f6366004614323565b611d62565b6040516102b393929190614353565b348015610715575f80fd5b506102a7610724366004614246565b612018565b6102746107373660046141c0565b612342565b348015610747575f80fd5b50610274610756366004614406565b61271c565b348015610766575f80fd5b50610274610775366004614157565b612799565b348015610785575f80fd5b5061027461079436600461418f565b612905565b3480156107a4575f80fd5b5061034e60065481565b3480156107b9575f80fd5b5061034e6107c8366004614406565b612add565b3480156107d8575f80fd5b506102746107e736600461442e565b612b08565b3480156107f7575f80fd5b5061034e60035481565b34801561080c575f80fd5b5061034e6103e881565b348015610821575f80fd5b50610274610830366004614157565b612c9d565b348015610840575f80fd5b505f546102a790760100000000000000000000000000000000000000000000900460ff1681565b348015610872575f80fd5b5061034e60055481565b348015610887575f80fd5b506001546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b6108b0612cfd565b60015473ffffffffffffffffffffffffffffffffffffffff163314610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600780545f9091556001546109619073ffffffffffffffffffffffffffffffffffffffff1682612d83565b6040518181527fb9197c6b8e21274bd1e2d9c956a88af5cfee510f630fab3f046300f88b4223619060200160405180910390a15061099d612e4e565b565b6109a7612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314806109e4575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f742061646d696e2f6f70657261746f720000000000000000000000000000604482015260640161092d565b5f80547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff169055610a79612ecb565b6008546040517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab7905f90a2565b610aae612f47565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420697320747269676765726564000000000000000000000000000000606482015260840161092d565b5f547501000000000000000000000000000000000000000000900460ff1615610c85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f43616e206f6e6c792072756e2067656e657369734c6f636b526f756e64206f6e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161092d565b610c9160085483612f9b565b600854610c9f906001614474565b6008819055610cae9082613250565b50505f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b610cf9612f47565b610d01612cfd565b333b15610d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b333214610dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b6008548114610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c6174650000000000000000000000604482015260640161092d565b5f818152600a60205260409020610e54816133c7565b610eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c650000000000000000000000000000604482015260640161092d565b600554341015610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e740000000000000000000000000000000000000000606482015260840161092d565b5f8281526009602090815260408083203384529091529020805461010090046fffffffffffffffffffffffffffffffff1615610fe4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015260640161092d565b6002820180547001000000000000000000000000000000007fffffffffffffffffffffffffffffffff000000000000000000000000000000008216346fffffffffffffffffffffffffffffffff938416810184169182178390048416810184169092021790925582547fffffffffffffffffffffffffffffff000000000000000000000000000000000016610100918316918202178355335f818152600b60209081526040808320805460018101825590845292829020909201889055905192835286927fc4dff95c4e464dd34e49d0e93b6d7bc0cbd425589cea42e9ac0064a1a2bba26491015b60405180910390a35050506110df612e4e565b50565b6110ea612cfd565b333b15611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b3332146111bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b5f81815b818110156115c0575f8585838181106111db576111db614487565b602090810292909201355f818152600a84526040808220815161018081018352815463ffffffff808216808452640100000000830482169984019990995268010000000000000000820416938201939093526c010000000000000000000000009092046fffffffffffffffffffffffffffffffff90811660608401526001820154808216608085015270010000000000000000000000000000000090819004821660a0850152600283015480831660c0860152819004821660e0850152600383015480831661010086015281900482166101208501526004909201549081166101408401520460ff16151561016082015291945090929003905061133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f526f756e6420686173206e6f7420737461727465640000000000000000000000604482015260640161092d565b806040015163ffffffff164263ffffffff16116113b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f526f756e6420686173206e6f7420656e64656400000000000000000000000000604482015260640161092d565b5f82815260096020908152604080832033845290915281206101608301511561148d576113e18433612018565b611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656c696769626c6520666f7220636c61696d00000000000000000000604482015260640161092d565b61012083015161014084015182546fffffffffffffffffffffffffffffffff9283169261147c928116916101009004166144b4565b61148691906144cb565b9150611519565b6114978433611941565b6114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f7420656c696769626c6520666f7220726566756e64000000000000000000604482015260640161092d565b805461010090046fffffffffffffffffffffffffffffffff1691505b80547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815561155d8288614474565b9650833373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7846040516115a891815260200190565b60405180910390a35050600190920191506111c09050565b5081156115d1576115d13383612d83565b50506115db612e4e565b5050565b6115e7612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b805f036116d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d757374206265207375706572696f7220746f20300000000000000000000000604482015260640161092d565b60058190556008546040518281527f90eb87c560a0213754ceb3a7fa3012f01acab0a35602c1e1995adf69dabc9d50906020015b60405180910390a250565b611718613425565b73ffffffffffffffffffffffffffffffffffffffff8116611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f206164647265737300000000000000000000604482015260640161092d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f137b621413925496477d46e5055ac0d56178bdd724ba8bf843afceef18268ba3905f90a250565b61180b613425565b61099d5f613477565b61181c612e78565b60015473ffffffffffffffffffffffffffffffffffffffff16331461189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b6103e8811115611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f20686967680000000000000000000000604482015260640161092d565b60068190556008546040518281527fb1c4ee38d35556741133da7ff9b6f7ab0fa88d0406133126ff128f635490a85790602001611705565b5f82815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff16600181111561199557611995614267565b60018111156119a6576119a6614267565b815290546fffffffffffffffffffffffffffffffff610100808304821660208086019190915260ff71010000000000000000000000000000000000909404841615156040958601525f8a8152600a8252859020855161018081018752815463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316968101969096526c01000000000000000000000000909104831660608601526001810154808416608087015270010000000000000000000000000000000090819004841660a0870152600282015480851660c0880152819004841660e08701526003820154808516938701939093529182900483166101208601526004015491821661014085015290041615801561016083018190529293509091611ad557508160400151155b8015611af75750600354816040015163ffffffff16611af49190614474565b42115b8015611b18575060208201516fffffffffffffffffffffffffffffffff1615155b925050505b92915050565b611b2b612f47565b60015473ffffffffffffffffffffffffffffffffffffffff16331480611b68575060025473ffffffffffffffffffffffffffffffffffffffff1633145b611bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f742061646d696e2f6f70657261746f720000000000000000000000000000604482015260640161092d565b611bd66134eb565b6008546040517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d905f90a2565b611c0b612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b808210611d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f6275666665725365636f6e6473206d75737420626520696e666572696f72207460448201527f6f20696e74657276616c5365636f6e6473000000000000000000000000000000606482015260840161092d565b6003829055600481905560408051838152602081018390527fe60149e0431fec12df63dfab5fce2a9cefe9a4d3df5f41cb626f579ae1f2b91a910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600b602052604081205460609182918490611d99908790614503565b811115611dd35773ffffffffffffffffffffffffffffffffffffffff87165f908152600b6020526040902054611dd0908790614503565b90505b5f8167ffffffffffffffff811115611ded57611ded614516565b604051908082528060200260200182016040528015611e16578160200160208202803683370190505b5090505f8267ffffffffffffffff811115611e3357611e33614516565b604051908082528060200260200182016040528015611e9b57816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611e515790505b5090505f5b83811015611ff95773ffffffffffffffffffffffffffffffffffffffff8a165f908152600b60205260409020611ed6828b614474565b81548110611ee657611ee6614487565b905f5260205f200154838281518110611f0157611f01614487565b60200260200101818152505060095f848381518110611f2257611f22614487565b60209081029190910181015182528181019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8e168252909252908190208151606081019092528054829060ff166001811115611f8157611f81614267565b6001811115611f9257611f92614267565b8152905461010081046fffffffffffffffffffffffffffffffff16602083015271010000000000000000000000000000000000900460ff1615156040909101528251839083908110611fe657611fe6614487565b6020908102919091010152600101611ea0565b508181612006858b614474565b95509550955050505093509350939050565b5f82815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff16600181111561206c5761206c614267565b600181111561207d5761207d614267565b815290546fffffffffffffffffffffffffffffffff610100808304821660208086019190915260ff71010000000000000000000000000000000000909404841615156040958601525f8a8152600a8252858120865161018081018852815463ffffffff80821683526401000000008204811695830195909552680100000000000000008104909416978101979097526c010000000000000000000000009092048416606087015260018201548085166080880181905270010000000000000000000000000000000091829004861660a08901819052600285015480881660c08b0152839004871660e08a01526003850154808816968a0196909652948290048616610120890152600490930154948516610140880152909304909316151561016085015293945091921180156121de575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16115b8061224a575081608001516fffffffffffffffffffffffffffffffff168260a001516fffffffffffffffffffffffffffffffff1610801561224a575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16105b806122b6575081608001516fffffffffffffffffffffffffffffffff168260a001516fffffffffffffffffffffffffffffffff161480156122b6575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16145b905081610160015180156122df575060208301516fffffffffffffffffffffffffffffffff1615155b80156122ed57508260400151155b8015612338575080801561231257505f8351600181111561231057612310614267565b145b80612338575080158015612338575060018351600181111561233657612336614267565b145b9695505050505050565b61234a612f47565b612352612cfd565b333b156123bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b333214612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b600854811461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c6174650000000000000000000000604482015260640161092d565b5f818152600a602052604090206124a5816133c7565b61250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c650000000000000000000000000000604482015260640161092d565b60055434101561259d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e740000000000000000000000000000000000000000606482015260840161092d565b5f8281526009602090815260408083203384529091529020805461010090046fffffffffffffffffffffffffffffffff1615612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015260640161092d565b6002820180546fffffffffffffffffffffffffffffffff8082163490810182167fffffffffffffffffffffffffffffffff00000000000000000000000000000000938416179093556003850180548083168501831693169290921790915582547fffffffffffffffffffffffffffffff0000000000000000000000000000000000166101009183169182021760019081178455335f818152600b602090815260408083208054958601815583529181902090930188905551928352869290917f58d983c1c289f0d1b4b762549078c5845b1b2ec2de3b513cd137e9d1da5f89a291016110cc565b612724613425565b61274573ffffffffffffffffffffffffffffffffffffffff83163383613559565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e988260405161278d91815260200190565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b73ffffffffffffffffffffffffffffffffffffffff8116612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f206164647265737300000000000000000000604482015260640161092d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fc47d127c07bdd56c5ccba00463ce3bd3c1bca71b4670eea6e5d0c02e4aa156e2905f90a250565b61290d612f47565b60025473ffffffffffffffffffffffffffffffffffffffff16331461298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff1680156129d357505f547501000000000000000000000000000000000000000000900460ff165b612a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420616e642067656e657369734c6f636b526f756e642069732074726960648201527f6767657265640000000000000000000000000000000000000000000000000000608482015260a40161092d565b612a9160085483612f9b565b612aa96001600854612aa39190614503565b836135e6565b612ac06001600854612abb9190614503565b6138aa565b600854612ace906001614474565b60088190556115db9082613cc6565b600b602052815f5260405f208181548110612af6575f80fd5b905f5260205f20015f91509150505481565b612b10612f47565b60025473ffffffffffffffffffffffffffffffffffffffff163314612b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff1615612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e206f6e6c792072756e2067656e657369735374617274526f756e64206f60448201527f6e63650000000000000000000000000000000000000000000000000000000000606482015260840161092d565b600854612c4b906001614474565b6008819055612c5a9082613250565b505f80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055565b612ca5613425565b73ffffffffffffffffffffffffffffffffffffffff8116612cf4576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161092d565b6110df81613477565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15612d56576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61099d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90613eff565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114612dd9576040519150601f19603f3d011682016040523d82523d5f602084013e612dde565b606091505b5050905080612e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015260640161092d565b505050565b61099d5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00612d7d565b5f5474010000000000000000000000000000000000000000900460ff1661099d576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed3612e78565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b5f5474010000000000000000000000000000000000000000900460ff161561099d576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600a602052604081208054909163ffffffff9091169003613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616e206f6e6c79206c6f636b20726f756e6420616674657220726f756e642060448201527f6861732073746172746564000000000000000000000000000000000000000000606482015260840161092d565b805463ffffffff64010000000090910481164290911610156130e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c79206c6f636b20726f756e64206166746572206c6f636b546960448201527f6d657374616d7000000000000000000000000000000000000000000000000000606482015260840161092d565b60035481546131039190640100000000900463ffffffff16614474565b421115613192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43616e206f6e6c79206c6f636b20726f756e642077697468696e20627566666560448201527f725365636f6e6473000000000000000000000000000000000000000000000000606482015260840161092d565b60045481547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16680100000000000000004290920163ffffffff16919091021781556001810180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff841690811790915560405190815283907f6ec696c906ea967e40a4a5cef6dcdf1b469bda698722fb465728a15b521e207e906020015b60405180910390a2505050565b5f828152600a602052604090819020805463ffffffff428181167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008416811785556004805483018416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909516909117939093178085559254600280860180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690556fffffffffffffffffffffffffffffffff88166c01000000000000000000000000027fffffffff00000000000000000000000000000000ffffffffffffffffffffffff919092029092019092166801000000000000000002167fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091171790555182907f8d3960384b609cf325c5ed2cb49da19bee5a75fe7001d56b90ed7452fc7eccd09061278d9084906fffffffffffffffffffffffffffffffff91909116815260200190565b80545f9063ffffffff16158015906133ed57508154640100000000900463ffffffff1615155b80156134045750815463ffffffff90811642909116115b8015611b1d57505054640100000000900463ffffffff908116429091161090565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461099d576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161092d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6134f3612f47565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f1d3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612e49908490613f06565b5f828152600a6020526040812054640100000000900463ffffffff169003613690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c7920656e6420726f756e6420616674657220726f756e64206860448201527f6173206c6f636b65640000000000000000000000000000000000000000000000606482015260840161092d565b5f828152600a602052604090205463ffffffff680100000000000000009091048116429091161015613744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e6420616674657220636c6f7365546960448201527f6d657374616d7000000000000000000000000000000000000000000000000000606482015260840161092d565b6003545f838152600a6020526040902054613771919068010000000000000000900463ffffffff16614474565b421115613800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e642077697468696e2062756666657260448201527f5365636f6e647300000000000000000000000000000000000000000000000000606482015260840161092d565b5f828152600a60209081526040918290206001810180546fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000878316810291909117928390556004840180547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff16821790559451949091041683529184917f7565b575bc429a154ce00e55941c44b14b3318545f3a223a4bd919cbf0136ec89101613243565b5f818152600a60205260409020600381015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16158015613903575060048101546fffffffffffffffffffffffffffffffff16155b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526577617264732063616c63756c617465640000000000000000000000000000604482015260640161092d565b60018101545f90819081906fffffffffffffffffffffffffffffffff808216700100000000000000000000000000000000909204161180156139d75750600184015484546fffffffffffffffffffffffffffffffff9182166c01000000000000000000000000909104909116115b80613a45575060018401546fffffffffffffffffffffffffffffffff80821670010000000000000000000000000000000090920416108015613a455750600184015484546fffffffffffffffffffffffffffffffff9182166c01000000000000000000000000909104909116105b80613ab15750600184015470010000000000000000000000000000000081046fffffffffffffffffffffffffffffffff9081169116148015613ab15750600184015484546c0100000000000000000000000090046fffffffffffffffffffffffffffffffff9081169116145b15613b6657600284015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1692505f839003613b095760028401546fffffffffffffffffffffffffffffffff169150613b3d565b600654600285015461271091613b30916fffffffffffffffffffffffffffffffff166144b4565b613b3a91906144cb565b91505b6002840154613b5f9083906fffffffffffffffffffffffffffffffff16614503565b9050613bfe565b60038401546fffffffffffffffffffffffffffffffff1692505f839003613ba55760028401546fffffffffffffffffffffffffffffffff169150613bd9565b600654600285015461271091613bcc916fffffffffffffffffffffffffffffffff166144b4565b613bd691906144cb565b91505b6002840154613bfb9083906fffffffffffffffffffffffffffffffff16614503565b90505b6003840180546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000086831602179091556004850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918316919091179055600780548391905f90613c77908490614474565b9091555050604080518481526020810183905290810183905285907f6dfdfcb09c8804d0058826cd2539f1acfbe3cb887c9be03d928035bce0f1a58d9060600160405180910390a25050505050565b5f54760100000000000000000000000000000000000000000000900460ff16613d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420697320747269676765726564000000000000000000000000000000606482015260840161092d565b600a5f613d7f600285614503565b815260208101919091526040015f9081205468010000000000000000900463ffffffff169003613e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f43616e206f6e6c7920737461727420726f756e6420616674657220726f756e6460448201527f206e2d322068617320656e646564000000000000000000000000000000000000606482015260840161092d565b600a5f613e3f600285614503565b815260208101919091526040015f205463ffffffff680100000000000000009091048116429091161015613ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43616e206f6e6c79207374617274206e657720726f756e64206166746572207260448201527f6f756e64206e2d3220636c6f736554696d657374616d70000000000000000000606482015260840161092d565b6115db8282613250565b80825d5050565b5f613f2773ffffffffffffffffffffffffffffffffffffffff841683613f9a565b905080515f14158015613f4b575080806020019051810190613f499190614543565b155b15612e49576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161092d565b6060613fa783835f613fae565b9392505050565b606081471015613fec576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161092d565b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516140149190614562565b5f6040518083038185875af1925050503d805f811461404e576040519150601f19603f3d011682016040523d82523d5f602084013e614053565b606091505b50915091506123388683836060826140735761406e826140ed565b613fa7565b8151158015614097575073ffffffffffffffffffffffffffffffffffffffff84163b155b156140e6576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161092d565b5080613fa7565b8051156140fd5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114614152575f80fd5b919050565b5f60208284031215614167575f80fd5b613fa78261412f565b80356fffffffffffffffffffffffffffffffff81168114614152575f80fd5b5f80604083850312156141a0575f80fd5b6141a983614170565b91506141b760208401614170565b90509250929050565b5f602082840312156141d0575f80fd5b5035919050565b5f80602083850312156141e8575f80fd5b823567ffffffffffffffff808211156141ff575f80fd5b818501915085601f830112614212575f80fd5b813581811115614220575f80fd5b8660208260051b8501011115614234575f80fd5b60209290920196919550909350505050565b5f8060408385031215614257575f80fd5b823591506141b76020840161412f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106142c9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b606081016142db8286614294565b6fffffffffffffffffffffffffffffffff841660208301528215156040830152949350505050565b5f8060408385031215614314575f80fd5b50508035926020909101359150565b5f805f60608486031215614335575f80fd5b61433e8461412f565b95602085013595506040909401359392505050565b606080825284518282018190525f91906020906080850190828901855b8281101561438c57815184529284019290840190600101614370565b505050848103828601528651808252878301918301905f5b818110156143ef5783516143b9848251614294565b808601516fffffffffffffffffffffffffffffffff168487015260409081015115159084015292840192918501916001016143a4565b505080945050505050826040830152949350505050565b5f8060408385031215614417575f80fd5b6144208361412f565b946020939093013593505050565b5f6020828403121561443e575f80fd5b613fa782614170565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611b1d57611b1d614447565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417611b1d57611b1d614447565b5f826144fe577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611b1d57611b1d614447565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614553575f80fd5b81518015158114613fa7575f80fd5b5f82515f5b818110156145815760208186018101518583015201614567565b505f92019182525091905056fea26469706673582212206509619f03e53e9419eb36ab6779d4aefad66fbec1ccae9337d2b5a233fd4ab864736f6c63430008180033000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000009184e72a000000000000000000000000000000000000000000000000000000000000000012c
Deployed Bytecode
0x60806040526004361061025c575f3560e01c80638456cb591161014b578063c61df64a116100c6578063f2b3c8091161007c578063f7fdec2811610062578063f7fdec2814610835578063fa968eea14610867578063fc6f94681461087c575f80fd5b8063f2b3c80914610801578063f2fde38b14610816575f80fd5b8063dd1f7596116100ac578063dd1f7596146107ae578063e46c6287146107cd578063eaba2361146107ec575f80fd5b8063c61df64a1461077a578063cc32d17614610799575f80fd5b8063951fd6001161011b578063aa6b873a11610101578063aa6b873a14610729578063b29a81401461073c578063b3ab15fb1461075b575f80fd5b8063951fd600146106dc578063a0c7f71c1461070a575f80fd5b80638456cb5914610538578063890dc7661461054c5780638c65c81f1461056b5780638da5cb5b146106b3575f80fd5b80636ba4c138116101db5780637285c58b116101ab57806377e741c71161019157806377e741c7146104e55780637bf41254146105045780637d1cd04f14610523575f80fd5b80637285c58b1461045657806376671808146104d0575f80fd5b80636ba4c138146103e55780636c18859314610404578063704b6c0214610423578063715018a614610442575f80fd5b8063368acb091161023057806343b2fde51161021657806343b2fde51461038557806357fb096f146103a45780635c975abb146103b7575f80fd5b8063368acb091461035c5780633f4ba83a14610371575f80fd5b80623bdc74146102605780630f74174f14610276578063127effb2146102bc578063273867d41461030d575b5f80fd5b34801561026b575f80fd5b506102746108a8565b005b348015610281575f80fd5b505f546102a7907501000000000000000000000000000000000000000000900460ff1681565b60405190151581526020015b60405180910390f35b3480156102c7575f80fd5b506002546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b3565b348015610318575f80fd5b5061034e610327366004614157565b73ffffffffffffffffffffffffffffffffffffffff165f908152600b602052604090205490565b6040519081526020016102b3565b348015610367575f80fd5b5061034e60075481565b34801561037c575f80fd5b5061027461099f565b348015610390575f80fd5b5061027461039f36600461418f565b610aa6565b6102746103b23660046141c0565b610cf1565b3480156103c2575f80fd5b505f5474010000000000000000000000000000000000000000900460ff166102a7565b3480156103f0575f80fd5b506102746103ff3660046141d7565b6110e2565b34801561040f575f80fd5b5061027461041e3660046141c0565b6115df565b34801561042e575f80fd5b5061027461043d366004614157565b611710565b34801561044d575f80fd5b50610274611803565b348015610461575f80fd5b506104c1610470366004614246565b600960209081525f928352604080842090915290825290205460ff808216916fffffffffffffffffffffffffffffffff61010082041691710100000000000000000000000000000000009091041683565b6040516102b3939291906142cd565b3480156104db575f80fd5b5061034e60085481565b3480156104f0575f80fd5b506102746104ff3660046141c0565b611814565b34801561050f575f80fd5b506102a761051e366004614246565b611941565b34801561052e575f80fd5b5061034e60045481565b348015610543575f80fd5b50610274611b23565b348015610557575f80fd5b50610274610566366004614303565b611c03565b348015610576575f80fd5b506106316105853660046141c0565b600a6020525f90815260409020805460018201546002830154600384015460049094015463ffffffff808516956401000000008604821695680100000000000000008104909216946fffffffffffffffffffffffffffffffff6c0100000000000000000000000090930483169481841694700100000000000000000000000000000000928390048516948281169492849004811693838216938190048216929182169160ff919004168c565b6040805163ffffffff9d8e1681529b8d1660208d015299909b16988a01989098526fffffffffffffffffffffffffffffffff96871660608a0152948616608089015292851660a088015290841660c0870152831660e08601528216610100850152811661012084015216610140820152901515610160820152610180016102b3565b3480156106be575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166102e8565b3480156106e7575f80fd5b506106fb6106f6366004614323565b611d62565b6040516102b393929190614353565b348015610715575f80fd5b506102a7610724366004614246565b612018565b6102746107373660046141c0565b612342565b348015610747575f80fd5b50610274610756366004614406565b61271c565b348015610766575f80fd5b50610274610775366004614157565b612799565b348015610785575f80fd5b5061027461079436600461418f565b612905565b3480156107a4575f80fd5b5061034e60065481565b3480156107b9575f80fd5b5061034e6107c8366004614406565b612add565b3480156107d8575f80fd5b506102746107e736600461442e565b612b08565b3480156107f7575f80fd5b5061034e60035481565b34801561080c575f80fd5b5061034e6103e881565b348015610821575f80fd5b50610274610830366004614157565b612c9d565b348015610840575f80fd5b505f546102a790760100000000000000000000000000000000000000000000900460ff1681565b348015610872575f80fd5b5061034e60055481565b348015610887575f80fd5b506001546102e89073ffffffffffffffffffffffffffffffffffffffff1681565b6108b0612cfd565b60015473ffffffffffffffffffffffffffffffffffffffff163314610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600780545f9091556001546109619073ffffffffffffffffffffffffffffffffffffffff1682612d83565b6040518181527fb9197c6b8e21274bd1e2d9c956a88af5cfee510f630fab3f046300f88b4223619060200160405180910390a15061099d612e4e565b565b6109a7612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314806109e4575060025473ffffffffffffffffffffffffffffffffffffffff1633145b610a4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f742061646d696e2f6f70657261746f720000000000000000000000000000604482015260640161092d565b5f80547fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff169055610a79612ecb565b6008546040517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab7905f90a2565b610aae612f47565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff16610bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420697320747269676765726564000000000000000000000000000000606482015260840161092d565b5f547501000000000000000000000000000000000000000000900460ff1615610c85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f43616e206f6e6c792072756e2067656e657369734c6f636b526f756e64206f6e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161092d565b610c9160085483612f9b565b600854610c9f906001614474565b6008819055610cae9082613250565b50505f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b610cf9612f47565b610d01612cfd565b333b15610d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b333214610dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b6008548114610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c6174650000000000000000000000604482015260640161092d565b5f818152600a60205260409020610e54816133c7565b610eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c650000000000000000000000000000604482015260640161092d565b600554341015610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e740000000000000000000000000000000000000000606482015260840161092d565b5f8281526009602090815260408083203384529091529020805461010090046fffffffffffffffffffffffffffffffff1615610fe4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015260640161092d565b6002820180547001000000000000000000000000000000007fffffffffffffffffffffffffffffffff000000000000000000000000000000008216346fffffffffffffffffffffffffffffffff938416810184169182178390048416810184169092021790925582547fffffffffffffffffffffffffffffff000000000000000000000000000000000016610100918316918202178355335f818152600b60209081526040808320805460018101825590845292829020909201889055905192835286927fc4dff95c4e464dd34e49d0e93b6d7bc0cbd425589cea42e9ac0064a1a2bba26491015b60405180910390a35050506110df612e4e565b50565b6110ea612cfd565b333b15611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b3332146111bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b5f81815b818110156115c0575f8585838181106111db576111db614487565b602090810292909201355f818152600a84526040808220815161018081018352815463ffffffff808216808452640100000000830482169984019990995268010000000000000000820416938201939093526c010000000000000000000000009092046fffffffffffffffffffffffffffffffff90811660608401526001820154808216608085015270010000000000000000000000000000000090819004821660a0850152600283015480831660c0860152819004821660e0850152600383015480831661010086015281900482166101208501526004909201549081166101408401520460ff16151561016082015291945090929003905061133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f526f756e6420686173206e6f7420737461727465640000000000000000000000604482015260640161092d565b806040015163ffffffff164263ffffffff16116113b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f526f756e6420686173206e6f7420656e64656400000000000000000000000000604482015260640161092d565b5f82815260096020908152604080832033845290915281206101608301511561148d576113e18433612018565b611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656c696769626c6520666f7220636c61696d00000000000000000000604482015260640161092d565b61012083015161014084015182546fffffffffffffffffffffffffffffffff9283169261147c928116916101009004166144b4565b61148691906144cb565b9150611519565b6114978433611941565b6114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f7420656c696769626c6520666f7220726566756e64000000000000000000604482015260640161092d565b805461010090046fffffffffffffffffffffffffffffffff1691505b80547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815561155d8288614474565b9650833373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7846040516115a891815260200190565b60405180910390a35050600190920191506111c09050565b5081156115d1576115d13383612d83565b50506115db612e4e565b5050565b6115e7612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b805f036116d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d757374206265207375706572696f7220746f20300000000000000000000000604482015260640161092d565b60058190556008546040518281527f90eb87c560a0213754ceb3a7fa3012f01acab0a35602c1e1995adf69dabc9d50906020015b60405180910390a250565b611718613425565b73ffffffffffffffffffffffffffffffffffffffff8116611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f206164647265737300000000000000000000604482015260640161092d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f137b621413925496477d46e5055ac0d56178bdd724ba8bf843afceef18268ba3905f90a250565b61180b613425565b61099d5f613477565b61181c612e78565b60015473ffffffffffffffffffffffffffffffffffffffff16331461189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b6103e8811115611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54726561737572792066656520746f6f20686967680000000000000000000000604482015260640161092d565b60068190556008546040518281527fb1c4ee38d35556741133da7ff9b6f7ab0fa88d0406133126ff128f635490a85790602001611705565b5f82815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff16600181111561199557611995614267565b60018111156119a6576119a6614267565b815290546fffffffffffffffffffffffffffffffff610100808304821660208086019190915260ff71010000000000000000000000000000000000909404841615156040958601525f8a8152600a8252859020855161018081018752815463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316968101969096526c01000000000000000000000000909104831660608601526001810154808416608087015270010000000000000000000000000000000090819004841660a0870152600282015480851660c0880152819004841660e08701526003820154808516938701939093529182900483166101208601526004015491821661014085015290041615801561016083018190529293509091611ad557508160400151155b8015611af75750600354816040015163ffffffff16611af49190614474565b42115b8015611b18575060208201516fffffffffffffffffffffffffffffffff1615155b925050505b92915050565b611b2b612f47565b60015473ffffffffffffffffffffffffffffffffffffffff16331480611b68575060025473ffffffffffffffffffffffffffffffffffffffff1633145b611bce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f742061646d696e2f6f70657261746f720000000000000000000000000000604482015260640161092d565b611bd66134eb565b6008546040517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d905f90a2565b611c0b612e78565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b808210611d1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f6275666665725365636f6e6473206d75737420626520696e666572696f72207460448201527f6f20696e74657276616c5365636f6e6473000000000000000000000000000000606482015260840161092d565b6003829055600481905560408051838152602081018390527fe60149e0431fec12df63dfab5fce2a9cefe9a4d3df5f41cb626f579ae1f2b91a910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600b602052604081205460609182918490611d99908790614503565b811115611dd35773ffffffffffffffffffffffffffffffffffffffff87165f908152600b6020526040902054611dd0908790614503565b90505b5f8167ffffffffffffffff811115611ded57611ded614516565b604051908082528060200260200182016040528015611e16578160200160208202803683370190505b5090505f8267ffffffffffffffff811115611e3357611e33614516565b604051908082528060200260200182016040528015611e9b57816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611e515790505b5090505f5b83811015611ff95773ffffffffffffffffffffffffffffffffffffffff8a165f908152600b60205260409020611ed6828b614474565b81548110611ee657611ee6614487565b905f5260205f200154838281518110611f0157611f01614487565b60200260200101818152505060095f848381518110611f2257611f22614487565b60209081029190910181015182528181019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8e168252909252908190208151606081019092528054829060ff166001811115611f8157611f81614267565b6001811115611f9257611f92614267565b8152905461010081046fffffffffffffffffffffffffffffffff16602083015271010000000000000000000000000000000000900460ff1615156040909101528251839083908110611fe657611fe6614487565b6020908102919091010152600101611ea0565b508181612006858b614474565b95509550955050505093509350939050565b5f82815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152808220815160608101909252805483929190829060ff16600181111561206c5761206c614267565b600181111561207d5761207d614267565b815290546fffffffffffffffffffffffffffffffff610100808304821660208086019190915260ff71010000000000000000000000000000000000909404841615156040958601525f8a8152600a8252858120865161018081018852815463ffffffff80821683526401000000008204811695830195909552680100000000000000008104909416978101979097526c010000000000000000000000009092048416606087015260018201548085166080880181905270010000000000000000000000000000000091829004861660a08901819052600285015480881660c08b0152839004871660e08a01526003850154808816968a0196909652948290048616610120890152600490930154948516610140880152909304909316151561016085015293945091921180156121de575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16115b8061224a575081608001516fffffffffffffffffffffffffffffffff168260a001516fffffffffffffffffffffffffffffffff1610801561224a575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16105b806122b6575081608001516fffffffffffffffffffffffffffffffff168260a001516fffffffffffffffffffffffffffffffff161480156122b6575081608001516fffffffffffffffffffffffffffffffff1682606001516fffffffffffffffffffffffffffffffff16145b905081610160015180156122df575060208301516fffffffffffffffffffffffffffffffff1615155b80156122ed57508260400151155b8015612338575080801561231257505f8351600181111561231057612310614267565b145b80612338575080158015612338575060018351600181111561233657612336614267565b145b9695505050505050565b61234a612f47565b612352612cfd565b333b156123bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f776564000000000000000000000000604482015260640161092d565b333214612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f776564000000000000604482015260640161092d565b600854811461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42657420697320746f6f206561726c792f6c6174650000000000000000000000604482015260640161092d565b5f818152600a602052604090206124a5816133c7565b61250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526f756e64206e6f74206265747461626c650000000000000000000000000000604482015260640161092d565b60055434101561259d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42657420616d6f756e74206d7573742062652067726561746572207468616e2060448201527f6d696e426574416d6f756e740000000000000000000000000000000000000000606482015260840161092d565b5f8281526009602090815260408083203384529091529020805461010090046fffffffffffffffffffffffffffffffff1615612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c7920626574206f6e63652070657220726f756e640000000000604482015260640161092d565b6002820180546fffffffffffffffffffffffffffffffff8082163490810182167fffffffffffffffffffffffffffffffff00000000000000000000000000000000938416179093556003850180548083168501831693169290921790915582547fffffffffffffffffffffffffffffff0000000000000000000000000000000000166101009183169182021760019081178455335f818152600b602090815260408083208054958601815583529181902090930188905551928352869290917f58d983c1c289f0d1b4b762549078c5845b1b2ec2de3b513cd137e9d1da5f89a291016110cc565b612724613425565b61274573ffffffffffffffffffffffffffffffffffffffff83163383613559565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e988260405161278d91815260200190565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742061646d696e0000000000000000000000000000000000000000000000604482015260640161092d565b73ffffffffffffffffffffffffffffffffffffffff8116612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207a65726f206164647265737300000000000000000000604482015260640161092d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fc47d127c07bdd56c5ccba00463ce3bd3c1bca71b4670eea6e5d0c02e4aa156e2905f90a250565b61290d612f47565b60025473ffffffffffffffffffffffffffffffffffffffff16331461298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff1680156129d357505f547501000000000000000000000000000000000000000000900460ff165b612a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420616e642067656e657369734c6f636b526f756e642069732074726960648201527f6767657265640000000000000000000000000000000000000000000000000000608482015260a40161092d565b612a9160085483612f9b565b612aa96001600854612aa39190614503565b836135e6565b612ac06001600854612abb9190614503565b6138aa565b600854612ace906001614474565b60088190556115db9082613cc6565b600b602052815f5260405f208181548110612af6575f80fd5b905f5260205f20015f91509150505481565b612b10612f47565b60025473ffffffffffffffffffffffffffffffffffffffff163314612b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f74206f70657261746f720000000000000000000000000000000000000000604482015260640161092d565b5f54760100000000000000000000000000000000000000000000900460ff1615612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e206f6e6c792072756e2067656e657369735374617274526f756e64206f60448201527f6e63650000000000000000000000000000000000000000000000000000000000606482015260840161092d565b600854612c4b906001614474565b6008819055612c5a9082613250565b505f80547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055565b612ca5613425565b73ffffffffffffffffffffffffffffffffffffffff8116612cf4576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161092d565b6110df81613477565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15612d56576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61099d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90613eff565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114612dd9576040519150601f19603f3d011682016040523d82523d5f602084013e612dde565b606091505b5050905080612e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015260640161092d565b505050565b61099d5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00612d7d565b5f5474010000000000000000000000000000000000000000900460ff1661099d576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed3612e78565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b5f5474010000000000000000000000000000000000000000900460ff161561099d576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600a602052604081208054909163ffffffff9091169003613042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f43616e206f6e6c79206c6f636b20726f756e6420616674657220726f756e642060448201527f6861732073746172746564000000000000000000000000000000000000000000606482015260840161092d565b805463ffffffff64010000000090910481164290911610156130e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c79206c6f636b20726f756e64206166746572206c6f636b546960448201527f6d657374616d7000000000000000000000000000000000000000000000000000606482015260840161092d565b60035481546131039190640100000000900463ffffffff16614474565b421115613192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f43616e206f6e6c79206c6f636b20726f756e642077697468696e20627566666560448201527f725365636f6e6473000000000000000000000000000000000000000000000000606482015260840161092d565b60045481547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16680100000000000000004290920163ffffffff16919091021781556001810180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff841690811790915560405190815283907f6ec696c906ea967e40a4a5cef6dcdf1b469bda698722fb465728a15b521e207e906020015b60405180910390a2505050565b5f828152600a602052604090819020805463ffffffff428181167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008416811785556004805483018416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909516909117939093178085559254600280860180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690556fffffffffffffffffffffffffffffffff88166c01000000000000000000000000027fffffffff00000000000000000000000000000000ffffffffffffffffffffffff919092029092019092166801000000000000000002167fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091171790555182907f8d3960384b609cf325c5ed2cb49da19bee5a75fe7001d56b90ed7452fc7eccd09061278d9084906fffffffffffffffffffffffffffffffff91909116815260200190565b80545f9063ffffffff16158015906133ed57508154640100000000900463ffffffff1615155b80156134045750815463ffffffff90811642909116115b8015611b1d57505054640100000000900463ffffffff908116429091161090565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461099d576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161092d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6134f3612f47565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f1d3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612e49908490613f06565b5f828152600a6020526040812054640100000000900463ffffffff169003613690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f43616e206f6e6c7920656e6420726f756e6420616674657220726f756e64206860448201527f6173206c6f636b65640000000000000000000000000000000000000000000000606482015260840161092d565b5f828152600a602052604090205463ffffffff680100000000000000009091048116429091161015613744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e6420616674657220636c6f7365546960448201527f6d657374616d7000000000000000000000000000000000000000000000000000606482015260840161092d565b6003545f838152600a6020526040902054613771919068010000000000000000900463ffffffff16614474565b421115613800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f43616e206f6e6c7920656e6420726f756e642077697468696e2062756666657260448201527f5365636f6e647300000000000000000000000000000000000000000000000000606482015260840161092d565b5f828152600a60209081526040918290206001810180546fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000878316810291909117928390556004840180547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff16821790559451949091041683529184917f7565b575bc429a154ce00e55941c44b14b3318545f3a223a4bd919cbf0136ec89101613243565b5f818152600a60205260409020600381015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16158015613903575060048101546fffffffffffffffffffffffffffffffff16155b613969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f526577617264732063616c63756c617465640000000000000000000000000000604482015260640161092d565b60018101545f90819081906fffffffffffffffffffffffffffffffff808216700100000000000000000000000000000000909204161180156139d75750600184015484546fffffffffffffffffffffffffffffffff9182166c01000000000000000000000000909104909116115b80613a45575060018401546fffffffffffffffffffffffffffffffff80821670010000000000000000000000000000000090920416108015613a455750600184015484546fffffffffffffffffffffffffffffffff9182166c01000000000000000000000000909104909116105b80613ab15750600184015470010000000000000000000000000000000081046fffffffffffffffffffffffffffffffff9081169116148015613ab15750600184015484546c0100000000000000000000000090046fffffffffffffffffffffffffffffffff9081169116145b15613b6657600284015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1692505f839003613b095760028401546fffffffffffffffffffffffffffffffff169150613b3d565b600654600285015461271091613b30916fffffffffffffffffffffffffffffffff166144b4565b613b3a91906144cb565b91505b6002840154613b5f9083906fffffffffffffffffffffffffffffffff16614503565b9050613bfe565b60038401546fffffffffffffffffffffffffffffffff1692505f839003613ba55760028401546fffffffffffffffffffffffffffffffff169150613bd9565b600654600285015461271091613bcc916fffffffffffffffffffffffffffffffff166144b4565b613bd691906144cb565b91505b6002840154613bfb9083906fffffffffffffffffffffffffffffffff16614503565b90505b6003840180546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000086831602179091556004850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918316919091179055600780548391905f90613c77908490614474565b9091555050604080518481526020810183905290810183905285907f6dfdfcb09c8804d0058826cd2539f1acfbe3cb887c9be03d928035bce0f1a58d9060600160405180910390a25050505050565b5f54760100000000000000000000000000000000000000000000900460ff16613d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f43616e206f6e6c792072756e2061667465722067656e6573697353746172745260448201527f6f756e6420697320747269676765726564000000000000000000000000000000606482015260840161092d565b600a5f613d7f600285614503565b815260208101919091526040015f9081205468010000000000000000900463ffffffff169003613e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f43616e206f6e6c7920737461727420726f756e6420616674657220726f756e6460448201527f206e2d322068617320656e646564000000000000000000000000000000000000606482015260840161092d565b600a5f613e3f600285614503565b815260208101919091526040015f205463ffffffff680100000000000000009091048116429091161015613ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43616e206f6e6c79207374617274206e657720726f756e64206166746572207260448201527f6f756e64206e2d3220636c6f736554696d657374616d70000000000000000000606482015260840161092d565b6115db8282613250565b80825d5050565b5f613f2773ffffffffffffffffffffffffffffffffffffffff841683613f9a565b905080515f14158015613f4b575080806020019051810190613f499190614543565b155b15612e49576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161092d565b6060613fa783835f613fae565b9392505050565b606081471015613fec576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161092d565b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516140149190614562565b5f6040518083038185875af1925050503d805f811461404e576040519150601f19603f3d011682016040523d82523d5f602084013e614053565b606091505b50915091506123388683836060826140735761406e826140ed565b613fa7565b8151158015614097575073ffffffffffffffffffffffffffffffffffffffff84163b155b156140e6576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161092d565b5080613fa7565b8051156140fd5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114614152575f80fd5b919050565b5f60208284031215614167575f80fd5b613fa78261412f565b80356fffffffffffffffffffffffffffffffff81168114614152575f80fd5b5f80604083850312156141a0575f80fd5b6141a983614170565b91506141b760208401614170565b90509250929050565b5f602082840312156141d0575f80fd5b5035919050565b5f80602083850312156141e8575f80fd5b823567ffffffffffffffff808211156141ff575f80fd5b818501915085601f830112614212575f80fd5b813581811115614220575f80fd5b8660208260051b8501011115614234575f80fd5b60209290920196919550909350505050565b5f8060408385031215614257575f80fd5b823591506141b76020840161412f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600281106142c9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b606081016142db8286614294565b6fffffffffffffffffffffffffffffffff841660208301528215156040830152949350505050565b5f8060408385031215614314575f80fd5b50508035926020909101359150565b5f805f60608486031215614335575f80fd5b61433e8461412f565b95602085013595506040909401359392505050565b606080825284518282018190525f91906020906080850190828901855b8281101561438c57815184529284019290840190600101614370565b505050848103828601528651808252878301918301905f5b818110156143ef5783516143b9848251614294565b808601516fffffffffffffffffffffffffffffffff168487015260409081015115159084015292840192918501916001016143a4565b505080945050505050826040830152949350505050565b5f8060408385031215614417575f80fd5b6144208361412f565b946020939093013593505050565b5f6020828403121561443e575f80fd5b613fa782614170565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611b1d57611b1d614447565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417611b1d57611b1d614447565b5f826144fe577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611b1d57611b1d614447565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614553575f80fd5b81518015158114613fa7575f80fd5b5f82515f5b818110156145815760208186018101518583015201614567565b505f92019182525091905056fea26469706673582212206509619f03e53e9419eb36ab6779d4aefad66fbec1ccae9337d2b5a233fd4ab864736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000009184e72a000000000000000000000000000000000000000000000000000000000000000012c
-----Decoded View---------------
Arg [0] : _adminAddress (address): 0xB134367C0E447D7De9Bd50E55762C190C678FFEa
Arg [1] : _operatorAddress (address): 0xB134367C0E447D7De9Bd50E55762C190C678FFEa
Arg [2] : _intervalSeconds (uint256): 300
Arg [3] : _bufferSeconds (uint256): 30
Arg [4] : _minBetAmount (uint256): 10000000000000
Arg [5] : _treasuryFee (uint256): 300
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea
Arg [1] : 000000000000000000000000b134367c0e447d7de9bd50e55762c190c678ffea
Arg [2] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [4] : 000000000000000000000000000000000000000000000000000009184e72a000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000012c
Deployed Bytecode Sourcemap
471:20996:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10194:271;;;;;;;;;;;;;:::i;:::-;;586:35;;;;;;;;;;-1:-1:-1;586:35:7;;;;;;;;;;;;;;275:14:10;;268:22;250:41;;238:2;223:18;586:35:7;;;;;;;;727:30;;;;;;;;;;-1:-1:-1;727:30:7;;;;;;;;;;;478:42:10;466:55;;;448:74;;436:2;421:18;727:30:7;302:226:10;14323:122:7;;;;;;;;;;-1:-1:-1;14323:122:7;;;;;:::i;:::-;14415:16;;14389:7;14415:16;;;:10;:16;;;;;:23;;14323:122;;;;1071:25:10;;;1059:2;1044:18;14323:122:7;925:177:10;1136:29:7;;;;;;;;;;;;;;;;10954:190;;;;;;;;;;;;;:::i;9277:440::-;;;;;;;;;;-1:-1:-1;9277:440:7;;;;;:::i;:::-;;:::i;6054:932::-;;;;;;:::i;:::-;;:::i;1850:84:6:-;;;;;;;;;;-1:-1:-1;1897:4:6;1920:7;;;;;;1850:84;;7097:1338:7;;;;;;;;;;-1:-1:-1;7097:1338:7;;;;;:::i;:::-;;:::i;11750:244::-;;;;;;;;;;-1:-1:-1;11750:244:7;;;;;:::i;:::-;;:::i;13150:223::-;;;;;;;;;;-1:-1:-1;13150:223:7;;;;;:::i;:::-;;:::i;2293:101:0:-;;;;;;;;;;;;;:::i;1345:61:7:-;;;;;;;;;;-1:-1:-1;1345:61:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1212:27::-;;;;;;;;;;;;;;;;12410:252;;;;;;;;;;-1:-1:-1;12410:252:7;;;;;:::i;:::-;;:::i;15411:339::-;;;;;;;;;;-1:-1:-1;15411:339:7;;;;;:::i;:::-;;:::i;888:30::-;;;;;;;;;;;;;;;;10597:120;;;;;;;;;;;;;:::i;11248:418::-;;;;;;;;;;-1:-1:-1;11248:418:7;;;;;:::i;:::-;;:::i;1412:39::-;;;;;;;;;;-1:-1:-1;1412:39:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4352:10:10;4389:15;;;4371:34;;4441:15;;;4436:2;4421:18;;4414:43;4493:15;;;;4473:18;;;4466:43;;;;4528:34;4598:15;;;4593:2;4578:18;;4571:43;4651:15;;;4645:3;4630:19;;4623:44;4704:15;;;4698:3;4683:19;;4676:44;4757:15;;;4751:3;4736:19;;4729:44;4810:15;;4804:3;4789:19;;4782:44;3182:46;;4877:3;4862:19;;3170:59;3182:46;;4933:3;4918:19;;3170:59;3182:46;4990:3;4975:19;;3170:59;84:13;;77:21;5044:3;5029:19;;65:34;4329:3;4314:19;1412:39:7;3897:1158:10;1638:85:0;;;;;;;;;;-1:-1:-1;1684:7:0;1710:6;;;1638:85;;13571:654:7;;;;;;;;;;-1:-1:-1;13571:654:7;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;14601:653::-;;;;;;;;;;-1:-1:-1;14601:653:7;;;;;:::i;:::-;;:::i;4954:932::-;;;;;;:::i;:::-;;:::i;12871:194::-;;;;;;;;;;-1:-1:-1;12871:194:7;;;;;:::i;:::-;;:::i;12082:244::-;;;;;;;;;;-1:-1:-1;12082:244:7;;;;;:::i;:::-;;:::i;8569:619::-;;;;;;;;;;-1:-1:-1;8569:619:7;;;;;:::i;:::-;;:::i;1058:26::-;;;;;;;;;;;;;;;;1457:47;;;;;;;;;;-1:-1:-1;1457:47:7;;;;;:::i;:::-;;:::i;9816:281::-;;;;;;;;;;-1:-1:-1;9816:281:7;;;;;:::i;:::-;;:::i;791:28::-;;;;;;;;;;;;;;;;1284:47;;;;;;;;;;;;1327:4;1284:47;;2543:215:0;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;627:36:7:-;;;;;;;;;;-1:-1:-1;627:36:7;;;;;;;;;;;978:27;;;;;;;;;;;;;;;;670;;;;;;;;;;-1:-1:-1;670:27:7;;;;;;;;10194:271;1094:21:8;:19;:21::i;:::-;3351:12:7::1;::::0;::::1;;3337:10;:26;3329:48;;;::::0;::::1;::::0;;7585:2:10;3329:48:7::1;::::0;::::1;7567:21:10::0;7624:1;7604:18;;;7597:29;7662:11;7642:18;;;7635:39;7691:18;;3329:48:7::1;;;;;;;;;10293:14:::2;::::0;;10261:29:::2;10317:18:::0;;;-1:-1:-1;10370:12:7;10345:61:::2;::::0;10370:12:::2;;10293:14:::0;10345:24:::2;:61::i;:::-;10422:36;::::0;1071:25:10;;;10422:36:7::2;::::0;1059:2:10;1044:18;10422:36:7::2;;;;;;;10251:214;1136:20:8::0;:18;:20::i;:::-;10194:271:7:o;10954:190::-;1721:16:6;:14;:16::i;:::-;3464:12:7::1;::::0;::::1;;3450:10;:26;::::0;:59:::1;;-1:-1:-1::0;3494:15:7::1;::::0;::::1;;3480:10;:29;3450:59;3442:90;;;::::0;::::1;::::0;;7922:2:10;3442:90:7::1;::::0;::::1;7904:21:10::0;7961:2;7941:18;;;7934:30;8000:20;7980:18;;;7973:48;8038:18;;3442:90:7::1;7720:342:10::0;3442:90:7::1;11042:5:::2;11023:24:::0;;11057:23;;;;11090:10:::2;:8;:10::i;:::-;11124:12;::::0;11116:21:::2;::::0;::::2;::::0;;;::::2;10954:190::o:0;9277:440::-;1474:19:6;:17;:19::i;:::-;3612:15:7::1;::::0;::::1;;3598:10;:29;3590:54;;;::::0;::::1;::::0;;8269:2:10;3590:54:7::1;::::0;::::1;8251:21:10::0;8308:2;8288:18;;;8281:30;8347:14;8327:18;;;8320:42;8379:18;;3590:54:7::1;8067:336:10::0;3590:54:7::1;9396:16:::2;::::0;;;::::2;;;9388:78;;;::::0;::::2;::::0;;8610:2:10;9388:78:7::2;::::0;::::2;8592:21:10::0;8649:2;8629:18;;;8622:30;8688:34;8668:18;;;8661:62;8759:19;8739:18;;;8732:47;8796:19;;9388:78:7::2;8408:413:10::0;9388:78:7::2;9485:15;::::0;;;::::2;;;9484:16;9476:63;;;::::0;::::2;::::0;;9028:2:10;9476:63:7::2;::::0;::::2;9010:21:10::0;9067:2;9047:18;;;9040:30;9106:34;9086:18;;;9079:62;9177:4;9157:18;;;9150:32;9199:19;;9476:63:7::2;8826:398:10::0;9476:63:7::2;9550:42;9565:12;;9579;9550:14;:42::i;:::-;9618:12;::::0;:16:::2;::::0;9633:1:::2;9618:16;:::i;:::-;9603:12;:31:::0;;;9644:34:::2;::::0;9670:7;9644:11:::2;:34::i;:::-;-1:-1:-1::0;;9688:15:7::2;:22:::0;;;::::2;::::0;::::2;::::0;;9277:440::o;6054:932::-;1474:19:6;:17;:19::i;:::-;1094:21:8::1;:19;:21::i;:::-;3722:10:7::2;21403:20:::0;21449:9;3701:57:::2;;;::::0;::::2;::::0;;9750:2:10;3701:57:7::2;::::0;::::2;9732:21:10::0;9789:2;9769:18;;;9762:30;9828:22;9808:18;;;9801:50;9868:18;;3701:57:7::2;9548:344:10::0;3701:57:7::2;3776:10;3790:9;3776:23;3768:62;;;::::0;::::2;::::0;;10099:2:10;3768:62:7::2;::::0;::::2;10081:21:10::0;10138:2;10118:18;;;10111:30;10177:28;10157:18;;;10150:56;10223:18;;3768:62:7::2;9897:350:10::0;3768:62:7::2;6169:12:::3;;6160:5;:21;6152:55;;;::::0;::::3;::::0;;10454:2:10;6152:55:7::3;::::0;::::3;10436:21:10::0;10493:2;10473:18;;;10466:30;10532:23;10512:18;;;10505:51;10573:18;;6152:55:7::3;10252:345:10::0;6152:55:7::3;6217:19;6239:13:::0;;;:6:::3;:13;::::0;;;;6270:16:::3;6239:13:::0;6270:9:::3;:16::i;:::-;6262:47;;;::::0;::::3;::::0;;10804:2:10;6262:47:7::3;::::0;::::3;10786:21:10::0;10843:2;10823:18;;;10816:30;10882:20;10862:18;;;10855:48;10920:18;;6262:47:7::3;10602:342:10::0;6262:47:7::3;6340:12;;6327:9;:25;;6319:82;;;::::0;::::3;::::0;;11151:2:10;6319:82:7::3;::::0;::::3;11133:21:10::0;11190:2;11170:18;;;11163:30;11229:34;11209:18;;;11202:62;11300:14;11280:18;;;11273:42;11332:19;;6319:82:7::3;10949:408:10::0;6319:82:7::3;6411:23;6437:13:::0;;;:6:::3;:13;::::0;;;;;;;6451:10:::3;6437:25:::0;;;;;;;6480:14;;::::3;::::0;::::3;;;:19:::0;6472:59:::3;;;::::0;::::3;::::0;;11564:2:10;6472:59:7::3;::::0;::::3;11546:21:10::0;11603:2;11583:18;;;11576:30;11642:29;11622:18;;;11615:57;11689:18;;6472:59:7::3;11362:351:10::0;6472:59:7::3;6668:17;::::0;::::3;::::0;;6727:16;6648:46;;::::3;6624:9;6668:17;::::0;;::::3;:26:::0;::::3;6648:46:::0;::::3;::::0;;::::3;6727:16:::0;;::::3;::::0;::::3;:25:::0;::::3;6708:44:::0;::::3;::::0;;::::3;;::::0;;;6799:32;;6845:23;;::::3;::::0;;::::3;::::0;;::::3;;::::0;;6893:10:::3;-1:-1:-1::0;6882:22:7;;;:10:::3;:22;::::0;;;;;;;:34;;-1:-1:-1;6882:34:7;::::3;::::0;;;;;;;;;;;::::3;::::0;;;6935;;11864:66:10;;;6882:34:7;;6935::::3;::::0;11837:18:10;6935:34:7::3;;;;;;;;6542:438;6142:844;;1136:20:8::1;:18;:20::i;:::-;6054:932:7::0;:::o;7097:1338::-;1094:21:8;:19;:21::i;:::-;3722:10:7::1;21403:20:::0;21449:9;3701:57:::1;;;::::0;::::1;::::0;;9750:2:10;3701:57:7::1;::::0;::::1;9732:21:10::0;9789:2;9769:18;;;9762:30;9828:22;9808:18;;;9801:50;9868:18;;3701:57:7::1;9548:344:10::0;3701:57:7::1;3776:10;3790:9;3776:23;3768:62;;;::::0;::::1;::::0;;10099:2:10;3768:62:7::1;::::0;::::1;10081:21:10::0;10138:2;10118:18;;;10111:30;10177:28;10157:18;;;10150:56;10223:18;;3768:62:7::1;9897:350:10::0;3768:62:7::1;7183:14:::2;7247:6:::0;7183:14;7270:1054:::2;7294:6;7290:1;:10;7270:1054;;;7321:18;7342:6;;7349:1;7342:9;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;::::2;;7365:18;7386::::0;;;:6:::2;:18:::0;;;;;;7365:39;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;;::::0;;;;;;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;;;;;::::0;;;;7342:9;;-1:-1:-1;7365:39:7;;7427:25;;;-1:-1:-1;7419:59:7::2;;;::::0;::::2;::::0;;12332:2:10;7419:59:7::2;::::0;::::2;12314:21:10::0;12371:2;12351:18;;;12344:30;12410:23;12390:18;;;12383:51;12451:18;;7419:59:7::2;12130:345:10::0;7419:59:7::2;7526:5;:20;;;7500:46;;7507:15;7500:46;;;7492:78;;;::::0;::::2;::::0;;12682:2:10;7492:78:7::2;::::0;::::2;12664:21:10::0;12721:2;12701:18;;;12694:30;12760:21;12740:18;;;12733:49;12799:18;;7492:78:7::2;12480:343:10::0;7492:78:7::2;7585:19;7648:18:::0;;;:6:::2;:18;::::0;;;;;;;7667:10:::2;7648:30:::0;;;;;;;7738:18:::2;::::0;::::2;::::0;7734:446:::2;;;7784:33;7794:10;7806;7784:9;:33::i;:::-;7776:68;;;::::0;::::2;::::0;;13030:2:10;7776:68:7::2;::::0;::::2;13012:21:10::0;13069:2;13049:18;;;13042:30;13108:24;13088:18;;;13081:52;13150:18;;7776:68:7::2;12828:346:10::0;7776:68:7::2;7925:25;::::0;::::2;::::0;7902:18:::2;::::0;::::2;::::0;7877:14;;7876:74:::2;::::0;;::::2;::::0;7877:44:::2;::::0;7894:27;::::2;::::0;7877:14:::2;::::0;::::2;;:44;:::i;:::-;7876:74;;;;:::i;:::-;7862:88;;7734:446;;;8057:34;8068:10;8080;8057;:34::i;:::-;8049:70;;;::::0;::::2;::::0;;13833:2:10;8049:70:7::2;::::0;::::2;13815:21:10::0;13872:2;13852:18;;;13845:30;13911:25;13891:18;;;13884:53;13954:18;;8049:70:7::2;13631:347:10::0;8049:70:7::2;8151:14:::0;;::::2;::::0;::::2;;;::::0;-1:-1:-1;7734:446:7::2;8194:22:::0;;;::::2;::::0;::::2;::::0;;8230:21:::2;8240:11:::0;8230:21;::::2;:::i;:::-;;;8289:10;8277;8271:42;;;8301:11;8271:42;;;;1071:25:10::0;;1059:2;1044:18;;925:177;8271:42:7::2;;;;;;;;-1:-1:-1::0;;7302:3:7::2;::::0;;::::2;::::0;-1:-1:-1;7270:1054:7::2;::::0;-1:-1:-1;7270:1054:7::2;;-1:-1:-1::0;8338:11:7;;8334:95:::2;;8365:53;8398:10;8411:6;8365:24;:53::i;:::-;7173:1262;;1136:20:8::0;:18;:20::i;:::-;7097:1338:7;;:::o;11750:244::-;1721:16:6;:14;:16::i;:::-;3351:12:7::1;::::0;::::1;;3337:10;:26;3329:48;;;::::0;::::1;::::0;;7585:2:10;3329:48:7::1;::::0;::::1;7567:21:10::0;7624:1;7604:18;;;7597:29;7662:11;7642:18;;;7635:39;7691:18;;3329:48:7::1;7383:332:10::0;3329:48:7::1;11846:13:::2;11863:1;11846:18:::0;11838:52:::2;;;::::0;::::2;::::0;;14185:2:10;11838:52:7::2;::::0;::::2;14167:21:10::0;14224:2;14204:18;;;14197:30;14263:23;14243:18;;;14236:51;14304:18;;11838:52:7::2;13983:345:10::0;11838:52:7::2;11900:12;:28:::0;;;11960:12:::2;::::0;11944:43:::2;::::0;1071:25:10;;;11944:43:7::2;::::0;1059:2:10;1044:18;11944:43:7::2;;;;;;;;11750:244:::0;:::o;13150:223::-;1531:13:0;:11;:13::i;:::-;13228:27:7::1;::::0;::::1;13220:62;;;::::0;::::1;::::0;;14535:2:10;13220:62:7::1;::::0;::::1;14517:21:10::0;14574:2;14554:18;;;14547:30;14613:24;14593:18;;;14586:52;14655:18;;13220:62:7::1;14333:346:10::0;13220:62:7::1;13292:12;:28:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;13336:30:::1;::::0;::::1;::::0;-1:-1:-1;;13336:30:7::1;13150:223:::0;:::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;12410:252:7:-:0;1721:16:6;:14;:16::i;:::-;3351:12:7::1;::::0;::::1;;3337:10;:26;3329:48;;;::::0;::::1;::::0;;7585:2:10;3329:48:7::1;::::0;::::1;7567:21:10::0;7624:1;7604:18;;;7597:29;7662:11;7642:18;;;7635:39;7691:18;;3329:48:7::1;7383:332:10::0;3329:48:7::1;1327:4:::2;12504:12;:32;;12496:66;;;::::0;::::2;::::0;;14886:2:10;12496:66:7::2;::::0;::::2;14868:21:10::0;14925:2;14905:18;;;14898:30;14964:23;14944:18;;;14937:51;15005:18;;12496:66:7::2;14684:345:10::0;12496:66:7::2;12572:11;:26:::0;;;12629:12:::2;::::0;12614:41:::2;::::0;1071:25:10;;;12614:41:7::2;::::0;1059:2:10;1044:18;12614:41:7::2;925:177:10::0;15411:339:7;15481:4;15522:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;;15497:44;;;;;;;;;;15481:4;;15497:44;15522:19;15497:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15572:13;;;:6;:13;;;;;15551:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15497:44;15551:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15497:44;;-1:-1:-1;15551:34:7;;15602:39;;;15626:7;:15;;;15625:16;15602:39;:118;;;;;15707:13;;15683:5;:20;;;15675:29;;:45;;;;:::i;:::-;15657:15;:63;15602:118;:141;;;;-1:-1:-1;15724:14:7;;;;:19;;;;15602:141;15595:148;;;;15411:339;;;;;:::o;10597:120::-;1474:19:6;:17;:19::i;:::-;3464:12:7::1;::::0;::::1;;3450:10;:26;::::0;:59:::1;;-1:-1:-1::0;3494:15:7::1;::::0;::::1;;3480:10;:29;3450:59;3442:90;;;::::0;::::1;::::0;;7922:2:10;3442:90:7::1;::::0;::::1;7904:21:10::0;7961:2;7941:18;;;7934:30;8000:20;7980:18;;;7973:48;8038:18;;3442:90:7::1;7720:342:10::0;3442:90:7::1;10667:8:::2;:6;:8::i;:::-;10697:12;::::0;10691:19:::2;::::0;::::2;::::0;;;::::2;10597:120::o:0;11248:418::-;1721:16:6;:14;:16::i;:::-;3351:12:7::1;::::0;::::1;;3337:10;:26;3329:48;;;::::0;::::1;::::0;;7585:2:10;3329:48:7::1;::::0;::::1;7567:21:10::0;7624:1;7604:18;;;7597:29;7662:11;7642:18;;;7635:39;7691:18;;3329:48:7::1;7383:332:10::0;3329:48:7::1;11428:16:::2;11411:14;:33;11403:95;;;::::0;::::2;::::0;;15236:2:10;11403:95:7::2;::::0;::::2;15218:21:10::0;15275:2;15255:18;;;15248:30;15314:34;15294:18;;;15287:62;15385:19;15365:18;;;15358:47;15422:19;;11403:95:7::2;15034:413:10::0;11403:95:7::2;11508:13;:30:::0;;;11548:15:::2;:34:::0;;;11598:61:::2;::::0;;15626:25:10;;;15682:2;15667:18;;15660:34;;;11598:61:7::2;::::0;15599:18:10;11598:61:7::2;;;;;;;11248:418:::0;;:::o;13571:654::-;13789:16;;;13721:7;13789:16;;;:10;:16;;;;;:23;13685:16;;;;13761:4;;13789:32;;13815:6;;13789:32;:::i;:::-;13780:6;:41;13776:113;;;13846:16;;;;;;;:10;:16;;;;;:23;:32;;13872:6;;13846:32;:::i;:::-;13837:41;;13776:113;13899:23;13939:6;13925:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13925:21:7;;13899:47;;13956:24;13997:6;13983:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;13983:21:7;;;;;;;;;;;;;;;13956:48;;14020:9;14015:152;14039:6;14035:1;:10;14015:152;;;14078:16;;;;;;;:10;:16;;;;;14095:10;14104:1;14095:6;:10;:::i;:::-;14078:28;;;;;;;;:::i;:::-;;;;;;;;;14066:6;14073:1;14066:9;;;;;;;;:::i;:::-;;;;;;:40;;;;;14133:6;:17;14140:6;14147:1;14140:9;;;;;;;;:::i;:::-;;;;;;;;;;;;14133:17;;;;;;;;;;;;;-1:-1:-1;14133:17:7;;;:23;;;;;;;;;;;;14120:36;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:10;;;;14128:1;;14120:10;;;;;;:::i;:::-;;;;;;;;;;:36;14047:3;;14015:152;;;-1:-1:-1;14185:6:7;14193:7;14202:15;14211:6;14202;:15;:::i;:::-;14177:41;;;;;;;;;13571:654;;;;;;;:::o;14601:653::-;14670:4;14711:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;;14686:44;;;;;;;;;;14670:4;;14686:44;14711:19;14686:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14761:13;;;:6;:13;;;;;14740:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14686:44;14740:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14686:44;;-1:-1:-1;14740:34:7;;14803;:69;;;;;14857:5;:15;;;14841:31;;:5;:13;;;:31;;;14803:69;14802:158;;;;14909:5;:15;;;14890:34;;:5;:16;;;:34;;;:69;;;;;14944:5;:15;;;14928:31;;:5;:13;;;:31;;;14890:69;14802:247;;;;14997:5;:15;;;14977:35;;:5;:16;;;:35;;;:71;;;;;15033:5;:15;;;15016:32;;:5;:13;;;:32;;;14977:71;14785:264;;15067:5;:18;;;:41;;;;-1:-1:-1;15089:14:7;;;;:19;;;;15067:41;:61;;;;;15113:7;:15;;;15112:16;15067:61;:180;;;;;15146:9;:46;;;;-1:-1:-1;15179:13:7;15159:16;;:33;;;;;;;;:::i;:::-;;15146:46;15145:101;;;;15199:9;15198:10;:47;;;;-1:-1:-1;15232:13:7;15212:16;;:33;;;;;;;;:::i;:::-;;15198:47;15060:187;14601:653;-1:-1:-1;;;;;;14601:653:7:o;4954:932::-;1474:19:6;:17;:19::i;:::-;1094:21:8::1;:19;:21::i;:::-;3722:10:7::2;21403:20:::0;21449:9;3701:57:::2;;;::::0;::::2;::::0;;9750:2:10;3701:57:7::2;::::0;::::2;9732:21:10::0;9789:2;9769:18;;;9762:30;9828:22;9808:18;;;9801:50;9868:18;;3701:57:7::2;9548:344:10::0;3701:57:7::2;3776:10;3790:9;3776:23;3768:62;;;::::0;::::2;::::0;;10099:2:10;3768:62:7::2;::::0;::::2;10081:21:10::0;10138:2;10118:18;;;10111:30;10177:28;10157:18;;;10150:56;10223:18;;3768:62:7::2;9897:350:10::0;3768:62:7::2;5069:12:::3;;5060:5;:21;5052:55;;;::::0;::::3;::::0;;10454:2:10;5052:55:7::3;::::0;::::3;10436:21:10::0;10493:2;10473:18;;;10466:30;10532:23;10512:18;;;10505:51;10573:18;;5052:55:7::3;10252:345:10::0;5052:55:7::3;5117:19;5139:13:::0;;;:6:::3;:13;::::0;;;;5170:16:::3;5139:13:::0;5170:9:::3;:16::i;:::-;5162:47;;;::::0;::::3;::::0;;10804:2:10;5162:47:7::3;::::0;::::3;10786:21:10::0;10843:2;10823:18;;;10816:30;10882:20;10862:18;;;10855:48;10920:18;;5162:47:7::3;10602:342:10::0;5162:47:7::3;5240:12;;5227:9;:25;;5219:82;;;::::0;::::3;::::0;;11151:2:10;5219:82:7::3;::::0;::::3;11133:21:10::0;11190:2;11170:18;;;11163:30;11229:34;11209:18;;;11202:62;11300:14;11280:18;;;11273:42;11332:19;;5219:82:7::3;10949:408:10::0;5219:82:7::3;5311:23;5337:13:::0;;;:6:::3;:13;::::0;;;;;;;5351:10:::3;5337:25:::0;;;;;;;5380:14;;::::3;::::0;::::3;;;:19:::0;5372:59:::3;;;::::0;::::3;::::0;;11564:2:10;5372:59:7::3;::::0;::::3;11546:21:10::0;11603:2;11583:18;;;11576:30;11642:29;11622:18;;;11615:57;11689:18;;5372:59:7::3;11362:351:10::0;5372:59:7::3;5568:17;::::0;::::3;::::0;;::::3;::::0;;::::3;5524:9;5568:26:::0;;::::3;5548:46:::0;::::3;::::0;;;::::3;;::::0;;;5627:16:::3;::::0;::::3;::::0;;;;::::3;:25:::0;::::3;5608:44:::0;::::3;::::0;::::3;::::0;;;::::3;::::0;;;5699:32;;5745:23;;::::3;::::0;;::::3;::::0;;::::3;::::0;-1:-1:-1;5745:23:7;;;;;5793:10:::3;-1:-1:-1::0;5782:22:7;;;:10:::3;:22;::::0;;;;;;;:34;;;;::::3;::::0;;;;;;;;;;::::3;::::0;;;5835;11864:66:10;;;5782:34:7;;5793:10;;5835:34:::3;::::0;11837:18:10;5835:34:7::3;11718:218:10::0;12871:194:7;1531:13:0;:11;:13::i;:::-;12955:57:7::1;:27;::::0;::::1;12991:10;13004:7:::0;12955:27:::1;:57::i;:::-;13042:6;13028:30;;;13050:7;13028:30;;;;1071:25:10::0;;1059:2;1044:18;;925:177;13028:30:7::1;;;;;;;;12871:194:::0;;:::o;12082:244::-;3351:12;;;;3337:10;:26;3329:48;;;;;;;7585:2:10;3329:48:7;;;7567:21:10;7624:1;7604:18;;;7597:29;7662:11;7642:18;;;7635:39;7691:18;;3329:48:7;7383:332:10;3329:48:7;12166:30:::1;::::0;::::1;12158:65;;;::::0;::::1;::::0;;14535:2:10;12158:65:7::1;::::0;::::1;14517:21:10::0;14574:2;14554:18;;;14547:30;14613:24;14593:18;;;14586:52;14655:18;;12158:65:7::1;14333:346:10::0;12158:65:7::1;12233:15;:34:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;12283:36:::1;::::0;::::1;::::0;-1:-1:-1;;12283:36:7::1;12082:244:::0;:::o;8569:619::-;1474:19:6;:17;:19::i;:::-;3612:15:7::1;::::0;::::1;;3598:10;:29;3590:54;;;::::0;::::1;::::0;;8269:2:10;3590:54:7::1;::::0;::::1;8251:21:10::0;8308:2;8288:18;;;8281:30;8347:14;8327:18;;;8320:42;8379:18;;3590:54:7::1;8067:336:10::0;3590:54:7::1;8697:16:::2;::::0;;;::::2;;;:35:::0;::::2;;;-1:-1:-1::0;8717:15:7::2;::::0;;;::::2;;;8697:35;8676:152;;;::::0;::::2;::::0;;16229:2:10;8676:152:7::2;::::0;::::2;16211:21:10::0;16268:2;16248:18;;;16241:30;16307:34;16287:18;;;16280:62;16378:34;16358:18;;;16351:62;16450:8;16429:19;;;16422:37;16476:19;;8676:152:7::2;16027:474:10::0;8676:152:7::2;8894:42;8909:12;;8923;8894:14;:42::i;:::-;8946:45;8975:1;8960:12;;:16;;;;:::i;:::-;8978:12;8946:13;:45::i;:::-;9001:35;9034:1;9019:12;;:16;;;;:::i;:::-;9001:17;:35::i;:::-;9117:12;::::0;:16:::2;::::0;9132:1:::2;9117:16;:::i;:::-;9102:12;:31:::0;;;9143:38:::2;::::0;9173:7;9143:15:::2;:38::i;1457:47::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9816:281::-;1474:19:6;:17;:19::i;:::-;3612:15:7::1;::::0;::::1;;3598:10;:29;3590:54;;;::::0;::::1;::::0;;8269:2:10;3590:54:7::1;::::0;::::1;8251:21:10::0;8308:2;8288:18;;;8281:30;8347:14;8327:18;;;8320:42;8379:18;;3590:54:7::1;8067:336:10::0;3590:54:7::1;9915:16:::2;::::0;;;::::2;;;9914:17;9906:65;;;::::0;::::2;::::0;;16708:2:10;9906:65:7::2;::::0;::::2;16690:21:10::0;16747:2;16727:18;;;16720:30;16786:34;16766:18;;;16759:62;16857:5;16837:18;;;16830:33;16880:19;;9906:65:7::2;16506:399:10::0;9906:65:7::2;9997:12;::::0;:16:::2;::::0;10012:1:::2;9997:16;:::i;:::-;9982:12;:31:::0;;;10023:34:::2;::::0;10049:7;10023:11:::2;:34::i;:::-;-1:-1:-1::0;10067:16:7::2;:23:::0;;;::::2;::::0;::::2;::::0;;9816:281::o;2543:215:0:-;1531:13;:11;:13::i;:::-;2627:22:::1;::::0;::::1;2623:91;;2672:31;::::0;::::1;::::0;;2700:1:::1;2672:31;::::0;::::1;448:74:10::0;421:18;;2672:31:0::1;302:226:10::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;1169:346:8:-:0;516:66;7400:11:9;1292:93:8;;;1344:30;;;;;;;;;;;;;;1292:93;1459:49;1503:4;516:66;1459:36;:43;;:49::i;19870:191:7:-;19951:12;19968:2;:7;;19983:5;19968:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19950:43;;;20011:7;20003:51;;;;;;;17322:2:10;20003:51:7;;;17304:21:10;17361:2;17341:18;;;17334:30;17400:33;17380:18;;;17373:61;17451:18;;20003:51:7;17120:355:10;20003:51:7;19940:121;19870:191;;:::o;1521:105:8:-;1569:50;1613:5;516:66;1569:36;5545:123:9;2202:126:6;1897:4;1920:7;;;;;;2260:62;;2296:15;;;;;;;;;;;;;;2710:117;1721:16;:14;:16::i;:::-;2778:5:::1;2768:15:::0;;;::::1;::::0;;2798:22:::1;735:10:5::0;2807:12:6::1;2798:22;::::0;478:42:10;466:55;;;448:74;;436:2;421:18;2798:22:6::1;;;;;;;2710:117::o:0;2002:128::-;1897:4;1920:7;;;;;;2063:61;;;2098:15;;;;;;;;;;;;;;18401:651:7;18474:19;18496:13;;;:6;:13;;;;;18527:20;;18496:13;;18527:20;;;;:25;;18519:81;;;;;;;17682:2:10;18519:81:7;;;17664:21:10;17721:2;17701:18;;;17694:30;17760:34;17740:18;;;17733:62;17831:13;17811:18;;;17804:41;17862:19;;18519:81:7;17480:407:10;18519:81:7;18645:19;;;;;;;;;18625:15;18618:46;;;;;18610:98;;;;;;;18094:2:10;18610:98:7;;;18076:21:10;18133:2;18113:18;;;18106:30;18172:34;18152:18;;;18145:62;18243:9;18223:18;;;18216:37;18270:19;;18610:98:7;17892:403:10;18610:98:7;18789:13;;18766:19;;18758:44;;18789:13;18766:19;;;;;18758:44;:::i;:::-;18739:15;:63;;18718:138;;;;;;;18502:2:10;18718:138:7;;;18484:21:10;18541:2;18521:18;;;18514:30;18580:34;18560:18;;;18553:62;18651:10;18631:18;;;18624:38;18679:19;;18718:138:7;18300:404:10;18718:138:7;18939:15;;18891:64;;;;;18921:15;:33;;;18891:64;;;;;;;;;-1:-1:-1;18969:15:7;;:23;;;;;;;;;;;;;19012;;11864:66:10;;;19022:5:7;;19012:23;;11852:2:10;11837:18;19012:23:7;;;;;;;;18464:588;18401:651;;:::o;20215:482::-;20311:19;20333:13;;;:6;:13;;;;;;;20360:46;;;20390:15;20360:46;;;;;;;;;;20467:15;;;20449:33;;20420:63;;;;;;;;;;;;;;;;;;20550:15;;20546:1;20581:17;;;:21;;;;;;;20616:23;;;;;20546:19;;;;20527:39;;;20497:70;;;;;20616:23;;;;;;;;;;;;20664:26;20340:5;;20664:26;;;;20632:7;;11894:34:10;11882:47;;;;11864:66;;11852:2;11837:18;;11718:218;20899:257:7;20985:20;;20962:4;;20985:20;;:25;;;;:53;;-1:-1:-1;21014:19:7;;;;;;;:24;;20985:53;:103;;;;-1:-1:-1;21068:20:7;;;;;;21049:15;21042:46;;;;20985:103;:164;;;;-1:-1:-1;;21130:19:7;;;;;;;;21111:15;21104:45;;;;;20899:257::o;1796:162:0:-;1684:7;1710:6;1855:23;1710:6;735:10:5;1855:23:0;1851:101;;1901:40;;;;;735:10:5;1901:40:0;;;448:74:10;421:18;;1901:40:0;302:226:10;2912:187:0;2985:16;3004:6;;;3020:17;;;;;;;;;;3052:40;;3004:6;;;;;;;3052:40;;2985:16;3052:40;2975:124;2912:187;:::o;2463:115:6:-;1474:19;:17;:19::i;:::-;2522:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;2551:20:::1;2558:12;735:10:5::0;;656:96;1303:160:3;1412:43;;;1427:14;18901:55:10;;1412:43:3;;;18883:74:10;18973:18;;;;18966:34;;;1412:43:3;;;;;;;;;;18856:18:10;;;;1412:43:3;;;;;;;;;;;;;;1385:71;;1405:5;;1385:19;:71::i;17626:660:7:-;17706:13;;;;:6;:13;;;;;:27;;;;;;:32;;17698:86;;;;;;;19213:2:10;17698:86:7;;;19195:21:10;19252:2;19232:18;;;19225:30;19291:34;19271:18;;;19264:62;19362:11;19342:18;;;19335:39;19391:19;;17698:86:7;19011:405:10;17698:86:7;17829:13;;;;:6;:13;;;;;:28;;;;;;;;17809:15;17802:55;;;;;17794:107;;;;;;;19623:2:10;17794:107:7;;;19605:21:10;19662:2;19642:18;;;19635:30;19701:34;19681:18;;;19674:62;19772:9;19752:18;;;19745:37;19799:19;;17794:107:7;19421:403:10;17794:107:7;17991:13;;17959;;;;:6;:13;;;;;:28;17951:53;;17991:13;17959:28;;;;;17951:53;:::i;:::-;17932:15;:72;;17911:158;;;;;;;20031:2:10;17911:158:7;;;20013:21:10;20070:2;20050:18;;;20043:30;20109:34;20089:18;;;20082:62;20180:9;20160:18;;;20153:37;20207:19;;17911:158:7;19829:403:10;17911:158:7;18104:19;18126:13;;;:6;:13;;;;;;;;;18153:16;;;:24;;;;;;;;;;;;;;;;;;;;18191:18;;;:25;;;;;;;;18236:33;;18252:16;;;;;11864:66:10;;18126:13:7;;;18236:33;;11837:18:10;18236:33:7;11718:218:10;15842:1670:7;15903:19;15925:13;;;:6;:13;;;;;15956:25;;;;;;;;;:30;:57;;;;-1:-1:-1;15990:18:7;;;;;;:23;15956:57;15948:88;;;;;;;20439:2:10;15948:88:7;;;20421:21:10;20478:2;20458:18;;;20451:30;20517:20;20497:18;;;20490:48;20555:18;;15948:88:7;20237:342:10;15948:88:7;16219:15;;;;16046:27;;;;;;16219:15;;;;16200:16;;;;;:34;:69;;;;-1:-1:-1;16254:15:7;;;;16238:13;;16254:15;;;;16238:13;;;;;;;:31;16200:69;16199:162;;;-1:-1:-1;16310:15:7;;;;;;;;16291:16;;;;;:34;:69;;;;-1:-1:-1;16345:15:7;;;;16329:13;;16345:15;;;;16329:13;;;;;;;:31;16291:69;16199:255;;;-1:-1:-1;16402:15:7;;;;16382:16;;;16402:15;16382:16;;;16402:15;;16382:35;:71;;;;-1:-1:-1;16438:15:7;;;;16421:13;;;;;16438:15;16421:13;;;16438:15;;16421:32;16382:71;16182:1050;;;16501:16;;;;;;;;;;-1:-1:-1;16594:1:7;16571:24;;;16567:188;;16629:17;;;;;;;-1:-1:-1;16567:188:7;;;16720:11;;16700:17;;;;16735:5;;16700:31;;:17;;:31;:::i;:::-;16699:41;;;;:::i;:::-;16685:55;;16567:188;16783:17;;;;:31;;16803:11;;16783:17;;:31;:::i;:::-;16768:46;;16182:1050;;;16908:16;;;;;;;-1:-1:-1;16908:16:7;16978:24;;;16974:188;;17036:17;;;;;;;-1:-1:-1;16974:188:7;;;17127:11;;17107:17;;;;17142:5;;17107:31;;:17;;:31;:::i;:::-;17106:41;;;;:::i;:::-;17092:55;;16974:188;17190:17;;;;:31;;17210:11;;17190:17;;:31;:::i;:::-;17175:46;;16182:1050;17242:25;;;:56;;;;;;;;;;;;;;;17308:18;;;:42;;17242:56;17308:42;;;;;;;;;;17388:14;:29;;17406:11;;17388:14;-1:-1:-1;;17388:29:7;;17406:11;;17388:29;:::i;:::-;;;;-1:-1:-1;;17433:72:7;;;20786:25:10;;;20842:2;20827:18;;20820:34;;;20870:18;;;20863:34;;;17451:5:7;;17433:72;;20774:2:10;20759:18;17433:72:7;;;;;;;15893:1619;;;;15842:1670;:::o;19206:475::-;19290:16;;;;;;;19282:78;;;;;;;8610:2:10;19282:78:7;;;8592:21:10;8649:2;8629:18;;;8622:30;8688:34;8668:18;;;8661:62;8759:19;8739:18;;;8732:47;8796:19;;19282:78:7;8408:413:10;19282:78:7;19378:6;:17;19385:9;19393:1;19385:5;:9;:::i;:::-;19378:17;;;;;;;;;;;-1:-1:-1;19378:17:7;;;:32;;;;;;:37;;19370:96;;;;;;;21110:2:10;19370:96:7;;;21092:21:10;21149:2;21129:18;;;21122:30;21188:34;21168:18;;;21161:62;21259:16;21239:18;;;21232:44;21293:19;;19370:96:7;20908:410:10;19370:96:7;19524:6;:17;19531:9;19539:1;19531:5;:9;:::i;:::-;19524:17;;;;;;;;;;;-1:-1:-1;19524:17:7;:32;;;;;;;;19504:15;19497:59;;;;;19476:161;;;;;;;21525:2:10;19476:161:7;;;21507:21:10;21564:2;21544:18;;;21537:30;21603:34;21583:18;;;21576:62;21674:25;21654:18;;;21647:53;21717:19;;19476:161:7;21323:419:10;19476:161:7;19647:27;19659:5;19666:7;19647:11;:27::i;7516:170:9:-;7664:5;7658:4;7651:19;7516:170;;:::o;4059:629:3:-;4478:23;4504:33;:27;;;4532:4;4504:27;:33::i;:::-;4478:59;;4551:10;:17;4572:1;4551:22;;:57;;;;;4589:10;4578:30;;;;;;;;;;;;:::i;:::-;4577:31;4551:57;4547:135;;;4631:40;;;;;478:42:10;466:55;;4631:40:3;;;448:74:10;421:18;;4631:40:3;302:226:10;2705:151:4;2780:12;2811:38;2833:6;2841:4;2847:1;2811:21;:38::i;:::-;2804:45;2705:151;-1:-1:-1;;;2705:151:4:o;3180:392::-;3279:12;3331:5;3307:21;:29;3303:108;;;3359:41;;;;;3394:4;3359:41;;;448:74:10;421:18;;3359:41:4;302:226:10;3303:108:4;3421:12;3435:23;3462:6;:11;;3481:5;3488:4;3462:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3420:73;;;;3510:55;3537:6;3545:7;3554:10;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;5071:18:4;;;;:23;5045:49;5041:119;;;5121:24;;;;;478:42:10;466:55;;5121:24:4;;;448:74:10;421:18;;5121:24:4;302:226:10;5041:119:4;-1:-1:-1;5180:10:4;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;;;;;;;;;;;;;533:196:10;601:20;;661:42;650:54;;640:65;;630:93;;719:1;716;709:12;630:93;533:196;;;:::o;734:186::-;793:6;846:2;834:9;825:7;821:23;817:32;814:52;;;862:1;859;852:12;814:52;885:29;904:9;885:29;:::i;1107:188::-;1175:20;;1235:34;1224:46;;1214:57;;1204:85;;1285:1;1282;1275:12;1300:260;1368:6;1376;1429:2;1417:9;1408:7;1404:23;1400:32;1397:52;;;1445:1;1442;1435:12;1397:52;1468:29;1487:9;1468:29;:::i;:::-;1458:39;;1516:38;1550:2;1539:9;1535:18;1516:38;:::i;:::-;1506:48;;1300:260;;;;;:::o;1565:180::-;1624:6;1677:2;1665:9;1656:7;1652:23;1648:32;1645:52;;;1693:1;1690;1683:12;1645:52;-1:-1:-1;1716:23:10;;1565:180;-1:-1:-1;1565:180:10:o;1750:615::-;1836:6;1844;1897:2;1885:9;1876:7;1872:23;1868:32;1865:52;;;1913:1;1910;1903:12;1865:52;1953:9;1940:23;1982:18;2023:2;2015:6;2012:14;2009:34;;;2039:1;2036;2029:12;2009:34;2077:6;2066:9;2062:22;2052:32;;2122:7;2115:4;2111:2;2107:13;2103:27;2093:55;;2144:1;2141;2134:12;2093:55;2184:2;2171:16;2210:2;2202:6;2199:14;2196:34;;;2226:1;2223;2216:12;2196:34;2279:7;2274:2;2264:6;2261:1;2257:14;2253:2;2249:23;2245:32;2242:45;2239:65;;;2300:1;2297;2290:12;2239:65;2331:2;2323:11;;;;;2353:6;;-1:-1:-1;1750:615:10;;-1:-1:-1;;;;1750:615:10:o;2370:254::-;2438:6;2446;2499:2;2487:9;2478:7;2474:23;2470:32;2467:52;;;2515:1;2512;2505:12;2467:52;2551:9;2538:23;2528:33;;2580:38;2614:2;2603:9;2599:18;2580:38;:::i;2629:184::-;2681:77;2678:1;2671:88;2778:4;2775:1;2768:15;2802:4;2799:1;2792:15;2818:293;2898:1;2891:5;2888:12;2878:200;;2934:77;2931:1;2924:88;3035:4;3032:1;3025:15;3063:4;3060:1;3053:15;2878:200;3087:18;;2818:293::o;3240:399::-;3435:2;3420:18;;3447:43;3424:9;3472:6;3447:43;:::i;:::-;3538:34;3530:6;3526:47;3521:2;3510:9;3506:18;3499:75;3624:6;3617:14;3610:22;3605:2;3594:9;3590:18;3583:50;3240:399;;;;;;:::o;3644:248::-;3712:6;3720;3773:2;3761:9;3752:7;3748:23;3744:32;3741:52;;;3789:1;3786;3779:12;3741:52;-1:-1:-1;;3812:23:10;;;3882:2;3867:18;;;3854:32;;-1:-1:-1;3644:248:10:o;5060:322::-;5137:6;5145;5153;5206:2;5194:9;5185:7;5181:23;5177:32;5174:52;;;5222:1;5219;5212:12;5174:52;5245:29;5264:9;5245:29;:::i;:::-;5235:39;5321:2;5306:18;;5293:32;;-1:-1:-1;5372:2:10;5357:18;;;5344:32;;5060:322;-1:-1:-1;;;5060:322:10:o;5387:1541::-;5714:2;5766:21;;;5836:13;;5739:18;;;5858:22;;;5685:4;;5714:2;5934:4;;5911:3;5896:19;;;5961:15;;;5685:4;6004:169;6018:6;6015:1;6012:13;6004:169;;;6079:13;;6067:26;;6113:12;;;;6148:15;;;;6040:1;6033:9;6004:169;;;-1:-1:-1;;;6209:19:10;;;6189:18;;;6182:47;6279:13;;6301:21;;;6377:15;;;;6340:12;;;6412:1;6422:433;6438:8;6433:3;6430:17;6422:433;;;6509:8;6503:15;6531:42;6567:5;6562:2;6556:9;6531:42;:::i;:::-;6619:11;;;6613:18;6633:34;6609:59;6593:14;;;6586:83;6692:4;6752:11;;;6746:18;6739:26;6732:34;6716:14;;;6709:58;6828:17;;;;6789:14;;;;6466:1;6457:11;6422:433;;;6426:3;;6872:5;6864:13;;;;;;6915:6;6908:4;6897:9;6893:20;6886:36;5387:1541;;;;;;:::o;6933:254::-;7001:6;7009;7062:2;7050:9;7041:7;7037:23;7033:32;7030:52;;;7078:1;7075;7068:12;7030:52;7101:29;7120:9;7101:29;:::i;:::-;7091:39;7177:2;7162:18;;;;7149:32;;-1:-1:-1;;;6933:254:10:o;7192:186::-;7251:6;7304:2;7292:9;7283:7;7279:23;7275:32;7272:52;;;7320:1;7317;7310:12;7272:52;7343:29;7362:9;7343:29;:::i;9229:184::-;9281:77;9278:1;9271:88;9378:4;9375:1;9368:15;9402:4;9399:1;9392:15;9418:125;9483:9;;;9504:10;;;9501:36;;;9517:18;;:::i;11941:184::-;11993:77;11990:1;11983:88;12090:4;12087:1;12080:15;12114:4;12111:1;12104:15;13179:168;13252:9;;;13283;;13300:15;;;13294:22;;13280:37;13270:71;;13321:18;;:::i;13352:274::-;13392:1;13418;13408:189;;13453:77;13450:1;13443:88;13554:4;13551:1;13544:15;13582:4;13579:1;13572:15;13408:189;-1:-1:-1;13611:9:10;;13352:274::o;15705:128::-;15772:9;;;15793:11;;;15790:37;;;15807:18;;:::i;15838:184::-;15890:77;15887:1;15880:88;15987:4;15984:1;15977:15;16011:4;16008:1;16001:15;21747:277;21814:6;21867:2;21855:9;21846:7;21842:23;21838:32;21835:52;;;21883:1;21880;21873:12;21835:52;21915:9;21909:16;21968:5;21961:13;21954:21;21947:5;21944:32;21934:60;;21990:1;21987;21980:12;22029:412;22158:3;22196:6;22190:13;22221:1;22231:129;22245:6;22242:1;22239:13;22231:129;;;22343:4;22327:14;;;22323:25;;22317:32;22304:11;;;22297:53;22260:12;22231:129;;;-1:-1:-1;22415:1:10;22379:16;;22404:13;;;-1:-1:-1;22379:16:10;22029:412;-1:-1:-1;22029:412:10:o
Swarm Source
ipfs://6509619f03e53e9419eb36ab6779d4aefad66fbec1ccae9337d2b5a233fd4ab8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.