Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 624 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
End Game | 18044303 | 524 days ago | IN | 0 ETH | 0.00172098 | ||||
New Game | 18044299 | 524 days ago | IN | 0 ETH | 0.00326926 | ||||
End Game | 18044293 | 524 days ago | IN | 0 ETH | 0.00155693 | ||||
New Game | 18044290 | 524 days ago | IN | 0 ETH | 0.00548532 | ||||
End Game | 18043912 | 525 days ago | IN | 0 ETH | 0.00258084 | ||||
New Game | 18043911 | 525 days ago | IN | 0 ETH | 0.00466392 | ||||
End Game | 18043906 | 525 days ago | IN | 0 ETH | 0.00326828 | ||||
New Game | 18043904 | 525 days ago | IN | 0 ETH | 0.00993522 | ||||
Abort Game | 18043891 | 525 days ago | IN | 0 ETH | 0.00226339 | ||||
New Game | 18043879 | 525 days ago | IN | 0 ETH | 0.00764232 | ||||
End Game | 18043873 | 525 days ago | IN | 0 ETH | 0.00250484 | ||||
New Game | 18043871 | 525 days ago | IN | 0 ETH | 0.00436777 | ||||
End Game | 18043867 | 525 days ago | IN | 0 ETH | 0.00226928 | ||||
New Game | 18043866 | 525 days ago | IN | 0 ETH | 0.00454364 | ||||
End Game | 18043860 | 525 days ago | IN | 0 ETH | 0.00240632 | ||||
New Game | 18043858 | 525 days ago | IN | 0 ETH | 0.00431336 | ||||
End Game | 18043851 | 525 days ago | IN | 0 ETH | 0.00262592 | ||||
New Game | 18043849 | 525 days ago | IN | 0 ETH | 0.00440446 | ||||
End Game | 18043843 | 525 days ago | IN | 0 ETH | 0.00267651 | ||||
New Game | 18043841 | 525 days ago | IN | 0 ETH | 0.00936824 | ||||
End Game | 18043832 | 525 days ago | IN | 0 ETH | 0.00254259 | ||||
New Game | 18043830 | 525 days ago | IN | 0 ETH | 0.00493955 | ||||
End Game | 18043826 | 525 days ago | IN | 0 ETH | 0.00266935 | ||||
New Game | 18043825 | 525 days ago | IN | 0 ETH | 0.00515132 | ||||
End Game | 18043821 | 525 days ago | IN | 0 ETH | 0.00273316 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BangBangBangRoulette
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-25 */ /* Bang Bang Bang - Play Russian Roulette directly in Discord Twitter/X: https://twitter.com/BangERC20 Discord: https://discord.gg/xUhxuzumE2 Telegram https://t.me/BBBPortal */ // SPDX-License-Identifier: MIT pragma solidity 0.8.21; // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract BangBangBang is Ownable, ERC20 { IUniswapV2Router02 public router; IUniswapV2Factory public factory; IUniswapV2Pair public pair; uint private constant INITIAL_SUPPLY = 10_000_000 * 10**8; // Percent of the initial supply that will go to the LP uint constant LP_BPS = 9000; // Percent of the initial supply that will go to marketing uint constant MARKETING_BPS = 10_000 - LP_BPS; // // The tax to deduct, in basis points // uint public buyTaxBps = 500; uint public sellTaxBps = 500; // bool isSellingCollectedTaxes; event AntiBotEngaged(); event AntiBotDisengaged(); event StealthLaunchEngaged(); address public rouletteContract; bool public isLaunched; address public myWallet; address public marketingWallet; address public revenueWallet; bool public engagedOnce; bool public disengagedOnce; constructor() ERC20("Bang Bang Bang", "BBB", 8) { if (isGoerli()) { router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); } else if (isSepolia()) { router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008); } else { require(block.chainid == 1, "expected mainnet"); router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); } factory = IUniswapV2Factory(router.factory()); // Approve infinite spending by DEX, to sell tokens collected via tax. allowance[address(this)][address(router)] = type(uint).max; emit Approval(address(this), address(router), type(uint).max); isLaunched = false; } modifier lockTheSwap() { isSellingCollectedTaxes = true; _; isSellingCollectedTaxes = false; } modifier onlyTestnet() { require(isTestnet(), "not testnet"); _; } receive() external payable {} fallback() external payable {} function burn(uint amount) external { _burn(msg.sender, amount); } /** * @dev Allow minting on testnet * @param amount the number of tokens to mint */ function mint(uint amount) external onlyTestnet { _mint(address(msg.sender), amount); } function getMinSwapAmount() internal view returns (uint) { return (totalSupply * 2) / 10000; // 0.02% } function isGoerli() public view returns (bool) { return block.chainid == 5; } function isSepolia() public view returns (bool) { return block.chainid == 11155111; } function isTestnet() public view returns (bool) { return isGoerli() || isSepolia(); } function enableAntiBotMode() public onlyOwner { require(!engagedOnce, "this is a one shot function"); engagedOnce = true; buyTaxBps = 1000; sellTaxBps = 1000; emit AntiBotEngaged(); } function disableAntiBotMode() public onlyOwner { require(!disengagedOnce, "this is a one shot function"); disengagedOnce = true; buyTaxBps = 500; sellTaxBps = 500; emit AntiBotDisengaged(); } /** * @dev Does the same thing as a max approve for the roulette * contract, but takes as input a secret that the bot uses to * verify ownership by a Discord user. * @param secret The secret that the bot is expecting. * @return true */ function connectAndApprove(uint32 secret) external returns (bool) { address pwner = _msgSender(); allowance[pwner][rouletteContract] = type(uint).max; emit Approval(pwner, rouletteContract, type(uint).max); return true; } function setRouletteContract(address a) public onlyOwner { require(a != address(0), "null address"); rouletteContract = a; } function setMyWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); myWallet = wallet; } function setMarketingWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); marketingWallet = wallet; } function setRevenueWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); revenueWallet = wallet; } function stealthLaunch() external payable onlyOwner { require(!isLaunched, "already launched"); require(myWallet != address(0), "null address"); require(marketingWallet != address(0), "null address"); require(revenueWallet != address(0), "null address"); require(rouletteContract != address(0), "null address"); isLaunched = true; _mint(address(this), INITIAL_SUPPLY * LP_BPS / 10_000); router.addLiquidityETH{ value: msg.value }( address(this), balanceOf[address(this)], 0, 0, owner(), block.timestamp); pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH())); _mint(marketingWallet, INITIAL_SUPPLY * MARKETING_BPS / 10_000); require(totalSupply == INITIAL_SUPPLY, "numbers don't add up"); if (isTestnet()) { _mint(address(msg.sender), 10_000 * 10**decimals); } emit StealthLaunchEngaged(); } /** * @dev Calculate the amount of tax to apply to a transaction. * @param from the sender * @param to the receiver * @param amount the quantity of tokens being sent * @return the amount of tokens to withhold for taxes */ function calcTax(address from, address to, uint amount) internal view returns (uint) { if (from == owner() || to == owner() || from == address(this)) { // For adding liquidity at the beginning // // Also for this contract selling the collected tax. return 0; } else if (from == address(pair)) { // Buy from DEX, or adding liquidity. return amount * buyTaxBps / 10_000; } else if (to == address(pair)) { // Sell from DEX, or removing liquidity. return amount * sellTaxBps / 10_000; } else { // Sending to other wallets (e.g. OTC) is tax-free. return 0; } } /** * @dev Sell the balance accumulated from taxes. */ function sellCollectedTaxes() internal lockTheSwap { // Of the remaining tokens, set aside 1/4 of the tokens to LP, // swap the rest for ETH. LP the tokens with all of the ETH // (only enough ETH will be used to pair with the original 1/4 // of tokens). Send the remaining ETH (about half the original // balance) to my wallet. uint tokensForLiq = balanceOf[address(this)] / 4; uint tokensToSwap = balanceOf[address(this)] - tokensForLiq; // Sell address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokensToSwap, 0, path, address(this), block.timestamp ); router.addLiquidityETH{ value: address(this).balance }( address(this), tokensForLiq, 0, 0, owner(), block.timestamp); myWallet.call{value: address(this).balance}(""); } /** * @dev Transfer tokens from the caller to another address. * @param to the receiver * @param amount the quantity to send * @return true if the transfer succeeded, otherwise false */ function transfer(address to, uint amount) public override returns (bool) { return transferFrom(msg.sender, to, amount); } /** * @dev Transfer tokens from one address to another. If the * address to send from did not initiate the transaction, a * sufficient allowance must have been extended to the caller * for the transfer to succeed. * @param from the sender * @param to the receiver * @param amount the quantity to send * @return true if the transfer succeeded, otherwise false */ function transferFrom( address from, address to, uint amount ) public override returns (bool) { if (from != msg.sender) { // This is a typical transferFrom uint allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint).max) allowance[from][msg.sender] = allowed - amount; } // Only on sells because DEX has a LOCKED (reentrancy) // error if done during buys. // // isSellingCollectedTaxes prevents an infinite loop. if (balanceOf[address(this)] > getMinSwapAmount() && !isSellingCollectedTaxes && from != address(pair) && from != address(this)) { sellCollectedTaxes(); } uint tax = calcTax(from, to, amount); uint afterTaxAmount = amount - tax; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint value. unchecked { balanceOf[to] += afterTaxAmount; } emit Transfer(from, to, afterTaxAmount); if (tax > 0) { // Use 1/5 of tax for revenue uint revenue = tax / 5; tax -= revenue; unchecked { balanceOf[address(this)] += tax; balanceOf[revenueWallet] += revenue; } // Any transfer to the contract can be viewed as tax emit Transfer(from, address(this), tax); emit Transfer(from, revenueWallet, revenue); } return true; } function setTaxes(uint256 _buyTaxBps, uint256 _sellTaxBps) public onlyOwner { buyTaxBps = _buyTaxBps; sellTaxBps = _sellTaxBps; } } /** * @title BangBangBangRoulette * @dev Store funds for Roulette and distribute the winnings as games finish. */ contract BangBangBangRoulette is Ownable { address public revenueWallet; BangBangBang public immutable bettingToken; uint256 public immutable minimumBet; // The amount to take as revenue, in basis points. uint256 public immutable revenueBps; // The amount to burn forever, in basis points. uint256 public immutable burnBps; // Map Discord channel IDs to their games. mapping(int64 => Game) public games; // The Discord channel IDs for each active game. Mainly used to // abort all active games in the event of a catastrophe. int64[] public activeTgGroups; // Stores the amount each player has bet for a game. event Bet(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount each player wins for a game. event Win(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount the loser lost. event Loss(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount collected by the protocol. event Revenue(int64 tgChatId, uint256 amount); // Stores the amount burned by the protocol. event Burn(int64 tgChatId, uint256 amount); constructor(address payable _bettingToken, uint256 _minimumBet, uint256 _revenueBps, uint256 _burnBps, address _revenueWallet) { revenueWallet = _revenueWallet; revenueBps = _revenueBps; burnBps = _burnBps; bettingToken = BangBangBang(_bettingToken); minimumBet = _minimumBet; } struct Game { uint256 revolverSize; uint256 minBet; // This is a SHA-256 hash of the random number generated by the bot. bytes32 hashedBulletChamberIndex; address[] players; uint256[] bets; bool inProgress; uint16 loser; } /** * @dev Check if there is a game in progress for a Discord channel. * @param _discordChannelId Discord channel to check * @return true if there is a game in progress, otherwise false */ function isGameInProgress(int64 _discordChannelId) public view returns (bool) { return games[_discordChannelId].inProgress; } /** * @dev Remove a Discord channel ID from the array. * @param _discordChannelId Discord channel ID to remove */ function removeTgId(int64 _discordChannelId) internal { for (uint256 i = 0; i < activeTgGroups.length; i++) { if (activeTgGroups[i] == _discordChannelId) { activeTgGroups[i] = activeTgGroups[activeTgGroups.length - 1]; activeTgGroups.pop(); } } } /** * @dev Create a new game. Transfer funds into escrow. * @param _discordChannelId Discord channel of this game * @param _revolverSize number of chambers in the revolver * @param _minBet minimum bet to play * @param _hashedBulletChamberIndex which chamber the bullet is in * @param _players participating players * @param _bets each player's bet * @return The updated list of bets. */ function newGame( int64 _discordChannelId, uint256 _revolverSize, uint256 _minBet, bytes32 _hashedBulletChamberIndex, address[] memory _players, uint256[] memory _bets) public onlyOwner returns (uint256[] memory) { require(_revolverSize >= 2, "Revolver size too small"); require(_players.length <= _revolverSize, "Too many players for this size revolver"); require(_minBet >= minimumBet, "Minimum bet too small"); require(_players.length == _bets.length, "Players/bets length mismatch"); require(_players.length > 1, "Not enough players"); require(!isGameInProgress(_discordChannelId), "There is already a game in progress"); // The bets will be capped so you can only lose what other // players bet. The updated bets will be returned to the // caller. // // O(N) by doing a prepass to sum all the bets in the // array. Use the sum to modify one bet at a time. Replace // each bet with its updated value. uint256 betTotal = 0; for (uint16 i = 0; i < _bets.length; i++) { require(_bets[i] >= _minBet, "Bet is smaller than the minimum"); betTotal += _bets[i]; } for (uint16 i = 0; i < _bets.length; i++) { betTotal -= _bets[i]; if (_bets[i] > betTotal) { _bets[i] = betTotal; } betTotal += _bets[i]; require(bettingToken.allowance(_players[i], address(this)) >= _bets[i], "Not enough allowance"); bool isSent = bettingToken.transferFrom(_players[i], address(this), _bets[i]); require(isSent, "Funds transfer failed"); emit Bet(_discordChannelId, _players[i], i, _bets[i]); } Game memory g; g.revolverSize = _revolverSize; g.minBet = _minBet; g.hashedBulletChamberIndex = _hashedBulletChamberIndex; g.players = _players; g.bets = _bets; g.inProgress = true; games[_discordChannelId] = g; activeTgGroups.push(_discordChannelId); return _bets; } /** * @dev Declare a loser of the game and pay out the winnings. * @param _discordChannelId Discord channel of this game * @param _loser index of the loser * * There is also a string array that will be passed in by the bot * containing labeled strings, for historical/auditing purposes: * * beta: The randomly generated number in hex. * * salt: The salt to append to beta for hashing, in hex. * * publickey: The VRF public key in hex. * * proof: The generated proof in hex. * * alpha: The input message to the VRF. */ function endGame( int64 _discordChannelId, uint16 _loser, string[] calldata) public onlyOwner { require(_loser != type(uint16).max, "Loser index shouldn't be the sentinel value"); require(isGameInProgress(_discordChannelId), "No game in progress for this Discord channel ID"); Game storage g = games[_discordChannelId]; require(_loser < g.players.length, "Loser index out of range"); require(g.players.length > 1, "Not enough players"); g.loser = _loser; g.inProgress = false; removeTgId(_discordChannelId); // Parallel arrays address[] memory winners = new address[](g.players.length - 1); uint16[] memory winnersPlayerIndex = new uint16[](g.players.length - 1); // The total bets of the winners. uint256 winningBetTotal = 0; // Filter out the loser and calc the total winning bets. { uint16 numWinners = 0; for (uint16 i = 0; i < g.players.length; i++) { if (i != _loser) { winners[numWinners] = g.players[i]; winnersPlayerIndex[numWinners] = i; winningBetTotal += g.bets[i]; numWinners++; } } } uint256 totalPaidWinnings = 0; require(burnBps + revenueBps < 10_1000, "Total fees must be < 100%"); // The share of tokens to burn. uint256 burnShare = g.bets[_loser] * burnBps / 10_000; // The share left for the contract. This is an approximate // value. The real value will be whatever is leftover after // each winner is paid their share. uint256 approxRevenueShare = g.bets[_loser] * revenueBps / 10_000; bool isSent; { uint256 totalWinnings = g.bets[_loser] - burnShare - approxRevenueShare; for (uint16 i = 0; i < winners.length; i++) { uint256 winnings = totalWinnings * g.bets[winnersPlayerIndex[i]] / winningBetTotal; isSent = bettingToken.transfer(winners[i], g.bets[winnersPlayerIndex[i]] + winnings); require(isSent, "Funds transfer failed"); emit Win(_discordChannelId, winners[i], winnersPlayerIndex[i], winnings); totalPaidWinnings += winnings; } } bettingToken.burn(burnShare); emit Burn(_discordChannelId, burnShare); uint256 realRevenueShare = g.bets[_loser] - totalPaidWinnings - burnShare; isSent = bettingToken.transfer(revenueWallet, realRevenueShare); require(isSent, "Revenue transfer failed"); emit Revenue(_discordChannelId, realRevenueShare); require((totalPaidWinnings + burnShare + realRevenueShare) == g.bets[_loser], "Calculated winnings do not add up"); } /** * @dev Abort a game and refund the bets. Use in emergencies * e.g. bot crash. * @param _discordChannelId Discord channel of this game */ function abortGame(int64 _discordChannelId) public onlyOwner { require(isGameInProgress(_discordChannelId), "No game in progress for this Discord channel ID"); Game storage g = games[_discordChannelId]; for (uint16 i = 0; i < g.players.length; i++) { bool isSent = bettingToken.transfer(g.players[i], g.bets[i]); require(isSent, "Funds transfer failed"); } g.inProgress = false; removeTgId(_discordChannelId); } /** * @dev Abort all in progress games. */ function abortAllGames() public onlyOwner { // abortGame modifies activeTgGroups with each call, so // iterate over a copy int64[] memory _activeTgGroups = activeTgGroups; for (uint256 i = 0; i < _activeTgGroups.length; i++) { abortGame(_activeTgGroups[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"_bettingToken","type":"address"},{"internalType":"uint256","name":"_minimumBet","type":"uint256"},{"internalType":"uint256","name":"_revenueBps","type":"uint256"},{"internalType":"uint256","name":"_burnBps","type":"uint256"},{"internalType":"address","name":"_revenueWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Bet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Loss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Revenue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Win","type":"event"},{"inputs":[],"name":"abortAllGames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"_discordChannelId","type":"int64"}],"name":"abortGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeTgGroups","outputs":[{"internalType":"int64","name":"","type":"int64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bettingToken","outputs":[{"internalType":"contract BangBangBang","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_discordChannelId","type":"int64"},{"internalType":"uint16","name":"_loser","type":"uint16"},{"internalType":"string[]","name":"","type":"string[]"}],"name":"endGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"","type":"int64"}],"name":"games","outputs":[{"internalType":"uint256","name":"revolverSize","type":"uint256"},{"internalType":"uint256","name":"minBet","type":"uint256"},{"internalType":"bytes32","name":"hashedBulletChamberIndex","type":"bytes32"},{"internalType":"bool","name":"inProgress","type":"bool"},{"internalType":"uint16","name":"loser","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_discordChannelId","type":"int64"}],"name":"isGameInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_discordChannelId","type":"int64"},{"internalType":"uint256","name":"_revolverSize","type":"uint256"},{"internalType":"uint256","name":"_minBet","type":"uint256"},{"internalType":"bytes32","name":"_hashedBulletChamberIndex","type":"bytes32"},{"internalType":"address[]","name":"_players","type":"address[]"},{"internalType":"uint256[]","name":"_bets","type":"uint256[]"}],"name":"newGame","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405234801562000011575f80fd5b50604051620033b9380380620033b9833981810160405281019062000037919062000295565b620000576200004b620000ee60201b60201c565b620000f560201b60201c565b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260c081815250508160e081815250508473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508360a08181525050505050505062000319565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620001e582620001ba565b9050919050565b620001f781620001d9565b811462000202575f80fd5b50565b5f815190506200021581620001ec565b92915050565b5f819050919050565b6200022f816200021b565b81146200023a575f80fd5b50565b5f815190506200024d8162000224565b92915050565b5f6200025f82620001ba565b9050919050565b620002718162000253565b81146200027c575f80fd5b50565b5f815190506200028f8162000266565b92915050565b5f805f805f60a08688031215620002b157620002b0620001b6565b5b5f620002c08882890162000205565b9550506020620002d3888289016200023d565b9450506040620002e6888289016200023d565b9350506060620002f9888289016200023d565b92505060806200030c888289016200027f565b9150509295509295909350565b60805160a05160c05160e05161301f6200039a5f395f8181610322015281816107f9015261086801525f81816107d8015281816108c601526118fa01525f8181610e8b015261113e01525f81816102d9015281816109c601528181610ba901528181610ca401528181610f2f015281816113f401526114ee015261301f5ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c80638da5cb5b11610095578063d057fc1f11610064578063d057fc1f14610239578063f2fde38b14610269578063f361971614610285578063ff08aa49146102b9576100f3565b80638da5cb5b146101b1578063c38a8afd146101cf578063cb99e91f146101ed578063ceb7ec0414610209576100f3565b806363c42460116100d157806363c42460146101515780636581673114610181578063715018a61461018b57806388b7904d14610195576100f3565b806343425e88146100f7578063444784251461011557806353deb3d614610133575b5f80fd5b6100ff6102d7565b60405161010c9190611d4c565b60405180910390f35b61011d6102fb565b60405161012a9190611d85565b60405180910390f35b61013b610320565b6040516101489190611db6565b60405180910390f35b61016b60048036038101906101669190611e16565b610344565b6040516101789190611e5b565b60405180910390f35b610189610373565b005b610193610437565b005b6101af60048036038101906101aa9190611f0c565b61044a565b005b6101b9610e62565b6040516101c69190611d85565b60405180910390f35b6101d7610e89565b6040516101e49190611db6565b60405180910390f35b61020760048036038101906102029190611e16565b610ead565b005b610223600480360381019061021e919061220c565b6110aa565b6040516102309190612384565b60405180910390f35b610253600480360381019061024e91906123a4565b6117f6565b60405161026091906123de565b60405180910390f35b610283600480360381019061027e91906123f7565b61182a565b005b61029f600480360381019061029a9190611e16565b6118ac565b6040516102b0959493929190612440565b60405180910390f35b6102c16118f8565b6040516102ce9190611db6565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60025f8360070b60070b81526020019081526020015f206005015f9054906101000a900460ff169050919050565b61037b61191c565b5f60038054806020026020016040519081016040528092919081815260200182805480156103eb57602002820191905f5260205f20905f905b82829054906101000a900460070b60070b815260200190600801906020826007010492830192600103820291508084116103b45790505b505050505090505f5b81518110156104335761042082828151811061041357610412612491565b5b6020026020010151610ead565b808061042b906124eb565b9150506103f4565b5050565b61043f61191c565b6104485f61199a565b565b61045261191c565b61ffff80168361ffff160361049c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610493906125b2565b60405180910390fd5b6104a584610344565b6104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db90612640565b60405180910390fd5b5f60025f8660070b60070b81526020019081526020015f20905080600301805490508461ffff161061054b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610542906126a8565b60405180910390fd5b6001816003018054905011610595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058c90612710565b60405180910390fd5b838160050160016101000a81548161ffff021916908361ffff1602179055505f816005015f6101000a81548160ff0219169083151502179055506105d885611a5b565b5f600182600301805490506105ed919061272e565b67ffffffffffffffff81111561060657610605611fea565b5b6040519080825280602002602001820160405280156106345781602001602082028036833780820191505090505b5090505f6001836003018054905061064c919061272e565b67ffffffffffffffff81111561066557610664611fea565b5b6040519080825280602002602001820160405280156106935781602001602082028036833780820191505090505b5090505f805f5b85600301805490508161ffff1610156107cf578861ffff168161ffff16146107bc57856003018161ffff16815481106106d6576106d5612491565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858361ffff168151811061071557610714612491565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848361ffff168151811061076757610766612491565b5b602002602001019061ffff16908161ffff1681525050856004018161ffff168154811061079757610796612491565b5b905f5260205f200154836107ab9190612761565b925081806107b890612794565b9250505b80806107c790612794565b91505061069a565b50505f62018a887f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006108229190612761565b10610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990612807565b60405180910390fd5b5f6127107f0000000000000000000000000000000000000000000000000000000000000000876004018b61ffff16815481106108a1576108a0612491565b5b905f5260205f2001546108b49190612825565b6108be9190612893565b90505f6127107f0000000000000000000000000000000000000000000000000000000000000000886004018c61ffff16815481106108ff576108fe612491565b5b905f5260205f2001546109129190612825565b61091c9190612893565b90505f8082848a6004018e61ffff168154811061093c5761093b612491565b5b905f5260205f20015461094f919061272e565b610959919061272e565b90505f5b88518161ffff161015610ba5575f878b6004018a8461ffff168151811061098757610986612491565b5b602002602001015161ffff16815481106109a4576109a3612491565b5b905f5260205f200154846109b89190612825565b6109c29190612893565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8b8461ffff1681518110610a1757610a16612491565b5b6020026020010151838e6004018d8761ffff1681518110610a3b57610a3a612491565b5b602002602001015161ffff1681548110610a5857610a57612491565b5b905f5260205f200154610a6b9190612761565b6040518363ffffffff1660e01b8152600401610a889291906128c3565b6020604051808303815f875af1158015610aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac89190612914565b935083610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190612989565b60405180910390fd5b7f6b5ed972057bb3f9c6b7b2ea6350bf7abde0e0c5f8a765c5dde8402bb2b6efd38f8b8461ffff1681518110610b4357610b42612491565b5b60200260200101518b8561ffff1681518110610b6257610b61612491565b5b602002602001015184604051610b7b94939291906129a7565b60405180910390a18087610b8f9190612761565b9650508080610b9d90612794565b91505061095d565b50507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342966c68846040518263ffffffff1660e01b8152600401610c009190611db6565b5f604051808303815f87803b158015610c17575f80fd5b505af1158015610c29573d5f803e3d5ffd5b505050507fbc03807cbae975b0551ce6caa7b86a1ff549b347e16440847a8c03140f59c27c8c84604051610c5e9291906129ea565b60405180910390a15f83858a6004018e61ffff1681548110610c8357610c82612491565b5b905f5260205f200154610c96919061272e565b610ca0919061272e565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610d1e9291906128c3565b6020604051808303815f875af1158015610d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190612914565b915081610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612a5b565b60405180910390fd5b7f0f771b5d5a6b02378d0d1a6b6b371ac1e69759fb677e46109ae1bb55167ea7ad8d82604051610dd19291906129ea565b60405180910390a1886004018c61ffff1681548110610df357610df2612491565b5b905f5260205f200154818587610e099190612761565b610e139190612761565b14610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612ae9565b60405180910390fd5b50505050505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610eb561191c565b610ebe81610344565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490612640565b60405180910390fd5b5f60025f8360070b60070b81526020019081526020015f2090505f5b81600301805490508161ffff161015611081575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb846003018461ffff1681548110610f8357610f82612491565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856004018561ffff1681548110610fc557610fc4612491565b5b905f5260205f2001546040518363ffffffff1660e01b8152600401610feb9291906128c3565b6020604051808303815f875af1158015611007573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102b9190612914565b90508061106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490612989565b60405180910390fd5b50808061107990612794565b915050610f19565b505f816005015f6101000a81548160ff0219169083151502179055506110a682611a5b565b5050565b60606110b461191c565b60028610156110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef90612b51565b60405180910390fd5b858351111561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612bdf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000085101561119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690612c47565b60405180910390fd5b81518351146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90612caf565b60405180910390fd5b6001835111611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612710565b60405180910390fd5b61123087610344565b15611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790612d3d565b60405180910390fd5b5f805b83518161ffff1610156113205786848261ffff168151811061129857611297612491565b5b602002602001015110156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890612da5565b60405180910390fd5b838161ffff16815181106112f8576112f7612491565b5b60200260200101518261130b9190612761565b9150808061131890612794565b915050611273565b505f5b83518161ffff16101561169457838161ffff168151811061134757611346612491565b5b60200260200101518261135a919061272e565b915081848261ffff168151811061137457611373612491565b5b602002602001015111156113a75781848261ffff168151811061139a57611399612491565b5b6020026020010181815250505b838161ffff16815181106113be576113bd612491565b5b6020026020010151826113d19190612761565b9150838161ffff16815181106113ea576113e9612491565b5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e878461ffff168151811061144557611444612491565b5b6020026020010151306040518363ffffffff1660e01b815260040161146b929190612dc3565b602060405180830381865afa158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa9190612dfe565b10156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290612e73565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd878461ffff168151811061153f5761153e612491565b5b602002602001015130888661ffff168151811061155f5761155e612491565b5b60200260200101516040518463ffffffff1660e01b815260040161158593929190612e91565b6020604051808303815f875af11580156115a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c59190612914565b905080611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90612989565b60405180910390fd5b7f4ca2b6f8214bfec8b3a7c06707618645a8e77d171b22a4eba1d8811fdc30bfdb8a878461ffff16815181106116405761163f612491565b5b602002602001015184888661ffff16815181106116605761165f612491565b5b602002602001015160405161167894939291906129a7565b60405180910390a150808061168c90612794565b915050611323565b5061169d611ba4565b87815f018181525050868160200181815250508581604001818152505084816060018190525083816080018190525060018160a00190151590811515815250508060025f8b60070b60070b81526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301908051906020019061172d929190611be5565b50608082015181600401908051906020019061174a929190611c6c565b5060a0820151816005015f6101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548161ffff021916908361ffff160217905550905050600389908060018154018082558091505060019003905f5260205f2090600491828204019190066008029091909190916101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555083925050509695505050505050565b60038181548110611805575f80fd5b905f5260205f209060049182820401919006600802915054906101000a900460070b81565b61183261191c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790612f36565b60405180910390fd5b6118a98161199a565b50565b6002602052805f5260405f205f91509050805f015490806001015490806002015490806005015f9054906101000a900460ff16908060050160019054906101000a900461ffff16905085565b7f000000000000000000000000000000000000000000000000000000000000000081565b611924611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611942610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198f90612f9e565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5b600380549050811015611b99578160070b60038281548110611a8257611a81612491565b5b905f5260205f2090600491828204019190066008029054906101000a900460070b60070b03611b865760036001600380549050611abf919061272e565b81548110611ad057611acf612491565b5b905f5260205f2090600491828204019190066008029054906101000a900460070b60038281548110611b0557611b04612491565b5b905f5260205f2090600491828204019190066008026101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506003805480611b5357611b52612fbc565b5b600190038181905f5260205f2090600491828204019190066008026101000a81549067ffffffffffffffff021916905590555b8080611b91906124eb565b915050611a5d565b5050565b5f33905090565b6040518060e001604052805f81526020015f81526020015f801916815260200160608152602001606081526020015f151581526020015f61ffff1681525090565b828054828255905f5260205f20908101928215611c5b579160200282015b82811115611c5a578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611c03565b5b509050611c689190611cb7565b5090565b828054828255905f5260205f20908101928215611ca6579160200282015b82811115611ca5578251825591602001919060010190611c8a565b5b509050611cb39190611cb7565b5090565b5b80821115611cce575f815f905550600101611cb8565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f611d14611d0f611d0a84611cd2565b611cf1565b611cd2565b9050919050565b5f611d2582611cfa565b9050919050565b5f611d3682611d1b565b9050919050565b611d4681611d2c565b82525050565b5f602082019050611d5f5f830184611d3d565b92915050565b5f611d6f82611cd2565b9050919050565b611d7f81611d65565b82525050565b5f602082019050611d985f830184611d76565b92915050565b5f819050919050565b611db081611d9e565b82525050565b5f602082019050611dc95f830184611da7565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f8160070b9050919050565b611df581611de0565b8114611dff575f80fd5b50565b5f81359050611e1081611dec565b92915050565b5f60208284031215611e2b57611e2a611dd8565b5b5f611e3884828501611e02565b91505092915050565b5f8115159050919050565b611e5581611e41565b82525050565b5f602082019050611e6e5f830184611e4c565b92915050565b5f61ffff82169050919050565b611e8a81611e74565b8114611e94575f80fd5b50565b5f81359050611ea581611e81565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611ecc57611ecb611eab565b5b8235905067ffffffffffffffff811115611ee957611ee8611eaf565b5b602083019150836020820283011115611f0557611f04611eb3565b5b9250929050565b5f805f8060608587031215611f2457611f23611dd8565b5b5f611f3187828801611e02565b9450506020611f4287828801611e97565b935050604085013567ffffffffffffffff811115611f6357611f62611ddc565b5b611f6f87828801611eb7565b925092505092959194509250565b611f8681611d9e565b8114611f90575f80fd5b50565b5f81359050611fa181611f7d565b92915050565b5f819050919050565b611fb981611fa7565b8114611fc3575f80fd5b50565b5f81359050611fd481611fb0565b92915050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61202082611fda565b810181811067ffffffffffffffff8211171561203f5761203e611fea565b5b80604052505050565b5f612051611dcf565b905061205d8282612017565b919050565b5f67ffffffffffffffff82111561207c5761207b611fea565b5b602082029050602081019050919050565b61209681611d65565b81146120a0575f80fd5b50565b5f813590506120b18161208d565b92915050565b5f6120c96120c484612062565b612048565b905080838252602082019050602084028301858111156120ec576120eb611eb3565b5b835b81811015612115578061210188826120a3565b8452602084019350506020810190506120ee565b5050509392505050565b5f82601f83011261213357612132611eab565b5b81356121438482602086016120b7565b91505092915050565b5f67ffffffffffffffff82111561216657612165611fea565b5b602082029050602081019050919050565b5f6121896121848461214c565b612048565b905080838252602082019050602084028301858111156121ac576121ab611eb3565b5b835b818110156121d557806121c18882611f93565b8452602084019350506020810190506121ae565b5050509392505050565b5f82601f8301126121f3576121f2611eab565b5b8135612203848260208601612177565b91505092915050565b5f805f805f8060c0878903121561222657612225611dd8565b5b5f61223389828a01611e02565b965050602061224489828a01611f93565b955050604061225589828a01611f93565b945050606061226689828a01611fc6565b935050608087013567ffffffffffffffff81111561228757612286611ddc565b5b61229389828a0161211f565b92505060a087013567ffffffffffffffff8111156122b4576122b3611ddc565b5b6122c089828a016121df565b9150509295509295509295565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6122ff81611d9e565b82525050565b5f61231083836122f6565b60208301905092915050565b5f602082019050919050565b5f612332826122cd565b61233c81856122d7565b9350612347836122e7565b805f5b8381101561237757815161235e8882612305565b97506123698361231c565b92505060018101905061234a565b5085935050505092915050565b5f6020820190508181035f83015261239c8184612328565b905092915050565b5f602082840312156123b9576123b8611dd8565b5b5f6123c684828501611f93565b91505092915050565b6123d881611de0565b82525050565b5f6020820190506123f15f8301846123cf565b92915050565b5f6020828403121561240c5761240b611dd8565b5b5f612419848285016120a3565b91505092915050565b61242b81611fa7565b82525050565b61243a81611e74565b82525050565b5f60a0820190506124535f830188611da7565b6124606020830187611da7565b61246d6040830186612422565b61247a6060830185611e4c565b6124876080830184612431565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124f582611d9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612527576125266124be565b5b600182019050919050565b5f82825260208201905092915050565b7f4c6f73657220696e6465782073686f756c646e2774206265207468652073656e5f8201527f74696e656c2076616c7565000000000000000000000000000000000000000000602082015250565b5f61259c602b83612532565b91506125a782612542565b604082019050919050565b5f6020820190508181035f8301526125c981612590565b9050919050565b7f4e6f2067616d6520696e2070726f677265737320666f722074686973204469735f8201527f636f7264206368616e6e656c2049440000000000000000000000000000000000602082015250565b5f61262a602f83612532565b9150612635826125d0565b604082019050919050565b5f6020820190508181035f8301526126578161261e565b9050919050565b7f4c6f73657220696e646578206f7574206f662072616e676500000000000000005f82015250565b5f612692601883612532565b915061269d8261265e565b602082019050919050565b5f6020820190508181035f8301526126bf81612686565b9050919050565b7f4e6f7420656e6f75676820706c617965727300000000000000000000000000005f82015250565b5f6126fa601283612532565b9150612705826126c6565b602082019050919050565b5f6020820190508181035f830152612727816126ee565b9050919050565b5f61273882611d9e565b915061274383611d9e565b925082820390508181111561275b5761275a6124be565b5b92915050565b5f61276b82611d9e565b915061277683611d9e565b925082820190508082111561278e5761278d6124be565b5b92915050565b5f61279e82611e74565b915061ffff82036127b2576127b16124be565b5b600182019050919050565b7f546f74616c2066656573206d757374206265203c2031303025000000000000005f82015250565b5f6127f1601983612532565b91506127fc826127bd565b602082019050919050565b5f6020820190508181035f83015261281e816127e5565b9050919050565b5f61282f82611d9e565b915061283a83611d9e565b925082820261284881611d9e565b9150828204841483151761285f5761285e6124be565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61289d82611d9e565b91506128a883611d9e565b9250826128b8576128b7612866565b5b828204905092915050565b5f6040820190506128d65f830185611d76565b6128e36020830184611da7565b9392505050565b6128f381611e41565b81146128fd575f80fd5b50565b5f8151905061290e816128ea565b92915050565b5f6020828403121561292957612928611dd8565b5b5f61293684828501612900565b91505092915050565b7f46756e6473207472616e73666572206661696c656400000000000000000000005f82015250565b5f612973601583612532565b915061297e8261293f565b602082019050919050565b5f6020820190508181035f8301526129a081612967565b9050919050565b5f6080820190506129ba5f8301876123cf565b6129c76020830186611d76565b6129d46040830185612431565b6129e16060830184611da7565b95945050505050565b5f6040820190506129fd5f8301856123cf565b612a0a6020830184611da7565b9392505050565b7f526576656e7565207472616e73666572206661696c65640000000000000000005f82015250565b5f612a45601783612532565b9150612a5082612a11565b602082019050919050565b5f6020820190508181035f830152612a7281612a39565b9050919050565b7f43616c63756c617465642077696e6e696e677320646f206e6f742061646420755f8201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b5f612ad3602183612532565b9150612ade82612a79565b604082019050919050565b5f6020820190508181035f830152612b0081612ac7565b9050919050565b7f5265766f6c7665722073697a6520746f6f20736d616c6c0000000000000000005f82015250565b5f612b3b601783612532565b9150612b4682612b07565b602082019050919050565b5f6020820190508181035f830152612b6881612b2f565b9050919050565b7f546f6f206d616e7920706c617965727320666f7220746869732073697a6520725f8201527f65766f6c76657200000000000000000000000000000000000000000000000000602082015250565b5f612bc9602783612532565b9150612bd482612b6f565b604082019050919050565b5f6020820190508181035f830152612bf681612bbd565b9050919050565b7f4d696e696d756d2062657420746f6f20736d616c6c00000000000000000000005f82015250565b5f612c31601583612532565b9150612c3c82612bfd565b602082019050919050565b5f6020820190508181035f830152612c5e81612c25565b9050919050565b7f506c61796572732f62657473206c656e677468206d69736d61746368000000005f82015250565b5f612c99601c83612532565b9150612ca482612c65565b602082019050919050565b5f6020820190508181035f830152612cc681612c8d565b9050919050565b7f546865726520697320616c726561647920612067616d6520696e2070726f67725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612d27602383612532565b9150612d3282612ccd565b604082019050919050565b5f6020820190508181035f830152612d5481612d1b565b9050919050565b7f42657420697320736d616c6c6572207468616e20746865206d696e696d756d005f82015250565b5f612d8f601f83612532565b9150612d9a82612d5b565b602082019050919050565b5f6020820190508181035f830152612dbc81612d83565b9050919050565b5f604082019050612dd65f830185611d76565b612de36020830184611d76565b9392505050565b5f81519050612df881611f7d565b92915050565b5f60208284031215612e1357612e12611dd8565b5b5f612e2084828501612dea565b91505092915050565b7f4e6f7420656e6f75676820616c6c6f77616e63650000000000000000000000005f82015250565b5f612e5d601483612532565b9150612e6882612e29565b602082019050919050565b5f6020820190508181035f830152612e8a81612e51565b9050919050565b5f606082019050612ea45f830186611d76565b612eb16020830185611d76565b612ebe6040830184611da7565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612f20602683612532565b9150612f2b82612ec6565b604082019050919050565b5f6020820190508181035f830152612f4d81612f14565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612f88602083612532565b9150612f9382612f54565b602082019050919050565b5f6020820190508181035f830152612fb581612f7c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220954a01e9d8c0a09458367c45988f82efbb33682e70f4c63bc00c088e3c0e354f64736f6c63430008150033000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8300000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000006400000000000000000000000001b77b047a128b50ecdda3b1bec7798415ee0e3d
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100f3575f3560e01c80638da5cb5b11610095578063d057fc1f11610064578063d057fc1f14610239578063f2fde38b14610269578063f361971614610285578063ff08aa49146102b9576100f3565b80638da5cb5b146101b1578063c38a8afd146101cf578063cb99e91f146101ed578063ceb7ec0414610209576100f3565b806363c42460116100d157806363c42460146101515780636581673114610181578063715018a61461018b57806388b7904d14610195576100f3565b806343425e88146100f7578063444784251461011557806353deb3d614610133575b5f80fd5b6100ff6102d7565b60405161010c9190611d4c565b60405180910390f35b61011d6102fb565b60405161012a9190611d85565b60405180910390f35b61013b610320565b6040516101489190611db6565b60405180910390f35b61016b60048036038101906101669190611e16565b610344565b6040516101789190611e5b565b60405180910390f35b610189610373565b005b610193610437565b005b6101af60048036038101906101aa9190611f0c565b61044a565b005b6101b9610e62565b6040516101c69190611d85565b60405180910390f35b6101d7610e89565b6040516101e49190611db6565b60405180910390f35b61020760048036038101906102029190611e16565b610ead565b005b610223600480360381019061021e919061220c565b6110aa565b6040516102309190612384565b60405180910390f35b610253600480360381019061024e91906123a4565b6117f6565b60405161026091906123de565b60405180910390f35b610283600480360381019061027e91906123f7565b61182a565b005b61029f600480360381019061029a9190611e16565b6118ac565b6040516102b0959493929190612440565b60405180910390f35b6102c16118f8565b6040516102ce9190611db6565b60405180910390f35b7f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8381565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000006481565b5f60025f8360070b60070b81526020019081526020015f206005015f9054906101000a900460ff169050919050565b61037b61191c565b5f60038054806020026020016040519081016040528092919081815260200182805480156103eb57602002820191905f5260205f20905f905b82829054906101000a900460070b60070b815260200190600801906020826007010492830192600103820291508084116103b45790505b505050505090505f5b81518110156104335761042082828151811061041357610412612491565b5b6020026020010151610ead565b808061042b906124eb565b9150506103f4565b5050565b61043f61191c565b6104485f61199a565b565b61045261191c565b61ffff80168361ffff160361049c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610493906125b2565b60405180910390fd5b6104a584610344565b6104e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104db90612640565b60405180910390fd5b5f60025f8660070b60070b81526020019081526020015f20905080600301805490508461ffff161061054b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610542906126a8565b60405180910390fd5b6001816003018054905011610595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058c90612710565b60405180910390fd5b838160050160016101000a81548161ffff021916908361ffff1602179055505f816005015f6101000a81548160ff0219169083151502179055506105d885611a5b565b5f600182600301805490506105ed919061272e565b67ffffffffffffffff81111561060657610605611fea565b5b6040519080825280602002602001820160405280156106345781602001602082028036833780820191505090505b5090505f6001836003018054905061064c919061272e565b67ffffffffffffffff81111561066557610664611fea565b5b6040519080825280602002602001820160405280156106935781602001602082028036833780820191505090505b5090505f805f5b85600301805490508161ffff1610156107cf578861ffff168161ffff16146107bc57856003018161ffff16815481106106d6576106d5612491565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858361ffff168151811061071557610714612491565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848361ffff168151811061076757610766612491565b5b602002602001019061ffff16908161ffff1681525050856004018161ffff168154811061079757610796612491565b5b905f5260205f200154836107ab9190612761565b925081806107b890612794565b9250505b80806107c790612794565b91505061069a565b50505f62018a887f00000000000000000000000000000000000000000000000000000000000003847f00000000000000000000000000000000000000000000000000000000000000646108229190612761565b10610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990612807565b60405180910390fd5b5f6127107f0000000000000000000000000000000000000000000000000000000000000064876004018b61ffff16815481106108a1576108a0612491565b5b905f5260205f2001546108b49190612825565b6108be9190612893565b90505f6127107f0000000000000000000000000000000000000000000000000000000000000384886004018c61ffff16815481106108ff576108fe612491565b5b905f5260205f2001546109129190612825565b61091c9190612893565b90505f8082848a6004018e61ffff168154811061093c5761093b612491565b5b905f5260205f20015461094f919061272e565b610959919061272e565b90505f5b88518161ffff161015610ba5575f878b6004018a8461ffff168151811061098757610986612491565b5b602002602001015161ffff16815481106109a4576109a3612491565b5b905f5260205f200154846109b89190612825565b6109c29190612893565b90507f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8b8461ffff1681518110610a1757610a16612491565b5b6020026020010151838e6004018d8761ffff1681518110610a3b57610a3a612491565b5b602002602001015161ffff1681548110610a5857610a57612491565b5b905f5260205f200154610a6b9190612761565b6040518363ffffffff1660e01b8152600401610a889291906128c3565b6020604051808303815f875af1158015610aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac89190612914565b935083610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190612989565b60405180910390fd5b7f6b5ed972057bb3f9c6b7b2ea6350bf7abde0e0c5f8a765c5dde8402bb2b6efd38f8b8461ffff1681518110610b4357610b42612491565b5b60200260200101518b8561ffff1681518110610b6257610b61612491565b5b602002602001015184604051610b7b94939291906129a7565b60405180910390a18087610b8f9190612761565b9650508080610b9d90612794565b91505061095d565b50507f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff166342966c68846040518263ffffffff1660e01b8152600401610c009190611db6565b5f604051808303815f87803b158015610c17575f80fd5b505af1158015610c29573d5f803e3d5ffd5b505050507fbc03807cbae975b0551ce6caa7b86a1ff549b347e16440847a8c03140f59c27c8c84604051610c5e9291906129ea565b60405180910390a15f83858a6004018e61ffff1681548110610c8357610c82612491565b5b905f5260205f200154610c96919061272e565b610ca0919061272e565b90507f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610d1e9291906128c3565b6020604051808303815f875af1158015610d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190612914565b915081610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612a5b565b60405180910390fd5b7f0f771b5d5a6b02378d0d1a6b6b371ac1e69759fb677e46109ae1bb55167ea7ad8d82604051610dd19291906129ea565b60405180910390a1886004018c61ffff1681548110610df357610df2612491565b5b905f5260205f200154818587610e099190612761565b610e139190612761565b14610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612ae9565b60405180910390fd5b50505050505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f00000000000000000000000000000000000000000000000000000000000003e881565b610eb561191c565b610ebe81610344565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490612640565b60405180910390fd5b5f60025f8360070b60070b81526020019081526020015f2090505f5b81600301805490508161ffff161015611081575f7f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb846003018461ffff1681548110610f8357610f82612491565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856004018561ffff1681548110610fc557610fc4612491565b5b905f5260205f2001546040518363ffffffff1660e01b8152600401610feb9291906128c3565b6020604051808303815f875af1158015611007573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102b9190612914565b90508061106d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106490612989565b60405180910390fd5b50808061107990612794565b915050610f19565b505f816005015f6101000a81548160ff0219169083151502179055506110a682611a5b565b5050565b60606110b461191c565b60028610156110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef90612b51565b60405180910390fd5b858351111561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612bdf565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e885101561119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690612c47565b60405180910390fd5b81518351146111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90612caf565b60405180910390fd5b6001835111611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612710565b60405180910390fd5b61123087610344565b15611270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126790612d3d565b60405180910390fd5b5f805b83518161ffff1610156113205786848261ffff168151811061129857611297612491565b5b602002602001015110156112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890612da5565b60405180910390fd5b838161ffff16815181106112f8576112f7612491565b5b60200260200101518261130b9190612761565b9150808061131890612794565b915050611273565b505f5b83518161ffff16101561169457838161ffff168151811061134757611346612491565b5b60200260200101518261135a919061272e565b915081848261ffff168151811061137457611373612491565b5b602002602001015111156113a75781848261ffff168151811061139a57611399612491565b5b6020026020010181815250505b838161ffff16815181106113be576113bd612491565b5b6020026020010151826113d19190612761565b9150838161ffff16815181106113ea576113e9612491565b5b60200260200101517f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e878461ffff168151811061144557611444612491565b5b6020026020010151306040518363ffffffff1660e01b815260040161146b929190612dc3565b602060405180830381865afa158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa9190612dfe565b10156114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290612e73565b60405180910390fd5b5f7f000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8373ffffffffffffffffffffffffffffffffffffffff166323b872dd878461ffff168151811061153f5761153e612491565b5b602002602001015130888661ffff168151811061155f5761155e612491565b5b60200260200101516040518463ffffffff1660e01b815260040161158593929190612e91565b6020604051808303815f875af11580156115a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c59190612914565b905080611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90612989565b60405180910390fd5b7f4ca2b6f8214bfec8b3a7c06707618645a8e77d171b22a4eba1d8811fdc30bfdb8a878461ffff16815181106116405761163f612491565b5b602002602001015184888661ffff16815181106116605761165f612491565b5b602002602001015160405161167894939291906129a7565b60405180910390a150808061168c90612794565b915050611323565b5061169d611ba4565b87815f018181525050868160200181815250508581604001818152505084816060018190525083816080018190525060018160a00190151590811515815250508060025f8b60070b60070b81526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301908051906020019061172d929190611be5565b50608082015181600401908051906020019061174a929190611c6c565b5060a0820151816005015f6101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548161ffff021916908361ffff160217905550905050600389908060018154018082558091505060019003905f5260205f2090600491828204019190066008029091909190916101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff16021790555083925050509695505050505050565b60038181548110611805575f80fd5b905f5260205f209060049182820401919006600802915054906101000a900460070b81565b61183261191c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790612f36565b60405180910390fd5b6118a98161199a565b50565b6002602052805f5260405f205f91509050805f015490806001015490806002015490806005015f9054906101000a900460ff16908060050160019054906101000a900461ffff16905085565b7f000000000000000000000000000000000000000000000000000000000000038481565b611924611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611942610e62565b73ffffffffffffffffffffffffffffffffffffffff1614611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198f90612f9e565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5b600380549050811015611b99578160070b60038281548110611a8257611a81612491565b5b905f5260205f2090600491828204019190066008029054906101000a900460070b60070b03611b865760036001600380549050611abf919061272e565b81548110611ad057611acf612491565b5b905f5260205f2090600491828204019190066008029054906101000a900460070b60038281548110611b0557611b04612491565b5b905f5260205f2090600491828204019190066008026101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff1602179055506003805480611b5357611b52612fbc565b5b600190038181905f5260205f2090600491828204019190066008026101000a81549067ffffffffffffffff021916905590555b8080611b91906124eb565b915050611a5d565b5050565b5f33905090565b6040518060e001604052805f81526020015f81526020015f801916815260200160608152602001606081526020015f151581526020015f61ffff1681525090565b828054828255905f5260205f20908101928215611c5b579160200282015b82811115611c5a578251825f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611c03565b5b509050611c689190611cb7565b5090565b828054828255905f5260205f20908101928215611ca6579160200282015b82811115611ca5578251825591602001919060010190611c8a565b5b509050611cb39190611cb7565b5090565b5b80821115611cce575f815f905550600101611cb8565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f611d14611d0f611d0a84611cd2565b611cf1565b611cd2565b9050919050565b5f611d2582611cfa565b9050919050565b5f611d3682611d1b565b9050919050565b611d4681611d2c565b82525050565b5f602082019050611d5f5f830184611d3d565b92915050565b5f611d6f82611cd2565b9050919050565b611d7f81611d65565b82525050565b5f602082019050611d985f830184611d76565b92915050565b5f819050919050565b611db081611d9e565b82525050565b5f602082019050611dc95f830184611da7565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f8160070b9050919050565b611df581611de0565b8114611dff575f80fd5b50565b5f81359050611e1081611dec565b92915050565b5f60208284031215611e2b57611e2a611dd8565b5b5f611e3884828501611e02565b91505092915050565b5f8115159050919050565b611e5581611e41565b82525050565b5f602082019050611e6e5f830184611e4c565b92915050565b5f61ffff82169050919050565b611e8a81611e74565b8114611e94575f80fd5b50565b5f81359050611ea581611e81565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611ecc57611ecb611eab565b5b8235905067ffffffffffffffff811115611ee957611ee8611eaf565b5b602083019150836020820283011115611f0557611f04611eb3565b5b9250929050565b5f805f8060608587031215611f2457611f23611dd8565b5b5f611f3187828801611e02565b9450506020611f4287828801611e97565b935050604085013567ffffffffffffffff811115611f6357611f62611ddc565b5b611f6f87828801611eb7565b925092505092959194509250565b611f8681611d9e565b8114611f90575f80fd5b50565b5f81359050611fa181611f7d565b92915050565b5f819050919050565b611fb981611fa7565b8114611fc3575f80fd5b50565b5f81359050611fd481611fb0565b92915050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61202082611fda565b810181811067ffffffffffffffff8211171561203f5761203e611fea565b5b80604052505050565b5f612051611dcf565b905061205d8282612017565b919050565b5f67ffffffffffffffff82111561207c5761207b611fea565b5b602082029050602081019050919050565b61209681611d65565b81146120a0575f80fd5b50565b5f813590506120b18161208d565b92915050565b5f6120c96120c484612062565b612048565b905080838252602082019050602084028301858111156120ec576120eb611eb3565b5b835b81811015612115578061210188826120a3565b8452602084019350506020810190506120ee565b5050509392505050565b5f82601f83011261213357612132611eab565b5b81356121438482602086016120b7565b91505092915050565b5f67ffffffffffffffff82111561216657612165611fea565b5b602082029050602081019050919050565b5f6121896121848461214c565b612048565b905080838252602082019050602084028301858111156121ac576121ab611eb3565b5b835b818110156121d557806121c18882611f93565b8452602084019350506020810190506121ae565b5050509392505050565b5f82601f8301126121f3576121f2611eab565b5b8135612203848260208601612177565b91505092915050565b5f805f805f8060c0878903121561222657612225611dd8565b5b5f61223389828a01611e02565b965050602061224489828a01611f93565b955050604061225589828a01611f93565b945050606061226689828a01611fc6565b935050608087013567ffffffffffffffff81111561228757612286611ddc565b5b61229389828a0161211f565b92505060a087013567ffffffffffffffff8111156122b4576122b3611ddc565b5b6122c089828a016121df565b9150509295509295509295565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6122ff81611d9e565b82525050565b5f61231083836122f6565b60208301905092915050565b5f602082019050919050565b5f612332826122cd565b61233c81856122d7565b9350612347836122e7565b805f5b8381101561237757815161235e8882612305565b97506123698361231c565b92505060018101905061234a565b5085935050505092915050565b5f6020820190508181035f83015261239c8184612328565b905092915050565b5f602082840312156123b9576123b8611dd8565b5b5f6123c684828501611f93565b91505092915050565b6123d881611de0565b82525050565b5f6020820190506123f15f8301846123cf565b92915050565b5f6020828403121561240c5761240b611dd8565b5b5f612419848285016120a3565b91505092915050565b61242b81611fa7565b82525050565b61243a81611e74565b82525050565b5f60a0820190506124535f830188611da7565b6124606020830187611da7565b61246d6040830186612422565b61247a6060830185611e4c565b6124876080830184612431565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124f582611d9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612527576125266124be565b5b600182019050919050565b5f82825260208201905092915050565b7f4c6f73657220696e6465782073686f756c646e2774206265207468652073656e5f8201527f74696e656c2076616c7565000000000000000000000000000000000000000000602082015250565b5f61259c602b83612532565b91506125a782612542565b604082019050919050565b5f6020820190508181035f8301526125c981612590565b9050919050565b7f4e6f2067616d6520696e2070726f677265737320666f722074686973204469735f8201527f636f7264206368616e6e656c2049440000000000000000000000000000000000602082015250565b5f61262a602f83612532565b9150612635826125d0565b604082019050919050565b5f6020820190508181035f8301526126578161261e565b9050919050565b7f4c6f73657220696e646578206f7574206f662072616e676500000000000000005f82015250565b5f612692601883612532565b915061269d8261265e565b602082019050919050565b5f6020820190508181035f8301526126bf81612686565b9050919050565b7f4e6f7420656e6f75676820706c617965727300000000000000000000000000005f82015250565b5f6126fa601283612532565b9150612705826126c6565b602082019050919050565b5f6020820190508181035f830152612727816126ee565b9050919050565b5f61273882611d9e565b915061274383611d9e565b925082820390508181111561275b5761275a6124be565b5b92915050565b5f61276b82611d9e565b915061277683611d9e565b925082820190508082111561278e5761278d6124be565b5b92915050565b5f61279e82611e74565b915061ffff82036127b2576127b16124be565b5b600182019050919050565b7f546f74616c2066656573206d757374206265203c2031303025000000000000005f82015250565b5f6127f1601983612532565b91506127fc826127bd565b602082019050919050565b5f6020820190508181035f83015261281e816127e5565b9050919050565b5f61282f82611d9e565b915061283a83611d9e565b925082820261284881611d9e565b9150828204841483151761285f5761285e6124be565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61289d82611d9e565b91506128a883611d9e565b9250826128b8576128b7612866565b5b828204905092915050565b5f6040820190506128d65f830185611d76565b6128e36020830184611da7565b9392505050565b6128f381611e41565b81146128fd575f80fd5b50565b5f8151905061290e816128ea565b92915050565b5f6020828403121561292957612928611dd8565b5b5f61293684828501612900565b91505092915050565b7f46756e6473207472616e73666572206661696c656400000000000000000000005f82015250565b5f612973601583612532565b915061297e8261293f565b602082019050919050565b5f6020820190508181035f8301526129a081612967565b9050919050565b5f6080820190506129ba5f8301876123cf565b6129c76020830186611d76565b6129d46040830185612431565b6129e16060830184611da7565b95945050505050565b5f6040820190506129fd5f8301856123cf565b612a0a6020830184611da7565b9392505050565b7f526576656e7565207472616e73666572206661696c65640000000000000000005f82015250565b5f612a45601783612532565b9150612a5082612a11565b602082019050919050565b5f6020820190508181035f830152612a7281612a39565b9050919050565b7f43616c63756c617465642077696e6e696e677320646f206e6f742061646420755f8201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b5f612ad3602183612532565b9150612ade82612a79565b604082019050919050565b5f6020820190508181035f830152612b0081612ac7565b9050919050565b7f5265766f6c7665722073697a6520746f6f20736d616c6c0000000000000000005f82015250565b5f612b3b601783612532565b9150612b4682612b07565b602082019050919050565b5f6020820190508181035f830152612b6881612b2f565b9050919050565b7f546f6f206d616e7920706c617965727320666f7220746869732073697a6520725f8201527f65766f6c76657200000000000000000000000000000000000000000000000000602082015250565b5f612bc9602783612532565b9150612bd482612b6f565b604082019050919050565b5f6020820190508181035f830152612bf681612bbd565b9050919050565b7f4d696e696d756d2062657420746f6f20736d616c6c00000000000000000000005f82015250565b5f612c31601583612532565b9150612c3c82612bfd565b602082019050919050565b5f6020820190508181035f830152612c5e81612c25565b9050919050565b7f506c61796572732f62657473206c656e677468206d69736d61746368000000005f82015250565b5f612c99601c83612532565b9150612ca482612c65565b602082019050919050565b5f6020820190508181035f830152612cc681612c8d565b9050919050565b7f546865726520697320616c726561647920612067616d6520696e2070726f67725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612d27602383612532565b9150612d3282612ccd565b604082019050919050565b5f6020820190508181035f830152612d5481612d1b565b9050919050565b7f42657420697320736d616c6c6572207468616e20746865206d696e696d756d005f82015250565b5f612d8f601f83612532565b9150612d9a82612d5b565b602082019050919050565b5f6020820190508181035f830152612dbc81612d83565b9050919050565b5f604082019050612dd65f830185611d76565b612de36020830184611d76565b9392505050565b5f81519050612df881611f7d565b92915050565b5f60208284031215612e1357612e12611dd8565b5b5f612e2084828501612dea565b91505092915050565b7f4e6f7420656e6f75676820616c6c6f77616e63650000000000000000000000005f82015250565b5f612e5d601483612532565b9150612e6882612e29565b602082019050919050565b5f6020820190508181035f830152612e8a81612e51565b9050919050565b5f606082019050612ea45f830186611d76565b612eb16020830185611d76565b612ebe6040830184611da7565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612f20602683612532565b9150612f2b82612ec6565b604082019050919050565b5f6020820190508181035f830152612f4d81612f14565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612f88602083612532565b9150612f9382612f54565b602082019050919050565b5f6020820190508181035f830152612fb581612f7c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220954a01e9d8c0a09458367c45988f82efbb33682e70f4c63bc00c088e3c0e354f64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f8300000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000006400000000000000000000000001b77b047a128b50ecdda3b1bec7798415ee0e3d
-----Decoded View---------------
Arg [0] : _bettingToken (address): 0xC43a652d9A7A936b6F2c4EB45505A84eA4e50f83
Arg [1] : _minimumBet (uint256): 1000
Arg [2] : _revenueBps (uint256): 900
Arg [3] : _burnBps (uint256): 100
Arg [4] : _revenueWallet (address): 0x01b77b047A128B50eCdDa3B1bec7798415Ee0e3D
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000c43a652d9a7a936b6f2c4eb45505a84ea4e50f83
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000384
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 00000000000000000000000001b77b047a128b50ecdda3b1bec7798415ee0e3d
Deployed Bytecode Sourcemap
31852:10053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31939:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31902:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32187:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33978:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41578:324;;;:::i;:::-;;2870:103;;;:::i;:::-;;37888:2939;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2222:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31990:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41010:500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35045:2210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32451:29;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3128:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32276:35;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;32090;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31939:42;;;:::o;31902:28::-;;;;;;;;;;;;;:::o;32187:32::-;;;:::o;33978:139::-;34050:4;34074:5;:24;34080:17;34074:24;;;;;;;;;;;;;;;:35;;;;;;;;;;;;34067:42;;33978:139;;;:::o;41578:324::-;2108:13;:11;:13::i;:::-;41728:30:::1;41761:14;41728:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41791:9;41786:109;41810:15;:22;41806:1;:26;41786:109;;;41854:29;41864:15;41880:1;41864:18;;;;;;;;:::i;:::-;;;;;;;;41854:9;:29::i;:::-;41834:3;;;;;:::i;:::-;;;;41786:109;;;;41620:282;41578:324::o:0;2870:103::-;2108:13;:11;:13::i;:::-;2935:30:::1;2962:1;2935:18;:30::i;:::-;2870:103::o:0;37888:2939::-;2108:13;:11;:13::i;:::-;38038:16:::1;38028:26:::0;::::1;:6;:26;;::::0;38020:82:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38121:35;38138:17;38121:16;:35::i;:::-;38113:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38221:14;38238:5;:24;38244:17;38238:24;;;;;;;;;;;;;;;38221:41;;38292:1;:9;;:16;;;;38283:6;:25;;;38275:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;38375:1;38356;:9;;:16;;;;:20;38348:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38422:6;38412:1;:7;;;:16;;;;;;;;;;;;;;;;;;38454:5;38439:1;:12;;;:20;;;;;;;;;;;;;;;;;;38470:29;38481:17;38470:10;:29::i;:::-;38540:24;38600:1;38581;:9;;:16;;;;:20;;;;:::i;:::-;38567:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38540:62;;38613:34;38682:1;38663;:9;;:16;;;;:20;;;;:::i;:::-;38650:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38613:71;;38740:23;38861:17:::0;38902:8:::1;38897:317;38920:1;:9;;:16;;;;38916:1;:20;;;38897:317;;;38971:6;38966:11;;:1;:11;;;38962:237;;39024:1;:9;;39034:1;39024:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39002:7;39010:10;39002:19;;;;;;;;;;:::i;:::-;;;;;;;:34;;;;;;;;;::::0;::::1;39092:1;39059:18;39078:10;39059:30;;;;;;;;;;:::i;:::-;;;;;;;:34;;;;;;;;;::::0;::::1;39135:1;:6;;39142:1;39135:9;;;;;;;;;;:::i;:::-;;;;;;;;;;39116:28;;;;;:::i;:::-;;;39167:12;;;;;:::i;:::-;;;;38962:237;38938:3;;;;;:::i;:::-;;;;38897:317;;;;38846:379;39237:25;39308:7;39295:10;39285:7;:20;;;;:::i;:::-;:30;39277:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39399:17;39446:6;39436:7;39419:1;:6;;39426;39419:14;;;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;;:::i;:::-;:33;;;;:::i;:::-;39399:53;;39647:26;39706:6;39693:10;39676:1;:6;;39683;39676:14;;;;;;;;;;:::i;:::-;;;;;;;;;;:27;;;;:::i;:::-;:36;;;;:::i;:::-;39647:65;;39725:11;39762:21:::0;39815:18:::1;39803:9;39786:1;:6;;39793;39786:14;;;;;;;;;;:::i;:::-;;;;;;;;;;:26;;;;:::i;:::-;:47;;;;:::i;:::-;39762:71;;39855:8;39850:468;39873:7;:14;39869:1;:18;;;39850:468;;;39913:16;39980:15;39948:1;:6;;39955:18;39974:1;39955:21;;;;;;;;;;:::i;:::-;;;;;;;;39948:29;;;;;;;;;;:::i;:::-;;;;;;;;;;39932:13;:45;;;;:::i;:::-;:63;;;;:::i;:::-;39913:82;;40025:12;:21;;;40047:7;40055:1;40047:10;;;;;;;;;;:::i;:::-;;;;;;;;40091:8;40059:1;:6;;40066:18;40085:1;40066:21;;;;;;;;;;:::i;:::-;;;;;;;;40059:29;;;;;;;;;;:::i;:::-;;;;;;;;;;:40;;;;:::i;:::-;40025:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40016:84;;40127:6;40119:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;40185:67;40189:17;40208:7;40216:1;40208:10;;;;;;;;;;:::i;:::-;;;;;;;;40220:18;40239:1;40220:21;;;;;;;;;;:::i;:::-;;;;;;;;40243:8;40185:67;;;;;;;;;:::i;:::-;;;;;;;;40294:8;40273:29;;;;;:::i;:::-;;;39894:424;39889:3;;;;;:::i;:::-;;;;39850:468;;;;39747:582;40341:12;:17;;;40359:9;40341:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40385:34;40390:17;40409:9;40385:34;;;;;;;:::i;:::-;;;;;;;;40432:24;40496:9;40476:17;40459:1;:6;;40466;40459:14;;;;;;;;;;:::i;:::-;;;;;;;;;;:34;;;;:::i;:::-;:46;;;;:::i;:::-;40432:73;;40525:12;:21;;;40547:13;;;;;;;;;;;40562:16;40525:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40516:63;;40598:6;40590:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;40648:44;40656:17;40675:16;40648:44;;;;;;;:::i;:::-;;;;;;;;40767:1;:6;;40774;40767:14;;;;;;;;;;:::i;:::-;;;;;;;;;;40746:16;40734:9;40714:17;:29;;;;:::i;:::-;:48;;;;:::i;:::-;40713:68;40705:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;38009:2818;;;;;;;;;37888:2939:::0;;;;:::o;2222:87::-;2268:7;2295:6;;;;;;;;;;;2288:13;;2222:87;:::o;31990:35::-;;;:::o;41010:500::-;2108:13;:11;:13::i;:::-;41090:35:::1;41107:17;41090:16;:35::i;:::-;41082:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41188:14;41205:5;:24;41211:17;41205:24;;;;;;;;;;;;;;;41188:41;;41247:8;41242:188;41265:1;:9;;:16;;;;41261:1;:20;;;41242:188;;;41303:11;41317:12;:21;;;41339:1;:9;;41349:1;41339:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41353:1;:6;;41360:1;41353:9;;;;;;;;;;:::i;:::-;;;;;;;;;;41317:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41303:60;;41386:6;41378:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;41288:142;41283:3;;;;;:::i;:::-;;;;41242:188;;;;41457:5;41442:1;:12;;;:20;;;;;;;;;;;;;;;;;;41473:29;41484:17;41473:10;:29::i;:::-;41071:439;41010:500:::0;:::o;35045:2210::-;35294:16;2108:13;:11;:13::i;:::-;35348:1:::1;35331:13;:18;;35323:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;35415:13;35396:8;:15;:32;;35388:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;35502:10;35491:7;:21;;35483:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35576:5;:12;35557:8;:15;:31;35549:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35658:1;35640:8;:15;:19;35632:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;35702:35;35719:17;35702:16;:35::i;:::-;35701:36;35693:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;36132:16;36168:8:::0;36163:167:::1;36186:5;:12;36182:1;:16;;;36163:167;;;36240:7;36228:5;36234:1;36228:8;;;;;;;;;;:::i;:::-;;;;;;;;:19;;36220:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36310:5;36316:1;36310:8;;;;;;;;;;:::i;:::-;;;;;;;;36298:20;;;;;:::i;:::-;;;36200:3;;;;;:::i;:::-;;;;36163:167;;;;36345:8;36340:546;36363:5;:12;36359:1;:16;;;36340:546;;;36409:5;36415:1;36409:8;;;;;;;;;;:::i;:::-;;;;;;;;36397:20;;;;;:::i;:::-;;;36447:8;36436:5;36442:1;36436:8;;;;;;;;;;:::i;:::-;;;;;;;;:19;36432:79;;;36487:8;36476:5;36482:1;36476:8;;;;;;;;;;:::i;:::-;;;;;;;:19;;;::::0;::::1;36432:79;36537:5;36543:1;36537:8;;;;;;;;;;:::i;:::-;;;;;;;;36525:20;;;;;:::i;:::-;;;36624:5;36630:1;36624:8;;;;;;;;;;:::i;:::-;;;;;;;;36570:12;:22;;;36593:8;36602:1;36593:11;;;;;;;;;;:::i;:::-;;;;;;;;36614:4;36570:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;36562:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36672:11;36686:12;:25;;;36712:8;36721:1;36712:11;;;;;;;;;;:::i;:::-;;;;;;;;36733:4;36740:5;36746:1;36740:8;;;;;;;;;;:::i;:::-;;;;;;;;36686:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36672:77;;36772:6;36764:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;36826:48;36830:17;36849:8;36858:1;36849:11;;;;;;;;;;:::i;:::-;;;;;;;;36862:1;36865:5;36871:1;36865:8;;;;;;;;;;:::i;:::-;;;;;;;;36826:48;;;;;;;;;:::i;:::-;;;;;;;;36382:504;36377:3;;;;;:::i;:::-;;;;36340:546;;;;36898:13;;:::i;:::-;36939;36922:1;:14;;:30;;;::::0;::::1;36974:7;36963:1;:8;;:18;;;::::0;::::1;37021:25;36992:1;:26;;:54;;;::::0;::::1;37069:8;37057:1;:9;;:20;;;;37097:5;37088:1;:6;;:14;;;;37128:4;37113:1;:12;;:19;;;;;;;;;::::0;::::1;37172:1;37145:5;:24;37151:17;37145:24;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37184:14;37204:17;37184:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37242:5;37235:12;;;;35045:2210:::0;;;;;;;;:::o;32451:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3128:201::-;2108:13;:11;:13::i;:::-;3237:1:::1;3217:22;;:8;:22;;::::0;3209:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3293:28;3312:8;3293:18;:28::i;:::-;3128:201:::0;:::o;32276:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32090:::-;;;:::o;2387:132::-;2462:12;:10;:12::i;:::-;2451:23;;:7;:5;:7::i;:::-;:23;;;2443:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2387:132::o;3489:191::-;3563:16;3582:6;;;;;;;;;;;3563:25;;3608:8;3599:6;;:17;;;;;;;;;;;;;;;;;;3663:8;3632:40;;3653:8;3632:40;;;;;;;;;;;;3552:128;3489:191;:::o;34262:329::-;34332:9;34327:257;34351:14;:21;;;;34347:1;:25;34327:257;;;34419:17;34398:38;;:14;34413:1;34398:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;34394:179;;34477:14;34516:1;34492:14;:21;;;;:25;;;;:::i;:::-;34477:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34457:14;34472:1;34457:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;;34537:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34394:179;34374:3;;;;;:::i;:::-;;;;34327:257;;;;34262:329;:::o;931:98::-;984:7;1011:10;1004:17;;931:98;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:134::-;411:9;444:37;475:5;444:37;:::i;:::-;431:50;;353:134;;;:::o;493:163::-;572:9;605:45;644:5;605:45;:::i;:::-;592:58;;493:163;;;:::o;662:189::-;778:66;838:5;778:66;:::i;:::-;773:3;766:79;662:189;;:::o;857:280::-;979:4;1017:2;1006:9;1002:18;994:26;;1030:100;1127:1;1116:9;1112:17;1103:6;1030:100;:::i;:::-;857:280;;;;:::o;1143:96::-;1180:7;1209:24;1227:5;1209:24;:::i;:::-;1198:35;;1143:96;;;:::o;1245:118::-;1332:24;1350:5;1332:24;:::i;:::-;1327:3;1320:37;1245:118;;:::o;1369:222::-;1462:4;1500:2;1489:9;1485:18;1477:26;;1513:71;1581:1;1570:9;1566:17;1557:6;1513:71;:::i;:::-;1369:222;;;;:::o;1597:77::-;1634:7;1663:5;1652:16;;1597:77;;;:::o;1680:118::-;1767:24;1785:5;1767:24;:::i;:::-;1762:3;1755:37;1680:118;;:::o;1804:222::-;1897:4;1935:2;1924:9;1920:18;1912:26;;1948:71;2016:1;2005:9;2001:17;1992:6;1948:71;:::i;:::-;1804:222;;;;:::o;2032:75::-;2065:6;2098:2;2092:9;2082:19;;2032:75;:::o;2113:117::-;2222:1;2219;2212:12;2236:117;2345:1;2342;2335:12;2359:90;2394:7;2437:5;2434:1;2423:20;2412:31;;2359:90;;;:::o;2455:118::-;2526:22;2542:5;2526:22;:::i;:::-;2519:5;2516:33;2506:61;;2563:1;2560;2553:12;2506:61;2455:118;:::o;2579:135::-;2623:5;2661:6;2648:20;2639:29;;2677:31;2702:5;2677:31;:::i;:::-;2579:135;;;;:::o;2720:325::-;2777:6;2826:2;2814:9;2805:7;2801:23;2797:32;2794:119;;;2832:79;;:::i;:::-;2794:119;2952:1;2977:51;3020:7;3011:6;3000:9;2996:22;2977:51;:::i;:::-;2967:61;;2923:115;2720:325;;;;:::o;3051:90::-;3085:7;3128:5;3121:13;3114:21;3103:32;;3051:90;;;:::o;3147:109::-;3228:21;3243:5;3228:21;:::i;:::-;3223:3;3216:34;3147:109;;:::o;3262:210::-;3349:4;3387:2;3376:9;3372:18;3364:26;;3400:65;3462:1;3451:9;3447:17;3438:6;3400:65;:::i;:::-;3262:210;;;;:::o;3478:89::-;3514:7;3554:6;3547:5;3543:18;3532:29;;3478:89;;;:::o;3573:120::-;3645:23;3662:5;3645:23;:::i;:::-;3638:5;3635:34;3625:62;;3683:1;3680;3673:12;3625:62;3573:120;:::o;3699:137::-;3744:5;3782:6;3769:20;3760:29;;3798:32;3824:5;3798:32;:::i;:::-;3699:137;;;;:::o;3842:117::-;3951:1;3948;3941:12;3965:117;4074:1;4071;4064:12;4088:117;4197:1;4194;4187:12;4227:580;4312:8;4322:6;4372:3;4365:4;4357:6;4353:17;4349:27;4339:122;;4380:79;;:::i;:::-;4339:122;4493:6;4480:20;4470:30;;4523:18;4515:6;4512:30;4509:117;;;4545:79;;:::i;:::-;4509:117;4659:4;4651:6;4647:17;4635:29;;4713:3;4705:4;4697:6;4693:17;4683:8;4679:32;4676:41;4673:128;;;4720:79;;:::i;:::-;4673:128;4227:580;;;;;:::o;4813:867::-;4926:6;4934;4942;4950;4999:2;4987:9;4978:7;4974:23;4970:32;4967:119;;;5005:79;;:::i;:::-;4967:119;5125:1;5150:51;5193:7;5184:6;5173:9;5169:22;5150:51;:::i;:::-;5140:61;;5096:115;5250:2;5276:52;5320:7;5311:6;5300:9;5296:22;5276:52;:::i;:::-;5266:62;;5221:117;5405:2;5394:9;5390:18;5377:32;5436:18;5428:6;5425:30;5422:117;;;5458:79;;:::i;:::-;5422:117;5571:92;5655:7;5646:6;5635:9;5631:22;5571:92;:::i;:::-;5553:110;;;;5348:325;4813:867;;;;;;;:::o;5686:122::-;5759:24;5777:5;5759:24;:::i;:::-;5752:5;5749:35;5739:63;;5798:1;5795;5788:12;5739:63;5686:122;:::o;5814:139::-;5860:5;5898:6;5885:20;5876:29;;5914:33;5941:5;5914:33;:::i;:::-;5814:139;;;;:::o;5959:77::-;5996:7;6025:5;6014:16;;5959:77;;;:::o;6042:122::-;6115:24;6133:5;6115:24;:::i;:::-;6108:5;6105:35;6095:63;;6154:1;6151;6144:12;6095:63;6042:122;:::o;6170:139::-;6216:5;6254:6;6241:20;6232:29;;6270:33;6297:5;6270:33;:::i;:::-;6170:139;;;;:::o;6315:102::-;6356:6;6407:2;6403:7;6398:2;6391:5;6387:14;6383:28;6373:38;;6315:102;;;:::o;6423:180::-;6471:77;6468:1;6461:88;6568:4;6565:1;6558:15;6592:4;6589:1;6582:15;6609:281;6692:27;6714:4;6692:27;:::i;:::-;6684:6;6680:40;6822:6;6810:10;6807:22;6786:18;6774:10;6771:34;6768:62;6765:88;;;6833:18;;:::i;:::-;6765:88;6873:10;6869:2;6862:22;6652:238;6609:281;;:::o;6896:129::-;6930:6;6957:20;;:::i;:::-;6947:30;;6986:33;7014:4;7006:6;6986:33;:::i;:::-;6896:129;;;:::o;7031:311::-;7108:4;7198:18;7190:6;7187:30;7184:56;;;7220:18;;:::i;:::-;7184:56;7270:4;7262:6;7258:17;7250:25;;7330:4;7324;7320:15;7312:23;;7031:311;;;:::o;7348:122::-;7421:24;7439:5;7421:24;:::i;:::-;7414:5;7411:35;7401:63;;7460:1;7457;7450:12;7401:63;7348:122;:::o;7476:139::-;7522:5;7560:6;7547:20;7538:29;;7576:33;7603:5;7576:33;:::i;:::-;7476:139;;;;:::o;7638:710::-;7734:5;7759:81;7775:64;7832:6;7775:64;:::i;:::-;7759:81;:::i;:::-;7750:90;;7860:5;7889:6;7882:5;7875:21;7923:4;7916:5;7912:16;7905:23;;7976:4;7968:6;7964:17;7956:6;7952:30;8005:3;7997:6;7994:15;7991:122;;;8024:79;;:::i;:::-;7991:122;8139:6;8122:220;8156:6;8151:3;8148:15;8122:220;;;8231:3;8260:37;8293:3;8281:10;8260:37;:::i;:::-;8255:3;8248:50;8327:4;8322:3;8318:14;8311:21;;8198:144;8182:4;8177:3;8173:14;8166:21;;8122:220;;;8126:21;7740:608;;7638:710;;;;;:::o;8371:370::-;8442:5;8491:3;8484:4;8476:6;8472:17;8468:27;8458:122;;8499:79;;:::i;:::-;8458:122;8616:6;8603:20;8641:94;8731:3;8723:6;8716:4;8708:6;8704:17;8641:94;:::i;:::-;8632:103;;8448:293;8371:370;;;;:::o;8747:311::-;8824:4;8914:18;8906:6;8903:30;8900:56;;;8936:18;;:::i;:::-;8900:56;8986:4;8978:6;8974:17;8966:25;;9046:4;9040;9036:15;9028:23;;8747:311;;;:::o;9081:710::-;9177:5;9202:81;9218:64;9275:6;9218:64;:::i;:::-;9202:81;:::i;:::-;9193:90;;9303:5;9332:6;9325:5;9318:21;9366:4;9359:5;9355:16;9348:23;;9419:4;9411:6;9407:17;9399:6;9395:30;9448:3;9440:6;9437:15;9434:122;;;9467:79;;:::i;:::-;9434:122;9582:6;9565:220;9599:6;9594:3;9591:15;9565:220;;;9674:3;9703:37;9736:3;9724:10;9703:37;:::i;:::-;9698:3;9691:50;9770:4;9765:3;9761:14;9754:21;;9641:144;9625:4;9620:3;9616:14;9609:21;;9565:220;;;9569:21;9183:608;;9081:710;;;;;:::o;9814:370::-;9885:5;9934:3;9927:4;9919:6;9915:17;9911:27;9901:122;;9942:79;;:::i;:::-;9901:122;10059:6;10046:20;10084:94;10174:3;10166:6;10159:4;10151:6;10147:17;10084:94;:::i;:::-;10075:103;;9891:293;9814:370;;;;:::o;10190:1473::-;10342:6;10350;10358;10366;10374;10382;10431:3;10419:9;10410:7;10406:23;10402:33;10399:120;;;10438:79;;:::i;:::-;10399:120;10558:1;10583:51;10626:7;10617:6;10606:9;10602:22;10583:51;:::i;:::-;10573:61;;10529:115;10683:2;10709:53;10754:7;10745:6;10734:9;10730:22;10709:53;:::i;:::-;10699:63;;10654:118;10811:2;10837:53;10882:7;10873:6;10862:9;10858:22;10837:53;:::i;:::-;10827:63;;10782:118;10939:2;10965:53;11010:7;11001:6;10990:9;10986:22;10965:53;:::i;:::-;10955:63;;10910:118;11095:3;11084:9;11080:19;11067:33;11127:18;11119:6;11116:30;11113:117;;;11149:79;;:::i;:::-;11113:117;11254:78;11324:7;11315:6;11304:9;11300:22;11254:78;:::i;:::-;11244:88;;11038:304;11409:3;11398:9;11394:19;11381:33;11441:18;11433:6;11430:30;11427:117;;;11463:79;;:::i;:::-;11427:117;11568:78;11638:7;11629:6;11618:9;11614:22;11568:78;:::i;:::-;11558:88;;11352:304;10190:1473;;;;;;;;:::o;11669:114::-;11736:6;11770:5;11764:12;11754:22;;11669:114;;;:::o;11789:184::-;11888:11;11922:6;11917:3;11910:19;11962:4;11957:3;11953:14;11938:29;;11789:184;;;;:::o;11979:132::-;12046:4;12069:3;12061:11;;12099:4;12094:3;12090:14;12082:22;;11979:132;;;:::o;12117:108::-;12194:24;12212:5;12194:24;:::i;:::-;12189:3;12182:37;12117:108;;:::o;12231:179::-;12300:10;12321:46;12363:3;12355:6;12321:46;:::i;:::-;12399:4;12394:3;12390:14;12376:28;;12231:179;;;;:::o;12416:113::-;12486:4;12518;12513:3;12509:14;12501:22;;12416:113;;;:::o;12565:732::-;12684:3;12713:54;12761:5;12713:54;:::i;:::-;12783:86;12862:6;12857:3;12783:86;:::i;:::-;12776:93;;12893:56;12943:5;12893:56;:::i;:::-;12972:7;13003:1;12988:284;13013:6;13010:1;13007:13;12988:284;;;13089:6;13083:13;13116:63;13175:3;13160:13;13116:63;:::i;:::-;13109:70;;13202:60;13255:6;13202:60;:::i;:::-;13192:70;;13048:224;13035:1;13032;13028:9;13023:14;;12988:284;;;12992:14;13288:3;13281:10;;12689:608;;;12565:732;;;;:::o;13303:373::-;13446:4;13484:2;13473:9;13469:18;13461:26;;13533:9;13527:4;13523:20;13519:1;13508:9;13504:17;13497:47;13561:108;13664:4;13655:6;13561:108;:::i;:::-;13553:116;;13303:373;;;;:::o;13682:329::-;13741:6;13790:2;13778:9;13769:7;13765:23;13761:32;13758:119;;;13796:79;;:::i;:::-;13758:119;13916:1;13941:53;13986:7;13977:6;13966:9;13962:22;13941:53;:::i;:::-;13931:63;;13887:117;13682:329;;;;:::o;14017:112::-;14100:22;14116:5;14100:22;:::i;:::-;14095:3;14088:35;14017:112;;:::o;14135:214::-;14224:4;14262:2;14251:9;14247:18;14239:26;;14275:67;14339:1;14328:9;14324:17;14315:6;14275:67;:::i;:::-;14135:214;;;;:::o;14355:329::-;14414:6;14463:2;14451:9;14442:7;14438:23;14434:32;14431:119;;;14469:79;;:::i;:::-;14431:119;14589:1;14614:53;14659:7;14650:6;14639:9;14635:22;14614:53;:::i;:::-;14604:63;;14560:117;14355:329;;;;:::o;14690:118::-;14777:24;14795:5;14777:24;:::i;:::-;14772:3;14765:37;14690:118;;:::o;14814:115::-;14899:23;14916:5;14899:23;:::i;:::-;14894:3;14887:36;14814:115;;:::o;14935:648::-;15132:4;15170:3;15159:9;15155:19;15147:27;;15184:71;15252:1;15241:9;15237:17;15228:6;15184:71;:::i;:::-;15265:72;15333:2;15322:9;15318:18;15309:6;15265:72;:::i;:::-;15347;15415:2;15404:9;15400:18;15391:6;15347:72;:::i;:::-;15429:66;15491:2;15480:9;15476:18;15467:6;15429:66;:::i;:::-;15505:71;15571:3;15560:9;15556:19;15547:6;15505:71;:::i;:::-;14935:648;;;;;;;;:::o;15589:180::-;15637:77;15634:1;15627:88;15734:4;15731:1;15724:15;15758:4;15755:1;15748:15;15775:180;15823:77;15820:1;15813:88;15920:4;15917:1;15910:15;15944:4;15941:1;15934:15;15961:233;16000:3;16023:24;16041:5;16023:24;:::i;:::-;16014:33;;16069:66;16062:5;16059:77;16056:103;;16139:18;;:::i;:::-;16056:103;16186:1;16179:5;16175:13;16168:20;;15961:233;;;:::o;16200:169::-;16284:11;16318:6;16313:3;16306:19;16358:4;16353:3;16349:14;16334:29;;16200:169;;;;:::o;16375:230::-;16515:34;16511:1;16503:6;16499:14;16492:58;16584:13;16579:2;16571:6;16567:15;16560:38;16375:230;:::o;16611:366::-;16753:3;16774:67;16838:2;16833:3;16774:67;:::i;:::-;16767:74;;16850:93;16939:3;16850:93;:::i;:::-;16968:2;16963:3;16959:12;16952:19;;16611:366;;;:::o;16983:419::-;17149:4;17187:2;17176:9;17172:18;17164:26;;17236:9;17230:4;17226:20;17222:1;17211:9;17207:17;17200:47;17264:131;17390:4;17264:131;:::i;:::-;17256:139;;16983:419;;;:::o;17408:234::-;17548:34;17544:1;17536:6;17532:14;17525:58;17617:17;17612:2;17604:6;17600:15;17593:42;17408:234;:::o;17648:366::-;17790:3;17811:67;17875:2;17870:3;17811:67;:::i;:::-;17804:74;;17887:93;17976:3;17887:93;:::i;:::-;18005:2;18000:3;17996:12;17989:19;;17648:366;;;:::o;18020:419::-;18186:4;18224:2;18213:9;18209:18;18201:26;;18273:9;18267:4;18263:20;18259:1;18248:9;18244:17;18237:47;18301:131;18427:4;18301:131;:::i;:::-;18293:139;;18020:419;;;:::o;18445:174::-;18585:26;18581:1;18573:6;18569:14;18562:50;18445:174;:::o;18625:366::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:419::-;19163:4;19201:2;19190:9;19186:18;19178:26;;19250:9;19244:4;19240:20;19236:1;19225:9;19221:17;19214:47;19278:131;19404:4;19278:131;:::i;:::-;19270:139;;18997:419;;;:::o;19422:168::-;19562:20;19558:1;19550:6;19546:14;19539:44;19422:168;:::o;19596:366::-;19738:3;19759:67;19823:2;19818:3;19759:67;:::i;:::-;19752:74;;19835:93;19924:3;19835:93;:::i;:::-;19953:2;19948:3;19944:12;19937:19;;19596:366;;;:::o;19968:419::-;20134:4;20172:2;20161:9;20157:18;20149:26;;20221:9;20215:4;20211:20;20207:1;20196:9;20192:17;20185:47;20249:131;20375:4;20249:131;:::i;:::-;20241:139;;19968:419;;;:::o;20393:194::-;20433:4;20453:20;20471:1;20453:20;:::i;:::-;20448:25;;20487:20;20505:1;20487:20;:::i;:::-;20482:25;;20531:1;20528;20524:9;20516:17;;20555:1;20549:4;20546:11;20543:37;;;20560:18;;:::i;:::-;20543:37;20393:194;;;;:::o;20593:191::-;20633:3;20652:20;20670:1;20652:20;:::i;:::-;20647:25;;20686:20;20704:1;20686:20;:::i;:::-;20681:25;;20729:1;20726;20722:9;20715:16;;20750:3;20747:1;20744:10;20741:36;;;20757:18;;:::i;:::-;20741:36;20593:191;;;;:::o;20790:171::-;20828:3;20851:23;20868:5;20851:23;:::i;:::-;20842:32;;20896:6;20889:5;20886:17;20883:43;;20906:18;;:::i;:::-;20883:43;20953:1;20946:5;20942:13;20935:20;;20790:171;;;:::o;20967:175::-;21107:27;21103:1;21095:6;21091:14;21084:51;20967:175;:::o;21148:366::-;21290:3;21311:67;21375:2;21370:3;21311:67;:::i;:::-;21304:74;;21387:93;21476:3;21387:93;:::i;:::-;21505:2;21500:3;21496:12;21489:19;;21148:366;;;:::o;21520:419::-;21686:4;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21520:419;;;:::o;21945:410::-;21985:7;22008:20;22026:1;22008:20;:::i;:::-;22003:25;;22042:20;22060:1;22042:20;:::i;:::-;22037:25;;22097:1;22094;22090:9;22119:30;22137:11;22119:30;:::i;:::-;22108:41;;22298:1;22289:7;22285:15;22282:1;22279:22;22259:1;22252:9;22232:83;22209:139;;22328:18;;:::i;:::-;22209:139;21993:362;21945:410;;;;:::o;22361:180::-;22409:77;22406:1;22399:88;22506:4;22503:1;22496:15;22530:4;22527:1;22520:15;22547:185;22587:1;22604:20;22622:1;22604:20;:::i;:::-;22599:25;;22638:20;22656:1;22638:20;:::i;:::-;22633:25;;22677:1;22667:35;;22682:18;;:::i;:::-;22667:35;22724:1;22721;22717:9;22712:14;;22547:185;;;;:::o;22738:332::-;22859:4;22897:2;22886:9;22882:18;22874:26;;22910:71;22978:1;22967:9;22963:17;22954:6;22910:71;:::i;:::-;22991:72;23059:2;23048:9;23044:18;23035:6;22991:72;:::i;:::-;22738:332;;;;;:::o;23076:116::-;23146:21;23161:5;23146:21;:::i;:::-;23139:5;23136:32;23126:60;;23182:1;23179;23172:12;23126:60;23076:116;:::o;23198:137::-;23252:5;23283:6;23277:13;23268:22;;23299:30;23323:5;23299:30;:::i;:::-;23198:137;;;;:::o;23341:345::-;23408:6;23457:2;23445:9;23436:7;23432:23;23428:32;23425:119;;;23463:79;;:::i;:::-;23425:119;23583:1;23608:61;23661:7;23652:6;23641:9;23637:22;23608:61;:::i;:::-;23598:71;;23554:125;23341:345;;;;:::o;23692:171::-;23832:23;23828:1;23820:6;23816:14;23809:47;23692:171;:::o;23869:366::-;24011:3;24032:67;24096:2;24091:3;24032:67;:::i;:::-;24025:74;;24108:93;24197:3;24108:93;:::i;:::-;24226:2;24221:3;24217:12;24210:19;;23869:366;;;:::o;24241:419::-;24407:4;24445:2;24434:9;24430:18;24422:26;;24494:9;24488:4;24484:20;24480:1;24469:9;24465:17;24458:47;24522:131;24648:4;24522:131;:::i;:::-;24514:139;;24241:419;;;:::o;24666:541::-;24837:4;24875:3;24864:9;24860:19;24852:27;;24889:67;24953:1;24942:9;24938:17;24929:6;24889:67;:::i;:::-;24966:72;25034:2;25023:9;25019:18;25010:6;24966:72;:::i;:::-;25048:70;25114:2;25103:9;25099:18;25090:6;25048:70;:::i;:::-;25128:72;25196:2;25185:9;25181:18;25172:6;25128:72;:::i;:::-;24666:541;;;;;;;:::o;25213:324::-;25330:4;25368:2;25357:9;25353:18;25345:26;;25381:67;25445:1;25434:9;25430:17;25421:6;25381:67;:::i;:::-;25458:72;25526:2;25515:9;25511:18;25502:6;25458:72;:::i;:::-;25213:324;;;;;:::o;25543:173::-;25683:25;25679:1;25671:6;25667:14;25660:49;25543:173;:::o;25722:366::-;25864:3;25885:67;25949:2;25944:3;25885:67;:::i;:::-;25878:74;;25961:93;26050:3;25961:93;:::i;:::-;26079:2;26074:3;26070:12;26063:19;;25722:366;;;:::o;26094:419::-;26260:4;26298:2;26287:9;26283:18;26275:26;;26347:9;26341:4;26337:20;26333:1;26322:9;26318:17;26311:47;26375:131;26501:4;26375:131;:::i;:::-;26367:139;;26094:419;;;:::o;26519:220::-;26659:34;26655:1;26647:6;26643:14;26636:58;26728:3;26723:2;26715:6;26711:15;26704:28;26519:220;:::o;26745:366::-;26887:3;26908:67;26972:2;26967:3;26908:67;:::i;:::-;26901:74;;26984:93;27073:3;26984:93;:::i;:::-;27102:2;27097:3;27093:12;27086:19;;26745:366;;;:::o;27117:419::-;27283:4;27321:2;27310:9;27306:18;27298:26;;27370:9;27364:4;27360:20;27356:1;27345:9;27341:17;27334:47;27398:131;27524:4;27398:131;:::i;:::-;27390:139;;27117:419;;;:::o;27542:173::-;27682:25;27678:1;27670:6;27666:14;27659:49;27542:173;:::o;27721:366::-;27863:3;27884:67;27948:2;27943:3;27884:67;:::i;:::-;27877:74;;27960:93;28049:3;27960:93;:::i;:::-;28078:2;28073:3;28069:12;28062:19;;27721:366;;;:::o;28093:419::-;28259:4;28297:2;28286:9;28282:18;28274:26;;28346:9;28340:4;28336:20;28332:1;28321:9;28317:17;28310:47;28374:131;28500:4;28374:131;:::i;:::-;28366:139;;28093:419;;;:::o;28518:226::-;28658:34;28654:1;28646:6;28642:14;28635:58;28727:9;28722:2;28714:6;28710:15;28703:34;28518:226;:::o;28750:366::-;28892:3;28913:67;28977:2;28972:3;28913:67;:::i;:::-;28906:74;;28989:93;29078:3;28989:93;:::i;:::-;29107:2;29102:3;29098:12;29091:19;;28750:366;;;:::o;29122:419::-;29288:4;29326:2;29315:9;29311:18;29303:26;;29375:9;29369:4;29365:20;29361:1;29350:9;29346:17;29339:47;29403:131;29529:4;29403:131;:::i;:::-;29395:139;;29122:419;;;:::o;29547:171::-;29687:23;29683:1;29675:6;29671:14;29664:47;29547:171;:::o;29724:366::-;29866:3;29887:67;29951:2;29946:3;29887:67;:::i;:::-;29880:74;;29963:93;30052:3;29963:93;:::i;:::-;30081:2;30076:3;30072:12;30065:19;;29724:366;;;:::o;30096:419::-;30262:4;30300:2;30289:9;30285:18;30277:26;;30349:9;30343:4;30339:20;30335:1;30324:9;30320:17;30313:47;30377:131;30503:4;30377:131;:::i;:::-;30369:139;;30096:419;;;:::o;30521:178::-;30661:30;30657:1;30649:6;30645:14;30638:54;30521:178;:::o;30705:366::-;30847:3;30868:67;30932:2;30927:3;30868:67;:::i;:::-;30861:74;;30944:93;31033:3;30944:93;:::i;:::-;31062:2;31057:3;31053:12;31046:19;;30705:366;;;:::o;31077:419::-;31243:4;31281:2;31270:9;31266:18;31258:26;;31330:9;31324:4;31320:20;31316:1;31305:9;31301:17;31294:47;31358:131;31484:4;31358:131;:::i;:::-;31350:139;;31077:419;;;:::o;31502:222::-;31642:34;31638:1;31630:6;31626:14;31619:58;31711:5;31706:2;31698:6;31694:15;31687:30;31502:222;:::o;31730:366::-;31872:3;31893:67;31957:2;31952:3;31893:67;:::i;:::-;31886:74;;31969:93;32058:3;31969:93;:::i;:::-;32087:2;32082:3;32078:12;32071:19;;31730:366;;;:::o;32102:419::-;32268:4;32306:2;32295:9;32291:18;32283:26;;32355:9;32349:4;32345:20;32341:1;32330:9;32326:17;32319:47;32383:131;32509:4;32383:131;:::i;:::-;32375:139;;32102:419;;;:::o;32527:181::-;32667:33;32663:1;32655:6;32651:14;32644:57;32527:181;:::o;32714:366::-;32856:3;32877:67;32941:2;32936:3;32877:67;:::i;:::-;32870:74;;32953:93;33042:3;32953:93;:::i;:::-;33071:2;33066:3;33062:12;33055:19;;32714:366;;;:::o;33086:419::-;33252:4;33290:2;33279:9;33275:18;33267:26;;33339:9;33333:4;33329:20;33325:1;33314:9;33310:17;33303:47;33367:131;33493:4;33367:131;:::i;:::-;33359:139;;33086:419;;;:::o;33511:332::-;33632:4;33670:2;33659:9;33655:18;33647:26;;33683:71;33751:1;33740:9;33736:17;33727:6;33683:71;:::i;:::-;33764:72;33832:2;33821:9;33817:18;33808:6;33764:72;:::i;:::-;33511:332;;;;;:::o;33849:143::-;33906:5;33937:6;33931:13;33922:22;;33953:33;33980:5;33953:33;:::i;:::-;33849:143;;;;:::o;33998:351::-;34068:6;34117:2;34105:9;34096:7;34092:23;34088:32;34085:119;;;34123:79;;:::i;:::-;34085:119;34243:1;34268:64;34324:7;34315:6;34304:9;34300:22;34268:64;:::i;:::-;34258:74;;34214:128;33998:351;;;;:::o;34355:170::-;34495:22;34491:1;34483:6;34479:14;34472:46;34355:170;:::o;34531:366::-;34673:3;34694:67;34758:2;34753:3;34694:67;:::i;:::-;34687:74;;34770:93;34859:3;34770:93;:::i;:::-;34888:2;34883:3;34879:12;34872:19;;34531:366;;;:::o;34903:419::-;35069:4;35107:2;35096:9;35092:18;35084:26;;35156:9;35150:4;35146:20;35142:1;35131:9;35127:17;35120:47;35184:131;35310:4;35184:131;:::i;:::-;35176:139;;34903:419;;;:::o;35328:442::-;35477:4;35515:2;35504:9;35500:18;35492:26;;35528:71;35596:1;35585:9;35581:17;35572:6;35528:71;:::i;:::-;35609:72;35677:2;35666:9;35662:18;35653:6;35609:72;:::i;:::-;35691;35759:2;35748:9;35744:18;35735:6;35691:72;:::i;:::-;35328:442;;;;;;:::o;35776:225::-;35916:34;35912:1;35904:6;35900:14;35893:58;35985:8;35980:2;35972:6;35968:15;35961:33;35776:225;:::o;36007:366::-;36149:3;36170:67;36234:2;36229:3;36170:67;:::i;:::-;36163:74;;36246:93;36335:3;36246:93;:::i;:::-;36364:2;36359:3;36355:12;36348:19;;36007:366;;;:::o;36379:419::-;36545:4;36583:2;36572:9;36568:18;36560:26;;36632:9;36626:4;36622:20;36618:1;36607:9;36603:17;36596:47;36660:131;36786:4;36660:131;:::i;:::-;36652:139;;36379:419;;;:::o;36804:182::-;36944:34;36940:1;36932:6;36928:14;36921:58;36804:182;:::o;36992:366::-;37134:3;37155:67;37219:2;37214:3;37155:67;:::i;:::-;37148:74;;37231:93;37320:3;37231:93;:::i;:::-;37349:2;37344:3;37340:12;37333:19;;36992:366;;;:::o;37364:419::-;37530:4;37568:2;37557:9;37553:18;37545:26;;37617:9;37611:4;37607:20;37603:1;37592:9;37588:17;37581:47;37645:131;37771:4;37645:131;:::i;:::-;37637:139;;37364:419;;;:::o;37789:180::-;37837:77;37834:1;37827:88;37934:4;37931:1;37924:15;37958:4;37955:1;37948:15
Swarm Source
ipfs://954a01e9d8c0a09458367c45988f82efbb33682e70f4c63bc00c088e3c0e354f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.