Source Code
Latest 25 from a total of 303 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Funds | 18479802 | 87 days ago | IN | 0 HYPE | 0.00009924 | ||||
| Withdraw Funds | 18479741 | 87 days ago | IN | 0 HYPE | 0.00006919 | ||||
| Withdraw Funds | 18128930 | 91 days ago | IN | 0 HYPE | 0.00019792 | ||||
| Withdraw Funds | 18128076 | 91 days ago | IN | 0 HYPE | 0.00034516 | ||||
| Unlock Tokens | 16837035 | 106 days ago | IN | 0 HYPE | 0.0001265 | ||||
| Withdraw Funds | 16713592 | 107 days ago | IN | 0 HYPE | 0.0007753 | ||||
| Withdraw Funds | 14910492 | 128 days ago | IN | 0 HYPE | 0.00014154 | ||||
| Place Bet | 14890057 | 128 days ago | IN | 0 HYPE | 0.00250631 | ||||
| Place Bet | 14889996 | 128 days ago | IN | 0 HYPE | 0.00367288 | ||||
| Place Bet | 14889691 | 128 days ago | IN | 0 HYPE | 0.00274572 | ||||
| Place Bet | 14817175 | 129 days ago | IN | 0 HYPE | 0.00455673 | ||||
| Place Bet | 14808318 | 129 days ago | IN | 0 HYPE | 0.00325454 | ||||
| Place Bet | 14792189 | 129 days ago | IN | 0 HYPE | 0.01408534 | ||||
| Place Bet | 14785564 | 129 days ago | IN | 0 HYPE | 0.000493 | ||||
| Place Bet | 14784771 | 129 days ago | IN | 0 HYPE | 0.00105846 | ||||
| Place Bet | 14784710 | 129 days ago | IN | 0 HYPE | 0.00033894 | ||||
| Place Bet | 14784649 | 129 days ago | IN | 0 HYPE | 0.00033894 | ||||
| Place Bet | 14784588 | 129 days ago | IN | 0 HYPE | 0.00018487 | ||||
| Place Bet | 14784527 | 129 days ago | IN | 0 HYPE | 0.00053059 | ||||
| Place Bet | 14784466 | 129 days ago | IN | 0 HYPE | 0.00112528 | ||||
| Place Bet | 14784344 | 129 days ago | IN | 0 HYPE | 0.00115948 | ||||
| Place Bet | 14784222 | 129 days ago | IN | 0 HYPE | 0.00054417 | ||||
| Place Bet | 14784222 | 129 days ago | IN | 0 HYPE | 0.00056695 | ||||
| Place Bet | 14582947 | 131 days ago | IN | 0 HYPE | 0.0150506 | ||||
| Place Bet | 14550817 | 132 days ago | IN | 0 HYPE | 0.00073425 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OpenFortune_Edgeless
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at hyperevmscan.io on 2025-07-18
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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);
}
// File: @openzeppelin/contracts/interfaces/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
// File: @openzeppelin/contracts/interfaces/IERC1363.sol
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)
pragma solidity ^0.8.20;
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 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 Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
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 Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
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 silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}
// File: Casino Edgeless.sol
pragma solidity ^0.8.26;
// Proof of Play VRF System interfaces
interface IVRFSystem {
/**
* Starts a VRF random number request
*
* @param traceId Optional Id to use when tracing the request
* @return requestId for the random number, will be passed to the callback contract
*/
function requestRandomNumberWithTraceId(uint256 traceId) external returns (uint256);
}
interface IVRFSystemCallback {
/**
* Callback for when a Random Number is delivered
*
* @param requestId Id of the request
* @param randomNumber Random number that was generated by the Verified Random Number Generator Tool
*/
function randomNumberCallback(uint256 requestId, uint256 randomNumber) external;
}
contract OpenFortune_Edgeless is IVRFSystemCallback, ReentrancyGuard {
using SafeERC20 for IERC20;
// Custom errors for gas efficiency
error ModuloOutOfRange();
error BetAmountOutOfRange();
error MaskOutOfRange();
error WinProbabilityOutOfRange();
error MaxProfitViolation();
error InsufficientFunds();
error BetDoesNotExist();
error BetAlreadySettled();
error RefundTooEarly();
error BetMaskTooLarge();
error InvalidSubscription();
error InsufficientPoints();
error LockupNotExpired();
error NoActiveLockup();
error OnlyAdmin();
error InvalidAddress();
error PointsOverflow();
error LockupAmountTooLow();
error LockupDurationTooShort();
// **FIXED: Proper 20-byte address (40 hex characters)**
address public constant GAME_TOKEN = 0x0d9316B9fCEbe012e16779690B21BceE5FDDA9E3;
address public admin;
modifier onlyAdmin() {
if (msg.sender != admin) revert OnlyAdmin();
_;
}
// Proof of Play VRF System address
address public vrfSystemAddress;
// Points system (adjustable by admin)
uint256 public requiredPoints = 3630000000000000000000000000000;
// **NEW: Minimum lockup parameters (adjustable by admin)**
uint256 public minLockupAmount = 30000000000000000000000; // Minimum 250k tokens
uint256 public minLockupDuration = 1210000; // Minimum 14 days
// Modulo constants
uint256 constant MAX_MODULO = 100;
uint256 constant MAX_MASK_MODULO = 40;
uint256 constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO;
// Population count constants
uint256 constant POPCNT_MULT =
0x0000000000002000000000100000000008000000000400000000020000000001;
uint256 constant POPCNT_MASK =
0x0001041041041041041041041041041041041041041041041041041041041041;
uint256 constant POPCNT_MODULO = 0x3F;
// Bet limits
uint256 public minBetAmount = 1000 ether;
uint256 public maxBetAmount = 100000 ether;
// Balance-to-maxProfit ratio
uint256 public balanceMaxProfitRatio = 5;
// Funds locked in bets
uint256 public lockedInBets;
// Total tokens locked by users for betting privileges
uint256 public totalUserLockedTokens;
// **OPTIMIZED: Cache contract balance to reduce expensive operations**
uint256 private cachedBalance;
uint256 private lastBalanceUpdate;
// Lockup information for each user
struct Lockup {
uint256 amount; // Number of tokens locked
uint256 lockupTime; // When the lockup started
uint256 lockupDuration; // How long tokens are locked for
bool active; // Whether lockup is active
}
// Mapping from user address to their lockup information
mapping(address => Lockup) public userLockups;
// Bet structure
struct Bet {
uint256 amount;
uint8 modulo;
uint8 rollUnder;
uint40 mask;
uint256 placeBlockNumber;
address gambler;
bool isSettled;
uint256 outcome;
uint256 winAmount;
}
// Array of bets
Bet[] public bets;
// Mapping requestId to bet Id
mapping(uint256 => uint256) public betMap;
// House profit tracking
int256 public houseProfit;
event AdminTransferred(address indexed previousAdmin, address indexed newAdmin);
// Events
event BetPlaced(
uint256 indexed betId,
address indexed gambler,
uint256 amount,
uint8 indexed modulo,
uint8 rollUnder,
uint40 mask,
uint256 requestId,
uint256 timestamp
);
event BetSettled(
uint256 indexed betId,
address indexed gambler,
uint256 amount,
uint8 indexed modulo,
uint8 rollUnder,
uint40 mask,
uint256 outcome,
uint256 winAmount,
uint256 timestamp
);
event BetRefunded(
uint256 indexed betId,
address indexed gambler,
uint256 amount,
uint256 timestamp
);
event RandomnessRequested(uint256 indexed requestId, uint256 indexed betId);
event RandomnessFulfilled(uint256 indexed requestId, uint256 indexed betId);
event TokensLocked(
address indexed user,
uint256 amount,
uint256 lockupDuration,
uint256 lockupTime,
uint256 points
);
event TokensUnlocked(
address indexed user,
uint256 amount,
uint256 timestamp
);
event RequiredPointsUpdated(uint256 oldPoints, uint256 newPoints);
event BetLimitsUpdated(uint256 minBet, uint256 maxBet);
event VRFSystemAddressUpdated(address indexed oldAddress, address indexed newAddress);
// **NEW EVENTS**
event MinLockupAmountUpdated(uint256 oldAmount, uint256 newAmount);
event MinLockupDurationUpdated(uint256 oldDuration, uint256 newDuration);
constructor(
address _vrfSystemAddress,
address initialAdmin
) {
vrfSystemAddress = _vrfSystemAddress;
_transferAdmin(initialAdmin);
_updateCachedBalance();
}
// **OPTIMIZED: Efficient balance caching to reduce expensive operations**
function _updateCachedBalance() private {
cachedBalance = IERC20(GAME_TOKEN).balanceOf(address(this));
lastBalanceUpdate = block.number;
}
function _getCachedBalance() private view returns (uint256) {
// If balance was updated recently (within 5 blocks), use cached value
if (block.number <= lastBalanceUpdate + 5) {
return cachedBalance;
}
// Otherwise, return fresh balance (but don't update cache in view function)
return IERC20(GAME_TOKEN).balanceOf(address(this));
}
function _getAndUpdateBalance() private returns (uint256) {
_updateCachedBalance();
return cachedBalance;
}
// Admin management functions
function transferAdmin(address newAdmin) public onlyAdmin {
if (newAdmin == address(0)) revert InvalidAddress();
_transferAdmin(newAdmin);
}
function renounceAdmin() public onlyAdmin {
_transferAdmin(address(0));
}
function _transferAdmin(address newAdmin) internal {
address oldAdmin = admin;
admin = newAdmin;
emit AdminTransferred(oldAdmin, newAdmin);
}
// **OPTIMIZED: Use cached balance**
function balance() external view returns (uint256) {
return _getCachedBalance();
}
function maxProfit() public view returns (uint256) {
return _getCachedBalance() / balanceMaxProfitRatio;
}
/**
* @dev Returns the amount of tokens available for admin withdrawal
*/
function availableForWithdrawal() public view returns (uint256) {
uint256 contractBalance = _getCachedBalance();
uint256 totalReserved = totalUserLockedTokens + lockedInBets;
if (contractBalance <= totalReserved) {
return 0;
}
return contractBalance - totalReserved;
}
/**
* @dev Returns detailed balance breakdown for transparency
*/
function getBalanceBreakdown() external view returns (
uint256 totalBalance,
uint256 userLockedTokens,
uint256 betLockedTokens,
uint256 availableForAdminWithdrawal
) {
uint256 contractBalance = _getCachedBalance();
return (
contractBalance,
totalUserLockedTokens,
lockedInBets,
availableForWithdrawal()
);
}
// **FIXED: Added overflow checks for points calculation**
function getUserPoints(address user) public view returns (uint256) {
Lockup storage lockup = userLockups[user];
if (!lockup.active) {
return 0;
}
// Check for overflow before multiplication
if (lockup.amount > type(uint256).max / lockup.lockupDuration) {
revert PointsOverflow();
}
// Points = tokens × lockup duration (in seconds)
return lockup.amount * lockup.lockupDuration;
}
// Check if user has enough points to bet
function hasEnoughPoints(address user) public view returns (bool) {
return getUserPoints(user) >= requiredPoints;
}
// Check if user can unlock (lockup period has expired)
function canUnlock(address user) public view returns (bool) {
Lockup storage lockup = userLockups[user];
return lockup.active &&
block.timestamp >= lockup.lockupTime + lockup.lockupDuration;
}
// **FIXED: Split getUserLockup to avoid stack too deep**
function getUserLockupBasic(address user) external view returns (
uint256 amount,
uint256 lockupTime,
uint256 lockupDuration,
bool active
) {
Lockup storage lockup = userLockups[user];
return (
lockup.amount,
lockup.lockupTime,
lockup.lockupDuration,
lockup.active
);
}
function getUserLockupStatus(address user) external view returns (
uint256 unlockTime,
uint256 points,
bool canBet
) {
Lockup storage lockup = userLockups[user];
uint256 points = getUserPoints(user);
return (
lockup.lockupTime + lockup.lockupDuration,
points,
points >= requiredPoints
);
}
function getUserCanUnlock(address user) external view returns (bool) {
return canUnlock(user);
}
// **NEW: Get minimum lockup requirements**
function getMinLockupRequirements() external view returns (
uint256 minAmount,
uint256 minDuration
) {
return (minLockupAmount, minLockupDuration);
}
// Admin functions
function setRequiredPoints(uint256 _requiredPoints) external onlyAdmin {
require(_requiredPoints > 0, "Required points must be greater than 0");
uint256 oldPoints = requiredPoints;
requiredPoints = _requiredPoints;
emit RequiredPointsUpdated(oldPoints, _requiredPoints);
}
// **NEW: Admin function to set minimum lockup amount**
function setMinLockupAmount(uint256 _minLockupAmount) external onlyAdmin {
require(_minLockupAmount > 0, "Min lockup amount must be greater than 0");
uint256 oldAmount = minLockupAmount;
minLockupAmount = _minLockupAmount;
emit MinLockupAmountUpdated(oldAmount, _minLockupAmount);
}
// **NEW: Admin function to set minimum lockup duration**
function setMinLockupDuration(uint256 _minLockupDuration) external onlyAdmin {
require(_minLockupDuration > 0, "Min lockup duration must be greater than 0");
require(_minLockupDuration <= 31560000, "Min lockup duration cannot exceed 1 year");
uint256 oldDuration = minLockupDuration;
minLockupDuration = _minLockupDuration;
emit MinLockupDurationUpdated(oldDuration, _minLockupDuration);
}
function setBalanceMaxProfitRatio(uint256 _balanceMaxProfitRatio) external onlyAdmin {
require(_balanceMaxProfitRatio > 0, "Ratio must be greater than 0");
balanceMaxProfitRatio = _balanceMaxProfitRatio;
}
// Admin function to set VRF system address
function setVRFSystemAddress(address _vrfSystemAddress) external onlyAdmin {
require(_vrfSystemAddress != address(0), "Invalid VRF system address");
address oldAddress = vrfSystemAddress;
vrfSystemAddress = _vrfSystemAddress;
emit VRFSystemAddressUpdated(oldAddress, _vrfSystemAddress);
}
function setMinBetAmount(uint256 _minBetAmount) external onlyAdmin {
require(_minBetAmount > 0, "Min bet must be greater than 0");
minBetAmount = _minBetAmount;
emit BetLimitsUpdated(_minBetAmount, maxBetAmount);
}
function setMaxBetAmount(uint256 _maxBetAmount) external onlyAdmin {
require(_maxBetAmount >= minBetAmount, "Max bet must be >= min bet");
maxBetAmount = _maxBetAmount;
emit BetLimitsUpdated(minBetAmount, _maxBetAmount);
}
// **FIXED: Removed reentrancy by updating state before external calls**
// **UPDATED: Added minimum lockup validations**
function lockTokens(uint256 amount, uint256 lockupDuration) external nonReentrant {
require(amount > 0, "Amount must be greater than 0");
require(lockupDuration > 0, "Lockup duration must be greater than 0");
require(!userLockups[msg.sender].active, "Already have active lockup");
// **NEW: Validate minimum lockup requirements**
if (amount < minLockupAmount) revert LockupAmountTooLow();
if (lockupDuration < minLockupDuration) revert LockupDurationTooShort();
// **FIXED: Added overflow check for points calculation**
if (amount > type(uint256).max / lockupDuration) {
revert PointsOverflow();
}
// **FIXED: Update state before external call**
totalUserLockedTokens += amount;
// Record lockup
userLockups[msg.sender] = Lockup({
amount: amount,
lockupTime: block.timestamp,
lockupDuration: lockupDuration,
active: true
});
// Transfer tokens from user to contract (after state updates)
IERC20(GAME_TOKEN).safeTransferFrom(msg.sender, address(this), amount);
_updateCachedBalance();
emit TokensLocked(
msg.sender,
amount,
lockupDuration,
block.timestamp,
amount * lockupDuration
);
}
// **FIXED: Removed reentrancy by updating state before external calls**
function unlockTokens() external nonReentrant {
Lockup storage lockup = userLockups[msg.sender];
if (!lockup.active) revert NoActiveLockup();
if (block.timestamp < lockup.lockupTime + lockup.lockupDuration) revert LockupNotExpired();
uint256 amount = lockup.amount;
// **FIXED: Update state before external call**
totalUserLockedTokens -= amount;
// Clear lockup
lockup.active = false;
lockup.amount = 0;
lockup.lockupTime = 0;
lockup.lockupDuration = 0;
// Transfer tokens back to user (after state updates)
IERC20(GAME_TOKEN).safeTransfer(msg.sender, amount);
_updateCachedBalance();
emit TokensUnlocked(msg.sender, amount, block.timestamp);
}
function placeBet(
uint256 amount,
uint256 betMask,
uint256 modulo
) external nonReentrant {
// Check if user has enough points
if (!hasEnoughPoints(msg.sender)) revert InsufficientPoints();
// Validate input data
_validateBetInputs(amount, betMask, modulo);
// **FIXED: Update cached balance after token transfer**
IERC20(GAME_TOKEN).safeTransferFrom(msg.sender, address(this), amount);
_updateCachedBalance();
// Process bet mask and calculate rollUnder
(uint256 rollUnder, uint256 mask) = _processBetMask(betMask, modulo);
// Create and store bet
uint256 betId = _createBet(amount, modulo, rollUnder, mask);
// Request randomness and emit events
_requestRandomnessAndEmit(betId, amount, modulo, rollUnder, mask);
}
function _validateBetInputs(uint256 amount, uint256 betMask, uint256 modulo) private view {
if (vrfSystemAddress == address(0)) revert InvalidSubscription();
if (modulo <= 1 || modulo > MAX_MODULO) revert ModuloOutOfRange();
if (amount < minBetAmount || amount > maxBetAmount) revert BetAmountOutOfRange();
if (betMask == 0 || betMask >= MAX_BET_MASK) revert MaskOutOfRange();
}
function _processBetMask(uint256 betMask, uint256 modulo) private pure returns (uint256 rollUnder, uint256 mask) {
if (modulo <= MAX_MASK_MODULO) {
rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
mask = betMask;
} else {
if (betMask == 0 || betMask > modulo) revert BetMaskTooLarge();
rollUnder = betMask;
mask = 0;
}
}
function _createBet(uint256 amount, uint256 modulo, uint256 rollUnder, uint256 mask) private returns (uint256 betId) {
// Winning amount (no house edge)
uint256 possibleWinAmount = getWinAmount(amount, modulo, rollUnder);
// Enforce max profit limit
if (possibleWinAmount > amount + maxProfit()) revert MaxProfitViolation();
// **OPTIMIZED: Use cached balance**
if (lockedInBets + possibleWinAmount > cachedBalance) {
revert InsufficientFunds();
}
// Update locked funds
lockedInBets += possibleWinAmount;
// Store bet
betId = bets.length;
bets.push(
Bet({
amount: amount,
modulo: uint8(modulo),
rollUnder: uint8(rollUnder),
mask: uint40(mask),
placeBlockNumber: block.number,
gambler: msg.sender,
isSettled: false,
outcome: 0,
winAmount: 0
})
);
}
function _requestRandomnessAndEmit(
uint256 betId,
uint256 amount,
uint256 modulo,
uint256 rollUnder,
uint256 mask
) private {
// Request random number from Proof of Play VRF System
// Use betId as traceId for tracking
uint256 requestId = IVRFSystem(vrfSystemAddress).requestRandomNumberWithTraceId(betId);
betMap[requestId] = betId;
// Emit events
emit RandomnessRequested(requestId, betId);
emit BetPlaced(
betId,
msg.sender,
amount,
uint8(modulo),
uint8(rollUnder),
uint40(mask),
requestId,
block.timestamp
);
}
// Calculate win amount (no house edge)
function getWinAmount(
uint256 amount,
uint256 modulo,
uint256 rollUnder
) private pure returns (uint256 winAmount) {
if (rollUnder == 0 || rollUnder > modulo) revert WinProbabilityOutOfRange();
winAmount = (amount * modulo) / rollUnder;
}
// Proof of Play VRF callback - must be external and only callable by VRF system
function randomNumberCallback(uint256 requestId, uint256 randomNumber) external {
require(msg.sender == vrfSystemAddress, "Only VRF system can call this");
// Add entropy to ensure unique random numbers per request
// Using the recommended hash-based approach from Proof of Play documentation
uint256 enhancedRandomNumber = uint256(keccak256(abi.encodePacked(blockhash(block.number - (requestId % 256)), randomNumber)));
settleBet(requestId, enhancedRandomNumber);
}
// Settle bet
function settleBet(uint256 requestId, uint256 randomNumber) internal {
uint256 betId = betMap[requestId];
Bet storage bet = bets[betId];
uint256 amount = bet.amount;
if (amount == 0) revert BetDoesNotExist();
if (bet.isSettled) revert BetAlreadySettled();
emit RandomnessFulfilled(requestId, betId);
uint256 modulo = bet.modulo;
uint256 rollUnder = bet.rollUnder;
address gambler = bet.gambler;
uint256 outcome = randomNumber % modulo;
uint256 possibleWinAmount = getWinAmount(amount, modulo, rollUnder);
uint256 winAmount = 0;
// Determine outcome
if (modulo <= MAX_MASK_MODULO) {
if (((2 ** outcome) & bet.mask) != 0) {
winAmount = possibleWinAmount;
}
} else {
if (outcome < rollUnder) {
winAmount = possibleWinAmount;
}
}
// Unlock funds
lockedInBets -= possibleWinAmount;
// Update bet
bet.isSettled = true;
bet.winAmount = winAmount;
bet.outcome = outcome;
// Handle payout
if (winAmount > 0) {
houseProfit -= int256(winAmount - amount);
IERC20(GAME_TOKEN).safeTransfer(gambler, winAmount);
_updateCachedBalance();
} else {
houseProfit += int256(amount);
}
emit BetSettled(
betId,
gambler,
amount,
uint8(modulo),
uint8(rollUnder),
bet.mask,
outcome,
winAmount,
block.timestamp
);
}
function withdrawFunds(address beneficiary, uint256 withdrawAmount) external onlyAdmin {
if (beneficiary == address(0)) revert InvalidAddress();
uint256 maxWithdrawable = availableForWithdrawal();
require(withdrawAmount <= maxWithdrawable, "Withdrawal exceeds available funds");
IERC20(GAME_TOKEN).safeTransfer(beneficiary, withdrawAmount);
_updateCachedBalance();
}
// Refund bet
function refundBet(uint256 betId) external nonReentrant {
Bet storage bet = bets[betId];
uint256 amount = bet.amount;
if (amount == 0) revert BetDoesNotExist();
if (bet.isSettled) revert BetAlreadySettled();
if (block.number <= bet.placeBlockNumber + 21600) revert RefundTooEarly();
uint256 possibleWinAmount = getWinAmount(amount, bet.modulo, bet.rollUnder);
lockedInBets -= possibleWinAmount;
bet.isSettled = true;
bet.winAmount = amount;
IERC20(GAME_TOKEN).safeTransfer(bet.gambler, amount);
_updateCachedBalance();
emit BetRefunded(betId, bet.gambler, amount, block.timestamp);
}
function emergencyWithdraw() external onlyAdmin {
uint256 contractBalance = _getAndUpdateBalance();
if (contractBalance > 0) {
IERC20(GAME_TOKEN).safeTransfer(admin, contractBalance);
totalUserLockedTokens = 0;
lockedInBets = 0;
_updateCachedBalance();
}
}
// **FIXED: Split getBetDetails to avoid stack too deep**
function getBetBasicInfo(uint256 betId) external view returns (
uint256 amount,
uint8 modulo,
uint8 rollUnder,
uint40 mask,
address gambler
) {
require(betId < bets.length, "Bet does not exist");
Bet storage bet = bets[betId];
return (
bet.amount,
bet.modulo,
bet.rollUnder,
bet.mask,
bet.gambler
);
}
function getBetStatus(uint256 betId) external view returns (
uint256 placeBlockNumber,
bool isSettled,
uint256 outcome,
uint256 winAmount
) {
require(betId < bets.length, "Bet does not exist");
Bet storage bet = bets[betId];
return (
bet.placeBlockNumber,
bet.isSettled,
bet.outcome,
bet.winAmount
);
}
// **OPTIMIZED: Added function to manually refresh balance cache if needed**
function refreshBalanceCache() external {
_updateCachedBalance();
}
// Get number of bets
function getBetsLength() external view returns (uint256) {
return bets.length;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vrfSystemAddress","type":"address"},{"internalType":"address","name":"initialAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BetAlreadySettled","type":"error"},{"inputs":[],"name":"BetAmountOutOfRange","type":"error"},{"inputs":[],"name":"BetDoesNotExist","type":"error"},{"inputs":[],"name":"BetMaskTooLarge","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InsufficientPoints","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSubscription","type":"error"},{"inputs":[],"name":"LockupAmountTooLow","type":"error"},{"inputs":[],"name":"LockupDurationTooShort","type":"error"},{"inputs":[],"name":"LockupNotExpired","type":"error"},{"inputs":[],"name":"MaskOutOfRange","type":"error"},{"inputs":[],"name":"MaxProfitViolation","type":"error"},{"inputs":[],"name":"ModuloOutOfRange","type":"error"},{"inputs":[],"name":"NoActiveLockup","type":"error"},{"inputs":[],"name":"OnlyAdmin","type":"error"},{"inputs":[],"name":"PointsOverflow","type":"error"},{"inputs":[],"name":"RefundTooEarly","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"WinProbabilityOutOfRange","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBet","type":"uint256"}],"name":"BetLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollUnder","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":true,"internalType":"address","name":"gambler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"modulo","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rollUnder","type":"uint8"},{"indexed":false,"internalType":"uint40","name":"mask","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"MinLockupAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"MinLockupDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"}],"name":"RandomnessFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoints","type":"uint256"}],"name":"RequiredPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockupTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"points","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"VRFSystemAddressUpdated","type":"event"},{"inputs":[],"name":"GAME_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableForWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceMaxProfitRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"betMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bets","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"},{"internalType":"uint8","name":"rollUnder","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"address","name":"gambler","type":"address"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"canUnlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalanceBreakdown","outputs":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"userLockedTokens","type":"uint256"},{"internalType":"uint256","name":"betLockedTokens","type":"uint256"},{"internalType":"uint256","name":"availableForAdminWithdrawal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetBasicInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"modulo","type":"uint8"},{"internalType":"uint8","name":"rollUnder","type":"uint8"},{"internalType":"uint40","name":"mask","type":"uint40"},{"internalType":"address","name":"gambler","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetStatus","outputs":[{"internalType":"uint256","name":"placeBlockNumber","type":"uint256"},{"internalType":"bool","name":"isSettled","type":"bool"},{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"uint256","name":"winAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBetsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinLockupRequirements","outputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserCanUnlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserLockupBasic","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserLockupStatus","outputs":[{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"bool","name":"canBet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasEnoughPoints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedInBets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockupAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockupDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"betMask","type":"uint256"},{"internalType":"uint256","name":"modulo","type":"uint256"}],"name":"placeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"randomNumberCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshBalanceCache","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"refundBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_balanceMaxProfitRatio","type":"uint256"}],"name":"setBalanceMaxProfitRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBetAmount","type":"uint256"}],"name":"setMaxBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBetAmount","type":"uint256"}],"name":"setMinBetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLockupAmount","type":"uint256"}],"name":"setMinLockupAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLockupDuration","type":"uint256"}],"name":"setMinLockupDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requiredPoints","type":"uint256"}],"name":"setRequiredPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vrfSystemAddress","type":"address"}],"name":"setVRFSystemAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalUserLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLockups","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockupTime","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfSystemAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526c2dd1299fa21e7a5fa1b000000060035569065a4da25d3016c0000060045562127690600555683635c9adc5dea0000060065569152d02c7e14af68000006007556005600855348015610055575f80fd5b506040516146173803806146178339818101604052810190610077919061029e565b60015f819055508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506100cd816100e260201b60201c565b6100db6101a560201b60201c565b5050610362565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016101f291906102eb565b602060405180830381865afa15801561020d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102319190610337565b600b8190555043600c81905550565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61026d82610244565b9050919050565b61027d81610263565b8114610287575f80fd5b50565b5f8151905061029881610274565b92915050565b5f80604083850312156102b4576102b3610240565b5b5f6102c18582860161028a565b92505060206102d28582860161028a565b9150509250929050565b6102e581610263565b82525050565b5f6020820190506102fe5f8301846102dc565b92915050565b5f819050919050565b61031681610304565b8114610320575f80fd5b50565b5f815190506103318161030d565b92915050565b5f6020828403121561034c5761034b610240565b5b5f61035984828501610323565b91505092915050565b6142a88061036f5f395ff3fe608060405234801561000f575f80fd5b5060043610610288575f3560e01c80638f561acc1161015a578063d0dad98d116100cc578063e932636011610085578063e9326360146107c9578063e93a242d146107e7578063f061a7a614610805578063f851a44014610821578063f968f4931461083f578063fa968eea1461084957610288565b8063d0dad98d14610704578063db2e21bc14610737578063df88126f14610741578063e1fdb4b41461075f578063e71c96971461077b578063e8c964cc1461079757610288565b8063b69ef8a81161011e578063b69ef8a814610663578063b6b260bd14610681578063c1075329146106a2578063cab11d5d146106be578063cbcbbd05146106dc578063cc4580c8146106e657610288565b80638f561acc146105a95780639f7f12ba146105c5578063aeefe31f146105f9578063b01f3b5314610629578063b539cd551461064557610288565b806361f14f11116101fe5780637690292f116101b75780637690292f1461050d5780637cfbc7a51461052b5780637d4620ed1461054757806388fedd041461056557806389158d8e146105835780638bad0c0a1461059f57610288565b806361f14f111461043557806368174fc4146104685780636c188593146104875780636e12b46e146104a3578063748e91bd146104c157806375829def146104f157610288565b806328f75b111161025057806328f75b111461036357806335ba9af81461037f5780634055f2731461039d5780634296a370146103b957806359e20b68146103e95780635d1837b81461041957610288565b806305b259801461028c5780630d7b2609146102bc57806312fb3175146102da57806322af00fa1461030d57806327b5488914610345575b5f80fd5b6102a660048036038101906102a191906131b4565b610867565b6040516102b391906131ee565b60405180910390f35b6102c461087c565b6040516102d191906131ee565b60405180910390f35b6102f460048036038101906102ef9190613261565b610882565b60405161030494939291906132a6565b60405180910390f35b610327600480360381019061032291906131b4565b6108ba565b60405161033c99989796959493929190613332565b60405180910390f35b61034d610969565b60405161035a91906131ee565b60405180910390f35b61037d600480360381019061037891906131b4565b61096f565b005b610387610a81565b60405161039491906131ee565b60405180910390f35b6103b760048036038101906103b291906131b4565b610ac5565b005b6103d360048036038101906103ce9190613261565b610c1e565b6040516103e091906133bd565b60405180910390f35b61040360048036038101906103fe9190613261565b610c34565b60405161041091906133bd565b60405180910390f35b610433600480360381019061042e91906131b4565b610cad565b005b61044f600480360381019061044a91906131b4565b610d7f565b60405161045f94939291906133d6565b60405180910390f35b610470610e1e565b60405161047e929190613419565b60405180910390f35b6104a1600480360381019061049c91906131b4565b610e2e565b005b6104ab610f3b565b6040516104b891906131ee565b60405180910390f35b6104db60048036038101906104d69190613261565b610f41565b6040516104e891906133bd565b60405180910390f35b61050b60048036038101906105069190613261565b610f52565b005b610515611049565b6040516105229190613440565b60405180910390f35b610545600480360381019061054091906131b4565b611061565b005b61054f611171565b60405161055c91906131ee565b60405180910390f35b61056d611177565b60405161057a9190613471565b60405180910390f35b61059d6004803603810190610598919061348a565b61117d565b005b6105a76114de565b005b6105c360048036038101906105be919061348a565b61156f565b005b6105df60048036038101906105da91906131b4565b611654565b6040516105f09594939291906134c8565b60405180910390f35b610613600480360381019061060e9190613261565b611738565b60405161062091906131ee565b60405180910390f35b610643600480360381019061063e91906131b4565b61181f565b005b61064d611931565b60405161065a91906131ee565b60405180910390f35b61066b61194c565b60405161067891906131ee565b60405180910390f35b61068961195a565b6040516106999493929190613519565b60405180910390f35b6106bc60048036038101906106b7919061355c565b611987565b005b6106c6611b0c565b6040516106d391906131ee565b60405180910390f35b6106e4611b12565b005b6106ee611b1c565b6040516106fb91906131ee565b60405180910390f35b61071e60048036038101906107199190613261565b611b28565b60405161072e94939291906132a6565b60405180910390f35b61073f611b9b565b005b610749611cae565b60405161075691906131ee565b60405180910390f35b610779600480360381019061077491906131b4565b611cb4565b005b6107956004803603810190610790919061359a565b611f11565b005b6107b160048036038101906107ac9190613261565b611fe8565b6040516107c0939291906135ea565b60405180910390f35b6107d1612061565b6040516107de91906131ee565b60405180910390f35b6107ef612067565b6040516107fc9190613440565b60405180910390f35b61081f600480360381019061081a9190613261565b61208c565b005b610829612243565b6040516108369190613440565b60405180910390f35b610847612268565b005b61085161243b565b60405161085e91906131ee565b60405180910390f35b600f602052805f5260405f205f915090505481565b60055481565b600d602052805f5260405f205f91509050805f015490806001015490806002015490806003015f9054906101000a900460ff16905084565b600e81815481106108c9575f80fd5b905f5260205f2090600602015f91509050805f015490806001015f9054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900464ffffffffff1690806002015490806003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060040154908060050154905089565b60085481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061369f565b60405180910390fd5b5f6004549050816004819055507f97f998e1af0c17f1ce3cd73ce4c47afac693a5e91d450979f78e444e2f13f4038183604051610a75929190613419565b60405180910390a15050565b5f80610a8b612441565b90505f600954600a54610a9e91906136ea565b9050808211610ab1575f92505050610ac2565b8082610abd919061371d565b925050505b90565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b84906137c0565b60405180910390fd5b6301e19140811115610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061384e565b60405180910390fd5b5f6005549050816005819055507ff837ee41a0c42fad1ee31ed3dadf0ac7de61c94037ec0c2ed109cc89ceda31ed8183604051610c12929190613419565b60405180910390a15050565b5f600354610c2b83611738565b10159050919050565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff168015610ca5575080600201548160010154610ca191906136ea565b4210155b915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906138b6565b60405180910390fd5b8060088190555050565b5f805f80600e805490508510610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061391e565b60405180910390fd5b5f600e8681548110610ddf57610dde61393c565b5b905f5260205f209060060201905080600201548160030160149054906101000a900460ff16826004015483600501549450945094509450509193509193565b5f80600454600554915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906139b3565b60405180910390fd5b806006819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d181600754604051610f30929190613419565b60405180910390a150565b60035481565b5f610f4b82610c34565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611046816124f3565b50565b730d9316b9fcebe012e16779690b21bcee5fdda9e381565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065481101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613a1b565b60405180910390fd5b806007819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d160065482604051611166929190613419565b60405180910390a150565b600a5481565b60105481565b6111856125b6565b5f82116111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613a83565b60405180910390fd5b5f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613b11565b60405180910390fd5b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f9054906101000a900460ff1615611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b79565b60405180910390fd5b6004548210156112d2576040517fd5691c6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055481101561130e576040517fd0954d5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61133a9190613bc4565b821115611373576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a5f82825461138491906136ea565b92505081905550604051806080016040528083815260200142815260200182815260200160011515815250600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555090505061146b333084730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611473612685565b3373ffffffffffffffffffffffffffffffffffffffff167fa2e3c0f7de988ae3bbc6bbd90484543ee1f08d1534bb75c6cf1337a7da7d9c5183834285876114ba9190613bf4565b6040516114ca9493929190613519565b60405180910390a26114da612720565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611564576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156d5f6124f3565b565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613c7f565b60405180910390fd5b5f6101008361160d9190613c9d565b43611618919061371d565b408260405160200161162b929190613d16565b604051602081830303815290604052805190602001205f1c905061164f8382612729565b505050565b5f805f805f600e8054905086106116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061391e565b60405180910390fd5b5f600e87815481106116b5576116b461393c565b5b905f5260205f2090600602019050805f0154816001015f9054906101000a900460ff168260010160019054906101000a900460ff168360010160029054906101000a900464ffffffffff16846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16955095509550955095505091939590929450565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff16611797575f91505061181a565b80600201547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6117c79190613bc4565b815f01541115611803576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154815f01546118169190613bf4565b9150505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81116118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613db1565b60405180910390fd5b5f6003549050816003819055507fa46806ff51923197aa41dae804490d6ed998d8285767f20ec8035bb9e0fee1408183604051611925929190613419565b60405180910390a15050565b5f60085461193d612441565b6119479190613bc4565b905090565b5f611955612441565b905090565b5f805f805f611967612441565b905080600a54600954611978610a81565b94509450945094505090919293565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a72576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7b610a81565b905080821115611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613e3f565b60405180910390fd5b611aff8383730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611b07612685565b505050565b60075481565b611b1a612685565b565b5f600e80549050905090565b5f805f805f600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f015481600101548260020154836003015f9054906101000a900460ff169450945094509450509193509193565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c21576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611c2a612ab0565b90505f811115611cab57611c9460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b5f600a819055505f600981905550611caa612685565b5b50565b60095481565b611cbc6125b6565b5f600e8281548110611cd157611cd061393c565b5b905f5260205f20906006020190505f815f015490505f8103611d1f576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff1615611d68576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6154608260020154611d7a91906136ea565b4311611db2576040517f9403b55e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611de582846001015f9054906101000a900460ff1660ff168560010160019054906101000a900460ff1660ff16612ac1565b90508060095f828254611df8919061371d565b9250508190555060018360030160146101000a81548160ff021916908315150217905550818360050181905550611e87836003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611e8f612685565b826003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847fe282fd838bb937af0c0f54e49ba5f86229ed0c90344c3cc4e2135cb673493e698442604051611efb929190613419565b60405180910390a3505050611f0e612720565b50565b611f196125b6565b611f2233610c1e565b611f58576040517f303e7a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f63838383612b26565b611fa4333085730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611fac612685565b5f80611fb88484612c92565b915091505f611fc986858585612d4b565b9050611fd88187868686612f9e565b505050611fe3612720565b505050565b5f805f80600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61203586611738565b90508160020154826001015461204b91906136ea565b8160035483101594509450945050509193909250565b60045481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612112576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790613ea7565b60405180910390fd5b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f40870cc17b6e83c1d34e59c75afe284643dcf63ef40c53964ee3d950441b7e3f60405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122706125b6565b5f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff166122f7576040517fc51d021e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154816001015461230b91906136ea565b421015612344576040517fa9c437c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f0154905080600a5f82825461235c919061371d565b925050819055505f826003015f6101000a81548160ff0219169083151502179055505f825f01819055505f82600101819055505f82600201819055506123d73382730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b6123df612685565b3373ffffffffffffffffffffffffffffffffffffffff167f89882ad382a3742d4db24e4dabc5000c5852aed762904db28442e4e1630a1d078242604051612427929190613419565b60405180910390a25050612439612720565b565b60065481565b5f6005600c5461245191906136ea565b431161246157600b5490506124f0565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ae9190613440565b602060405180830381865afa1580156124c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ed9190613ed9565b90505b90565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b60025f54036125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613f4e565b60405180910390fd5b60025f81905550565b61267f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161263893929190613f6c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b50505050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126d29190613440565b602060405180830381865afa1580156126ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127119190613ed9565b600b8190555043600c81905550565b60015f81905550565b5f600f5f8481526020019081526020015f205490505f600e82815481106127535761275261393c565b5b905f5260205f20906006020190505f815f015490505f81036127a1576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff16156127ea576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82857f546aca7b2683440b8f02fa95faeb8efc79dd0f16af3d815a002742ea6f76116c60405160405180910390a35f826001015f9054906101000a900460ff1660ff1690505f8360010160019054906101000a900460ff1660ff1690505f846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f838861287b9190613c9d565b90505f612889868686612ac1565b90505f602886116128ce575f8860010160029054906101000a900464ffffffffff1664ffffffffff168460026128bf91906140d0565b16146128c9578190505b6128db565b848310156128da578190505b5b8160095f8282546128ec919061371d565b9250508190555060018860030160146101000a81548160ff0219169083151502179055508088600501819055508288600401819055505f811115612999578681612936919061371d565b60105f828254612946919061411a565b9250508190555061298c8482730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b612994612685565b6129b2565b8660105f8282546129aa919061415a565b925050819055505b8560ff168473ffffffffffffffffffffffffffffffffffffffff168a7fd0f591278f76a111a452e9ebb7f94d0046d1052df81789eecfb90ff88b0e30138a898d60010160029054906101000a900464ffffffffff16898842604051612a1c9695949392919061419b565b60405180910390a45050505050505050505050565b612aab838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612a649291906141fa565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b505050565b5f612ab9612685565b600b54905090565b5f80821480612acf57508282115b15612b06576040517f0e76f70800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818385612b139190613bf4565b612b1d9190613bc4565b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bac576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181111580612bbc5750606481115b15612bf3576040517f2636c63400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654831080612c04575060075483115b15612c3b576040517fdc2bc7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f821480612c56575060286002612c5291906140d0565b8210155b15612c8d576040517f83dc422800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8060288311612cf957603f7e0104104104104104104104104104104104104104104104104104104104104179200000000010000000000800000000040000000002000000000186612ce49190613bf4565b16612cef9190613c9d565b9150839050612d44565b5f841480612d0657508284115b15612d3d576040517fa7323bf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8391505f90505b9250929050565b5f80612d58868686612ac1565b9050612d62611931565b86612d6d91906136ea565b811115612da6576040517ff721498000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600954612db791906136ea565b1115612def576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f828254612e0091906136ea565b92505081905550600e805490509150600e6040518061012001604052808881526020018760ff1681526020018660ff1681526020018564ffffffffff1681526020014381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020015f81526020015f815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015f6101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548164ffffffffff021916908364ffffffffff1602179055506080820151816002015560a0820151816003015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160030160146101000a81548160ff02191690831515021790555060e082015181600401556101008201518160050155505050949350505050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3914472876040518263ffffffff1660e01b8152600401612ff991906131ee565b6020604051808303815f875af1158015613015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130399190613ed9565b905085600f5f8381526020019081526020015f208190555085817f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a160405160405180910390a38360ff163373ffffffffffffffffffffffffffffffffffffffff16877f4eda75b3a53e18178b4e5a06bcc37637c5cd4d068710d8686a5d02b4ed5f10b888878787426040516130d2959493929190614221565b60405180910390a4505050505050565b5f8060205f8451602086015f885af180613101576040513d5f823e3d81fd5b3d92505f519150505f821461311a576001811415613135565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561317757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161316e9190613440565b60405180910390fd5b50505050565b5f80fd5b5f819050919050565b61319381613181565b811461319d575f80fd5b50565b5f813590506131ae8161318a565b92915050565b5f602082840312156131c9576131c861317d565b5b5f6131d6848285016131a0565b91505092915050565b6131e881613181565b82525050565b5f6020820190506132015f8301846131df565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323082613207565b9050919050565b61324081613226565b811461324a575f80fd5b50565b5f8135905061325b81613237565b92915050565b5f602082840312156132765761327561317d565b5b5f6132838482850161324d565b91505092915050565b5f8115159050919050565b6132a08161328c565b82525050565b5f6080820190506132b95f8301876131df565b6132c660208301866131df565b6132d360408301856131df565b6132e06060830184613297565b95945050505050565b5f60ff82169050919050565b6132fe816132e9565b82525050565b5f64ffffffffff82169050919050565b61331d81613304565b82525050565b61332c81613226565b82525050565b5f610120820190506133465f83018c6131df565b613353602083018b6132f5565b613360604083018a6132f5565b61336d6060830189613314565b61337a60808301886131df565b61338760a0830187613323565b61339460c0830186613297565b6133a160e08301856131df565b6133af6101008301846131df565b9a9950505050505050505050565b5f6020820190506133d05f830184613297565b92915050565b5f6080820190506133e95f8301876131df565b6133f66020830186613297565b61340360408301856131df565b61341060608301846131df565b95945050505050565b5f60408201905061342c5f8301856131df565b61343960208301846131df565b9392505050565b5f6020820190506134535f830184613323565b92915050565b5f819050919050565b61346b81613459565b82525050565b5f6020820190506134845f830184613462565b92915050565b5f80604083850312156134a05761349f61317d565b5b5f6134ad858286016131a0565b92505060206134be858286016131a0565b9150509250929050565b5f60a0820190506134db5f8301886131df565b6134e860208301876132f5565b6134f560408301866132f5565b6135026060830185613314565b61350f6080830184613323565b9695505050505050565b5f60808201905061352c5f8301876131df565b61353960208301866131df565b61354660408301856131df565b61355360608301846131df565b95945050505050565b5f80604083850312156135725761357161317d565b5b5f61357f8582860161324d565b9250506020613590858286016131a0565b9150509250929050565b5f805f606084860312156135b1576135b061317d565b5b5f6135be868287016131a0565b93505060206135cf868287016131a0565b92505060406135e0868287016131a0565b9150509250925092565b5f6060820190506135fd5f8301866131df565b61360a60208301856131df565b6136176040830184613297565b949350505050565b5f82825260208201905092915050565b7f4d696e206c6f636b757020616d6f756e74206d757374206265206772656174655f8201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b5f61368960288361361f565b91506136948261362f565b604082019050919050565b5f6020820190508181035f8301526136b68161367d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136f482613181565b91506136ff83613181565b9250828201905080821115613717576137166136bd565b5b92915050565b5f61372782613181565b915061373283613181565b925082820390508181111561374a576137496136bd565b5b92915050565b7f4d696e206c6f636b7570206475726174696f6e206d75737420626520677265615f8201527f746572207468616e203000000000000000000000000000000000000000000000602082015250565b5f6137aa602a8361361f565b91506137b582613750565b604082019050919050565b5f6020820190508181035f8301526137d78161379e565b9050919050565b7f4d696e206c6f636b7570206475726174696f6e2063616e6e6f742065786365655f8201527f6420312079656172000000000000000000000000000000000000000000000000602082015250565b5f61383860288361361f565b9150613843826137de565b604082019050919050565b5f6020820190508181035f8301526138658161382c565b9050919050565b7f526174696f206d7573742062652067726561746572207468616e2030000000005f82015250565b5f6138a0601c8361361f565b91506138ab8261386c565b602082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b7f42657420646f6573206e6f7420657869737400000000000000000000000000005f82015250565b5f61390860128361361f565b9150613913826138d4565b602082019050919050565b5f6020820190508181035f830152613935816138fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4d696e20626574206d7573742062652067726561746572207468616e203000005f82015250565b5f61399d601e8361361f565b91506139a882613969565b602082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f4d617820626574206d757374206265203e3d206d696e206265740000000000005f82015250565b5f613a05601a8361361f565b9150613a10826139d1565b602082019050919050565b5f6020820190508181035f830152613a32816139f9565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613a6d601d8361361f565b9150613a7882613a39565b602082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f4c6f636b7570206475726174696f6e206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613afb60268361361f565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b9050919050565b7f416c7265616479206861766520616374697665206c6f636b75700000000000005f82015250565b5f613b63601a8361361f565b9150613b6e82613b2f565b602082019050919050565b5f6020820190508181035f830152613b9081613b57565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613bce82613181565b9150613bd983613181565b925082613be957613be8613b97565b5b828204905092915050565b5f613bfe82613181565b9150613c0983613181565b9250828202613c1781613181565b91508282048414831517613c2e57613c2d6136bd565b5b5092915050565b7f4f6e6c79205652462073797374656d2063616e2063616c6c20746869730000005f82015250565b5f613c69601d8361361f565b9150613c7482613c35565b602082019050919050565b5f6020820190508181035f830152613c9681613c5d565b9050919050565b5f613ca782613181565b9150613cb283613181565b925082613cc257613cc1613b97565b5b828206905092915050565b5f819050919050565b5f819050919050565b613cf0613ceb82613ccd565b613cd6565b82525050565b5f819050919050565b613d10613d0b82613181565b613cf6565b82525050565b5f613d218285613cdf565b602082019150613d318284613cff565b6020820191508190509392505050565b7f526571756972656420706f696e7473206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613d9b60268361361f565b9150613da682613d41565b604082019050919050565b5f6020820190508181035f830152613dc881613d8f565b9050919050565b7f5769746864726177616c206578636565647320617661696c61626c652066756e5f8201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e2960228361361f565b9150613e3482613dcf565b604082019050919050565b5f6020820190508181035f830152613e5681613e1d565b9050919050565b7f496e76616c6964205652462073797374656d20616464726573730000000000005f82015250565b5f613e91601a8361361f565b9150613e9c82613e5d565b602082019050919050565b5f6020820190508181035f830152613ebe81613e85565b9050919050565b5f81519050613ed38161318a565b92915050565b5f60208284031215613eee57613eed61317d565b5b5f613efb84828501613ec5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613f38601f8361361f565b9150613f4382613f04565b602082019050919050565b5f6020820190508181035f830152613f6581613f2c565b9050919050565b5f606082019050613f7f5f830186613323565b613f8c6020830185613323565b613f9960408301846131df565b949350505050565b5f8160011c9050919050565b5f808291508390505b6001851115613ff657808604811115613fd257613fd16136bd565b5b6001851615613fe15780820291505b8081029050613fef85613fa1565b9450613fb6565b94509492505050565b5f8261400e57600190506140c9565b8161401b575f90506140c9565b8160018114614031576002811461403b5761406a565b60019150506140c9565b60ff84111561404d5761404c6136bd565b5b8360020a915084821115614064576140636136bd565b5b506140c9565b5060208310610133831016604e8410600b841016171561409f5782820a90508381111561409a576140996136bd565b5b6140c9565b6140ac8484846001613fad565b925090508184048111156140c3576140c26136bd565b5b81810290505b9392505050565b5f6140da82613181565b91506140e583613181565b92506141127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613fff565b905092915050565b5f61412482613459565b915061412f83613459565b925082820390508181125f8412168282135f851215161715614154576141536136bd565b5b92915050565b5f61416482613459565b915061416f83613459565b92508282019050828112155f8312168382125f841215161715614195576141946136bd565b5b92915050565b5f60c0820190506141ae5f8301896131df565b6141bb60208301886132f5565b6141c86040830187613314565b6141d560608301866131df565b6141e260808301856131df565b6141ef60a08301846131df565b979650505050505050565b5f60408201905061420d5f830185613323565b61421a60208301846131df565b9392505050565b5f60a0820190506142345f8301886131df565b61424160208301876132f5565b61424e6040830186613314565b61425b60608301856131df565b61426860808301846131df565b969550505050505056fea2646970667358221220a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be964736f6c634300081a00330000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af100000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610288575f3560e01c80638f561acc1161015a578063d0dad98d116100cc578063e932636011610085578063e9326360146107c9578063e93a242d146107e7578063f061a7a614610805578063f851a44014610821578063f968f4931461083f578063fa968eea1461084957610288565b8063d0dad98d14610704578063db2e21bc14610737578063df88126f14610741578063e1fdb4b41461075f578063e71c96971461077b578063e8c964cc1461079757610288565b8063b69ef8a81161011e578063b69ef8a814610663578063b6b260bd14610681578063c1075329146106a2578063cab11d5d146106be578063cbcbbd05146106dc578063cc4580c8146106e657610288565b80638f561acc146105a95780639f7f12ba146105c5578063aeefe31f146105f9578063b01f3b5314610629578063b539cd551461064557610288565b806361f14f11116101fe5780637690292f116101b75780637690292f1461050d5780637cfbc7a51461052b5780637d4620ed1461054757806388fedd041461056557806389158d8e146105835780638bad0c0a1461059f57610288565b806361f14f111461043557806368174fc4146104685780636c188593146104875780636e12b46e146104a3578063748e91bd146104c157806375829def146104f157610288565b806328f75b111161025057806328f75b111461036357806335ba9af81461037f5780634055f2731461039d5780634296a370146103b957806359e20b68146103e95780635d1837b81461041957610288565b806305b259801461028c5780630d7b2609146102bc57806312fb3175146102da57806322af00fa1461030d57806327b5488914610345575b5f80fd5b6102a660048036038101906102a191906131b4565b610867565b6040516102b391906131ee565b60405180910390f35b6102c461087c565b6040516102d191906131ee565b60405180910390f35b6102f460048036038101906102ef9190613261565b610882565b60405161030494939291906132a6565b60405180910390f35b610327600480360381019061032291906131b4565b6108ba565b60405161033c99989796959493929190613332565b60405180910390f35b61034d610969565b60405161035a91906131ee565b60405180910390f35b61037d600480360381019061037891906131b4565b61096f565b005b610387610a81565b60405161039491906131ee565b60405180910390f35b6103b760048036038101906103b291906131b4565b610ac5565b005b6103d360048036038101906103ce9190613261565b610c1e565b6040516103e091906133bd565b60405180910390f35b61040360048036038101906103fe9190613261565b610c34565b60405161041091906133bd565b60405180910390f35b610433600480360381019061042e91906131b4565b610cad565b005b61044f600480360381019061044a91906131b4565b610d7f565b60405161045f94939291906133d6565b60405180910390f35b610470610e1e565b60405161047e929190613419565b60405180910390f35b6104a1600480360381019061049c91906131b4565b610e2e565b005b6104ab610f3b565b6040516104b891906131ee565b60405180910390f35b6104db60048036038101906104d69190613261565b610f41565b6040516104e891906133bd565b60405180910390f35b61050b60048036038101906105069190613261565b610f52565b005b610515611049565b6040516105229190613440565b60405180910390f35b610545600480360381019061054091906131b4565b611061565b005b61054f611171565b60405161055c91906131ee565b60405180910390f35b61056d611177565b60405161057a9190613471565b60405180910390f35b61059d6004803603810190610598919061348a565b61117d565b005b6105a76114de565b005b6105c360048036038101906105be919061348a565b61156f565b005b6105df60048036038101906105da91906131b4565b611654565b6040516105f09594939291906134c8565b60405180910390f35b610613600480360381019061060e9190613261565b611738565b60405161062091906131ee565b60405180910390f35b610643600480360381019061063e91906131b4565b61181f565b005b61064d611931565b60405161065a91906131ee565b60405180910390f35b61066b61194c565b60405161067891906131ee565b60405180910390f35b61068961195a565b6040516106999493929190613519565b60405180910390f35b6106bc60048036038101906106b7919061355c565b611987565b005b6106c6611b0c565b6040516106d391906131ee565b60405180910390f35b6106e4611b12565b005b6106ee611b1c565b6040516106fb91906131ee565b60405180910390f35b61071e60048036038101906107199190613261565b611b28565b60405161072e94939291906132a6565b60405180910390f35b61073f611b9b565b005b610749611cae565b60405161075691906131ee565b60405180910390f35b610779600480360381019061077491906131b4565b611cb4565b005b6107956004803603810190610790919061359a565b611f11565b005b6107b160048036038101906107ac9190613261565b611fe8565b6040516107c0939291906135ea565b60405180910390f35b6107d1612061565b6040516107de91906131ee565b60405180910390f35b6107ef612067565b6040516107fc9190613440565b60405180910390f35b61081f600480360381019061081a9190613261565b61208c565b005b610829612243565b6040516108369190613440565b60405180910390f35b610847612268565b005b61085161243b565b60405161085e91906131ee565b60405180910390f35b600f602052805f5260405f205f915090505481565b60055481565b600d602052805f5260405f205f91509050805f015490806001015490806002015490806003015f9054906101000a900460ff16905084565b600e81815481106108c9575f80fd5b905f5260205f2090600602015f91509050805f015490806001015f9054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900464ffffffffff1690806002015490806003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160149054906101000a900460ff16908060040154908060050154905089565b60085481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061369f565b60405180910390fd5b5f6004549050816004819055507f97f998e1af0c17f1ce3cd73ce4c47afac693a5e91d450979f78e444e2f13f4038183604051610a75929190613419565b60405180910390a15050565b5f80610a8b612441565b90505f600954600a54610a9e91906136ea565b9050808211610ab1575f92505050610ac2565b8082610abd919061371d565b925050505b90565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b84906137c0565b60405180910390fd5b6301e19140811115610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061384e565b60405180910390fd5b5f6005549050816005819055507ff837ee41a0c42fad1ee31ed3dadf0ac7de61c94037ec0c2ed109cc89ceda31ed8183604051610c12929190613419565b60405180910390a15050565b5f600354610c2b83611738565b10159050919050565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff168015610ca5575080600201548160010154610ca191906136ea565b4210155b915050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906138b6565b60405180910390fd5b8060088190555050565b5f805f80600e805490508510610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061391e565b60405180910390fd5b5f600e8681548110610ddf57610dde61393c565b5b905f5260205f209060060201905080600201548160030160149054906101000a900460ff16826004015483600501549450945094509450509193509193565b5f80600454600554915091509091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906139b3565b60405180910390fd5b806006819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d181600754604051610f30929190613419565b60405180910390a150565b60035481565b5f610f4b82610c34565b9050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361103d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611046816124f3565b50565b730d9316b9fcebe012e16779690b21bcee5fdda9e381565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065481101561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613a1b565b60405180910390fd5b806007819055507ff483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d160065482604051611166929190613419565b60405180910390a150565b600a5481565b60105481565b6111856125b6565b5f82116111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613a83565b60405180910390fd5b5f8111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613b11565b60405180910390fd5b600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f9054906101000a900460ff1615611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b79565b60405180910390fd5b6004548210156112d2576040517fd5691c6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055481101561130e576040517fd0954d5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61133a9190613bc4565b821115611373576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a5f82825461138491906136ea565b92505081905550604051806080016040528083815260200142815260200182815260200160011515815250600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a81548160ff02191690831515021790555090505061146b333084730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611473612685565b3373ffffffffffffffffffffffffffffffffffffffff167fa2e3c0f7de988ae3bbc6bbd90484543ee1f08d1534bb75c6cf1337a7da7d9c5183834285876114ba9190613bf4565b6040516114ca9493929190613519565b60405180910390a26114da612720565b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611564576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156d5f6124f3565b565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613c7f565b60405180910390fd5b5f6101008361160d9190613c9d565b43611618919061371d565b408260405160200161162b929190613d16565b604051602081830303815290604052805190602001205f1c905061164f8382612729565b505050565b5f805f805f600e8054905086106116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061391e565b60405180910390fd5b5f600e87815481106116b5576116b461393c565b5b905f5260205f2090600602019050805f0154816001015f9054906101000a900460ff168260010160019054906101000a900460ff168360010160029054906101000a900464ffffffffff16846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16955095509550955095505091939590929450565b5f80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff16611797575f91505061181a565b80600201547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6117c79190613bc4565b815f01541115611803576040517f68101d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154815f01546118169190613bf4565b9150505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81116118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613db1565b60405180910390fd5b5f6003549050816003819055507fa46806ff51923197aa41dae804490d6ed998d8285767f20ec8035bb9e0fee1408183604051611925929190613419565b60405180910390a15050565b5f60085461193d612441565b6119479190613bc4565b905090565b5f611955612441565b905090565b5f805f805f611967612441565b905080600a54600954611978610a81565b94509450945094505090919293565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a72576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7b610a81565b905080821115611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab790613e3f565b60405180910390fd5b611aff8383730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611b07612685565b505050565b60075481565b611b1a612685565b565b5f600e80549050905090565b5f805f805f600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050805f015481600101548260020154836003015f9054906101000a900460ff169450945094509450509193509193565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c21576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611c2a612ab0565b90505f811115611cab57611c9460015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b5f600a819055505f600981905550611caa612685565b5b50565b60095481565b611cbc6125b6565b5f600e8281548110611cd157611cd061393c565b5b905f5260205f20906006020190505f815f015490505f8103611d1f576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff1615611d68576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6154608260020154611d7a91906136ea565b4311611db2576040517f9403b55e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611de582846001015f9054906101000a900460ff1660ff168560010160019054906101000a900460ff1660ff16612ac1565b90508060095f828254611df8919061371d565b9250508190555060018360030160146101000a81548160ff021916908315150217905550818360050181905550611e87836003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b611e8f612685565b826003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16847fe282fd838bb937af0c0f54e49ba5f86229ed0c90344c3cc4e2135cb673493e698442604051611efb929190613419565b60405180910390a3505050611f0e612720565b50565b611f196125b6565b611f2233610c1e565b611f58576040517f303e7a0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f63838383612b26565b611fa4333085730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612603909392919063ffffffff16565b611fac612685565b5f80611fb88484612c92565b915091505f611fc986858585612d4b565b9050611fd88187868686612f9e565b505050611fe3612720565b505050565b5f805f80600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f61203586611738565b90508160020154826001015461204b91906136ea565b8160035483101594509450945050509193909250565b60045481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612112576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790613ea7565b60405180910390fd5b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f40870cc17b6e83c1d34e59c75afe284643dcf63ef40c53964ee3d950441b7e3f60405160405180910390a35050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122706125b6565b5f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050806003015f9054906101000a900460ff166122f7576040517fc51d021e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020154816001015461230b91906136ea565b421015612344576040517fa9c437c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f815f0154905080600a5f82825461235c919061371d565b925050819055505f826003015f6101000a81548160ff0219169083151502179055505f825f01819055505f82600101819055505f82600201819055506123d73382730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b6123df612685565b3373ffffffffffffffffffffffffffffffffffffffff167f89882ad382a3742d4db24e4dabc5000c5852aed762904db28442e4e1630a1d078242604051612427929190613419565b60405180910390a25050612439612720565b565b60065481565b5f6005600c5461245191906136ea565b431161246157600b5490506124f0565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ae9190613440565b602060405180830381865afa1580156124c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ed9190613ed9565b90505b90565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec660405160405180910390a35050565b60025f54036125fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f190613f4e565b60405180910390fd5b60025f81905550565b61267f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161263893929190613f6c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b50505050565b730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126d29190613440565b602060405180830381865afa1580156126ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127119190613ed9565b600b8190555043600c81905550565b60015f81905550565b5f600f5f8481526020019081526020015f205490505f600e82815481106127535761275261393c565b5b905f5260205f20906006020190505f815f015490505f81036127a1576040517f7f36fbaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160030160149054906101000a900460ff16156127ea576040517f05d09e5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82857f546aca7b2683440b8f02fa95faeb8efc79dd0f16af3d815a002742ea6f76116c60405160405180910390a35f826001015f9054906101000a900460ff1660ff1690505f8360010160019054906101000a900460ff1660ff1690505f846003015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f838861287b9190613c9d565b90505f612889868686612ac1565b90505f602886116128ce575f8860010160029054906101000a900464ffffffffff1664ffffffffff168460026128bf91906140d0565b16146128c9578190505b6128db565b848310156128da578190505b5b8160095f8282546128ec919061371d565b9250508190555060018860030160146101000a81548160ff0219169083151502179055508088600501819055508288600401819055505f811115612999578681612936919061371d565b60105f828254612946919061411a565b9250508190555061298c8482730d9316b9fcebe012e16779690b21bcee5fdda9e373ffffffffffffffffffffffffffffffffffffffff16612a319092919063ffffffff16565b612994612685565b6129b2565b8660105f8282546129aa919061415a565b925050819055505b8560ff168473ffffffffffffffffffffffffffffffffffffffff168a7fd0f591278f76a111a452e9ebb7f94d0046d1052df81789eecfb90ff88b0e30138a898d60010160029054906101000a900464ffffffffff16898842604051612a1c9695949392919061419b565b60405180910390a45050505050505050505050565b612aab838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612a649291906141fa565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e2565b505050565b5f612ab9612685565b600b54905090565b5f80821480612acf57508282115b15612b06576040517f0e76f70800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818385612b139190613bf4565b612b1d9190613bc4565b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612bac576040517f1f6a65b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181111580612bbc5750606481115b15612bf3576040517f2636c63400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654831080612c04575060075483115b15612c3b576040517fdc2bc7b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f821480612c56575060286002612c5291906140d0565b8210155b15612c8d576040517f83dc422800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8060288311612cf957603f7e0104104104104104104104104104104104104104104104104104104104104179200000000010000000000800000000040000000002000000000186612ce49190613bf4565b16612cef9190613c9d565b9150839050612d44565b5f841480612d0657508284115b15612d3d576040517fa7323bf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8391505f90505b9250929050565b5f80612d58868686612ac1565b9050612d62611931565b86612d6d91906136ea565b811115612da6576040517ff721498000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600954612db791906136ea565b1115612def576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060095f828254612e0091906136ea565b92505081905550600e805490509150600e6040518061012001604052808881526020018760ff1681526020018660ff1681526020018564ffffffffff1681526020014381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020015f151581526020015f81526020015f815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015f6101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548164ffffffffff021916908364ffffffffff1602179055506080820151816002015560a0820151816003015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160030160146101000a81548160ff02191690831515021790555060e082015181600401556101008201518160050155505050949350505050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3914472876040518263ffffffff1660e01b8152600401612ff991906131ee565b6020604051808303815f875af1158015613015573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130399190613ed9565b905085600f5f8381526020019081526020015f208190555085817f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a160405160405180910390a38360ff163373ffffffffffffffffffffffffffffffffffffffff16877f4eda75b3a53e18178b4e5a06bcc37637c5cd4d068710d8686a5d02b4ed5f10b888878787426040516130d2959493929190614221565b60405180910390a4505050505050565b5f8060205f8451602086015f885af180613101576040513d5f823e3d81fd5b3d92505f519150505f821461311a576001811415613135565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561317757836040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161316e9190613440565b60405180910390fd5b50505050565b5f80fd5b5f819050919050565b61319381613181565b811461319d575f80fd5b50565b5f813590506131ae8161318a565b92915050565b5f602082840312156131c9576131c861317d565b5b5f6131d6848285016131a0565b91505092915050565b6131e881613181565b82525050565b5f6020820190506132015f8301846131df565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61323082613207565b9050919050565b61324081613226565b811461324a575f80fd5b50565b5f8135905061325b81613237565b92915050565b5f602082840312156132765761327561317d565b5b5f6132838482850161324d565b91505092915050565b5f8115159050919050565b6132a08161328c565b82525050565b5f6080820190506132b95f8301876131df565b6132c660208301866131df565b6132d360408301856131df565b6132e06060830184613297565b95945050505050565b5f60ff82169050919050565b6132fe816132e9565b82525050565b5f64ffffffffff82169050919050565b61331d81613304565b82525050565b61332c81613226565b82525050565b5f610120820190506133465f83018c6131df565b613353602083018b6132f5565b613360604083018a6132f5565b61336d6060830189613314565b61337a60808301886131df565b61338760a0830187613323565b61339460c0830186613297565b6133a160e08301856131df565b6133af6101008301846131df565b9a9950505050505050505050565b5f6020820190506133d05f830184613297565b92915050565b5f6080820190506133e95f8301876131df565b6133f66020830186613297565b61340360408301856131df565b61341060608301846131df565b95945050505050565b5f60408201905061342c5f8301856131df565b61343960208301846131df565b9392505050565b5f6020820190506134535f830184613323565b92915050565b5f819050919050565b61346b81613459565b82525050565b5f6020820190506134845f830184613462565b92915050565b5f80604083850312156134a05761349f61317d565b5b5f6134ad858286016131a0565b92505060206134be858286016131a0565b9150509250929050565b5f60a0820190506134db5f8301886131df565b6134e860208301876132f5565b6134f560408301866132f5565b6135026060830185613314565b61350f6080830184613323565b9695505050505050565b5f60808201905061352c5f8301876131df565b61353960208301866131df565b61354660408301856131df565b61355360608301846131df565b95945050505050565b5f80604083850312156135725761357161317d565b5b5f61357f8582860161324d565b9250506020613590858286016131a0565b9150509250929050565b5f805f606084860312156135b1576135b061317d565b5b5f6135be868287016131a0565b93505060206135cf868287016131a0565b92505060406135e0868287016131a0565b9150509250925092565b5f6060820190506135fd5f8301866131df565b61360a60208301856131df565b6136176040830184613297565b949350505050565b5f82825260208201905092915050565b7f4d696e206c6f636b757020616d6f756e74206d757374206265206772656174655f8201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b5f61368960288361361f565b91506136948261362f565b604082019050919050565b5f6020820190508181035f8301526136b68161367d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6136f482613181565b91506136ff83613181565b9250828201905080821115613717576137166136bd565b5b92915050565b5f61372782613181565b915061373283613181565b925082820390508181111561374a576137496136bd565b5b92915050565b7f4d696e206c6f636b7570206475726174696f6e206d75737420626520677265615f8201527f746572207468616e203000000000000000000000000000000000000000000000602082015250565b5f6137aa602a8361361f565b91506137b582613750565b604082019050919050565b5f6020820190508181035f8301526137d78161379e565b9050919050565b7f4d696e206c6f636b7570206475726174696f6e2063616e6e6f742065786365655f8201527f6420312079656172000000000000000000000000000000000000000000000000602082015250565b5f61383860288361361f565b9150613843826137de565b604082019050919050565b5f6020820190508181035f8301526138658161382c565b9050919050565b7f526174696f206d7573742062652067726561746572207468616e2030000000005f82015250565b5f6138a0601c8361361f565b91506138ab8261386c565b602082019050919050565b5f6020820190508181035f8301526138cd81613894565b9050919050565b7f42657420646f6573206e6f7420657869737400000000000000000000000000005f82015250565b5f61390860128361361f565b9150613913826138d4565b602082019050919050565b5f6020820190508181035f830152613935816138fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4d696e20626574206d7573742062652067726561746572207468616e203000005f82015250565b5f61399d601e8361361f565b91506139a882613969565b602082019050919050565b5f6020820190508181035f8301526139ca81613991565b9050919050565b7f4d617820626574206d757374206265203e3d206d696e206265740000000000005f82015250565b5f613a05601a8361361f565b9150613a10826139d1565b602082019050919050565b5f6020820190508181035f830152613a32816139f9565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613a6d601d8361361f565b9150613a7882613a39565b602082019050919050565b5f6020820190508181035f830152613a9a81613a61565b9050919050565b7f4c6f636b7570206475726174696f6e206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613afb60268361361f565b9150613b0682613aa1565b604082019050919050565b5f6020820190508181035f830152613b2881613aef565b9050919050565b7f416c7265616479206861766520616374697665206c6f636b75700000000000005f82015250565b5f613b63601a8361361f565b9150613b6e82613b2f565b602082019050919050565b5f6020820190508181035f830152613b9081613b57565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613bce82613181565b9150613bd983613181565b925082613be957613be8613b97565b5b828204905092915050565b5f613bfe82613181565b9150613c0983613181565b9250828202613c1781613181565b91508282048414831517613c2e57613c2d6136bd565b5b5092915050565b7f4f6e6c79205652462073797374656d2063616e2063616c6c20746869730000005f82015250565b5f613c69601d8361361f565b9150613c7482613c35565b602082019050919050565b5f6020820190508181035f830152613c9681613c5d565b9050919050565b5f613ca782613181565b9150613cb283613181565b925082613cc257613cc1613b97565b5b828206905092915050565b5f819050919050565b5f819050919050565b613cf0613ceb82613ccd565b613cd6565b82525050565b5f819050919050565b613d10613d0b82613181565b613cf6565b82525050565b5f613d218285613cdf565b602082019150613d318284613cff565b6020820191508190509392505050565b7f526571756972656420706f696e7473206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f613d9b60268361361f565b9150613da682613d41565b604082019050919050565b5f6020820190508181035f830152613dc881613d8f565b9050919050565b7f5769746864726177616c206578636565647320617661696c61626c652066756e5f8201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e2960228361361f565b9150613e3482613dcf565b604082019050919050565b5f6020820190508181035f830152613e5681613e1d565b9050919050565b7f496e76616c6964205652462073797374656d20616464726573730000000000005f82015250565b5f613e91601a8361361f565b9150613e9c82613e5d565b602082019050919050565b5f6020820190508181035f830152613ebe81613e85565b9050919050565b5f81519050613ed38161318a565b92915050565b5f60208284031215613eee57613eed61317d565b5b5f613efb84828501613ec5565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613f38601f8361361f565b9150613f4382613f04565b602082019050919050565b5f6020820190508181035f830152613f6581613f2c565b9050919050565b5f606082019050613f7f5f830186613323565b613f8c6020830185613323565b613f9960408301846131df565b949350505050565b5f8160011c9050919050565b5f808291508390505b6001851115613ff657808604811115613fd257613fd16136bd565b5b6001851615613fe15780820291505b8081029050613fef85613fa1565b9450613fb6565b94509492505050565b5f8261400e57600190506140c9565b8161401b575f90506140c9565b8160018114614031576002811461403b5761406a565b60019150506140c9565b60ff84111561404d5761404c6136bd565b5b8360020a915084821115614064576140636136bd565b5b506140c9565b5060208310610133831016604e8410600b841016171561409f5782820a90508381111561409a576140996136bd565b5b6140c9565b6140ac8484846001613fad565b925090508184048111156140c3576140c26136bd565b5b81810290505b9392505050565b5f6140da82613181565b91506140e583613181565b92506141127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613fff565b905092915050565b5f61412482613459565b915061412f83613459565b925082820390508181125f8412168282135f851215161715614154576141536136bd565b5b92915050565b5f61416482613459565b915061416f83613459565b92508282019050828112155f8312168382125f841215161715614195576141946136bd565b5b92915050565b5f60c0820190506141ae5f8301896131df565b6141bb60208301886132f5565b6141c86040830187613314565b6141d560608301866131df565b6141e260808301856131df565b6141ef60a08301846131df565b979650505050505050565b5f60408201905061420d5f830185613323565b61421a60208301846131df565b9392505050565b5f60a0820190506142345f8301886131df565b61424160208301876132f5565b61424e6040830186613314565b61425b60608301856131df565b61426860808301846131df565b969550505050505056fea2646970667358221220a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be964736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af100000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3
-----Decoded View---------------
Arg [0] : _vrfSystemAddress (address): 0x9eC728Fce50c77e0BeF7d34F1ab28a46409b7aF1
Arg [1] : initialAdmin (address): 0x16Ca3cFBF104b4551073838E4202024AC6f09Fb3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ec728fce50c77e0bef7d34f1ab28a46409b7af1
Arg [1] : 00000000000000000000000016ca3cfbf104b4551073838e4202024ac6f09fb3
Deployed Bytecode Sourcemap
22965:24037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26229:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24353:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25806:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;26167:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;25054:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33455:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29872:351;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33849:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31376:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31574:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34296:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46259:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32855:186;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34918:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24129:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32688:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29060:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23784:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35172:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25228:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26309:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35566:1402;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29231:87;;;:::i;:::-;;41918:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45792:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;30818:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33073:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29653:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29549:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30314:432;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44206:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24968:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46789:81;;;:::i;:::-;;46905:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31877:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;45381:340;;;:::i;:::-;;25132:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44669:704;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37883:889;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32279:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;24266:56;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24045:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34581:329;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23872:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37054:821;;;:::i;:::-;;24921:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26229:41;;;;;;;;;;;;;;;;;:::o;24353:42::-;;;;:::o;25806:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26167:17::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25054:40::-;;;;:::o;33455:323::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33566:1:::1;33547:16;:20;33539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33623:17;33643:15;;33623:35;;33687:16;33669:15;:34;;;;33719:51;33742:9;33753:16;33719:51;;;;;;;:::i;:::-;;;;;;;;33528:250;33455:323:::0;:::o;29872:351::-;29927:7;29947:23;29973:19;:17;:19::i;:::-;29947:45;;30003:21;30051:12;;30027:21;;:36;;;;:::i;:::-;30003:60;;30107:13;30088:15;:32;30084:73;;30144:1;30137:8;;;;;;30084:73;30202:13;30184:15;:31;;;;:::i;:::-;30177:38;;;;29872:351;;:::o;33849:439::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33966:1:::1;33945:18;:22;33937:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34055:8;34033:18;:30;;34025:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;34119:19;34141:17;;34119:39;;34189:18;34169:17;:38;;;;34223:57;34248:11;34261:18;34223:57;;;;;;;:::i;:::-;;;;;;;;33926:362;33849:439:::0;:::o;31376:129::-;31436:4;31483:14;;31460:19;31474:4;31460:13;:19::i;:::-;:37;;31453:44;;31376:129;;;:::o;31574:232::-;31628:4;31645:21;31669:11;:17;31681:4;31669:17;;;;;;;;;;;;;;;31645:41;;31704:6;:13;;;;;;;;;;;;:94;;;;;31777:6;:21;;;31757:6;:17;;;:41;;;;:::i;:::-;31738:15;:60;;31704:94;31697:101;;;31574:232;;;:::o;34296:228::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;34425:1:::1;34400:22;:26;34392:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34494:22;34470:21;:46;;;;34296:228:::0;:::o;46259:438::-;46329:24;46364:14;46389:15;46415:17;46467:4;:11;;;;46459:5;:19;46451:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;46512:15;46530:4;46535:5;46530:11;;;;;;;;:::i;:::-;;;;;;;;;;;;46512:29;;46576:3;:20;;;46611:3;:13;;;;;;;;;;;;46639:3;:11;;;46665:3;:13;;;46554:135;;;;;;;;;46259:438;;;;;:::o;32855:186::-;32924:17;32952:19;32998:15;;33015:17;;32990:43;;;;32855:186;;:::o;34918:246::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;35020:1:::1;35004:13;:17;34996:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;35082:13;35067:12;:28;;;;35111:45;35128:13;35143:12;;35111:45;;;;;;;:::i;:::-;;;;;;;;34918:246:::0;:::o;24129:63::-;;;;:::o;32688:110::-;32751:4;32775:15;32785:4;32775:9;:15::i;:::-;32768:22;;32688:110;;;:::o;29060:163::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;29153:1:::1;29133:22;;:8;:22;;::::0;29129:51:::1;;29164:16;;;;;;;;;;;;;;29129:51;29191:24;29206:8;29191:14;:24::i;:::-;29060:163:::0;:::o;23784:79::-;23821:42;23784:79;:::o;35172:254::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;35275:12:::1;;35258:13;:29;;35250:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35344:13;35329:12;:28;;;;35373:45;35390:12;;35404:13;35373:45;;;;;;;:::i;:::-;;;;;;;;35172:254:::0;:::o;25228:36::-;;;;:::o;26309:25::-;;;;:::o;35566:1402::-;2378:21;:19;:21::i;:::-;35676:1:::1;35667:6;:10;35659:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;35747:1;35730:14;:18;35722:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35811:11;:23;35823:10;35811:23;;;;;;;;;;;;;;;:30;;;;;;;;;;;;35810:31;35802:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;35956:15;;35947:6;:24;35943:57;;;35980:20;;;;;;;;;;;;;;35943:57;36032:17;;36015:14;:34;36011:71;;;36058:24;;;;;;;;;;;;;;36011:71;36195:14;36175:17;:34;;;;:::i;:::-;36166:6;:43;36162:99;;;36233:16;;;;;;;;;;;;;;36162:99;36355:6;36330:21;;:31;;;;;;;:::i;:::-;;;;;;;;36426:162;;;;;;;;36456:6;36426:162;;;;36489:15;36426:162;;;;36535:14;36426:162;;;;36572:4;36426:162;;;;::::0;36400:11:::1;:23;36412:10;36400:23;;;;;;;;;;;;;;;:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36673:70;36709:10;36729:4;36736:6;23821:42;36673:35;;;;:70;;;;;;:::i;:::-;36754:22;:20;:22::i;:::-;36821:10;36794:166;;;36846:6;36867:14;36896:15;36935:14;36926:6;:23;;;;:::i;:::-;36794:166;;;;;;;;;:::i;:::-;;;;;;;;2422:20:::0;:18;:20::i;:::-;35566:1402;;:::o;29231:87::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;29284:26:::1;29307:1;29284:14;:26::i;:::-;29231:87::o:0;41918:536::-;42031:16;;;;;;;;;;;42017:30;;:10;:30;;;42009:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42257:28;42361:3;42349:9;:15;;;;:::i;:::-;42333:12;:32;;;;:::i;:::-;42323:43;42368:12;42306:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42296:86;;;;;;42288:95;;42257:126;;42404:42;42414:9;42425:20;42404:9;:42::i;:::-;41998:456;41918:536;;:::o;45792:459::-;45865:14;45890:12;45913:15;45939:11;45961:15;46011:4;:11;;;;46003:5;:19;45995:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;46056:15;46074:4;46079:5;46074:11;;;;;;;;:::i;:::-;;;;;;;;;;;;46056:29;;46120:3;:10;;;46145:3;:10;;;;;;;;;;;;46170:3;:13;;;;;;;;;;;;46198:3;:8;;;;;;;;;;;;46221:3;:11;;;;;;;;;;;;46098:145;;;;;;;;;;;45792:459;;;;;;;:::o;30818:503::-;30876:7;30896:21;30920:11;:17;30932:4;30920:17;;;;;;;;;;;;;;;30896:41;;30953:6;:13;;;;;;;;;;;;30948:55;;30990:1;30983:8;;;;;30948:55;31116:6;:21;;;31096:17;:41;;;;:::i;:::-;31080:6;:13;;;:57;31076:113;;;31161:16;;;;;;;;;;;;;;31076:113;31292:6;:21;;;31276:6;:13;;;:37;;;;:::i;:::-;31269:44;;;30818:503;;;;:::o;33073:313::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;33181:1:::1;33163:15;:19;33155:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;33236:17;33256:14;;33236:34;;33298:15;33281:14;:32;;;;33329:49;33351:9;33362:15;33329:49;;;;;;;:::i;:::-;;;;;;;;33144:242;33073:313:::0;:::o;29653:120::-;29695:7;29744:21;;29722:19;:17;:19::i;:::-;:43;;;;:::i;:::-;29715:50;;29653:120;:::o;29549:96::-;29591:7;29618:19;:17;:19::i;:::-;29611:26;;29549:96;:::o;30314:432::-;30378:20;30409:24;30444:23;30478:35;30532:23;30558:19;:17;:19::i;:::-;30532:45;;30610:15;30640:21;;30676:12;;30703:24;:22;:24::i;:::-;30588:150;;;;;;;;;30314:432;;;;:::o;44206:436::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;44331:1:::1;44308:25;;:11;:25;;::::0;44304:54:::1;;44342:16;;;;;;;;;;;;;;44304:54;44379:23;44405:24;:22;:24::i;:::-;44379:50;;44466:15;44448:14;:33;;44440:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44541:60;44573:11;44586:14;23821:42;44541:31;;;;:60;;;;;:::i;:::-;44612:22;:20;:22::i;:::-;44293:349;44206:436:::0;;:::o;24968:42::-;;;;:::o;46789:81::-;46840:22;:20;:22::i;:::-;46789:81::o;46905:94::-;46953:7;46980:4;:11;;;;46973:18;;46905:94;:::o;31877:394::-;31952:14;31977:18;32006:22;32039:11;32069:21;32093:11;:17;32105:4;32093:17;;;;;;;;;;;;;;;32069:41;;32143:6;:13;;;32171:6;:17;;;32203:6;:21;;;32239:6;:13;;;;;;;;;;;;32121:142;;;;;;;;;31877:394;;;;;:::o;45381:340::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;45440:23:::1;45466:22;:20;:22::i;:::-;45440:48;;45521:1;45503:15;:19;45499:215;;;45539:55;45571:5;;;;;;;;;;;45578:15;23821:42;45539:31;;;;:55;;;;;:::i;:::-;45633:1;45609:21;:25;;;;45664:1;45649:12;:16;;;;45680:22;:20;:22::i;:::-;45499:215;45429:292;45381:340::o:0;25132:27::-;;;;:::o;44669:704::-;2378:21;:19;:21::i;:::-;44736:15:::1;44754:4;44759:5;44754:11;;;;;;;;:::i;:::-;;;;;;;;;;;;44736:29;;44776:14;44793:3;:10;;;44776:27;;44830:1;44820:6;:11:::0;44816:41:::1;;44840:17;;;;;;;;;;;;;;44816:41;44872:3;:13;;;;;;;;;;;;44868:45;;;44894:19;;;;;;;;;;;;;;44868:45;44967:5;44944:3;:20;;;:28;;;;:::i;:::-;44928:12;:44;44924:73;;44981:16;;;;;;;;;;;;;;44924:73;45010:25;45038:47;45051:6;45059:3;:10;;;;;;;;;;;;45038:47;;45071:3;:13;;;;;;;;;;;;45038:47;;:12;:47::i;:::-;45010:75;;45114:17;45098:12;;:33;;;;;;;:::i;:::-;;;;;;;;45158:4;45142:3;:13;;;:20;;;;;;;;;;;;;;;;;;45189:6;45173:3;:13;;:22;;;;45208:52;45240:3;:11;;;;;;;;;;;;45253:6;23821:42;45208:31;;;;:52;;;;;:::i;:::-;45271:22;:20;:22::i;:::-;45328:3;:11;;;;;;;;;;;;45309:56;;45321:5;45309:56;45341:6;45349:15;45309:56;;;;;;;:::i;:::-;;;;;;;;44725:648;;;2422:20:::0;:18;:20::i;:::-;44669:704;:::o;37883:889::-;2378:21;:19;:21::i;:::-;38066:27:::1;38082:10;38066:15;:27::i;:::-;38061:61;;38102:20;;;;;;;;;;;;;;38061:61;38175:43;38194:6;38202:7;38211:6;38175:18;:43::i;:::-;38297:70;38333:10;38353:4;38360:6;23821:42;38297:35;;;;:70;;;;;;:::i;:::-;38378:22;:20;:22::i;:::-;38467:17;38486:12:::0;38502:32:::1;38518:7;38527:6;38502:15;:32::i;:::-;38466:68;;;;38580:13;38596:43;38607:6;38615;38623:9;38634:4;38596:10;:43::i;:::-;38580:59;;38699:65;38725:5;38732:6;38740;38748:9;38759:4;38699:25;:65::i;:::-;38006:766;;;2422:20:::0;:18;:20::i;:::-;37883:889;;;:::o;32279:401::-;32355:18;32384:14;32409:11;32439:21;32463:11;:17;32475:4;32463:17;;;;;;;;;;;;;;;32439:41;;32491:14;32508:19;32522:4;32508:13;:19::i;:::-;32491:36;;32580:6;:21;;;32560:6;:17;;;:41;;;;:::i;:::-;32616:6;32647:14;;32637:6;:24;;32538:134;;;;;;;;32279:401;;;;;:::o;24266:56::-;;;;:::o;24045:31::-;;;;;;;;;;;;;:::o;34581:329::-;23951:5;;;;;;;;;;;23937:19;;:10;:19;;;23933:43;;23965:11;;;;;;;;;;;;;;23933:43;34704:1:::1;34675:31;;:17;:31;;::::0;34667:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34748:18;34769:16;;;;;;;;;;;34748:37;;34815:17;34796:16;;:36;;;;;;;;;;;;;;;;;;34884:17;34848:54;;34872:10;34848:54;;;;;;;;;;;;34656:254;34581:329:::0;:::o;23872:20::-;;;;;;;;;;;;;:::o;37054:821::-;2378:21;:19;:21::i;:::-;37111::::1;37135:11;:23;37147:10;37135:23;;;;;;;;;;;;;;;37111:47;;37184:6;:13;;;;;;;;;;;;37179:43;;37206:16;;;;;;;;;;;;;;37179:43;37275:6;:21;;;37255:6;:17;;;:41;;;;:::i;:::-;37237:15;:59;37233:90;;;37305:18;;;;;;;;;;;;;;37233:90;37336:14;37353:6;:13;;;37336:30;;37469:6;37444:21;;:31;;;;;;;:::i;:::-;;;;;;;;37537:5;37521:6;:13;;;:21;;;;;;;;;;;;;;;;;;37569:1;37553:6;:13;;:17;;;;37601:1;37581:6;:17;;:21;;;;37637:1;37613:6;:21;;:25;;;;37714:51;37746:10;37758:6;23821:42;37714:31;;;;:51;;;;;:::i;:::-;37776:22;:20;:22::i;:::-;37831:10;37816:51;;;37843:6;37851:15;37816:51;;;;;;;:::i;:::-;;;;;;;;37100:775;;2422:20:::0;:18;:20::i;:::-;37054:821::o;24921:40::-;;;;:::o;28484:395::-;28535:7;28675:1;28655:17;;:21;;;;:::i;:::-;28639:12;:37;28635:90;;28700:13;;28693:20;;;;28635:90;23821:42;28828:28;;;28865:4;28828:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28821:50;;28484:395;;:::o;29326:173::-;29388:16;29407:5;;;;;;;;;;;29388:24;;29431:8;29423:5;;:16;;;;;;;;;;;;;;;;;;29482:8;29455:36;;29472:8;29455:36;;;;;;;;;;;;29377:122;29326:173;:::o;2458:293::-;1860:1;2592:7;;:19;2584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1860:1;2725:7;:18;;;;2458:293::o;13521:190::-;13622:81;13642:5;13664;:18;;;13685:4;13691:2;13695:5;13649:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13622:19;:81::i;:::-;13521:190;;;;:::o;28315:161::-;23821:42;28382:28;;;28419:4;28382:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28366:13;:59;;;;28456:12;28436:17;:32;;;;28315:161::o;2759:213::-;1816:1;2942:7;:22;;;;2759:213::o;42481:1717::-;42561:13;42577:6;:17;42584:9;42577:17;;;;;;;;;;;;42561:33;;42605:15;42623:4;42628:5;42623:11;;;;;;;;:::i;:::-;;;;;;;;;;;;42605:29;;42645:14;42662:3;:10;;;42645:27;;42699:1;42689:6;:11;42685:41;;42709:17;;;;;;;;;;;;;;42685:41;42741:3;:13;;;;;;;;;;;;42737:45;;;42763:19;;;;;;;;;;;;;;42737:45;42831:5;42820:9;42800:37;;;;;;;;;;42850:14;42867:3;:10;;;;;;;;;;;;42850:27;;;;42888:17;42908:3;:13;;;;;;;;;;;;42888:33;;;;42932:15;42950:3;:11;;;;;;;;;;;;42932:29;;42974:15;43007:6;42992:12;:21;;;;:::i;:::-;42974:39;;43024:25;43052:39;43065:6;43073;43081:9;43052:12;:39::i;:::-;43024:67;;43102:17;24525:2;43170:6;:25;43166:280;;43247:1;43234:3;:8;;;;;;;;;;;;43217:25;;43223:7;43218:1;:12;;;;:::i;:::-;43217:25;43216:32;43212:102;;43281:17;43269:29;;43212:102;43166:280;;;43360:9;43350:7;:19;43346:89;;;43402:17;43390:29;;43346:89;43166:280;43499:17;43483:12;;:33;;;;;;;:::i;:::-;;;;;;;;43568:4;43552:3;:13;;;:20;;;;;;;;;;;;;;;;;;43599:9;43583:3;:13;;:25;;;;43633:7;43619:3;:11;;:21;;;;43695:1;43683:9;:13;43679:252;;;43747:6;43735:9;:18;;;;:::i;:::-;43713:11;;:41;;;;;;;:::i;:::-;;;;;;;;43769:51;43801:7;43810:9;23821:42;43769:31;;;;:51;;;;;:::i;:::-;43835:22;:20;:22::i;:::-;43679:252;;;43912:6;43890:11;;:29;;;;;;;:::i;:::-;;;;;;;;43679:252;44042:6;43948:242;;43993:7;43948:242;;43973:5;43948:242;44015:6;44070:9;44095:3;:8;;;;;;;;;;;;44118:7;44140:9;44164:15;43948:242;;;;;;;;;;;:::i;:::-;;;;;;;;42550:1648;;;;;;;;;42481:1717;;:::o;13114:162::-;13197:71;13217:5;13239;:14;;;13256:2;13260:5;13224:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13197:19;:71::i;:::-;13114:162;;;:::o;28887:130::-;28936:7;28956:22;:20;:22::i;:::-;28996:13;;28989:20;;28887:130;:::o;41530:294::-;41659:17;41706:1;41693:9;:14;:36;;;;41723:6;41711:9;:18;41693:36;41689:75;;;41738:26;;;;;;;;;;;;;;41689:75;41807:9;41797:6;41788;:15;;;;:::i;:::-;41787:29;;;;:::i;:::-;41775:41;;41530:294;;;;;:::o;38780:419::-;38913:1;38885:30;;:16;;;;;;;;;;;:30;;;38881:64;;38924:21;;;;;;;;;;;;;;38881:64;38970:1;38960:6;:11;;:34;;;;24480:3;38975:6;:19;38960:34;38956:65;;;39003:18;;;;;;;;;;;;;;38956:65;39045:12;;39036:6;:21;:46;;;;39070:12;;39061:6;:21;39036:46;39032:80;;;39091:21;;;;;;;;;;;;;;39032:80;39138:1;39127:7;:12;:39;;;;24525:2;24566:1;:20;;;;:::i;:::-;39143:7;:23;;39127:39;39123:68;;;39175:16;;;;;;;;;;;;;;39123:68;38780:419;;;:::o;39207:437::-;39287:17;39306:12;24525:2;39335:6;:25;39331:306;;24889:4;24783:66;24670;39391:7;:21;;;;:::i;:::-;39390:37;39389:55;;;;:::i;:::-;39377:67;;39466:7;39459:14;;39331:306;;;39521:1;39510:7;:12;:32;;;;39536:6;39526:7;:16;39510:32;39506:62;;;39551:17;;;;;;;;;;;;;;39506:62;39595:7;39583:19;;39624:1;39617:8;;39331:306;39207:437;;;;;:::o;39652:1070::-;39754:13;39823:25;39851:39;39864:6;39872;39880:9;39851:12;:39::i;:::-;39823:67;;39973:11;:9;:11::i;:::-;39964:6;:20;;;;:::i;:::-;39944:17;:40;39940:73;;;39993:20;;;;;;;;;;;;;;39940:73;40111:13;;40091:17;40076:12;;:32;;;;:::i;:::-;:48;40072:107;;;40148:19;;;;;;;;;;;;;;40072:107;40239:17;40223:12;;:33;;;;;;;:::i;:::-;;;;;;;;40299:4;:11;;;;40291:19;;40321:4;40345:358;;;;;;;;40376:6;40345:358;;;;40415:6;40345:358;;;;;;40458:9;40345:358;;;;;;40500:4;40345:358;;;;;;40542:12;40345:358;;;;40582:10;40345:358;;;;;;40622:5;40345:358;;;;;;40655:1;40345:358;;;;40686:1;40345:358;;;40321:393;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39769:953;39652:1070;;;;;;:::o;40730:747::-;41026:17;41057:16;;;;;;;;;;;41046:59;;;41106:5;41046:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41026:86;;41143:5;41123:6;:17;41130:9;41123:17;;;;;;;;;;;:25;;;;41221:5;41210:9;41190:37;;;;;;;;;;41339:6;41243:226;;41287:10;41243:226;;41267:5;41243:226;41312:6;41367:9;41399:4;41419:9;41443:15;41243:226;;;;;;;;;;:::i;:::-;;;;;;;;40905:572;40730:747;;;;;:::o;20405:738::-;20486:18;20515:19;20655:4;20652:1;20645:4;20639:11;20632:4;20626;20622:15;20619:1;20612:5;20605;20600:60;20714:7;20704:180;;20759:4;20753:11;20805:16;20802:1;20797:3;20782:40;20852:16;20847:3;20840:29;20704:180;20912:16;20898:30;;20963:1;20957:8;20942:23;;20570:406;21006:1;20992:10;:15;:68;;21059:1;21044:11;:16;;20992:68;;;21040:1;21018:5;21010:26;;;:31;20992:68;20988:148;;;21117:5;21084:40;;;;;;;;;;;:::i;:::-;;;;;;;;20988:148;20475:668;;20405:738;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:96::-;1546:7;1575:24;1593:5;1575:24;:::i;:::-;1564:35;;1509:96;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:90::-;2253:7;2296:5;2289:13;2282:21;2271:32;;2219:90;;;:::o;2315:109::-;2396:21;2411:5;2396:21;:::i;:::-;2391:3;2384:34;2315:109;;:::o;2430:541::-;2601:4;2639:3;2628:9;2624:19;2616:27;;2653:71;2721:1;2710:9;2706:17;2697:6;2653:71;:::i;:::-;2734:72;2802:2;2791:9;2787:18;2778:6;2734:72;:::i;:::-;2816;2884:2;2873:9;2869:18;2860:6;2816:72;:::i;:::-;2898:66;2960:2;2949:9;2945:18;2936:6;2898:66;:::i;:::-;2430:541;;;;;;;:::o;2977:86::-;3012:7;3052:4;3045:5;3041:16;3030:27;;2977:86;;;:::o;3069:112::-;3152:22;3168:5;3152:22;:::i;:::-;3147:3;3140:35;3069:112;;:::o;3187:95::-;3223:7;3263:12;3256:5;3252:24;3241:35;;3187:95;;;:::o;3288:115::-;3373:23;3390:5;3373:23;:::i;:::-;3368:3;3361:36;3288:115;;:::o;3409:118::-;3496:24;3514:5;3496:24;:::i;:::-;3491:3;3484:37;3409:118;;:::o;3533:1076::-;3834:4;3872:3;3861:9;3857:19;3849:27;;3886:71;3954:1;3943:9;3939:17;3930:6;3886:71;:::i;:::-;3967:68;4031:2;4020:9;4016:18;4007:6;3967:68;:::i;:::-;4045;4109:2;4098:9;4094:18;4085:6;4045:68;:::i;:::-;4123:70;4189:2;4178:9;4174:18;4165:6;4123:70;:::i;:::-;4203:73;4271:3;4260:9;4256:19;4247:6;4203:73;:::i;:::-;4286;4354:3;4343:9;4339:19;4330:6;4286:73;:::i;:::-;4369:67;4431:3;4420:9;4416:19;4407:6;4369:67;:::i;:::-;4446:73;4514:3;4503:9;4499:19;4490:6;4446:73;:::i;:::-;4529;4597:3;4586:9;4582:19;4573:6;4529:73;:::i;:::-;3533:1076;;;;;;;;;;;;:::o;4615:210::-;4702:4;4740:2;4729:9;4725:18;4717:26;;4753:65;4815:1;4804:9;4800:17;4791:6;4753:65;:::i;:::-;4615:210;;;;:::o;4831:541::-;5002:4;5040:3;5029:9;5025:19;5017:27;;5054:71;5122:1;5111:9;5107:17;5098:6;5054:71;:::i;:::-;5135:66;5197:2;5186:9;5182:18;5173:6;5135:66;:::i;:::-;5211:72;5279:2;5268:9;5264:18;5255:6;5211:72;:::i;:::-;5293;5361:2;5350:9;5346:18;5337:6;5293:72;:::i;:::-;4831:541;;;;;;;:::o;5378:332::-;5499:4;5537:2;5526:9;5522:18;5514:26;;5550:71;5618:1;5607:9;5603:17;5594:6;5550:71;:::i;:::-;5631:72;5699:2;5688:9;5684:18;5675:6;5631:72;:::i;:::-;5378:332;;;;;:::o;5716:222::-;5809:4;5847:2;5836:9;5832:18;5824:26;;5860:71;5928:1;5917:9;5913:17;5904:6;5860:71;:::i;:::-;5716:222;;;;:::o;5944:76::-;5980:7;6009:5;5998:16;;5944:76;;;:::o;6026:115::-;6111:23;6128:5;6111:23;:::i;:::-;6106:3;6099:36;6026:115;;:::o;6147:218::-;6238:4;6276:2;6265:9;6261:18;6253:26;;6289:69;6355:1;6344:9;6340:17;6331:6;6289:69;:::i;:::-;6147:218;;;;:::o;6371:474::-;6439:6;6447;6496:2;6484:9;6475:7;6471:23;6467:32;6464:119;;;6502:79;;:::i;:::-;6464:119;6622:1;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6593:117;6749:2;6775:53;6820:7;6811:6;6800:9;6796:22;6775:53;:::i;:::-;6765:63;;6720:118;6371:474;;;;;:::o;6851:644::-;7046:4;7084:3;7073:9;7069:19;7061:27;;7098:71;7166:1;7155:9;7151:17;7142:6;7098:71;:::i;:::-;7179:68;7243:2;7232:9;7228:18;7219:6;7179:68;:::i;:::-;7257;7321:2;7310:9;7306:18;7297:6;7257:68;:::i;:::-;7335:70;7401:2;7390:9;7386:18;7377:6;7335:70;:::i;:::-;7415:73;7483:3;7472:9;7468:19;7459:6;7415:73;:::i;:::-;6851:644;;;;;;;;:::o;7501:553::-;7678:4;7716:3;7705:9;7701:19;7693:27;;7730:71;7798:1;7787:9;7783:17;7774:6;7730:71;:::i;:::-;7811:72;7879:2;7868:9;7864:18;7855:6;7811:72;:::i;:::-;7893;7961:2;7950:9;7946:18;7937:6;7893:72;:::i;:::-;7975;8043:2;8032:9;8028:18;8019:6;7975:72;:::i;:::-;7501:553;;;;;;;:::o;8060:474::-;8128:6;8136;8185:2;8173:9;8164:7;8160:23;8156:32;8153:119;;;8191:79;;:::i;:::-;8153:119;8311:1;8336:53;8381:7;8372:6;8361:9;8357:22;8336:53;:::i;:::-;8326:63;;8282:117;8438:2;8464:53;8509:7;8500:6;8489:9;8485:22;8464:53;:::i;:::-;8454:63;;8409:118;8060:474;;;;;:::o;8540:619::-;8617:6;8625;8633;8682:2;8670:9;8661:7;8657:23;8653:32;8650:119;;;8688:79;;:::i;:::-;8650:119;8808:1;8833:53;8878:7;8869:6;8858:9;8854:22;8833:53;:::i;:::-;8823:63;;8779:117;8935:2;8961:53;9006:7;8997:6;8986:9;8982:22;8961:53;:::i;:::-;8951:63;;8906:118;9063:2;9089:53;9134:7;9125:6;9114:9;9110:22;9089:53;:::i;:::-;9079:63;;9034:118;8540:619;;;;;:::o;9165:430::-;9308:4;9346:2;9335:9;9331:18;9323:26;;9359:71;9427:1;9416:9;9412:17;9403:6;9359:71;:::i;:::-;9440:72;9508:2;9497:9;9493:18;9484:6;9440:72;:::i;:::-;9522:66;9584:2;9573:9;9569:18;9560:6;9522:66;:::i;:::-;9165:430;;;;;;:::o;9601:169::-;9685:11;9719:6;9714:3;9707:19;9759:4;9754:3;9750:14;9735:29;;9601:169;;;;:::o;9776:227::-;9916:34;9912:1;9904:6;9900:14;9893:58;9985:10;9980:2;9972:6;9968:15;9961:35;9776:227;:::o;10009:366::-;10151:3;10172:67;10236:2;10231:3;10172:67;:::i;:::-;10165:74;;10248:93;10337:3;10248:93;:::i;:::-;10366:2;10361:3;10357:12;10350:19;;10009:366;;;:::o;10381:419::-;10547:4;10585:2;10574:9;10570:18;10562:26;;10634:9;10628:4;10624:20;10620:1;10609:9;10605:17;10598:47;10662:131;10788:4;10662:131;:::i;:::-;10654:139;;10381:419;;;:::o;10806:180::-;10854:77;10851:1;10844:88;10951:4;10948:1;10941:15;10975:4;10972:1;10965:15;10992:191;11032:3;11051:20;11069:1;11051:20;:::i;:::-;11046:25;;11085:20;11103:1;11085:20;:::i;:::-;11080:25;;11128:1;11125;11121:9;11114:16;;11149:3;11146:1;11143:10;11140:36;;;11156:18;;:::i;:::-;11140:36;10992:191;;;;:::o;11189:194::-;11229:4;11249:20;11267:1;11249:20;:::i;:::-;11244:25;;11283:20;11301:1;11283:20;:::i;:::-;11278:25;;11327:1;11324;11320:9;11312:17;;11351:1;11345:4;11342:11;11339:37;;;11356:18;;:::i;:::-;11339:37;11189:194;;;;:::o;11389:229::-;11529:34;11525:1;11517:6;11513:14;11506:58;11598:12;11593:2;11585:6;11581:15;11574:37;11389:229;:::o;11624:366::-;11766:3;11787:67;11851:2;11846:3;11787:67;:::i;:::-;11780:74;;11863:93;11952:3;11863:93;:::i;:::-;11981:2;11976:3;11972:12;11965:19;;11624:366;;;:::o;11996:419::-;12162:4;12200:2;12189:9;12185:18;12177:26;;12249:9;12243:4;12239:20;12235:1;12224:9;12220:17;12213:47;12277:131;12403:4;12277:131;:::i;:::-;12269:139;;11996:419;;;:::o;12421:227::-;12561:34;12557:1;12549:6;12545:14;12538:58;12630:10;12625:2;12617:6;12613:15;12606:35;12421:227;:::o;12654:366::-;12796:3;12817:67;12881:2;12876:3;12817:67;:::i;:::-;12810:74;;12893:93;12982:3;12893:93;:::i;:::-;13011:2;13006:3;13002:12;12995:19;;12654:366;;;:::o;13026:419::-;13192:4;13230:2;13219:9;13215:18;13207:26;;13279:9;13273:4;13269:20;13265:1;13254:9;13250:17;13243:47;13307:131;13433:4;13307:131;:::i;:::-;13299:139;;13026:419;;;:::o;13451:178::-;13591:30;13587:1;13579:6;13575:14;13568:54;13451:178;:::o;13635:366::-;13777:3;13798:67;13862:2;13857:3;13798:67;:::i;:::-;13791:74;;13874:93;13963:3;13874:93;:::i;:::-;13992:2;13987:3;13983:12;13976:19;;13635:366;;;:::o;14007:419::-;14173:4;14211:2;14200:9;14196:18;14188:26;;14260:9;14254:4;14250:20;14246:1;14235:9;14231:17;14224:47;14288:131;14414:4;14288:131;:::i;:::-;14280:139;;14007:419;;;:::o;14432:168::-;14572:20;14568:1;14560:6;14556:14;14549:44;14432:168;:::o;14606:366::-;14748:3;14769:67;14833:2;14828:3;14769:67;:::i;:::-;14762:74;;14845:93;14934:3;14845:93;:::i;:::-;14963:2;14958:3;14954:12;14947:19;;14606:366;;;:::o;14978:419::-;15144:4;15182:2;15171:9;15167:18;15159:26;;15231:9;15225:4;15221:20;15217:1;15206:9;15202:17;15195:47;15259:131;15385:4;15259:131;:::i;:::-;15251:139;;14978:419;;;:::o;15403:180::-;15451:77;15448:1;15441:88;15548:4;15545:1;15538:15;15572:4;15569:1;15562:15;15589:180;15729:32;15725:1;15717:6;15713:14;15706:56;15589:180;:::o;15775:366::-;15917:3;15938:67;16002:2;15997:3;15938:67;:::i;:::-;15931:74;;16014:93;16103:3;16014:93;:::i;:::-;16132:2;16127:3;16123:12;16116:19;;15775:366;;;:::o;16147:419::-;16313:4;16351:2;16340:9;16336:18;16328:26;;16400:9;16394:4;16390:20;16386:1;16375:9;16371:17;16364:47;16428:131;16554:4;16428:131;:::i;:::-;16420:139;;16147:419;;;:::o;16572:176::-;16712:28;16708:1;16700:6;16696:14;16689:52;16572:176;:::o;16754:366::-;16896:3;16917:67;16981:2;16976:3;16917:67;:::i;:::-;16910:74;;16993:93;17082:3;16993:93;:::i;:::-;17111:2;17106:3;17102:12;17095:19;;16754:366;;;:::o;17126:419::-;17292:4;17330:2;17319:9;17315:18;17307:26;;17379:9;17373:4;17369:20;17365:1;17354:9;17350:17;17343:47;17407:131;17533:4;17407:131;:::i;:::-;17399:139;;17126:419;;;:::o;17551:179::-;17691:31;17687:1;17679:6;17675:14;17668:55;17551:179;:::o;17736:366::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:419::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:225::-;18673:34;18669:1;18661:6;18657:14;18650:58;18742:8;18737:2;18729:6;18725:15;18718:33;18533:225;:::o;18764:366::-;18906:3;18927:67;18991:2;18986:3;18927:67;:::i;:::-;18920:74;;19003:93;19092:3;19003:93;:::i;:::-;19121:2;19116:3;19112:12;19105:19;;18764:366;;;:::o;19136:419::-;19302:4;19340:2;19329:9;19325:18;19317:26;;19389:9;19383:4;19379:20;19375:1;19364:9;19360:17;19353:47;19417:131;19543:4;19417:131;:::i;:::-;19409:139;;19136:419;;;:::o;19561:176::-;19701:28;19697:1;19689:6;19685:14;19678:52;19561:176;:::o;19743:366::-;19885:3;19906:67;19970:2;19965:3;19906:67;:::i;:::-;19899:74;;19982:93;20071:3;19982:93;:::i;:::-;20100:2;20095:3;20091:12;20084:19;;19743:366;;;:::o;20115:419::-;20281:4;20319:2;20308:9;20304:18;20296:26;;20368:9;20362:4;20358:20;20354:1;20343:9;20339:17;20332:47;20396:131;20522:4;20396:131;:::i;:::-;20388:139;;20115:419;;;:::o;20540:180::-;20588:77;20585:1;20578:88;20685:4;20682:1;20675:15;20709:4;20706:1;20699:15;20726:185;20766:1;20783:20;20801:1;20783:20;:::i;:::-;20778:25;;20817:20;20835:1;20817:20;:::i;:::-;20812:25;;20856:1;20846:35;;20861:18;;:::i;:::-;20846:35;20903:1;20900;20896:9;20891:14;;20726:185;;;;:::o;20917:410::-;20957:7;20980:20;20998:1;20980:20;:::i;:::-;20975:25;;21014:20;21032:1;21014:20;:::i;:::-;21009:25;;21069:1;21066;21062:9;21091:30;21109:11;21091:30;:::i;:::-;21080:41;;21270:1;21261:7;21257:15;21254:1;21251:22;21231:1;21224:9;21204:83;21181:139;;21300:18;;:::i;:::-;21181:139;20965:362;20917:410;;;;:::o;21333:179::-;21473:31;21469:1;21461:6;21457:14;21450:55;21333:179;:::o;21518:366::-;21660:3;21681:67;21745:2;21740:3;21681:67;:::i;:::-;21674:74;;21757:93;21846:3;21757:93;:::i;:::-;21875:2;21870:3;21866:12;21859:19;;21518:366;;;:::o;21890:419::-;22056:4;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;21890:419;;;:::o;22315:176::-;22347:1;22364:20;22382:1;22364:20;:::i;:::-;22359:25;;22398:20;22416:1;22398:20;:::i;:::-;22393:25;;22437:1;22427:35;;22442:18;;:::i;:::-;22427:35;22483:1;22480;22476:9;22471:14;;22315:176;;;;:::o;22497:77::-;22534:7;22563:5;22552:16;;22497:77;;;:::o;22580:79::-;22619:7;22648:5;22637:16;;22580:79;;;:::o;22665:157::-;22770:45;22790:24;22808:5;22790:24;:::i;:::-;22770:45;:::i;:::-;22765:3;22758:58;22665:157;;:::o;22828:79::-;22867:7;22896:5;22885:16;;22828:79;;;:::o;22913:157::-;23018:45;23038:24;23056:5;23038:24;:::i;:::-;23018:45;:::i;:::-;23013:3;23006:58;22913:157;;:::o;23076:397::-;23216:3;23231:75;23302:3;23293:6;23231:75;:::i;:::-;23331:2;23326:3;23322:12;23315:19;;23344:75;23415:3;23406:6;23344:75;:::i;:::-;23444:2;23439:3;23435:12;23428:19;;23464:3;23457:10;;23076:397;;;;;:::o;23479:225::-;23619:34;23615:1;23607:6;23603:14;23596:58;23688:8;23683:2;23675:6;23671:15;23664:33;23479:225;:::o;23710:366::-;23852:3;23873:67;23937:2;23932:3;23873:67;:::i;:::-;23866:74;;23949:93;24038:3;23949:93;:::i;:::-;24067:2;24062:3;24058:12;24051:19;;23710:366;;;:::o;24082:419::-;24248:4;24286:2;24275:9;24271:18;24263:26;;24335:9;24329:4;24325:20;24321:1;24310:9;24306:17;24299:47;24363:131;24489:4;24363:131;:::i;:::-;24355:139;;24082:419;;;:::o;24507:221::-;24647:34;24643:1;24635:6;24631:14;24624:58;24716:4;24711:2;24703:6;24699:15;24692:29;24507:221;:::o;24734:366::-;24876:3;24897:67;24961:2;24956:3;24897:67;:::i;:::-;24890:74;;24973:93;25062:3;24973:93;:::i;:::-;25091:2;25086:3;25082:12;25075:19;;24734:366;;;:::o;25106:419::-;25272:4;25310:2;25299:9;25295:18;25287:26;;25359:9;25353:4;25349:20;25345:1;25334:9;25330:17;25323:47;25387:131;25513:4;25387:131;:::i;:::-;25379:139;;25106:419;;;:::o;25531:176::-;25671:28;25667:1;25659:6;25655:14;25648:52;25531:176;:::o;25713:366::-;25855:3;25876:67;25940:2;25935:3;25876:67;:::i;:::-;25869:74;;25952:93;26041:3;25952:93;:::i;:::-;26070:2;26065:3;26061:12;26054:19;;25713:366;;;:::o;26085:419::-;26251:4;26289:2;26278:9;26274:18;26266:26;;26338:9;26332:4;26328:20;26324:1;26313:9;26309:17;26302:47;26366:131;26492:4;26366:131;:::i;:::-;26358:139;;26085:419;;;:::o;26510:143::-;26567:5;26598:6;26592:13;26583:22;;26614:33;26641:5;26614:33;:::i;:::-;26510:143;;;;:::o;26659:351::-;26729:6;26778:2;26766:9;26757:7;26753:23;26749:32;26746:119;;;26784:79;;:::i;:::-;26746:119;26904:1;26929:64;26985:7;26976:6;26965:9;26961:22;26929:64;:::i;:::-;26919:74;;26875:128;26659:351;;;;:::o;27016:181::-;27156:33;27152:1;27144:6;27140:14;27133:57;27016:181;:::o;27203:366::-;27345:3;27366:67;27430:2;27425:3;27366:67;:::i;:::-;27359:74;;27442:93;27531:3;27442:93;:::i;:::-;27560:2;27555:3;27551:12;27544:19;;27203:366;;;:::o;27575:419::-;27741:4;27779:2;27768:9;27764:18;27756:26;;27828:9;27822:4;27818:20;27814:1;27803:9;27799:17;27792:47;27856:131;27982:4;27856:131;:::i;:::-;27848:139;;27575:419;;;:::o;28000:442::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28200:71;28268:1;28257:9;28253:17;28244:6;28200:71;:::i;:::-;28281:72;28349:2;28338:9;28334:18;28325:6;28281:72;:::i;:::-;28363;28431:2;28420:9;28416:18;28407:6;28363:72;:::i;:::-;28000:442;;;;;;:::o;28448:102::-;28490:8;28537:5;28534:1;28530:13;28509:34;;28448:102;;;:::o;28556:848::-;28617:5;28624:4;28648:6;28639:15;;28672:5;28663:14;;28686:712;28707:1;28697:8;28694:15;28686:712;;;28802:4;28797:3;28793:14;28787:4;28784:24;28781:50;;;28811:18;;:::i;:::-;28781:50;28861:1;28851:8;28847:16;28844:451;;;29276:4;29269:5;29265:16;29256:25;;28844:451;29326:4;29320;29316:15;29308:23;;29356:32;29379:8;29356:32;:::i;:::-;29344:44;;28686:712;;;28556:848;;;;;;;:::o;29410:1073::-;29464:5;29655:8;29645:40;;29676:1;29667:10;;29678:5;;29645:40;29704:4;29694:36;;29721:1;29712:10;;29723:5;;29694:36;29790:4;29838:1;29833:27;;;;29874:1;29869:191;;;;29783:277;;29833:27;29851:1;29842:10;;29853:5;;;29869:191;29914:3;29904:8;29901:17;29898:43;;;29921:18;;:::i;:::-;29898:43;29970:8;29967:1;29963:16;29954:25;;30005:3;29998:5;29995:14;29992:40;;;30012:18;;:::i;:::-;29992:40;30045:5;;;29783:277;;30169:2;30159:8;30156:16;30150:3;30144:4;30141:13;30137:36;30119:2;30109:8;30106:16;30101:2;30095:4;30092:12;30088:35;30072:111;30069:246;;;30225:8;30219:4;30215:19;30206:28;;30260:3;30253:5;30250:14;30247:40;;;30267:18;;:::i;:::-;30247:40;30300:5;;30069:246;30340:42;30378:3;30368:8;30362:4;30359:1;30340:42;:::i;:::-;30325:57;;;;30414:4;30409:3;30405:14;30398:5;30395:25;30392:51;;;30423:18;;:::i;:::-;30392:51;30472:4;30465:5;30461:16;30452:25;;29410:1073;;;;;;:::o;30489:285::-;30549:5;30573:23;30591:4;30573:23;:::i;:::-;30565:31;;30617:27;30635:8;30617:27;:::i;:::-;30605:39;;30663:104;30700:66;30690:8;30684:4;30663:104;:::i;:::-;30654:113;;30489:285;;;;:::o;30780:372::-;30819:4;30839:19;30856:1;30839:19;:::i;:::-;30834:24;;30872:19;30889:1;30872:19;:::i;:::-;30867:24;;30915:1;30912;30908:9;30900:17;;31109:1;31103:4;31099:12;31095:1;31092;31088:9;31084:28;31067:1;31061:4;31057:12;31052:1;31049;31045:9;31038:17;31034:36;31018:104;31015:130;;;31125:18;;:::i;:::-;31015:130;30780:372;;;;:::o;31158:375::-;31197:3;31216:19;31233:1;31216:19;:::i;:::-;31211:24;;31249:19;31266:1;31249:19;:::i;:::-;31244:24;;31291:1;31288;31284:9;31277:16;;31489:1;31484:3;31480:11;31473:19;31469:1;31466;31462:9;31458:35;31441:1;31436:3;31432:11;31427:1;31424;31420:9;31413:17;31409:35;31393:110;31390:136;;;31506:18;;:::i;:::-;31390:136;31158:375;;;;:::o;31539:763::-;31766:4;31804:3;31793:9;31789:19;31781:27;;31818:71;31886:1;31875:9;31871:17;31862:6;31818:71;:::i;:::-;31899:68;31963:2;31952:9;31948:18;31939:6;31899:68;:::i;:::-;31977:70;32043:2;32032:9;32028:18;32019:6;31977:70;:::i;:::-;32057:72;32125:2;32114:9;32110:18;32101:6;32057:72;:::i;:::-;32139:73;32207:3;32196:9;32192:19;32183:6;32139:73;:::i;:::-;32222;32290:3;32279:9;32275:19;32266:6;32222:73;:::i;:::-;31539:763;;;;;;;;;:::o;32308:332::-;32429:4;32467:2;32456:9;32452:18;32444:26;;32480:71;32548:1;32537:9;32533:17;32524:6;32480:71;:::i;:::-;32561:72;32629:2;32618:9;32614:18;32605:6;32561:72;:::i;:::-;32308:332;;;;;:::o;32646:652::-;32845:4;32883:3;32872:9;32868:19;32860:27;;32897:71;32965:1;32954:9;32950:17;32941:6;32897:71;:::i;:::-;32978:68;33042:2;33031:9;33027:18;33018:6;32978:68;:::i;:::-;33056:70;33122:2;33111:9;33107:18;33098:6;33056:70;:::i;:::-;33136:72;33204:2;33193:9;33189:18;33180:6;33136:72;:::i;:::-;33218:73;33286:3;33275:9;33271:19;33262:6;33218:73;:::i;:::-;32646:652;;;;;;;;:::o
Swarm Source
ipfs://a5163d713a6a94ba87179b0ec6b5a69c2c19f00804ac004320089f0434b43be9
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.