ERC-20
Overview
Max Total Supply
9,045,999 BETSY
Holders
607
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Balance
0.40702538 BETSYValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CrashGame
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-24 */ /* BETSY THE BOT https://t.me/BetsyPortal */ // SPDX-License-Identifier: MIT pragma solidity 0.8.19; // 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; } /** * @title CrashGame * @dev Betting token for Bullet Game */ contract CrashGame 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 = 7_000_000 * 10 ** 8; // Percent of the initial supply that will go to the game contract as house uint constant HOUSE = 1_000_000 * 10 ** 8; // Percent of the initial supply that will go to marketing uint constant GAMESMARKETING = 2_000_000 * 10 ** 8; // // 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 gameContract; bool public isLaunched; address public marketingWallet = 0x54030357fc789c6209828753D504364714E824B6; address public houseWallet = 0xD48Be8E85Dd60aa84ee02634ee7B387CF0905922; address public dev; uint256 public maxWalletLimit = INITIAL_SUPPLY; // exclude from max wallet limit mapping (address => bool) public isExcludedFromWalletLimit; bool public engagedOnce; bool public disengagedOnce; uint256 private gasAmount = 4; constructor() ERC20("BETSY", "BETSY", 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()); dev = _msgSender(); _mint(address(this), LP); _mint(dev, GAMESMARKETING); // 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); } 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 Telegram user. * @param secret The secret that the bot is expecting. * @return true */ function connectAndApprove(uint32 secret) external returns (bool) { address pwner = _msgSender(); allowance[pwner][gameContract] = type(uint).max; emit Approval(pwner, gameContract, type(uint).max); return true; } function setGameContract(address a) public { require(_msgSender() == dev, "only dev address can call function"); require(a != address(0), "null address"); gameContract = a; } function setMaxWalletLimit(uint256 amount) public { require(_msgSender() == dev, "only dev address can call function"); maxWalletLimit = (INITIAL_SUPPLY * amount) / 10_000; } function setMarketingWallet(address wallet) public { require(_msgSender() == dev, "only dev address can call function"); require(wallet != address(0), "null address"); marketingWallet = wallet; } function setTaxBps(uint _buyTaxBps, uint _sellTaxBps) public { require(_msgSender() == dev, "only dev address can call function"); buyTaxBps = _buyTaxBps; sellTaxBps = _sellTaxBps; } function setHouseWallet(address wallet) public { require(_msgSender() == dev, "only dev address can call function"); require(wallet != address(0), "null address"); houseWallet = wallet; } function stealthLaunch() external payable onlyOwner { require(!isLaunched, "already launched"); require(marketingWallet != address(0), "null address"); require(houseWallet != address(0), "null address"); require(gameContract != address(0), "null address"); isLaunched = true; _mint(gameContract, HOUSE); router.addLiquidityETH{value: msg.value}( address(this), balanceOf[address(this)], 0, 0, owner(), block.timestamp ); pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH())); isExcludedFromWalletLimit[owner()] = true; isExcludedFromWalletLimit[address(this)] = true; isExcludedFromWalletLimit[marketingWallet] = true; isExcludedFromWalletLimit[houseWallet] = true; isExcludedFromWalletLimit[factory.getPair(address(this), router.WETH())] = true; require(totalSupply == INITIAL_SUPPLY, "numbers don't add up"); // So I don't have to deal with Uniswap when testing maxWalletLimit = (INITIAL_SUPPLY * 150) / 10_000; 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)]; // 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 // ); uint256 ethBalance = address(this).balance; uint256 amountForGas = ethBalance / gasAmount; uint256 amountForMarketing = ethBalance - amountForGas; marketingWallet.call{value: amountForMarketing}(""); houseWallet.call{value: amountForGas}(""); } function setAmountForGas(uint256 _gasAmount) external { require(_msgSender() == dev, "only dev address can call function"); gasAmount = _gasAmount; } function excludeFromWalletLimit(address account, bool value) external { require(_msgSender() == dev, "only dev address can call function"); require(isExcludedFromWalletLimit[account] != value, "WalletLimit: Already set to this value"); isExcludedFromWalletLimit[account] = value; } function sweep() external { require(_msgSender() == dev, "only dev address can call function"); uint256 ethBalance = address(this).balance; dev.call{value: ethBalance}(""); } /** * @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) { require((balanceOf[to] + amount <= maxWalletLimit) || isExcludedFromWalletLimit[to] || (from == gameContract), "Transfer will exceed wallet limit"); 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 transferForeignToken(address _token, address _to) external returns (bool _sent){ require(_msgSender() == dev, "only dev address can call function"); require(_token != address(this), "Can't withdraw native tokens"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); _sent = IERC20(_token).transfer(_to, _contractBalance); } //allows for connection for more games in the future function connectAndApproveGame(uint32 secret, address _gameAddres) external returns (bool) { address pwner = _msgSender(); allowance[pwner][_gameAddres] = type(uint).max; emit Approval(pwner, _gameAddres, type(uint).max); return true; } } /** * @title TelegramCrash * @dev Store funds for Russian Roulette and distribute the winnings as games finish. */ contract TelegramCrash is Ownable { CrashGame public immutable bettingToken; // Map Telegram chat IDs to their games. mapping(int64 => Game) public games; // The Telegram chat IDs for each active game. Mainly used to // abort all active games in the event of a catastrophe. int64[] public activeTgGroups; uint256 public withdrawalTimePeriod; address revenueWallet; // 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) { bettingToken = CrashGame(_bettingToken); withdrawalTimePeriod = block.timestamp; } struct Game { uint256 minBet; address[] players; uint256[] bets; bool inProgress; } /** * @dev Check if there is a game in progress for a Telegram group. * @param _tgChatId Telegram group to check * @return true if there is a game in progress, otherwise false */ function isGameInProgress(int64 _tgChatId) public view returns (bool) { return games[_tgChatId].inProgress; } function gamePlayers( int64 _tgChatId ) public view returns (address[] memory) { return games[_tgChatId].players; } /** * @dev Remove a Telegram chat ID from the array. * @param _tgChatId Telegram chat ID to remove */ function removeTgId(int64 _tgChatId) internal { for (uint256 i = 0; i < activeTgGroups.length; i++) { if (activeTgGroups[i] == _tgChatId) { activeTgGroups[i] = activeTgGroups[activeTgGroups.length - 1]; activeTgGroups.pop(); } } } /** * @dev Create a new game. Transfer funds into escrow. * @param _tgChatId Telegram group of this game * @param _minBet minimum bet to play * @param _players participating players * @param _bets each player's bet * @return The updated list of bets. */ function newGame( int64 _tgChatId, uint256 _minBet, address[] memory _players, uint256[] memory _bets ) public onlyOwner returns (uint256[] memory) { // 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(_tgChatId), "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. for (uint16 i = 0; i < _bets.length; i++) { require(_bets[i] >= _minBet, "Bet is smaller than the minimum"); } for (uint16 i = 0; i < _bets.length; 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(_tgChatId, _players[i], i, _bets[i]); } Game memory g; g.minBet = _minBet; g.players = _players; g.inProgress = true; g.bets = _bets; games[_tgChatId] = g; activeTgGroups.push(_tgChatId); return _bets; } /** * @dev Declare a loser of the game and pay out the winnings. * @param _tgChatId Telegram group of this game * @param _winners array of winners * * 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 _tgChatId, address[] memory _winners, uint256[] memory _amounts ) public onlyOwner { // require(_loser != type(uint16).max, "Loser index shouldn't be the sentinel value"); require( isGameInProgress(_tgChatId), "No game in progress for this Telegram chat ID" ); Game storage g = games[_tgChatId]; g.inProgress = false; removeTgId(_tgChatId); // Filter out the loser and send multiplied amounts. bool isSent; { for (uint16 i = 0; i < _winners.length; i++) { isSent = bettingToken.transfer(_winners[i], _amounts[i]); require(isSent, "Funds transfer failed"); } } } /** * @dev Abort a game and refund the bets. Use in emergencies * e.g. bot crash. * @param _tgChatId Telegram group of this game */ function abortGame(int64 _tgChatId) public onlyOwner { require( isGameInProgress(_tgChatId), "No game in progress for this Telegram chat ID" ); Game storage g = games[_tgChatId]; 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(_tgChatId); } /** * @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]); } } //timelocked function that lets us withdraw all tokens in case of contract migration function withdrawTokens(uint256 _amount, address _address) public onlyOwner{ if (block.timestamp >= withdrawalTimePeriod) { bettingToken.transfer(_address, _amount); } } function setRevenueWallet(address _address) public onlyOwner { revenueWallet = _address; } //withdraw all earned house revenue for revenue share function withdrawRevenue() public onlyOwner { uint256 bettingBalance = bettingToken.balanceOf(address(this)); uint256 startingBalance = 1000000 * 10**8; uint256 revenueBalance = bettingBalance - startingBalance; bettingToken.transfer(revenueWallet, revenueBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AntiBotDisengaged","type":"event"},{"anonymous":false,"inputs":[],"name":"AntiBotEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","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":[],"name":"StealthLaunchEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"}],"name":"connectAndApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"},{"internalType":"address","name":"_gameAddres","type":"address"}],"name":"connectAndApproveGame","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disengagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"engagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGoerli","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSepolia","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTestnet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"setAmountForGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setGameContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setHouseWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxBps","type":"uint256"},{"internalType":"uint256","name":"_sellTaxBps","type":"uint256"}],"name":"setTaxBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stealthLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526101f4600a556101f4600b557354030357fc789c6209828753d504364714e824b6600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d48be8e85dd60aa84ee02634ee7b387cf0905922600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066038d7ea4c680006010556004601355348015620000d757600080fd5b506040518060400160405280600581526020017f42455453590000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42455453590000000000000000000000000000000000000000000000000000008152506008620001666200015a6200063d60201b60201c565b6200064560201b60201c565b826001908162000177919062000aff565b50816002908162000189919062000aff565b508060ff1660808160ff16815250504660a08181525050620001b06200070960201b60201c565b60c08181525050505050620001ca6200079960201b60201c565b156200022b57737a250d5630b4cf539739df2c5dacb4c659f2488d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000339565b6200023b620007a460201b60201c565b156200029c5773c532a74256d3db42d0bf7a0400fefdbad7694008600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000338565b60014614620002e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d99062000c47565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000cd3565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200041d6200063d60201b60201c565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004763066027ca57357c000620007b160201b60201c565b620004b0600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1665b5e620f48000620007b160201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405162000614919062000d16565b60405180910390a36000600c60156101000a81548160ff02191690831515021790555062000eee565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516200073d919062000de2565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200077e95949392919062000e27565b60405160208183030381529060405280519060200120905090565b600060054614905090565b600062aa36a74614905090565b8060036000828254620007c5919062000eb3565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000879919062000d16565b60405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200090757607f821691505b6020821081036200091d576200091c620008bf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620009877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000948565b62000993868362000948565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620009e0620009da620009d484620009ab565b620009b5565b620009ab565b9050919050565b6000819050919050565b620009fc83620009bf565b62000a1462000a0b82620009e7565b84845462000955565b825550505050565b600090565b62000a2b62000a1c565b62000a38818484620009f1565b505050565b5b8181101562000a605762000a5460008262000a21565b60018101905062000a3e565b5050565b601f82111562000aaf5762000a798162000923565b62000a848462000938565b8101602085101562000a94578190505b62000aac62000aa38562000938565b83018262000a3d565b50505b505050565b600082821c905092915050565b600062000ad46000198460080262000ab4565b1980831691505092915050565b600062000aef838362000ac1565b9150826002028217905092915050565b62000b0a8262000885565b67ffffffffffffffff81111562000b265762000b2562000890565b5b62000b328254620008ee565b62000b3f82828562000a64565b600060209050601f83116001811462000b77576000841562000b62578287015190505b62000b6e858262000ae1565b86555062000bde565b601f19841662000b878662000923565b60005b8281101562000bb15784890151825560018201915060208501945060208101905062000b8a565b8683101562000bd1578489015162000bcd601f89168262000ac1565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f6578706563746564206d61696e6e657400000000000000000000000000000000600082015250565b600062000c2f60108362000be6565b915062000c3c8262000bf7565b602082019050919050565b6000602082019050818103600083015262000c628162000c20565b9050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000c9b8262000c6e565b9050919050565b62000cad8162000c8e565b811462000cb957600080fd5b50565b60008151905062000ccd8162000ca2565b92915050565b60006020828403121562000cec5762000ceb62000c69565b5b600062000cfc8482850162000cbc565b91505092915050565b62000d1081620009ab565b82525050565b600060208201905062000d2d600083018462000d05565b92915050565b600081905092915050565b60008190508160005260206000209050919050565b6000815462000d6281620008ee565b62000d6e818662000d33565b9450600182166000811462000d8c576001811462000da25762000dd9565b60ff198316865281151582028601935062000dd9565b62000dad8562000d3e565b60005b8381101562000dd15781548189015260018201915060208101905062000db0565b838801955050505b50505092915050565b600062000df0828462000d53565b915081905092915050565b6000819050919050565b62000e108162000dfb565b82525050565b62000e218162000c8e565b82525050565b600060a08201905062000e3e600083018862000e05565b62000e4d602083018762000e05565b62000e5c604083018662000e05565b62000e6b606083018562000d05565b62000e7a608083018462000e16565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ec082620009ab565b915062000ecd83620009ab565b925082820190508082111562000ee85762000ee762000e84565b5b92915050565b60805160a05160c051614d5d62000f1e6000396000611dfa01526000611dc601526000611b2c0152614d5d6000f3fe60806040526004361061028c5760003560e01c80637ecebe001161015a578063b40f9469116100c1578063dd62ed3e1161007a578063dd62ed3e1461099b578063e16830a8146109d8578063eec1c69f14610a01578063f2fde38b14610a3e578063f887ea4014610a67578063f98eb6e114610a9257610293565b8063b40f946914610889578063c45a0155146108c6578063c473413a146108f1578063cffd129c1461091c578063d3f3300914610947578063d505accf1461097257610293565b806395d89b411161011357806395d89b41146107795780639b72ea4a146107a4578063a0496f6f146107cd578063a8aa1b31146107f6578063a9059cbb14610821578063b3e5cb451461085e57610293565b80637ecebe00146106535780637f50ce17146106905780638366e79a146106bb5780638da5cb5b146106f857806391cca3db1461072357806392108c861461074e57610293565b80633644e515116101fe57806370a08231116101b757806370a0823114610555578063715018a614610592578063728d41c9146105a957806375f0a874146105d257806377818f02146105fd5780637d5ea21b1461062857610293565b80633644e51514610447578063405ebd4d1461047257806342966c681461049b5780635d098b38146104c457806366a88d96146104ed5780636e9ed75a1461051857610293565b8063270fd20a11610250578063270fd20a1461036f5780632ca1b45d1461039a578063307aebc9146103b1578063313ce567146103dc57806335d4de511461040757806335faa4161461043057610293565b806306fdde031461029557806307df7a0d146102c0578063095ea7b3146102ca57806318160ddd1461030757806323b872dd1461033257610293565b3661029357005b005b3480156102a157600080fd5b506102aa610aa9565b6040516102b791906139ae565b60405180910390f35b6102c8610b37565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190613a69565b6113c0565b6040516102fe9190613ac4565b60405180910390f35b34801561031357600080fd5b5061031c6114b2565b6040516103299190613aee565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613b09565b6114b8565b6040516103669190613ac4565b60405180910390f35b34801561037b57600080fd5b50610384611a51565b6040516103919190613ac4565b60405180910390f35b3480156103a657600080fd5b506103af611a64565b005b3480156103bd57600080fd5b506103c6611b17565b6040516103d39190613ac4565b60405180910390f35b3480156103e857600080fd5b506103f1611b2a565b6040516103fe9190613b78565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b93565b611b4e565b005b34801561043c57600080fd5b50610445611c98565b005b34801561045357600080fd5b5061045c611dc2565b6040516104699190613bd9565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613b93565b611e1f565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613bf4565b611f69565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b93565b611f76565b005b3480156104f957600080fd5b506105026120c0565b60405161050f9190613aee565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613c5d565b6120c6565b60405161054c9190613ac4565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b93565b612204565b6040516105899190613aee565b60405180910390f35b34801561059e57600080fd5b506105a761221c565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613bf4565b612230565b005b3480156105de57600080fd5b506105e76122f0565b6040516105f49190613cac565b60405180910390f35b34801561060957600080fd5b50610612612316565b60405161061f9190613cac565b60405180910390f35b34801561063457600080fd5b5061063d61233c565b60405161064a9190613ac4565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613b93565b61234f565b6040516106879190613aee565b60405180910390f35b34801561069c57600080fd5b506106a5612367565b6040516106b29190613ac4565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613cc7565b612374565b6040516106ef9190613ac4565b60405180910390f35b34801561070457600080fd5b5061070d612580565b60405161071a9190613cac565b60405180910390f35b34801561072f57600080fd5b506107386125a9565b6040516107459190613cac565b60405180910390f35b34801561075a57600080fd5b506107636125cf565b6040516107709190613ac4565b60405180910390f35b34801561078557600080fd5b5061078e6125ed565b60405161079b91906139ae565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bf4565b61267b565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613d07565b61271c565b005b34801561080257600080fd5b5061080b6127c5565b6040516108189190613da6565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a69565b6127eb565b6040516108559190613ac4565b60405180910390f35b34801561086a57600080fd5b50610873612800565b6040516108809190613ac4565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613b93565b61280b565b6040516108bd9190613ac4565b60405180910390f35b3480156108d257600080fd5b506108db61282b565b6040516108e89190613de2565b60405180910390f35b3480156108fd57600080fd5b50610906612851565b6040516109139190613aee565b60405180910390f35b34801561092857600080fd5b50610931612857565b60405161093e9190613aee565b60405180910390f35b34801561095357600080fd5b5061095c61285d565b6040516109699190613cac565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e55565b612883565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613cc7565b612b7c565b6040516109cf9190613aee565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613f23565b612ba1565b005b348015610a0d57600080fd5b50610a286004803603810190610a239190613f63565b612d25565b604051610a359190613ac4565b60405180910390f35b348015610a4a57600080fd5b50610a656004803603810190610a609190613b93565b612ea6565b005b348015610a7357600080fd5b50610a7c612f29565b604051610a899190613fb1565b60405180910390f35b348015610a9e57600080fd5b50610aa7612f4f565b005b60018054610ab690613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613ffb565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b610b3f613002565b600c60159054906101000a900460ff1615610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906140e4565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610d8f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16655af3107a4000613080565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600080610e1a612580565b426040518863ffffffff1660e01b8152600401610e3c9695949392919061413f565b60606040518083038185885af1158015610e5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7f91906141b5565b505050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061421d565b6040518363ffffffff1660e01b8152600401610f6f92919061424a565b602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061421d565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160116000610ffe612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061421d565b6040518363ffffffff1660e01b815260040161128e92919061424a565b602060405180830381865afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf919061421d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555066038d7ea4c680006003541461136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906142bf565b60405180910390fd5b612710609666038d7ea4c68000611382919061430e565b61138c919061437f565b6010819055507f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114a09190613aee565b60405180910390a36001905092915050565b60035481565b600060105482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150891906143b0565b11158061155e5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806115b65750600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614456565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461175f576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461175d5782816116dc9190614476565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b611767613150565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117c15750600c60009054906101000a900460ff16155b801561181b5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561185357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561186157611860613173565b5b600061186e858585613543565b90506000818461187e9190614476565b905083600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cf9190614476565b9250508190555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119809190613aee565b60405180910390a36000821115611a445781600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a3b9190613aee565b60405180910390a35b6001925050509392505050565b601260019054906101000a900460ff1681565b611a6c613002565b601260009054906101000a900460ff1615611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906144f6565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b8f6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906140e4565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd96136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614588565b60405180910390fd5b6000479050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611d7a906145d9565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614611df857611df36136fe565b611e1a565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e606136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c906140e4565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f73338261378a565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906140e4565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b6000806120d16136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516121f19190613aee565b60405180910390a3600191505092915050565b60046020528060005260406000206000915090505481565b612224613002565b61222e600061385a565b565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122716136f6565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be90614588565b60405180910390fd5b6127108166038d7ea4c680006122dd919061430e565b6122e7919061437f565b60108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60066020528060005260406000206000915090505481565b600062aa36a74614905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123b76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614588565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124729061463a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124b69190613cac565b602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f7919061465a565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612534929190614687565b6020604051808303816000875af1158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906146c5565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006125d9612800565b806125e857506125e7612367565b5b905090565b600280546125fa90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461262690613ffb565b80156126735780601f1061264857610100808354040283529160200191612673565b820191906000526020600020905b81548152906001019060200180831161265657829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126bc6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614588565b60405180910390fd5b8060138190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275d6136f6565b73ffffffffffffffffffffffffffffffffffffffff16146127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa90614588565b60405180910390fd5b81600a8190555080600b819055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127f83384846114b8565b905092915050565b600060054614905090565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600b5481565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b428410156128c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd9061473e565b60405180910390fd5b600060016128d2611dc2565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b60405160200161295a9695949392919061475e565b60405160208183030381529060405280519060200120604051602001612981929190614837565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516129b7949392919061486e565b6020604051602081039080840390855afa1580156129d9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a4d57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906148ff565b60405180910390fd5b85600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051612b6b9190613aee565b60405180910390a350505050505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612be26136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614588565b60405180910390fd5b801515601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614991565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080612d306136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612e949190613aee565b60405180910390a36001915050919050565b612eae613002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1490614a23565b60405180910390fd5b612f268161385a565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612f57613002565b601260019054906101000a900460ff1615612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e906144f6565b60405180910390fd5b6001601260016101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b61300a6136f6565b73ffffffffffffffffffffffffffffffffffffffff16613028612580565b73ffffffffffffffffffffffffffffffffffffffff161461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614a8f565b60405180910390fd5b565b806003600082825461309291906143b0565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131449190613aee565b60405180910390a35050565b60006127106002600354613164919061430e565b61316e919061437f565b905090565b6001600c60006101000a81548160ff0219169083151502179055506000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600267ffffffffffffffff8111156131ef576131ee614aaf565b5b60405190808252806020026020018201604052801561321d5781602001602082028036833780820191505090505b509050308160008151811061323557613234614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613300919061421d565b8160018151811061331457613313614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016133b2959493929190614bcb565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b5050505060004790506000601354826133f9919061437f565b9050600081836134099190614476565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613451906145d9565b60006040518083038185875af1925050503d806000811461348e576040519150601f19603f3d011682016040523d82523d6000602084013e613493565b606091505b505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134dc906145d9565b60006040518083038185875af1925050503d8060008114613519576040519150601f19603f3d011682016040523d82523d6000602084013e61351e565b606091505b50505050505050506000600c60006101000a81548160ff021916908315150217905550565b600061354d612580565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135b85750613589612580565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135ee57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156135fc57600090506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367357612710600a5483613662919061430e565b61366c919061437f565b90506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136ea57612710600b54836136d9919061430e565b6136e3919061437f565b90506136ef565b600090505b9392505050565b600033905090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516137309190614cbd565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161376f959493929190614cd4565b60405160208183030381529060405280519060200120905090565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d99190614476565b9250508190555080600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161384e9190613aee565b60405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395857808201518184015260208101905061393d565b60008484015250505050565b6000601f19601f8301169050919050565b60006139808261391e565b61398a8185613929565b935061399a81856020860161393a565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a00826139d5565b9050919050565b613a10816139f5565b8114613a1b57600080fd5b50565b600081359050613a2d81613a07565b92915050565b6000819050919050565b613a4681613a33565b8114613a5157600080fd5b50565b600081359050613a6381613a3d565b92915050565b60008060408385031215613a8057613a7f6139d0565b5b6000613a8e85828601613a1e565b9250506020613a9f85828601613a54565b9150509250929050565b60008115159050919050565b613abe81613aa9565b82525050565b6000602082019050613ad96000830184613ab5565b92915050565b613ae881613a33565b82525050565b6000602082019050613b036000830184613adf565b92915050565b600080600060608486031215613b2257613b216139d0565b5b6000613b3086828701613a1e565b9350506020613b4186828701613a1e565b9250506040613b5286828701613a54565b9150509250925092565b600060ff82169050919050565b613b7281613b5c565b82525050565b6000602082019050613b8d6000830184613b69565b92915050565b600060208284031215613ba957613ba86139d0565b5b6000613bb784828501613a1e565b91505092915050565b6000819050919050565b613bd381613bc0565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b600060208284031215613c0a57613c096139d0565b5b6000613c1884828501613a54565b91505092915050565b600063ffffffff82169050919050565b613c3a81613c21565b8114613c4557600080fd5b50565b600081359050613c5781613c31565b92915050565b60008060408385031215613c7457613c736139d0565b5b6000613c8285828601613c48565b9250506020613c9385828601613a1e565b9150509250929050565b613ca6816139f5565b82525050565b6000602082019050613cc16000830184613c9d565b92915050565b60008060408385031215613cde57613cdd6139d0565b5b6000613cec85828601613a1e565b9250506020613cfd85828601613a1e565b9150509250929050565b60008060408385031215613d1e57613d1d6139d0565b5b6000613d2c85828601613a54565b9250506020613d3d85828601613a54565b9150509250929050565b6000819050919050565b6000613d6c613d67613d62846139d5565b613d47565b6139d5565b9050919050565b6000613d7e82613d51565b9050919050565b6000613d9082613d73565b9050919050565b613da081613d85565b82525050565b6000602082019050613dbb6000830184613d97565b92915050565b6000613dcc82613d73565b9050919050565b613ddc81613dc1565b82525050565b6000602082019050613df76000830184613dd3565b92915050565b613e0681613b5c565b8114613e1157600080fd5b50565b600081359050613e2381613dfd565b92915050565b613e3281613bc0565b8114613e3d57600080fd5b50565b600081359050613e4f81613e29565b92915050565b600080600080600080600060e0888a031215613e7457613e736139d0565b5b6000613e828a828b01613a1e565b9750506020613e938a828b01613a1e565b9650506040613ea48a828b01613a54565b9550506060613eb58a828b01613a54565b9450506080613ec68a828b01613e14565b93505060a0613ed78a828b01613e40565b92505060c0613ee88a828b01613e40565b91505092959891949750929550565b613f0081613aa9565b8114613f0b57600080fd5b50565b600081359050613f1d81613ef7565b92915050565b60008060408385031215613f3a57613f396139d0565b5b6000613f4885828601613a1e565b9250506020613f5985828601613f0e565b9150509250929050565b600060208284031215613f7957613f786139d0565b5b6000613f8784828501613c48565b91505092915050565b6000613f9b82613d73565b9050919050565b613fab81613f90565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f616c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000614062601083613929565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f6e756c6c20616464726573730000000000000000000000000000000000000000600082015250565b60006140ce600c83613929565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b6000819050919050565b600061412961412461411f84614104565b613d47565b613a33565b9050919050565b6141398161410e565b82525050565b600060c0820190506141546000830189613c9d565b6141616020830188613adf565b61416e6040830187614130565b61417b6060830186614130565b6141886080830185613c9d565b61419560a0830184613adf565b979650505050505050565b6000815190506141af81613a3d565b92915050565b6000806000606084860312156141ce576141cd6139d0565b5b60006141dc868287016141a0565b93505060206141ed868287016141a0565b92505060406141fe868287016141a0565b9150509250925092565b60008151905061421781613a07565b92915050565b600060208284031215614233576142326139d0565b5b600061424184828501614208565b91505092915050565b600060408201905061425f6000830185613c9d565b61426c6020830184613c9d565b9392505050565b7f6e756d6265727320646f6e277420616464207570000000000000000000000000600082015250565b60006142a9601483613929565b91506142b482614273565b602082019050919050565b600060208201905081810360008301526142d88161429c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061431982613a33565b915061432483613a33565b925082820261433281613a33565b91508282048414831517614349576143486142df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438a82613a33565b915061439583613a33565b9250826143a5576143a4614350565b5b828204905092915050565b60006143bb82613a33565b91506143c683613a33565b92508282019050808211156143de576143dd6142df565b5b92915050565b7f5472616e736665722077696c6c206578636565642077616c6c6574206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614440602183613929565b915061444b826143e4565b604082019050919050565b6000602082019050818103600083015261446f81614433565b9050919050565b600061448182613a33565b915061448c83613a33565b92508282039050818111156144a4576144a36142df565b5b92915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e0000000000600082015250565b60006144e0601b83613929565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f6f6e6c792064657620616464726573732063616e2063616c6c2066756e63746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614572602283613929565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b600081905092915050565b50565b60006145c36000836145a8565b91506145ce826145b3565b600082019050919050565b60006145e4826145b6565b9150819050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614624601c83613929565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b6000602082840312156146705761466f6139d0565b5b600061467e848285016141a0565b91505092915050565b600060408201905061469c6000830185613c9d565b6146a96020830184613adf565b9392505050565b6000815190506146bf81613ef7565b92915050565b6000602082840312156146db576146da6139d0565b5b60006146e9848285016146b0565b91505092915050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000614728601783613929565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b600060c0820190506147736000830189613bca565b6147806020830188613c9d565b61478d6040830187613c9d565b61479a6060830186613adf565b6147a76080830185613adf565b6147b460a0830184613adf565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006148006002836147bf565b915061480b826147ca565b600282019050919050565b6000819050919050565b61483161482c82613bc0565b614816565b82525050565b6000614842826147f3565b915061484e8285614820565b60208201915061485e8284614820565b6020820191508190509392505050565b60006080820190506148836000830187613bca565b6148906020830186613b69565b61489d6040830185613bca565b6148aa6060830184613bca565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b60006148e9600e83613929565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f57616c6c65744c696d69743a20416c72656164792073657420746f207468697360008201527f2076616c75650000000000000000000000000000000000000000000000000000602082015250565b600061497b602683613929565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a0d602683613929565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a79602083613929565b9150614a8482614a43565b602082019050919050565b60006020820190508181036000830152614aa881614a6c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b42816139f5565b82525050565b6000614b548383614b39565b60208301905092915050565b6000602082019050919050565b6000614b7882614b0d565b614b828185614b18565b9350614b8d83614b29565b8060005b83811015614bbe578151614ba58882614b48565b9750614bb083614b60565b925050600181019050614b91565b5085935050505092915050565b600060a082019050614be06000830188613adf565b614bed6020830187614130565b8181036040830152614bff8186614b6d565b9050614c0e6060830185613c9d565b614c1b6080830184613adf565b9695505050505050565b60008190508160005260206000209050919050565b60008154614c4781613ffb565b614c5181866145a8565b94506001821660008114614c6c5760018114614c8157614cb4565b60ff1983168652811515820286019350614cb4565b614c8a85614c25565b60005b83811015614cac57815481890152600182019150602081019050614c8d565b838801955050505b50505092915050565b6000614cc98284614c3a565b915081905092915050565b600060a082019050614ce96000830188613bca565b614cf66020830187613bca565b614d036040830186613bca565b614d106060830185613adf565b614d1d6080830184613c9d565b969550505050505056fea26469706673582212206f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a64736f6c63430008130033
Deployed Bytecode
0x60806040526004361061028c5760003560e01c80637ecebe001161015a578063b40f9469116100c1578063dd62ed3e1161007a578063dd62ed3e1461099b578063e16830a8146109d8578063eec1c69f14610a01578063f2fde38b14610a3e578063f887ea4014610a67578063f98eb6e114610a9257610293565b8063b40f946914610889578063c45a0155146108c6578063c473413a146108f1578063cffd129c1461091c578063d3f3300914610947578063d505accf1461097257610293565b806395d89b411161011357806395d89b41146107795780639b72ea4a146107a4578063a0496f6f146107cd578063a8aa1b31146107f6578063a9059cbb14610821578063b3e5cb451461085e57610293565b80637ecebe00146106535780637f50ce17146106905780638366e79a146106bb5780638da5cb5b146106f857806391cca3db1461072357806392108c861461074e57610293565b80633644e515116101fe57806370a08231116101b757806370a0823114610555578063715018a614610592578063728d41c9146105a957806375f0a874146105d257806377818f02146105fd5780637d5ea21b1461062857610293565b80633644e51514610447578063405ebd4d1461047257806342966c681461049b5780635d098b38146104c457806366a88d96146104ed5780636e9ed75a1461051857610293565b8063270fd20a11610250578063270fd20a1461036f5780632ca1b45d1461039a578063307aebc9146103b1578063313ce567146103dc57806335d4de511461040757806335faa4161461043057610293565b806306fdde031461029557806307df7a0d146102c0578063095ea7b3146102ca57806318160ddd1461030757806323b872dd1461033257610293565b3661029357005b005b3480156102a157600080fd5b506102aa610aa9565b6040516102b791906139ae565b60405180910390f35b6102c8610b37565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190613a69565b6113c0565b6040516102fe9190613ac4565b60405180910390f35b34801561031357600080fd5b5061031c6114b2565b6040516103299190613aee565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613b09565b6114b8565b6040516103669190613ac4565b60405180910390f35b34801561037b57600080fd5b50610384611a51565b6040516103919190613ac4565b60405180910390f35b3480156103a657600080fd5b506103af611a64565b005b3480156103bd57600080fd5b506103c6611b17565b6040516103d39190613ac4565b60405180910390f35b3480156103e857600080fd5b506103f1611b2a565b6040516103fe9190613b78565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b93565b611b4e565b005b34801561043c57600080fd5b50610445611c98565b005b34801561045357600080fd5b5061045c611dc2565b6040516104699190613bd9565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613b93565b611e1f565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613bf4565b611f69565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190613b93565b611f76565b005b3480156104f957600080fd5b506105026120c0565b60405161050f9190613aee565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613c5d565b6120c6565b60405161054c9190613ac4565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b93565b612204565b6040516105899190613aee565b60405180910390f35b34801561059e57600080fd5b506105a761221c565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613bf4565b612230565b005b3480156105de57600080fd5b506105e76122f0565b6040516105f49190613cac565b60405180910390f35b34801561060957600080fd5b50610612612316565b60405161061f9190613cac565b60405180910390f35b34801561063457600080fd5b5061063d61233c565b60405161064a9190613ac4565b60405180910390f35b34801561065f57600080fd5b5061067a60048036038101906106759190613b93565b61234f565b6040516106879190613aee565b60405180910390f35b34801561069c57600080fd5b506106a5612367565b6040516106b29190613ac4565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613cc7565b612374565b6040516106ef9190613ac4565b60405180910390f35b34801561070457600080fd5b5061070d612580565b60405161071a9190613cac565b60405180910390f35b34801561072f57600080fd5b506107386125a9565b6040516107459190613cac565b60405180910390f35b34801561075a57600080fd5b506107636125cf565b6040516107709190613ac4565b60405180910390f35b34801561078557600080fd5b5061078e6125ed565b60405161079b91906139ae565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613bf4565b61267b565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613d07565b61271c565b005b34801561080257600080fd5b5061080b6127c5565b6040516108189190613da6565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a69565b6127eb565b6040516108559190613ac4565b60405180910390f35b34801561086a57600080fd5b50610873612800565b6040516108809190613ac4565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613b93565b61280b565b6040516108bd9190613ac4565b60405180910390f35b3480156108d257600080fd5b506108db61282b565b6040516108e89190613de2565b60405180910390f35b3480156108fd57600080fd5b50610906612851565b6040516109139190613aee565b60405180910390f35b34801561092857600080fd5b50610931612857565b60405161093e9190613aee565b60405180910390f35b34801561095357600080fd5b5061095c61285d565b6040516109699190613cac565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613e55565b612883565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613cc7565b612b7c565b6040516109cf9190613aee565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190613f23565b612ba1565b005b348015610a0d57600080fd5b50610a286004803603810190610a239190613f63565b612d25565b604051610a359190613ac4565b60405180910390f35b348015610a4a57600080fd5b50610a656004803603810190610a609190613b93565b612ea6565b005b348015610a7357600080fd5b50610a7c612f29565b604051610a899190613fb1565b60405180910390f35b348015610a9e57600080fd5b50610aa7612f4f565b005b60018054610ab690613ffb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290613ffb565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b505050505081565b610b3f613002565b600c60159054906101000a900460ff1615610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690614078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c17906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca8906140e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d39906140e4565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610d8f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16655af3107a4000613080565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7193430600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600080610e1a612580565b426040518863ffffffff1660e01b8152600401610e3c9695949392919061413f565b60606040518083038185885af1158015610e5a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e7f91906141b5565b505050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061421d565b6040518363ffffffff1660e01b8152600401610f6f92919061424a565b602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061421d565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160116000610ffe612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061421d565b6040518363ffffffff1660e01b815260040161128e92919061424a565b602060405180830381865afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf919061421d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555066038d7ea4c680006003541461136b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611362906142bf565b60405180910390fd5b612710609666038d7ea4c68000611382919061430e565b61138c919061437f565b6010819055507f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114a09190613aee565b60405180910390a36001905092915050565b60035481565b600060105482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150891906143b0565b11158061155e5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806115b65750600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614456565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461175f576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461175d5782816116dc9190614476565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b611767613150565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117c15750600c60009054906101000a900460ff16155b801561181b5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561185357503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561186157611860613173565b5b600061186e858585613543565b90506000818461187e9190614476565b905083600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cf9190614476565b9250508190555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119809190613aee565b60405180910390a36000821115611a445781600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a3b9190613aee565b60405180910390a35b6001925050509392505050565b601260019054906101000a900460ff1681565b611a6c613002565b601260009054906101000a900460ff1615611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906144f6565b60405180910390fd5b6001601260006101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000881565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b8f6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b906140e4565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cd96136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2690614588565b60405180910390fd5b6000479050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611d7a906145d9565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b50505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614611df857611df36136fe565b611e1a565b7f3610d7de155c55024bd0ca70aad37e855d7bc8cdd0eb42df52884b90549a4b165b905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e606136f6565b73ffffffffffffffffffffffffffffffffffffffff1614611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c906140e4565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f73338261378a565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906140e4565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b6000806120d16136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516121f19190613aee565b60405180910390a3600191505092915050565b60046020528060005260406000206000915090505481565b612224613002565b61222e600061385a565b565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122716136f6565b73ffffffffffffffffffffffffffffffffffffffff16146122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be90614588565b60405180910390fd5b6127108166038d7ea4c680006122dd919061430e565b6122e7919061437f565b60108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60066020528060005260406000206000915090505481565b600062aa36a74614905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123b76136f6565b73ffffffffffffffffffffffffffffffffffffffff161461240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614588565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361247b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124729061463a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124b69190613cac565b602060405180830381865afa1580156124d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f7919061465a565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401612534929190614687565b6020604051808303816000875af1158015612553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257791906146c5565b91505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006125d9612800565b806125e857506125e7612367565b5b905090565b600280546125fa90613ffb565b80601f016020809104026020016040519081016040528092919081815260200182805461262690613ffb565b80156126735780601f1061264857610100808354040283529160200191612673565b820191906000526020600020905b81548152906001019060200180831161265657829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126bc6136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614588565b60405180910390fd5b8060138190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275d6136f6565b73ffffffffffffffffffffffffffffffffffffffff16146127b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127aa90614588565b60405180910390fd5b81600a8190555080600b819055505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006127f83384846114b8565b905092915050565b600060054614905090565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600b5481565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b428410156128c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd9061473e565b60405180910390fd5b600060016128d2611dc2565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b60405160200161295a9695949392919061475e565b60405160208183030381529060405280519060200120604051602001612981929190614837565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516129b7949392919061486e565b6020604051602081039080840390855afa1580156129d9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612a4d57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906148ff565b60405180910390fd5b85600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051612b6b9190613aee565b60405180910390a350505050505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612be26136f6565b73ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614588565b60405180910390fd5b801515601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc190614991565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080612d306136f6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051612e949190613aee565b60405180910390a36001915050919050565b612eae613002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1490614a23565b60405180910390fd5b612f268161385a565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612f57613002565b601260019054906101000a900460ff1615612fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9e906144f6565b60405180910390fd5b6001601260016101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b61300a6136f6565b73ffffffffffffffffffffffffffffffffffffffff16613028612580565b73ffffffffffffffffffffffffffffffffffffffff161461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614a8f565b60405180910390fd5b565b806003600082825461309291906143b0565b9250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131449190613aee565b60405180910390a35050565b60006127106002600354613164919061430e565b61316e919061437f565b905090565b6001600c60006101000a81548160ff0219169083151502179055506000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600267ffffffffffffffff8111156131ef576131ee614aaf565b5b60405190808252806020026020018201604052801561321d5781602001602082028036833780820191505090505b509050308160008151811061323557613234614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613300919061421d565b8160018151811061331457613313614ade565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016133b2959493929190614bcb565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b5050505060004790506000601354826133f9919061437f565b9050600081836134099190614476565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613451906145d9565b60006040518083038185875af1925050503d806000811461348e576040519150601f19603f3d011682016040523d82523d6000602084013e613493565b606091505b505050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516134dc906145d9565b60006040518083038185875af1925050503d8060008114613519576040519150601f19603f3d011682016040523d82523d6000602084013e61351e565b606091505b50505050505050506000600c60006101000a81548160ff021916908315150217905550565b600061354d612580565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135b85750613589612580565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135ee57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156135fc57600090506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361367357612710600a5483613662919061430e565b61366c919061437f565b90506136ef565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136ea57612710600b54836136d9919061430e565b6136e3919061437f565b90506136ef565b600090505b9392505050565b600033905090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516137309190614cbd565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161376f959493929190614cd4565b60405160208183030381529060405280519060200120905090565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d99190614476565b9250508190555080600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161384e9190613aee565b60405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395857808201518184015260208101905061393d565b60008484015250505050565b6000601f19601f8301169050919050565b60006139808261391e565b61398a8185613929565b935061399a81856020860161393a565b6139a381613964565b840191505092915050565b600060208201905081810360008301526139c88184613975565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a00826139d5565b9050919050565b613a10816139f5565b8114613a1b57600080fd5b50565b600081359050613a2d81613a07565b92915050565b6000819050919050565b613a4681613a33565b8114613a5157600080fd5b50565b600081359050613a6381613a3d565b92915050565b60008060408385031215613a8057613a7f6139d0565b5b6000613a8e85828601613a1e565b9250506020613a9f85828601613a54565b9150509250929050565b60008115159050919050565b613abe81613aa9565b82525050565b6000602082019050613ad96000830184613ab5565b92915050565b613ae881613a33565b82525050565b6000602082019050613b036000830184613adf565b92915050565b600080600060608486031215613b2257613b216139d0565b5b6000613b3086828701613a1e565b9350506020613b4186828701613a1e565b9250506040613b5286828701613a54565b9150509250925092565b600060ff82169050919050565b613b7281613b5c565b82525050565b6000602082019050613b8d6000830184613b69565b92915050565b600060208284031215613ba957613ba86139d0565b5b6000613bb784828501613a1e565b91505092915050565b6000819050919050565b613bd381613bc0565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b600060208284031215613c0a57613c096139d0565b5b6000613c1884828501613a54565b91505092915050565b600063ffffffff82169050919050565b613c3a81613c21565b8114613c4557600080fd5b50565b600081359050613c5781613c31565b92915050565b60008060408385031215613c7457613c736139d0565b5b6000613c8285828601613c48565b9250506020613c9385828601613a1e565b9150509250929050565b613ca6816139f5565b82525050565b6000602082019050613cc16000830184613c9d565b92915050565b60008060408385031215613cde57613cdd6139d0565b5b6000613cec85828601613a1e565b9250506020613cfd85828601613a1e565b9150509250929050565b60008060408385031215613d1e57613d1d6139d0565b5b6000613d2c85828601613a54565b9250506020613d3d85828601613a54565b9150509250929050565b6000819050919050565b6000613d6c613d67613d62846139d5565b613d47565b6139d5565b9050919050565b6000613d7e82613d51565b9050919050565b6000613d9082613d73565b9050919050565b613da081613d85565b82525050565b6000602082019050613dbb6000830184613d97565b92915050565b6000613dcc82613d73565b9050919050565b613ddc81613dc1565b82525050565b6000602082019050613df76000830184613dd3565b92915050565b613e0681613b5c565b8114613e1157600080fd5b50565b600081359050613e2381613dfd565b92915050565b613e3281613bc0565b8114613e3d57600080fd5b50565b600081359050613e4f81613e29565b92915050565b600080600080600080600060e0888a031215613e7457613e736139d0565b5b6000613e828a828b01613a1e565b9750506020613e938a828b01613a1e565b9650506040613ea48a828b01613a54565b9550506060613eb58a828b01613a54565b9450506080613ec68a828b01613e14565b93505060a0613ed78a828b01613e40565b92505060c0613ee88a828b01613e40565b91505092959891949750929550565b613f0081613aa9565b8114613f0b57600080fd5b50565b600081359050613f1d81613ef7565b92915050565b60008060408385031215613f3a57613f396139d0565b5b6000613f4885828601613a1e565b9250506020613f5985828601613f0e565b9150509250929050565b600060208284031215613f7957613f786139d0565b5b6000613f8784828501613c48565b91505092915050565b6000613f9b82613d73565b9050919050565b613fab81613f90565b82525050565b6000602082019050613fc66000830184613fa2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061401357607f821691505b60208210810361402657614025613fcc565b5b50919050565b7f616c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000614062601083613929565b915061406d8261402c565b602082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f6e756c6c20616464726573730000000000000000000000000000000000000000600082015250565b60006140ce600c83613929565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b6000819050919050565b600061412961412461411f84614104565b613d47565b613a33565b9050919050565b6141398161410e565b82525050565b600060c0820190506141546000830189613c9d565b6141616020830188613adf565b61416e6040830187614130565b61417b6060830186614130565b6141886080830185613c9d565b61419560a0830184613adf565b979650505050505050565b6000815190506141af81613a3d565b92915050565b6000806000606084860312156141ce576141cd6139d0565b5b60006141dc868287016141a0565b93505060206141ed868287016141a0565b92505060406141fe868287016141a0565b9150509250925092565b60008151905061421781613a07565b92915050565b600060208284031215614233576142326139d0565b5b600061424184828501614208565b91505092915050565b600060408201905061425f6000830185613c9d565b61426c6020830184613c9d565b9392505050565b7f6e756d6265727320646f6e277420616464207570000000000000000000000000600082015250565b60006142a9601483613929565b91506142b482614273565b602082019050919050565b600060208201905081810360008301526142d88161429c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061431982613a33565b915061432483613a33565b925082820261433281613a33565b91508282048414831517614349576143486142df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438a82613a33565b915061439583613a33565b9250826143a5576143a4614350565b5b828204905092915050565b60006143bb82613a33565b91506143c683613a33565b92508282019050808211156143de576143dd6142df565b5b92915050565b7f5472616e736665722077696c6c206578636565642077616c6c6574206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614440602183613929565b915061444b826143e4565b604082019050919050565b6000602082019050818103600083015261446f81614433565b9050919050565b600061448182613a33565b915061448c83613a33565b92508282039050818111156144a4576144a36142df565b5b92915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e0000000000600082015250565b60006144e0601b83613929565b91506144eb826144aa565b602082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b7f6f6e6c792064657620616464726573732063616e2063616c6c2066756e63746960008201527f6f6e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614572602283613929565b915061457d82614516565b604082019050919050565b600060208201905081810360008301526145a181614565565b9050919050565b600081905092915050565b50565b60006145c36000836145a8565b91506145ce826145b3565b600082019050919050565b60006145e4826145b6565b9150819050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614624601c83613929565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b6000602082840312156146705761466f6139d0565b5b600061467e848285016141a0565b91505092915050565b600060408201905061469c6000830185613c9d565b6146a96020830184613adf565b9392505050565b6000815190506146bf81613ef7565b92915050565b6000602082840312156146db576146da6139d0565b5b60006146e9848285016146b0565b91505092915050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000614728601783613929565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b600060c0820190506147736000830189613bca565b6147806020830188613c9d565b61478d6040830187613c9d565b61479a6060830186613adf565b6147a76080830185613adf565b6147b460a0830184613adf565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006148006002836147bf565b915061480b826147ca565b600282019050919050565b6000819050919050565b61483161482c82613bc0565b614816565b82525050565b6000614842826147f3565b915061484e8285614820565b60208201915061485e8284614820565b6020820191508190509392505050565b60006080820190506148836000830187613bca565b6148906020830186613b69565b61489d6040830185613bca565b6148aa6060830184613bca565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b60006148e9600e83613929565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f57616c6c65744c696d69743a20416c72656164792073657420746f207468697360008201527f2076616c75650000000000000000000000000000000000000000000000000000602082015250565b600061497b602683613929565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a0d602683613929565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a79602083613929565b9150614a8482614a43565b602082019050919050565b60006020820190508181036000830152614aa881614a6c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b42816139f5565b82525050565b6000614b548383614b39565b60208301905092915050565b6000602082019050919050565b6000614b7882614b0d565b614b828185614b18565b9350614b8d83614b29565b8060005b83811015614bbe578151614ba58882614b48565b9750614bb083614b60565b925050600181019050614b91565b5085935050505092915050565b600060a082019050614be06000830188613adf565b614bed6020830187614130565b8181036040830152614bff8186614b6d565b9050614c0e6060830185613c9d565b614c1b6080830184613adf565b9695505050505050565b60008190508160005260206000209050919050565b60008154614c4781613ffb565b614c5181866145a8565b94506001821660008114614c6c5760018114614c8157614cb4565b60ff1983168652811515820286019350614cb4565b614c8a85614c25565b60005b83811015614cac57815481890152600182019150602081019050614c8d565b838801955050505b50505092915050565b6000614cc98284614c3a565b915081905092915050565b600060a082019050614ce96000830188613bca565b614cf66020830187613bca565b614d036040830186613bca565b614d106060830185613adf565b614d1d6080830184613c9d565b969550505050505056fea26469706673582212206f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a64736f6c63430008130033
Deployed Bytecode Sourcemap
22420:13190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7464:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27736:1219;;;:::i;:::-;;8907:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32962:1904;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23718:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25599:233;;;;;;;;;;;;;:::i;:::-;;23314:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7520:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27509:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31947:206;;;;;;;;;;;;;:::i;:::-;;11979:226;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26633:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25073:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27052:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23532:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35326:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7782:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2746:103;;;;;;;;;;;;;:::i;:::-;;26847:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23345:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23427:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23688:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8208:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25385:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34872:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2098:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23505:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25492:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7491:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31449:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27287:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22542:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32382:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25286:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23623:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22503:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23066:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23100:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23278:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10395:1576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7835:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31626:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26367:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3004:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22464:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25840:241;;;;;;;;;;;;;:::i;:::-;;7464:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27736:1219::-;1984:13;:11;:13::i;:::-;27808:10:::1;;;;;;;;;;;27807:11;27799:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;27885:1;27858:29;;:15;;;;;;;;;;;:29;;::::0;27850:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27946:1;27923:25;;:11;;;;;;;;;;;:25;;::::0;27915:50:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28008:1;27984:26;;:12;;;;;;;;;;;:26;;::::0;27976:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28051:4;28038:10;;:17;;;;;;;;;;;;;;;;;;28068:26;28074:12;;;;;;;;;;;22856:19;28068:5;:26::i;:::-;28107:6;;;;;;;;;;;:22;;;28137:9;28170:4;28190:9;:24;28208:4;28190:24;;;;;;;;;;;;;;;;28229:1;28245::::0;28261:7:::1;:5;:7::i;:::-;28283:15;28107:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28344:7;;;;;;;;;;;:15;;;28368:4;28375:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28344:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28322:4;;:68;;;;;;;;;;;;;;;;;;28438:4;28401:25;:34;28427:7;:5;:7::i;:::-;28401:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;28496:4;28453:25;:40;28487:4;28453:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;28556:4;28511:25;:42;28537:15;;;;;;;;;;;28511:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;28612:4;28571:25;:38;28597:11;;;;;;;;;;;28571:38;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;28702:4;28627:25;:72;28653:7;;;;;;;;;;;:15;;;28677:4;28684:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28653:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28627:72;;;;;;;;;;;;;;;;:79;;;;;;;;;;;;;;;;;;22616:20;28729:11;;:29;28721:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28901:6;28894:3;22616:20;28877;;;;:::i;:::-;28876:31;;;;:::i;:::-;28858:14;:49;;;;28925:22;;;;;;;;;;27736:1219::o:0;8907:242::-;9006:4;9056:6;9023:9;:21;9033:10;9023:21;;;;;;;;;;;;;;;:30;9045:7;9023:30;;;;;;;;;;;;;;;:39;;;;9101:7;9080:37;;9089:10;9080:37;;;9110:6;9080:37;;;;;;:::i;:::-;;;;;;;;9137:4;9130:11;;8907:242;;;;:::o;7747:26::-;;;;:::o;32962:1904::-;33082:4;33134:14;;33124:6;33108:9;:13;33118:2;33108:13;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;:40;;33107:75;;;;33153:25;:29;33179:2;33153:29;;;;;;;;;;;;;;;;;;;;;;;;;33107:75;:101;;;;33195:12;;;;;;;;;;;33187:20;;:4;:20;;;33107:101;33099:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;33269:10;33261:18;;:4;:18;;;33257:289;;33345:12;33360:9;:15;33370:4;33360:15;;;;;;;;;;;;;;;:27;33376:10;33360:27;;;;;;;;;;;;;;;;33345:42;;33455:14;33444:7;:25;33440:94;;33528:6;33518:7;:16;;;;:::i;:::-;33488:9;:15;33498:4;33488:15;;;;;;;;;;;;;;;:27;33504:10;33488:27;;;;;;;;;;;;;;;:46;;;;33440:94;33281:265;33257:289;33783:18;:16;:18::i;:::-;33756:9;:24;33774:4;33756:24;;;;;;;;;;;;;;;;:45;:86;;;;;33819:23;;;;;;;;;;;33818:24;33756:86;:124;;;;;33875:4;;;;;;;;;;;33859:21;;:4;:21;;;;33756:124;:162;;;;;33913:4;33897:21;;:4;:21;;;;33756:162;33738:239;;;33945:20;:18;:20::i;:::-;33738:239;33989:8;34000:25;34008:4;34014:2;34018:6;34000:7;:25::i;:::-;33989:36;;34036:19;34067:3;34058:6;:12;;;;:::i;:::-;34036:34;;34102:6;34083:9;:15;34093:4;34083:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;34273:14;34256:9;:13;34266:2;34256:13;;;;;;;;;;;;;;;;:31;;;;;;;;;;;34331:2;34316:34;;34325:4;34316:34;;;34335:14;34316:34;;;;;;:::i;:::-;;;;;;;;34373:1;34367:3;:7;34363:472;;;34565:3;34537:9;:24;34555:4;34537:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;34751:4;34728:34;;34737:4;34728:34;;;34758:3;34728:34;;;;;;:::i;:::-;;;;;;;;34363:472;34854:4;34847:11;;;;32962:1904;;;;;:::o;23718:26::-;;;;;;;;;;;;;:::o;25599:233::-;1984:13;:11;:13::i;:::-;25665:11:::1;;;;;;;;;;;25664:12;25656:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;25733:4;25719:11;;:18;;;;;;;;;;;;;;;;;;25760:4;25748:9;:16;;;;25788:4;25775:10;:17;;;;25808:16;;;;;;;;;;25599:233::o:0;23314:22::-;;;;;;;;;;;;;:::o;7520:31::-;;;:::o;27509:219::-;27591:3;;;;;;;;;;;27575:19;;:12;:10;:12::i;:::-;:19;;;27567:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27670:1;27652:20;;:6;:20;;;27644:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27714:6;27700:11;;:20;;;;;;;;;;;;;;;;;;27509:219;:::o;31947:206::-;32008:3;;;;;;;;;;;31992:19;;:12;:10;:12::i;:::-;:19;;;31984:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:18;32082:21;32061:42;;32114:3;;;;;;;;;;;:8;;32130:10;32114:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31973:180;31947:206::o;11979:226::-;12036:7;12093:16;12076:13;:33;:121;;12173:24;:22;:24::i;:::-;12076:121;;;12129:24;12076:121;12056:141;;11979:226;:::o;26633:206::-;26711:3;;;;;;;;;;;26695:19;;:12;:10;:12::i;:::-;:19;;;26687:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:1;26772:15;;:1;:15;;;26764:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;26830:1;26815:12;;:16;;;;;;;;;;;;;;;;;;26633:206;:::o;25073:80::-;25120:25;25126:10;25138:6;25120:5;:25::i;:::-;25073:80;:::o;27052:227::-;27138:3;;;;;;;;;;;27122:19;;:12;:10;:12::i;:::-;:19;;;27114:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27217:1;27199:20;;:6;:20;;;27191:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27265:6;27247:15;;:24;;;;;;;;;;;;;;;;;;27052:227;:::o;23532:46::-;;;;:::o;35326:281::-;35411:4;35428:13;35444:12;:10;:12::i;:::-;35428:28;;35501:14;35469:9;:16;35479:5;35469:16;;;;;;;;;;;;;;;:29;35486:11;35469:29;;;;;;;;;;;;;;;:46;;;;35547:11;35531:44;;35540:5;35531:44;;;35560:14;35531:44;;;;;;:::i;:::-;;;;;;;;35595:4;35588:11;;;35326:281;;;;:::o;7782:44::-;;;;;;;;;;;;;;;;;:::o;2746:103::-;1984:13;:11;:13::i;:::-;2811:30:::1;2838:1;2811:18;:30::i;:::-;2746:103::o:0;26847:197::-;26932:3;;;;;;;;;;;26916:19;;:12;:10;:12::i;:::-;:19;;;26908:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27030:6;27020;22616:20;27003:23;;;;:::i;:::-;27002:34;;;;:::i;:::-;26985:14;:51;;;;26847:197;:::o;23345:75::-;;;;;;;;;;;;;:::o;23427:71::-;;;;;;;;;;;;;:::o;23688:23::-;;;;;;;;;;;;;:::o;8208:41::-;;;;;;;;;;;;;;;;;:::o;25385:99::-;25427:4;25468:8;25451:13;:25;25444:32;;25385:99;:::o;34872:390::-;34949:10;34995:3;;;;;;;;;;;34979:19;;:12;:10;:12::i;:::-;:19;;;34971:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35074:4;35056:23;;:6;:23;;;35048:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35123:24;35157:6;35150:24;;;35183:4;35150:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35123:66;;35215:6;35208:23;;;35232:3;35237:16;35208:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35200:54;;34960:302;34872:390;;;;:::o;2098:87::-;2144:7;2171:6;;;;;;;;;;;2164:13;;2098:87;:::o;23505:18::-;;;;;;;;;;;;;:::o;25492:99::-;25534:4;25558:10;:8;:10::i;:::-;:25;;;;25572:11;:9;:11::i;:::-;25558:25;25551:32;;25492:99;:::o;7491:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31449:169::-;31538:3;;;;;;;;;;;31522:19;;:12;:10;:12::i;:::-;:19;;;31514:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31600:10;31588:9;:22;;;;31449:169;:::o;27287:214::-;27383:3;;;;;;;;;;;27367:19;;:12;:10;:12::i;:::-;:19;;;27359:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27448:10;27436:9;:22;;;;27482:11;27469:10;:24;;;;27287:214;;:::o;22542:26::-;;;;;;;;;;;;;:::o;32382:136::-;32450:4;32474:36;32487:10;32499:2;32503:6;32474:12;:36::i;:::-;32467:43;;32382:136;;;;:::o;25286:91::-;25327:4;25368:1;25351:13;:18;25344:25;;25286:91;:::o;23623:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;22503:32::-;;;;;;;;;;;;;:::o;23066:27::-;;;;:::o;23100:28::-;;;;:::o;23278:27::-;;;;;;;;;;;;;:::o;10395:1576::-;10623:15;10611:8;:27;;10603:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10836:24;10863:827;11003:18;:16;:18::i;:::-;11133:167;11335:5;11375:7;11417:5;11457:6;:13;11464:5;11457:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;11507:8;11088:458;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11048:525;;;;;;10923:673;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10891:724;;;;;;11634:1;11654;11674;10863:827;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10836:854;;11761:1;11733:30;;:16;:30;;;;:59;;;;;11787:5;11767:25;;:16;:25;;;11733:59;11707:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;11898:5;11859:9;:27;11869:16;11859:27;;;;;;;;;;;;;;;:36;11887:7;11859:36;;;;;;;;;;;;;;;:44;;;;10811:1104;11948:7;11932:31;;11941:5;11932:31;;;11957:5;11932:31;;;;;;:::i;:::-;;;;;;;;10395:1576;;;;;;;:::o;7835:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31626:313::-;31731:3;;;;;;;;;;;31715:19;;:12;:10;:12::i;:::-;:19;;;31707:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31830:5;31792:43;;:25;:34;31818:7;31792:34;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;31784:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;31926:5;31889:25;:34;31915:7;31889:34;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;31626:313;;:::o;26367:258::-;26427:4;26444:13;26460:12;:10;:12::i;:::-;26444:28;;26518:14;26485:9;:16;26495:5;26485:16;;;;;;;;;;;;;;;:30;26502:12;;;;;;;;;;;26485:30;;;;;;;;;;;;;;;:47;;;;26564:12;;;;;;;;;;;26548:45;;26557:5;26548:45;;;26578:14;26548:45;;;;;;:::i;:::-;;;;;;;;26613:4;26606:11;;;26367:258;;;:::o;3004:238::-;1984:13;:11;:13::i;:::-;3127:1:::1;3107:22;;:8;:22;;::::0;3085:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3206:28;3225:8;3206:18;:28::i;:::-;3004:238:::0;:::o;22464:32::-;;;;;;;;;;;;;:::o;25840:241::-;1984:13;:11;:13::i;:::-;25907:14:::1;;;;;;;;;;;25906:15;25898:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;25981:4;25964:14;;:21;;;;;;;;;;;;;;;;;;26008:3;25996:9;:15;;;;26035:3;26022:10;:16;;;;26054:19;;;;;;;;;;25840:241::o:0;2263:132::-;2338:12;:10;:12::i;:::-;2327:23;;:7;:5;:7::i;:::-;:23;;;2319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2263:132::o;12918:335::-;13004:6;12989:11;;:21;;;;;;;:::i;:::-;;;;;;;;13178:6;13161:9;:13;13171:2;13161:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13234:2;13213:32;;13230:1;13213:32;;;13238:6;13213:32;;;;;;:::i;:::-;;;;;;;;12918:335;;:::o;25161:117::-;25212:4;25256:5;25251:1;25237:11;;:15;;;;:::i;:::-;25236:25;;;;:::i;:::-;25229:32;;25161:117;:::o;30079:1362::-;24827:4;24801:23;;:30;;;;;;;;;;;;;;;;;;30525:17:::1;30545:9;:24;30563:4;30545:24;;;;;;;;;;;;;;;;30525:44;;30599:21;30637:1;30623:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30599:40;;30668:4;30650;30655:1;30650:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;30694:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30684:4;30689:1;30684:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;30718:6;;;;;;;;;;;:57;;;30790:12;30817:1;30833:4;30860;30880:15;30718:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31156:18;31177:21;31156:42;;31209:20;31245:9;;31232:10;:22;;;;:::i;:::-;31209:45;;31265:26;31307:12;31294:10;:25;;;;:::i;:::-;31265:54;;31330:15;;;;;;;;;;;:20;;31358:18;31330:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31392:11;;;;;;;;;;;:16;;31416:12;31392:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30130:1311;;;;;24880:5:::0;24854:23;;:31;;;;;;;;;;;;;;;;;;30079:1362::o;29226:773::-;29339:4;29368:7;:5;:7::i;:::-;29360:15;;:4;:15;;;:32;;;;29385:7;:5;:7::i;:::-;29379:13;;:2;:13;;;29360:32;:57;;;;29412:4;29396:21;;:4;:21;;;29360:57;29356:636;;;29577:1;29570:8;;;;29356:636;29616:4;;;;;;;;;;;29600:21;;:4;:21;;;29596:396;;29719:6;29706:9;;29697:6;:18;;;;:::i;:::-;29696:29;;;;:::i;:::-;29689:36;;;;29596:396;29761:4;;;;;;;;;;;29747:19;;:2;:19;;;29743:249;;29868:6;29854:10;;29845:6;:19;;;;:::i;:::-;29844:30;;;;:::i;:::-;29837:37;;;;29743:249;29979:1;29972:8;;29226:773;;;;;;:::o;782:98::-;835:7;862:10;855:17;;782:98;:::o;12213:505::-;12278:7;12379:143;12561:4;12545:22;;;;;;:::i;:::-;;;;;;;;12590:14;12627:13;12671:4;12346:349;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12318:392;;;;;;12298:412;;12213:505;:::o;13261:338::-;13353:6;13334:9;:15;13344:4;13334:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;13522:6;13507:11;;:21;;;;;;;;;;;13580:1;13557:34;;13566:4;13557:34;;;13584:6;13557:34;;;;;;:::i;:::-;;;;;;;;13261:338;;:::o;3402:191::-;3476:16;3495:6;;;;;;;;;;;3476:25;;3521:8;3512:6;;:17;;;;;;;;;;;;;;;;;;3576:8;3545:40;;3566:8;3545:40;;;;;;;;;;;;3465:128;3402:191;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:77::-;5225:7;5254:5;5243:16;;5188:77;;;:::o;5271:118::-;5358:24;5376:5;5358:24;:::i;:::-;5353:3;5346:37;5271:118;;:::o;5395:222::-;5488:4;5526:2;5515:9;5511:18;5503:26;;5539:71;5607:1;5596:9;5592:17;5583:6;5539:71;:::i;:::-;5395:222;;;;:::o;5623:329::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:93::-;5994:7;6034:10;6027:5;6023:22;6012:33;;5958:93;;;:::o;6057:120::-;6129:23;6146:5;6129:23;:::i;:::-;6122:5;6119:34;6109:62;;6167:1;6164;6157:12;6109:62;6057:120;:::o;6183:137::-;6228:5;6266:6;6253:20;6244:29;;6282:32;6308:5;6282:32;:::i;:::-;6183:137;;;;:::o;6326:472::-;6393:6;6401;6450:2;6438:9;6429:7;6425:23;6421:32;6418:119;;;6456:79;;:::i;:::-;6418:119;6576:1;6601:52;6645:7;6636:6;6625:9;6621:22;6601:52;:::i;:::-;6591:62;;6547:116;6702:2;6728:53;6773:7;6764:6;6753:9;6749:22;6728:53;:::i;:::-;6718:63;;6673:118;6326:472;;;;;:::o;6804:118::-;6891:24;6909:5;6891:24;:::i;:::-;6886:3;6879:37;6804:118;;:::o;6928:222::-;7021:4;7059:2;7048:9;7044:18;7036:26;;7072:71;7140:1;7129:9;7125:17;7116:6;7072:71;:::i;:::-;6928:222;;;;:::o;7156:474::-;7224:6;7232;7281:2;7269:9;7260:7;7256:23;7252:32;7249:119;;;7287:79;;:::i;:::-;7249:119;7407:1;7432:53;7477:7;7468:6;7457:9;7453:22;7432:53;:::i;:::-;7422:63;;7378:117;7534:2;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7505:118;7156:474;;;;;:::o;7636:::-;7704:6;7712;7761:2;7749:9;7740:7;7736:23;7732:32;7729:119;;;7767:79;;:::i;:::-;7729:119;7887:1;7912:53;7957:7;7948:6;7937:9;7933:22;7912:53;:::i;:::-;7902:63;;7858:117;8014:2;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;:::i;:::-;8030:63;;7985:118;7636:474;;;;;:::o;8116:60::-;8144:3;8165:5;8158:12;;8116:60;;;:::o;8182:142::-;8232:9;8265:53;8283:34;8292:24;8310:5;8292:24;:::i;:::-;8283:34;:::i;:::-;8265:53;:::i;:::-;8252:66;;8182:142;;;:::o;8330:126::-;8380:9;8413:37;8444:5;8413:37;:::i;:::-;8400:50;;8330:126;;;:::o;8462:148::-;8534:9;8567:37;8598:5;8567:37;:::i;:::-;8554:50;;8462:148;;;:::o;8616:175::-;8725:59;8778:5;8725:59;:::i;:::-;8720:3;8713:72;8616:175;;:::o;8797:266::-;8912:4;8950:2;8939:9;8935:18;8927:26;;8963:93;9053:1;9042:9;9038:17;9029:6;8963:93;:::i;:::-;8797:266;;;;:::o;9069:151::-;9144:9;9177:37;9208:5;9177:37;:::i;:::-;9164:50;;9069:151;;;:::o;9226:181::-;9338:62;9394:5;9338:62;:::i;:::-;9333:3;9326:75;9226:181;;:::o;9413:272::-;9531:4;9569:2;9558:9;9554:18;9546:26;;9582:96;9675:1;9664:9;9660:17;9651:6;9582:96;:::i;:::-;9413:272;;;;:::o;9691:118::-;9762:22;9778:5;9762:22;:::i;:::-;9755:5;9752:33;9742:61;;9799:1;9796;9789:12;9742:61;9691:118;:::o;9815:135::-;9859:5;9897:6;9884:20;9875:29;;9913:31;9938:5;9913:31;:::i;:::-;9815:135;;;;:::o;9956:122::-;10029:24;10047:5;10029:24;:::i;:::-;10022:5;10019:35;10009:63;;10068:1;10065;10058:12;10009:63;9956:122;:::o;10084:139::-;10130:5;10168:6;10155:20;10146:29;;10184:33;10211:5;10184:33;:::i;:::-;10084:139;;;;:::o;10229:1199::-;10340:6;10348;10356;10364;10372;10380;10388;10437:3;10425:9;10416:7;10412:23;10408:33;10405:120;;;10444:79;;:::i;:::-;10405:120;10564:1;10589:53;10634:7;10625:6;10614:9;10610:22;10589:53;:::i;:::-;10579:63;;10535:117;10691:2;10717:53;10762:7;10753:6;10742:9;10738:22;10717:53;:::i;:::-;10707:63;;10662:118;10819:2;10845:53;10890:7;10881:6;10870:9;10866:22;10845:53;:::i;:::-;10835:63;;10790:118;10947:2;10973:53;11018:7;11009:6;10998:9;10994:22;10973:53;:::i;:::-;10963:63;;10918:118;11075:3;11102:51;11145:7;11136:6;11125:9;11121:22;11102:51;:::i;:::-;11092:61;;11046:117;11202:3;11229:53;11274:7;11265:6;11254:9;11250:22;11229:53;:::i;:::-;11219:63;;11173:119;11331:3;11358:53;11403:7;11394:6;11383:9;11379:22;11358:53;:::i;:::-;11348:63;;11302:119;10229:1199;;;;;;;;;;:::o;11434:116::-;11504:21;11519:5;11504:21;:::i;:::-;11497:5;11494:32;11484:60;;11540:1;11537;11530:12;11484:60;11434:116;:::o;11556:133::-;11599:5;11637:6;11624:20;11615:29;;11653:30;11677:5;11653:30;:::i;:::-;11556:133;;;;:::o;11695:468::-;11760:6;11768;11817:2;11805:9;11796:7;11792:23;11788:32;11785:119;;;11823:79;;:::i;:::-;11785:119;11943:1;11968:53;12013:7;12004:6;11993:9;11989:22;11968:53;:::i;:::-;11958:63;;11914:117;12070:2;12096:50;12138:7;12129:6;12118:9;12114:22;12096:50;:::i;:::-;12086:60;;12041:115;11695:468;;;;;:::o;12169:327::-;12227:6;12276:2;12264:9;12255:7;12251:23;12247:32;12244:119;;;12282:79;;:::i;:::-;12244:119;12402:1;12427:52;12471:7;12462:6;12451:9;12447:22;12427:52;:::i;:::-;12417:62;;12373:116;12169:327;;;;:::o;12502:153::-;12579:9;12612:37;12643:5;12612:37;:::i;:::-;12599:50;;12502:153;;;:::o;12661:185::-;12775:64;12833:5;12775:64;:::i;:::-;12770:3;12763:77;12661:185;;:::o;12852:276::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:98;13118:1;13107:9;13103:17;13094:6;13023:98;:::i;:::-;12852:276;;;;:::o;13134:180::-;13182:77;13179:1;13172:88;13279:4;13276:1;13269:15;13303:4;13300:1;13293:15;13320:320;13364:6;13401:1;13395:4;13391:12;13381:22;;13448:1;13442:4;13438:12;13469:18;13459:81;;13525:4;13517:6;13513:17;13503:27;;13459:81;13587:2;13579:6;13576:14;13556:18;13553:38;13550:84;;13606:18;;:::i;:::-;13550:84;13371:269;13320:320;;;:::o;13646:166::-;13786:18;13782:1;13774:6;13770:14;13763:42;13646:166;:::o;13818:366::-;13960:3;13981:67;14045:2;14040:3;13981:67;:::i;:::-;13974:74;;14057:93;14146:3;14057:93;:::i;:::-;14175:2;14170:3;14166:12;14159:19;;13818:366;;;:::o;14190:419::-;14356:4;14394:2;14383:9;14379:18;14371:26;;14443:9;14437:4;14433:20;14429:1;14418:9;14414:17;14407:47;14471:131;14597:4;14471:131;:::i;:::-;14463:139;;14190:419;;;:::o;14615:162::-;14755:14;14751:1;14743:6;14739:14;14732:38;14615:162;:::o;14783:366::-;14925:3;14946:67;15010:2;15005:3;14946:67;:::i;:::-;14939:74;;15022:93;15111:3;15022:93;:::i;:::-;15140:2;15135:3;15131:12;15124:19;;14783:366;;;:::o;15155:419::-;15321:4;15359:2;15348:9;15344:18;15336:26;;15408:9;15402:4;15398:20;15394:1;15383:9;15379:17;15372:47;15436:131;15562:4;15436:131;:::i;:::-;15428:139;;15155:419;;;:::o;15580:85::-;15625:7;15654:5;15643:16;;15580:85;;;:::o;15671:158::-;15729:9;15762:61;15780:42;15789:32;15815:5;15789:32;:::i;:::-;15780:42;:::i;:::-;15762:61;:::i;:::-;15749:74;;15671:158;;;:::o;15835:147::-;15930:45;15969:5;15930:45;:::i;:::-;15925:3;15918:58;15835:147;;:::o;15988:807::-;16237:4;16275:3;16264:9;16260:19;16252:27;;16289:71;16357:1;16346:9;16342:17;16333:6;16289:71;:::i;:::-;16370:72;16438:2;16427:9;16423:18;16414:6;16370:72;:::i;:::-;16452:80;16528:2;16517:9;16513:18;16504:6;16452:80;:::i;:::-;16542;16618:2;16607:9;16603:18;16594:6;16542:80;:::i;:::-;16632:73;16700:3;16689:9;16685:19;16676:6;16632:73;:::i;:::-;16715;16783:3;16772:9;16768:19;16759:6;16715:73;:::i;:::-;15988:807;;;;;;;;;:::o;16801:143::-;16858:5;16889:6;16883:13;16874:22;;16905:33;16932:5;16905:33;:::i;:::-;16801:143;;;;:::o;16950:663::-;17038:6;17046;17054;17103:2;17091:9;17082:7;17078:23;17074:32;17071:119;;;17109:79;;:::i;:::-;17071:119;17229:1;17254:64;17310:7;17301:6;17290:9;17286:22;17254:64;:::i;:::-;17244:74;;17200:128;17367:2;17393:64;17449:7;17440:6;17429:9;17425:22;17393:64;:::i;:::-;17383:74;;17338:129;17506:2;17532:64;17588:7;17579:6;17568:9;17564:22;17532:64;:::i;:::-;17522:74;;17477:129;16950:663;;;;;:::o;17619:143::-;17676:5;17707:6;17701:13;17692:22;;17723:33;17750:5;17723:33;:::i;:::-;17619:143;;;;:::o;17768:351::-;17838:6;17887:2;17875:9;17866:7;17862:23;17858:32;17855:119;;;17893:79;;:::i;:::-;17855:119;18013:1;18038:64;18094:7;18085:6;18074:9;18070:22;18038:64;:::i;:::-;18028:74;;17984:128;17768:351;;;;:::o;18125:332::-;18246:4;18284:2;18273:9;18269:18;18261:26;;18297:71;18365:1;18354:9;18350:17;18341:6;18297:71;:::i;:::-;18378:72;18446:2;18435:9;18431:18;18422:6;18378:72;:::i;:::-;18125:332;;;;;:::o;18463:170::-;18603:22;18599:1;18591:6;18587:14;18580:46;18463:170;:::o;18639:366::-;18781:3;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18878:93;18967:3;18878:93;:::i;:::-;18996:2;18991:3;18987:12;18980:19;;18639:366;;;:::o;19011:419::-;19177:4;19215:2;19204:9;19200:18;19192:26;;19264:9;19258:4;19254:20;19250:1;19239:9;19235:17;19228:47;19292:131;19418:4;19292:131;:::i;:::-;19284:139;;19011:419;;;:::o;19436:180::-;19484:77;19481:1;19474:88;19581:4;19578:1;19571:15;19605:4;19602:1;19595:15;19622:410;19662:7;19685:20;19703:1;19685:20;:::i;:::-;19680:25;;19719:20;19737:1;19719:20;:::i;:::-;19714:25;;19774:1;19771;19767:9;19796:30;19814:11;19796:30;:::i;:::-;19785:41;;19975:1;19966:7;19962:15;19959:1;19956:22;19936:1;19929:9;19909:83;19886:139;;20005:18;;:::i;:::-;19886:139;19670:362;19622:410;;;;:::o;20038:180::-;20086:77;20083:1;20076:88;20183:4;20180:1;20173:15;20207:4;20204:1;20197:15;20224:185;20264:1;20281:20;20299:1;20281:20;:::i;:::-;20276:25;;20315:20;20333:1;20315:20;:::i;:::-;20310:25;;20354:1;20344:35;;20359:18;;:::i;:::-;20344:35;20401:1;20398;20394:9;20389:14;;20224:185;;;;:::o;20415:191::-;20455:3;20474:20;20492:1;20474:20;:::i;:::-;20469:25;;20508:20;20526:1;20508:20;:::i;:::-;20503:25;;20551:1;20548;20544:9;20537:16;;20572:3;20569:1;20566:10;20563:36;;;20579:18;;:::i;:::-;20563:36;20415:191;;;;:::o;20612:220::-;20752:34;20748:1;20740:6;20736:14;20729:58;20821:3;20816:2;20808:6;20804:15;20797:28;20612:220;:::o;20838:366::-;20980:3;21001:67;21065:2;21060:3;21001:67;:::i;:::-;20994:74;;21077:93;21166:3;21077:93;:::i;:::-;21195:2;21190:3;21186:12;21179:19;;20838:366;;;:::o;21210:419::-;21376:4;21414:2;21403:9;21399:18;21391:26;;21463:9;21457:4;21453:20;21449:1;21438:9;21434:17;21427:47;21491:131;21617:4;21491:131;:::i;:::-;21483:139;;21210:419;;;:::o;21635:194::-;21675:4;21695:20;21713:1;21695:20;:::i;:::-;21690:25;;21729:20;21747:1;21729:20;:::i;:::-;21724:25;;21773:1;21770;21766:9;21758:17;;21797:1;21791:4;21788:11;21785:37;;;21802:18;;:::i;:::-;21785:37;21635:194;;;;:::o;21835:177::-;21975:29;21971:1;21963:6;21959:14;21952:53;21835:177;:::o;22018:366::-;22160:3;22181:67;22245:2;22240:3;22181:67;:::i;:::-;22174:74;;22257:93;22346:3;22257:93;:::i;:::-;22375:2;22370:3;22366:12;22359:19;;22018:366;;;:::o;22390:419::-;22556:4;22594:2;22583:9;22579:18;22571:26;;22643:9;22637:4;22633:20;22629:1;22618:9;22614:17;22607:47;22671:131;22797:4;22671:131;:::i;:::-;22663:139;;22390:419;;;:::o;22815:221::-;22955:34;22951:1;22943:6;22939:14;22932:58;23024:4;23019:2;23011:6;23007:15;23000:29;22815:221;:::o;23042:366::-;23184:3;23205:67;23269:2;23264:3;23205:67;:::i;:::-;23198:74;;23281:93;23370:3;23281:93;:::i;:::-;23399:2;23394:3;23390:12;23383:19;;23042:366;;;:::o;23414:419::-;23580:4;23618:2;23607:9;23603:18;23595:26;;23667:9;23661:4;23657:20;23653:1;23642:9;23638:17;23631:47;23695:131;23821:4;23695:131;:::i;:::-;23687:139;;23414:419;;;:::o;23839:147::-;23940:11;23977:3;23962:18;;23839:147;;;;:::o;23992:114::-;;:::o;24112:398::-;24271:3;24292:83;24373:1;24368:3;24292:83;:::i;:::-;24285:90;;24384:93;24473:3;24384:93;:::i;:::-;24502:1;24497:3;24493:11;24486:18;;24112:398;;;:::o;24516:379::-;24700:3;24722:147;24865:3;24722:147;:::i;:::-;24715:154;;24886:3;24879:10;;24516:379;;;:::o;24901:178::-;25041:30;25037:1;25029:6;25025:14;25018:54;24901:178;:::o;25085:366::-;25227:3;25248:67;25312:2;25307:3;25248:67;:::i;:::-;25241:74;;25324:93;25413:3;25324:93;:::i;:::-;25442:2;25437:3;25433:12;25426:19;;25085:366;;;:::o;25457:419::-;25623:4;25661:2;25650:9;25646:18;25638:26;;25710:9;25704:4;25700:20;25696:1;25685:9;25681:17;25674:47;25738:131;25864:4;25738:131;:::i;:::-;25730:139;;25457:419;;;:::o;25882:351::-;25952:6;26001:2;25989:9;25980:7;25976:23;25972:32;25969:119;;;26007:79;;:::i;:::-;25969:119;26127:1;26152:64;26208:7;26199:6;26188:9;26184:22;26152:64;:::i;:::-;26142:74;;26098:128;25882:351;;;;:::o;26239:332::-;26360:4;26398:2;26387:9;26383:18;26375:26;;26411:71;26479:1;26468:9;26464:17;26455:6;26411:71;:::i;:::-;26492:72;26560:2;26549:9;26545:18;26536:6;26492:72;:::i;:::-;26239:332;;;;;:::o;26577:137::-;26631:5;26662:6;26656:13;26647:22;;26678:30;26702:5;26678:30;:::i;:::-;26577:137;;;;:::o;26720:345::-;26787:6;26836:2;26824:9;26815:7;26811:23;26807:32;26804:119;;;26842:79;;:::i;:::-;26804:119;26962:1;26987:61;27040:7;27031:6;27020:9;27016:22;26987:61;:::i;:::-;26977:71;;26933:125;26720:345;;;;:::o;27071:173::-;27211:25;27207:1;27199:6;27195:14;27188:49;27071:173;:::o;27250:366::-;27392:3;27413:67;27477:2;27472:3;27413:67;:::i;:::-;27406:74;;27489:93;27578:3;27489:93;:::i;:::-;27607:2;27602:3;27598:12;27591:19;;27250:366;;;:::o;27622:419::-;27788:4;27826:2;27815:9;27811:18;27803:26;;27875:9;27869:4;27865:20;27861:1;27850:9;27846:17;27839:47;27903:131;28029:4;27903:131;:::i;:::-;27895:139;;27622:419;;;:::o;28047:775::-;28280:4;28318:3;28307:9;28303:19;28295:27;;28332:71;28400:1;28389:9;28385:17;28376:6;28332:71;:::i;:::-;28413:72;28481:2;28470:9;28466:18;28457:6;28413:72;:::i;:::-;28495;28563:2;28552:9;28548:18;28539:6;28495:72;:::i;:::-;28577;28645:2;28634:9;28630:18;28621:6;28577:72;:::i;:::-;28659:73;28727:3;28716:9;28712:19;28703:6;28659:73;:::i;:::-;28742;28810:3;28799:9;28795:19;28786:6;28742:73;:::i;:::-;28047:775;;;;;;;;;:::o;28828:148::-;28930:11;28967:3;28952:18;;28828:148;;;;:::o;28982:214::-;29122:66;29118:1;29110:6;29106:14;29099:90;28982:214;:::o;29202:400::-;29362:3;29383:84;29465:1;29460:3;29383:84;:::i;:::-;29376:91;;29476:93;29565:3;29476:93;:::i;:::-;29594:1;29589:3;29585:11;29578:18;;29202:400;;;:::o;29608:79::-;29647:7;29676:5;29665:16;;29608:79;;;:::o;29693:157::-;29798:45;29818:24;29836:5;29818:24;:::i;:::-;29798:45;:::i;:::-;29793:3;29786:58;29693:157;;:::o;29856:663::-;30097:3;30119:148;30263:3;30119:148;:::i;:::-;30112:155;;30277:75;30348:3;30339:6;30277:75;:::i;:::-;30377:2;30372:3;30368:12;30361:19;;30390:75;30461:3;30452:6;30390:75;:::i;:::-;30490:2;30485:3;30481:12;30474:19;;30510:3;30503:10;;29856:663;;;;;:::o;30525:545::-;30698:4;30736:3;30725:9;30721:19;30713:27;;30750:71;30818:1;30807:9;30803:17;30794:6;30750:71;:::i;:::-;30831:68;30895:2;30884:9;30880:18;30871:6;30831:68;:::i;:::-;30909:72;30977:2;30966:9;30962:18;30953:6;30909:72;:::i;:::-;30991;31059:2;31048:9;31044:18;31035:6;30991:72;:::i;:::-;30525:545;;;;;;;:::o;31076:164::-;31216:16;31212:1;31204:6;31200:14;31193:40;31076:164;:::o;31246:366::-;31388:3;31409:67;31473:2;31468:3;31409:67;:::i;:::-;31402:74;;31485:93;31574:3;31485:93;:::i;:::-;31603:2;31598:3;31594:12;31587:19;;31246:366;;;:::o;31618:419::-;31784:4;31822:2;31811:9;31807:18;31799:26;;31871:9;31865:4;31861:20;31857:1;31846:9;31842:17;31835:47;31899:131;32025:4;31899:131;:::i;:::-;31891:139;;31618:419;;;:::o;32043:225::-;32183:34;32179:1;32171:6;32167:14;32160:58;32252:8;32247:2;32239:6;32235:15;32228:33;32043:225;:::o;32274:366::-;32416:3;32437:67;32501:2;32496:3;32437:67;:::i;:::-;32430:74;;32513:93;32602:3;32513:93;:::i;:::-;32631:2;32626:3;32622:12;32615:19;;32274:366;;;:::o;32646:419::-;32812:4;32850:2;32839:9;32835:18;32827:26;;32899:9;32893:4;32889:20;32885:1;32874:9;32870:17;32863:47;32927:131;33053:4;32927:131;:::i;:::-;32919:139;;32646:419;;;:::o;33071:225::-;33211:34;33207:1;33199:6;33195:14;33188:58;33280:8;33275:2;33267:6;33263:15;33256:33;33071:225;:::o;33302:366::-;33444:3;33465:67;33529:2;33524:3;33465:67;:::i;:::-;33458:74;;33541:93;33630:3;33541:93;:::i;:::-;33659:2;33654:3;33650:12;33643:19;;33302:366;;;:::o;33674:419::-;33840:4;33878:2;33867:9;33863:18;33855:26;;33927:9;33921:4;33917:20;33913:1;33902:9;33898:17;33891:47;33955:131;34081:4;33955:131;:::i;:::-;33947:139;;33674:419;;;:::o;34099:182::-;34239:34;34235:1;34227:6;34223:14;34216:58;34099:182;:::o;34287:366::-;34429:3;34450:67;34514:2;34509:3;34450:67;:::i;:::-;34443:74;;34526:93;34615:3;34526:93;:::i;:::-;34644:2;34639:3;34635:12;34628:19;;34287:366;;;:::o;34659:419::-;34825:4;34863:2;34852:9;34848:18;34840:26;;34912:9;34906:4;34902:20;34898:1;34887:9;34883:17;34876:47;34940:131;35066:4;34940:131;:::i;:::-;34932:139;;34659:419;;;:::o;35084:180::-;35132:77;35129:1;35122:88;35229:4;35226:1;35219:15;35253:4;35250:1;35243:15;35270:180;35318:77;35315:1;35308:88;35415:4;35412:1;35405:15;35439:4;35436:1;35429:15;35456:114;35523:6;35557:5;35551:12;35541:22;;35456:114;;;:::o;35576:184::-;35675:11;35709:6;35704:3;35697:19;35749:4;35744:3;35740:14;35725:29;;35576:184;;;;:::o;35766:132::-;35833:4;35856:3;35848:11;;35886:4;35881:3;35877:14;35869:22;;35766:132;;;:::o;35904:108::-;35981:24;35999:5;35981:24;:::i;:::-;35976:3;35969:37;35904:108;;:::o;36018:179::-;36087:10;36108:46;36150:3;36142:6;36108:46;:::i;:::-;36186:4;36181:3;36177:14;36163:28;;36018:179;;;;:::o;36203:113::-;36273:4;36305;36300:3;36296:14;36288:22;;36203:113;;;:::o;36352:732::-;36471:3;36500:54;36548:5;36500:54;:::i;:::-;36570:86;36649:6;36644:3;36570:86;:::i;:::-;36563:93;;36680:56;36730:5;36680:56;:::i;:::-;36759:7;36790:1;36775:284;36800:6;36797:1;36794:13;36775:284;;;36876:6;36870:13;36903:63;36962:3;36947:13;36903:63;:::i;:::-;36896:70;;36989:60;37042:6;36989:60;:::i;:::-;36979:70;;36835:224;36822:1;36819;36815:9;36810:14;;36775:284;;;36779:14;37075:3;37068:10;;36476:608;;;36352:732;;;;:::o;37090:831::-;37353:4;37391:3;37380:9;37376:19;37368:27;;37405:71;37473:1;37462:9;37458:17;37449:6;37405:71;:::i;:::-;37486:80;37562:2;37551:9;37547:18;37538:6;37486:80;:::i;:::-;37613:9;37607:4;37603:20;37598:2;37587:9;37583:18;37576:48;37641:108;37744:4;37735:6;37641:108;:::i;:::-;37633:116;;37759:72;37827:2;37816:9;37812:18;37803:6;37759:72;:::i;:::-;37841:73;37909:3;37898:9;37894:19;37885:6;37841:73;:::i;:::-;37090:831;;;;;;;;:::o;37927:144::-;37979:4;38002:3;37994:11;;38025:3;38022:1;38015:14;38059:4;38056:1;38046:18;38038:26;;37927:144;;;:::o;38099:878::-;38204:3;38241:5;38235:12;38270:36;38296:9;38270:36;:::i;:::-;38322:88;38403:6;38398:3;38322:88;:::i;:::-;38315:95;;38441:1;38430:9;38426:17;38457:1;38452:166;;;;38632:1;38627:344;;;;38419:552;;38452:166;38536:4;38532:9;38521;38517:25;38512:3;38505:38;38598:6;38591:14;38584:22;38576:6;38572:35;38567:3;38563:45;38556:52;;38452:166;;38627:344;38694:41;38729:5;38694:41;:::i;:::-;38757:1;38771:154;38785:6;38782:1;38779:13;38771:154;;;38859:7;38853:14;38849:1;38844:3;38840:11;38833:35;38909:1;38900:7;38896:15;38885:26;;38807:4;38804:1;38800:12;38795:17;;38771:154;;;38954:6;38949:3;38945:16;38938:23;;38634:337;;38419:552;;38208:769;;38099:878;;;;:::o;38983:273::-;39114:3;39136:94;39226:3;39217:6;39136:94;:::i;:::-;39129:101;;39247:3;39240:10;;38983:273;;;;:::o;39262:664::-;39467:4;39505:3;39494:9;39490:19;39482:27;;39519:71;39587:1;39576:9;39572:17;39563:6;39519:71;:::i;:::-;39600:72;39668:2;39657:9;39653:18;39644:6;39600:72;:::i;:::-;39682;39750:2;39739:9;39735:18;39726:6;39682:72;:::i;:::-;39764;39832:2;39821:9;39817:18;39808:6;39764:72;:::i;:::-;39846:73;39914:3;39903:9;39899:19;39890:6;39846:73;:::i;:::-;39262:664;;;;;;;;:::o
Swarm Source
ipfs://6f888d78f7b6501cfeb06e48fb75d3a5b8871ba4e8dec6d60c517c111313a93a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.