ERC-20
Overview
Max Total Supply
1,000,000,000,000,000 Wallphy
Holders
503
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
558,747,014,791,699.661185421137620725 WallphyValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Wallphy
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-17 */ pragma solidity 0.7.6; // SPDX-License-Identifier: Unlicensed pragma experimental ABIEncoderV2; interface IERC20 { function decimals() external view returns (uint8); 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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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 Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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. */ contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { //internal address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function geUnlockTime() public view returns (uint256) { return _lockTime; } //Locks the contract for owner for the amount of time provided function lock(uint256 time) public virtual onlyOwner { _previousOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); } //Unlocks the contract for owner when _lockTime is exceeds function unlock() public virtual { require( _previousOwner == msg.sender, "You don't have permission to unlock" ); require(block.timestamp > _lockTime, "Contract is locked until 7 days"); emit OwnershipTransferred(_owner, _previousOwner); _owner = _previousOwner; } } // pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } /// @title Wallphy Token Contract contract Wallphy is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFee; uint256 private _tTotal = 1000000000000000 * 10**18; string private _name = "Wallphy"; string private _symbol = "Wallphy"; uint8 private _decimals = 18; uint256 public _taxFee = 12; uint256 public _liquidityFee = 3; uint256 public _additionalTax = 10; /// @notice Above this amount, the additionalTax will be charged on transfers uint256 public _additionalTaxThreshold = _tTotal.mul(25).div(10000); address public devFeeWallet = 0x67a76c888fA3576984142227D2ea31091739853F; mapping(address => bool) private transferBlacklist; /// @notice Token transfers associated with trades on a DEX (Uniswap) are taxed bool public taxOnlyDex = true; uint256 public _maxTxAmount = _tTotal.mul(1).div(100); uint256 public taxYetToBeSentToDev; uint256 private minimumDevTaxDistributionThreshold = 0; uint256 public taxYetToBeLiquified; uint256 private numTokensSellToAddToLiquidity = 0; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool private inSwapAndSendDev; bool public swapAndSendDevEnabled = true; bool public isAirdropCompleted = false; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndSendDevEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier lockSendDev() { inSwapAndSendDev = true; _; inSwapAndSendDev = false; } constructor() { //manually set owner balance so owner can provide liquidity before conducting the airdrop. Value is calculated prior to deployment and is the amount of tokens after subtracting airdrop allocations _tOwned[msg.sender] = 211032861142177000000000000000000; _tOwned[address(this)]=_tTotal.sub(_tOwned[msg.sender]); setRouterAddress(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Uniswap V2 router _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; } /// @notice Returns the token's name function name() public view returns (string memory) { return _name; } /// @notice Returns the token's symbol function symbol() public view returns (string memory) { return _symbol; } /// @notice Returns the token's decimal precision function decimals() public view override returns (uint8) { return _decimals; } /// @notice Returns the token's total supply function totalSupply() public view override returns (uint256) { return _tTotal; } /// @notice Returns the token balance of an address /// @param account address to query function balanceOf(address account) public view override returns (uint256) { return _tOwned[account]; } /// @notice Transfers tokens while implementing customized tax logic /// @param _to Recipient address /// @param _value amount of tokens to transfer function transfer(address _to, uint256 _value) public override returns (bool) { require(_value > 0, "Value Too Low"); require(transferBlacklist[msg.sender] == false, "Sender Blacklisted"); require(transferBlacklist[_to] == false, "Recipient Blacklisted"); require(_tOwned[msg.sender] >= _value, "Balance Too Low"); if ( _isExcludedFromFee[msg.sender] == true || _isExcludedFromFee[_to] == true ) { _tOwned[msg.sender] = _tOwned[msg.sender].sub(_value); _tOwned[_to] = _tOwned[_to].add(_value); emit Transfer(msg.sender, _to, _value); } else if ( taxOnlyDex == true && (_msgSender() == uniswapV2Pair || _to == uniswapV2Pair) ) { //Taxes direct transfers to/from LP pair _transfer(_msgSender(), _to, _value); } else { //transfers between regular wallets are not taxed _tOwned[msg.sender] = _tOwned[msg.sender].sub(_value); _tOwned[_to] = _tOwned[_to].add(_value); emit Transfer(msg.sender, _to, _value); } return true; } /// @notice Checks how many tokens an address can transfer on behalf of another address /// @param owner address that owns the tokens /// @param spender address that is allowed to transfer tokens on behalf of owner function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /// @notice Sets the amount of tokens an address can transfer on behalf of another address /// @param _spender address that is allowed to transfer tokens on behalf of the function caller /// @param _value amount of tokens that _spender is allowed to transfer function approve(address _spender, uint256 _value) public override returns (bool) { _approve(_msgSender(), _spender, _value); return true; } /// @notice Allows caller to transfer tokens on behalf of an address /// @param _from Address that sends the tokens /// @param _to Address that receives the tokens /// @param _value amount of tokens to transfer function transferFrom( address _from, address _to, uint256 _value ) public override returns (bool) { require(_value > 0, "Value Too Low"); require(transferBlacklist[_from] == false, "Sender Blacklisted"); require(transferBlacklist[_to] == false, "Recipient Blacklisted"); require(_value <= _tOwned[_from], "Balance Too Low"); require(_value <= _allowances[_from][msg.sender], "Approval Too Low"); if ( _isExcludedFromFee[_from] == true || _isExcludedFromFee[_to] == true ) { _tOwned[_from] = _tOwned[_from].sub(_value); _tOwned[_to] = _tOwned[_to].add(_value); _allowances[_from][msg.sender] = _allowances[_from][msg.sender].sub( _value ); emit Transfer(_from, _to, _value); } else { _transfer(_from, _to, _value); _approve( _from, _msgSender(), _allowances[_from][_msgSender()].sub( _value, "ERC20: transfer amount exceeds allowance" ) ); } return true; } /// @notice Conducts airdrop to an array of users /// @param supportersAddresses Array of users /// @param supportersAmounts Airdrop amount corresponding to each user function conductAirdrop(address[] memory supportersAddresses, uint256[] memory supportersAmounts) public onlyOwner{ require(isAirdropCompleted==false, "Airdrop Already Finished"); isAirdropCompleted=true; for (uint8 i = 0; i < supportersAddresses.length; i++) { _tOwned[address(this)]=_tOwned[address(this)].sub(supportersAmounts[i]); _tOwned[supportersAddresses[i]] = _tOwned[supportersAddresses[i]].add(supportersAmounts[i]); emit Transfer(address(this), supportersAddresses[i], supportersAmounts[i]); } } /// @notice This function is used in case you want to migrate liquidity to another DEX, which is why using Uniswap V2 is ideal, b/c most other Dexes are forks of V2 /// @param newRouter DEX router address function setRouterAddress(address newRouter) public onlyOwner { IUniswapV2Router02 _newPancakeRouter = IUniswapV2Router02(newRouter); uniswapV2Pair = IUniswapV2Factory(_newPancakeRouter.factory()) .createPair(address(this), _newPancakeRouter.WETH()); uniswapV2Router = _newPancakeRouter; } /// @notice Exclude an address from being charged a tax on token transfer /// @param account Address to exclude function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } /// @notice Include an address to be charged a tax on token transfer /// @param account Address to include function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } /// @notice Blacklist/unblacklist an address from being able to send and receive tokens /// @param account Account to modify setting for /// @param yesOrNo Blacklist or unblacklist function setBlacklist(address account, bool yesOrNo) public onlyOwner { transferBlacklist[account] = yesOrNo; } /// @notice Set the tax rate for the Dev tax, which is sent to the Dev Wallet function setTaxFeePercent(uint256 taxFee) external onlyOwner { require (taxFee + _liquidityFee + _additionalTax <=25, "25 is Max Tax Threshold"); _taxFee = taxFee; } /// @notice Set the tax rate for the liquidity tax, which is used to provide liquidity for the token function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner { require (_taxFee + liquidityFee + _additionalTax <=25, "25 is Max Tax Threshold"); _liquidityFee = liquidityFee; } /// @notice Set the tax rate for the additional tax, which is charged when the token transfer amount is above a certain threshold function setAdditionalTax(uint256 additionalTax) external onlyOwner { require (_taxFee + _liquidityFee + additionalTax <=25, "25 is Max Tax Threshold"); _additionalTax = additionalTax; } /// @notice Set the token amount, above which the _additionalTax will be charged on transfers function setAdditionalTaxThreshold(uint256 additionalTaxThreshold) external onlyOwner { _additionalTaxThreshold = additionalTaxThreshold; } /// @notice Set the max transaction amount, in basis points relative to the total supply, above which token transfers will be rejected function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner { uint newMaxTxAmount = _tTotal.mul(maxTxPercent).div(10000); require(newMaxTxAmount > _tTotal.mul(5).div(10000), "MaxTxAmount Tow Low"); _maxTxAmount = newMaxTxAmount; } /// @notice Enable or disable the process of providing liquidity with the tokens collected by the liquidity tax function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } /// @notice Enable or disable the process of converting the tokens collected by the Dev tax and sending it to the Dev wallet function setSwapAndSendDevEnabled(bool _enabled) public onlyOwner { swapAndSendDevEnabled = _enabled; emit SwapAndSendDevEnabledUpdated(_enabled); } /// @notice To receive ETH from uniswapV2Router when swapping receive() external payable {} /// @notice Calculates tax values /// @param tAmount Amount to transfer before taxes /// @param from address to transfer from /// @return tTransferAmount total token amount to transfer after subtracting the tax fees /// @return tFee total amount that goes towards the Devs /// @return tLiquidity total ammount that goes towards providing liquidity function _getTValues(uint256 tAmount, address from) private view returns ( uint256, uint256, uint256 ) { uint256 tFee = calculateTaxFee(tAmount, from); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } /// @notice Calculates Dev tax amount /// @param _amount Amount to transfer before taxes /// @param _from address to transfer from function calculateTaxFee(uint256 _amount, address _from) private view returns (uint256) { if (_amount > _additionalTaxThreshold && _from != uniswapV2Pair) { // additional tax on SELL orders if amount is > threshold uint256 higherTax = _taxFee.add(_additionalTax); return _amount.mul(higherTax).div(10**2); } else { return _amount.mul(_taxFee).div(10**2); } } /// @notice Calculates liquidity tax amount /// @param _amount Amount to transfer before taxes function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFee).div(10**2); } /// @notice Checks if an address is excluded from being taxed on token transfers /// @param account Account to check function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } /// @notice Sets the amount of tokens an address can transfer on behalf of another address /// @param owner address that owns the tokens /// @param spender address that is allowed to transfer tokens on behalf of owner /// @param amount amount of tokens that spender is allowed to transfer function _approve( address owner, address spender, uint256 amount ) private { 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); } /// @notice Internal token transfer logic that takes care of calculating and collecting taxes /// @param from address that is sending the tokens /// @param to address that is receiving the tokens /// @param amount amount of tokens that is being sent function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if (from != owner() && to != owner()) require( amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount." ); ( uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getTValues(amount, from); //add the liquidity fee into the balance of this contract address, b/c will need to use to swap later _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); taxYetToBeLiquified = taxYetToBeLiquified.add(tLiquidity); if (taxYetToBeLiquified >= numTokensSellToAddToLiquidity) { // only liquify if above a certain threshold // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is uniswap pair. if ( !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled ) { //add liquidity swapAndLiquify(taxYetToBeLiquified); taxYetToBeLiquified = 0; } } //add the dev fee into the balance of this contract address, b/c will need to use to swap later _tOwned[address(this)] = _tOwned[address(this)].add(tFee); taxYetToBeSentToDev = taxYetToBeSentToDev.add(tFee); if ( taxYetToBeSentToDev >= minimumDevTaxDistributionThreshold ) { if ( !inSwapAndSendDev && from != uniswapV2Pair && swapAndSendDevEnabled ) { //convert to ETH and send to Dev swapAndSendToDev(taxYetToBeSentToDev); taxYetToBeSentToDev = 0; } } _tOwned[from] = _tOwned[from].sub(amount); _tOwned[to] = _tOwned[to].add(tTransferAmount); emit Transfer(from, to, tTransferAmount); } /// @notice Converts tokens into ETH and sends to Dev wallet /// @param tokenAmount amount of tokens to convert to ETH function swapAndSendToDev(uint256 tokenAmount) private lockSendDev { uint256 initialBalance = address(this).balance; swapTokensForEth(tokenAmount); uint256 newBalance = address(this).balance.sub(initialBalance); bool sent = payable(devFeeWallet).send(newBalance); require(sent, "ETH transfer failed"); } /// @notice Uses tokens to provide liquidty by first selling half to obtain ETH /// @param _numTokensSellToAddToLiquidity amount of tokens to use to provide liquidity function swapAndLiquify(uint256 _numTokensSellToAddToLiquidity) private lockTheSwap { // split the contract balance into halves uint256 half = _numTokensSellToAddToLiquidity.div(2); uint256 otherHalf = _numTokensSellToAddToLiquidity.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } /// @notice Converts tokens to ETH via the DEX router /// @param tokenAmount amount of tokens to convert into ETH function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } /// @notice Add liquidity for the token via the DEX router /// @param tokenAmount amount of tokens to use to provide liquidity /// @param ethAmount amount of tokens to use to provide liquidity function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } /// @notice Sets the address that the Dev tax is sent to function setDevWallet(address _devWallet) external onlyOwner { devFeeWallet = _devWallet; } /// @notice Sets whether token transfers associated with trades on a DEX (Uniswap) are taxed function setTaxOnlyDex(bool _taxOnlyDex) external onlyOwner { taxOnlyDex = _taxOnlyDex; } }
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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndSendDevEnabledUpdated","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"},{"inputs":[],"name":"_additionalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_additionalTaxThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","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":"_value","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":"supportersAddresses","type":"address[]"},{"internalType":"uint256[]","name":"supportersAmounts","type":"uint256[]"}],"name":"conductAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAirdropCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"additionalTax","type":"uint256"}],"name":"setAdditionalTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"additionalTaxThreshold","type":"uint256"}],"name":"setAdditionalTaxThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"yesOrNo","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndSendDevEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_taxOnlyDex","type":"bool"}],"name":"setTaxOnlyDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndSendDevEnabled","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":"taxOnlyDex","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxYetToBeLiquified","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxYetToBeSentToDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","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":"_value","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6d314dc6448d9338c15b0a0000000060065560c0604052600760808190526657616c6c70687960c81b60a09081526200003a919081620005c2565b506040805180820190915260078082526657616c6c70687960c81b60209092019182526200006b91600891620005c2565b5060098054601260ff19909116179055600c600a8181556003600b559055600654620000c29061271090620000ae90601962000280602090811b6200195917901c565b620002d260201b6200199a1790919060201c565b600d55600e80547367a76c888fa3576984142227d2ea31091739853f6001600160a01b03199091161790556010805460ff191660019081179091556006546200011f91606491620000ae9162000280602090811b6200195917901c565b601155600060138190556015556017805460ff60c01b1960ff60b81b1960ff60a81b19909216600160a81b1791909116600160b81b171690553480156200016557600080fd5b506000620001726200031c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3503360009081526003602090815260409091206d0a679bf35931013410de75e4000090819055600654620001fb92909190620019dc62000320821b17901c565b306000908152600360205260409020556200022a737a250d5630b4cf539739df2c5dacb4c659f2488d6200036a565b6001600560006200023a62000549565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260059092529020805490911660011790556200077d565b6000826200029157506000620002cc565b828202828482816200029f57fe5b0414620002c95760405162461bcd60e51b8152600401620002c09062000707565b60405180910390fd5b90505b92915050565b6000620002c983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200055860201b60201c565b3390565b6000620002c983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200059360201b60201c565b620003746200031c565b6000546001600160a01b03908116911614620003a45760405162461bcd60e51b8152600401620002c09062000748565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e357600080fd5b505afa158015620003f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041e91906200066e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046757600080fd5b505afa1580156200047c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a291906200066e565b6040518363ffffffff1660e01b8152600401620004c192919062000697565b602060405180830381600087803b158015620004dc57600080fd5b505af1158015620004f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200051791906200066e565b601780546001600160a01b039283166001600160a01b0319918216179091556016805493909216921691909117905550565b6000546001600160a01b031690565b600081836200057c5760405162461bcd60e51b8152600401620002c09190620006b1565b5060008385816200058957fe5b0495945050505050565b60008184841115620005ba5760405162461bcd60e51b8152600401620002c09190620006b1565b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005fa576000855562000645565b82601f106200061557805160ff191683800117855562000645565b8280016001018555821562000645579182015b828111156200064557825182559160200191906001019062000628565b506200065392915062000657565b5090565b5b8082111562000653576000815560010162000658565b60006020828403121562000680578081fd5b81516001600160a01b0381168114620002c9578182fd5b6001600160a01b0392831681529116602082015260400190565b6000602080835283518082850152825b81811015620006df57858101830151858201604001528201620006c1565b81811115620006f15783604083870101525b50601f01601f1916929092016040019392505050565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b612bdb806200078d6000396000f3fe60806040526004361061026b5760003560e01c806374c6500911610144578063bc56f008116100b6578063d543dbeb1161007a578063d543dbeb1461069c578063d9a69361146106bc578063dd467064146106d1578063dd62ed3e146106f1578063ea2f0b3714610711578063f2fde38b1461073157610272565b8063bc56f0081461061d578063bcebc63914610632578063bf37138614610647578063c24bd80114610667578063c49b9a801461067c57610272565b80638ee88c53116101085780638ee88c531461057e57806395d89b411461059e578063a69df4b5146105b3578063a9059cbb146105c8578063b0b37e9a146105e8578063b6c523241461060857610272565b806374c650091461050a5780637d1db4a51461052a57806383d7bc141461053f5780638da5cb5b146105545780638dfc5d371461056957610272565b80633619b6c0116101dd5780634a74bb02116101a15780634a74bb021461046b5780635342acb41461048057806366e6655c146104a05780636bc87c3a146104c057806370a08231146104d5578063715018a6146104f557610272565b80633619b6c0146103e15780633b124fe71461040157806341cb87fc14610416578063437823ec1461043657806349bd5a5e1461045657610272565b8063153b0d1e1161022f578063153b0d1e146103355780631694505e1461035557806318160ddd1461036a5780631f53ac021461037f57806323b872dd1461039f578063313ce567146103bf57610272565b8063061c82d01461027757806306fdde03146102995780630838ccd7146102c4578063084af052146102e6578063095ea7b31461030857610272565b3661027257005b600080fd5b34801561028357600080fd5b50610297610292366004612491565b610751565b005b3480156102a557600080fd5b506102ae6107bd565b6040516102bb919061254a565b60405180910390f35b3480156102d057600080fd5b506102d9610853565b6040516102bb9190612a46565b3480156102f257600080fd5b506102fb610859565b6040516102bb91906124d6565b34801561031457600080fd5b5061032861032336600461238c565b610868565b6040516102bb919061253f565b34801561034157600080fd5b50610297610350366004612358565b610886565b34801561036157600080fd5b506102fb6108e6565b34801561037657600080fd5b506102d96108f5565b34801561038b57600080fd5b5061029761039a3660046122a8565b6108fb565b3480156103ab57600080fd5b506103286103ba366004612318565b610952565b3480156103cb57600080fd5b506103d4610c1c565b6040516102bb9190612ad5565b3480156103ed57600080fd5b506102976103fc366004612491565b610c25565b34801561040d57600080fd5b506102d9610c5f565b34801561042257600080fd5b506102976104313660046122a8565b610c65565b34801561044257600080fd5b506102976104513660046122a8565b610e31565b34801561046257600080fd5b506102fb610e8a565b34801561047757600080fd5b50610328610e99565b34801561048c57600080fd5b5061032861049b3660046122a8565b610ea9565b3480156104ac57600080fd5b506102976104bb366004612477565b610ecb565b3480156104cc57600080fd5b506102d9610f52565b3480156104e157600080fd5b506102d96104f03660046122a8565b610f58565b34801561050157600080fd5b50610297610f73565b34801561051657600080fd5b506102976105253660046123b7565b610fe0565b34801561053657600080fd5b506102d96111be565b34801561054b57600080fd5b506102d96111c4565b34801561056057600080fd5b506102fb6111ca565b34801561057557600080fd5b506103286111d9565b34801561058a57600080fd5b50610297610599366004612491565b6111e2565b3480156105aa57600080fd5b506102ae611245565b3480156105bf57600080fd5b506102976112a6565b3480156105d457600080fd5b506103286105e336600461238c565b611340565b3480156105f457600080fd5b50610297610603366004612491565b6115c6565b34801561061457600080fd5b506102d9611629565b34801561062957600080fd5b5061032861162f565b34801561063e57600080fd5b506102d961163f565b34801561065357600080fd5b50610297610662366004612477565b611645565b34801561067357600080fd5b506102d961168d565b34801561068857600080fd5b50610297610697366004612477565b611693565b3480156106a857600080fd5b506102976106b7366004612491565b61170f565b3480156106c857600080fd5b506103286117a9565b3480156106dd57600080fd5b506102976106ec366004612491565b6117b9565b3480156106fd57600080fd5b506102d961070c3660046122e0565b611834565b34801561071d57600080fd5b5061029761072c3660046122a8565b61185f565b34801561073d57600080fd5b5061029761074c3660046122a8565b6118b5565b610759611a1e565b6000546001600160a01b0390811691161461078f5760405162461bcd60e51b8152600401610786906127e4565b60405180910390fd5b6019600c54600b5483010111156107b85760405162461bcd60e51b81526004016107869061276c565b600a55565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600d5481565b600e546001600160a01b031681565b600061087c610875611a1e565b8484611a22565b5060015b92915050565b61088e611a1e565b6000546001600160a01b039081169116146108bb5760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6016546001600160a01b031681565b60065490565b610903611a1e565b6000546001600160a01b039081169116146109305760405162461bcd60e51b8152600401610786906127e4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60008082116109735760405162461bcd60e51b815260040161078690612862565b6001600160a01b0384166000908152600f602052604090205460ff16156109ac5760405162461bcd60e51b81526004016107869061259d565b6001600160a01b0383166000908152600f602052604090205460ff16156109e55760405162461bcd60e51b81526004016107869061260c565b6001600160a01b038416600090815260036020526040902054821115610a1d5760405162461bcd60e51b815260040161078690612889565b6001600160a01b0384166000908152600460209081526040808320338452909152902054821115610a605760405162461bcd60e51b8152600401610786906126c3565b6001600160a01b03841660009081526005602052604090205460ff16151560011480610aa957506001600160a01b03831660009081526005602052604090205460ff1615156001145b15610b97576001600160a01b038416600090815260036020526040902054610ad190836119dc565b6001600160a01b038086166000908152600360205260408082209390935590851681522054610b009083611ad6565b6001600160a01b038085166000908152600360209081526040808320949094559187168152600482528281203382529091522054610b3e90836119dc565b6001600160a01b038086166000818152600460209081526040808320338452909152908190209390935591519085169190600080516020612b8683398151915290610b8a908690612a46565b60405180910390a3610c12565b610ba2848484611afb565b610c1284610bae611a1e565b610c0d85604051806060016040528060288152602001612b3e602891396001600160a01b038a16600090815260046020526040812090610bec611a1e565b6001600160a01b031681526020810191909152604001600020549190611db7565b611a22565b5060019392505050565b60095460ff1690565b610c2d611a1e565b6000546001600160a01b03908116911614610c5a5760405162461bcd60e51b8152600401610786906127e4565b600d55565b600a5481565b610c6d611a1e565b6000546001600160a01b03908116911614610c9a5760405162461bcd60e51b8152600401610786906127e4565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906122c4565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9091906122c4565b6040518363ffffffff1660e01b8152600401610dad9291906124ea565b602060405180830381600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906122c4565b601780546001600160a01b039283166001600160a01b0319918216179091556016805493909216921691909117905550565b610e39611a1e565b6000546001600160a01b03908116911614610e665760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6017546001600160a01b031681565b601754600160a81b900460ff1681565b6001600160a01b03811660009081526005602052604090205460ff165b919050565b610ed3611a1e565b6000546001600160a01b03908116911614610f005760405162461bcd60e51b8152600401610786906127e4565b6017805460ff60b81b1916600160b81b831515021790556040517fe964fb16f71af4ce07a08a917fce7f047f46fcfaa53673654c1030022fdb673a90610f4790839061253f565b60405180910390a150565b600b5481565b6001600160a01b031660009081526003602052604090205490565b610f7b611a1e565b6000546001600160a01b03908116911614610fa85760405162461bcd60e51b8152600401610786906127e4565b600080546040516001600160a01b0390911690600080516020612b66833981519152908390a3600080546001600160a01b0319169055565b610fe8611a1e565b6000546001600160a01b039081169116146110155760405162461bcd60e51b8152600401610786906127e4565b601754600160c01b900460ff161561103f5760405162461bcd60e51b81526004016107869061299f565b6017805460ff60c01b1916600160c01b17905560005b82518160ff1610156111b957611096828260ff168151811061107357fe5b6020908102919091018101513060009081526003909252604090912054906119dc565b30600090815260036020526040902055815161110d90839060ff84169081106110bb57fe5b602002602001015160036000868560ff16815181106110d657fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054611ad690919063ffffffff16565b60036000858460ff168151811061112057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061115b57fe5b60200260200101516001600160a01b0316306001600160a01b0316600080516020612b86833981519152848460ff168151811061119457fe5b60200260200101516040516111a99190612a46565b60405180910390a3600101611055565b505050565b60115481565b60145481565b6000546001600160a01b031690565b60105460ff1681565b6111ea611a1e565b6000546001600160a01b039081169116146112175760405162461bcd60e51b8152600401610786906127e4565b6019600c5482600a54010111156112405760405162461bcd60e51b81526004016107869061276c565b600b55565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108495780601f1061081e57610100808354040283529160200191610849565b6001546001600160a01b031633146112d05760405162461bcd60e51b8152600401610786906129d6565b60025442116112f15760405162461bcd60e51b815260040161078690612968565b600154600080546040516001600160a01b039384169390911691600080516020612b6683398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60008082116113615760405162461bcd60e51b815260040161078690612862565b336000908152600f602052604090205460ff16156113915760405162461bcd60e51b81526004016107869061259d565b6001600160a01b0383166000908152600f602052604090205460ff16156113ca5760405162461bcd60e51b81526004016107869061260c565b336000908152600360205260409020548211156113f95760405162461bcd60e51b815260040161078690612889565b3360009081526005602052604090205460ff1615156001148061143957506001600160a01b03831660009081526005602052604090205460ff1615156001145b156114ce573360009081526003602052604090205461145890836119dc565b33600090815260036020526040808220929092556001600160a01b038516815220546114849083611ad6565b6001600160a01b038416600081815260036020526040908190209290925590513390600080516020612b86833981519152906114c1908690612a46565b60405180910390a361087c565b60105460ff161515600114801561151657506017546001600160a01b03166114f4611a1e565b6001600160a01b0316148061151657506017546001600160a01b038481169116145b156115325761152d611526611a1e565b8484611afb565b61087c565b3360009081526003602052604090205461154c90836119dc565b33600090815260036020526040808220929092556001600160a01b038516815220546115789083611ad6565b6001600160a01b038416600081815260036020526040908190209290925590513390600080516020612b86833981519152906115b5908690612a46565b60405180910390a350600192915050565b6115ce611a1e565b6000546001600160a01b039081169116146115fb5760405162461bcd60e51b8152600401610786906127e4565b601981600b54600a54010111156116245760405162461bcd60e51b81526004016107869061276c565b600c55565b60025490565b601754600160b81b900460ff1681565b600c5481565b61164d611a1e565b6000546001600160a01b0390811691161461167a5760405162461bcd60e51b8152600401610786906127e4565b6010805460ff1916911515919091179055565b60125481565b61169b611a1e565b6000546001600160a01b039081169116146116c85760405162461bcd60e51b8152600401610786906127e4565b6017805460ff60a81b1916600160a81b831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610f4790839061253f565b611717611a1e565b6000546001600160a01b039081169116146117445760405162461bcd60e51b8152600401610786906127e4565b60006117676127106117618460065461195990919063ffffffff16565b9061199a565b9050611785612710611761600560065461195990919063ffffffff16565b81116117a35760405162461bcd60e51b815260040161078690612a19565b60115550565b601754600160c01b900460ff1681565b6117c1611a1e565b6000546001600160a01b039081169116146117ee5760405162461bcd60e51b8152600401610786906127e4565b60008054600180546001600160a01b03199081166001600160a01b038416179091551681554282016002556040518190600080516020612b66833981519152908290a350565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b611867611a1e565b6000546001600160a01b039081169116146118945760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6118bd611a1e565b6000546001600160a01b039081169116146118ea5760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b0381166119105760405162461bcd60e51b81526004016107869061263b565b600080546040516001600160a01b0380851693921691600080516020612b6683398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008261196857506000610880565b8282028284828161197557fe5b04146119935760405162461bcd60e51b8152600401610786906127a3565b9392505050565b600061199383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611de3565b600061199383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611db7565b3390565b6001600160a01b038316611a485760405162461bcd60e51b815260040161078690612924565b6001600160a01b038216611a6e5760405162461bcd60e51b815260040161078690612681565b6001600160a01b0380841660008181526004602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611ac9908590612a46565b60405180910390a3505050565b6000828201838110156119935760405162461bcd60e51b8152600401610786906126ed565b6001600160a01b038316611b215760405162461bcd60e51b8152600401610786906128b2565b6001600160a01b038216611b475760405162461bcd60e51b8152600401610786906125c9565b60008111611b675760405162461bcd60e51b815260040161078690612819565b611b6f6111ca565b6001600160a01b0316836001600160a01b031614158015611ba95750611b936111ca565b6001600160a01b0316826001600160a01b031614155b15611bd057601154811115611bd05760405162461bcd60e51b815260040161078690612724565b6000806000611bdf8487611e1a565b306000908152600360205260409020549295509093509150611c019082611ad6565b30600090815260036020526040902055601454611c1e9082611ad6565b601481905560155411611c7e57601754600160a01b900460ff16158015611c5357506017546001600160a01b03878116911614155b8015611c685750601754600160a81b900460ff165b15611c7e57611c78601454611e5e565b60006014555b30600090815260036020526040902054611c989083611ad6565b30600090815260036020526040902055601254611cb59083611ad6565b601281905560135411611d1557601754600160b01b900460ff16158015611cea57506017546001600160a01b03878116911614155b8015611cff5750601754600160b81b900460ff165b15611d1557611d0f601254611eff565b60006012555b6001600160a01b038616600090815260036020526040902054611d3890856119dc565b6001600160a01b038088166000908152600360205260408082209390935590871681522054611d679084611ad6565b6001600160a01b038087166000818152600360205260409081902093909355915190881690600080516020612b8683398151915290611da7908790612a46565b60405180910390a3505050505050565b60008184841115611ddb5760405162461bcd60e51b8152600401610786919061254a565b505050900390565b60008183611e045760405162461bcd60e51b8152600401610786919061254a565b506000838581611e1057fe5b0495945050505050565b600080600080611e2a8686611f88565b90506000611e3787612001565b90506000611e4f82611e498a866119dc565b906119dc565b95509193509150509250925092565b6017805460ff60a01b1916600160a01b1790556000611e7e82600261199a565b90506000611e8c83836119dc565b905047611e988361201d565b6000611ea447836119dc565b9050611eb0838261217a565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051611ee393929190612abf565b60405180910390a150506017805460ff60a01b19169055505050565b6017805460ff60b01b1916600160b01b17905547611f1c8261201d565b6000611f2847836119dc565b600e546040519192506000916001600160a01b039091169083156108fc0290849084818181858888f19350505050905080611f755760405162461bcd60e51b8152600401610786906128f7565b50506017805460ff60b01b191690555050565b6000600d5483118015611fa957506017546001600160a01b03838116911614155b15611fe0576000611fc7600c54600a54611ad690919063ffffffff16565b9050611fd860646117618684611959565b915050610880565b611ffa6064611761600a548661195990919063ffffffff16565b9050610880565b60006108806064611761600b548561195990919063ffffffff16565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061204c57fe5b6001600160a01b03928316602091820292909201810191909152601654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d891906122c4565b816001815181106120e557fe5b6001600160a01b03928316602091820292909201015260165461210b9130911684611a22565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac94790612144908590600090869030904290600401612a4f565b600060405180830381600087803b15801561215e57600080fd5b505af1158015612172573d6000803e3d6000fd5b505050505050565b6016546121929030906001600160a01b031684611a22565b6016546001600160a01b031663f305d7198230856000806121b16111ca565b426040518863ffffffff1660e01b81526004016121d396959493929190612504565b6060604051808303818588803b1580156121ec57600080fd5b505af1158015612200573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061222591906124a9565b5050505050565b600082601f83011261223c578081fd5b8135602061225161224c83612b07565b612ae3565b828152818101908583018385028701840188101561226d578586fd5b855b8581101561228b5781358452928401929084019060010161226f565b5090979650505050505050565b80358015158114610ec657600080fd5b6000602082840312156122b9578081fd5b813561199381612b25565b6000602082840312156122d5578081fd5b815161199381612b25565b600080604083850312156122f2578081fd5b82356122fd81612b25565b9150602083013561230d81612b25565b809150509250929050565b60008060006060848603121561232c578081fd5b833561233781612b25565b9250602084013561234781612b25565b929592945050506040919091013590565b6000806040838503121561236a578182fd5b823561237581612b25565b915061238360208401612298565b90509250929050565b6000806040838503121561239e578182fd5b82356123a981612b25565b946020939093013593505050565b600080604083850312156123c9578182fd5b823567ffffffffffffffff808211156123e0578384fd5b818501915085601f8301126123f3578384fd5b8135602061240361224c83612b07565b82815281810190858301838502870184018b101561241f578889fd5b8896505b8487101561244a57803561243681612b25565b835260019690960195918301918301612423565b5096505086013592505080821115612460578283fd5b5061246d8582860161222c565b9150509250929050565b600060208284031215612488578081fd5b61199382612298565b6000602082840312156124a2578081fd5b5035919050565b6000806000606084860312156124bd578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b818110156125765785810183015185820160400152820161255a565b818111156125875783604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527114d95b99195c88109b1858dadb1a5cdd195960721b604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260159082015274149958da5c1a595b9d08109b1858dadb1a5cdd1959605a1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526010908201526f417070726f76616c20546f6f204c6f7760801b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526017908201527f3235206973204d617820546178205468726573686f6c64000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252600d908201526c56616c756520546f6f204c6f7760981b604082015260600190565b6020808252600f908201526e42616c616e636520546f6f204c6f7760881b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601f908201527f436f6e7472616374206973206c6f636b656420756e74696c2037206461797300604082015260600190565b60208082526018908201527f41697264726f7020416c72656164792046696e69736865640000000000000000604082015260600190565b60208082526023908201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6040820152626f636b60e81b606082015260800190565b6020808252601390820152724d61785478416d6f756e7420546f77204c6f7760681b604082015260600190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612a9e5784516001600160a01b031683529383019391830191600101612a79565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612aff57fe5b604052919050565b600067ffffffffffffffff821115612b1b57fe5b5060209081020190565b6001600160a01b0381168114612b3a57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d533f5eac9603a97de94f90fba3b74348752946b7084640fc0c353cf53ae04964736f6c63430007060033
Deployed Bytecode
0x60806040526004361061026b5760003560e01c806374c6500911610144578063bc56f008116100b6578063d543dbeb1161007a578063d543dbeb1461069c578063d9a69361146106bc578063dd467064146106d1578063dd62ed3e146106f1578063ea2f0b3714610711578063f2fde38b1461073157610272565b8063bc56f0081461061d578063bcebc63914610632578063bf37138614610647578063c24bd80114610667578063c49b9a801461067c57610272565b80638ee88c53116101085780638ee88c531461057e57806395d89b411461059e578063a69df4b5146105b3578063a9059cbb146105c8578063b0b37e9a146105e8578063b6c523241461060857610272565b806374c650091461050a5780637d1db4a51461052a57806383d7bc141461053f5780638da5cb5b146105545780638dfc5d371461056957610272565b80633619b6c0116101dd5780634a74bb02116101a15780634a74bb021461046b5780635342acb41461048057806366e6655c146104a05780636bc87c3a146104c057806370a08231146104d5578063715018a6146104f557610272565b80633619b6c0146103e15780633b124fe71461040157806341cb87fc14610416578063437823ec1461043657806349bd5a5e1461045657610272565b8063153b0d1e1161022f578063153b0d1e146103355780631694505e1461035557806318160ddd1461036a5780631f53ac021461037f57806323b872dd1461039f578063313ce567146103bf57610272565b8063061c82d01461027757806306fdde03146102995780630838ccd7146102c4578063084af052146102e6578063095ea7b31461030857610272565b3661027257005b600080fd5b34801561028357600080fd5b50610297610292366004612491565b610751565b005b3480156102a557600080fd5b506102ae6107bd565b6040516102bb919061254a565b60405180910390f35b3480156102d057600080fd5b506102d9610853565b6040516102bb9190612a46565b3480156102f257600080fd5b506102fb610859565b6040516102bb91906124d6565b34801561031457600080fd5b5061032861032336600461238c565b610868565b6040516102bb919061253f565b34801561034157600080fd5b50610297610350366004612358565b610886565b34801561036157600080fd5b506102fb6108e6565b34801561037657600080fd5b506102d96108f5565b34801561038b57600080fd5b5061029761039a3660046122a8565b6108fb565b3480156103ab57600080fd5b506103286103ba366004612318565b610952565b3480156103cb57600080fd5b506103d4610c1c565b6040516102bb9190612ad5565b3480156103ed57600080fd5b506102976103fc366004612491565b610c25565b34801561040d57600080fd5b506102d9610c5f565b34801561042257600080fd5b506102976104313660046122a8565b610c65565b34801561044257600080fd5b506102976104513660046122a8565b610e31565b34801561046257600080fd5b506102fb610e8a565b34801561047757600080fd5b50610328610e99565b34801561048c57600080fd5b5061032861049b3660046122a8565b610ea9565b3480156104ac57600080fd5b506102976104bb366004612477565b610ecb565b3480156104cc57600080fd5b506102d9610f52565b3480156104e157600080fd5b506102d96104f03660046122a8565b610f58565b34801561050157600080fd5b50610297610f73565b34801561051657600080fd5b506102976105253660046123b7565b610fe0565b34801561053657600080fd5b506102d96111be565b34801561054b57600080fd5b506102d96111c4565b34801561056057600080fd5b506102fb6111ca565b34801561057557600080fd5b506103286111d9565b34801561058a57600080fd5b50610297610599366004612491565b6111e2565b3480156105aa57600080fd5b506102ae611245565b3480156105bf57600080fd5b506102976112a6565b3480156105d457600080fd5b506103286105e336600461238c565b611340565b3480156105f457600080fd5b50610297610603366004612491565b6115c6565b34801561061457600080fd5b506102d9611629565b34801561062957600080fd5b5061032861162f565b34801561063e57600080fd5b506102d961163f565b34801561065357600080fd5b50610297610662366004612477565b611645565b34801561067357600080fd5b506102d961168d565b34801561068857600080fd5b50610297610697366004612477565b611693565b3480156106a857600080fd5b506102976106b7366004612491565b61170f565b3480156106c857600080fd5b506103286117a9565b3480156106dd57600080fd5b506102976106ec366004612491565b6117b9565b3480156106fd57600080fd5b506102d961070c3660046122e0565b611834565b34801561071d57600080fd5b5061029761072c3660046122a8565b61185f565b34801561073d57600080fd5b5061029761074c3660046122a8565b6118b5565b610759611a1e565b6000546001600160a01b0390811691161461078f5760405162461bcd60e51b8152600401610786906127e4565b60405180910390fd5b6019600c54600b5483010111156107b85760405162461bcd60e51b81526004016107869061276c565b600a55565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600d5481565b600e546001600160a01b031681565b600061087c610875611a1e565b8484611a22565b5060015b92915050565b61088e611a1e565b6000546001600160a01b039081169116146108bb5760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6016546001600160a01b031681565b60065490565b610903611a1e565b6000546001600160a01b039081169116146109305760405162461bcd60e51b8152600401610786906127e4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60008082116109735760405162461bcd60e51b815260040161078690612862565b6001600160a01b0384166000908152600f602052604090205460ff16156109ac5760405162461bcd60e51b81526004016107869061259d565b6001600160a01b0383166000908152600f602052604090205460ff16156109e55760405162461bcd60e51b81526004016107869061260c565b6001600160a01b038416600090815260036020526040902054821115610a1d5760405162461bcd60e51b815260040161078690612889565b6001600160a01b0384166000908152600460209081526040808320338452909152902054821115610a605760405162461bcd60e51b8152600401610786906126c3565b6001600160a01b03841660009081526005602052604090205460ff16151560011480610aa957506001600160a01b03831660009081526005602052604090205460ff1615156001145b15610b97576001600160a01b038416600090815260036020526040902054610ad190836119dc565b6001600160a01b038086166000908152600360205260408082209390935590851681522054610b009083611ad6565b6001600160a01b038085166000908152600360209081526040808320949094559187168152600482528281203382529091522054610b3e90836119dc565b6001600160a01b038086166000818152600460209081526040808320338452909152908190209390935591519085169190600080516020612b8683398151915290610b8a908690612a46565b60405180910390a3610c12565b610ba2848484611afb565b610c1284610bae611a1e565b610c0d85604051806060016040528060288152602001612b3e602891396001600160a01b038a16600090815260046020526040812090610bec611a1e565b6001600160a01b031681526020810191909152604001600020549190611db7565b611a22565b5060019392505050565b60095460ff1690565b610c2d611a1e565b6000546001600160a01b03908116911614610c5a5760405162461bcd60e51b8152600401610786906127e4565b600d55565b600a5481565b610c6d611a1e565b6000546001600160a01b03908116911614610c9a5760405162461bcd60e51b8152600401610786906127e4565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906122c4565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5857600080fd5b505afa158015610d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9091906122c4565b6040518363ffffffff1660e01b8152600401610dad9291906124ea565b602060405180830381600087803b158015610dc757600080fd5b505af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906122c4565b601780546001600160a01b039283166001600160a01b0319918216179091556016805493909216921691909117905550565b610e39611a1e565b6000546001600160a01b03908116911614610e665760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03166000908152600560205260409020805460ff19166001179055565b6017546001600160a01b031681565b601754600160a81b900460ff1681565b6001600160a01b03811660009081526005602052604090205460ff165b919050565b610ed3611a1e565b6000546001600160a01b03908116911614610f005760405162461bcd60e51b8152600401610786906127e4565b6017805460ff60b81b1916600160b81b831515021790556040517fe964fb16f71af4ce07a08a917fce7f047f46fcfaa53673654c1030022fdb673a90610f4790839061253f565b60405180910390a150565b600b5481565b6001600160a01b031660009081526003602052604090205490565b610f7b611a1e565b6000546001600160a01b03908116911614610fa85760405162461bcd60e51b8152600401610786906127e4565b600080546040516001600160a01b0390911690600080516020612b66833981519152908390a3600080546001600160a01b0319169055565b610fe8611a1e565b6000546001600160a01b039081169116146110155760405162461bcd60e51b8152600401610786906127e4565b601754600160c01b900460ff161561103f5760405162461bcd60e51b81526004016107869061299f565b6017805460ff60c01b1916600160c01b17905560005b82518160ff1610156111b957611096828260ff168151811061107357fe5b6020908102919091018101513060009081526003909252604090912054906119dc565b30600090815260036020526040902055815161110d90839060ff84169081106110bb57fe5b602002602001015160036000868560ff16815181106110d657fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054611ad690919063ffffffff16565b60036000858460ff168151811061112057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061115b57fe5b60200260200101516001600160a01b0316306001600160a01b0316600080516020612b86833981519152848460ff168151811061119457fe5b60200260200101516040516111a99190612a46565b60405180910390a3600101611055565b505050565b60115481565b60145481565b6000546001600160a01b031690565b60105460ff1681565b6111ea611a1e565b6000546001600160a01b039081169116146112175760405162461bcd60e51b8152600401610786906127e4565b6019600c5482600a54010111156112405760405162461bcd60e51b81526004016107869061276c565b600b55565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108495780601f1061081e57610100808354040283529160200191610849565b6001546001600160a01b031633146112d05760405162461bcd60e51b8152600401610786906129d6565b60025442116112f15760405162461bcd60e51b815260040161078690612968565b600154600080546040516001600160a01b039384169390911691600080516020612b6683398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60008082116113615760405162461bcd60e51b815260040161078690612862565b336000908152600f602052604090205460ff16156113915760405162461bcd60e51b81526004016107869061259d565b6001600160a01b0383166000908152600f602052604090205460ff16156113ca5760405162461bcd60e51b81526004016107869061260c565b336000908152600360205260409020548211156113f95760405162461bcd60e51b815260040161078690612889565b3360009081526005602052604090205460ff1615156001148061143957506001600160a01b03831660009081526005602052604090205460ff1615156001145b156114ce573360009081526003602052604090205461145890836119dc565b33600090815260036020526040808220929092556001600160a01b038516815220546114849083611ad6565b6001600160a01b038416600081815260036020526040908190209290925590513390600080516020612b86833981519152906114c1908690612a46565b60405180910390a361087c565b60105460ff161515600114801561151657506017546001600160a01b03166114f4611a1e565b6001600160a01b0316148061151657506017546001600160a01b038481169116145b156115325761152d611526611a1e565b8484611afb565b61087c565b3360009081526003602052604090205461154c90836119dc565b33600090815260036020526040808220929092556001600160a01b038516815220546115789083611ad6565b6001600160a01b038416600081815260036020526040908190209290925590513390600080516020612b86833981519152906115b5908690612a46565b60405180910390a350600192915050565b6115ce611a1e565b6000546001600160a01b039081169116146115fb5760405162461bcd60e51b8152600401610786906127e4565b601981600b54600a54010111156116245760405162461bcd60e51b81526004016107869061276c565b600c55565b60025490565b601754600160b81b900460ff1681565b600c5481565b61164d611a1e565b6000546001600160a01b0390811691161461167a5760405162461bcd60e51b8152600401610786906127e4565b6010805460ff1916911515919091179055565b60125481565b61169b611a1e565b6000546001600160a01b039081169116146116c85760405162461bcd60e51b8152600401610786906127e4565b6017805460ff60a81b1916600160a81b831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610f4790839061253f565b611717611a1e565b6000546001600160a01b039081169116146117445760405162461bcd60e51b8152600401610786906127e4565b60006117676127106117618460065461195990919063ffffffff16565b9061199a565b9050611785612710611761600560065461195990919063ffffffff16565b81116117a35760405162461bcd60e51b815260040161078690612a19565b60115550565b601754600160c01b900460ff1681565b6117c1611a1e565b6000546001600160a01b039081169116146117ee5760405162461bcd60e51b8152600401610786906127e4565b60008054600180546001600160a01b03199081166001600160a01b038416179091551681554282016002556040518190600080516020612b66833981519152908290a350565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b611867611a1e565b6000546001600160a01b039081169116146118945760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6118bd611a1e565b6000546001600160a01b039081169116146118ea5760405162461bcd60e51b8152600401610786906127e4565b6001600160a01b0381166119105760405162461bcd60e51b81526004016107869061263b565b600080546040516001600160a01b0380851693921691600080516020612b6683398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008261196857506000610880565b8282028284828161197557fe5b04146119935760405162461bcd60e51b8152600401610786906127a3565b9392505050565b600061199383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611de3565b600061199383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611db7565b3390565b6001600160a01b038316611a485760405162461bcd60e51b815260040161078690612924565b6001600160a01b038216611a6e5760405162461bcd60e51b815260040161078690612681565b6001600160a01b0380841660008181526004602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611ac9908590612a46565b60405180910390a3505050565b6000828201838110156119935760405162461bcd60e51b8152600401610786906126ed565b6001600160a01b038316611b215760405162461bcd60e51b8152600401610786906128b2565b6001600160a01b038216611b475760405162461bcd60e51b8152600401610786906125c9565b60008111611b675760405162461bcd60e51b815260040161078690612819565b611b6f6111ca565b6001600160a01b0316836001600160a01b031614158015611ba95750611b936111ca565b6001600160a01b0316826001600160a01b031614155b15611bd057601154811115611bd05760405162461bcd60e51b815260040161078690612724565b6000806000611bdf8487611e1a565b306000908152600360205260409020549295509093509150611c019082611ad6565b30600090815260036020526040902055601454611c1e9082611ad6565b601481905560155411611c7e57601754600160a01b900460ff16158015611c5357506017546001600160a01b03878116911614155b8015611c685750601754600160a81b900460ff165b15611c7e57611c78601454611e5e565b60006014555b30600090815260036020526040902054611c989083611ad6565b30600090815260036020526040902055601254611cb59083611ad6565b601281905560135411611d1557601754600160b01b900460ff16158015611cea57506017546001600160a01b03878116911614155b8015611cff5750601754600160b81b900460ff165b15611d1557611d0f601254611eff565b60006012555b6001600160a01b038616600090815260036020526040902054611d3890856119dc565b6001600160a01b038088166000908152600360205260408082209390935590871681522054611d679084611ad6565b6001600160a01b038087166000818152600360205260409081902093909355915190881690600080516020612b8683398151915290611da7908790612a46565b60405180910390a3505050505050565b60008184841115611ddb5760405162461bcd60e51b8152600401610786919061254a565b505050900390565b60008183611e045760405162461bcd60e51b8152600401610786919061254a565b506000838581611e1057fe5b0495945050505050565b600080600080611e2a8686611f88565b90506000611e3787612001565b90506000611e4f82611e498a866119dc565b906119dc565b95509193509150509250925092565b6017805460ff60a01b1916600160a01b1790556000611e7e82600261199a565b90506000611e8c83836119dc565b905047611e988361201d565b6000611ea447836119dc565b9050611eb0838261217a565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051611ee393929190612abf565b60405180910390a150506017805460ff60a01b19169055505050565b6017805460ff60b01b1916600160b01b17905547611f1c8261201d565b6000611f2847836119dc565b600e546040519192506000916001600160a01b039091169083156108fc0290849084818181858888f19350505050905080611f755760405162461bcd60e51b8152600401610786906128f7565b50506017805460ff60b01b191690555050565b6000600d5483118015611fa957506017546001600160a01b03838116911614155b15611fe0576000611fc7600c54600a54611ad690919063ffffffff16565b9050611fd860646117618684611959565b915050610880565b611ffa6064611761600a548661195990919063ffffffff16565b9050610880565b60006108806064611761600b548561195990919063ffffffff16565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061204c57fe5b6001600160a01b03928316602091820292909201810191909152601654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d891906122c4565b816001815181106120e557fe5b6001600160a01b03928316602091820292909201015260165461210b9130911684611a22565b60165460405163791ac94760e01b81526001600160a01b039091169063791ac94790612144908590600090869030904290600401612a4f565b600060405180830381600087803b15801561215e57600080fd5b505af1158015612172573d6000803e3d6000fd5b505050505050565b6016546121929030906001600160a01b031684611a22565b6016546001600160a01b031663f305d7198230856000806121b16111ca565b426040518863ffffffff1660e01b81526004016121d396959493929190612504565b6060604051808303818588803b1580156121ec57600080fd5b505af1158015612200573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061222591906124a9565b5050505050565b600082601f83011261223c578081fd5b8135602061225161224c83612b07565b612ae3565b828152818101908583018385028701840188101561226d578586fd5b855b8581101561228b5781358452928401929084019060010161226f565b5090979650505050505050565b80358015158114610ec657600080fd5b6000602082840312156122b9578081fd5b813561199381612b25565b6000602082840312156122d5578081fd5b815161199381612b25565b600080604083850312156122f2578081fd5b82356122fd81612b25565b9150602083013561230d81612b25565b809150509250929050565b60008060006060848603121561232c578081fd5b833561233781612b25565b9250602084013561234781612b25565b929592945050506040919091013590565b6000806040838503121561236a578182fd5b823561237581612b25565b915061238360208401612298565b90509250929050565b6000806040838503121561239e578182fd5b82356123a981612b25565b946020939093013593505050565b600080604083850312156123c9578182fd5b823567ffffffffffffffff808211156123e0578384fd5b818501915085601f8301126123f3578384fd5b8135602061240361224c83612b07565b82815281810190858301838502870184018b101561241f578889fd5b8896505b8487101561244a57803561243681612b25565b835260019690960195918301918301612423565b5096505086013592505080821115612460578283fd5b5061246d8582860161222c565b9150509250929050565b600060208284031215612488578081fd5b61199382612298565b6000602082840312156124a2578081fd5b5035919050565b6000806000606084860312156124bd578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b818110156125765785810183015185820160400152820161255a565b818111156125875783604083870101525b50601f01601f1916929092016040019392505050565b60208082526012908201527114d95b99195c88109b1858dadb1a5cdd195960721b604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260159082015274149958da5c1a595b9d08109b1858dadb1a5cdd1959605a1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526010908201526f417070726f76616c20546f6f204c6f7760801b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526017908201527f3235206973204d617820546178205468726573686f6c64000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252600d908201526c56616c756520546f6f204c6f7760981b604082015260600190565b6020808252600f908201526e42616c616e636520546f6f204c6f7760881b604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601f908201527f436f6e7472616374206973206c6f636b656420756e74696c2037206461797300604082015260600190565b60208082526018908201527f41697264726f7020416c72656164792046696e69736865640000000000000000604082015260600190565b60208082526023908201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6040820152626f636b60e81b606082015260800190565b6020808252601390820152724d61785478416d6f756e7420546f77204c6f7760681b604082015260600190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015612a9e5784516001600160a01b031683529383019391830191600101612a79565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612aff57fe5b604052919050565b600067ffffffffffffffff821115612b1b57fe5b5060209081020190565b6001600160a01b0381168114612b3a57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212200d533f5eac9603a97de94f90fba3b74348752946b7084640fc0c353cf53ae04964736f6c63430007060033
Deployed Bytecode Sourcemap
27876:20587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37347:189;;;;;;;;;;-1:-1:-1;37347:189:0;;;;;:::i;:::-;;:::i;:::-;;30584:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28547:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28622:72::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33438:195::-;;;;;;;;;;-1:-1:-1;33438:195:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37131:125::-;;;;;;;;;;-1:-1:-1;37131:125:0;;;;;:::i;:::-;;:::i;29140:41::-;;;;;;;;;;;;;:::i;31019:95::-;;;;;;;;;;;;;:::i;48146:105::-;;;;;;;;;;-1:-1:-1;48146:105:0;;;;;:::i;:::-;;:::i;33872:1231::-;;;;;;;;;;-1:-1:-1;33872:1231:0;;;;;:::i;:::-;;:::i;30869:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38321:176::-;;;;;;;;;;-1:-1:-1;38321:176:0;;;;;:::i;:::-;;:::i;28350:27::-;;;;;;;;;;;;;:::i;36117:334::-;;;;;;;;;;-1:-1:-1;36117:334:0;;;;;:::i;:::-;;:::i;36581:111::-;;;;;;;;;;-1:-1:-1;36581:111:0;;;;;:::i;:::-;;:::i;29188:28::-;;;;;;;;;;;;;:::i;29259:40::-;;;;;;;;;;;;;:::i;41493:124::-;;;;;;;;;;-1:-1:-1;41493:124:0;;;;;:::i;:::-;;:::i;39347:171::-;;;;;;;;;;-1:-1:-1;39347:171:0;;;;;:::i;:::-;;:::i;28384:32::-;;;;;;;;;;;;;:::i;31220:117::-;;;;;;;;;;-1:-1:-1;31220:117:0;;;;;:::i;:::-;;:::i;16969:148::-;;;;;;;;;;;;;:::i;35295:599::-;;;;;;;;;;-1:-1:-1;35295:599:0;;;;;:::i;:::-;;:::i;28879:53::-;;;;;;;;;;;;;:::i;29041:34::-;;;;;;;;;;;;;:::i;16327:79::-;;;;;;;;;;;;;:::i;28843:29::-;;;;;;;;;;;;;:::i;37650:212::-;;;;;;;;;;-1:-1:-1;37650:212:0;;;;;:::i;:::-;;:::i;30719:87::-;;;;;;;;;;;;;:::i;18024:341::-;;;;;;;;;;;;;:::i;31509:1225::-;;;;;;;;;;-1:-1:-1;31509:1225:0;;;;;:::i;:::-;;:::i;38005:209::-;;;;;;;;;;-1:-1:-1;38005:209:0;;;;;:::i;:::-;;:::i;17561:89::-;;;;;;;;;;;;;:::i;29342:40::-;;;;;;;;;;;;;:::i;28423:34::-;;;;;;;;;;;;;:::i;48357:103::-;;;;;;;;;;-1:-1:-1;48357:103:0;;;;;:::i;:::-;;:::i;28939:34::-;;;;;;;;;;;;;:::i;39038:171::-;;;;;;;;;;-1:-1:-1;39038:171:0;;;;;:::i;:::-;;:::i;38645:268::-;;;;;;;;;;-1:-1:-1;38645:268:0;;;;;:::i;:::-;;:::i;29389:38::-;;;;;;;;;;;;;:::i;17726:226::-;;;;;;;;;;-1:-1:-1;17726:226:0;;;;;:::i;:::-;;:::i;32972:184::-;;;;;;;;;;-1:-1:-1;32972:184:0;;;;;:::i;:::-;;:::i;36817:110::-;;;;;;;;;;-1:-1:-1;36817:110:0;;;;;:::i;:::-;;:::i;17272:281::-;;;;;;;;;;-1:-1:-1;17272:281:0;;;;;:::i;:::-;;:::i;37347:189::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;;;;;;;;;37471:2:::1;37454:14;;37438:13;;37429:6;:22;:39;:44;;37420:81;;;;-1:-1:-1::0;;;37420:81:0::1;;;;;;;:::i;:::-;37512:7;:16:::0;37347:189::o;30584:83::-;30654:5;30647:12;;;;;;;;-1:-1:-1;;30647:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30621:13;;30647:12;;30654:5;;30647:12;;30654:5;30647:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30584:83;:::o;28547:67::-;;;;:::o;28622:72::-;;;-1:-1:-1;;;;;28622:72:0;;:::o;33438:195::-;33541:4;33563:40;33572:12;:10;:12::i;:::-;33586:8;33596:6;33563:8;:40::i;:::-;-1:-1:-1;33621:4:0;33438:195;;;;;:::o;37131:125::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37212:26:0;;;::::1;;::::0;;;:17:::1;:26;::::0;;;;:36;;-1:-1:-1;;37212:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37131:125::o;29140:41::-;;;-1:-1:-1;;;;;29140:41:0;;:::o;31019:95::-;31099:7;;31019:95;:::o;48146:105::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;48218:12:::1;:25:::0;;-1:-1:-1;;;;;;48218:25:0::1;-1:-1:-1::0;;;;;48218:25:0;;;::::1;::::0;;;::::1;::::0;;48146:105::o;33872:1231::-;33997:4;34031:1;34022:6;:10;34014:36;;;;-1:-1:-1;;;34014:36:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34069:24:0;;;;;;:17;:24;;;;;;;;:33;34061:64;;;;-1:-1:-1;;;34061:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34144:22:0;;;;;;:17;:22;;;;;;;;:31;34136:65;;;;-1:-1:-1;;;34136:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34230:14:0;;;;;;:7;:14;;;;;;34220:24;;;34212:52;;;;-1:-1:-1;;;34212:52:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34293:18:0;;;;;;:11;:18;;;;;;;;34312:10;34293:30;;;;;;;;34283:40;;;34275:69;;;;-1:-1:-1;;;34275:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34375:25:0;;;;;;:18;:25;;;;;;;;:33;;:25;:33;;:68;;-1:-1:-1;;;;;;34412:23:0;;;;;;:18;:23;;;;;;;;:31;;:23;:31;34375:68;34357:717;;;-1:-1:-1;;;;;34487:14:0;;;;;;:7;:14;;;;;;:26;;34506:6;34487:18;:26::i;:::-;-1:-1:-1;;;;;34470:14:0;;;;;;;:7;:14;;;;;;:43;;;;34543:12;;;;;;;:24;;34560:6;34543:16;:24::i;:::-;-1:-1:-1;;;;;34528:12:0;;;;;;;:7;:12;;;;;;;;:39;;;;34615:18;;;;;:11;:18;;;;;34634:10;34615:30;;;;;;;:74;;34668:6;34615:34;:74::i;:::-;-1:-1:-1;;;;;34582:18:0;;;;;;;:11;:18;;;;;;;;34601:10;34582:30;;;;;;;;;:107;;;;34711:28;;;;;;34582:18;-1:-1:-1;;;;;;;;;;;34711:28:0;;;34732:6;;34711:28;:::i;:::-;;;;;;;;34357:717;;;34772:29;34782:5;34789:3;34794:6;34772:9;:29::i;:::-;34816:246;34843:5;34867:12;:10;:12::i;:::-;34898:149;34957:6;34898:149;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34898:18:0;;;;;;:11;:18;;;;;;34917:12;:10;:12::i;:::-;-1:-1:-1;;;;;34898:32:0;;;;;;;;;;;;-1:-1:-1;34898:32:0;;;:149;:36;:149::i;:::-;34816:8;:246::i;:::-;-1:-1:-1;35091:4:0;33872:1231;;;;;:::o;30869:92::-;30944:9;;;;30869:92;:::o;38321:176::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;38441:23:::1;:48:::0;38321:176::o;28350:27::-;;;;:::o;36117:334::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;36190:36:::1;36248:9;36190:68;;36303:17;-1:-1:-1::0;;;;;36303:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36285:71:0::1;;36365:4;36372:17;-1:-1:-1::0;;;;;36372:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36285:112;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36269:13;:128:::0;;-1:-1:-1;;;;;36269:128:0;;::::1;-1:-1:-1::0;;;;;;36269:128:0;;::::1;;::::0;;;36408:15:::1;:35:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;36117:334:0:o;36581:111::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36650:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;36650:34:0::1;36680:4;36650:34;::::0;;36581:111::o;29188:28::-;;;-1:-1:-1;;;;;29188:28:0;;:::o;29259:40::-;;;-1:-1:-1;;;29259:40:0;;;;;:::o;41493:124::-;-1:-1:-1;;;;;41582:27:0;;41558:4;41582:27;;;:18;:27;;;;;;;;41493:124;;;;:::o;39347:171::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;39424:21:::1;:32:::0;;-1:-1:-1;;;;39424:32:0::1;-1:-1:-1::0;;;39424:32:0;::::1;;;;::::0;;39472:38:::1;::::0;::::1;::::0;::::1;::::0;39424:32;;39472:38:::1;:::i;:::-;;;;;;;;39347:171:::0;:::o;28384:32::-;;;;:::o;31220:117::-;-1:-1:-1;;;;;31313:16:0;31286:7;31313:16;;;:7;:16;;;;;;;31220:117::o;16969:148::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;17076:1:::1;17060:6:::0;;17039:40:::1;::::0;-1:-1:-1;;;;;17060:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;17039:40:0;17076:1;;17039:40:::1;17107:1;17090:19:::0;;-1:-1:-1;;;;;;17090:19:0::1;::::0;;16969:148::o;35295:599::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;35428:18:::1;::::0;-1:-1:-1;;;35428:18:0;::::1;;;:25;35420:62;;;;-1:-1:-1::0;;;35420:62:0::1;;;;;;;:::i;:::-;35493:18;:23:::0;;-1:-1:-1;;;;35493:23:0::1;-1:-1:-1::0;;;35493:23:0::1;::::0;;;35529:348:::1;35551:19;:26;35547:1;:30;;;35529:348;;;35622:48;35649:17;35667:1;35649:20;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;35638:4:::1;35622:22;::::0;;;:7:::1;:22:::0;;;;;;;;;:26:::1;:48::i;:::-;35615:4;35599:22;::::0;;;:7:::1;:22;::::0;;;;:71;35755:20;;35719:57:::1;::::0;35755:17;;:20:::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;35719:7;:31;35727:19;35747:1;35727:22;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35719:31:0::1;-1:-1:-1::0;;;;;35719:31:0::1;;;;;;;;;;;;;:35;;:57;;;;:::i;:::-;35685:7;:31;35693:19;35713:1;35693:22;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35685:31:0::1;-1:-1:-1::0;;;;;35685:31:0::1;;;;;;;;;;;;:91;;;;35820:19;35840:1;35820:22;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35796:69:0::1;35813:4;-1:-1:-1::0;;;;;35796:69:0::1;-1:-1:-1::0;;;;;;;;;;;35844:17:0::1;35862:1;35844:20;;;;;;;;;;;;;;;;35796:69;;;;;;:::i;:::-;;;;;;;;35579:3;;35529:348;;;;35295:599:::0;;:::o;28879:53::-;;;;:::o;29041:34::-;;;;:::o;16327:79::-;16365:7;16392:6;-1:-1:-1;;;;;16392:6:0;16327:79;:::o;28843:29::-;;;;;;:::o;37650:212::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;37785:2:::1;37768:14;;37753:12;37743:7;;:22;:39;:44;;37734:81;;;;-1:-1:-1::0;;;37734:81:0::1;;;;;;;:::i;:::-;37826:13;:28:::0;37650:212::o;30719:87::-;30791:7;30784:14;;;;;;;;-1:-1:-1;;30784:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30758:13;;30784:14;;30791:7;;30784:14;;30791:7;30784:14;;;;;;;;;;;;;;;;;;;;;;;;18024:341;18090:14;;-1:-1:-1;;;;;18090:14:0;18108:10;18090:28;18068:113;;;;-1:-1:-1;;;18068:113:0;;;;;;;:::i;:::-;18218:9;;18200:15;:27;18192:71;;;;-1:-1:-1;;;18192:71:0;;;;;;;:::i;:::-;18308:14;;;18300:6;;18279:44;;-1:-1:-1;;;;;18308:14:0;;;;18300:6;;;;-1:-1:-1;;;;;;;;;;;18279:44:0;;18343:14;;;18334:23;;-1:-1:-1;;;;;;18334:23:0;-1:-1:-1;;;;;18343:14:0;;;18334:23;;;;;;18024:341::o;31509:1225::-;31608:4;31647:1;31638:6;:10;31630:36;;;;-1:-1:-1;;;31630:36:0;;;;;;;:::i;:::-;31703:10;31685:29;;;;:17;:29;;;;;;;;:38;31677:69;;;;-1:-1:-1;;;31677:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31765:22:0;;;;;;:17;:22;;;;;;;;:31;31757:65;;;;-1:-1:-1;;;31757:65:0;;;;;;;:::i;:::-;31849:10;31841:19;;;;:7;:19;;;;;;:29;-1:-1:-1;31841:29:0;31833:57;;;;-1:-1:-1;;;31833:57:0;;;;;;;:::i;:::-;31940:10;31921:30;;;;:18;:30;;;;;;;;:38;;:30;:38;;:86;;-1:-1:-1;;;;;;31976:23:0;;;;;;:18;:23;;;;;;;;:31;;:23;:31;31921:86;31903:802;;;32064:10;32056:19;;;;:7;:19;;;;;;:31;;32080:6;32056:23;:31::i;:::-;32042:10;32034:19;;;;:7;:19;;;;;;:53;;;;-1:-1:-1;;;;;32117:12:0;;;;;;:24;;32134:6;32117:16;:24::i;:::-;-1:-1:-1;;;;;32102:12:0;;;;;;:7;:12;;;;;;;:39;;;;32161:33;;32170:10;;-1:-1:-1;;;;;;;;;;;32161:33:0;;;32187:6;;32161:33;:::i;:::-;;;;;;;;31903:802;;;32230:10;;;;:18;;:10;:18;:90;;;;-1:-1:-1;32282:13:0;;-1:-1:-1;;;;;32282:13:0;32266:12;:10;:12::i;:::-;-1:-1:-1;;;;;32266:29:0;;:53;;;-1:-1:-1;32306:13:0;;-1:-1:-1;;;;;32299:20:0;;;32306:13;;32299:20;32266:53;32212:493;;;32401:36;32411:12;:10;:12::i;:::-;32425:3;32430:6;32401:9;:36::i;:::-;32212:493;;;32563:10;32555:19;;;;:7;:19;;;;;;:31;;32579:6;32555:23;:31::i;:::-;32541:10;32533:19;;;;:7;:19;;;;;;:53;;;;-1:-1:-1;;;;;32616:12:0;;;;;;:24;;32633:6;32616:16;:24::i;:::-;-1:-1:-1;;;;;32601:12:0;;;;;;:7;:12;;;;;;;:39;;;;32660:33;;32669:10;;-1:-1:-1;;;;;;;;;;;32660:33:0;;;32686:6;;32660:33;:::i;:::-;;;;;;;;-1:-1:-1;32722:4:0;31509:1225;;;;:::o;38005:209::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;38135:2:::1;38119:13;38103;;38093:7;;:23;:39;:44;;38084:81;;;;-1:-1:-1::0;;;38084:81:0::1;;;;;;;:::i;:::-;38176:14;:30:::0;38005:209::o;17561:89::-;17633:9;;17561:89;:::o;29342:40::-;;;-1:-1:-1;;;29342:40:0;;;;;:::o;28423:34::-;;;;:::o;48357:103::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;48428:10:::1;:24:::0;;-1:-1:-1;;48428:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48357:103::o;28939:34::-;;;;:::o;39038:171::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;39115:21:::1;:32:::0;;-1:-1:-1;;;;39115:32:0::1;-1:-1:-1::0;;;39115:32:0;::::1;;;;::::0;;39163:38:::1;::::0;::::1;::::0;::::1;::::0;39115:32;;39163:38:::1;:::i;38645:268::-:0;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;38722:19:::1;38744:36;38774:5;38744:25;38756:12;38744:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:36::i;:::-;38722:58;;38816:25;38835:5;38816:14;38828:1;38816:7;;:11;;:14;;;;:::i;:25::-;38799:14;:42;38791:74;;;;-1:-1:-1::0;;;38791:74:0::1;;;;;;;:::i;:::-;38876:12;:29:::0;-1:-1:-1;38645:268:0:o;29389:38::-;;;-1:-1:-1;;;29389:38:0;;;;;:::o;17726:226::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;17807:6:::1;::::0;;;17790:23;;-1:-1:-1;;;;;;17790:23:0;;::::1;-1:-1:-1::0;;;;;17807:6:0;::::1;17790:23;::::0;;;17824:19:::1;::::0;;17866:15:::1;:22:::0;::::1;17854:9;:34:::0;17904:40:::1;::::0;17807:6;;-1:-1:-1;;;;;;;;;;;17904:40:0;17807:6;;17904:40:::1;17726:226:::0;:::o;32972:184::-;-1:-1:-1;;;;;33121:18:0;;;33089:7;33121:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32972:184::o;36817:110::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36884:27:0::1;36914:5;36884:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;36884:35:0::1;::::0;;36817:110::o;17272:281::-;16549:12;:10;:12::i;:::-;16539:6;;-1:-1:-1;;;;;16539:6:0;;;:22;;;16531:67;;;;-1:-1:-1;;;16531:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17375:22:0;::::1;17353:110;;;;-1:-1:-1::0;;;17353:110:0::1;;;;;;;:::i;:::-;17500:6;::::0;;17479:38:::1;::::0;-1:-1:-1;;;;;17479:38:0;;::::1;::::0;17500:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;17479:38:0;::::1;17528:6;:17:::0;;-1:-1:-1;;;;;;17528:17:0::1;-1:-1:-1::0;;;;;17528:17:0;;;::::1;::::0;;;::::1;::::0;;17272:281::o;5067:471::-;5125:7;5370:6;5366:47;;-1:-1:-1;5400:1:0;5393:8;;5366:47;5437:5;;;5441:1;5437;:5;:1;5461:5;;;;;:10;5453:56;;;;-1:-1:-1;;;5453:56:0;;;;;;;:::i;:::-;5529:1;5067:471;-1:-1:-1;;;5067:471:0:o;6014:132::-;6072:7;6099:39;6103:1;6106;6099:39;;;;;;;;;;;;;;;;;:3;:39::i;4143:136::-;4201:7;4228:43;4232:1;4235;4228:43;;;;;;;;;;;;;;;;;:3;:43::i;8274:106::-;8362:10;8274:106;:::o;41934:371::-;-1:-1:-1;;;;;42061:19:0;;42053:68;;;;-1:-1:-1;;;42053:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42140:21:0;;42132:68;;;;-1:-1:-1;;;42132:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42213:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;42265:32;;;;;42243:6;;42265:32;:::i;:::-;;;;;;;;41934:371;;;:::o;3679:181::-;3737:7;3769:5;;;3793:6;;;;3785:46;;;;-1:-1:-1;;;3785:46:0;;;;;;;:::i;42583:2338::-;-1:-1:-1;;;;;42705:18:0;;42697:68;;;;-1:-1:-1;;;42697:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42784:16:0;;42776:64;;;;-1:-1:-1;;;42776:64:0;;;;;;;:::i;:::-;42868:1;42859:6;:10;42851:64;;;;-1:-1:-1;;;42851:64:0;;;;;;;:::i;:::-;42938:7;:5;:7::i;:::-;-1:-1:-1;;;;;42930:15:0;:4;-1:-1:-1;;;;;42930:15:0;;;:32;;;;;42955:7;:5;:7::i;:::-;-1:-1:-1;;;;;42949:13:0;:2;-1:-1:-1;;;;;42949:13:0;;;42930:32;42926:175;;;43013:12;;43003:6;:22;;42977:124;;;;-1:-1:-1;;;42977:124:0;;;;;;;:::i;:::-;43129:23;43167:12;43194:18;43226:25;43238:6;43246:4;43226:11;:25::i;:::-;43416:4;43400:22;;;;:7;:22;;;;;;43114:137;;-1:-1:-1;43114:137:0;;-1:-1:-1;43114:137:0;-1:-1:-1;43400:38:0;;43114:137;43400:26;:38::i;:::-;43391:4;43375:22;;;;:7;:22;;;;;:63;43472:19;;:35;;43496:10;43472:23;:35::i;:::-;43450:19;:57;;;43547:29;;-1:-1:-1;43520:566:0;;43814:16;;-1:-1:-1;;;43814:16:0;;;;43813:17;:59;;;;-1:-1:-1;43859:13:0;;-1:-1:-1;;;;;43851:21:0;;;43859:13;;43851:21;;43813:59;:101;;;;-1:-1:-1;43893:21:0;;-1:-1:-1;;;43893:21:0;;;;43813:101;43791:284;;;43982:35;43997:19;;43982:14;:35::i;:::-;44058:1;44036:19;:23;43791:284;44244:4;44228:22;;;;:7;:22;;;;;;:32;;44255:4;44228:26;:32::i;:::-;44219:4;44203:22;;;;:7;:22;;;;;:57;44294:19;;:29;;44318:4;44294:23;:29::i;:::-;44272:19;:51;;;44377:34;;-1:-1:-1;44336:416:0;;44461:16;;-1:-1:-1;;;44461:16:0;;;;44460:17;:59;;;;-1:-1:-1;44506:13:0;;-1:-1:-1;;;;;44498:21:0;;;44506:13;;44498:21;;44460:59;:101;;;;-1:-1:-1;44540:21:0;;-1:-1:-1;;;44540:21:0;;;;44460:101;44438:303;;;44646:37;44663:19;;44646:16;:37::i;:::-;44724:1;44702:19;:23;44438:303;-1:-1:-1;;;;;44780:13:0;;;;;;:7;:13;;;;;;:25;;44798:6;44780:17;:25::i;:::-;-1:-1:-1;;;;;44764:13:0;;;;;;;:7;:13;;;;;;:41;;;;44830:11;;;;;;;:32;;44846:15;44830;:32::i;:::-;-1:-1:-1;;;;;44816:11:0;;;;;;;:7;:11;;;;;;;:46;;;;44878:35;;;;;;-1:-1:-1;;;;;;;;;;;44878:35:0;;;44897:15;;44878:35;:::i;:::-;;;;;;;;42583:2338;;;;;;:::o;4582:226::-;4702:7;4738:12;4730:6;;;;4722:29;;;;-1:-1:-1;;;4722:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4774:5:0;;;4582:226::o;6642:312::-;6762:7;6797:12;6790:5;6782:28;;;;-1:-1:-1;;;6782:28:0;;;;;;;;:::i;:::-;;6821:9;6837:1;6833;:5;;;;;;;6642:312;-1:-1:-1;;;;;6642:312:0:o;40008:435::-;40123:7;40145;40167;40202:12;40217:30;40233:7;40242:4;40217:15;:30::i;:::-;40202:45;;40259:18;40280:30;40302:7;40280:21;:30::i;:::-;40259:51;-1:-1:-1;40322:23:0;40348:33;40259:51;40348:17;:7;40360:4;40348:11;:17::i;:::-;:21;;:33::i;:::-;40322:59;-1:-1:-1;40418:4:0;;-1:-1:-1;40424:10:0;-1:-1:-1;;40008:435:0;;;;;:::o;45596:1030::-;29783:16;:23;;-1:-1:-1;;;;29783:23:0;-1:-1:-1;;;29783:23:0;;;;45780:37:::1;:30:::0;45815:1:::1;45780:34;:37::i;:::-;45765:52:::0;-1:-1:-1;45828:17:0::1;45848:40;:30:::0;45765:52;45848:34:::1;:40::i;:::-;45828:60:::0;-1:-1:-1;46191:21:0::1;46257:22;46274:4:::0;46257:16:::1;:22::i;:::-;46410:18;46431:41;:21;46457:14:::0;46431:25:::1;:41::i;:::-;46410:62;;46522:35;46535:9;46546:10;46522:12;:35::i;:::-;46575:43;46590:4;46596:10;46608:9;46575:43;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;29829:16:0;:24;;-1:-1:-1;;;;29829:24:0;;;-1:-1:-1;;;45596:1030:0:o;45058:353::-;29901:16;:23;;-1:-1:-1;;;;29901:23:0;-1:-1:-1;;;29901:23:0;;;45161:21:::1;45193:29;45210:11:::0;45193:16:::1;:29::i;:::-;45233:18;45254:41;:21;45280:14:::0;45254:25:::1;:41::i;:::-;45326:12;::::0;45318:38:::1;::::0;45233:62;;-1:-1:-1;45306:9:0::1;::::0;-1:-1:-1;;;;;45326:12:0;;::::1;::::0;45318:38;::::1;;;::::0;45233:62;;45306:9;45318:38;45306:9;45318:38;45233:62;45326:12;45318:38;::::1;;;;;;45306:50;;45375:4;45367:36;;;;-1:-1:-1::0;;;45367:36:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;29947:16:0;:24;;-1:-1:-1;;;;29947:24:0;;;-1:-1:-1;;45058:353:0:o;40597:474::-;40703:7;40742:23;;40732:7;:33;:59;;;;-1:-1:-1;40778:13:0;;-1:-1:-1;;;;;40769:22:0;;;40778:13;;40769:22;;40732:59;40728:336;;;40879:17;40899:27;40911:14;;40899:7;;:11;;:27;;;;:::i;:::-;40879:47;-1:-1:-1;40948:33:0;40975:5;40948:22;:7;40879:47;40948:11;:22::i;:33::-;40941:40;;;;;40728:336;41021:31;41046:5;41021:20;41033:7;;41021;:11;;:20;;;;:::i;:31::-;41014:38;;;;41184:174;41281:7;41313:37;41344:5;41313:26;41325:13;;41313:7;:11;;:26;;;;:::i;46758:589::-;46908:16;;;46922:1;46908:16;;;;;;;;46884:21;;46908:16;;;;;;;;;;-1:-1:-1;46908:16:0;46884:40;;46953:4;46935;46940:1;46935:7;;;;;;;;-1:-1:-1;;;;;46935:23:0;;;:7;;;;;;;;;;:23;;;;46979:15;;:22;;;-1:-1:-1;;;46979:22:0;;;;:15;;;;;:20;;:22;;;;;46935:7;;46979:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46969:4;46974:1;46969:7;;;;;;;;-1:-1:-1;;;;;46969:32:0;;;:7;;;;;;;;;:32;47046:15;;47014:62;;47031:4;;47046:15;47064:11;47014:8;:62::i;:::-;47115:15;;:224;;-1:-1:-1;;;47115:224:0;;-1:-1:-1;;;;;47115:15:0;;;;:66;;:224;;47196:11;;47115:15;;47266:4;;47293;;47313:15;;47115:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46758:589;;:::o;47563:513::-;47743:15;;47711:62;;47728:4;;-1:-1:-1;;;;;47743:15:0;47761:11;47711:8;:62::i;:::-;47816:15;;-1:-1:-1;;;;;47816:15:0;:31;47855:9;47888:4;47908:11;47816:15;;48020:7;:5;:7::i;:::-;48042:15;47816:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;47563:513;;:::o;14:705:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:1;;;487:5;480;473:20;425:2;513:5;527:163;541:2;538:1;535:9;527:163;;;598:17;;586:30;;636:12;;;;668;;;;559:1;552:9;527:163;;;-1:-1:-1;708:5:1;;84:635;-1:-1:-1;;;;;;;84:635:1:o;724:162::-;791:20;;847:13;;840:21;830:32;;820:2;;876:1;873;866:12;891:259;;1003:2;991:9;982:7;978:23;974:32;971:2;;;1024:6;1016;1009:22;971:2;1068:9;1055:23;1087:33;1114:5;1087:33;:::i;1155:263::-;;1278:2;1266:9;1257:7;1253:23;1249:32;1246:2;;;1299:6;1291;1284:22;1246:2;1336:9;1330:16;1355:33;1382:5;1355:33;:::i;1423:402::-;;;1552:2;1540:9;1531:7;1527:23;1523:32;1520:2;;;1573:6;1565;1558:22;1520:2;1617:9;1604:23;1636:33;1663:5;1636:33;:::i;:::-;1688:5;-1:-1:-1;1745:2:1;1730:18;;1717:32;1758:35;1717:32;1758:35;:::i;:::-;1812:7;1802:17;;;1510:315;;;;;:::o;1830:470::-;;;;1976:2;1964:9;1955:7;1951:23;1947:32;1944:2;;;1997:6;1989;1982:22;1944:2;2041:9;2028:23;2060:33;2087:5;2060:33;:::i;:::-;2112:5;-1:-1:-1;2169:2:1;2154:18;;2141:32;2182:35;2141:32;2182:35;:::i;:::-;1934:366;;2236:7;;-1:-1:-1;;;2290:2:1;2275:18;;;;2262:32;;1934:366::o;2305:329::-;;;2431:2;2419:9;2410:7;2406:23;2402:32;2399:2;;;2452:6;2444;2437:22;2399:2;2496:9;2483:23;2515:33;2542:5;2515:33;:::i;:::-;2567:5;-1:-1:-1;2591:37:1;2624:2;2609:18;;2591:37;:::i;:::-;2581:47;;2389:245;;;;;:::o;2639:327::-;;;2768:2;2756:9;2747:7;2743:23;2739:32;2736:2;;;2789:6;2781;2774:22;2736:2;2833:9;2820:23;2852:33;2879:5;2852:33;:::i;:::-;2904:5;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2726:240:1:o;2971:1295::-;;;3150:2;3138:9;3129:7;3125:23;3121:32;3118:2;;;3171:6;3163;3156:22;3118:2;3216:9;3203:23;3245:18;3286:2;3278:6;3275:14;3272:2;;;3307:6;3299;3292:22;3272:2;3350:6;3339:9;3335:22;3325:32;;3395:7;3388:4;3384:2;3380:13;3376:27;3366:2;;3422:6;3414;3407:22;3366:2;3463;3450:16;3485:4;3509:65;3524:49;3570:2;3524:49;:::i;3509:65::-;3608:15;;;3639:12;;;;3671:11;;;3709;;;3701:20;;3697:29;;3694:42;-1:-1:-1;3691:2:1;;;3754:6;3746;3739:22;3691:2;3781:6;3772:15;;3796:240;3810:2;3807:1;3804:9;3796:240;;;3881:3;3868:17;3898:33;3925:5;3898:33;:::i;:::-;3944:18;;3828:1;3821:9;;;;;3982:12;;;;4014;;3796:240;;;-1:-1:-1;4055:5:1;-1:-1:-1;;4098:18:1;;4085:32;;-1:-1:-1;;4129:16:1;;;4126:2;;;4163:6;4155;4148:22;4126:2;;4191:69;4252:7;4241:8;4230:9;4226:24;4191:69;:::i;:::-;4181:79;;;3108:1158;;;;;:::o;4271:192::-;;4380:2;4368:9;4359:7;4355:23;4351:32;4348:2;;;4401:6;4393;4386:22;4348:2;4429:28;4447:9;4429:28;:::i;4468:190::-;;4580:2;4568:9;4559:7;4555:23;4551:32;4548:2;;;4601:6;4593;4586:22;4548:2;-1:-1:-1;4629:23:1;;4538:120;-1:-1:-1;4538:120:1:o;4663:316::-;;;;4820:2;4808:9;4799:7;4795:23;4791:32;4788:2;;;4841:6;4833;4826:22;4788:2;4875:9;4869:16;4859:26;;4925:2;4914:9;4910:18;4904:25;4894:35;;4969:2;4958:9;4954:18;4948:25;4938:35;;4778:201;;;;;:::o;4984:203::-;-1:-1:-1;;;;;5148:32:1;;;;5130:51;;5118:2;5103:18;;5085:102::o;5192:312::-;-1:-1:-1;;;;;5430:15:1;;;5412:34;;5482:15;;5477:2;5462:18;;5455:43;5362:2;5347:18;;5329:175::o;5509:615::-;-1:-1:-1;;;;;5876:15:1;;;5858:34;;5923:2;5908:18;;5901:34;;;;5966:2;5951:18;;5944:34;;;;6009:2;5994:18;;5987:34;;;;6058:15;;;6052:3;6037:19;;6030:44;5838:3;6090:19;;6083:35;;;;5807:3;5792:19;;5774:350::o;6129:187::-;6294:14;;6287:22;6269:41;;6257:2;6242:18;;6224:92::o;6556:603::-;;6697:2;6726;6715:9;6708:21;6758:6;6752:13;6801:6;6796:2;6785:9;6781:18;6774:34;6826:4;6839:140;6853:6;6850:1;6847:13;6839:140;;;6948:14;;;6944:23;;6938:30;6914:17;;;6933:2;6910:26;6903:66;6868:10;;6839:140;;;6997:6;6994:1;6991:13;6988:2;;;7067:4;7062:2;7053:6;7042:9;7038:22;7034:31;7027:45;6988:2;-1:-1:-1;7143:2:1;7122:15;-1:-1:-1;;7118:29:1;7103:45;;;;7150:2;7099:54;;6677:482;-1:-1:-1;;;6677:482:1:o;7164:342::-;7366:2;7348:21;;;7405:2;7385:18;;;7378:30;-1:-1:-1;;;7439:2:1;7424:18;;7417:48;7497:2;7482:18;;7338:168::o;7511:399::-;7713:2;7695:21;;;7752:2;7732:18;;;7725:30;7791:34;7786:2;7771:18;;7764:62;-1:-1:-1;;;7857:2:1;7842:18;;7835:33;7900:3;7885:19;;7685:225::o;7915:345::-;8117:2;8099:21;;;8156:2;8136:18;;;8129:30;-1:-1:-1;;;8190:2:1;8175:18;;8168:51;8251:2;8236:18;;8089:171::o;8265:402::-;8467:2;8449:21;;;8506:2;8486:18;;;8479:30;8545:34;8540:2;8525:18;;8518:62;-1:-1:-1;;;8611:2:1;8596:18;;8589:36;8657:3;8642:19;;8439:228::o;8672:398::-;8874:2;8856:21;;;8913:2;8893:18;;;8886:30;8952:34;8947:2;8932:18;;8925:62;-1:-1:-1;;;9018:2:1;9003:18;;8996:32;9060:3;9045:19;;8846:224::o;9075:340::-;9277:2;9259:21;;;9316:2;9296:18;;;9289:30;-1:-1:-1;;;9350:2:1;9335:18;;9328:46;9406:2;9391:18;;9249:166::o;9420:351::-;9622:2;9604:21;;;9661:2;9641:18;;;9634:30;9700:29;9695:2;9680:18;;9673:57;9762:2;9747:18;;9594:177::o;9776:404::-;9978:2;9960:21;;;10017:2;9997:18;;;9990:30;10056:34;10051:2;10036:18;;10029:62;-1:-1:-1;;;10122:2:1;10107:18;;10100:38;10170:3;10155:19;;9950:230::o;10185:347::-;10387:2;10369:21;;;10426:2;10406:18;;;10399:30;10465:25;10460:2;10445:18;;10438:53;10523:2;10508:18;;10359:173::o;10537:397::-;10739:2;10721:21;;;10778:2;10758:18;;;10751:30;10817:34;10812:2;10797:18;;10790:62;-1:-1:-1;;;10883:2:1;10868:18;;10861:31;10924:3;10909:19;;10711:223::o;10939:356::-;11141:2;11123:21;;;11160:18;;;11153:30;11219:34;11214:2;11199:18;;11192:62;11286:2;11271:18;;11113:182::o;11300:405::-;11502:2;11484:21;;;11541:2;11521:18;;;11514:30;11580:34;11575:2;11560:18;;11553:62;-1:-1:-1;;;11646:2:1;11631:18;;11624:39;11695:3;11680:19;;11474:231::o;11710:337::-;11912:2;11894:21;;;11951:2;11931:18;;;11924:30;-1:-1:-1;;;11985:2:1;11970:18;;11963:43;12038:2;12023:18;;11884:163::o;12052:339::-;12254:2;12236:21;;;12293:2;12273:18;;;12266:30;-1:-1:-1;;;12327:2:1;12312:18;;12305:45;12382:2;12367:18;;12226:165::o;12396:401::-;12598:2;12580:21;;;12637:2;12617:18;;;12610:30;12676:34;12671:2;12656:18;;12649:62;-1:-1:-1;;;12742:2:1;12727:18;;12720:35;12787:3;12772:19;;12570:227::o;12802:343::-;13004:2;12986:21;;;13043:2;13023:18;;;13016:30;-1:-1:-1;;;13077:2:1;13062:18;;13055:49;13136:2;13121:18;;12976:169::o;13150:400::-;13352:2;13334:21;;;13391:2;13371:18;;;13364:30;13430:34;13425:2;13410:18;;13403:62;-1:-1:-1;;;13496:2:1;13481:18;;13474:34;13540:3;13525:19;;13324:226::o;13555:355::-;13757:2;13739:21;;;13796:2;13776:18;;;13769:30;13835:33;13830:2;13815:18;;13808:61;13901:2;13886:18;;13729:181::o;13915:348::-;14117:2;14099:21;;;14156:2;14136:18;;;14129:30;14195:26;14190:2;14175:18;;14168:54;14254:2;14239:18;;14089:174::o;14268:399::-;14470:2;14452:21;;;14509:2;14489:18;;;14482:30;14548:34;14543:2;14528:18;;14521:62;-1:-1:-1;;;14614:2:1;14599:18;;14592:33;14657:3;14642:19;;14442:225::o;14672:343::-;14874:2;14856:21;;;14913:2;14893:18;;;14886:30;-1:-1:-1;;;14947:2:1;14932:18;;14925:49;15006:2;14991:18;;14846:169::o;15020:177::-;15166:25;;;15154:2;15139:18;;15121:76::o;15202:991::-;;15520:3;15509:9;15505:19;15551:6;15540:9;15533:25;15577:2;15615:6;15610:2;15599:9;15595:18;15588:34;15658:3;15653:2;15642:9;15638:18;15631:31;15682:6;15717;15711:13;15748:6;15740;15733:22;15786:3;15775:9;15771:19;15764:26;;15825:2;15817:6;15813:15;15799:29;;15846:4;15859:195;15873:6;15870:1;15867:13;15859:195;;;15938:13;;-1:-1:-1;;;;;15934:39:1;15922:52;;16029:15;;;;15994:12;;;;15970:1;15888:9;15859:195;;;-1:-1:-1;;;;;;;16110:32:1;;;;16105:2;16090:18;;16083:60;-1:-1:-1;;;16174:3:1;16159:19;16152:35;16071:3;15481:712;-1:-1:-1;;;15481:712:1:o;16198:319::-;16400:25;;;16456:2;16441:18;;16434:34;;;;16499:2;16484:18;;16477:34;16388:2;16373:18;;16355:162::o;16522:184::-;16694:4;16682:17;;;;16664:36;;16652:2;16637:18;;16619:87::o;16711:242::-;16781:2;16775:9;16811:17;;;16858:18;16843:34;;16879:22;;;16840:62;16837:2;;;16905:9;16837:2;16932;16925:22;16755:198;;-1:-1:-1;16755:198:1:o;16958:183::-;;17057:18;17049:6;17046:30;17043:2;;;17079:9;17043:2;-1:-1:-1;17130:4:1;17111:17;;;17107:28;;17033:108::o;17146:133::-;-1:-1:-1;;;;;17223:31:1;;17213:42;;17203:2;;17269:1;17266;17259:12;17203:2;17193:86;:::o
Swarm Source
ipfs://0d533f5eac9603a97de94f90fba3b74348752946b7084640fc0c353cf53ae049
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.