Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Sponsored
Latest 25 from a total of 105 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 89650837 | 16 days ago | IN | 0 FTM | 0.00044592 | ||||
Approve | 86929926 | 42 days ago | IN | 0 FTM | 0.00491706 | ||||
Approve | 86929507 | 42 days ago | IN | 0 FTM | 0.0048219 | ||||
Approve | 85679858 | 54 days ago | IN | 0 FTM | 0.00065512 | ||||
Approve | 82770841 | 87 days ago | IN | 0 FTM | 0.00210541 | ||||
Approve | 81984447 | 99 days ago | IN | 0 FTM | 0.00069937 | ||||
Approve | 81929538 | 100 days ago | IN | 0 FTM | 0.00076109 | ||||
Transfer | 81719242 | 103 days ago | IN | 0 FTM | 0.00064477 | ||||
Approve | 81461328 | 107 days ago | IN | 0 FTM | 0.00061218 | ||||
Transfer | 81461290 | 107 days ago | IN | 0 FTM | 0.00108602 | ||||
Approve | 81369540 | 109 days ago | IN | 0 FTM | 0.0020229 | ||||
Approve | 81330755 | 110 days ago | IN | 0 FTM | 0.00218489 | ||||
Approve | 81226325 | 111 days ago | IN | 0 FTM | 0.00074901 | ||||
Transfer | 81226290 | 111 days ago | IN | 0 FTM | 0.0018803 | ||||
Approve | 81177799 | 112 days ago | IN | 0 FTM | 0.00137717 | ||||
Transfer | 81125061 | 113 days ago | IN | 0 FTM | 0.00259366 | ||||
Transfer | 81120001 | 113 days ago | IN | 0 FTM | 0.00374356 | ||||
Transfer | 81118705 | 113 days ago | IN | 0 FTM | 0.00414718 | ||||
Transfer | 81111851 | 113 days ago | IN | 0 FTM | 0.00250288 | ||||
Approve | 81107467 | 113 days ago | IN | 0 FTM | 0.00696063 | ||||
Approve | 81052494 | 114 days ago | IN | 0 FTM | 0.00412825 | ||||
Transfer | 81018017 | 115 days ago | IN | 0 FTM | 0.00459853 | ||||
Transfer | 81017977 | 115 days ago | IN | 0 FTM | 0.00563241 | ||||
Transfer | 81017910 | 115 days ago | IN | 0 FTM | 0.00483863 | ||||
Transfer | 81017883 | 115 days ago | IN | 0 FTM | 0.00483891 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
80569967 | 123 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
BlockBulls
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2024-05-07 */ /** *Submitted for verification at basescan.org on 2024-04-19 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.17; // 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; } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // 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); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } 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 IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract BlockBulls is Context, ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 private uniswapV2Router; mapping (address => bool) private _excludedFees; mapping (address => bool) private _excludedMaxTx; mapping (address => bool) private _isBot; bool public tradingOpen; bool private _swapping; bool public swapEnabled = false; uint256 private constant _tSupply = 100_000_000 * (10**18); uint256 public maxBuyAmount = _tSupply; uint256 public maxSellAmount = _tSupply; uint256 public maxWalletAmount = _tSupply; uint256 public constant FEE_DIVISOR = 1000; uint256 private _totalFees; uint256 private _devFee; uint256 private _liqFee; uint256 public buyDevFee = 40; //4 % uint256 private _previousBuyDevFee = buyDevFee; uint256 public buyLiqFee = 10; //1% uint256 private _previousBuyLiqFee = buyLiqFee; uint256 public sellDevFee = 40; //4% uint256 private _previousSellDevFee = sellDevFee; uint256 public sellLiqFee = 10; //1% uint256 private _previousSellLiqFee = sellLiqFee; uint256 private _tokensForDev; uint256 private _tokensForLiq; uint256 private _swapTokensAtAmount = 0; address payable private _devWallet = payable(0xB3A83549d2A1531dCaa71a8C858Ec1B288b290F3); address payable private _liqWallet = payable(0xB3A83549d2A1531dCaa71a8C858Ec1B288b290F3); address public uniswapV2Pair; address constant private DEAD = 0x000000000000000000000000000000000000dEaD; address constant private ZERO = 0x0000000000000000000000000000000000000000; constructor() ERC20("BlockBulls", "$BULLS") { uniswapV2Router = IUniswapV2Router02(0xF491e7B69E4244ad4002BC14e878a34207E38c29); _approve(address(this), address(uniswapV2Router), _tSupply); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max); _excludedFees[owner()] = true; _excludedFees[address(this)] = true; _excludedFees[DEAD] = true; _excludedFees[_liqWallet] = true; _excludedMaxTx[owner()] = true; _excludedMaxTx[address(this)] = true; _excludedMaxTx[DEAD] = true; _excludedMaxTx[_liqWallet] = true; _mint(owner(), _tSupply); } function _transfer(address from, address to, uint256 amount) internal override { require(from != ZERO, "ERC20: transfer from the zero address"); require(to != ZERO, "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); bool takeFee = true; bool shouldSwap = false; if (from != owner() && to != owner() && to != ZERO && to != DEAD && !_swapping) { require(!_isBot[from] && !_isBot[to], "Bot."); if(!tradingOpen) require(_excludedFees[from] || _excludedFees[to], "Trading is not allowed yet."); if (from == uniswapV2Pair && to != address(uniswapV2Router) && !_excludedMaxTx[to]) { require(amount <= maxBuyAmount, "Transfer amount exceeds the maxBuyAmount."); require(balanceOf(to) + amount <= maxWalletAmount, "Exceeds maximum wallet token amount."); } if (to == uniswapV2Pair && from != address(uniswapV2Router) && !_excludedMaxTx[from]) { require(amount <= maxSellAmount, "Transfer amount exceeds the maxSellAmount."); shouldSwap = true; } } if(_excludedFees[from] || _excludedFees[to]) takeFee = false; if(from != uniswapV2Pair && to != uniswapV2Pair) takeFee = false; uint256 contractBalance = balanceOf(address(this)); bool canSwap = (contractBalance > _swapTokensAtAmount) && shouldSwap; if (canSwap && swapEnabled && !_swapping && !_excludedFees[from] && !_excludedFees[to]) { _swapping = true; _swapBack(contractBalance); _swapping = false; } _tokenTransfer(from, to, amount, takeFee, shouldSwap); } function _swapBack(uint256 contractBalance) internal { uint256 totalTokensToSwap = (_tokensForDev).add(_tokensForLiq); bool success; if (contractBalance == 0 || totalTokensToSwap == 0) return; if (contractBalance > _swapTokensAtAmount.mul(5)) contractBalance = _swapTokensAtAmount.mul(5); uint256 liquidityTokens = contractBalance.mul(_tokensForLiq).div(totalTokensToSwap).div(2); uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; swapTokensForETH(amountToSwapForETH); uint256 ETHBalance = address(this).balance.sub(initialETHBalance); uint256 ETHForDev = ETHBalance.mul(_tokensForDev).div(totalTokensToSwap); uint256 ETHForLiq = ETHBalance.sub(ETHForDev); _tokensForDev = 0; _tokensForLiq = 0; if(liquidityTokens > 0 && ETHForLiq > 0) _addLiquidity(liquidityTokens, ETHForLiq); (success,) = address(_devWallet).call{value: ETHForDev}(""); } function swapTokensForETH(uint256 tokenAmount) internal { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ETHAmount) internal { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ETHAmount}( address(this), tokenAmount, 0, 0, _liqWallet, block.timestamp ); } function sendETHToFee(uint256 amount) internal { _devWallet.transfer(amount); } function isBot(address wallet) external view returns (bool) { return _isBot[wallet]; } function openTrading() public onlyOwner { require(!tradingOpen, "Trading is already open"); swapEnabled = true; maxBuyAmount = _tSupply.mul(1).div(100); maxSellAmount = _tSupply.mul(1).div(100); maxWalletAmount = _tSupply.mul(2).div(100); _swapTokensAtAmount = _tSupply.mul(5).div(10000); tradingOpen = true; } function setSwapEnabled(bool onoff) public onlyOwner { swapEnabled = onoff; } function setMaxBuyAmount(uint256 _maxBuyAmount) public onlyOwner { require(_maxBuyAmount >= (totalSupply().mul(1).div(1000)), "Max buy amount cannot be lower than 0.1% total supply."); maxBuyAmount = _maxBuyAmount; } function setMaxSellAmount(uint256 _maxSellAmount) public onlyOwner { require(_maxSellAmount >= (totalSupply().mul(1).div(1000)), "Max sell amount cannot be lower than 0.1% total supply."); maxSellAmount = _maxSellAmount; } function setMaxWalletAmount(uint256 _maxWalletAmount) public onlyOwner { require(_maxWalletAmount >= (totalSupply().mul(1).div(1000)), "Max wallet amount cannot be lower than 0.1% total supply."); maxWalletAmount = _maxWalletAmount; } function setSwapTokensAtAmount(uint256 swapTokensAtAmount) public onlyOwner { require(swapTokensAtAmount >= (totalSupply().mul(1).div(100000)), "Swap amount cannot be lower than 0.001% total supply."); require(swapTokensAtAmount <= (totalSupply().mul(5).div(1000)), "Swap amount cannot be higher than 0.5% total supply."); _swapTokensAtAmount = swapTokensAtAmount; } function setDevWallet(address devWallet) public onlyOwner { require(devWallet != ZERO, "_devWallet address cannot be 0"); _excludedFees[_devWallet] = false; _excludedMaxTx[_devWallet] = false; _devWallet = payable(devWallet); _excludedFees[_devWallet] = true; _excludedMaxTx[_devWallet] = true; } function setLiqWallet(address liqWallet) public onlyOwner { require(liqWallet != ZERO, "_liqWallet address cannot be 0"); _excludedFees[_liqWallet] = false; _excludedMaxTx[_liqWallet] = false; _liqWallet = payable(liqWallet); _excludedFees[_liqWallet] = true; _excludedMaxTx[_liqWallet] = true; } function excludeFees(address[] memory accounts, bool exclude) public onlyOwner { for (uint i = 0; i < accounts.length; i++) _excludedFees[accounts[i]] = exclude; } function excludeMaxTx(address[] memory accounts, bool exclude) public onlyOwner { for (uint i = 0; i < accounts.length; i++) _excludedMaxTx[accounts[i]] = exclude; } function bots(address[] memory accounts, bool bl) public onlyOwner { for (uint i = 0; i < accounts.length; i++) { if((accounts[i] != uniswapV2Pair) && (accounts[i] != address(this)) && (accounts[i] != address(uniswapV2Router))) _isBot[accounts[i]] = bl; } } function buyFee(uint256 _buyDevFee, uint256 _buyLiqFee) public onlyOwner { require((_buyDevFee).add(_buyLiqFee) <= 300, "Must keep buy taxes below 30%"); buyDevFee = _buyDevFee; buyLiqFee = _buyLiqFee; } function sellFee(uint256 _sellDevFee, uint256 _sellLiqFee) public onlyOwner { require((_sellDevFee).add(_sellLiqFee) <= 300, "Must keep sell taxes below 30%"); sellDevFee = _sellDevFee; sellLiqFee = _sellLiqFee; } function removeAllFee() internal { if (buyDevFee == 0 && buyLiqFee == 0 && sellDevFee == 0 && sellLiqFee == 0) return; _previousBuyDevFee = buyDevFee; _previousBuyLiqFee = buyLiqFee; _previousSellDevFee = sellDevFee; _previousSellLiqFee = sellLiqFee; buyDevFee = 0; buyLiqFee = 0; sellDevFee = 0; sellLiqFee = 0; } function restoreAllFee() internal { buyDevFee = _previousBuyDevFee; buyLiqFee = _previousBuyLiqFee; sellDevFee = _previousSellDevFee; sellLiqFee = _previousSellLiqFee; } function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee, bool isSell) internal { if (!takeFee) removeAllFee(); else amount = _takeFees(sender, amount, isSell); super._transfer(sender, recipient, amount); if (!takeFee) restoreAllFee(); } function _takeFees(address sender, uint256 amount, bool isSell) internal returns (uint256) { if (isSell) _setSell(); else _setBuy(); uint256 fees; if (_totalFees > 0) { fees = amount.mul(_totalFees).div(FEE_DIVISOR); _tokensForDev += fees * _devFee / _totalFees; _tokensForLiq += fees * _devFee / _totalFees; } if (fees > 0) super._transfer(sender, address(this), fees); return amount -= fees; } function _setSell() internal { _devFee = sellDevFee; _liqFee = sellLiqFee; _totalFees = (_devFee).add(_liqFee); } function _setBuy() internal { _devFee = buyDevFee; _liqFee = buyLiqFee; _totalFees = (_devFee).add(_liqFee); } function unclog() public onlyOwner { uint256 contractBalance = balanceOf(address(this)); swapTokensForETH(contractBalance); } function sendFees() public onlyOwner { uint256 contractETHBalance = address(this).balance; sendETHToFee(contractETHBalance); } function rescueETH() public onlyOwner { bool success; (success,) = address(msg.sender).call{value: address(this).balance}(""); } function rescueForeignTokens(address tkn) public onlyOwner { require(tkn != address(this), "Cannot withdraw this token"); require(IERC20(tkn).balanceOf(address(this)) > 0, "No tokens"); uint amount = IERC20(tkn).balanceOf(address(this)); IERC20(tkn).transfer(msg.sender, amount); } function updateuniswapV2Pair(address _newuniswapV2Pair) external onlyOwner{ uniswapV2Pair=_newuniswapV2Pair; } function removeLimits() public onlyOwner { maxBuyAmount = _tSupply; maxSellAmount = _tSupply; maxWalletAmount = _tSupply; } receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","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":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"bl","type":"bool"}],"name":"bots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyDevFee","type":"uint256"},{"internalType":"uint256","name":"_buyLiqFee","type":"uint256"}],"name":"buyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"rescueForeignTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellDevFee","type":"uint256"},{"internalType":"uint256","name":"_sellLiqFee","type":"uint256"}],"name":"sellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liqWallet","type":"address"}],"name":"setLiqWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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"},{"inputs":[],"name":"unclog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newuniswapV2Pair","type":"address"}],"name":"updateuniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a805462ff0000191681556a52b7d2dcc80cd2e4000000600b819055600c819055600d5560286011819055601281905560138290556014829055601581905560165560178190556018556000601b55601c805473b3a83549d2a1531dcaa71a8c858ec1b288b290f36001600160a01b03199182168117909255601d805490911690911790553480156200009757600080fd5b506040518060400160405280600a815260200169426c6f636b42756c6c7360b01b815250604051806040016040528060068152602001652442554c4c5360d01b8152508160039081620000eb9190620007ae565b506004620000fa8282620007ae565b5050506200011762000111620004c060201b60201c565b620004c4565b600680546001600160a01b03191673f491e7b69e4244ad4002bc14e878a34207e38c29908117909155620001599030906a52b7d2dcc80cd2e400000062000516565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d391906200087a565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c91906200087a565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d091906200087a565b601e80546001600160a01b0319166001600160a01b0392831690811790915560065460405163095ea7b360e01b81529216600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000338573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035e9190620008ac565b50600160076000620003786005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260079093528183208054851660019081179091557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d8054861682179055601d54909116835290822080549093168117909255600890620004116005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260089093528183208054851660019081179091557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd093342998054861682179055601d54909116835291208054909216179055620004ba620004a86005546001600160a01b031690565b6a52b7d2dcc80cd2e400000062000642565b620008f8565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166200057e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000575565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166200069a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000575565b8060026000828254620006ae9190620008d0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200073557607f821691505b6020821081036200075657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200070557600081815260208120601f850160051c81016020861015620007855750805b601f850160051c820191505b81811015620007a65782815560010162000791565b505050505050565b81516001600160401b03811115620007ca57620007ca6200070a565b620007e281620007db845462000720565b846200075c565b602080601f8311600181146200081a5760008415620008015750858301515b600019600386901b1c1916600185901b178555620007a6565b600085815260208120601f198616915b828110156200084b578886015182559484019460019091019084016200082a565b50858210156200086a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200088d57600080fd5b81516001600160a01b0381168114620008a557600080fd5b9392505050565b600060208284031215620008bf57600080fd5b81518015158114620008a557600080fd5b80820180821115620008f257634e487b7160e01b600052601160045260246000fd5b92915050565b6128f880620009086000396000f3fe60806040526004361061025e5760003560e01c80638da5cb5b11610143578063c1aea0c3116100bb578063e7cf3b7f11610077578063e7cf3b7f14610705578063e99c9d0914610725578063ec29e0fe14610745578063f2fde38b14610765578063f34eb0b814610785578063ffb54a99146107a557005b8063c1aea0c314610665578063c9567bf91461067b578063d077b48f14610690578063dd62ed3e146106b0578063dff90b5b146106d0578063e01af92c146106e557005b8063a457c2d71161010a578063a457c2d7146105b9578063a9059cbb146105d9578063aa4bde28146105f9578063afa4f3b21461060f578063b6cf8ce61461062f578063c04a894c1461064557005b80638da5cb5b1461054457806395d89b41146105625780639c3b4fdc146105775780639e93ad8e1461058d578063a0d82dc5146105a357005b806339509351116101d65780636d2d81621161019d5780636d2d81621461048e5780636ddd1713146104ae57806370a08231146104ce578063715018a614610504578063751039fc1461051957806388e765ff1461052e57005b806339509351146103d25780633bbac579146103f257806349bd5a5e1461042b57806366d602ae1461046357806367c453491461047957005b80631f110500116102255780631f110500146103215780631f53ac021461034157806320800a001461036157806323b872dd1461037657806327a14fc214610396578063313ce567146103b657005b806306fdde0314610267578063095ea7b3146102925780630a3d5b55146102c25780630b01aa51146102e257806318160ddd1461030257005b3661026557005b005b34801561027357600080fd5b5061027c6107bf565b60405161028991906123d6565b60405180910390f35b34801561029e57600080fd5b506102b26102ad366004612449565b610851565b6040519015158152602001610289565b3480156102ce57600080fd5b506102656102dd3660046124a4565b61086b565b3480156102ee57600080fd5b506102656102fd36600461257b565b6108df565b34801561030e57600080fd5b506002545b604051908152602001610289565b34801561032d57600080fd5b5061026561033c3660046124a4565b6109c0565b34801561034d57600080fd5b5061026561035c36600461257b565b610a2f565b34801561036d57600080fd5b50610265610b0b565b34801561038257600080fd5b506102b2610391366004612598565b610b60565b3480156103a257600080fd5b506102656103b13660046125d9565b610b84565b3480156103c257600080fd5b5060405160128152602001610289565b3480156103de57600080fd5b506102b26103ed366004612449565b610c26565b3480156103fe57600080fd5b506102b261040d36600461257b565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561043757600080fd5b50601e5461044b906001600160a01b031681565b6040516001600160a01b039091168152602001610289565b34801561046f57600080fd5b50610313600c5481565b34801561048557600080fd5b50610265610c48565b34801561049a57600080fd5b506102656104a93660046125f2565b610c6c565b3480156104ba57600080fd5b50600a546102b29062010000900460ff1681565b3480156104da57600080fd5b506103136104e936600461257b565b6001600160a01b031660009081526020819052604090205490565b34801561051057600080fd5b50610265610cda565b34801561052557600080fd5b50610265610cee565b34801561053a57600080fd5b50610313600b5481565b34801561055057600080fd5b506005546001600160a01b031661044b565b34801561056e57600080fd5b5061027c610d11565b34801561058357600080fd5b5061031360115481565b34801561059957600080fd5b506103136103e881565b3480156105af57600080fd5b5061031360155481565b3480156105c557600080fd5b506102b26105d4366004612449565b610d20565b3480156105e557600080fd5b506102b26105f4366004612449565b610d9b565b34801561060557600080fd5b50610313600d5481565b34801561061b57600080fd5b5061026561062a3660046125d9565b610da9565b34801561063b57600080fd5b5061031360175481565b34801561065157600080fd5b506102656106603660046124a4565b610eb8565b34801561067157600080fd5b5061031360135481565b34801561068757600080fd5b50610265610fe5565b34801561069c57600080fd5b506102656106ab36600461257b565b6110d9565b3480156106bc57600080fd5b506103136106cb366004612614565b6112bc565b3480156106dc57600080fd5b506102656112e7565b3480156106f157600080fd5b5061026561070036600461264d565b6112f9565b34801561071157600080fd5b506102656107203660046125f2565b61131d565b34801561073157600080fd5b506102656107403660046125d9565b61138b565b34801561075157600080fd5b5061026561076036600461257b565b611421565b34801561077157600080fd5b5061026561078036600461257b565b61144b565b34801561079157600080fd5b506102656107a03660046125d9565b6114c1565b3480156107b157600080fd5b50600a546102b29060ff1681565b6060600380546107ce9061266a565b80601f01602080910402602001604051908101604052809291908181526020018280546107fa9061266a565b80156108475780601f1061081c57610100808354040283529160200191610847565b820191906000526020600020905b81548152906001019060200180831161082a57829003601f168201915b5050505050905090565b60003361085f818585611550565b60019150505b92915050565b610873611674565b60005b82518110156108da578160086000858481518110610896576108966126a4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806108d2816126d0565b915050610876565b505050565b6108e7611674565b6001600160a01b0381166109425760405162461bcd60e51b815260206004820152601e60248201527f5f6c697157616c6c657420616464726573732063616e6e6f742062652030000060448201526064015b60405180910390fd5b601d80546001600160a01b039081166000908152600760208181526040808420805460ff19908116909155865486168552600880845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b6109c8611674565b60005b82518110156108da5781600760008584815181106109eb576109eb6126a4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a27816126d0565b9150506109cb565b610a37611674565b6001600160a01b038116610a8d5760405162461bcd60e51b815260206004820152601e60248201527f5f64657657616c6c657420616464726573732063616e6e6f74206265203000006044820152606401610939565b601c80546001600160a01b039081166000908152600760208181526040808420805460ff19908116909155865486168552600880845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b610b13611674565b604051600090339047908381818185875af1925050503d8060008114610b55576040519150601f19603f3d011682016040523d82523d6000602084013e610b5a565b606091505b50505050565b600033610b6e8582856116ce565b610b79858585611742565b506001949350505050565b610b8c611674565b610bac6103e8610ba66001610ba060025490565b90611cd8565b90611ceb565b811015610c215760405162461bcd60e51b815260206004820152603960248201527f4d61782077616c6c657420616d6f756e742063616e6e6f74206265206c6f776560448201527f72207468616e20302e312520746f74616c20737570706c792e000000000000006064820152608401610939565b600d55565b60003361085f818585610c3983836112bc565b610c4391906126e9565b611550565b610c50611674565b30600090815260208190526040902054610c6981611cf7565b50565b610c74611674565b61012c610c818383611e51565b1115610ccf5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206275792074617865732062656c6f77203330250000006044820152606401610939565b601191909155601355565b610ce2611674565b610cec6000611e5d565b565b610cf6611674565b6a52b7d2dcc80cd2e4000000600b819055600c819055600d55565b6060600480546107ce9061266a565b60003381610d2e82866112bc565b905083811015610d8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610939565b610b798286868403611550565b60003361085f818585611742565b610db1611674565b610dc6620186a0610ba66001610ba060025490565b811015610e335760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610939565b610e476103e8610ba66005610ba060025490565b811115610eb35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610939565b601b55565b610ec0611674565b60005b82518110156108da57601e5483516001600160a01b0390911690849083908110610eef57610eef6126a4565b60200260200101516001600160a01b031614158015610f395750306001600160a01b0316838281518110610f2557610f256126a4565b60200260200101516001600160a01b031614155b8015610f77575060065483516001600160a01b0390911690849083908110610f6357610f636126a4565b60200260200101516001600160a01b031614155b15610fd3578160096000858481518110610f9357610f936126a4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610fdd816126d0565b915050610ec3565b610fed611674565b600a5460ff16156110405760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610939565b600a805462ff000019166201000017905561106c6064610ba66a52b7d2dcc80cd2e40000006001611cd8565b600b5561108a6064610ba66a52b7d2dcc80cd2e40000006001611cd8565b600c556110a86064610ba66a52b7d2dcc80cd2e40000006002611cd8565b600d556110c7612710610ba66a52b7d2dcc80cd2e40000006005611cd8565b601b55600a805460ff19166001179055565b6110e1611674565b306001600160a01b038216036111395760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74207769746864726177207468697320746f6b656e0000000000006044820152606401610939565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a491906126fc565b116111dd5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610939565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124891906126fc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da9190612715565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6112ef611674565b47610c6981611eaf565b611301611674565b600a8054911515620100000262ff000019909216919091179055565b611325611674565b61012c6113328383611e51565b11156113805760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772033302500006044820152606401610939565b601591909155601755565b611393611674565b6113a76103e8610ba66001610ba060025490565b81101561141c5760405162461bcd60e51b815260206004820152603760248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e312520746f74616c20737570706c792e0000000000000000006064820152608401610939565b600c55565b611429611674565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b611453611674565b6001600160a01b0381166114b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610939565b610c6981611e5d565b6114c9611674565b6114dd6103e8610ba66001610ba060025490565b81101561154b5760405162461bcd60e51b815260206004820152603660248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f77657220746044820152753430b71018171892903a37ba30b61039bab838363c9760511b6064820152608401610939565b600b55565b6001600160a01b0383166115b25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610939565b6001600160a01b0382166116135760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610939565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610cec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610939565b60006116da84846112bc565b90506000198114610b5a57818110156117355760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610939565b610b5a8484848403611550565b6001600160a01b0383166117685760405162461bcd60e51b815260040161093990612732565b6001600160a01b03821661178e5760405162461bcd60e51b815260040161093990612777565b600081116117f05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610939565b600160006118066005546001600160a01b031690565b6001600160a01b0316856001600160a01b03161415801561183557506005546001600160a01b03858116911614155b801561184957506001600160a01b03841615155b801561186057506001600160a01b03841661dead14155b80156118745750600a54610100900460ff16155b15611b83576001600160a01b03851660009081526009602052604090205460ff161580156118bb57506001600160a01b03841660009081526009602052604090205460ff16155b6118f05760405162461bcd60e51b8152600401610939906020808252600490820152632137ba1760e11b604082015260600190565b600a5460ff16611985576001600160a01b03851660009081526007602052604090205460ff168061193957506001600160a01b03841660009081526007602052604090205460ff165b6119855760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610939565b601e546001600160a01b0386811691161480156119b057506006546001600160a01b03858116911614155b80156119d557506001600160a01b03841660009081526008602052604090205460ff16155b15611ac557600b54831115611a3e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610939565b600d5483611a61866001600160a01b031660009081526020819052604090205490565b611a6b91906126e9565b1115611ac55760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610939565b601e546001600160a01b038581169116148015611af057506006546001600160a01b03868116911614155b8015611b1557506001600160a01b03851660009081526008602052604090205460ff16155b15611b8357600c54831115611b7f5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610939565b5060015b6001600160a01b03851660009081526007602052604090205460ff1680611bc257506001600160a01b03841660009081526007602052604090205460ff165b15611bcc57600091505b601e546001600160a01b03868116911614801590611bf85750601e546001600160a01b03858116911614155b15611c0257600091505b3060009081526020819052604081205490506000601b5482118015611c245750825b9050808015611c3b5750600a5462010000900460ff165b8015611c4f5750600a54610100900460ff16155b8015611c7457506001600160a01b03871660009081526007602052604090205460ff16155b8015611c9957506001600160a01b03861660009081526007602052604090205460ff16155b15611cc257600a805461ff001916610100179055611cb682611eed565b600a805461ff00191690555b611ccf8787878787612040565b50505050505050565b6000611ce482846127ba565b9392505050565b6000611ce482846127d1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611d2c57611d2c6126a4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906127f3565b81600181518110611dbc57611dbc6126a4565b6001600160a01b039283166020918202929092010152600654611de29130911684611550565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611e1b908590600090869030904290600401612810565b600060405180830381600087803b158015611e3557600080fd5b505af1158015611e49573d6000803e3d6000fd5b505050505050565b6000611ce482846126e9565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601c546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611ee9573d6000803e3d6000fd5b5050565b6000611f06601a54601954611e5190919063ffffffff16565b90506000821580611f15575081155b15611f1f57505050565b601b54611f2d906005611cd8565b831115611f4557601b54611f42906005611cd8565b92505b6000611f656002610ba685610ba6601a5489611cd890919063ffffffff16565b90506000611f738583612094565b905047611f7f82611cf7565b6000611f8b4783612094565b90506000611fa887610ba660195485611cd890919063ffffffff16565b90506000611fb68383612094565b60006019819055601a5590508515801590611fd15750600081115b15611fe057611fe086826120a0565b601c546040516001600160a01b03909116908390600081818185875af1925050503d806000811461202d576040519150601f19603f3d011682016040523d82523d6000602084013e612032565b606091505b505050505050505050505050565b816120525761204d61214d565b612060565b61205d8584836121a8565b92505b61206b858585612273565b8161208d5761208d601254601155601454601355601654601555601854601755565b5050505050565b6000611ce48284612881565b6006546120b89030906001600160a01b031684611550565b600654601d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612128573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061208d9190612894565b60115415801561215d5750601354155b80156121695750601554155b80156121755750601754155b1561217c57565b601180546012556013805460145560158054601655601780546018556000938490559183905582905555565b600081156121bd576121b861239d565b6121c5565b6121c56123bc565b600e546000901561224f576121eb6103e8610ba6600e5487611cd890919063ffffffff16565b9050600e54600f54826121fe91906127ba565b61220891906127d1565b6019600082825461221991906126e9565b9091555050600e54600f5461222e90836127ba565b61223891906127d1565b601a600082825461224991906126e9565b90915550505b801561226057612260853083612273565b61226a8185612881565b95945050505050565b6001600160a01b0383166122995760405162461bcd60e51b815260040161093990612732565b6001600160a01b0382166122bf5760405162461bcd60e51b815260040161093990612777565b6001600160a01b038316600090815260208190526040902054818110156123375760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610939565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610b5a565b601554600f81905560175460108190556123b79190611e51565b600e55565b601154600f81905560135460108190556123b79190611e51565b600060208083528351808285015260005b81811015612403578581018301518582016040015282016123e7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c6957600080fd5b803561244481612424565b919050565b6000806040838503121561245c57600080fd5b823561246781612424565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b8015158114610c6957600080fd5b80356124448161248b565b600080604083850312156124b757600080fd5b823567ffffffffffffffff808211156124cf57600080fd5b818501915085601f8301126124e357600080fd5b81356020828211156124f7576124f7612475565b8160051b604051601f19603f8301168101818110868211171561251c5761251c612475565b60405292835281830193508481018201928984111561253a57600080fd5b948201945b8386101561255f5761255086612439565b8552948201949382019361253f565b965061256e9050878201612499565b9450505050509250929050565b60006020828403121561258d57600080fd5b8135611ce481612424565b6000806000606084860312156125ad57600080fd5b83356125b881612424565b925060208401356125c881612424565b929592945050506040919091013590565b6000602082840312156125eb57600080fd5b5035919050565b6000806040838503121561260557600080fd5b50508035926020909101359150565b6000806040838503121561262757600080fd5b823561263281612424565b9150602083013561264281612424565b809150509250929050565b60006020828403121561265f57600080fd5b8135611ce48161248b565b600181811c9082168061267e57607f821691505b60208210810361269e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126e2576126e26126ba565b5060010190565b80820180821115610865576108656126ba565b60006020828403121561270e57600080fd5b5051919050565b60006020828403121561272757600080fd5b8151611ce48161248b565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610865576108656126ba565b6000826127ee57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561280557600080fd5b8151611ce481612424565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128605784516001600160a01b03168352938301939183019160010161283b565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610865576108656126ba565b6000806000606084860312156128a957600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212205a3f19164a56f3e29f7c911ed136d5d68892efb7a48fa52ad570e9705044fe8864736f6c63430008110033
Deployed Bytecode
0x60806040526004361061025e5760003560e01c80638da5cb5b11610143578063c1aea0c3116100bb578063e7cf3b7f11610077578063e7cf3b7f14610705578063e99c9d0914610725578063ec29e0fe14610745578063f2fde38b14610765578063f34eb0b814610785578063ffb54a99146107a557005b8063c1aea0c314610665578063c9567bf91461067b578063d077b48f14610690578063dd62ed3e146106b0578063dff90b5b146106d0578063e01af92c146106e557005b8063a457c2d71161010a578063a457c2d7146105b9578063a9059cbb146105d9578063aa4bde28146105f9578063afa4f3b21461060f578063b6cf8ce61461062f578063c04a894c1461064557005b80638da5cb5b1461054457806395d89b41146105625780639c3b4fdc146105775780639e93ad8e1461058d578063a0d82dc5146105a357005b806339509351116101d65780636d2d81621161019d5780636d2d81621461048e5780636ddd1713146104ae57806370a08231146104ce578063715018a614610504578063751039fc1461051957806388e765ff1461052e57005b806339509351146103d25780633bbac579146103f257806349bd5a5e1461042b57806366d602ae1461046357806367c453491461047957005b80631f110500116102255780631f110500146103215780631f53ac021461034157806320800a001461036157806323b872dd1461037657806327a14fc214610396578063313ce567146103b657005b806306fdde0314610267578063095ea7b3146102925780630a3d5b55146102c25780630b01aa51146102e257806318160ddd1461030257005b3661026557005b005b34801561027357600080fd5b5061027c6107bf565b60405161028991906123d6565b60405180910390f35b34801561029e57600080fd5b506102b26102ad366004612449565b610851565b6040519015158152602001610289565b3480156102ce57600080fd5b506102656102dd3660046124a4565b61086b565b3480156102ee57600080fd5b506102656102fd36600461257b565b6108df565b34801561030e57600080fd5b506002545b604051908152602001610289565b34801561032d57600080fd5b5061026561033c3660046124a4565b6109c0565b34801561034d57600080fd5b5061026561035c36600461257b565b610a2f565b34801561036d57600080fd5b50610265610b0b565b34801561038257600080fd5b506102b2610391366004612598565b610b60565b3480156103a257600080fd5b506102656103b13660046125d9565b610b84565b3480156103c257600080fd5b5060405160128152602001610289565b3480156103de57600080fd5b506102b26103ed366004612449565b610c26565b3480156103fe57600080fd5b506102b261040d36600461257b565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561043757600080fd5b50601e5461044b906001600160a01b031681565b6040516001600160a01b039091168152602001610289565b34801561046f57600080fd5b50610313600c5481565b34801561048557600080fd5b50610265610c48565b34801561049a57600080fd5b506102656104a93660046125f2565b610c6c565b3480156104ba57600080fd5b50600a546102b29062010000900460ff1681565b3480156104da57600080fd5b506103136104e936600461257b565b6001600160a01b031660009081526020819052604090205490565b34801561051057600080fd5b50610265610cda565b34801561052557600080fd5b50610265610cee565b34801561053a57600080fd5b50610313600b5481565b34801561055057600080fd5b506005546001600160a01b031661044b565b34801561056e57600080fd5b5061027c610d11565b34801561058357600080fd5b5061031360115481565b34801561059957600080fd5b506103136103e881565b3480156105af57600080fd5b5061031360155481565b3480156105c557600080fd5b506102b26105d4366004612449565b610d20565b3480156105e557600080fd5b506102b26105f4366004612449565b610d9b565b34801561060557600080fd5b50610313600d5481565b34801561061b57600080fd5b5061026561062a3660046125d9565b610da9565b34801561063b57600080fd5b5061031360175481565b34801561065157600080fd5b506102656106603660046124a4565b610eb8565b34801561067157600080fd5b5061031360135481565b34801561068757600080fd5b50610265610fe5565b34801561069c57600080fd5b506102656106ab36600461257b565b6110d9565b3480156106bc57600080fd5b506103136106cb366004612614565b6112bc565b3480156106dc57600080fd5b506102656112e7565b3480156106f157600080fd5b5061026561070036600461264d565b6112f9565b34801561071157600080fd5b506102656107203660046125f2565b61131d565b34801561073157600080fd5b506102656107403660046125d9565b61138b565b34801561075157600080fd5b5061026561076036600461257b565b611421565b34801561077157600080fd5b5061026561078036600461257b565b61144b565b34801561079157600080fd5b506102656107a03660046125d9565b6114c1565b3480156107b157600080fd5b50600a546102b29060ff1681565b6060600380546107ce9061266a565b80601f01602080910402602001604051908101604052809291908181526020018280546107fa9061266a565b80156108475780601f1061081c57610100808354040283529160200191610847565b820191906000526020600020905b81548152906001019060200180831161082a57829003601f168201915b5050505050905090565b60003361085f818585611550565b60019150505b92915050565b610873611674565b60005b82518110156108da578160086000858481518110610896576108966126a4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806108d2816126d0565b915050610876565b505050565b6108e7611674565b6001600160a01b0381166109425760405162461bcd60e51b815260206004820152601e60248201527f5f6c697157616c6c657420616464726573732063616e6e6f742062652030000060448201526064015b60405180910390fd5b601d80546001600160a01b039081166000908152600760208181526040808420805460ff19908116909155865486168552600880845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b6109c8611674565b60005b82518110156108da5781600760008584815181106109eb576109eb6126a4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a27816126d0565b9150506109cb565b610a37611674565b6001600160a01b038116610a8d5760405162461bcd60e51b815260206004820152601e60248201527f5f64657657616c6c657420616464726573732063616e6e6f74206265203000006044820152606401610939565b601c80546001600160a01b039081166000908152600760208181526040808420805460ff19908116909155865486168552600880845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b610b13611674565b604051600090339047908381818185875af1925050503d8060008114610b55576040519150601f19603f3d011682016040523d82523d6000602084013e610b5a565b606091505b50505050565b600033610b6e8582856116ce565b610b79858585611742565b506001949350505050565b610b8c611674565b610bac6103e8610ba66001610ba060025490565b90611cd8565b90611ceb565b811015610c215760405162461bcd60e51b815260206004820152603960248201527f4d61782077616c6c657420616d6f756e742063616e6e6f74206265206c6f776560448201527f72207468616e20302e312520746f74616c20737570706c792e000000000000006064820152608401610939565b600d55565b60003361085f818585610c3983836112bc565b610c4391906126e9565b611550565b610c50611674565b30600090815260208190526040902054610c6981611cf7565b50565b610c74611674565b61012c610c818383611e51565b1115610ccf5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206275792074617865732062656c6f77203330250000006044820152606401610939565b601191909155601355565b610ce2611674565b610cec6000611e5d565b565b610cf6611674565b6a52b7d2dcc80cd2e4000000600b819055600c819055600d55565b6060600480546107ce9061266a565b60003381610d2e82866112bc565b905083811015610d8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610939565b610b798286868403611550565b60003361085f818585611742565b610db1611674565b610dc6620186a0610ba66001610ba060025490565b811015610e335760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610939565b610e476103e8610ba66005610ba060025490565b811115610eb35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610939565b601b55565b610ec0611674565b60005b82518110156108da57601e5483516001600160a01b0390911690849083908110610eef57610eef6126a4565b60200260200101516001600160a01b031614158015610f395750306001600160a01b0316838281518110610f2557610f256126a4565b60200260200101516001600160a01b031614155b8015610f77575060065483516001600160a01b0390911690849083908110610f6357610f636126a4565b60200260200101516001600160a01b031614155b15610fd3578160096000858481518110610f9357610f936126a4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80610fdd816126d0565b915050610ec3565b610fed611674565b600a5460ff16156110405760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610939565b600a805462ff000019166201000017905561106c6064610ba66a52b7d2dcc80cd2e40000006001611cd8565b600b5561108a6064610ba66a52b7d2dcc80cd2e40000006001611cd8565b600c556110a86064610ba66a52b7d2dcc80cd2e40000006002611cd8565b600d556110c7612710610ba66a52b7d2dcc80cd2e40000006005611cd8565b601b55600a805460ff19166001179055565b6110e1611674565b306001600160a01b038216036111395760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74207769746864726177207468697320746f6b656e0000000000006044820152606401610939565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a491906126fc565b116111dd5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610939565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124891906126fc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da9190612715565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6112ef611674565b47610c6981611eaf565b611301611674565b600a8054911515620100000262ff000019909216919091179055565b611325611674565b61012c6113328383611e51565b11156113805760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772033302500006044820152606401610939565b601591909155601755565b611393611674565b6113a76103e8610ba66001610ba060025490565b81101561141c5760405162461bcd60e51b815260206004820152603760248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e312520746f74616c20737570706c792e0000000000000000006064820152608401610939565b600c55565b611429611674565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b611453611674565b6001600160a01b0381166114b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610939565b610c6981611e5d565b6114c9611674565b6114dd6103e8610ba66001610ba060025490565b81101561154b5760405162461bcd60e51b815260206004820152603660248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f77657220746044820152753430b71018171892903a37ba30b61039bab838363c9760511b6064820152608401610939565b600b55565b6001600160a01b0383166115b25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610939565b6001600160a01b0382166116135760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610939565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610cec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610939565b60006116da84846112bc565b90506000198114610b5a57818110156117355760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610939565b610b5a8484848403611550565b6001600160a01b0383166117685760405162461bcd60e51b815260040161093990612732565b6001600160a01b03821661178e5760405162461bcd60e51b815260040161093990612777565b600081116117f05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610939565b600160006118066005546001600160a01b031690565b6001600160a01b0316856001600160a01b03161415801561183557506005546001600160a01b03858116911614155b801561184957506001600160a01b03841615155b801561186057506001600160a01b03841661dead14155b80156118745750600a54610100900460ff16155b15611b83576001600160a01b03851660009081526009602052604090205460ff161580156118bb57506001600160a01b03841660009081526009602052604090205460ff16155b6118f05760405162461bcd60e51b8152600401610939906020808252600490820152632137ba1760e11b604082015260600190565b600a5460ff16611985576001600160a01b03851660009081526007602052604090205460ff168061193957506001600160a01b03841660009081526007602052604090205460ff165b6119855760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610939565b601e546001600160a01b0386811691161480156119b057506006546001600160a01b03858116911614155b80156119d557506001600160a01b03841660009081526008602052604090205460ff16155b15611ac557600b54831115611a3e5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610939565b600d5483611a61866001600160a01b031660009081526020819052604090205490565b611a6b91906126e9565b1115611ac55760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610939565b601e546001600160a01b038581169116148015611af057506006546001600160a01b03868116911614155b8015611b1557506001600160a01b03851660009081526008602052604090205460ff16155b15611b8357600c54831115611b7f5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610939565b5060015b6001600160a01b03851660009081526007602052604090205460ff1680611bc257506001600160a01b03841660009081526007602052604090205460ff165b15611bcc57600091505b601e546001600160a01b03868116911614801590611bf85750601e546001600160a01b03858116911614155b15611c0257600091505b3060009081526020819052604081205490506000601b5482118015611c245750825b9050808015611c3b5750600a5462010000900460ff165b8015611c4f5750600a54610100900460ff16155b8015611c7457506001600160a01b03871660009081526007602052604090205460ff16155b8015611c9957506001600160a01b03861660009081526007602052604090205460ff16155b15611cc257600a805461ff001916610100179055611cb682611eed565b600a805461ff00191690555b611ccf8787878787612040565b50505050505050565b6000611ce482846127ba565b9392505050565b6000611ce482846127d1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611d2c57611d2c6126a4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da991906127f3565b81600181518110611dbc57611dbc6126a4565b6001600160a01b039283166020918202929092010152600654611de29130911684611550565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611e1b908590600090869030904290600401612810565b600060405180830381600087803b158015611e3557600080fd5b505af1158015611e49573d6000803e3d6000fd5b505050505050565b6000611ce482846126e9565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601c546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611ee9573d6000803e3d6000fd5b5050565b6000611f06601a54601954611e5190919063ffffffff16565b90506000821580611f15575081155b15611f1f57505050565b601b54611f2d906005611cd8565b831115611f4557601b54611f42906005611cd8565b92505b6000611f656002610ba685610ba6601a5489611cd890919063ffffffff16565b90506000611f738583612094565b905047611f7f82611cf7565b6000611f8b4783612094565b90506000611fa887610ba660195485611cd890919063ffffffff16565b90506000611fb68383612094565b60006019819055601a5590508515801590611fd15750600081115b15611fe057611fe086826120a0565b601c546040516001600160a01b03909116908390600081818185875af1925050503d806000811461202d576040519150601f19603f3d011682016040523d82523d6000602084013e612032565b606091505b505050505050505050505050565b816120525761204d61214d565b612060565b61205d8584836121a8565b92505b61206b858585612273565b8161208d5761208d601254601155601454601355601654601555601854601755565b5050505050565b6000611ce48284612881565b6006546120b89030906001600160a01b031684611550565b600654601d5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612128573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061208d9190612894565b60115415801561215d5750601354155b80156121695750601554155b80156121755750601754155b1561217c57565b601180546012556013805460145560158054601655601780546018556000938490559183905582905555565b600081156121bd576121b861239d565b6121c5565b6121c56123bc565b600e546000901561224f576121eb6103e8610ba6600e5487611cd890919063ffffffff16565b9050600e54600f54826121fe91906127ba565b61220891906127d1565b6019600082825461221991906126e9565b9091555050600e54600f5461222e90836127ba565b61223891906127d1565b601a600082825461224991906126e9565b90915550505b801561226057612260853083612273565b61226a8185612881565b95945050505050565b6001600160a01b0383166122995760405162461bcd60e51b815260040161093990612732565b6001600160a01b0382166122bf5760405162461bcd60e51b815260040161093990612777565b6001600160a01b038316600090815260208190526040902054818110156123375760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610939565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610b5a565b601554600f81905560175460108190556123b79190611e51565b600e55565b601154600f81905560135460108190556123b79190611e51565b600060208083528351808285015260005b81811015612403578581018301518582016040015282016123e7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c6957600080fd5b803561244481612424565b919050565b6000806040838503121561245c57600080fd5b823561246781612424565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b8015158114610c6957600080fd5b80356124448161248b565b600080604083850312156124b757600080fd5b823567ffffffffffffffff808211156124cf57600080fd5b818501915085601f8301126124e357600080fd5b81356020828211156124f7576124f7612475565b8160051b604051601f19603f8301168101818110868211171561251c5761251c612475565b60405292835281830193508481018201928984111561253a57600080fd5b948201945b8386101561255f5761255086612439565b8552948201949382019361253f565b965061256e9050878201612499565b9450505050509250929050565b60006020828403121561258d57600080fd5b8135611ce481612424565b6000806000606084860312156125ad57600080fd5b83356125b881612424565b925060208401356125c881612424565b929592945050506040919091013590565b6000602082840312156125eb57600080fd5b5035919050565b6000806040838503121561260557600080fd5b50508035926020909101359150565b6000806040838503121561262757600080fd5b823561263281612424565b9150602083013561264281612424565b809150509250929050565b60006020828403121561265f57600080fd5b8135611ce48161248b565b600181811c9082168061267e57607f821691505b60208210810361269e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126e2576126e26126ba565b5060010190565b80820180821115610865576108656126ba565b60006020828403121561270e57600080fd5b5051919050565b60006020828403121561272757600080fd5b8151611ce48161248b565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610865576108656126ba565b6000826127ee57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561280557600080fd5b8151611ce481612424565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128605784516001600160a01b03168352938301939183019160010161283b565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610865576108656126ba565b6000806000606084860312156128a957600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212205a3f19164a56f3e29f7c911ed136d5d68892efb7a48fa52ad570e9705044fe8864736f6c63430008110033
Deployed Bytecode Sourcemap
32511:12916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15872:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18209:201;;;;;;;;;;-1:-1:-1;18209:201:0;;;;;:::i;:::-;;:::i;:::-;;;1327:14:1;;1320:22;1302:41;;1290:2;1275:18;18209:201:0;1162:187:1;41456:179:0;;;;;;;;;;-1:-1:-1;41456:179:0;;;;;:::i;:::-;;:::i;40906:355::-;;;;;;;;;;-1:-1:-1;40906:355:0;;;;;:::i;:::-;;:::i;16986:108::-;;;;;;;;;;-1:-1:-1;17074:12:0;;16986:108;;;3336:25:1;;;3324:2;3309:18;16986:108:0;3190:177:1;41267::0;;;;;;;;;;-1:-1:-1;41267:177:0;;;;;:::i;:::-;;:::i;40545:355::-;;;;;;;;;;-1:-1:-1;40545:355:0;;;;;:::i;:::-;;:::i;44581:151::-;;;;;;;;;;;;;:::i;18988:295::-;;;;;;;;;;-1:-1:-1;18988:295:0;;;;;:::i;:::-;;:::i;39870:257::-;;;;;;;;;;-1:-1:-1;39870:257:0;;;;;:::i;:::-;;:::i;16830:93::-;;;;;;;;;;-1:-1:-1;16830:93:0;;16913:2;4160:36:1;;4148:2;4133:18;16830:93:0;4018:184:1;19690:238:0;;;;;;;;;;-1:-1:-1;19690:238:0;;;;;:::i;:::-;;:::i;38781:100::-;;;;;;;;;;-1:-1:-1;38781:100:0;;;;;:::i;:::-;-1:-1:-1;;;;;38859:14:0;38835:4;38859:14;;;:6;:14;;;;;;;;;38781:100;33937:28;;;;;;;;;;-1:-1:-1;33937:28:0;;;;-1:-1:-1;;;;;33937:28:0;;;;;;-1:-1:-1;;;;;4371:32:1;;;4353:51;;4341:2;4326:18;33937:28:0;4207:203:1;33010:39:0;;;;;;;;;;;;;;;;44266:148;;;;;;;;;;;;;:::i;41946:235::-;;;;;;;;;;-1:-1:-1;41946:235:0;;;;;:::i;:::-;;:::i;32862:31::-;;;;;;;;;;-1:-1:-1;32862:31:0;;;;;;;;;;;17155:127;;;;;;;;;;-1:-1:-1;17155:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;17256:18:0;17229:7;17256:18;;;;;;;;;;;;17155:127;2709:103;;;;;;;;;;;;;:::i;45198:155::-;;;;;;;;;;;;;:::i;32965:38::-;;;;;;;;;;;;;;;;2065:87;;;;;;;;;;-1:-1:-1;2138:6:0;;-1:-1:-1;;;;;2138:6:0;2065:87;;16089:104;;;;;;;;;;;;;:::i;33246:29::-;;;;;;;;;;;;;;;;33104:42;;;;;;;;;;;;33142:4;33104:42;;33435:30;;;;;;;;;;;;;;;;20429:434;;;;;;;;;;-1:-1:-1;20429:434:0;;;;;:::i;:::-;;:::i;17486:193::-;;;;;;;;;;-1:-1:-1;17486:193:0;;;;;:::i;:::-;;:::i;33056:41::-;;;;;;;;;;;;;;;;40139:398;;;;;;;;;;-1:-1:-1;40139:398:0;;;;;:::i;:::-;;:::i;33532:30::-;;;;;;;;;;;;;;;;41647:293;;;;;;;;;;-1:-1:-1;41647:293:0;;;;;:::i;:::-;;:::i;33341:29::-;;;;;;;;;;;;;;;;38887:378;;;;;;;;;;;;;:::i;44738:322::-;;;;;;;;;;-1:-1:-1;44738:322:0;;;;;:::i;:::-;;:::i;17740:151::-;;;;;;;;;;-1:-1:-1;17740:151:0;;;;;:::i;:::-;;:::i;44426:149::-;;;;;;;;;;;;;:::i;39271:91::-;;;;;;;;;;-1:-1:-1;39271:91:0;;;;;:::i;:::-;;:::i;42187:245::-;;;;;;;;;;-1:-1:-1;42187:245:0;;;;;:::i;:::-;;:::i;39613:::-;;;;;;;;;;-1:-1:-1;39613:245:0;;;;;:::i;:::-;;:::i;45068:124::-;;;;;;;;;;-1:-1:-1;45068:124:0;;;;;:::i;:::-;;:::i;2965:201::-;;;;;;;;;;-1:-1:-1;2965:201:0;;;;;:::i;:::-;;:::i;39368:239::-;;;;;;;;;;-1:-1:-1;39368:239:0;;;;;:::i;:::-;;:::i;32803:23::-;;;;;;;;;;-1:-1:-1;32803:23:0;;;;;;;;15872:100;15926:13;15959:5;15952:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15872:100;:::o;18209:201::-;18292:4;800:10;18348:32;800:10;18364:7;18373:6;18348:8;:32::i;:::-;18398:4;18391:11;;;18209:201;;;;;:::o;41456:179::-;1953:13;:11;:13::i;:::-;41552:6:::1;41547:80;41568:8;:15;41564:1;:19;41547:80;;;41620:7;41590:14;:27;41605:8;41614:1;41605:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;41590:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;41590:27:0;:37;;-1:-1:-1;;41590:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41585:3;::::1;::::0;::::1;:::i;:::-;;;;41547:80;;;;41456:179:::0;;:::o;40906:355::-;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;40983:17:0;::::1;40975:60;;;::::0;-1:-1:-1;;;40975:60:0;;6298:2:1;40975:60:0::1;::::0;::::1;6280:21:1::0;6337:2;6317:18;;;6310:30;6376:32;6356:18;;;6349:60;6426:18;;40975:60:0::1;;;;;;;;;41060:10;::::0;;-1:-1:-1;;;;;41060:10:0;;::::1;41074:5;41046:25:::0;;;:13:::1;:25;::::0;;;;;;;:33;;-1:-1:-1;;41046:33:0;;::::1;::::0;;;41105:10;;;::::1;41090:26:::0;;:14:::1;:26:::0;;;;;;:34;;;::::1;::::0;;41135:31;;-1:-1:-1;;;;;;41135:31:0::1;::::0;;::::1;::::0;;::::1;::::0;;41177:25;;;;;;;;;:32;;;::::1;-1:-1:-1::0;41177:32:0;;::::1;::::0;;;41235:10;;;;::::1;41220:26:::0;;;;;;;:33;;;;::::1;;::::0;;40906:355::o;41267:177::-;1953:13;:11;:13::i;:::-;41362:6:::1;41357:79;41378:8;:15;41374:1;:19;41357:79;;;41429:7;41400:13;:26;41414:8;41423:1;41414:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;41400:26:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;41400:26:0;:36;;-1:-1:-1;;41400:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41395:3;::::1;::::0;::::1;:::i;:::-;;;;41357:79;;40545:355:::0;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;40622:17:0;::::1;40614:60;;;::::0;-1:-1:-1;;;40614:60:0;;6657:2:1;40614:60:0::1;::::0;::::1;6639:21:1::0;6696:2;6676:18;;;6669:30;6735:32;6715:18;;;6708:60;6785:18;;40614:60:0::1;6455:354:1::0;40614:60:0::1;40699:10;::::0;;-1:-1:-1;;;;;40699:10:0;;::::1;40713:5;40685:25:::0;;;:13:::1;:25;::::0;;;;;;;:33;;-1:-1:-1;;40685:33:0;;::::1;::::0;;;40744:10;;;::::1;40729:26:::0;;:14:::1;:26:::0;;;;;;:34;;;::::1;::::0;;40774:31;;-1:-1:-1;;;;;;40774:31:0::1;::::0;;::::1;::::0;;::::1;::::0;;40816:25;;;;;;;;;:32;;;::::1;-1:-1:-1::0;40816:32:0;;::::1;::::0;;;40874:10;;;;::::1;40859:26:::0;;;;;;;:33;;;;::::1;;::::0;;40545:355::o;44581:151::-;1953:13;:11;:13::i;:::-;44666:58:::1;::::0;44630:12:::1;::::0;44674:10:::1;::::0;44698:21:::1;::::0;44630:12;44666:58;44630:12;44666:58;44698:21;44674:10;44666:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;44581:151:0:o;18988:295::-;19119:4;800:10;19177:38;19193:4;800:10;19208:6;19177:15;:38::i;:::-;19226:27;19236:4;19242:2;19246:6;19226:9;:27::i;:::-;-1:-1:-1;19271:4:0;;18988:295;-1:-1:-1;;;;18988:295:0:o;39870:257::-;1953:13;:11;:13::i;:::-;39981:30:::1;40006:4;39981:20;39999:1;39981:13;17074:12:::0;;;16986:108;39981:13:::1;:17:::0;::::1;:20::i;:::-;:24:::0;::::1;:30::i;:::-;39960:16;:52;;39952:122;;;::::0;-1:-1:-1;;;39952:122:0;;7226:2:1;39952:122:0::1;::::0;::::1;7208:21:1::0;7265:2;7245:18;;;7238:30;7304:34;7284:18;;;7277:62;7375:27;7355:18;;;7348:55;7420:19;;39952:122:0::1;7024:421:1::0;39952:122:0::1;40085:15;:34:::0;39870:257::o;19690:238::-;19778:4;800:10;19834:64;800:10;19850:7;19887:10;19859:25;800:10;19850:7;19859:9;:25::i;:::-;:38;;;;:::i;:::-;19834:8;:64::i;44266:148::-;1953:13;:11;:13::i;:::-;44356:4:::1;44312:23;17256:18:::0;;;;;;;;;;;44373:33:::1;17256:18:::0;44373:16:::1;:33::i;:::-;44301:113;44266:148::o:0;41946:235::-;1953:13;:11;:13::i;:::-;42070:3:::1;42038:28;42039:10:::0;42055;42038:16:::1;:28::i;:::-;:35;;42030:77;;;::::0;-1:-1:-1;;;42030:77:0;;7782:2:1;42030:77:0::1;::::0;::::1;7764:21:1::0;7821:2;7801:18;;;7794:30;7860:31;7840:18;;;7833:59;7909:18;;42030:77:0::1;7580:353:1::0;42030:77:0::1;42118:9;:22:::0;;;;42151:9:::1;:22:::0;41946:235::o;2709:103::-;1953:13;:11;:13::i;:::-;2774:30:::1;2801:1;2774:18;:30::i;:::-;2709:103::o:0;45198:155::-;1953:13;:11;:13::i;:::-;32936:22:::1;45250:12;:23:::0;;;45284:13:::1;:24:::0;;;45319:15:::1;:26:::0;45198:155::o;16089:104::-;16145:13;16178:7;16171:14;;;;;:::i;20429:434::-;20522:4;800:10;20522:4;20605:25;800:10;20622:7;20605:9;:25::i;:::-;20578:52;;20669:15;20649:16;:35;;20641:85;;;;-1:-1:-1;;;20641:85:0;;8140:2:1;20641:85:0;;;8122:21:1;8179:2;8159:18;;;8152:30;8218:34;8198:18;;;8191:62;-1:-1:-1;;;8269:18:1;;;8262:35;8314:19;;20641:85:0;7938:401:1;20641:85:0;20762:60;20771:5;20778:7;20806:15;20787:16;:34;20762:8;:60::i;17486:193::-;17565:4;800:10;17621:28;800:10;17638:2;17642:6;17621:9;:28::i;40139:398::-;1953:13;:11;:13::i;:::-;40257:32:::1;40282:6;40257:20;40275:1;40257:13;17074:12:::0;;;16986:108;40257:32:::1;40234:18;:56;;40226:122;;;::::0;-1:-1:-1;;;40226:122:0;;8546:2:1;40226:122:0::1;::::0;::::1;8528:21:1::0;8585:2;8565:18;;;8558:30;8624:34;8604:18;;;8597:62;-1:-1:-1;;;8675:18:1;;;8668:51;8736:19;;40226:122:0::1;8344:417:1::0;40226:122:0::1;40390:30;40415:4;40390:20;40408:1;40390:13;17074:12:::0;;;16986:108;40390:30:::1;40367:18;:54;;40359:119;;;::::0;-1:-1:-1;;;40359:119:0;;8968:2:1;40359:119:0::1;::::0;::::1;8950:21:1::0;9007:2;8987:18;;;8980:30;9046:34;9026:18;;;9019:62;-1:-1:-1;;;9097:18:1;;;9090:50;9157:19;;40359:119:0::1;8766:416:1::0;40359:119:0::1;40489:19;:40:::0;40139:398::o;41647:293::-;1953:13;:11;:13::i;:::-;41730:6:::1;41725:208;41746:8;:15;41742:1;:19;41725:208;;;41802:13;::::0;41787:11;;-1:-1:-1;;;;;41802:13:0;;::::1;::::0;41787:8;;41796:1;;41787:11;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41787:28:0::1;;;41786:64;;;;;41844:4;-1:-1:-1::0;;;;;41821:28:0::1;:8;41830:1;41821:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41821:28:0::1;;;41786:64;:109;;;;-1:-1:-1::0;41878:15:0::1;::::0;41855:11;;-1:-1:-1;;;;;41878:15:0;;::::1;::::0;41855:8;;41864:1;;41855:11;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41855:39:0::1;;;41786:109;41783:138;;;41919:2;41897:6;:19;41904:8;41913:1;41904:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41897:19:0::1;-1:-1:-1::0;;;;;41897:19:0::1;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;41783:138;41763:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41725:208;;38887:378:::0;1953:13;:11;:13::i;:::-;38947:11:::1;::::0;::::1;;38946:12;38938:48;;;::::0;-1:-1:-1;;;38938:48:0;;9389:2:1;38938:48:0::1;::::0;::::1;9371:21:1::0;9428:2;9408:18;;;9401:30;9467:25;9447:18;;;9440:53;9510:18;;38938:48:0::1;9187:347:1::0;38938:48:0::1;38997:11;:18:::0;;-1:-1:-1;;38997:18:0::1;::::0;::::1;::::0;;39041:24:::1;39061:3;39041:15;32936:22;39011:4;39041:12;:15::i;:24::-;39026:12;:39:::0;39092:24:::1;39112:3;39092:15;32936:22;39105:1;39092:12;:15::i;:24::-;39076:13;:40:::0;39145:24:::1;39165:3;39145:15;32936:22;39158:1;39145:12;:15::i;:24::-;39127:15;:42:::0;39202:26:::1;39222:5;39202:15;32936:22;39215:1;39202:12;:15::i;:26::-;39180:19;:48:::0;39239:11:::1;:18:::0;;-1:-1:-1;;39239:18:0::1;39253:4;39239:18;::::0;;38887:378::o;44738:322::-;1953:13;:11;:13::i;:::-;44831:4:::1;-1:-1:-1::0;;;;;44816:20:0;::::1;::::0;44808:59:::1;;;::::0;-1:-1:-1;;;44808:59:0;;9741:2:1;44808:59:0::1;::::0;::::1;9723:21:1::0;9780:2;9760:18;;;9753:30;9819:28;9799:18;;;9792:56;9865:18;;44808:59:0::1;9539:350:1::0;44808:59:0::1;44886:36;::::0;-1:-1:-1;;;44886:36:0;;44916:4:::1;44886:36;::::0;::::1;4353:51:1::0;44925:1:0::1;::::0;-1:-1:-1;;;;;44886:21:0;::::1;::::0;::::1;::::0;4326:18:1;;44886:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;44878:62;;;::::0;-1:-1:-1;;;44878:62:0;;10285:2:1;44878:62:0::1;::::0;::::1;10267:21:1::0;10324:1;10304:18;;;10297:29;-1:-1:-1;;;10342:18:1;;;10335:39;10391:18;;44878:62:0::1;10083:332:1::0;44878:62:0::1;44965:36;::::0;-1:-1:-1;;;44965:36:0;;44995:4:::1;44965:36;::::0;::::1;4353:51:1::0;44951:11:0::1;::::0;-1:-1:-1;;;;;44965:21:0;::::1;::::0;::::1;::::0;4326:18:1;;44965:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45012:40;::::0;-1:-1:-1;;;45012:40:0;;45033:10:::1;45012:40;::::0;::::1;10594:51:1::0;10661:18;;;10654:34;;;44951:50:0;;-1:-1:-1;;;;;;45012:20:0;::::1;::::0;::::1;::::0;10567:18:1;;45012:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17740:151::-:0;-1:-1:-1;;;;;17856:18:0;;;17829:7;17856:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17740:151::o;44426:149::-;1953:13;:11;:13::i;:::-;44503:21:::1;44535:32;44503:21:::0;44535:12:::1;:32::i;39271:91::-:0;1953:13;:11;:13::i;:::-;39335:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;39335:19:0;;::::1;::::0;;;::::1;::::0;;39271:91::o;42187:245::-;1953:13;:11;:13::i;:::-;42316:3:::1;42282:30;42283:11:::0;42300;42282:17:::1;:30::i;:::-;:37;;42274:80;;;::::0;-1:-1:-1;;;42274:80:0;;11151:2:1;42274:80:0::1;::::0;::::1;11133:21:1::0;11190:2;11170:18;;;11163:30;11229:32;11209:18;;;11202:60;11279:18;;42274:80:0::1;10949:354:1::0;42274:80:0::1;42365:10;:24:::0;;;;42400:10:::1;:24:::0;42187:245::o;39613:::-;1953:13;:11;:13::i;:::-;39718:30:::1;39743:4;39718:20;39736:1;39718:13;17074:12:::0;;;16986:108;39718:30:::1;39699:14;:50;;39691:118;;;::::0;-1:-1:-1;;;39691:118:0;;11510:2:1;39691:118:0::1;::::0;::::1;11492:21:1::0;11549:2;11529:18;;;11522:30;11588:34;11568:18;;;11561:62;11659:25;11639:18;;;11632:53;11702:19;;39691:118:0::1;11308:419:1::0;39691:118:0::1;39820:13;:30:::0;39613:245::o;45068:124::-;1953:13;:11;:13::i;:::-;45153::::1;:31:::0;;-1:-1:-1;;;;;;45153:31:0::1;-1:-1:-1::0;;;;;45153:31:0;;;::::1;::::0;;;::::1;::::0;;45068:124::o;2965:201::-;1953:13;:11;:13::i;:::-;-1:-1:-1;;;;;3054:22:0;::::1;3046:73;;;::::0;-1:-1:-1;;;3046:73:0;;11934:2:1;3046:73:0::1;::::0;::::1;11916:21:1::0;11973:2;11953:18;;;11946:30;12012:34;11992:18;;;11985:62;-1:-1:-1;;;12063:18:1;;;12056:36;12109:19;;3046:73:0::1;11732:402:1::0;3046:73:0::1;3130:28;3149:8;3130:18;:28::i;39368:239::-:0;1953:13;:11;:13::i;:::-;39470:30:::1;39495:4;39470:20;39488:1;39470:13;17074:12:::0;;;16986:108;39470:30:::1;39452:13;:49;;39444:116;;;::::0;-1:-1:-1;;;39444:116:0;;12341:2:1;39444:116:0::1;::::0;::::1;12323:21:1::0;12380:2;12360:18;;;12353:30;12419:34;12399:18;;;12392:62;-1:-1:-1;;;12470:18:1;;;12463:52;12532:19;;39444:116:0::1;12139:418:1::0;39444:116:0::1;39571:12;:28:::0;39368:239::o;24424:378::-;-1:-1:-1;;;;;24560:19:0;;24552:68;;;;-1:-1:-1;;;24552:68:0;;12764:2:1;24552:68:0;;;12746:21:1;12803:2;12783:18;;;12776:30;12842:34;12822:18;;;12815:62;-1:-1:-1;;;12893:18:1;;;12886:34;12937:19;;24552:68:0;12562:400:1;24552:68:0;-1:-1:-1;;;;;24639:21:0;;24631:68;;;;-1:-1:-1;;;24631:68:0;;13169:2:1;24631:68:0;;;13151:21:1;13208:2;13188:18;;;13181:30;13247:34;13227:18;;;13220:62;-1:-1:-1;;;13298:18:1;;;13291:32;13340:19;;24631:68:0;12967:398:1;24631:68:0;-1:-1:-1;;;;;24710:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24762:32;;3336:25:1;;;24762:32:0;;3309:18:1;24762:32:0;;;;;;;24424:378;;;:::o;2228:132::-;2138:6;;-1:-1:-1;;;;;2138:6:0;800:10;2292:23;2284:68;;;;-1:-1:-1;;;2284:68:0;;13572:2:1;2284:68:0;;;13554:21:1;;;13591:18;;;13584:30;13650:34;13630:18;;;13623:62;13702:18;;2284:68:0;13370:356:1;25091:453:0;25226:24;25253:25;25263:5;25270:7;25253:9;:25::i;:::-;25226:52;;-1:-1:-1;;25293:16:0;:37;25289:248;;25375:6;25355:16;:26;;25347:68;;;;-1:-1:-1;;;25347:68:0;;13933:2:1;25347:68:0;;;13915:21:1;13972:2;13952:18;;;13945:30;14011:31;13991:18;;;13984:59;14060:18;;25347:68:0;13731:353:1;25347:68:0;25459:51;25468:5;25475:7;25503:6;25484:16;:25;25459:8;:51::i;34933:1789::-;-1:-1:-1;;;;;35031:12:0;;35023:62;;;;-1:-1:-1;;;35023:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35104:10:0;;35096:58;;;;-1:-1:-1;;;35096:58:0;;;;;;;:::i;:::-;35182:1;35173:6;:10;35165:64;;;;-1:-1:-1;;;35165:64:0;;15101:2:1;35165:64:0;;;15083:21:1;15140:2;15120:18;;;15113:30;15179:34;15159:18;;;15152:62;-1:-1:-1;;;15230:18:1;;;15223:39;15279:19;;35165:64:0;14899:405:1;35165:64:0;35255:4;35240:12;35316:7;2138:6;;-1:-1:-1;;;;;2138:6:0;;2065:87;35316:7;-1:-1:-1;;;;;35308:15:0;:4;-1:-1:-1;;;;;35308:15:0;;;:32;;;;-1:-1:-1;2138:6:0;;-1:-1:-1;;;;;35327:13:0;;;2138:6;;35327:13;;35308:32;:46;;;;-1:-1:-1;;;;;;35344:10:0;;;;35308:46;:60;;;;-1:-1:-1;;;;;;35358:10:0;;34004:42;35358:10;;35308:60;:74;;;;-1:-1:-1;35373:9:0;;;;;;;35372:10;35308:74;35304:845;;;-1:-1:-1;;;;;35408:12:0;;;;;;:6;:12;;;;;;;;35407:13;:28;;;;-1:-1:-1;;;;;;35425:10:0;;;;;;:6;:10;;;;;;;;35424:11;35407:28;35399:45;;;;-1:-1:-1;;;35399:45:0;;;;;;15511:2:1;15493:21;;;15550:1;15530:18;;;15523:29;-1:-1:-1;;;15583:2:1;15568:18;;15561:34;15627:2;15612:18;;15309:327;35399:45:0;35463:11;;;;35459:97;;-1:-1:-1;;;;;35484:19:0;;;;;;:13;:19;;;;;;;;;:40;;-1:-1:-1;;;;;;35507:17:0;;;;;;:13;:17;;;;;;;;35484:40;35476:80;;;;-1:-1:-1;;;35476:80:0;;15843:2:1;35476:80:0;;;15825:21:1;15882:2;15862:18;;;15855:30;15921:29;15901:18;;;15894:57;15968:18;;35476:80:0;15641:351:1;35476:80:0;35583:13;;-1:-1:-1;;;;;35575:21:0;;;35583:13;;35575:21;:55;;;;-1:-1:-1;35614:15:0;;-1:-1:-1;;;;;35600:30:0;;;35614:15;;35600:30;;35575:55;:78;;;;-1:-1:-1;;;;;;35635:18:0;;;;;;:14;:18;;;;;;;;35634:19;35575:78;35571:304;;;35692:12;;35682:6;:22;;35674:76;;;;-1:-1:-1;;;35674:76:0;;16199:2:1;35674:76:0;;;16181:21:1;16238:2;16218:18;;;16211:30;16277:34;16257:18;;;16250:62;-1:-1:-1;;;16328:18:1;;;16321:39;16377:19;;35674:76:0;15997:405:1;35674:76:0;35803:15;;35793:6;35777:13;35787:2;-1:-1:-1;;;;;17256:18:0;17229:7;17256:18;;;;;;;;;;;;17155:127;35777:13;:22;;;;:::i;:::-;:41;;35769:90;;;;-1:-1:-1;;;35769:90:0;;16609:2:1;35769:90:0;;;16591:21:1;16648:2;16628:18;;;16621:30;16687:34;16667:18;;;16660:62;-1:-1:-1;;;16738:18:1;;;16731:34;16782:19;;35769:90:0;16407:400:1;35769:90:0;35913:13;;-1:-1:-1;;;;;35907:19:0;;;35913:13;;35907:19;:55;;;;-1:-1:-1;35946:15:0;;-1:-1:-1;;;;;35930:32:0;;;35946:15;;35930:32;;35907:55;:80;;;;-1:-1:-1;;;;;;35967:20:0;;;;;;:14;:20;;;;;;;;35966:21;35907:80;35903:235;;;36026:13;;36016:6;:23;;36008:78;;;;-1:-1:-1;;;36008:78:0;;17014:2:1;36008:78:0;;;16996:21:1;17053:2;17033:18;;;17026:30;17092:34;17072:18;;;17065:62;-1:-1:-1;;;17143:18:1;;;17136:40;17193:19;;36008:78:0;16812:406:1;36008:78:0;-1:-1:-1;36118:4:0;35903:235;-1:-1:-1;;;;;36162:19:0;;;;;;:13;:19;;;;;;;;;:40;;-1:-1:-1;;;;;;36185:17:0;;;;;;:13;:17;;;;;;;;36162:40;36159:60;;;36214:5;36204:15;;36159:60;36241:13;;-1:-1:-1;;;;;36233:21:0;;;36241:13;;36233:21;;;;:44;;-1:-1:-1;36264:13:0;;-1:-1:-1;;;;;36258:19:0;;;36264:13;;36258:19;;36233:44;36230:64;;;36289:5;36279:15;;36230:64;36351:4;36307:23;17256:18;;;;;;;;;;;36307:50;;36368:12;36402:19;;36384:15;:37;36383:53;;;;;36426:10;36383:53;36368:68;;36451:7;:22;;;;-1:-1:-1;36462:11:0;;;;;;;36451:22;:36;;;;-1:-1:-1;36478:9:0;;;;;;;36477:10;36451:36;:60;;;;-1:-1:-1;;;;;;36492:19:0;;;;;;:13;:19;;;;;;;;36491:20;36451:60;:82;;;;-1:-1:-1;;;;;;36516:17:0;;;;;;:13;:17;;;;;;;;36515:18;36451:82;36447:204;;;36550:9;:16;;-1:-1:-1;;36550:16:0;;;;;36581:26;36591:15;36581:9;:26::i;:::-;36622:9;:17;;-1:-1:-1;;36622:17:0;;;36447:204;36661:53;36676:4;36682:2;36686:6;36694:7;36703:10;36661:14;:53::i;:::-;35012:1710;;;;34933:1789;;;:::o;7027:98::-;7085:7;7112:5;7116:1;7112;:5;:::i;:::-;7105:12;7027:98;-1:-1:-1;;;7027:98:0:o;7424:::-;7482:7;7509:5;7513:1;7509;:5;:::i;37814:472::-;37905:16;;;37919:1;37905:16;;;;;;;;37881:21;;37905:16;;;;;;;;;;-1:-1:-1;37905:16:0;37881:40;;37950:4;37932;37937:1;37932:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37932:23:0;;;:7;;;;;;;;;;:23;;;;37976:15;;:22;;;-1:-1:-1;;;37976:22:0;;;;:15;;;;;:20;;:22;;;;;37932:7;;37976:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37966:4;37971:1;37966:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37966:32:0;;;:7;;;;;;;;;:32;38041:15;;38009:62;;38026:4;;38041:15;38059:11;38009:8;:62::i;:::-;38082:15;;:196;;-1:-1:-1;;;38082:196:0;;-1:-1:-1;;;;;38082:15:0;;;;:66;;:196;;38163:11;;38082:15;;38205:4;;38232;;38252:15;;38082:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37870:416;37814:472;:::o;6293:98::-;6351:7;6378:5;6382:1;6378;:5;:::i;3324:191::-;3417:6;;;-1:-1:-1;;;;;3434:17:0;;;-1:-1:-1;;;;;;3434:17:0;;;;;;;3467:40;;3417:6;;;3434:17;3417:6;;3467:40;;3398:16;;3467:40;3387:128;3324:191;:::o;38673:102::-;38740:10;;:27;;-1:-1:-1;;;;;38740:10:0;;;;:27;;;;;38760:6;;38740:10;:27;:10;:27;38760:6;38740:10;:27;;;;;;;;;;;;;;;;;;;;;38673:102;:::o;36728:1080::-;36792:25;36821:34;36841:13;;36822;;36821:19;;:34;;;;:::i;:::-;36792:63;-1:-1:-1;36866:12:0;36903:20;;;:46;;-1:-1:-1;36927:22:0;;36903:46;36899:59;;;36951:7;;36728:1080;:::o;36899:59::-;36990:19;;:26;;37014:1;36990:23;:26::i;:::-;36972:15;:44;36968:94;;;37036:19;;:26;;37060:1;37036:23;:26::i;:::-;37018:44;;36968:94;37073:23;37099:64;37161:1;37099:57;37138:17;37099:34;37119:13;;37099:15;:19;;:34;;;;:::i;:64::-;37073:90;-1:-1:-1;37174:26:0;37203:36;:15;37073:90;37203:19;:36::i;:::-;37174:65;-1:-1:-1;37278:21:0;37310:36;37174:65;37310:16;:36::i;:::-;37367:18;37388:44;:21;37414:17;37388:25;:44::i;:::-;37367:65;;37443:17;37463:52;37497:17;37463:29;37478:13;;37463:10;:14;;:29;;;;:::i;:52::-;37443:72;-1:-1:-1;37526:17:0;37546:25;:10;37443:72;37546:14;:25::i;:::-;37608:1;37592:13;:17;;;37620:13;:17;37526:45;-1:-1:-1;37651:19:0;;;;;:36;;;37686:1;37674:9;:13;37651:36;37648:82;;;37689:41;37703:15;37720:9;37689:13;:41::i;:::-;37762:10;;37754:46;;-1:-1:-1;;;;;37762:10:0;;;;37786:9;;37754:46;;;;37786:9;37762:10;37754:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;36728:1080:0:o;43118:319::-;43245:7;43240:86;;43254:14;:12;:14::i;:::-;43240:86;;;43293:33;43303:6;43311;43319;43293:9;:33::i;:::-;43284:42;;43240:86;43337:42;43353:6;43361:9;43372:6;43337:15;:42::i;:::-;43405:7;43400:29;;43414:15;42941:18;;42929:9;:30;42982:18;;42970:9;:30;43032:19;;43019:10;:32;43075:19;;43062:10;:32;42877:225;43414:15;43118:319;;;;;:::o;6672:98::-;6730:7;6757:5;6761:1;6757;:5;:::i;38292:365::-;38407:15;;38375:62;;38392:4;;-1:-1:-1;;;;;38407:15:0;38425:11;38375:8;:62::i;:::-;38448:15;;38598:10;;38448:201;;-1:-1:-1;;;38448:201:0;;38520:4;38448:201;;;19341:34:1;19391:18;;;19384:34;;;38448:15:0;19434:18:1;;;19427:34;;;19477:18;;;19470:34;-1:-1:-1;;;;;38598:10:0;;;19520:19:1;;;19513:44;38623:15:0;19573:19:1;;;19566:35;38448:15:0;;;:31;;38487:9;;19275:19:1;;38448:201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42438:427::-;42486:9;;:14;:32;;;;-1:-1:-1;42504:9:0;;:14;42486:32;:51;;;;-1:-1:-1;42522:10:0;;:15;42486:51;:70;;;;-1:-1:-1;42541:10:0;;:15;42486:70;42482:83;;;42438:427::o;42482:83::-;42604:9;;;42583:18;:30;42645:9;;;42624:18;:30;42694:10;;;42672:19;:32;42737:10;;;42715:19;:32;-1:-1:-1;42768:13:0;;;;42792;;;;42818:14;;;42843;42438:427::o;43443:512::-;43525:7;43549:6;43545:47;;;43557:10;:8;:10::i;:::-;43545:47;;;43583:9;:7;:9::i;:::-;43640:10;;43613:12;;43640:14;43636:211;;43678:39;33142:4;43678:22;43689:10;;43678:6;:10;;:22;;;;:::i;:39::-;43671:46;;43766:10;;43756:7;;43749:4;:14;;;;:::i;:::-;:27;;;;:::i;:::-;43732:13;;:44;;;;;;;:::i;:::-;;;;-1:-1:-1;;43825:10:0;;43815:7;;43808:14;;:4;:14;:::i;:::-;:27;;;;:::i;:::-;43791:13;;:44;;;;;;;:::i;:::-;;;;-1:-1:-1;;43636:211:0;43861:8;;43857:58;;43871:44;43887:6;43903:4;43910;43871:15;:44::i;:::-;43933:14;43943:4;43933:14;;:::i;:::-;;43443:512;-1:-1:-1;;;;;43443:512:0:o;21331:832::-;-1:-1:-1;;;;;21462:18:0;;21454:68;;;;-1:-1:-1;;;21454:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21541:16:0;;21533:64;;;;-1:-1:-1;;;21533:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21679:15:0;;21657:19;21679:15;;;;;;;;;;;21713:21;;;;21705:72;;;;-1:-1:-1;;;21705:72:0;;20125:2:1;21705:72:0;;;20107:21:1;20164:2;20144:18;;;20137:30;20203:34;20183:18;;;20176:62;-1:-1:-1;;;20254:18:1;;;20247:36;20300:19;;21705:72:0;19923:402:1;21705:72:0;-1:-1:-1;;;;;21813:15:0;;;:9;:15;;;;;;;;;;;21831:20;;;21813:38;;22031:13;;;;;;;;;;:23;;;;;;22081:26;;3336:25:1;;;22031:13:0;;22081:26;;3309:18:1;22081:26:0;;;;;;;22118:37;41456:179;43961:145;44011:10;;44001:7;:20;;;44042:10;;44032:7;:20;;;44076:22;;44011:10;44076:13;:22::i;:::-;44063:10;:35;43961:145::o;44112:142::-;44161:9;;44151:7;:19;;;44191:9;;44181:7;:19;;;44224:22;;44161:9;44224:13;:22::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:134;771:20;;800:31;771:20;800:31;:::i;:::-;703:134;;;:::o;842:315::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;1147:2;1132:18;;;;1119:32;;-1:-1:-1;;;842:315:1:o;1354:127::-;1415:10;1410:3;1406:20;1403:1;1396:31;1446:4;1443:1;1436:15;1470:4;1467:1;1460:15;1486:118;1572:5;1565:13;1558:21;1551:5;1548:32;1538:60;;1594:1;1591;1584:12;1609:128;1674:20;;1703:28;1674:20;1703:28;:::i;1742:1191::-;1832:6;1840;1893:2;1881:9;1872:7;1868:23;1864:32;1861:52;;;1909:1;1906;1899:12;1861:52;1949:9;1936:23;1978:18;2019:2;2011:6;2008:14;2005:34;;;2035:1;2032;2025:12;2005:34;2073:6;2062:9;2058:22;2048:32;;2118:7;2111:4;2107:2;2103:13;2099:27;2089:55;;2140:1;2137;2130:12;2089:55;2176:2;2163:16;2198:4;2221:2;2217;2214:10;2211:36;;;2227:18;;:::i;:::-;2273:2;2270:1;2266:10;2305:2;2299:9;2368:2;2364:7;2359:2;2355;2351:11;2347:25;2339:6;2335:38;2423:6;2411:10;2408:22;2403:2;2391:10;2388:18;2385:46;2382:72;;;2434:18;;:::i;:::-;2470:2;2463:22;2520:18;;;2554:15;;;;-1:-1:-1;2596:11:1;;;2592:20;;;2624:19;;;2621:39;;;2656:1;2653;2646:12;2621:39;2680:11;;;;2700:148;2716:6;2711:3;2708:15;2700:148;;;2782:23;2801:3;2782:23;:::i;:::-;2770:36;;2733:12;;;;2826;;;;2700:148;;;2867:6;-1:-1:-1;2892:35:1;;-1:-1:-1;2908:18:1;;;2892:35;:::i;:::-;2882:45;;;;;;1742:1191;;;;;:::o;2938:247::-;2997:6;3050:2;3038:9;3029:7;3025:23;3021:32;3018:52;;;3066:1;3063;3056:12;3018:52;3105:9;3092:23;3124:31;3149:5;3124:31;:::i;3372:456::-;3449:6;3457;3465;3518:2;3506:9;3497:7;3493:23;3489:32;3486:52;;;3534:1;3531;3524:12;3486:52;3573:9;3560:23;3592:31;3617:5;3592:31;:::i;:::-;3642:5;-1:-1:-1;3699:2:1;3684:18;;3671:32;3712:33;3671:32;3712:33;:::i;:::-;3372:456;;3764:7;;-1:-1:-1;;;3818:2:1;3803:18;;;;3790:32;;3372:456::o;3833:180::-;3892:6;3945:2;3933:9;3924:7;3920:23;3916:32;3913:52;;;3961:1;3958;3951:12;3913:52;-1:-1:-1;3984:23:1;;3833:180;-1:-1:-1;3833:180:1:o;4415:248::-;4483:6;4491;4544:2;4532:9;4523:7;4519:23;4515:32;4512:52;;;4560:1;4557;4550:12;4512:52;-1:-1:-1;;4583:23:1;;;4653:2;4638:18;;;4625:32;;-1:-1:-1;4415:248:1:o;4668:388::-;4736:6;4744;4797:2;4785:9;4776:7;4772:23;4768:32;4765:52;;;4813:1;4810;4803:12;4765:52;4852:9;4839:23;4871:31;4896:5;4871:31;:::i;:::-;4921:5;-1:-1:-1;4978:2:1;4963:18;;4950:32;4991:33;4950:32;4991:33;:::i;:::-;5043:7;5033:17;;;4668:388;;;;;:::o;5061:241::-;5117:6;5170:2;5158:9;5149:7;5145:23;5141:32;5138:52;;;5186:1;5183;5176:12;5138:52;5225:9;5212:23;5244:28;5266:5;5244:28;:::i;5307:380::-;5386:1;5382:12;;;;5429;;;5450:61;;5504:4;5496:6;5492:17;5482:27;;5450:61;5557:2;5549:6;5546:14;5526:18;5523:38;5520:161;;5603:10;5598:3;5594:20;5591:1;5584:31;5638:4;5635:1;5628:15;5666:4;5663:1;5656:15;5520:161;;5307:380;;;:::o;5692:127::-;5753:10;5748:3;5744:20;5741:1;5734:31;5784:4;5781:1;5774:15;5808:4;5805:1;5798:15;5824:127;5885:10;5880:3;5876:20;5873:1;5866:31;5916:4;5913:1;5906:15;5940:4;5937:1;5930:15;5956:135;5995:3;6016:17;;;6013:43;;6036:18;;:::i;:::-;-1:-1:-1;6083:1:1;6072:13;;5956:135::o;7450:125::-;7515:9;;;7536:10;;;7533:36;;;7549:18;;:::i;9894:184::-;9964:6;10017:2;10005:9;9996:7;9992:23;9988:32;9985:52;;;10033:1;10030;10023:12;9985:52;-1:-1:-1;10056:16:1;;9894:184;-1:-1:-1;9894:184:1:o;10699:245::-;10766:6;10819:2;10807:9;10798:7;10794:23;10790:32;10787:52;;;10835:1;10832;10825:12;10787:52;10867:9;10861:16;10886:28;10908:5;10886:28;:::i;14089:401::-;14291:2;14273:21;;;14330:2;14310:18;;;14303:30;14369:34;14364:2;14349:18;;14342:62;-1:-1:-1;;;14435:2:1;14420:18;;14413:35;14480:3;14465:19;;14089:401::o;14495:399::-;14697:2;14679:21;;;14736:2;14716:18;;;14709:30;14775:34;14770:2;14755:18;;14748:62;-1:-1:-1;;;14841:2:1;14826:18;;14819:33;14884:3;14869:19;;14495:399::o;17223:168::-;17296:9;;;17327;;17344:15;;;17338:22;;17324:37;17314:71;;17365:18;;:::i;17396:217::-;17436:1;17462;17452:132;;17506:10;17501:3;17497:20;17494:1;17487:31;17541:4;17538:1;17531:15;17569:4;17566:1;17559:15;17452:132;-1:-1:-1;17598:9:1;;17396:217::o;17618:251::-;17688:6;17741:2;17729:9;17720:7;17716:23;17712:32;17709:52;;;17757:1;17754;17747:12;17709:52;17789:9;17783:16;17808:31;17833:5;17808:31;:::i;17874:980::-;18136:4;18184:3;18173:9;18169:19;18215:6;18204:9;18197:25;18241:2;18279:6;18274:2;18263:9;18259:18;18252:34;18322:3;18317:2;18306:9;18302:18;18295:31;18346:6;18381;18375:13;18412:6;18404;18397:22;18450:3;18439:9;18435:19;18428:26;;18489:2;18481:6;18477:15;18463:29;;18510:1;18520:195;18534:6;18531:1;18528:13;18520:195;;;18599:13;;-1:-1:-1;;;;;18595:39:1;18583:52;;18690:15;;;;18655:12;;;;18631:1;18549:9;18520:195;;;-1:-1:-1;;;;;;;18771:32:1;;;;18766:2;18751:18;;18744:60;-1:-1:-1;;;18835:3:1;18820:19;18813:35;18732:3;17874:980;-1:-1:-1;;;17874:980:1:o;18859:128::-;18926:9;;;18947:11;;;18944:37;;;18961:18;;:::i;19612:306::-;19700:6;19708;19716;19769:2;19757:9;19748:7;19744:23;19740:32;19737:52;;;19785:1;19782;19775:12;19737:52;19814:9;19808:16;19798:26;;19864:2;19853:9;19849:18;19843:25;19833:35;;19908:2;19897:9;19893:18;19887:25;19877:35;;19612:306;;;;;:::o
Swarm Source
ipfs://5a3f19164a56f3e29f7c911ed136d5d68892efb7a48fa52ad570e9705044fe88
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.