Contract Overview
Contract Name:
BotToken
Compiler Version
v0.8.6+commit.11564f7e
/************************************************************ * * Autor: BotPlanet * Blockchain: IoTeX * Swap: MimoProtocol * * 446576656c6f7065723a20416e746f6e20506f6c656e79616b61 ****/ // SPDX-License-Identifier: MIT pragma solidity 0.8.6; interface IERC20 { 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 payable(address(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); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; bool private _isOwnershipRenounced = false; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event NewDelay(uint256 indexed newDelay); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { 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 { _owner = address(0); _isOwnershipRenounced = true; emit OwnershipTransferred(_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)); emit NewDelay(_lockTime); } //Unlocks the contract for owner when _lockTime is exceeds function unlock() public virtual { require(_isOwnershipRenounced == false, "Ownership of the contract has been relinquished"); require(_previousOwner == msg.sender, "You don't have permission to unlock the token contract"); require(block.timestamp > _lockTime , "Contract is locked until 7 days"); _owner = _previousOwner; emit OwnershipTransferred(_owner, _previousOwner); } } interface IMimoFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function referral() external view returns (address); 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; function setReferral(address) external; } interface IMimoV2Router01 { 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 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); } interface IMimoV2Router02 is IMimoV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) 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; } contract BotToken is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; address private _dead = 0x000000000000000000000000000000000000dEaD; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; uint256 private constant MAX = ~uint256(0); uint256 public _totalSupply; uint256 private _rTotal; uint256 private _tFeeTotal; string public _name; string public _symbol; uint8 private _decimals; uint8 public taxFee; uint8 private _previousTaxFee = taxFee; uint8 public liquidityFee; uint8 private _previousLiquidityFee = liquidityFee; uint8 public burnFee; uint8 private _previousBurnFee = burnFee; uint8 public walletFee; uint8 private _previousWalletFee = walletFee; uint8 public buybackFee; uint8 private _previousBuybackFee = buybackFee; IMimoV2Router02 public immutable pcsV2Router; address public immutable pcsV2Pair; address payable public feeWallet; // Mimo Factory: 0xda257cBe968202Dea212bBB65aB49f174Da58b9D address public router = 0x95cB18889B968AbABb9104f30aF5b310bD007Fd8; // Mimo // Mimo SDK: 0x147CdAe2BF7e809b9789aD0765899c06B361C5cE bool private _inSwapAndLiquify; bool public swapAndLiquifyEnabled; uint8 public minMxTxPercentage = 1; uint256 public maxTxAmount; uint8 public minMxWalletPercentage = 1; uint256 public maxWalletAmount; uint256 public numTokensSellToAddToLiquidity; uint256 private _buyBackUpperLimit; uint256 private _buyBackMinLimit; event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity); modifier lockTheSwap { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } constructor () { // Initialization. Start address tokenOwner = address(0xe919621cae4bE24eb2cA43E5D077816690D96767); feeWallet = payable(0xe919621cae4bE24eb2cA43E5D077816690D96767); _name = "BOT"; // Token name _symbol = "BOT"; // Token symbol _decimals = 18; _totalSupply = uint256(1000000000 * 10**_decimals); uint8 setMxTxPer = 100; uint8 setMxWalletPer = 1; taxFee = 0; // 0% liquidityFee = 0; // 0% burnFee = 1; // 1% walletFee = 0; // 0% buybackFee = 1; // 1% _buyBackUpperLimit = 10 * 10**_decimals; _buyBackMinLimit = 10 * 10**_decimals; swapAndLiquifyEnabled = true; // Initialization. End _rTotal = (MAX - (MAX % _totalSupply)); _rOwned[tokenOwner] = _rTotal; _setMaxTxPercent(setMxTxPer); _setMaxWalletPercent(setMxWalletPer); numTokensSellToAddToLiquidity = _totalSupply.mul(1).div(1000); // Create a MimoProtocol pair for this new token IMimoV2Router02 _pcsV2Router = IMimoV2Router02(router); pcsV2Pair = IMimoFactory(_pcsV2Router.factory()).createPair(address(this), _pcsV2Router.WETH()); pcsV2Router = _pcsV2Router; // Exclude owner and contract address from fee _isExcludedFromFee[tokenOwner] = true; _isExcludedFromFee[address(this)] = true; // Emit events emit Transfer(address(0), tokenOwner, _totalSupply); emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); (uint256 rAmount,,,,,) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _totalSupply, "Amt must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,,) = _getValues(tAmount); return rAmount; } else { (,uint256 rTransferAmount,,,,) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amt must be less than tot refl"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function buyBackUpperLimitAmount() public view returns (uint256) { return _buyBackUpperLimit; } function _setMaxTxPercent(uint256 maxTxPercent) private { require(maxTxPercent >= minMxTxPercentage && maxTxPercent <= 100, "err"); maxTxAmount = _totalSupply.mul(maxTxPercent).div(100); } function _setMaxWalletPercent(uint256 maxWalletPercent) private { require(maxWalletPercent >= minMxWalletPercentage && maxWalletPercent <= 100, "err"); maxWalletAmount = _totalSupply.mul(maxWalletPercent).div(100); } function setFeeWallet(address payable newFeeWallet) external onlyOwner { require(newFeeWallet != address(0), "ZERO ADDRESS"); feeWallet = newFeeWallet; } // To recieve ETH from pcsV2Router when swaping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate()); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity); } function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) { uint256 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _totalSupply; if (rSupply < _rTotal.div(_totalSupply)) { return (_rTotal, _totalSupply); } return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(taxFee).div(100); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(liquidityFee + burnFee + walletFee + buybackFee).div(100); } function removeAllFee() private { if(taxFee == 0 && liquidityFee == 0 && burnFee == 0 && walletFee == 0 && buybackFee == 0) return; _previousTaxFee = taxFee; _previousLiquidityFee = liquidityFee; _previousBurnFee = burnFee; _previousWalletFee = walletFee; _previousBuybackFee = buybackFee; taxFee = 0; liquidityFee = 0; burnFee = 0; walletFee = 0; buybackFee = 0; } function restoreAllFee() private { taxFee = _previousTaxFee; liquidityFee = _previousLiquidityFee; burnFee = _previousBurnFee; walletFee = _previousWalletFee; buybackFee = _previousBuybackFee; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from zero address"); require(spender != address(0), "ERC20: approve to zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from zero address"); require(to != address(0), "ERC20: transfer to 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."); } if(from != owner() && to != owner() && to != address(0) && to != _dead && to != pcsV2Pair){ uint256 contractBalanceRecepient = balanceOf(to); require(contractBalanceRecepient + amount <= maxWalletAmount, "Exceeds maximum wallet amount"); } // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is MimoProtocol pair. uint256 contractTokenBalance = balanceOf(address(this)); if(contractTokenBalance >= maxTxAmount) { contractTokenBalance = maxTxAmount; } bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; if (!_inSwapAndLiquify && to == pcsV2Pair && swapAndLiquifyEnabled) { if(overMinTokenBalance) { contractTokenBalance = numTokensSellToAddToLiquidity; //add liquidity swapAndLiquify(contractTokenBalance); } if(buybackFee !=0) { uint256 balance = address(this).balance; if (balance > _buyBackMinLimit) { if (balance > _buyBackUpperLimit) { balance = _buyBackUpperLimit; } buyBackTokens(balance); } } } // Indicates if fee should be deducted from transfer bool takeFee = true; // If any account belongs to _isExcludedFromFee account then remove the fee if(isExcludedFromFee(from) || isExcludedFromFee(to)) { takeFee = false; } // Transfer amount, it will take tax, burn, liquidity fee _tokenTransfer(from, to, amount, takeFee); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { // This needs to be distributed among burn, wallet and liquidity burn uint8 totFee = burnFee + walletFee + liquidityFee + buybackFee; uint256 spentAmount = 0; uint256 totSpentAmount = 0; if(burnFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(burnFee); _tokenTransferNoFee(address(this), _dead, spentAmount); totSpentAmount = spentAmount; } if(walletFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(walletFee); _tokenTransferNoFee(address(this), feeWallet, spentAmount); totSpentAmount = totSpentAmount + spentAmount; } if(buybackFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(buybackFee); swapTokensForETH(spentAmount); totSpentAmount = totSpentAmount + spentAmount; } if(liquidityFee != 0) { contractTokenBalance = contractTokenBalance.sub(totSpentAmount); // Split the contract balance into halves uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.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 MimoProtocol addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } } function buyBackTokens(uint256 amount) private lockTheSwap { if (amount > 0) { swapETHForTokens(amount); } } function swapTokensForETH(uint256 tokenAmount) private { // generate the MimoProtocol pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = pcsV2Router.WETH(); _approve(address(this), address(pcsV2Router), tokenAmount); // make the swap uint256 minAmount = uint256(1 * 10**_decimals).div(100); // 0.01 token pcsV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, minAmount, // accept min 0.01 amount of Tokens path, address(this), block.timestamp ); } function swapETHForTokens(uint256 amount) private { // generate the MimoProtocol pair path of token -> weth address[] memory path = new address[](2); path[0] = pcsV2Router.WETH(); path[1] = address(this); // make the swap uint256 minAmount = uint256(1 * 10**_decimals).div(100); // 0.01 token pcsV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( minAmount, // accept min 0.01 amount of Tokens path, _dead, // Burn address block.timestamp.add(300) ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(pcsV2Router), tokenAmount); // add the liquidity pcsV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable _dead, block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private { if(!takeFee) { removeAllFee(); } _transferStandard(sender, recipient, amount); if(!takeFee) { restoreAllFee(); } } function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _tokenTransferNoFee(address sender, address recipient, uint256 amount) private { uint256 currentRate = _getRate(); uint256 rAmount = amount.mul(currentRate); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rAmount); emit Transfer(sender, recipient, amount); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"NewDelay","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":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":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMxTxPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMxWalletPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Router","outputs":[{"internalType":"contract IMimoV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFeeWallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","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":"taxFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600436106102555760003560e01c80638da5cb5b11610139578063b09f1266116100b6578063dd4670641161007a578063dd467064146108e3578063dd62ed3e1461090c578063f25f4b5614610949578063f2fde38b14610974578063f887ea401461099d578063fce589d8146109c85761025c565b8063b09f12661461080c578063b6c5232414610837578063bdc653ef14610862578063d12a76881461088d578063d28d8852146108b85761025c565b8063a457c2d7116100fd578063a457c2d714610725578063a69df4b514610762578063a9059cbb14610779578063aa4bde28146107b6578063ac557f66146107e15761025c565b80638da5cb5b1461065057806390d49b9d1461067b57806395d89b41146106a457806398118cb4146106cf578063a071dcf4146106fa5761025c565b80633b2d081c116101d25780635214329011610196578063521432901461053e5780635342acb41461056957806370690b11146105a657806370a08231146105d1578063715018a61461060e5780638c0b5e22146106255761025c565b80633b2d081c146104575780633bd5d173146104825780633eaaf86b146104ab5780634549b039146104d65780634a74bb02146105135761025c565b80632d6abf87116102195780632d6abf871461035c5780632d83811914610387578063313ce567146103c4578063324f8dbf146103ef578063395093511461041a5761025c565b806306fdde0314610261578063095ea7b31461028c57806313114a9d146102c957806318160ddd146102f457806323b872dd1461031f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766109f3565b6040516102839190613f55565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613a0e565b610a85565b6040516102c09190613f1f565b60405180910390f35b3480156102d557600080fd5b506102de610aa3565b6040516102eb9190614197565b60405180910390f35b34801561030057600080fd5b50610309610aad565b6040516103169190614197565b60405180910390f35b34801561032b57600080fd5b50610346600480360381019061034191906139bb565b610ab7565b6040516103539190613f1f565b60405180910390f35b34801561036857600080fd5b50610371610b90565b60405161037e9190613f3a565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613a4e565b610bb4565b6040516103bb9190614197565b60405180910390f35b3480156103d057600080fd5b506103d9610c22565b6040516103e6919061428f565b60405180910390f35b3480156103fb57600080fd5b50610404610c39565b604051610411919061428f565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190613a0e565b610c4c565b60405161044e9190613f1f565b60405180910390f35b34801561046357600080fd5b5061046c610cff565b604051610479919061428f565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613a4e565b610d12565b005b3480156104b757600080fd5b506104c0610e00565b6040516104cd9190614197565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613a7b565b610e06565b60405161050a9190614197565b60405180910390f35b34801561051f57600080fd5b50610528610e8a565b6040516105359190613f1f565b60405180910390f35b34801561054a57600080fd5b50610553610e9d565b6040516105609190613e88565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b91906138f4565b610ec1565b60405161059d9190613f1f565b60405180910390f35b3480156105b257600080fd5b506105bb610f17565b6040516105c8919061428f565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f391906138f4565b610f2a565b6040516106059190614197565b60405180910390f35b34801561061a57600080fd5b50610623610f7b565b005b34801561063157600080fd5b5061063a6110e9565b6040516106479190614197565b60405180910390f35b34801561065c57600080fd5b506106656110ef565b6040516106729190613e88565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d919061394e565b611118565b005b3480156106b057600080fd5b506106b9611261565b6040516106c69190613f55565b60405180910390f35b3480156106db57600080fd5b506106e46112f3565b6040516106f1919061428f565b60405180910390f35b34801561070657600080fd5b5061070f611306565b60405161071c919061428f565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613a0e565b611319565b6040516107599190613f1f565b60405180910390f35b34801561076e57600080fd5b506107776113e6565b005b34801561078557600080fd5b506107a0600480360381019061079b9190613a0e565b611610565b6040516107ad9190613f1f565b60405180910390f35b3480156107c257600080fd5b506107cb61162e565b6040516107d89190614197565b60405180910390f35b3480156107ed57600080fd5b506107f6611634565b604051610803919061428f565b60405180910390f35b34801561081857600080fd5b50610821611647565b60405161082e9190613f55565b60405180910390f35b34801561084357600080fd5b5061084c6116d5565b6040516108599190614197565b60405180910390f35b34801561086e57600080fd5b506108776116df565b6040516108849190614197565b60405180910390f35b34801561089957600080fd5b506108a26116e9565b6040516108af9190614197565b60405180910390f35b3480156108c457600080fd5b506108cd6116ef565b6040516108da9190613f55565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613a4e565b61177d565b005b34801561091857600080fd5b50610933600480360381019061092e919061397b565b611973565b6040516109409190614197565b60405180910390f35b34801561095557600080fd5b5061095e6119fa565b60405161096b9190613ea3565b60405180910390f35b34801561098057600080fd5b5061099b600480360381019061099691906138f4565b611a20565b005b3480156109a957600080fd5b506109b2611be2565b6040516109bf9190613e88565b60405180910390f35b3480156109d457600080fd5b506109dd611c08565b6040516109ea919061428f565b60405180910390f35b6060600b8054610a029061468c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2e9061468c565b8015610a7b5780601f10610a5057610100808354040283529160200191610a7b565b820191906000526020600020905b815481529060010190602001808311610a5e57829003601f168201915b5050505050905090565b6000610a99610a92611ce0565b8484611ce8565b6001905092915050565b6000600a54905090565b6000600854905090565b6000610ac4848484611eb3565b610b8584610ad0611ce0565b610b8085604051806060016040528060288152602001614bec60289139600660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b36611ce0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461239f9092919063ffffffff16565b611ce8565b600190509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600954821115610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290614037565b60405180910390fd5b6000610c05612403565b9050610c1a8184611c9690919063ffffffff16565b915050919050565b6000600d60009054906101000a900460ff16905090565b600e60169054906101000a900460ff1681565b6000610cf5610c59611ce0565b84610cf08560066000610c6a611ce0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242e90919063ffffffff16565b611ce8565b6001905092915050565b600d60099054906101000a900460ff1681565b6000610d1c611ce0565b90506000610d298361248c565b50505050509050610d8281600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e890919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dda816009546124e890919063ffffffff16565b600981905550610df583600a5461242e90919063ffffffff16565b600a81905550505050565b60085481565b6000600854831115610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4490613f97565b60405180910390fd5b81610e6d576000610e5d8461248c565b5050505050905080915050610e84565b6000610e788461248c565b50505050915050809150505b92915050565b600e60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601060009054906101000a900460ff1681565b6000610f74600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bb4565b9050919050565b610f83611ce0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790614097565b60405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611120611ce0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490614097565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611214906140f7565b60405180910390fd5b80600d600b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600c80546112709061468c565b80601f016020809104026020016040519081016040528092919081815260200182805461129c9061468c565b80156112e95780601f106112be576101008083540402835291602001916112e9565b820191906000526020600020905b8154815290600101906020018083116112cc57829003601f168201915b5050505050905090565b600d60039054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b60006113dc611326611ce0565b846113d785604051806060016040528060258152602001614c146025913960066000611350611ce0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461239f9092919063ffffffff16565b611ce8565b6001905092915050565b60001515600360009054906101000a900460ff1615151461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614117565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c390614157565b60405180910390fd5b6002544211611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790614137565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b600061162461161d611ce0565b8484611eb3565b6001905092915050565b60115481565b600d60079054906101000a900460ff1681565b600c80546116549061468c565b80601f01602080910402602001604051908101604052809291908181526020018280546116809061468c565b80156116cd5780601f106116a2576101008083540402835291602001916116cd565b820191906000526020600020905b8154815290600101906020018083116116b057829003601f168201915b505050505081565b6000600254905090565b6000601354905090565b60125481565b600b80546116fc9061468c565b80601f01602080910402602001604051908101604052809291908181526020018280546117289061468c565b80156117755780601f1061174a57610100808354040283529160200191611775565b820191906000526020600020905b81548152906001019060200180831161175857829003601f168201915b505050505081565b611785611ce0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990614097565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080426118c091906142ff565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36002547f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c60405160405180910390a250565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a28611ce0565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90614097565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613fb7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60059054906101000a900460ff1681565b600080831415611c2e5760009050611c90565b60008284611c3c919061452e565b9050828482611c4b919061438c565b14611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290614077565b60405180910390fd5b809150505b92915050565b6000611cd883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612532565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f90614177565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf90613f77565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ea69190614197565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a90613ff7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614017565b60405180910390fd5b60008111611fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcd906140d7565b60405180910390fd5b611fde6110ef565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561204c575061201c6110ef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561209757600f54811115612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614057565b60405180910390fd5b5b61209f6110ef565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561210d57506120dd6110ef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156121465750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156121a05750600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156121f857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561225c57600061220883610f2a565b9050601154828261221991906142ff565b111561225a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612251906140b7565b60405180910390fd5b505b600061226730610f2a565b9050600f54811061227857600f5490505b60006012548210159050600e60149054906101000a900460ff161580156122ea57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b80156123025750600e60159054906101000a900460ff165b1561236257801561231c57601254915061231b82612595565b5b6000600d60099054906101000a900460ff1660ff161461236157600047905060145481111561235f576013548111156123555760135490505b61235e8161288a565b5b505b5b60006001905061237186610ec1565b80612381575061238085610ec1565b5b1561238b57600090505b612397868686846128d6565b505050505050565b60008383111582906123e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123de9190613f55565b60405180910390fd5b50600083856123f69190614588565b9050809150509392505050565b6000806000612410612903565b915091506124278183611c9690919063ffffffff16565b9250505090565b600080828461243d91906142ff565b905083811015612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990613fd7565b60405180910390fd5b8091505092915050565b60008060008060008060008060006124a38a612950565b92509250925060008060006124c18d86866124bc612403565b6129aa565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061252a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061239f565b905092915050565b60008083118290612579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125709190613f55565b60405180910390fd5b5060008385612588919061438c565b9050809150509392505050565b6001600e60146101000a81548160ff0219169083151502179055506000600d60099054906101000a900460ff16600d60039054906101000a900460ff16600d60079054906101000a900460ff16600d60059054906101000a900460ff166125fc9190614355565b6126069190614355565b6126109190614355565b90506000806000600d60059054906101000a900460ff1660ff161461269c57612669600d60059054906101000a900460ff1660ff1661265b8560ff1687611c9690919063ffffffff16565b611c1b90919063ffffffff16565b915061269830600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a33565b8190505b6000600d60079054906101000a900460ff1660ff161461272e576126f0600d60079054906101000a900460ff1660ff166126e28560ff1687611c9690919063ffffffff16565b611c1b90919063ffffffff16565b915061271f30600d600b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a33565b818161272b91906142ff565b90505b6000600d60099054906101000a900460ff1660ff161461279c57612782600d60099054906101000a900460ff1660ff166127748560ff1687611c9690919063ffffffff16565b611c1b90919063ffffffff16565b915061278d82612bec565b818161279991906142ff565b90505b6000600d60039054906101000a900460ff1660ff1614612869576127c981856124e890919063ffffffff16565b935060006127e1600286611c9690919063ffffffff16565b905060006127f882876124e890919063ffffffff16565b9050600047905061280883612bec565b600061281d82476124e890919063ffffffff16565b90506128298382612e77565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161285c93929190614258565b60405180910390a1505050505b5050506000600e60146101000a81548160ff02191690831515021790555050565b6001600e60146101000a81548160ff02191690831515021790555060008111156128b8576128b781612f82565b5b6000600e60146101000a81548160ff02191690831515021790555050565b806128e4576128e3613217565b5b6128ef848484613410565b806128fd576128fc6135db565b5b50505050565b600080600060095490506000600854905061292b600854600954611c9690919063ffffffff16565b8210156129435760095460085493509350505061294c565b81819350935050505b9091565b60008060008061295f856136af565b9050600061296c866136f0565b9050600061299582612987858a6124e890919063ffffffff16565b6124e890919063ffffffff16565b90508083839550955095505050509193909250565b6000806000806129c38589611c1b90919063ffffffff16565b905060006129da8689611c1b90919063ffffffff16565b905060006129f18789611c1b90919063ffffffff16565b90506000612a1a82612a0c85876124e890919063ffffffff16565b6124e890919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000612a3d612403565b90506000612a548284611c1b90919063ffffffff16565b9050612aa881600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e890919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b3d81600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242e90919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612bdd9190614197565b60405180910390a35050505050565b6000600267ffffffffffffffff811115612c0957612c0861477a565b5b604051908082528060200260200182016040528015612c375781602001602082028036833780820191505090505b5090503081600081518110612c4f57612c4e61474b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612cef57600080fd5b505afa158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190613921565b81600181518110612d3b57612d3a61474b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612da0307f000000000000000000000000000000000000000000000000000000000000000084611ce8565b6000612ddd6064600d60009054906101000a900460ff16600a612dc39190614410565b6001612dcf919061452e565b611c9690919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94784838530426040518663ffffffff1660e01b8152600401612e409594939291906141fe565b600060405180830381600087803b158015612e5a57600080fd5b505af1158015612e6e573d6000803e3d6000fd5b50505050505050565b612ea2307f000000000000000000000000000000000000000000000000000000000000000084611ce8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612f2996959493929190613ebe565b6060604051808303818588803b158015612f4257600080fd5b505af1158015612f56573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f7b9190613abb565b5050505050565b6000600267ffffffffffffffff811115612f9f57612f9e61477a565b5b604051908082528060200260200182016040528015612fcd5781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561303657600080fd5b505afa15801561304a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306e9190613921565b816000815181106130825761308161474b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106130d1576130d061474b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006131486064600d60009054906101000a900460ff16600a61312e9190614410565b600161313a919061452e565b611c9690919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de95848385600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166131c161012c4261242e90919063ffffffff16565b6040518663ffffffff1660e01b81526004016131e094939291906141b2565b6000604051808303818588803b1580156131f957600080fd5b505af115801561320d573d6000803e3d6000fd5b5050505050505050565b6000600d60019054906101000a900460ff1660ff1614801561324b57506000600d60039054906101000a900460ff1660ff16145b801561326957506000600d60059054906101000a900460ff1660ff16145b801561328757506000600d60079054906101000a900460ff1660ff16145b80156132a557506000600d60099054906101000a900460ff1660ff16145b156132af5761340e565b600d60019054906101000a900460ff16600d60026101000a81548160ff021916908360ff160217905550600d60039054906101000a900460ff16600d60046101000a81548160ff021916908360ff160217905550600d60059054906101000a900460ff16600d60066101000a81548160ff021916908360ff160217905550600d60079054906101000a900460ff16600d60086101000a81548160ff021916908360ff160217905550600d60099054906101000a900460ff16600d600a6101000a81548160ff021916908360ff1602179055506000600d60016101000a81548160ff021916908360ff1602179055506000600d60036101000a81548160ff021916908360ff1602179055506000600d60056101000a81548160ff021916908360ff1602179055506000600d60076101000a81548160ff021916908360ff1602179055506000600d60096101000a81548160ff021916908360ff1602179055505b565b6000806000806000806134228761248c565b95509550955095509550955061348086600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124e890919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061351585600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242e90919063ffffffff16565b600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135618161377f565b61356b848361383c565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516135c89190614197565b60405180910390a3505050505050505050565b600d60029054906101000a900460ff16600d60016101000a81548160ff021916908360ff160217905550600d60049054906101000a900460ff16600d60036101000a81548160ff021916908360ff160217905550600d60069054906101000a900460ff16600d60056101000a81548160ff021916908360ff160217905550600d60089054906101000a900460ff16600d60076101000a81548160ff021916908360ff160217905550600d600a9054906101000a900460ff16600d60096101000a81548160ff021916908360ff160217905550565b60006136e960646136db600d60019054906101000a900460ff1660ff1685611c1b90919063ffffffff16565b611c9690919063ffffffff16565b9050919050565b6000613778606461376a600d60099054906101000a900460ff16600d60079054906101000a900460ff16600d60059054906101000a900460ff16600d60039054906101000a900460ff166137449190614355565b61374e9190614355565b6137589190614355565b60ff1685611c1b90919063ffffffff16565b611c9690919063ffffffff16565b9050919050565b6000613789612403565b905060006137a08284611c1b90919063ffffffff16565b90506137f481600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461242e90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b613851826009546124e890919063ffffffff16565b60098190555061386c81600a5461242e90919063ffffffff16565b600a819055505050565b60008135905061388581614b8f565b92915050565b60008151905061389a81614b8f565b92915050565b6000813590506138af81614ba6565b92915050565b6000813590506138c481614bbd565b92915050565b6000813590506138d981614bd4565b92915050565b6000815190506138ee81614bd4565b92915050565b60006020828403121561390a576139096147a9565b5b600061391884828501613876565b91505092915050565b600060208284031215613937576139366147a9565b5b60006139458482850161388b565b91505092915050565b600060208284031215613964576139636147a9565b5b6000613972848285016138a0565b91505092915050565b60008060408385031215613992576139916147a9565b5b60006139a085828601613876565b92505060206139b185828601613876565b9150509250929050565b6000806000606084860312156139d4576139d36147a9565b5b60006139e286828701613876565b93505060206139f386828701613876565b9250506040613a04868287016138ca565b9150509250925092565b60008060408385031215613a2557613a246147a9565b5b6000613a3385828601613876565b9250506020613a44858286016138ca565b9150509250929050565b600060208284031215613a6457613a636147a9565b5b6000613a72848285016138ca565b91505092915050565b60008060408385031215613a9257613a916147a9565b5b6000613aa0858286016138ca565b9250506020613ab1858286016138b5565b9150509250929050565b600080600060608486031215613ad457613ad36147a9565b5b6000613ae2868287016138df565b9350506020613af3868287016138df565b9250506040613b04868287016138df565b9150509250925092565b6000613b1a8383613b35565b60208301905092915050565b613b2f816145ce565b82525050565b613b3e816145bc565b82525050565b613b4d816145bc565b82525050565b6000613b5e826142ba565b613b6881856142dd565b9350613b73836142aa565b8060005b83811015613ba4578151613b8b8882613b0e565b9750613b96836142d0565b925050600181019050613b77565b5085935050505092915050565b613bba816145e0565b82525050565b613bc981614623565b82525050565b613bd881614647565b82525050565b6000613be9826142c5565b613bf381856142ee565b9350613c03818560208601614659565b613c0c816147ae565b840191505092915050565b6000613c24601e836142ee565b9150613c2f826147cc565b602082019050919050565b6000613c47601c836142ee565b9150613c52826147f5565b602082019050919050565b6000613c6a6026836142ee565b9150613c758261481e565b604082019050919050565b6000613c8d601b836142ee565b9150613c988261486d565b602082019050919050565b6000613cb06021836142ee565b9150613cbb82614896565b604082019050919050565b6000613cd3601f836142ee565b9150613cde826148e5565b602082019050919050565b6000613cf6601e836142ee565b9150613d018261490e565b602082019050919050565b6000613d196028836142ee565b9150613d2482614937565b604082019050919050565b6000613d3c6021836142ee565b9150613d4782614986565b604082019050919050565b6000613d5f6020836142ee565b9150613d6a826149d5565b602082019050919050565b6000613d82601d836142ee565b9150613d8d826149fe565b602082019050919050565b6000613da56029836142ee565b9150613db082614a27565b604082019050919050565b6000613dc8600c836142ee565b9150613dd382614a76565b602082019050919050565b6000613deb602f836142ee565b9150613df682614a9f565b604082019050919050565b6000613e0e601f836142ee565b9150613e1982614aee565b602082019050919050565b6000613e316036836142ee565b9150613e3c82614b17565b604082019050919050565b6000613e546020836142ee565b9150613e5f82614b66565b602082019050919050565b613e738161460c565b82525050565b613e8281614616565b82525050565b6000602082019050613e9d6000830184613b44565b92915050565b6000602082019050613eb86000830184613b26565b92915050565b600060c082019050613ed36000830189613b44565b613ee06020830188613e6a565b613eed6040830187613bcf565b613efa6060830186613bcf565b613f076080830185613b44565b613f1460a0830184613e6a565b979650505050505050565b6000602082019050613f346000830184613bb1565b92915050565b6000602082019050613f4f6000830184613bc0565b92915050565b60006020820190508181036000830152613f6f8184613bde565b905092915050565b60006020820190508181036000830152613f9081613c17565b9050919050565b60006020820190508181036000830152613fb081613c3a565b9050919050565b60006020820190508181036000830152613fd081613c5d565b9050919050565b60006020820190508181036000830152613ff081613c80565b9050919050565b6000602082019050818103600083015261401081613ca3565b9050919050565b6000602082019050818103600083015261403081613cc6565b9050919050565b6000602082019050818103600083015261405081613ce9565b9050919050565b6000602082019050818103600083015261407081613d0c565b9050919050565b6000602082019050818103600083015261409081613d2f565b9050919050565b600060208201905081810360008301526140b081613d52565b9050919050565b600060208201905081810360008301526140d081613d75565b9050919050565b600060208201905081810360008301526140f081613d98565b9050919050565b6000602082019050818103600083015261411081613dbb565b9050919050565b6000602082019050818103600083015261413081613dde565b9050919050565b6000602082019050818103600083015261415081613e01565b9050919050565b6000602082019050818103600083015261417081613e24565b9050919050565b6000602082019050818103600083015261419081613e47565b9050919050565b60006020820190506141ac6000830184613e6a565b92915050565b60006080820190506141c76000830187613e6a565b81810360208301526141d98186613b53565b90506141e86040830185613b44565b6141f56060830184613e6a565b95945050505050565b600060a0820190506142136000830188613e6a565b6142206020830187613e6a565b81810360408301526142328186613b53565b90506142416060830185613b44565b61424e6080830184613e6a565b9695505050505050565b600060608201905061426d6000830186613e6a565b61427a6020830185613e6a565b6142876040830184613e6a565b949350505050565b60006020820190506142a46000830184613e79565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061430a8261460c565b91506143158361460c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561434a576143496146be565b5b828201905092915050565b600061436082614616565b915061436b83614616565b92508260ff03821115614381576143806146be565b5b828201905092915050565b60006143978261460c565b91506143a28361460c565b9250826143b2576143b16146ed565b5b828204905092915050565b6000808291508390505b6001851115614407578086048111156143e3576143e26146be565b5b60018516156143f25780820291505b8081029050614400856147bf565b94506143c7565b94509492505050565b600061441b8261460c565b915061442683614616565b92506144537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461445b565b905092915050565b60008261446b5760019050614527565b816144795760009050614527565b816001811461448f5760028114614499576144c8565b6001915050614527565b60ff8411156144ab576144aa6146be565b5b8360020a9150848211156144c2576144c16146be565b5b50614527565b5060208310610133831016604e8410600b84101617156144fd5782820a9050838111156144f8576144f76146be565b5b614527565b61450a84848460016143bd565b92509050818404811115614521576145206146be565b5b81810290505b9392505050565b60006145398261460c565b91506145448361460c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561457d5761457c6146be565b5b828202905092915050565b60006145938261460c565b915061459e8361460c565b9250828210156145b1576145b06146be565b5b828203905092915050565b60006145c7826145ec565b9050919050565b60006145d9826145ec565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061462e82614635565b9050919050565b6000614640826145ec565b9050919050565b60006146528261460c565b9050919050565b60005b8381101561467757808201518184015260208101905061465c565b83811115614686576000848401525b50505050565b600060028204905060018216806146a457607f821691505b602082108114156146b8576146b761471c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a20617070726f766520746f207a65726f20616464726573730000600082015250565b7f416d74206d757374206265206c657373207468616e20737570706c7900000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f45524332303a207472616e736665722066726f6d207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220746f207a65726f206164647265737300600082015250565b7f416d74206d757374206265206c657373207468616e20746f74207265666c0000600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d6178696d756d2077616c6c657420616d6f756e74000000600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f5a45524f20414444524553530000000000000000000000000000000000000000600082015250565b7f4f776e657273686970206f662074686520636f6e74726163742068617320626560008201527f656e2072656c696e717569736865640000000000000000000000000000000000602082015250565b7f436f6e7472616374206973206c6f636b656420756e74696c2037206461797300600082015250565b7f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60008201527f6f636b2074686520746f6b656e20636f6e747261637400000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d207a65726f2061646472657373600082015250565b614b98816145bc565b8114614ba357600080fd5b50565b614baf816145ce565b8114614bba57600080fd5b50565b614bc6816145e0565b8114614bd157600080fd5b50565b614bdd8161460c565b8114614be857600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200f7e825fd3741e31ac63dddbd5407e9aa723f32e29e0b40928e3f4faad9093e964736f6c63430008060033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for
interesting conversations.