Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 114 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 17494997 | 998 days ago | IN | 0 ETH | 0.00047762 | ||||
| Approve | 15884788 | 1225 days ago | IN | 0 ETH | 0.00097441 | ||||
| Approve | 15852404 | 1229 days ago | IN | 0 ETH | 0.00063783 | ||||
| Approve | 15844663 | 1230 days ago | IN | 0 ETH | 0.00022793 | ||||
| Approve | 15839316 | 1231 days ago | IN | 0 ETH | 0.00066592 | ||||
| Approve | 15838988 | 1231 days ago | IN | 0 ETH | 0.00084969 | ||||
| Approve | 15838380 | 1231 days ago | IN | 0 ETH | 0.00054818 | ||||
| Approve | 15838374 | 1231 days ago | IN | 0 ETH | 0.00054806 | ||||
| Approve | 15833070 | 1232 days ago | IN | 0 ETH | 0.00286896 | ||||
| Approve | 15831839 | 1232 days ago | IN | 0 ETH | 0.00059544 | ||||
| Approve | 15830201 | 1232 days ago | IN | 0 ETH | 0.00047634 | ||||
| Approve | 15830198 | 1232 days ago | IN | 0 ETH | 0.00049613 | ||||
| Approve | 15829329 | 1232 days ago | IN | 0 ETH | 0.00065841 | ||||
| Approve | 15828326 | 1232 days ago | IN | 0 ETH | 0.00093015 | ||||
| Approve | 15828223 | 1232 days ago | IN | 0 ETH | 0.00070464 | ||||
| Approve | 15828193 | 1232 days ago | IN | 0 ETH | 0.00111957 | ||||
| Approve | 15828179 | 1232 days ago | IN | 0 ETH | 0.00079195 | ||||
| Approve | 15828116 | 1232 days ago | IN | 0 ETH | 0.00515494 | ||||
| Approve | 15828075 | 1232 days ago | IN | 0 ETH | 0.00080526 | ||||
| Transfer | 15828075 | 1232 days ago | IN | 0 ETH | 0.0019863 | ||||
| Approve | 15828073 | 1232 days ago | IN | 0 ETH | 0.0008844 | ||||
| Approve | 15828044 | 1232 days ago | IN | 0 ETH | 0.00065773 | ||||
| Transfer | 15828039 | 1232 days ago | IN | 0 ETH | 0.00178927 | ||||
| Approve | 15828030 | 1232 days ago | IN | 0 ETH | 0.00074009 | ||||
| Approve | 15828001 | 1232 days ago | IN | 0 ETH | 0.00085674 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 15828204 | 1232 days ago | 0.0153703 ETH | ||||
| Transfer | 15828204 | 1232 days ago | 0.03173179 ETH | ||||
| Transfer | 15828204 | 1232 days ago | 0.00006465 ETH | ||||
| Add Liquidity ET... | 15828204 | 1232 days ago | 0.00356103 ETH | ||||
| Transfer | 15828204 | 1232 days ago | 0.05059846 ETH | ||||
| Transfer | 15827939 | 1232 days ago | 0.09841991 ETH | ||||
| Transfer | 15827939 | 1232 days ago | 0.20472207 ETH | ||||
| Transfer | 15827939 | 1232 days ago | 0.00183013 ETH | ||||
| Add Liquidity ET... | 15827939 | 1232 days ago | 0.02414744 ETH | ||||
| Transfer | 15827939 | 1232 days ago | 0.3254593 ETH | ||||
| Transfer | 15826384 | 1233 days ago | 0.01634164 ETH | ||||
| Transfer | 15826384 | 1233 days ago | 0.03253073 ETH | ||||
| Transfer | 15826384 | 1233 days ago | 0.00007627 ETH | ||||
| Add Liquidity ET... | 15826384 | 1233 days ago | 0.00406634 ETH | ||||
| Transfer | 15826384 | 1233 days ago | 0.05286244 ETH | ||||
| Transfer | 15826105 | 1233 days ago | 0.02270094 ETH | ||||
| Transfer | 15826105 | 1233 days ago | 0.0499144 ETH | ||||
| Transfer | 15826105 | 1233 days ago | 0.00015738 ETH | ||||
| Add Liquidity ET... | 15826105 | 1233 days ago | 0.00563588 ETH | ||||
| Transfer | 15826105 | 1233 days ago | 0.07809385 ETH | ||||
| Transfer | 15826065 | 1233 days ago | 0.05182265 ETH | ||||
| Transfer | 15826065 | 1233 days ago | 0.08875571 ETH | ||||
| Transfer | 15826065 | 1233 days ago | 0.00116184 ETH | ||||
| Add Liquidity ET... | 15826065 | 1233 days ago | 0.01580667 ETH | ||||
| Transfer | 15826065 | 1233 days ago | 0.15522319 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ProofSFM
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-10-25
*/
/**
$SFM2.0 Token
Proof of Safemoon is a Safemoon based concept USDC reflective, with a lot of new features
and improves that make it very, and more profitable in holding.
- Governance: Holders vote, in private TG, every 5 hours the Sell Reflex Tax
to apply (30%max).
- Smart Double Burn: Is a feature that boost the ETHs in liquidity, burning the
double of SFM2.0, decreasing the total supply.
- 2X speed Liq Floor: Is a new LP burn method that make that price floor increase
2x quick than normal LP burning.
And more…
Website: http://www.proofsfm.com
Twitter: https://twitter.com/proofsfm
TG: https://t.me/proofofsafmoon
Medium: https://medium.com/@ProofSFM2.0
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `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);
}
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _createInitialSupply(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
interface DividendPayingTokenOptionalInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(address _owner, address _rewardToken) external view returns(uint256);
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(address _owner, address _rewardToken) external view returns(uint256);
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(address _owner, address _rewardToken) external view returns(uint256);
}
interface DividendPayingTokenInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner, address _rewardToken) external view returns(uint256);
/// @notice Distributes ether to token holders as dividends.
/// @dev SHOULD distribute the paid ether to token holders as dividends.
/// SHOULD NOT directly transfer ether to token holders in this function.
/// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
function distributeDividends() external payable;
/// @notice Withdraws the ether distributed to the sender.
/// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
/// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
function withdrawDividend(address _rewardToken) external;
/// @dev This event MUST emit when ether is distributed to token holders.
/// @param from The address which sends ether to this contract.
/// @param weiAmount The amount of distributed ether in wei.
event DividendsDistributed(
address indexed from,
uint256 weiAmount
);
/// @dev This event MUST emit when an address withdraws their dividend.
/// @param to The address which withdraws ether from this contract.
/// @param weiAmount The amount of withdrawn ether in wei.
event DividendWithdrawn(
address indexed to,
uint256 weiAmount
);
}
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;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
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;
}
}
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
/**
* @dev Multiplies two int256 variables and fails on overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
// Detect overflow when multiplying MIN_INT256 with -1
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
/**
* @dev Division of two int256 variables and fails on overflow.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
// Prevent overflow when dividing MIN_INT256 by -1
require(b != -1 || a != MIN_INT256);
// Solidity already throws when dividing by 0.
return a / b;
}
/**
* @dev Subtracts two int256 variables and fails on overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
/**
* @dev Adds two int256 variables and fails on overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
/**
* @dev Converts to absolute value, and fails on overflow.
*/
function abs(int256 a) internal pure returns (int256) {
require(a != MIN_INT256);
return a < 0 ? -a : a;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
// With `magnitude`, we can properly distribute dividends even if the amount of received usdc is small.
// For more discussion about choosing the value of `magnitude`,
uint256 constant internal magnitude = 2**128;
mapping(address => uint256) internal magnifiedDividendPerShare;
address[] public rewardTokens;
address public nextRewardToken;
uint256 public rewardTokenCounter;
IUniswapV2Router02 public immutable uniswapV2Router;
// About dividendCorrection:
// If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
// When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
// `dividendOf(_user)` should not be changed,
// but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
// To keep the `dividendOf(_user)` unchanged, we add a correction term:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
// where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
// `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
// So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
mapping(address => mapping(address => int256)) internal magnifiedDividendCorrections;
mapping(address => mapping(address => uint256)) internal withdrawnDividends;
mapping (address => uint256) public holderBalance;
uint256 public totalBalance;
mapping(address => uint256) public totalDividendsDistributed;
constructor(){
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // router
uniswapV2Router = _uniswapV2Router;
// Mainnet
rewardTokens.push(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)); // USDC
nextRewardToken = rewardTokens[0];
}
/// @dev Distributes dividends whenever ether is paid to this contract.
receive() external payable {
distributeDividends();
}
/// @notice Distributes ether to token holders as dividends.
/// @dev It reverts if the total supply of tokens is 0.
/// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
/// About undistributed ether:
/// In each distribution, there is a small amount of ether not distributed,
/// the magnified amount of which is
/// `(msg.value * magnitude) % totalSupply()`.
/// With a well-chosen `magnitude`, the amount of undistributed ether
/// (de-magnified) in a distribution can be less than 1 wei.
/// We can actually keep track of the undistributed ether in a distribution
/// and try to distribute it in the next distribution,
/// but keeping track of such data on-chain costs much more than
/// the saved ether, so we don't do that.
function distributeDividends() public override payable {
require(totalBalance > 0);
uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this));
buyTokens(msg.value, nextRewardToken);
uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance);
if (newBalance > 0) {
magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add(
(newBalance).mul(magnitude) / totalBalance
);
emit DividendsDistributed(msg.sender, newBalance);
totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance);
}
rewardTokenCounter = rewardTokenCounter == rewardTokens.length - 1 ? 0 : rewardTokenCounter + 1;
nextRewardToken = rewardTokens[rewardTokenCounter];
}
function buyTokens(uint256 ethAmountInWei, address rewardToken) internal {
// generate the uniswap pair path of weth -> eth
address[] memory path = new address[](2);
path[0] = uniswapV2Router.WETH();
path[1] = rewardToken;
// make the swap
uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmountInWei}(
0, // accept any amount of Ethereum
path,
address(this),
block.timestamp
);
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function withdrawDividend(address _rewardToken) external virtual override {
_withdrawDividendOfUser(payable(msg.sender), _rewardToken);
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function _withdrawDividendOfUser(address payable user, address _rewardToken) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken);
if (_withdrawableDividend > 0) {
withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend);
emit DividendWithdrawn(user, _withdrawableDividend);
IERC20(_rewardToken).transfer(user, _withdrawableDividend);
return _withdrawableDividend;
}
return 0;
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner, address _rewardToken) external view override returns(uint256) {
return withdrawableDividendOf(_owner, _rewardToken);
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(address _owner, address _rewardToken) public view override returns(uint256) {
return accumulativeDividendOf(_owner,_rewardToken).sub(withdrawnDividends[_owner][_rewardToken]);
}
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(address _owner, address _rewardToken) external view override returns(uint256) {
return withdrawnDividends[_owner][_rewardToken];
}
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(address _owner, address _rewardToken) public view override returns(uint256) {
return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe()
.add(magnifiedDividendCorrections[_rewardToken][_owner]).toUint256Safe() / magnitude;
}
/// @dev Internal function that increases tokens to an account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account that will receive the created tokens.
/// @param value The amount that will be created.
function _increase(address account, uint256 value) internal {
for (uint256 i; i < rewardTokens.length; i++){
magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
.sub((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe());
}
}
/// @dev Internal function that reduces an amount of the token of a given account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account whose tokens will be burnt.
/// @param value The amount that will be burnt.
function _reduce(address account, uint256 value) internal {
for (uint256 i; i < rewardTokens.length; i++){
magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
.add( (magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe() );
}
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = holderBalance[account];
holderBalance[account] = newBalance;
if(newBalance > currentBalance) {
uint256 increaseAmount = newBalance.sub(currentBalance);
_increase(account, increaseAmount);
totalBalance += increaseAmount;
} else if(newBalance < currentBalance) {
uint256 reduceAmount = currentBalance.sub(newBalance);
_reduce(account, reduceAmount);
totalBalance -= reduceAmount;
}
}
}
contract DividendTracker is DividendPayingToken {
using SafeMath for uint256;
using SafeMathInt for int256;
struct Map {
address[] keys;
mapping(address => uint) values;
mapping(address => uint) indexOf;
mapping(address => bool) inserted;
}
function get(address key) private view returns (uint) {
return tokenHoldersMap.values[key];
}
function getIndexOfKey(address key) private view returns (int) {
if(!tokenHoldersMap.inserted[key]) {
return -1;
}
return int(tokenHoldersMap.indexOf[key]);
}
function getKeyAtIndex(uint index) private view returns (address) {
return tokenHoldersMap.keys[index];
}
function size() private view returns (uint) {
return tokenHoldersMap.keys.length;
}
function set(address key, uint val) private {
if (tokenHoldersMap.inserted[key]) {
tokenHoldersMap.values[key] = val;
} else {
tokenHoldersMap.inserted[key] = true;
tokenHoldersMap.values[key] = val;
tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length;
tokenHoldersMap.keys.push(key);
}
}
function remove(address key) private {
if (!tokenHoldersMap.inserted[key]) {
return;
}
delete tokenHoldersMap.inserted[key];
delete tokenHoldersMap.values[key];
uint index = tokenHoldersMap.indexOf[key];
uint lastIndex = tokenHoldersMap.keys.length - 1;
address lastKey = tokenHoldersMap.keys[lastIndex];
tokenHoldersMap.indexOf[lastKey] = index;
delete tokenHoldersMap.indexOf[key];
tokenHoldersMap.keys[index] = lastKey;
tokenHoldersMap.keys.pop();
}
Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping (address => bool) public excludedFromDividends;
mapping (address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public immutable minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event IncludeInDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(address indexed account, uint256 amount, bool indexed automatic);
constructor() {
claimWait = 1200;
minimumTokenBalanceForDividends = 1000 * (10**18);
}
function excludeFromDividends(address account) external onlyOwner {
excludedFromDividends[account] = true;
_setBalance(account, 0);
remove(account);
emit ExcludeFromDividends(account);
}
function includeInDividends(address account) external onlyOwner {
require(excludedFromDividends[account]);
excludedFromDividends[account] = false;
emit IncludeInDividends(account);
}
function updateClaimWait(uint256 newClaimWait) external onlyOwner {
require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");
emit ClaimWaitUpdated(newClaimWait, claimWait);
claimWait = newClaimWait;
}
function getLastProcessedIndex() external view returns(uint256) {
return lastProcessedIndex;
}
function getNumberOfTokenHolders() external view returns(uint256) {
return tokenHoldersMap.keys.length;
}
// Check to see if
function getAccount(address _account, address _rewardToken)
public view returns (
address account,
int256 index,
int256 iterationsUntilProcessed,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilAutoClaimAvailable) {
account = _account;
index = getIndexOfKey(account);
iterationsUntilProcessed = -1;
if(index >= 0) {
if(uint256(index) > lastProcessedIndex) {
iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
}
else {
uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
0;
iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
}
}
withdrawableDividends = withdrawableDividendOf(account, _rewardToken);
totalDividends = accumulativeDividendOf(account, _rewardToken);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ?
lastClaimTime.add(claimWait) :
0;
secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
nextClaimTime.sub(block.timestamp) :
0;
}
function getAccountAtIndex(uint256 index, address _rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
if(index >= size()) {
return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
}
address account = getKeyAtIndex(index);
return getAccount(account, _rewardToken);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if(lastClaimTime > block.timestamp) {
return false;
}
return block.timestamp.sub(lastClaimTime) >= claimWait;
}
function setBalance(address payable account, uint256 newBalance) external onlyOwner {
if(excludedFromDividends[account]) {
return;
}
if(newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
set(account, newBalance);
}
else {
_setBalance(account, 0);
remove(account);
}
processAccount(account, true);
}
function process(uint256 gas) external returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if(numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while(gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if(canAutoClaim(lastClaimTimes[account])) {
if(processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if(gasLeft > newGasLeft) {
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
uint256 amount;
bool paid;
for (uint256 i; i < rewardTokens.length; i++){
amount = _withdrawDividendOfUser(account, rewardTokens[i]);
if(amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
paid = true;
}
}
return paid;
}
}
abstract contract ERC20Burnable is Context, ERC20 {
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
}
contract ProofSFM is ERC20, Ownable, ERC20Burnable {
using SafeMath for uint256;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
bool private swapping;
DividendTracker public dividendTracker;
address public operationsWallet;
uint256 public maxTransactionAmount;
uint256 public swapTokensAtAmount;
uint256 public maxWallet;
uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet
uint256 public tradingActiveBlock = 0; // 0 means trading is not active
uint256 public earlyBuyPenaltyEnd; // determines when snipers/bots can sell without extra penalty
bool public limitsInEffect = true;
bool public tradingActive = false;
bool public swapEnabled = false;
// Anti-bot and anti-whale mappings and variables
mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
bool public transferDelayEnabled = true;
uint256 public constant feeDivisor = 1000;
uint256 public totalSellFees;
uint256 public rewardsSellFee;
uint256 public operationsSellFee;
uint256 public liquiditySellFee;
uint256 public totalBuyFees;
uint256 public rewardsBuyFee;
uint256 public operationsBuyFee;
uint256 public liquidityBuyFee;
uint256 public tokensForRewards;
uint256 public tokensForOperations;
uint256 public tokensForLiquidity;
uint256 public gasForProcessing = 0;
uint256 public lpWithdrawRequestTimestamp;
uint256 public lpWithdrawRequestDuration = 1 days;
bool public lpWithdrawRequestPending;
uint256 public lpPercToWithDraw;
/******************/
// exlcude from fees and max transaction amount
mapping (address => bool) private _isExcludedFromFees;
mapping (address => bool) public _isExcludedMaxTransactionAmount;
// store addresses that a automatic market maker pairs. Any transfer *to* these addresses
// could be subject to a maximum transfer amount
mapping (address => bool) public automatedMarketMakerPairs;
event ExcludeFromFees(address indexed account, bool isExcluded);
event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event OperationsWalletUpdated(address indexed newWallet, address indexed oldWallet);
event DevWalletUpdated(address indexed newWallet, address indexed oldWallet);
event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiqudity
);
event SendDividends(
uint256 tokensSwapped,
uint256 amount
);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
event RequestedLPWithdraw();
event WithdrewLPForMigration();
event CanceledLpWithdrawRequest();
constructor() ERC20("Proof of Safemoon", "SFM2.0") {
uint256 totalSupply = 1 * 1e6 * 1e18;
maxTransactionAmount = totalSupply * 10 / 1000; // 1% maxTransactionAmountTxn
swapTokensAtAmount = totalSupply * 100 / 10000; // 1% swap tokens amount
maxWallet = totalSupply * 10 / 1000; // 1% Max wallet
rewardsBuyFee = 40;
operationsBuyFee = 20;
liquidityBuyFee = 10;
totalBuyFees = rewardsBuyFee + operationsBuyFee + liquidityBuyFee;
rewardsSellFee = 40;
operationsSellFee = 20;
liquiditySellFee = 10;
totalSellFees = rewardsSellFee + operationsSellFee + liquiditySellFee;
dividendTracker = new DividendTracker();
operationsWallet = address(msg.sender); // set as operations wallet
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
// Create a uniswap pair for this new token
address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = _uniswapV2Pair;
_setAutomatedMarketMakerPair(_uniswapV2Pair, true);
// exclude from receiving dividends
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(owner());
dividendTracker.excludeFromDividends(address(_uniswapV2Router));
dividendTracker.excludeFromDividends(address(0xa1D3737935686e719eECaA6d817BD319573aF1DB));
dividendTracker.excludeFromDividends(address(0x0000000000000000000000000000000000000000));
// exclude from paying fees or having max transaction amount
excludeFromFees(owner(), true);
excludeFromFees(address(this), true);
excludeFromFees(address(0xa1D3737935686e719eECaA6d817BD319573aF1DB), true);
excludeFromMaxTransaction(owner(), true);
excludeFromMaxTransaction(address(this), true);
excludeFromMaxTransaction(address(dividendTracker), true);
excludeFromMaxTransaction(address(_uniswapV2Router), true);
excludeFromMaxTransaction(address(0xa1D3737935686e719eECaA6d817BD319573aF1DB), true);
_createInitialSupply(address(owner()), totalSupply);
}
receive() external payable {
}
// disable Transfer delay - cannot be reenabled
function disableTransferDelay() external onlyOwner returns (bool){
transferDelayEnabled = false;
return true;
}
// excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
function excludeFromDividends(address account) external onlyOwner {
dividendTracker.excludeFromDividends(account);
}
// removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
function includeInDividends(address account) external onlyOwner {
dividendTracker.includeInDividends(account);
}
// once enabled, can never be turned off
function enableTrading() external onlyOwner {
require(!tradingActive, "Cannot re-enable trading");
tradingActive = true;
swapEnabled = true;
tradingActiveBlock = block.number;
}
function updateMaxAmount(uint256 newNum) external onlyOwner {
require(newNum > (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
maxTransactionAmount = newNum * (10**18);
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%");
maxWallet = newNum * (10**18);
}
function updateBuyFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
operationsBuyFee = _operationsFee;
rewardsBuyFee = _rewardsFee;
liquidityBuyFee = _liquidityFee;
totalBuyFees = operationsBuyFee + rewardsBuyFee + liquidityBuyFee;
require(totalBuyFees <= 100, "Must keep fees at 10% or less");
}
function updateSellFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
operationsSellFee = _operationsFee;
rewardsSellFee = _rewardsFee;
liquiditySellFee = _liquidityFee;
totalSellFees = operationsSellFee + rewardsSellFee + liquiditySellFee;
require(totalSellFees <= 330, "Must keep fees at 33% or less");
}
function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
_isExcludedMaxTransactionAmount[updAds] = isEx;
emit ExcludedMaxTransactionAmount(updAds, isEx);
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
for(uint256 i = 0; i < accounts.length; i++) {
_isExcludedFromFees[accounts[i]] = excluded;
}
emit ExcludeMultipleAccountsFromFees(accounts, excluded);
}
function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
require(pair != uniswapV2Pair, "from automatedMarketMakerPairs");
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
excludeFromMaxTransaction(pair, value);
if(value) {
dividendTracker.excludeFromDividends(pair);
}
emit SetAutomatedMarketMakerPair(pair, value);
}
function updateOperationsWallet(address newOperationsWallet) external onlyOwner {
require(newOperationsWallet != address(0), "may not set to 0 address");
excludeFromFees(newOperationsWallet, true);
emit OperationsWalletUpdated(newOperationsWallet, operationsWallet);
operationsWallet = newOperationsWallet;
}
function updateGasForProcessing(uint256 newValue) external onlyOwner {
require(newValue >= 200000 && newValue <= 500000, " gasForProcessing must be between 200,000 and 500,000");
require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
emit GasForProcessingUpdated(newValue, gasForProcessing);
gasForProcessing = newValue;
}
function updateClaimWait(uint256 claimWait) external onlyOwner {
dividendTracker.updateClaimWait(claimWait);
}
function getClaimWait() external view returns(uint256) {
return dividendTracker.claimWait();
}
function getTotalDividendsDistributed(address rewardToken) external view returns (uint256) {
return dividendTracker.totalDividendsDistributed(rewardToken);
}
function isExcludedFromFees(address account) external view returns(bool) {
return _isExcludedFromFees[account];
}
function withdrawableDividendOf(address account, address rewardToken) external view returns(uint256) {
return dividendTracker.withdrawableDividendOf(account, rewardToken);
}
function dividendTokenBalanceOf(address account) external view returns (uint256) {
return dividendTracker.holderBalance(account);
}
function getAccountDividendsInfo(address account, address rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
return dividendTracker.getAccount(account, rewardToken);
}
function getAccountDividendsInfoAtIndex(uint256 index, address rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
return dividendTracker.getAccountAtIndex(index, rewardToken);
}
function processDividendTracker(uint256 gas) external {
(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
}
function claim() external {
dividendTracker.processAccount(payable(msg.sender), false);
}
function getLastProcessedIndex() external view returns(uint256) {
return dividendTracker.getLastProcessedIndex();
}
function getNumberOfDividendTokenHolders() external view returns(uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
function getNumberOfDividends() external view returns(uint256) {
return dividendTracker.totalBalance();
}
// remove limits after token is stable
function removeLimits() external onlyOwner returns (bool){
limitsInEffect = false;
transferDelayEnabled = false;
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
if(amount == 0) {
super._transfer(from, to, 0);
return;
}
if(!tradingActive){
require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet.");
}
if(limitsInEffect){
if (
from != owner() &&
to != owner() &&
to != address(0) &&
to != address(0xa1D3737935686e719eECaA6d817BD319573aF1DB) &&
!swapping
){
// at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
if (transferDelayEnabled){
if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed.");
_holderLastTransferTimestamp[tx.origin] = block.number;
}
}
//when buy
if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
}
//when sell
else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
}
else if(!_isExcludedMaxTransactionAmount[to]) {
require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if(
canSwap &&
swapEnabled &&
!swapping &&
!automatedMarketMakerPairs[from] &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to]
) {
swapping = true;
swapBack();
swapping = false;
}
bool takeFee = !swapping;
// if any account belongs to _isExcludedFromFee account then remove the fee
if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
// no taxes on transfers (non buys/sells)
if(takeFee){
if(tradingActiveBlock + 1 >= block.number && (automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from])){
fees = amount.mul(99).div(100);
tokensForLiquidity += fees * 33 / 99;
tokensForRewards += fees * 33 / 99;
tokensForOperations += fees * 33 / 99;
}
// on sell
else if (automatedMarketMakerPairs[to] && totalSellFees > 0){
fees = amount.mul(totalSellFees).div(feeDivisor);
tokensForRewards += fees * rewardsSellFee / totalSellFees;
tokensForLiquidity += fees * liquiditySellFee / totalSellFees;
tokensForOperations += fees * operationsSellFee / totalSellFees;
}
// on buy
else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) {
fees = amount.mul(totalBuyFees).div(feeDivisor);
tokensForRewards += fees * rewardsBuyFee / totalBuyFees;
tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees;
tokensForOperations += fees * operationsBuyFee / totalBuyFees;
}
if(fees > 0){
super._transfer(from, address(this), fees);
}
amount -= fees;
}
super._transfer(from, to, amount);
dividendTracker.setBalance(payable(from), balanceOf(from));
dividendTracker.setBalance(payable(to), balanceOf(to));
if(!swapping && gasForProcessing > 0) {
uint256 gas = gasForProcessing;
try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
}
catch {}
}
}
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
);
}
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
address(0xa1D3737935686e719eECaA6d817BD319573aF1DB),
block.timestamp
);
}
function swapBack() private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForRewards;
if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
// Halve to Liquidity
uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
uint256 initialETHBalance = address(this).balance;
swapTokensForEth(amountToSwapForETH);
uint256 ethBalance = address(this).balance.sub(initialETHBalance);
uint256 ethForOperations = ethBalance.mul(tokensForOperations).div(totalTokensToSwap - (tokensForLiquidity/2));
uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap - (tokensForLiquidity/2));
uint256 ethForLiquidity = ethBalance - ethForOperations - ethForRewards;
tokensForLiquidity = 0;
tokensForOperations = 0;
tokensForRewards = 0;
if(liquidityTokens > 0 && ethForLiquidity > 0){
addLiquidity(liquidityTokens, ethForLiquidity);
emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
}
// call twice to force buy of both reward tokens.
(bool success,) = address(dividendTracker).call{value: ethForRewards}("");
(success,) = address(operationsWallet).call{value: address(this).balance}("");
}
function withdrawStuckEth() external onlyOwner {
(bool success,) = address(msg.sender).call{value: address(this).balance}("");
require(success, "failed to withdraw");
}
function requestToWithdrawLP(uint256 percToWithdraw) external onlyOwner {
require(!lpWithdrawRequestPending, "Cannot request again until first request is over.");
require(percToWithdraw <= 100 && percToWithdraw > 0, "Need to set between 1-100%");
lpWithdrawRequestTimestamp = block.timestamp;
lpWithdrawRequestPending = true;
lpPercToWithDraw = percToWithdraw;
emit RequestedLPWithdraw();
}
function nextAvailableLpWithdrawDate() public view returns (uint256){
if(lpWithdrawRequestPending){
return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
}
else {
return 0; // 0 means no open requests
}
}
function withdrawRequestedLP() external onlyOwner {
require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
lpWithdrawRequestTimestamp = 0;
lpWithdrawRequestPending = false;
uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
lpPercToWithDraw = 0;
IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw);
}
function cancelLPWithdrawRequest() external onlyOwner {
lpWithdrawRequestPending = false;
lpPercToWithDraw = 0;
lpWithdrawRequestTimestamp = 0;
emit CanceledLpWithdrawRequest();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":[],"name":"CanceledLpWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"OperationsWalletUpdated","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":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[],"name":"RequestedLPWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":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"},{"anonymous":false,"inputs":[],"name":"WithdrewLPForMigration","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelLPWithdrawRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPercToWithDraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWithdrawRequestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAvailableLpWithdrawDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percToWithdraw","type":"uint256"}],"name":"requestToWithdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRequestedLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040526000600b819055600c819055600e805462ffffff191660019081179091556010805460ff19169091179055601c5562015180601e553480156200004657600080fd5b5060405180604001604052806011815260200170283937b7b31037b31029b0b332b6b7b7b760791b81525060405180604001604052806006815260200165053464d322e360d41b8152508160039081620000a1919062000ae0565b506004620000b0828262000ae0565b5050506000620000c56200070d60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35069d3c21bcecceda10000006103e86200012e82600a62000bc2565b6200013a919062000be2565b6008556127106200014d82606462000bc2565b62000159919062000be2565b6009556103e86200016c82600a62000bc2565b62000178919062000be2565b600a908155602860168190556014601781905560188390556200019b9162000c05565b620001a7919062000c05565b6015556028601281905560146013819055600a80825591620001ca919062000c05565b620001d6919062000c05565b601155604051620001e79062000a2d565b604051809103906000f08015801562000204573d6000803e3d6000fd5b50600680546001600160a01b03929092166001600160a01b031992831617905560078054909116331790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa15801562000285573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ab919062000c1b565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002f9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031f919062000c1b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200036d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000393919062000c1b565b6001600160a01b03808416608052811660a0529050620003b581600162000711565b60065460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620003fc57600080fd5b505af115801562000411573d6000803e3d6000fd5b505060065460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200045b57600080fd5b505af115801562000470573d6000803e3d6000fd5b50506006546001600160a01b031691506331e79db090506200049a6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620004dc57600080fd5b505af1158015620004f1573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200053d57600080fd5b505af115801562000552573d6000803e3d6000fd5b505060065460405163031e79db60e41b815273a1d3737935686e719eecaa6d817bd319573af1db60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005b057600080fd5b505af1158015620005c5573d6000803e3d6000fd5b505060065460405163031e79db60e41b8152600060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200061057600080fd5b505af115801562000625573d6000803e3d6000fd5b50505050620006456200063d620007e660201b60201c565b6001620007f5565b62000652306001620007f5565b6200067373a1d3737935686e719eecaa6d817bd319573af1db6001620007f5565b620006926200068a6005546001600160a01b031690565b6001620008a4565b6200069f306001620008a4565b600654620006b8906001600160a01b03166001620008a4565b620006c5826001620008a4565b620006e673a1d3737935686e719eecaa6d817bd319573af1db6001620008a4565b62000704620006fd6005546001600160a01b031690565b8462000948565b50505062000c4d565b3390565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055620007418282620008a4565b8015620007aa5760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200079057600080fd5b505af1158015620007a5573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620008445760405162461bcd60e51b8152602060048201819052602482015260008051602062006df883398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b03163314620008ef5760405162461bcd60e51b8152602060048201819052602482015260008051602062006df883398151915260448201526064016200083b565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d95910162000898565b6001600160a01b038216620009a05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200083b565b8060026000828254620009b4919062000c05565b90915550506001600160a01b03821660009081526020819052604081208054839290620009e390849062000c05565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6120ac8062004d4c83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a6657607f821691505b60208210810362000a8757634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000adb57600081815260208120601f850160051c8101602086101562000ab65750805b601f850160051c820191505b8181101562000ad75782815560010162000ac2565b5050505b505050565b81516001600160401b0381111562000afc5762000afc62000a3b565b62000b148162000b0d845462000a51565b8462000a8d565b602080601f83116001811462000b4c576000841562000b335750858301515b600019600386901b1c1916600185901b17855562000ad7565b600085815260208120601f198616915b8281101562000b7d5788860151825594840194600190910190840162000b5c565b508582101562000b9c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000bdc5762000bdc62000bac565b92915050565b60008262000c0057634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000bdc5762000bdc62000bac565b60006020828403121562000c2e57600080fd5b81516001600160a01b038116811462000c4657600080fd5b9392505050565b60805160a05161409362000cb9600039600081816107220152818161181f015281816118ca01528181611d03015261280b015260008181610599015281816127ce01528181613816015281816138cf0152818161390b0152818161398501526139f401526140936000f3fe6080604052600436106104825760003560e01c80638095d56411610255578063c492f04611610144578063e884f260116100c1578063f2fde38b11610085578063f2fde38b14610d83578063f54afa7814610da3578063f8b45b0514610db9578063fb002c9714610dcf578063fd361d0e14610de5578063fd72e22a14610dff57600080fd5b8063e884f26014610d0c578063e98030c714610d21578063ee40166e14610d41578063ee44b44e14610d57578063efcc1b2f14610d6d57600080fd5b8063ccd146b211610108578063ccd146b214610c6f578063d0a3981414610c85578063dd62ed3e14610c9b578063e2f4560514610ce1578063e7841ec014610cf757600080fd5b8063c492f04614610bf4578063c7c61e2c14610c14578063c876d0b914610c29578063c8c8ebe414610c43578063ccb6135814610c5957600080fd5b8063a457c2d7116101d2578063befd2fac11610196578063befd2fac14610b54578063c024666814610b74578063c0f306ef14610b94578063c17b5b8c14610bb4578063c18bc19514610bd457600080fd5b8063a457c2d714610aaf578063a9059cbb14610acf578063b62496f514610aef578063b9e9370014610b1f578063bbc0c74214610b3557600080fd5b806395d89b411161021957806395d89b4114610a395780639a36f93214610a4e5780639a7a23d614610a645780639c1b8af514610a84578063a26579ad14610a9a57600080fd5b80638095d564146109a6578063871c128d146109c65780638a8c523c146109e65780638da5cb5b146109fb57806392b5962614610a1957600080fd5b80634a62bb651161037157806370a08231116102ee578063751039fc116102b2578063751039fc146109315780637571336a14610946578063763cef4914610966578063783102eb1461097b5780637fa787ba1461099157600080fd5b806370a08231146108bc578063712c2985146108dc578063715018a6146108f157806371778e7d146109065780637506cbd81461091b57600080fd5b8063632459f011610335578063632459f0146107e257806364b0f653146108475780636843cd841461085c5780636ddd17131461087c578063700bb1911461089c57600080fd5b80634a62bb65146107445780634af6f7ee1461075e5780634e71d92d146107745780634fbee193146107895780635645cd86146107c257600080fd5b80631fc851bd116103ff578063313ce567116103c3578063313ce5671461069457806331e79db0146106b057806339509351146106d057806342966c68146106f057806349bd5a5e1461071057600080fd5b80631fc851bd146105fe578063204f11a81461061457806323b872dd146106345780632c1f52161461065457806330d5d18d1461067457600080fd5b8063106b5da111610446578063106b5da11461053557806310d5de53146105575780631694505e1461058757806318160ddd146105d35780631a8145bb146105e857600080fd5b8063058054c91461048e57806306fdde03146104b7578063095ea7b3146104d9578063099d0d30146105095780630f4432e31461051f57600080fd5b3661048957005b600080fd5b34801561049a57600080fd5b506104a4601d5481565b6040519081526020015b60405180910390f35b3480156104c357600080fd5b506104cc610e1f565b6040516104ae9190613a99565b3480156104e557600080fd5b506104f96104f4366004613afc565b610eb1565b60405190151581526020016104ae565b34801561051557600080fd5b506104a460145481565b34801561052b57600080fd5b506104a4600b5481565b34801561054157600080fd5b50610555610550366004613b28565b610ec8565b005b34801561056357600080fd5b506104f9610572366004613b41565b60226020526000908152604090205460ff1681565b34801561059357600080fd5b506105bb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016104ae565b3480156105df57600080fd5b506002546104a4565b3480156105f457600080fd5b506104a4601b5481565b34801561060a57600080fd5b506104a4600d5481565b34801561062057600080fd5b506104a461062f366004613b5e565b610fad565b34801561064057600080fd5b506104f961064f366004613b97565b61102b565b34801561066057600080fd5b506006546105bb906001600160a01b031681565b34801561068057600080fd5b5061055561068f366004613b41565b6110d5565b3480156106a057600080fd5b50604051601281526020016104ae565b3480156106bc57600080fd5b506105556106cb366004613b41565b6111bd565b3480156106dc57600080fd5b506104f96106eb366004613afc565b61124a565b3480156106fc57600080fd5b5061055561070b366004613b28565b611286565b34801561071c57600080fd5b506105bb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561075057600080fd5b50600e546104f99060ff1681565b34801561076a57600080fd5b506104a460165481565b34801561078057600080fd5b50610555611293565b34801561079557600080fd5b506104f96107a4366004613b41565b6001600160a01b031660009081526021602052604090205460ff1690565b3480156107ce57600080fd5b506104a46107dd366004613b41565b611308565b3480156107ee57600080fd5b506108026107fd366004613bd8565b611378565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104ae565b34801561085357600080fd5b506104a461141c565b34801561086857600080fd5b506104a4610877366004613b41565b61148f565b34801561088857600080fd5b50600e546104f99062010000900460ff1681565b3480156108a857600080fd5b506105556108b7366004613b28565b6114c2565b3480156108c857600080fd5b506104a46108d7366004613b41565b611595565b3480156108e857600080fd5b506104a46115b0565b3480156108fd57600080fd5b506105556115d4565b34801561091257600080fd5b506104a4611648565b34801561092757600080fd5b506104a460135481565b34801561093d57600080fd5b506104f9611692565b34801561095257600080fd5b50610555610961366004613c0b565b6116db565b34801561097257600080fd5b50610555611765565b34801561098757600080fd5b506104a460205481565b34801561099d57600080fd5b50610555611943565b3480156109b257600080fd5b506105556109c1366004613c39565b6119fa565b3480156109d257600080fd5b506105556109e1366004613b28565b611aa2565b3480156109f257600080fd5b50610555611be5565b348015610a0757600080fd5b506005546001600160a01b03166105bb565b348015610a2557600080fd5b50610802610a34366004613b5e565b611c7e565b348015610a4557600080fd5b506104cc611cc8565b348015610a5a57600080fd5b506104a46103e881565b348015610a7057600080fd5b50610555610a7f366004613c0b565b611cd7565b348015610a9057600080fd5b506104a4601c5481565b348015610aa657600080fd5b506104a4611d8c565b348015610abb57600080fd5b506104f9610aca366004613afc565b611dd6565b348015610adb57600080fd5b506104f9610aea366004613afc565b611e6f565b348015610afb57600080fd5b506104f9610b0a366004613b41565b60236020526000908152604090205460ff1681565b348015610b2b57600080fd5b506104a460155481565b348015610b4157600080fd5b50600e546104f990610100900460ff1681565b348015610b6057600080fd5b50610555610b6f366004613b28565b611e7c565b348015610b8057600080fd5b50610555610b8f366004613c0b565b611fb2565b348015610ba057600080fd5b50610555610baf366004613b41565b612034565b348015610bc057600080fd5b50610555610bcf366004613c39565b612090565b348015610be057600080fd5b50610555610bef366004613b28565b612134565b348015610c0057600080fd5b50610555610c0f366004613c65565b612202565b348015610c2057600080fd5b506105556122de565b348015610c3557600080fd5b506010546104f99060ff1681565b348015610c4f57600080fd5b506104a460085481565b348015610c6557600080fd5b506104a460185481565b348015610c7b57600080fd5b506104a460125481565b348015610c9157600080fd5b506104a460115481565b348015610ca757600080fd5b506104a4610cb6366004613b5e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ced57600080fd5b506104a460095481565b348015610d0357600080fd5b506104a4612347565b348015610d1857600080fd5b506104f9612391565b348015610d2d57600080fd5b50610555610d3c366004613b28565b6123ce565b348015610d4d57600080fd5b506104a4600c5481565b348015610d6357600080fd5b506104a4601e5481565b348015610d7957600080fd5b506104a460175481565b348015610d8f57600080fd5b50610555610d9e366004613b41565b612429565b348015610daf57600080fd5b506104a460195481565b348015610dc557600080fd5b506104a4600a5481565b348015610ddb57600080fd5b506104a4601a5481565b348015610df157600080fd5b50601f546104f99060ff1681565b348015610e0b57600080fd5b506007546105bb906001600160a01b031681565b606060038054610e2e90613ceb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5a90613ceb565b8015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b5050505050905090565b6000610ebe338484612514565b5060015b92915050565b6005546001600160a01b03163314610efb5760405162461bcd60e51b8152600401610ef290613d25565b60405180910390fd5b670de0b6b3a76400006103e8610f1060025490565b610f1b906001613d70565b610f259190613d87565b610f2f9190613d87565b8111610f955760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610ef2565b610fa781670de0b6b3a7640000613d70565b60085550565b600654604051630409e23560e31b81526001600160a01b0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613da9565b9392505050565b6000611038848484612638565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110bd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ef2565b6110ca8533858403612514565b506001949350505050565b6005546001600160a01b031633146110ff5760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b0381166111555760405162461bcd60e51b815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ef2565b611160816001611fb2565b6007546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111e75760405162461bcd60e51b8152600401610ef290613d25565b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561122f57600080fd5b505af1158015611243573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ebe918590611281908690613dc2565b612514565b6112903382613130565b50565b60065460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613dd5565b6006546040516326b72f0160e11b81526001600160a01b0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190613da9565b600654604051638c503bf560e01b8152600481018490526001600160a01b0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613df2565b975097509750975097509750975097509295985092959890939650565b600654604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148a9190613da9565b905090565b60065460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa890602401611337565b6006546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613e5c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b601f5460009060ff16156115ce57601e54601d5461148a9190613dc2565b50600090565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610ef290613d25565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b6005546000906001600160a01b031633146116bf5760405162461bcd60e51b8152600401610ef290613d25565b50600e805460ff19908116909155601080549091169055600190565b6005546001600160a01b031633146117055760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b0316331461178f5760405162461bcd60e51b8152600401610ef290613d25565b6117976115b0565b42101580156117ad575060006117ab6115b0565b115b6117f25760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ef2565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190613da9565b61189c9190613d70565b6118a69190613d87565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f9190613dd5565b5050565b6005546001600160a01b0316331461196d5760405162461bcd60e51b8152600401610ef290613d25565b604051600090339047908381818185875af1925050503d80600081146119af576040519150601f19603f3d011682016040523d82523d6000602084013e6119b4565b606091505b50509050806112905760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610ef2565b6005546001600160a01b03163314611a245760405162461bcd60e51b8152600401610ef290613d25565b60178390556016829055601881905580611a3e8385613dc2565b611a489190613dc2565b601581905560641015611a9d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ef2565b505050565b6005546001600160a01b03163314611acc5760405162461bcd60e51b8152600401610ef290613d25565b62030d408110158015611ae257506207a1208111155b611b4c5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610ef2565b601c548103611bb25760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ef2565b601c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601c55565b6005546001600160a01b03163314611c0f5760405162461bcd60e51b8152600401610ef290613d25565b600e54610100900460ff1615611c675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ef2565b600e805462ffff0019166201010017905543600c55565b60065460405163fd59084760e01b81526001600160a01b0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016113bd565b606060048054610e2e90613ceb565b6005546001600160a01b03163314611d015760405162461bcd60e51b8152600401610ef290613d25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611d825760405162461bcd60e51b815260206004820152601e60248201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006044820152606401610ef2565b61193f828261323b565b60065460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611e585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ef2565b611e653385858403612514565b5060019392505050565b6000610ebe338484612638565b6005546001600160a01b03163314611ea65760405162461bcd60e51b8152600401610ef290613d25565b601f5460ff1615611f135760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ef2565b60648111158015611f245750600081115b611f705760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ef2565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611fdc5760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611759565b6005546001600160a01b0316331461205e5760405162461bcd60e51b8152600401610ef290613d25565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611215565b6005546001600160a01b031633146120ba5760405162461bcd60e51b8152600401610ef290613d25565b601383905560128290556014819055806120d48385613dc2565b6120de9190613dc2565b601181905561014a1015611a9d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333325206f72206c6573730000006044820152606401610ef2565b6005546001600160a01b0316331461215e5760405162461bcd60e51b8152600401610ef290613d25565b670de0b6b3a7640000606461217260025490565b61217d906001613d70565b6121879190613d87565b6121919190613d87565b81116121ea5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610ef2565b6121fc81670de0b6b3a7640000613d70565b600a5550565b6005546001600160a01b0316331461222c5760405162461bcd60e51b8152600401610ef290613d25565b60005b8281101561229d57816021600086868581811061224e5761224e613e8a565b90506020020160208101906122639190613b41565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061229581613ea0565b91505061222f565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516122d193929190613eb9565b60405180910390a1505050565b6005546001600160a01b031633146123085760405162461bcd60e51b8152600401610ef290613d25565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6006546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b6005546000906001600160a01b031633146123be5760405162461bcd60e51b8152600401610ef290613d25565b506010805460ff19169055600190565b6005546001600160a01b031633146123f85760405162461bcd60e51b8152600401610ef290613d25565b60065460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611215565b6005546001600160a01b031633146124535760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b0381166124b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ef2565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166125765760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ef2565b6001600160a01b0382166125d75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ef2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661265e5760405162461bcd60e51b8152600401610ef290613f12565b6001600160a01b0382166126845760405162461bcd60e51b8152600401610ef290613f57565b8060000361269857611a9d8383600061330b565b600e54610100900460ff16612732576001600160a01b03831660009081526021602052604090205460ff16806126e657506001600160a01b03821660009081526021602052604090205460ff165b6127325760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ef2565b600e5460ff1615612b48576005546001600160a01b0384811691161480159061276957506005546001600160a01b03838116911614155b801561277d57506001600160a01b03821615155b80156127a657506001600160a01b03821673a1d3737935686e719eecaa6d817bd319573af1db14155b80156127bc5750600554600160a01b900460ff16155b15612b485760105460ff16156128ee577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415801561284057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156128ee57326000908152600f602052604090205443116128db5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610ef2565b326000908152600f602052604090204390555b6001600160a01b03831660009081526023602052604090205460ff16801561292f57506001600160a01b03821660009081526022602052604090205460ff16155b15612a0d576008548111156129a45760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ef2565b600a546129b083611595565b6129ba9083613dc2565b1115612a085760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ef2565b612b48565b6001600160a01b03821660009081526023602052604090205460ff168015612a4e57506001600160a01b03831660009081526022602052604090205460ff16155b15612ac457600854811115612a085760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ef2565b6001600160a01b03821660009081526022602052604090205460ff16612b4857600a54612af083611595565b612afa9083613dc2565b1115612b485760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ef2565b6000612b5330611595565b60095490915081108015908190612b725750600e5462010000900460ff165b8015612b885750600554600160a01b900460ff16155b8015612bad57506001600160a01b03851660009081526023602052604090205460ff16155b8015612bd257506001600160a01b03851660009081526021602052604090205460ff16155b8015612bf757506001600160a01b03841660009081526021602052604090205460ff16155b15612c25576005805460ff60a01b1916600160a01b179055612c17613452565b6005805460ff60a01b191690555b6005546001600160a01b03861660009081526021602052604090205460ff600160a01b909204821615911680612c7357506001600160a01b03851660009081526021602052604090205460ff165b15612c7c575060005b60008115612f415743600c546001612c949190613dc2565b10158015612cdc57506001600160a01b03861660009081526023602052604090205460ff1680612cdc57506001600160a01b03871660009081526023602052604090205460ff165b15612d8857612cf76064612cf187606361367f565b90613701565b90506063612d06826021613d70565b612d109190613d87565b601b6000828254612d219190613dc2565b9091555060639050612d34826021613d70565b612d3e9190613d87565b60196000828254612d4f9190613dc2565b9091555060639050612d62826021613d70565b612d6c9190613d87565b601a6000828254612d7d9190613dc2565b90915550612f239050565b6001600160a01b03861660009081526023602052604090205460ff168015612db257506000601154115b15612e4557612dd26103e8612cf16011548861367f90919063ffffffff16565b905060115460125482612de59190613d70565b612def9190613d87565b60196000828254612e009190613dc2565b9091555050601154601454612e159083613d70565b612e1f9190613d87565b601b6000828254612e309190613dc2565b9091555050601154601354612d629083613d70565b6001600160a01b03871660009081526023602052604090205460ff168015612e6f57506000601554115b15612f2357612e8f6103e8612cf16015548861367f90919063ffffffff16565b905060155460165482612ea29190613d70565b612eac9190613d87565b60196000828254612ebd9190613dc2565b9091555050601554601854612ed29083613d70565b612edc9190613d87565b601b6000828254612eed9190613dc2565b9091555050601554601754612f029083613d70565b612f0c9190613d87565b601a6000828254612f1d9190613dc2565b90915550505b8015612f3457612f3487308361330b565b612f3e8186613f9a565b94505b612f4c87878761330b565b6006546001600160a01b031663e30443bc88612f6781611595565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fad57600080fd5b505af1158015612fc1573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc905087612fe281611595565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b5050600554600160a01b900460ff1615915050801561305d57506000601c54115b1561312757601c546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156130cf575060408051601f3d908101601f191682019092526130cc91810190613e5c565b60015b156131255760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b6001600160a01b0382166131905760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ef2565b6131cd8160405180606001604052806022815260200161403c602291396001600160a01b0385166000908152602081905260409020549190613743565b6001600160a01b0383166000908152602081905260409020556002546131f3908261377d565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152602360205260409020805460ff191682151517905561326982826116db565b80156132cf5760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156132b657600080fd5b505af11580156132ca573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166133315760405162461bcd60e51b8152600401610ef290613f12565b6001600160a01b0382166133575760405162461bcd60e51b8152600401610ef290613f57565b6001600160a01b038316600090815260208190526040902054818110156133cf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ef2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613406908490613dc2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161158791815260200190565b600061345d30611595565b90506000601954601a54601b546134749190613dc2565b61347e9190613dc2565b905081158061348b575080155b15613494575050565b6000600282601b54856134a79190613d70565b6134b19190613d87565b6134bb9190613d87565b905060006134c9848361377d565b9050476134d5826137bf565b60006134e1478361377d565b9050600061350f6002601b546134f79190613d87565b6135019088613f9a565b601a54612cf190859061367f565b9050600061353d6002601b546135259190613d87565b61352f9089613f9a565b601954612cf190869061367f565b905060008161354c8486613f9a565b6135569190613f9a565b6000601b819055601a819055601955905086158015906135765750600081115b156135c957613585878261397f565b601b54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613616576040519150601f19603f3d011682016040523d82523d6000602084013e61361b565b606091505b50506007546040519192506001600160a01b0316904790600081818185875af1925050503d806000811461366b576040519150601f19603f3d011682016040523d82523d6000602084013e613670565b606091505b50505050505050505050505050565b60008260000361369157506000610ec2565b600061369d8385613d70565b9050826136aa8583613d87565b146110245760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ef2565b600061102483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a6b565b600081848411156137675760405162461bcd60e51b8152600401610ef29190613a99565b5060006137748486613f9a565b95945050505050565b600061102483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613743565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137f4576137f4613e8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138969190613fad565b816001815181106138a9576138a9613e8a565b60200260200101906001600160a01b031690816001600160a01b0316815250506138f4307f000000000000000000000000000000000000000000000000000000000000000084612514565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613949908590600090869030904290600401613fca565b600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b505050505050565b6139aa307f000000000000000000000000000000000000000000000000000000000000000084612514565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015273a1d3737935686e719eecaa6d817bd319573af1db60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015613a46573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112439190613e5c565b60008183613a8c5760405162461bcd60e51b8152600401610ef29190613a99565b5060006137748486613d87565b600060208083528351808285015260005b81811015613ac657858101830151858201604001528201613aaa565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461129057600080fd5b60008060408385031215613b0f57600080fd5b8235613b1a81613ae7565b946020939093013593505050565b600060208284031215613b3a57600080fd5b5035919050565b600060208284031215613b5357600080fd5b813561102481613ae7565b60008060408385031215613b7157600080fd5b8235613b7c81613ae7565b91506020830135613b8c81613ae7565b809150509250929050565b600080600060608486031215613bac57600080fd5b8335613bb781613ae7565b92506020840135613bc781613ae7565b929592945050506040919091013590565b60008060408385031215613beb57600080fd5b823591506020830135613b8c81613ae7565b801515811461129057600080fd5b60008060408385031215613c1e57600080fd5b8235613c2981613ae7565b91506020830135613b8c81613bfd565b600080600060608486031215613c4e57600080fd5b505081359360208301359350604090920135919050565b600080600060408486031215613c7a57600080fd5b833567ffffffffffffffff80821115613c9257600080fd5b818601915086601f830112613ca657600080fd5b813581811115613cb557600080fd5b8760208260051b8501011115613cca57600080fd5b60209283019550935050840135613ce081613bfd565b809150509250925092565b600181811c90821680613cff57607f821691505b602082108103613d1f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ec257610ec2613d5a565b600082613da457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613dbb57600080fd5b5051919050565b80820180821115610ec257610ec2613d5a565b600060208284031215613de757600080fd5b815161102481613bfd565b600080600080600080600080610100898b031215613e0f57600080fd5b8851613e1a81613ae7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080600060608486031215613e7157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201613eb257613eb2613d5a565b5060010190565b6040808252810183905260008460608301825b86811015613efc578235613edf81613ae7565b6001600160a01b0316825260209283019290910190600101613ecc565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ec257610ec2613d5a565b600060208284031215613fbf57600080fd5b815161102481613ae7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561401a5784516001600160a01b031683529383019391830191600101613ff5565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220929449ffae1aa89caa1e772cc22d0d4bea736c4487ee348545c6672040d3b91564736f6c6343000811003360c060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905581546100d1576100d1610115565b600091825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055506104b0601155683635c9adc5dea0000060a05261012b565b634e487b7160e01b600052603260045260246000fd5b60805160a051611f47610165600039600081816104d10152610d3901526000818161022e0152818161121901526113050152611f476000f3fe6080604052600436106101dc5760003560e01c80639c53c0ca11610102578063e30443bc11610095578063e98030c711610064578063e98030c7146105ee578063f2fde38b1461060e578063fd5908471461062e578063ffb2c4791461064e57600080fd5b8063e30443bc14610553578063e6f083f414610573578063e7841ec0146105b9578063e7f4d2c3146105ce57600080fd5b8063be10b614116100d1578063be10b614146104bf578063c0f306ef146104f3578063cb83bcd614610513578063cc5489df1461053357600080fd5b80639c53c0ca1461043c578063ab6ddfa81461045c578063ad7a672f14610489578063bc4c4b371461049f57600080fd5b80634d6e5e021161017a5780637bb7bed1116101495780637bb7bed1146103835780638c503bf5146103a35780638da5cb5b1461040857806393fcfe611461042657600080fd5b80634d6e5e02146102eb5780634e7b827f146103185780636f2789ec14610358578063715018a61461036e57600080fd5b8063204f11a8116101b6578063204f11a814610268578063226cfa3d146102885780633009a609146102b557806331e79db0146102cb57600080fd5b806303c83302146101f057806309bbedde146101f85780631694505e1461021c57600080fd5b366101eb576101e9610689565b005b600080fd5b6101e9610689565b34801561020457600080fd5b50600a545b6040519081526020015b60405180910390f35b34801561022857600080fd5b506102507f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610213565b34801561027457600080fd5b50610209610283366004611bcc565b6108eb565b34801561029457600080fd5b506102096102a3366004611c05565b60106020526000908152604090205481565b3480156102c157600080fd5b50610209600e5481565b3480156102d757600080fd5b506101e96102e6366004611c05565b61092a565b3480156102f757600080fd5b50610209610306366004611c05565b60096020526000908152604090205481565b34801561032457600080fd5b50610348610333366004611c05565b600f6020526000908152604090205460ff1681565b6040519015158152602001610213565b34801561036457600080fd5b5061020960115481565b34801561037a57600080fd5b506101e96109cb565b34801561038f57600080fd5b5061025061039e366004611c22565b610a3f565b3480156103af57600080fd5b506103c36103be366004611c3b565b610a69565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610213565b34801561041457600080fd5b506000546001600160a01b0316610250565b34801561043257600080fd5b5061020960045481565b34801561044857600080fd5b506101e9610457366004611c05565b610ad9565b34801561046857600080fd5b50610209610477366004611c05565b60076020526000908152604090205481565b34801561049557600080fd5b5061020960085481565b3480156104ab57600080fd5b506103486104ba366004611c6e565b610ae7565b3480156104cb57600080fd5b506102097f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ff57600080fd5b506101e961050e366004611c05565b610bd5565b34801561051f57600080fd5b5061020961052e366004611bcc565b610c6d565b34801561053f57600080fd5b5061020961054e366004611bcc565b610c79565b34801561055f57600080fd5b506101e961056e366004611c9c565b610ced565b34801561057f57600080fd5b5061020961058e366004611bcc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156105c557600080fd5b50600e54610209565b3480156105da57600080fd5b50600354610250906001600160a01b031681565b3480156105fa57600080fd5b506101e9610609366004611c22565b610d9b565b34801561061a57600080fd5b506101e9610629366004611c05565b610f04565b34801561063a57600080fd5b506103c3610649366004611bcc565b610fee565b34801561065a57600080fd5b5061066e610669366004611c22565b6110d9565b60408051938452602084019290925290820152606001610213565b60006008541161069857600080fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107059190611cc8565b60035490915061071f9034906001600160a01b03166111f6565b6003546040516370a0823160e01b81523060048201526000916107989184916001600160a01b0316906370a0823190602401602060405180830381865afa15801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190611cc8565b9061137c565b90508015610874576008546107e0906107b583600160801b6113be565b6107bf9190611cf7565b6003546001600160a01b031660009081526001602052604090205490611440565b6003546001600160a01b0316600090815260016020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a26003546001600160a01b03166000908152600960205260409020546108589082611440565b6003546001600160a01b03166000908152600960205260409020555b60025461088390600190611d19565b6004541461089e57600454610899906001611d2c565b6108a1565b60005b6004819055506002600454815481106108bc576108bc611d3f565b600091825260209091200154600380546001600160a01b0319166001600160a01b039092169190911790555050565b6001600160a01b038083166000908152600660209081526040808320938516835292905290812054610921906107928585610c79565b90505b92915050565b6000546001600160a01b0316331461095d5760405162461bcd60e51b815260040161095490611d55565b60405180910390fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561098b90829061149f565b61099481611538565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6000546001600160a01b031633146109f55760405162461bcd60e51b815260040161095490611d55565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60028181548110610a4f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600080600080600080600080610a7e600a5490565b8a10610aa3575060009650600019955085945086935083925082915081905080610acc565b6000610aae8b61166b565b9050610aba818b610fee565b98509850985098509850985098509850505b9295985092959890939650565b610ae3338261169e565b5050565b600080546001600160a01b03163314610b125760405162461bcd60e51b815260040161095490611d55565b60008060005b600254811015610bcc57610b538660028381548110610b3957610b39611d3f565b6000918252602090912001546001600160a01b031661169e565b92508215610bba576001600160a01b038616600081815260106020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610bad9087815260200190565b60405180910390a3600191505b80610bc481611d8a565b915050610b18565b50949350505050565b6000546001600160a01b03163314610bff5760405162461bcd60e51b815260040161095490611d55565b6001600160a01b0381166000908152600f602052604090205460ff16610c2457600080fd5b6001600160a01b0381166000818152600f6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b600061092183836108eb565b6001600160a01b03808216600081815260056020908152604080832094871683529381528382205460078252848320549383526001909152928120549092600160801b92610ce392610cde9291610cd891610cd3916113be565b6117cb565b906117db565b611819565b6109219190611cf7565b6000546001600160a01b03163314610d175760405162461bcd60e51b815260040161095490611d55565b6001600160a01b0382166000908152600f602052604090205460ff16610ae3577f00000000000000000000000000000000000000000000000000000000000000008110610d7757610d68828261149f565b610d72828261182c565b610d8b565b610d8282600061149f565b610d8b82611538565b610d96826001610ae7565b505050565b6000546001600160a01b03163314610dc55760405162461bcd60e51b815260040161095490611d55565b6104b08110158015610dda5750620151808111155b610e5a5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610954565b6011548103610ed15760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610954565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6000546001600160a01b03163314610f2e5760405162461bcd60e51b815260040161095490611d55565b6001600160a01b038116610f935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610954565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b816000808080808080611000886118ea565b965060001995506000871261106257600e5487111561102e57600e5461102790889061192f565b9550611062565b600e54600a5460009110611043576000611052565b600e54600a546110529161137c565b905061105e88826117db565b9650505b61106c888a6108eb565b9450611078888a610c79565b6001600160a01b0389166000908152601060205260409020549094509250826110a25760006110b0565b6011546110b0908490611440565b91504282116110c05760006110ca565b6110ca824261137c565b90509295985092959890939650565b600a54600090819081908082036110fb575050600e54600092508291506111ef565b600e546000805a90506000805b898410801561111657508582105b156111de578461112581611d8a565b600a549096508610905061113857600094505b6000600a600001868154811061115057611150611d3f565b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506111819061196c565b156111a457611191816001610ae7565b156111a457816111a081611d8a565b9250505b826111ae81611d8a565b93505060005a9050808511156111d5576111d26111cb868361137c565b8790611440565b95505b93506111089050565b600e85905590975095509193505050505b9193909250565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112999190611da3565b816000815181106112ac576112ac611d3f565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106112e0576112e0611d3f565b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061134590600090869030904290600401611dc0565b6000604051808303818588803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505050505050565b600061092183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611993565b6000826000036113d057506000610924565b60006113dc8385611e2a565b9050826113e98583611cf7565b146109215760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610954565b60008061144d8385611d2c565b9050838110156109215760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610954565b6001600160a01b0382166000908152600760205260409020805490829055808211156114fb5760006114d1838361137c565b90506114dd84826119cd565b80600860008282546114ef9190611d2c565b90915550610d96915050565b80821015610d9657600061150f828461137c565b905061151b8482611ad6565b806008600082825461152d9190611d19565b909155505050505050565b6001600160a01b0381166000908152600d602052604090205460ff1661155b5750565b6001600160a01b0381166000908152600d60209081526040808320805460ff19169055600b8252808320839055600c909152812054600a549091906115a290600190611d19565b90506000600a60000182815481106115bc576115bc611d3f565b60009182526020808320909101546001600160a01b03908116808452600c90925260408084208790559087168352822091909155600a805491925082918590811061160957611609611d3f565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600a80548061164357611643611e41565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000600a600001828154811061168357611683611d3f565b6000918252602090912001546001600160a01b031692915050565b6000806116ab84846108eb565b905080156117c1576001600160a01b038085166000908152600660209081526040808320938716835292905220546116e39082611440565b6001600160a01b038086166000818152600660209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061173e9084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190611e57565b509050610924565b5060009392505050565b6000818181121561092457600080fd5b6000806117e88385611e74565b9050600083121580156117fb5750838112155b80611810575060008312801561181057508381125b61092157600080fd5b60008082121561182857600080fd5b5090565b6001600160a01b0382166000908152600d602052604090205460ff161561186a576001600160a01b03919091166000908152600b6020526040902055565b6001600160a01b0382166000818152600d60209081526040808320805460ff19166001908117909155600b8352818420869055600a8054600c909452918420839055820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600d602052604081205460ff166119135750600019919050565b506001600160a01b03166000908152600c602052604090205490565b60008061193c8385611e9c565b90506000831215801561194f5750838113155b806118105750600083128015611810575083811361092157600080fd5b60004282111561197e57506000919050565b60115461198b428461137c565b101592915050565b600081848411156119b75760405162461bcd60e51b81526004016109549190611ec3565b5060006119c48486611d19565b95945050505050565b60005b600254811015610d9657611a78611a26610cd38460016000600287815481106119fb576119fb611d3f565b60009182526020808320909101546001600160a01b03168352820192909252604001902054906113be565b6005600060028581548110611a3d57611a3d611d3f565b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182209389168252929092529020549061192f565b6005600060028481548110611a8f57611a8f611d3f565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611ace81611d8a565b9150506119d0565b60005b600254811015610d9657611b56611b04610cd38460016000600287815481106119fb576119fb611d3f565b6005600060028581548110611b1b57611b1b611d3f565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938916825292909252902054906117db565b6005600060028481548110611b6d57611b6d611d3f565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611bac81611d8a565b915050611ad9565b6001600160a01b0381168114611bc957600080fd5b50565b60008060408385031215611bdf57600080fd5b8235611bea81611bb4565b91506020830135611bfa81611bb4565b809150509250929050565b600060208284031215611c1757600080fd5b813561092181611bb4565b600060208284031215611c3457600080fd5b5035919050565b60008060408385031215611c4e57600080fd5b823591506020830135611bfa81611bb4565b8015158114611bc957600080fd5b60008060408385031215611c8157600080fd5b8235611c8c81611bb4565b91506020830135611bfa81611c60565b60008060408385031215611caf57600080fd5b8235611cba81611bb4565b946020939093013593505050565b600060208284031215611cda57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611d1457634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561092457610924611ce1565b8082018082111561092457610924611ce1565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611d9c57611d9c611ce1565b5060010190565b600060208284031215611db557600080fd5b815161092181611bb4565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611e0a5784516001600160a01b031683529383019391830191600101611de5565b50506001600160a01b039690961660408501525050506060015292915050565b808202811582820484141761092457610924611ce1565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611e6957600080fd5b815161092181611c60565b8082018281126000831280158216821582161715611e9457611e94611ce1565b505092915050565b8181036000831280158383131683831282161715611ebc57611ebc611ce1565b5092915050565b600060208083528351808285015260005b81811015611ef057858101830151858201604001528201611ed4565b506000604082860101526040601f19601f830116850101925050509291505056fea26469706673582212208156d62f5ddd1039fe61d7e9232940938a926391402de1e3768cedb1a01450a964736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106104825760003560e01c80638095d56411610255578063c492f04611610144578063e884f260116100c1578063f2fde38b11610085578063f2fde38b14610d83578063f54afa7814610da3578063f8b45b0514610db9578063fb002c9714610dcf578063fd361d0e14610de5578063fd72e22a14610dff57600080fd5b8063e884f26014610d0c578063e98030c714610d21578063ee40166e14610d41578063ee44b44e14610d57578063efcc1b2f14610d6d57600080fd5b8063ccd146b211610108578063ccd146b214610c6f578063d0a3981414610c85578063dd62ed3e14610c9b578063e2f4560514610ce1578063e7841ec014610cf757600080fd5b8063c492f04614610bf4578063c7c61e2c14610c14578063c876d0b914610c29578063c8c8ebe414610c43578063ccb6135814610c5957600080fd5b8063a457c2d7116101d2578063befd2fac11610196578063befd2fac14610b54578063c024666814610b74578063c0f306ef14610b94578063c17b5b8c14610bb4578063c18bc19514610bd457600080fd5b8063a457c2d714610aaf578063a9059cbb14610acf578063b62496f514610aef578063b9e9370014610b1f578063bbc0c74214610b3557600080fd5b806395d89b411161021957806395d89b4114610a395780639a36f93214610a4e5780639a7a23d614610a645780639c1b8af514610a84578063a26579ad14610a9a57600080fd5b80638095d564146109a6578063871c128d146109c65780638a8c523c146109e65780638da5cb5b146109fb57806392b5962614610a1957600080fd5b80634a62bb651161037157806370a08231116102ee578063751039fc116102b2578063751039fc146109315780637571336a14610946578063763cef4914610966578063783102eb1461097b5780637fa787ba1461099157600080fd5b806370a08231146108bc578063712c2985146108dc578063715018a6146108f157806371778e7d146109065780637506cbd81461091b57600080fd5b8063632459f011610335578063632459f0146107e257806364b0f653146108475780636843cd841461085c5780636ddd17131461087c578063700bb1911461089c57600080fd5b80634a62bb65146107445780634af6f7ee1461075e5780634e71d92d146107745780634fbee193146107895780635645cd86146107c257600080fd5b80631fc851bd116103ff578063313ce567116103c3578063313ce5671461069457806331e79db0146106b057806339509351146106d057806342966c68146106f057806349bd5a5e1461071057600080fd5b80631fc851bd146105fe578063204f11a81461061457806323b872dd146106345780632c1f52161461065457806330d5d18d1461067457600080fd5b8063106b5da111610446578063106b5da11461053557806310d5de53146105575780631694505e1461058757806318160ddd146105d35780631a8145bb146105e857600080fd5b8063058054c91461048e57806306fdde03146104b7578063095ea7b3146104d9578063099d0d30146105095780630f4432e31461051f57600080fd5b3661048957005b600080fd5b34801561049a57600080fd5b506104a4601d5481565b6040519081526020015b60405180910390f35b3480156104c357600080fd5b506104cc610e1f565b6040516104ae9190613a99565b3480156104e557600080fd5b506104f96104f4366004613afc565b610eb1565b60405190151581526020016104ae565b34801561051557600080fd5b506104a460145481565b34801561052b57600080fd5b506104a4600b5481565b34801561054157600080fd5b50610555610550366004613b28565b610ec8565b005b34801561056357600080fd5b506104f9610572366004613b41565b60226020526000908152604090205460ff1681565b34801561059357600080fd5b506105bb7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016104ae565b3480156105df57600080fd5b506002546104a4565b3480156105f457600080fd5b506104a4601b5481565b34801561060a57600080fd5b506104a4600d5481565b34801561062057600080fd5b506104a461062f366004613b5e565b610fad565b34801561064057600080fd5b506104f961064f366004613b97565b61102b565b34801561066057600080fd5b506006546105bb906001600160a01b031681565b34801561068057600080fd5b5061055561068f366004613b41565b6110d5565b3480156106a057600080fd5b50604051601281526020016104ae565b3480156106bc57600080fd5b506105556106cb366004613b41565b6111bd565b3480156106dc57600080fd5b506104f96106eb366004613afc565b61124a565b3480156106fc57600080fd5b5061055561070b366004613b28565b611286565b34801561071c57600080fd5b506105bb7f000000000000000000000000e7ce4f89a0be3058e43ee80d9a5ed03ce3bf978281565b34801561075057600080fd5b50600e546104f99060ff1681565b34801561076a57600080fd5b506104a460165481565b34801561078057600080fd5b50610555611293565b34801561079557600080fd5b506104f96107a4366004613b41565b6001600160a01b031660009081526021602052604090205460ff1690565b3480156107ce57600080fd5b506104a46107dd366004613b41565b611308565b3480156107ee57600080fd5b506108026107fd366004613bd8565b611378565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104ae565b34801561085357600080fd5b506104a461141c565b34801561086857600080fd5b506104a4610877366004613b41565b61148f565b34801561088857600080fd5b50600e546104f99062010000900460ff1681565b3480156108a857600080fd5b506105556108b7366004613b28565b6114c2565b3480156108c857600080fd5b506104a46108d7366004613b41565b611595565b3480156108e857600080fd5b506104a46115b0565b3480156108fd57600080fd5b506105556115d4565b34801561091257600080fd5b506104a4611648565b34801561092757600080fd5b506104a460135481565b34801561093d57600080fd5b506104f9611692565b34801561095257600080fd5b50610555610961366004613c0b565b6116db565b34801561097257600080fd5b50610555611765565b34801561098757600080fd5b506104a460205481565b34801561099d57600080fd5b50610555611943565b3480156109b257600080fd5b506105556109c1366004613c39565b6119fa565b3480156109d257600080fd5b506105556109e1366004613b28565b611aa2565b3480156109f257600080fd5b50610555611be5565b348015610a0757600080fd5b506005546001600160a01b03166105bb565b348015610a2557600080fd5b50610802610a34366004613b5e565b611c7e565b348015610a4557600080fd5b506104cc611cc8565b348015610a5a57600080fd5b506104a46103e881565b348015610a7057600080fd5b50610555610a7f366004613c0b565b611cd7565b348015610a9057600080fd5b506104a4601c5481565b348015610aa657600080fd5b506104a4611d8c565b348015610abb57600080fd5b506104f9610aca366004613afc565b611dd6565b348015610adb57600080fd5b506104f9610aea366004613afc565b611e6f565b348015610afb57600080fd5b506104f9610b0a366004613b41565b60236020526000908152604090205460ff1681565b348015610b2b57600080fd5b506104a460155481565b348015610b4157600080fd5b50600e546104f990610100900460ff1681565b348015610b6057600080fd5b50610555610b6f366004613b28565b611e7c565b348015610b8057600080fd5b50610555610b8f366004613c0b565b611fb2565b348015610ba057600080fd5b50610555610baf366004613b41565b612034565b348015610bc057600080fd5b50610555610bcf366004613c39565b612090565b348015610be057600080fd5b50610555610bef366004613b28565b612134565b348015610c0057600080fd5b50610555610c0f366004613c65565b612202565b348015610c2057600080fd5b506105556122de565b348015610c3557600080fd5b506010546104f99060ff1681565b348015610c4f57600080fd5b506104a460085481565b348015610c6557600080fd5b506104a460185481565b348015610c7b57600080fd5b506104a460125481565b348015610c9157600080fd5b506104a460115481565b348015610ca757600080fd5b506104a4610cb6366004613b5e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ced57600080fd5b506104a460095481565b348015610d0357600080fd5b506104a4612347565b348015610d1857600080fd5b506104f9612391565b348015610d2d57600080fd5b50610555610d3c366004613b28565b6123ce565b348015610d4d57600080fd5b506104a4600c5481565b348015610d6357600080fd5b506104a4601e5481565b348015610d7957600080fd5b506104a460175481565b348015610d8f57600080fd5b50610555610d9e366004613b41565b612429565b348015610daf57600080fd5b506104a460195481565b348015610dc557600080fd5b506104a4600a5481565b348015610ddb57600080fd5b506104a4601a5481565b348015610df157600080fd5b50601f546104f99060ff1681565b348015610e0b57600080fd5b506007546105bb906001600160a01b031681565b606060038054610e2e90613ceb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5a90613ceb565b8015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b5050505050905090565b6000610ebe338484612514565b5060015b92915050565b6005546001600160a01b03163314610efb5760405162461bcd60e51b8152600401610ef290613d25565b60405180910390fd5b670de0b6b3a76400006103e8610f1060025490565b610f1b906001613d70565b610f259190613d87565b610f2f9190613d87565b8111610f955760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610ef2565b610fa781670de0b6b3a7640000613d70565b60085550565b600654604051630409e23560e31b81526001600160a01b0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613da9565b9392505050565b6000611038848484612638565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110bd5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ef2565b6110ca8533858403612514565b506001949350505050565b6005546001600160a01b031633146110ff5760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b0381166111555760405162461bcd60e51b815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610ef2565b611160816001611fb2565b6007546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111e75760405162461bcd60e51b8152600401610ef290613d25565b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561122f57600080fd5b505af1158015611243573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ebe918590611281908690613dc2565b612514565b6112903382613130565b50565b60065460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613dd5565b6006546040516326b72f0160e11b81526001600160a01b0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa158015611354573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190613da9565b600654604051638c503bf560e01b8152600481018490526001600160a01b0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613df2565b975097509750975097509750975097509295985092959890939650565b600654604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148a9190613da9565b905090565b60065460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa890602401611337565b6006546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613e5c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b601f5460009060ff16156115ce57601e54601d5461148a9190613dc2565b50600090565b6005546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610ef290613d25565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b6005546000906001600160a01b031633146116bf5760405162461bcd60e51b8152600401610ef290613d25565b50600e805460ff19908116909155601080549091169055600190565b6005546001600160a01b031633146117055760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b0316331461178f5760405162461bcd60e51b8152600401610ef290613d25565b6117976115b0565b42101580156117ad575060006117ab6115b0565b115b6117f25760405162461bcd60e51b815260206004820152601660248201527526bab9ba103932b8bab2b9ba1030b732103bb0b4ba1760511b6044820152606401610ef2565b6000601d819055601f805460ff191690556020546040516370a0823160e01b8152306004820152606491907f000000000000000000000000e7ce4f89a0be3058e43ee80d9a5ed03ce3bf97826001600160a01b0316906370a0823190602401602060405180830381865afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190613da9565b61189c9190613d70565b6118a69190613d87565b600060205560405163a9059cbb60e01b8152336004820152602481018290529091507f000000000000000000000000e7ce4f89a0be3058e43ee80d9a5ed03ce3bf97826001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f9190613dd5565b5050565b6005546001600160a01b0316331461196d5760405162461bcd60e51b8152600401610ef290613d25565b604051600090339047908381818185875af1925050503d80600081146119af576040519150601f19603f3d011682016040523d82523d6000602084013e6119b4565b606091505b50509050806112905760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610ef2565b6005546001600160a01b03163314611a245760405162461bcd60e51b8152600401610ef290613d25565b60178390556016829055601881905580611a3e8385613dc2565b611a489190613dc2565b601581905560641015611a9d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610ef2565b505050565b6005546001600160a01b03163314611acc5760405162461bcd60e51b8152600401610ef290613d25565b62030d408110158015611ae257506207a1208111155b611b4c5760405162461bcd60e51b815260206004820152603560248201527f20676173466f7250726f63657373696e67206d7573742062652062657477656560448201527406e203230302c30303020616e64203530302c30303605c1b6064820152608401610ef2565b601c548103611bb25760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ef2565b601c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601c55565b6005546001600160a01b03163314611c0f5760405162461bcd60e51b8152600401610ef290613d25565b600e54610100900460ff1615611c675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610ef2565b600e805462ffff0019166201010017905543600c55565b60065460405163fd59084760e01b81526001600160a01b0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016113bd565b606060048054610e2e90613ceb565b6005546001600160a01b03163314611d015760405162461bcd60e51b8152600401610ef290613d25565b7f000000000000000000000000e7ce4f89a0be3058e43ee80d9a5ed03ce3bf97826001600160a01b0316826001600160a01b031603611d825760405162461bcd60e51b815260206004820152601e60248201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006044820152606401610ef2565b61193f828261323b565b60065460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611e585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ef2565b611e653385858403612514565b5060019392505050565b6000610ebe338484612638565b6005546001600160a01b03163314611ea65760405162461bcd60e51b8152600401610ef290613d25565b601f5460ff1615611f135760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f74207265717565737420616761696e20756e74696c206669727374604482015270103932b8bab2b9ba1034b99037bb32b91760791b6064820152608401610ef2565b60648111158015611f245750600081115b611f705760405162461bcd60e51b815260206004820152601a60248201527f4e65656420746f20736574206265747765656e20312d313030250000000000006044820152606401610ef2565b42601d55601f805460ff1916600117905560208190556040517fd99a77b2f3951cd076e75814e44db497e6abc203dd251329da0b62c288f9f48b90600090a150565b6005546001600160a01b03163314611fdc5760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611759565b6005546001600160a01b0316331461205e5760405162461bcd60e51b8152600401610ef290613d25565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611215565b6005546001600160a01b031633146120ba5760405162461bcd60e51b8152600401610ef290613d25565b601383905560128290556014819055806120d48385613dc2565b6120de9190613dc2565b601181905561014a1015611a9d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333325206f72206c6573730000006044820152606401610ef2565b6005546001600160a01b0316331461215e5760405162461bcd60e51b8152600401610ef290613d25565b670de0b6b3a7640000606461217260025490565b61217d906001613d70565b6121879190613d87565b6121919190613d87565b81116121ea5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610ef2565b6121fc81670de0b6b3a7640000613d70565b600a5550565b6005546001600160a01b0316331461222c5760405162461bcd60e51b8152600401610ef290613d25565b60005b8281101561229d57816021600086868581811061224e5761224e613e8a565b90506020020160208101906122639190613b41565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061229581613ea0565b91505061222f565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516122d193929190613eb9565b60405180910390a1505050565b6005546001600160a01b031633146123085760405162461bcd60e51b8152600401610ef290613d25565b601f805460ff1916905560006020819055601d8190556040517ffbcc1c208c9c4d1d9f557267b55c5ae316e74ce676a0db72ef18c6d5f5767c619190a1565b6006546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611466573d6000803e3d6000fd5b6005546000906001600160a01b031633146123be5760405162461bcd60e51b8152600401610ef290613d25565b506010805460ff19169055600190565b6005546001600160a01b031633146123f85760405162461bcd60e51b8152600401610ef290613d25565b60065460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611215565b6005546001600160a01b031633146124535760405162461bcd60e51b8152600401610ef290613d25565b6001600160a01b0381166124b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ef2565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166125765760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ef2565b6001600160a01b0382166125d75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ef2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661265e5760405162461bcd60e51b8152600401610ef290613f12565b6001600160a01b0382166126845760405162461bcd60e51b8152600401610ef290613f57565b8060000361269857611a9d8383600061330b565b600e54610100900460ff16612732576001600160a01b03831660009081526021602052604090205460ff16806126e657506001600160a01b03821660009081526021602052604090205460ff165b6127325760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610ef2565b600e5460ff1615612b48576005546001600160a01b0384811691161480159061276957506005546001600160a01b03838116911614155b801561277d57506001600160a01b03821615155b80156127a657506001600160a01b03821673a1d3737935686e719eecaa6d817bd319573af1db14155b80156127bc5750600554600160a01b900460ff16155b15612b485760105460ff16156128ee577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03161415801561284057507f000000000000000000000000e7ce4f89a0be3058e43ee80d9a5ed03ce3bf97826001600160a01b0316826001600160a01b031614155b156128ee57326000908152600f602052604090205443116128db5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610ef2565b326000908152600f602052604090204390555b6001600160a01b03831660009081526023602052604090205460ff16801561292f57506001600160a01b03821660009081526022602052604090205460ff16155b15612a0d576008548111156129a45760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ef2565b600a546129b083611595565b6129ba9083613dc2565b1115612a085760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ef2565b612b48565b6001600160a01b03821660009081526023602052604090205460ff168015612a4e57506001600160a01b03831660009081526022602052604090205460ff16155b15612ac457600854811115612a085760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ef2565b6001600160a01b03821660009081526022602052604090205460ff16612b4857600a54612af083611595565b612afa9083613dc2565b1115612b485760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610ef2565b6000612b5330611595565b60095490915081108015908190612b725750600e5462010000900460ff165b8015612b885750600554600160a01b900460ff16155b8015612bad57506001600160a01b03851660009081526023602052604090205460ff16155b8015612bd257506001600160a01b03851660009081526021602052604090205460ff16155b8015612bf757506001600160a01b03841660009081526021602052604090205460ff16155b15612c25576005805460ff60a01b1916600160a01b179055612c17613452565b6005805460ff60a01b191690555b6005546001600160a01b03861660009081526021602052604090205460ff600160a01b909204821615911680612c7357506001600160a01b03851660009081526021602052604090205460ff165b15612c7c575060005b60008115612f415743600c546001612c949190613dc2565b10158015612cdc57506001600160a01b03861660009081526023602052604090205460ff1680612cdc57506001600160a01b03871660009081526023602052604090205460ff165b15612d8857612cf76064612cf187606361367f565b90613701565b90506063612d06826021613d70565b612d109190613d87565b601b6000828254612d219190613dc2565b9091555060639050612d34826021613d70565b612d3e9190613d87565b60196000828254612d4f9190613dc2565b9091555060639050612d62826021613d70565b612d6c9190613d87565b601a6000828254612d7d9190613dc2565b90915550612f239050565b6001600160a01b03861660009081526023602052604090205460ff168015612db257506000601154115b15612e4557612dd26103e8612cf16011548861367f90919063ffffffff16565b905060115460125482612de59190613d70565b612def9190613d87565b60196000828254612e009190613dc2565b9091555050601154601454612e159083613d70565b612e1f9190613d87565b601b6000828254612e309190613dc2565b9091555050601154601354612d629083613d70565b6001600160a01b03871660009081526023602052604090205460ff168015612e6f57506000601554115b15612f2357612e8f6103e8612cf16015548861367f90919063ffffffff16565b905060155460165482612ea29190613d70565b612eac9190613d87565b60196000828254612ebd9190613dc2565b9091555050601554601854612ed29083613d70565b612edc9190613d87565b601b6000828254612eed9190613dc2565b9091555050601554601754612f029083613d70565b612f0c9190613d87565b601a6000828254612f1d9190613dc2565b90915550505b8015612f3457612f3487308361330b565b612f3e8186613f9a565b94505b612f4c87878761330b565b6006546001600160a01b031663e30443bc88612f6781611595565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fad57600080fd5b505af1158015612fc1573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc905087612fe281611595565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b5050600554600160a01b900460ff1615915050801561305d57506000601c54115b1561312757601c546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156130cf575060408051601f3d908101601f191682019092526130cc91810190613e5c565b60015b156131255760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b6001600160a01b0382166131905760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ef2565b6131cd8160405180606001604052806022815260200161403c602291396001600160a01b0385166000908152602081905260409020549190613743565b6001600160a01b0383166000908152602081905260409020556002546131f3908261377d565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166000908152602360205260409020805460ff191682151517905561326982826116db565b80156132cf5760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156132b657600080fd5b505af11580156132ca573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166133315760405162461bcd60e51b8152600401610ef290613f12565b6001600160a01b0382166133575760405162461bcd60e51b8152600401610ef290613f57565b6001600160a01b038316600090815260208190526040902054818110156133cf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ef2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613406908490613dc2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161158791815260200190565b600061345d30611595565b90506000601954601a54601b546134749190613dc2565b61347e9190613dc2565b905081158061348b575080155b15613494575050565b6000600282601b54856134a79190613d70565b6134b19190613d87565b6134bb9190613d87565b905060006134c9848361377d565b9050476134d5826137bf565b60006134e1478361377d565b9050600061350f6002601b546134f79190613d87565b6135019088613f9a565b601a54612cf190859061367f565b9050600061353d6002601b546135259190613d87565b61352f9089613f9a565b601954612cf190869061367f565b905060008161354c8486613f9a565b6135569190613f9a565b6000601b819055601a819055601955905086158015906135765750600081115b156135c957613585878261397f565b601b54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613616576040519150601f19603f3d011682016040523d82523d6000602084013e61361b565b606091505b50506007546040519192506001600160a01b0316904790600081818185875af1925050503d806000811461366b576040519150601f19603f3d011682016040523d82523d6000602084013e613670565b606091505b50505050505050505050505050565b60008260000361369157506000610ec2565b600061369d8385613d70565b9050826136aa8583613d87565b146110245760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ef2565b600061102483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a6b565b600081848411156137675760405162461bcd60e51b8152600401610ef29190613a99565b5060006137748486613f9a565b95945050505050565b600061102483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613743565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137f4576137f4613e8a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138969190613fad565b816001815181106138a9576138a9613e8a565b60200260200101906001600160a01b031690816001600160a01b0316815250506138f4307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612514565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613949908590600090869030904290600401613fca565b600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b505050505050565b6139aa307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612514565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015273a1d3737935686e719eecaa6d817bd319573af1db60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015613a46573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112439190613e5c565b60008183613a8c5760405162461bcd60e51b8152600401610ef29190613a99565b5060006137748486613d87565b600060208083528351808285015260005b81811015613ac657858101830151858201604001528201613aaa565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461129057600080fd5b60008060408385031215613b0f57600080fd5b8235613b1a81613ae7565b946020939093013593505050565b600060208284031215613b3a57600080fd5b5035919050565b600060208284031215613b5357600080fd5b813561102481613ae7565b60008060408385031215613b7157600080fd5b8235613b7c81613ae7565b91506020830135613b8c81613ae7565b809150509250929050565b600080600060608486031215613bac57600080fd5b8335613bb781613ae7565b92506020840135613bc781613ae7565b929592945050506040919091013590565b60008060408385031215613beb57600080fd5b823591506020830135613b8c81613ae7565b801515811461129057600080fd5b60008060408385031215613c1e57600080fd5b8235613c2981613ae7565b91506020830135613b8c81613bfd565b600080600060608486031215613c4e57600080fd5b505081359360208301359350604090920135919050565b600080600060408486031215613c7a57600080fd5b833567ffffffffffffffff80821115613c9257600080fd5b818601915086601f830112613ca657600080fd5b813581811115613cb557600080fd5b8760208260051b8501011115613cca57600080fd5b60209283019550935050840135613ce081613bfd565b809150509250925092565b600181811c90821680613cff57607f821691505b602082108103613d1f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ec257610ec2613d5a565b600082613da457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613dbb57600080fd5b5051919050565b80820180821115610ec257610ec2613d5a565b600060208284031215613de757600080fd5b815161102481613bfd565b600080600080600080600080610100898b031215613e0f57600080fd5b8851613e1a81613ae7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b600080600060608486031215613e7157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201613eb257613eb2613d5a565b5060010190565b6040808252810183905260008460608301825b86811015613efc578235613edf81613ae7565b6001600160a01b0316825260209283019290910190600101613ecc565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ec257610ec2613d5a565b600060208284031215613fbf57600080fd5b815161102481613ae7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561401a5784516001600160a01b031683529383019391830191600101613ff5565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365a2646970667358221220929449ffae1aa89caa1e772cc22d0d4bea736c4487ee348545c6672040d3b91564736f6c63430008110033
Deployed Bytecode Sourcemap
42757:22259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44344:41;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;44344:41:0;;;;;;;;4886:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5800:169::-;;;;;;;;;;-1:-1:-1;5800:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;5800:169:0;1205:187:1;43981:31:0;;;;;;;;;;;;;;;;43195:39;;;;;;;;;;;;;;;;49607:230;;;;;;;;;;-1:-1:-1;49607:230:0;;;;;:::i;:::-;;:::i;:::-;;44674:64;;;;;;;;;;-1:-1:-1;44674:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42850:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2025:32:1;;;2007:51;;1995:2;1980:18;42850:51:0;1834:230:1;5207:108:0;;;;;;;;;;-1:-1:-1;5295:12:0;;5207:108;;44254:33;;;;;;;;;;;;;;;;43357;;;;;;;;;;;;;;;;53492:183;;;;;;;;;;-1:-1:-1;53492:183:0;;;;;:::i;:::-;;:::i;5977:492::-;;;;;;;;;;-1:-1:-1;5977:492:0;;;;;:::i;:::-;;:::i;42985:38::-;;;;;;;;;;-1:-1:-1;42985:38:0;;;;-1:-1:-1;;;;;42985:38:0;;;52170:349;;;;;;;;;;-1:-1:-1;52170:349:0;;;;;:::i;:::-;;:::i;5106:93::-;;;;;;;;;;-1:-1:-1;5106:93:0;;5189:2;3305:36:1;;3293:2;3278:18;5106:93:0;3163:184:1;48958:130:0;;;;;;;;;;-1:-1:-1;48958:130:0;;;;;:::i;:::-;;:::i;6477:215::-;;;;;;;;;;-1:-1:-1;6477:215:0;;;;;:::i;:::-;;:::i;42657:91::-;;;;;;;;;;-1:-1:-1;42657:91:0;;;;;:::i;:::-;;:::i;42908:38::-;;;;;;;;;;;;;;;43466:33;;;;;;;;;;-1:-1:-1;43466:33:0;;;;;;;;44059:28;;;;;;;;;;;;;;;;54812:97;;;;;;;;;;;;;:::i;53357:127::-;;;;;;;;;;-1:-1:-1;53357:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;53448:28:0;53424:4;53448:28;;;:19;:28;;;;;;;;;53357:127;53178:171;;;;;;;;;;-1:-1:-1;53178:171:0;;;;;:::i;:::-;;:::i;54181:359::-;;;;;;;;;;-1:-1:-1;54181:359:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4237:32:1;;;4219:51;;4301:2;4286:18;;4279:34;;;;4329:18;;;4322:34;;;;4387:2;4372:18;;4365:34;;;;4430:3;4415:19;;4408:35;4257:3;4459:19;;4452:35;4518:3;4503:19;;4496:35;4562:3;4547:19;;4540:35;4206:3;4191:19;54181:359:0;3880:701:1;55051:141:0;;;;;;;;;;;;;:::i;53680:136::-;;;;;;;;;;-1:-1:-1;53680:136:0;;;;;:::i;:::-;;:::i;43546:31::-;;;;;;;;;;-1:-1:-1;43546:31:0;;;;;;;;;;;54545:259;;;;;;;;;;-1:-1:-1;54545:259:0;;;;;:::i;:::-;;:::i;5323:127::-;;;;;;;;;;-1:-1:-1;5323:127:0;;;;;:::i;:::-;;:::i;63995:281::-;;;;;;;;;;;;;:::i;17627:148::-;;;;;;;;;;;;;:::i;55204:119::-;;;;;;;;;;;;;:::i;43942:32::-;;;;;;;;;;;;;;;;55379:159;;;;;;;;;;;;;:::i;50881:202::-;;;;;;;;;;-1:-1:-1;50881:202:0;;;;;:::i;:::-;;:::i;64284:501::-;;;;;;;;;;;;;:::i;44491:31::-;;;;;;;;;;;;;;;;63339:191;;;;;;;;;;;;;:::i;50072:390::-;;;;;;;;;;-1:-1:-1;50072:390:0;;;;;:::i;:::-;;:::i;52527:395::-;;;;;;;;;;-1:-1:-1;52527:395:0;;;;;:::i;:::-;;:::i;49377:218::-;;;;;;;;;;;;;:::i;16985:79::-;;;;;;;;;;-1:-1:-1;17050:6:0;;-1:-1:-1;;;;;17050:6:0;16985:79;;53824:352;;;;;;;;;;-1:-1:-1;53824:352:0;;;;;:::i;:::-;;:::i;4994:104::-;;;;;;;;;;;;;:::i;43821:41::-;;;;;;;;;;;;43858:4;43821:41;;51597:219;;;;;;;;;;-1:-1:-1;51597:219:0;;;;;:::i;:::-;;:::i;44300:35::-;;;;;;;;;;;;;;;;53062:108;;;;;;;;;;;;;:::i;6700:413::-;;;;;;;;;;-1:-1:-1;6700:413:0;;;;;:::i;:::-;;:::i;5458:175::-;;;;;;;;;;-1:-1:-1;5458:175:0;;;;;:::i;:::-;;:::i;44896:58::-;;;;;;;;;;-1:-1:-1;44896:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44025:27;;;;;;;;;;;;;;;;43506:33;;;;;;;;;;-1:-1:-1;43506:33:0;;;;;;;;;;;63538:449;;;;;;;;;;-1:-1:-1;63538:449:0;;;;;:::i;:::-;;:::i;51091:184::-;;;;;;;;;;-1:-1:-1;51091:184:0;;;;;:::i;:::-;;:::i;49193:126::-;;;;;;;;;;-1:-1:-1;49193:126:0;;;;;:::i;:::-;;:::i;50474:399::-;;;;;;;;;;-1:-1:-1;50474:399:0;;;;;:::i;:::-;;:::i;49849:211::-;;;;;;;;;;-1:-1:-1;49849:211:0;;;;;:::i;:::-;;:::i;51283:306::-;;;;;;;;;;-1:-1:-1;51283:306:0;;;;;:::i;:::-;;:::i;64793:220::-;;;;;;;;;;;;;:::i;43769:39::-;;;;;;;;;;-1:-1:-1;43769:39:0;;;;;;;;43076:35;;;;;;;;;;;;;;;;44132:30;;;;;;;;;;;;;;;;43906:29;;;;;;;;;;;;;;;;43871:28;;;;;;;;;;;;;;;;5641:151;;;;;;;;;;-1:-1:-1;5641:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5757:18:0;;;5730:7;5757:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5641:151;43118:33;;;;;;;;;;;;;;;;54917:126;;;;;;;;;;;;;:::i;48731:134::-;;;;;;;;;;;;;:::i;52930:124::-;;;;;;;;;;-1:-1:-1;52930:124:0;;;;;:::i;:::-;;:::i;43280:37::-;;;;;;;;;;;;;;;;44392:49;;;;;;;;;;;;;;;;44094:31;;;;;;;;;;;;;;;;17930:244;;;;;;;;;;-1:-1:-1;17930:244:0;;;;;:::i;:::-;;:::i;44175:31::-;;;;;;;;;;;;;;;;43158:24;;;;;;;;;;;;;;;;44213:34;;;;;;;;;;;;;;;;44448:36;;;;;;;;;;-1:-1:-1;44448:36:0;;;;;;;;43032:31;;;;;;;;;;-1:-1:-1;43032:31:0;;;;-1:-1:-1;;;;;43032:31:0;;;4886:100;4940:13;4973:5;4966:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4886:100;:::o;5800:169::-;5883:4;5900:39;954:10;5923:7;5932:6;5900:8;:39::i;:::-;-1:-1:-1;5957:4:0;5800:169;;;;;:::o;49607:230::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;;;;;;;;;49722:4:::1;49716;49696:13;5295:12:::0;;;5207:108;49696:13:::1;:17;::::0;49712:1:::1;49696:17;:::i;:::-;:24;;;;:::i;:::-;49695:31;;;;:::i;:::-;49686:6;:40;49678:100;;;::::0;-1:-1:-1;;;49678:100:0;;7647:2:1;49678:100:0::1;::::0;::::1;7629:21:1::0;7686:2;7666:18;;;7659:30;7725:34;7705:18;;;7698:62;-1:-1:-1;;;7776:18:1;;;7769:45;7831:19;;49678:100:0::1;7445:411:1::0;49678:100:0::1;49812:17;:6:::0;49822::::1;49812:17;:::i;:::-;49789:20;:40:::0;-1:-1:-1;49607:230:0:o;53492:183::-;53608:15;;:60;;-1:-1:-1;;;53608:60:0;;-1:-1:-1;;;;;8091:15:1;;;53608:60:0;;;8073:34:1;8143:15;;;8123:18;;;8116:43;53584:7:0;;53608:15;;:38;;8008:18:1;;53608:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53601:67;53492:183;-1:-1:-1;;;53492:183:0:o;5977:492::-;6117:4;6134:36;6144:6;6152:9;6163:6;6134:9;:36::i;:::-;-1:-1:-1;;;;;6210:19:0;;6183:24;6210:19;;;:11;:19;;;;;;;;954:10;6210:33;;;;;;;;6262:26;;;;6254:79;;;;-1:-1:-1;;;6254:79:0;;8561:2:1;6254:79:0;;;8543:21:1;8600:2;8580:18;;;8573:30;8639:34;8619:18;;;8612:62;-1:-1:-1;;;8690:18:1;;;8683:38;8738:19;;6254:79:0;8359:404:1;6254:79:0;6369:57;6378:6;954:10;6419:6;6400:16;:25;6369:8;:57::i;:::-;-1:-1:-1;6457:4:0;;5977:492;-1:-1:-1;;;;5977:492:0:o;52170:349::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52269:33:0;::::1;52261:70;;;::::0;-1:-1:-1;;;52261:70:0;;8970:2:1;52261:70:0::1;::::0;::::1;8952:21:1::0;9009:2;8989:18;;;8982:30;9048:26;9028:18;;;9021:54;9092:18;;52261:70:0::1;8768:348:1::0;52261:70:0::1;52342:42;52358:19;52379:4;52342:15;:42::i;:::-;52445:16;::::0;52400:62:::1;::::0;-1:-1:-1;;;;;52445:16:0;;::::1;::::0;52400:62;::::1;::::0;::::1;::::0;52445:16:::1;::::0;52400:62:::1;52473:16;:38:::0;;-1:-1:-1;;;;;;52473:38:0::1;-1:-1:-1::0;;;;;52473:38:0;;;::::1;::::0;;;::::1;::::0;;52170:349::o;48958:130::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;49035:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;49035:45:0;;-1:-1:-1;;;;;2025:32:1;;;49035:45:0::1;::::0;::::1;2007:51:1::0;49035:15:0;;::::1;::::0;:36:::1;::::0;1980:18:1;;49035:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48958:130:::0;:::o;6477:215::-;954:10;6565:4;6614:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6614:34:0;;;;;;;;;;6565:4;;6582:80;;6605:7;;6614:47;;6651:10;;6614:47;:::i;:::-;6582:8;:80::i;42657:91::-;42713:27;954:10;42733:6;42713:5;:27::i;:::-;42657:91;:::o;54812:97::-;54843:15;;:58;;-1:-1:-1;;;54843:58:0;;54882:10;54843:58;;;9435:51:1;54843:15:0;9502:18:1;;;9495:50;-1:-1:-1;;;;;54843:15:0;;;;:30;;9408:18:1;;54843:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53178:171::-;53287:15;;:54;;-1:-1:-1;;;53287:54:0;;-1:-1:-1;;;;;2025:32:1;;;53287:54:0;;;2007:51:1;53260:7:0;;53287:15;;:41;;1980:18:1;;53287:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54181:359::-;54479:15;;:53;;-1:-1:-1;;;54479:53:0;;;;;9980:25:1;;;-1:-1:-1;;;;;10041:32:1;;;10021:18;;;10014:60;54303:7:0;;;;;;;;;;;;;;;;54479:15;;;:33;;9953:18:1;;54479:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54472:60;;;;;;;;;;;;;;;;54181:359;;;;;;;;;;;:::o;55051:141::-;55143:15;;:41;;;-1:-1:-1;;;55143:41:0;;;;55116:7;;-1:-1:-1;;;;;55143:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55136:48;;55051:141;:::o;53680:136::-;53773:15;;:38;;-1:-1:-1;;;53773:38:0;;-1:-1:-1;;;;;2025:32:1;;;53773:38:0;;;2007:51:1;53752:7:0;;53773:15;;:29;;1980:18:1;;53773:38:0;1834:230:1;54545:259:0;54671:15;;:28;;-1:-1:-1;;;;;;54671:28:0;;;;;160:25:1;;;54605:18:0;;;;;;-1:-1:-1;;;;;54671:15:0;;:23;;133:18:1;;54671:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54709:87;;;11313:25:1;;;11369:2;11354:18;;11347:34;;;11397:18;;;11390:34;;;11455:2;11440:18;;11433:34;;;54604:95:0;;-1:-1:-1;54604:95:0;;-1:-1:-1;54604:95:0;-1:-1:-1;54786:9:0;;54774:5;;54709:87;;11300:3:1;11285:19;54709:87:0;;;;;;;;54599:205;;;54545:259;:::o;5323:127::-;-1:-1:-1;;;;;5424:18:0;5397:7;5424:18;;;;;;;;;;;;5323:127::o;63995:281::-;64077:24;;64055:7;;64077:24;;64074:195;;;64153:25;;64124:26;;:54;;;;:::i;64074:195::-;-1:-1:-1;64227:1:0;;63995:281::o;17627:148::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;17718:6:::1;::::0;17697:40:::1;::::0;17734:1:::1;::::0;-1:-1:-1;;;;;17718:6:0::1;::::0;17697:40:::1;::::0;17734:1;;17697:40:::1;17748:6;:19:::0;;-1:-1:-1;;;;;;17748:19:0::1;::::0;;17627:148::o;55204:119::-;55285:15;;:30;;;-1:-1:-1;;;55285:30:0;;;;55258:7;;-1:-1:-1;;;;;55285:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;55379:159;17197:6;;55431:4;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;55447:14:0::1;:22:::0;;-1:-1:-1;;55447:22:0;;::::1;::::0;;;55480:20:::1;:28:::0;;;;::::1;::::0;;55447:22;55379:159;:::o;50881:202::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50971:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;50971:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51033:42;;1345:41:1;;;51033:42:0::1;::::0;1318:18:1;51033:42:0::1;;;;;;;;50881:202:::0;;:::o;64284:501::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;64372:29:::1;:27;:29::i;:::-;64353:15;:48;;:85;;;;;64437:1;64405:29;:27;:29::i;:::-;:33;64353:85;64345:120;;;::::0;-1:-1:-1;;;64345:120:0;;11680:2:1;64345:120:0::1;::::0;::::1;11662:21:1::0;11719:2;11699:18;;;11692:30;-1:-1:-1;;;11738:18:1;;;11731:52;11800:18;;64345:120:0::1;11478:346:1::0;64345:120:0::1;64505:1;64476:26;:30:::0;;;64517:24:::1;:32:::0;;-1:-1:-1;;64517:32:0::1;::::0;;64644:16:::1;::::0;64586:55:::1;::::0;-1:-1:-1;;;64586:55:0;;64635:4:::1;64586:55;::::0;::::1;2007:51:1::0;64663:3:0::1;::::0;64644:16;64601:13:::1;-1:-1:-1::0;;;;;64586:40:0::1;::::0;::::1;::::0;1980:18:1;;64586:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;;;:::i;:::-;64706:1;64687:16;:20:::0;64720:57:::1;::::0;-1:-1:-1;;;64720:57:0;;64751:10:::1;64720:57;::::0;::::1;12003:51:1::0;12070:18;;;12063:34;;;64562:104:0;;-1:-1:-1;64727:13:0::1;-1:-1:-1::0;;;;;64720:30:0::1;::::0;::::1;::::0;11976:18:1;;64720:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64334:451;64284:501::o:0;63339:191::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;63415:58:::1;::::0;63398:12:::1;::::0;63423:10:::1;::::0;63447:21:::1;::::0;63398:12;63415:58;63398:12;63415:58;63447:21;63423:10;63415:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63397:76;;;63492:7;63484:38;;;::::0;-1:-1:-1;;;63484:38:0;;12520:2:1;63484:38:0::1;::::0;::::1;12502:21:1::0;12559:2;12539:18;;;12532:30;-1:-1:-1;;;12578:18:1;;;12571:48;12636:18;;63484:38:0::1;12318:342:1::0;50072:390:0;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;50193:16:::1;:33:::0;;;50237:13:::1;:27:::0;;;50275:15:::1;:31:::0;;;50293:13;50332:32:::1;50253:11:::0;50212:14;50332:32:::1;:::i;:::-;:50;;;;:::i;:::-;50317:12;:65:::0;;;50417:3:::1;-1:-1:-1::0;50401:19:0::1;50393:61;;;::::0;-1:-1:-1;;;50393:61:0;;12867:2:1;50393:61:0::1;::::0;::::1;12849:21:1::0;12906:2;12886:18;;;12879:30;12945:31;12925:18;;;12918:59;12994:18;;50393:61:0::1;12665:353:1::0;50393:61:0::1;50072:390:::0;;;:::o;52527:395::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;52627:6:::1;52615:8;:18;;:40;;;;;52649:6;52637:8;:18;;52615:40;52607:106;;;::::0;-1:-1:-1;;;52607:106:0;;13225:2:1;52607:106:0::1;::::0;::::1;13207:21:1::0;13264:2;13244:18;;;13237:30;13303:34;13283:18;;;13276:62;-1:-1:-1;;;13354:18:1;;;13347:51;13415:19;;52607:106:0::1;13023:417:1::0;52607:106:0::1;52744:16;;52732:8;:28:::0;52724:85:::1;;;::::0;-1:-1:-1;;;52724:85:0;;13647:2:1;52724:85:0::1;::::0;::::1;13629:21:1::0;13686:2;13666:18;;;13659:30;13725:34;13705:18;;;13698:62;-1:-1:-1;;;13776:18:1;;;13769:42;13828:19;;52724:85:0::1;13445:408:1::0;52724:85:0::1;52859:16;::::0;52825:51:::1;::::0;52849:8;;52825:51:::1;::::0;;;::::1;52887:16;:27:::0;52527:395::o;49377:218::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;49441:13:::1;::::0;::::1;::::0;::::1;;;49440:14;49432:51;;;::::0;-1:-1:-1;;;49432:51:0;;14060:2:1;49432:51:0::1;::::0;::::1;14042:21:1::0;14099:2;14079:18;;;14072:30;14138:26;14118:18;;;14111:54;14182:18;;49432:51:0::1;13858:348:1::0;49432:51:0::1;49494:13;:20:::0;;-1:-1:-1;;49525:18:0;;;;;49575:12:::1;49554:18;:33:::0;49377:218::o;53824:352::-;54120:15;;:48;;-1:-1:-1;;;54120:48:0;;-1:-1:-1;;;;;8091:15:1;;;54120:48:0;;;8073:34:1;8143:15;;;8123:18;;;8116:43;53941:7:0;;;;;;;;;;;;;;;;54120:15;;;:26;;8008:18:1;;54120:48:0;7861:304:1;4994:104:0;5050:13;5083:7;5076:14;;;;;:::i;51597:219::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;51706:13:::1;-1:-1:-1::0;;;;;51698:21:0::1;:4;-1:-1:-1::0;;;;;51698:21:0::1;::::0;51690:64:::1;;;::::0;-1:-1:-1;;;51690:64:0;;14413:2:1;51690:64:0::1;::::0;::::1;14395:21:1::0;14452:2;14432:18;;;14425:30;14491:32;14471:18;;;14464:60;14541:18;;51690:64:0::1;14211:354:1::0;51690:64:0::1;51767:41;51796:4;51802:5;51767:28;:41::i;53062:108::-:0;53135:15;;:27;;;-1:-1:-1;;;53135:27:0;;;;53108:7;;-1:-1:-1;;;;;53135:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;6700:413;954:10;6793:4;6837:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6837:34:0;;;;;;;;;;6890:35;;;;6882:85;;;;-1:-1:-1;;;6882:85:0;;14772:2:1;6882:85:0;;;14754:21:1;14811:2;14791:18;;;14784:30;14850:34;14830:18;;;14823:62;-1:-1:-1;;;14901:18:1;;;14894:35;14946:19;;6882:85:0;14570:401:1;6882:85:0;7003:67;954:10;7026:7;7054:15;7035:16;:34;7003:8;:67::i;:::-;-1:-1:-1;7101:4:0;;6700:413;-1:-1:-1;;;6700:413:0:o;5458:175::-;5544:4;5561:42;954:10;5585:9;5596:6;5561:9;:42::i;63538:449::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;63630:24:::1;::::0;::::1;;63629:25;63621:87;;;::::0;-1:-1:-1;;;63621:87:0;;15178:2:1;63621:87:0::1;::::0;::::1;15160:21:1::0;15217:2;15197:18;;;15190:30;15256:34;15236:18;;;15229:62;-1:-1:-1;;;15307:18:1;;;15300:47;15364:19;;63621:87:0::1;14976:413:1::0;63621:87:0::1;63745:3;63727:14;:21;;:43;;;;;63769:1;63752:14;:18;63727:43;63719:82;;;::::0;-1:-1:-1;;;63719:82:0;;15596:2:1;63719:82:0::1;::::0;::::1;15578:21:1::0;15635:2;15615:18;;;15608:30;15674:28;15654:18;;;15647:56;15720:18;;63719:82:0::1;15394:350:1::0;63719:82:0::1;63841:15;63812:26;:44:::0;63867:24:::1;:31:::0;;-1:-1:-1;;63867:31:0::1;63894:4;63867:31;::::0;;63909:16:::1;:33:::0;;;63958:21:::1;::::0;::::1;::::0;63867:24:::1;::::0;63958:21:::1;63538:449:::0;:::o;51091:184::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51176:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;51176:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51233:34;;1345:41:1;;;51233:34:0::1;::::0;1318:18:1;51233:34:0::1;1205:187:1::0;49193:126:0;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;49268:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;49268:43:0;;-1:-1:-1;;;;;2025:32:1;;;49268:43:0::1;::::0;::::1;2007:51:1::0;49268:15:0;;::::1;::::0;:34:::1;::::0;1980:18:1;;49268:43:0::1;1834:230:1::0;50474:399:0;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;50596:17:::1;:34:::0;;;50641:14:::1;:28:::0;;;50680:16:::1;:32:::0;;;50699:13;50739:34:::1;50658:11:::0;50616:14;50739:34:::1;:::i;:::-;:53;;;;:::i;:::-;50723:13;:69:::0;;;50828:3:::1;-1:-1:-1::0;50811:20:0::1;50803:62;;;::::0;-1:-1:-1;;;50803:62:0;;15951:2:1;50803:62:0::1;::::0;::::1;15933:21:1::0;15990:2;15970:18;;;15963:30;16029:31;16009:18;;;16002:59;16078:18;;50803:62:0::1;15749:353:1::0;49849:211:0;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;49969:4:::1;49964:3;49944:13;5295:12:::0;;;5207:108;49944:13:::1;:17;::::0;49960:1:::1;49944:17;:::i;:::-;:23;;;;:::i;:::-;49943:30;;;;:::i;:::-;49934:6;:39;49926:86;;;::::0;-1:-1:-1;;;49926:86:0;;16309:2:1;49926:86:0::1;::::0;::::1;16291:21:1::0;16348:2;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;-1:-1:-1;;;16438:18:1;;;16431:32;16480:19;;49926:86:0::1;16107:398:1::0;49926:86:0::1;50035:17;:6:::0;50045::::1;50035:17;:::i;:::-;50023:9;:29:::0;-1:-1:-1;49849:211:0:o;51283:306::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;51402:9:::1;51398:115;51417:19:::0;;::::1;51398:115;;;51493:8;51458:19;:32;51478:8;;51487:1;51478:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51458:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51458:32:0;:43;;-1:-1:-1;;51458:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51438:3;::::1;::::0;::::1;:::i;:::-;;;;51398:115;;;;51530:51;51562:8;;51572;51530:51;;;;;;;;:::i;:::-;;;;;;;;51283:306:::0;;;:::o;64793:220::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;64858:24:::1;:32:::0;;-1:-1:-1;;64858:32:0::1;::::0;;64885:5:::1;64901:16;:20:::0;;;64932:26:::1;:30:::0;;;64978:27:::1;::::0;::::1;::::0;64885:5;64978:27:::1;64793:220::o:0;54917:126::-;54996:15;;:39;;;-1:-1:-1;;;54996:39:0;;;;54972:7;;-1:-1:-1;;;;;54996:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;48731:134;17197:6;;48791:4;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;48807:20:0::1;:28:::0;;-1:-1:-1;;48807:28:0::1;::::0;;;48731:134;:::o;52930:124::-;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;53004:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;53004:42:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;53004:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;53004:42:0::1;14:177:1::0;17930:244:0;17197:6;;-1:-1:-1;;;;;17197:6:0;954:10;17197:22;17189:67;;;;-1:-1:-1;;;17189:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18019:22:0;::::1;18011:73;;;::::0;-1:-1:-1;;;18011:73:0;;17783:2:1;18011:73:0::1;::::0;::::1;17765:21:1::0;17822:2;17802:18;;;17795:30;17861:34;17841:18;;;17834:62;-1:-1:-1;;;17912:18:1;;;17905:36;17958:19;;18011:73:0::1;17581:402:1::0;18011:73:0::1;18121:6;::::0;18100:38:::1;::::0;-1:-1:-1;;;;;18100:38:0;;::::1;::::0;18121:6:::1;::::0;18100:38:::1;::::0;18121:6:::1;::::0;18100:38:::1;18149:6;:17:::0;;-1:-1:-1;;;;;;18149:17:0::1;-1:-1:-1::0;;;;;18149:17:0;;;::::1;::::0;;;::::1;::::0;;17930:244::o;8467:380::-;-1:-1:-1;;;;;8603:19:0;;8595:68;;;;-1:-1:-1;;;8595:68:0;;18190:2:1;8595:68:0;;;18172:21:1;18229:2;18209:18;;;18202:30;18268:34;18248:18;;;18241:62;-1:-1:-1;;;18319:18:1;;;18312:34;18363:19;;8595:68:0;17988:400:1;8595:68:0;-1:-1:-1;;;;;8682:21:0;;8674:68;;;;-1:-1:-1;;;8674:68:0;;18595:2:1;8674:68:0;;;18577:21:1;18634:2;18614:18;;;18607:30;18673:34;18653:18;;;18646:62;-1:-1:-1;;;18724:18:1;;;18717:32;18766:19;;8674:68:0;18393:398:1;8674:68:0;-1:-1:-1;;;;;8755:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8807:32;;160:25:1;;;8807:32:0;;133:18:1;8807:32:0;;;;;;;8467:380;;;:::o;55550:4951::-;-1:-1:-1;;;;;55682:18:0;;55674:68;;;;-1:-1:-1;;;55674:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55761:16:0;;55753:64;;;;-1:-1:-1;;;55753:64:0;;;;;;;:::i;:::-;55842:6;55852:1;55842:11;55839:92;;55870:28;55886:4;55892:2;55896:1;55870:15;:28::i;55839:92::-;55955:13;;;;;;;55951:136;;-1:-1:-1;;;;;55992:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;56021:23:0;;;;;;:19;:23;;;;;;;;55992:52;55984:91;;;;-1:-1:-1;;;55984:91:0;;19808:2:1;55984:91:0;;;19790:21:1;19847:2;19827:18;;;19820:30;19886:28;19866:18;;;19859:56;19932:18;;55984:91:0;19606:350:1;55984:91:0;56110:14;;;;56107:1681;;;17050:6;;-1:-1:-1;;;;;56162:15:0;;;17050:6;;56162:15;;;;:49;;-1:-1:-1;17050:6:0;;-1:-1:-1;;;;;56198:13:0;;;17050:6;;56198:13;;56162:49;:86;;;;-1:-1:-1;;;;;;56232:16:0;;;;56162:86;:164;;;;-1:-1:-1;;;;;;56269:57:0;;56283:42;56269:57;;56162:164;:194;;;;-1:-1:-1;56348:8:0;;-1:-1:-1;;;56348:8:0;;;;56347:9;56162:194;56140:1637;;;56530:20;;;;56526:406;;;56592:15;-1:-1:-1;;;;;56578:30:0;:2;-1:-1:-1;;;;;56578:30:0;;;:62;;;;;56626:13;-1:-1:-1;;;;;56612:28:0;:2;-1:-1:-1;;;;;56612:28:0;;;56578:62;56574:339;;;56705:9;56676:39;;;;:28;:39;;;;;;56718:12;-1:-1:-1;56668:140:0;;;;-1:-1:-1;;;56668:140:0;;20163:2:1;56668:140:0;;;20145:21:1;20202:2;20182:18;;;20175:30;20241:34;20221:18;;;20214:62;20312:34;20292:18;;;20285:62;-1:-1:-1;;;20363:19:1;;;20356:40;20413:19;;56668:140:0;19961:477:1;56668:140:0;56864:9;56835:39;;;;:28;:39;;;;;56877:12;56835:54;;56574:339;-1:-1:-1;;;;;57000:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;57036:35:0;;;;;;:31;:35;;;;;;;;57035:36;57000:71;56996:766;;;57114:20;;57104:6;:30;;57096:96;;;;-1:-1:-1;;;57096:96:0;;20645:2:1;57096:96:0;;;20627:21:1;20684:2;20664:18;;;20657:30;20723:34;20703:18;;;20696:62;-1:-1:-1;;;20774:18:1;;;20767:51;20835:19;;57096:96:0;20443:417:1;57096:96:0;57249:9;;57232:13;57242:2;57232:9;:13::i;:::-;57223:22;;:6;:22;:::i;:::-;:35;;57215:75;;;;-1:-1:-1;;;57215:75:0;;21067:2:1;57215:75:0;;;21049:21:1;21106:2;21086:18;;;21079:30;21145:29;21125:18;;;21118:57;21192:18;;57215:75:0;20865:351:1;57215:75:0;56996:766;;;-1:-1:-1;;;;;57367:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;57401:37:0;;;;;;:31;:37;;;;;;;;57400:38;57367:71;57363:399;;;57481:20;;57471:6;:30;;57463:97;;;;-1:-1:-1;;;57463:97:0;;21423:2:1;57463:97:0;;;21405:21:1;21462:2;21442:18;;;21435:30;21501:34;21481:18;;;21474:62;-1:-1:-1;;;21552:18:1;;;21545:52;21614:19;;57463:97:0;21221:418:1;57363:399:0;-1:-1:-1;;;;;57607:35:0;;;;;;:31;:35;;;;;;;;57603:159;;57701:9;;57684:13;57694:2;57684:9;:13::i;:::-;57675:22;;:6;:22;:::i;:::-;:35;;57667:75;;;;-1:-1:-1;;;57667:75:0;;21067:2:1;57667:75:0;;;21049:21:1;21106:2;21086:18;;;21079:30;21145:29;21125:18;;;21118:57;21192:18;;57667:75:0;20865:351:1;57667:75:0;57794:28;57825:24;57843:4;57825:9;:24::i;:::-;57909:18;;57794:55;;-1:-1:-1;57885:42:0;;;;;;;57958:35;;-1:-1:-1;57982:11:0;;;;;;;57958:35;:61;;;;-1:-1:-1;58011:8:0;;-1:-1:-1;;;58011:8:0;;;;58010:9;57958:61;:110;;;;-1:-1:-1;;;;;;58037:31:0;;;;;;:25;:31;;;;;;;;58036:32;57958:110;:153;;;;-1:-1:-1;;;;;;58086:25:0;;;;;;:19;:25;;;;;;;;58085:26;57958:153;:194;;;;-1:-1:-1;;;;;;58129:23:0;;;;;;:19;:23;;;;;;;;58128:24;57958:194;57940:322;;;58179:8;:15;;-1:-1:-1;;;;58179:15:0;-1:-1:-1;;;58179:15:0;;;58209:10;:8;:10::i;:::-;58234:8;:16;;-1:-1:-1;;;;58234:16:0;;;57940:322;58290:8;;-1:-1:-1;;;;;58399:25:0;;58274:12;58399:25;;;:19;:25;;;;;;58290:8;-1:-1:-1;;;58290:8:0;;;;;58289:9;;58399:25;;:52;;-1:-1:-1;;;;;;58428:23:0;;;;;;:19;:23;;;;;;;;58399:52;58396:99;;;-1:-1:-1;58478:5:0;58396:99;58515:12;58606:7;58603:1365;;;58658:12;58632:18;;58653:1;58632:22;;;;:::i;:::-;:38;;:108;;;;-1:-1:-1;;;;;;58675:29:0;;;;;;:25;:29;;;;;;;;;:64;;-1:-1:-1;;;;;;58708:31:0;;;;;;:25;:31;;;;;;;;58675:64;58629:1182;;;58767:23;58786:3;58767:14;:6;58778:2;58767:10;:14::i;:::-;:18;;:23::i;:::-;58760:30;-1:-1:-1;58843:2:0;58831:9;58760:30;58838:2;58831:9;:::i;:::-;:14;;;;:::i;:::-;58809:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;58896:2:0;;-1:-1:-1;58884:9:0;:4;58891:2;58884:9;:::i;:::-;:14;;;;:::i;:::-;58864:16;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;58952:2:0;;-1:-1:-1;58940:9:0;:4;58947:2;58940:9;:::i;:::-;:14;;;;:::i;:::-;58917:19;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;58629:1182:0;;-1:-1:-1;58629:1182:0;;-1:-1:-1;;;;;59019:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;59068:1;59052:13;;:17;59019:50;59015:796;;;59096:41;43858:4;59096:25;59107:13;;59096:6;:10;;:25;;;;:::i;:41::-;59089:48;;59200:13;;59183:14;;59176:4;:21;;;;:::i;:::-;:37;;;;:::i;:::-;59156:16;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;59280:13:0;;59261:16;;59254:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;59232:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;59362:13:0;;59342:17;;59335:24;;:4;:24;:::i;59015:796::-;-1:-1:-1;;;;;59450:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;59500:1;59485:12;;:16;59450:51;59447:364;;;59526:40;43858:4;59526:24;59537:12;;59526:6;:10;;:24;;;;:::i;:40::-;59519:47;;59625:12;;59609:13;;59602:4;:20;;;;:::i;:::-;:35;;;;:::i;:::-;59582:16;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;59703:12:0;;59685:15;;59678:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;59656:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;59783:12:0;;59764:16;;59757:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;59734:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;59447:364:0;59830:8;;59827:93;;59862:42;59878:4;59892;59899;59862:15;:42::i;:::-;59942:14;59952:4;59942:14;;:::i;:::-;;;58603:1365;59980:33;59996:4;60002:2;60006:6;59980:15;:33::i;:::-;60026:15;;-1:-1:-1;;;;;60026:15:0;:26;60061:4;60068:15;60061:4;60068:9;:15::i;:::-;60026:58;;-1:-1:-1;;;;;;60026:58:0;;;;;;;-1:-1:-1;;;;;12021:32:1;;;60026:58:0;;;12003:51:1;12070:18;;;12063:34;11976:18;;60026:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60095:15:0;;-1:-1:-1;;;;;60095:15:0;;-1:-1:-1;60095:26:0;;-1:-1:-1;60130:2:0;60135:13;60130:2;60135:9;:13::i;:::-;60095:54;;-1:-1:-1;;;;;;60095:54:0;;;;;;;-1:-1:-1;;;;;12021:32:1;;;60095:54:0;;;12003:51:1;12070:18;;;12063:34;11976:18;;60095:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60166:8:0;;-1:-1:-1;;;60166:8:0;;;;60165:9;;-1:-1:-1;;60165:33:0;;;;;60197:1;60178:16;;:20;60165:33;60162:332;;;60223:16;;60254:15;;:28;;-1:-1:-1;;;;;;60254:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;60254:15:0;;;;:23;;133:18:1;;60254:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;60254:28:0;;;;;;;;-1:-1:-1;;60254:28:0;;;;;;;;;;;;:::i;:::-;;;60250:233;;;60371:86;;;11313:25:1;;;11369:2;11354:18;;11347:34;;;11397:18;;;11390:34;;;11455:2;11440:18;;11433:34;;;60447:9:0;;60436:4;;60371:86;;11300:3:1;11285:19;60371:86:0;;;;;;;60283:184;;;60250:233;60200:294;60162:332;55663:4838;;;;55550:4951;;;:::o;8039:420::-;-1:-1:-1;;;;;8123:21:0;;8115:67;;;;-1:-1:-1;;;8115:67:0;;22274:2:1;8115:67:0;;;22256:21:1;22313:2;22293:18;;;22286:30;22352:34;22332:18;;;22325:62;-1:-1:-1;;;22403:18:1;;;22396:31;22444:19;;8115:67:0;22072:397:1;8115:67:0;8280:68;8303:6;8280:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8280:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;8259:18:0;;:9;:18;;;;;;;;;;:89;8374:12;;:24;;8391:6;8374:16;:24::i;:::-;8359:12;:39;8414:37;;160:25:1;;;8440:1:0;;-1:-1:-1;;;;;8414:37:0;;;;;148:2:1;133:18;8414:37:0;;;;;;;8039:420;;:::o;51824:338::-;-1:-1:-1;;;;;51907:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;51907:39:0;;;;;;;51959:38;51907:31;:39;51959:25;:38::i;:::-;52021:5;52018:79;;;52043:15;;:42;;-1:-1:-1;;;52043:42:0;;-1:-1:-1;;;;;2025:32:1;;;52043:42:0;;;2007:51:1;52043:15:0;;;;:36;;1980:18:1;;52043:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52018:79;52114:40;;;;;;-1:-1:-1;;;;;52114:40:0;;;;;;;;51824:338;;:::o;7121:614::-;-1:-1:-1;;;;;7261:20:0;;7253:70;;;;-1:-1:-1;;;7253:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7342:23:0;;7334:71;;;;-1:-1:-1;;;7334:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7442:17:0;;7418:21;7442:17;;;;;;;;;;;7478:23;;;;7470:74;;;;-1:-1:-1;;;7470:74:0;;22676:2:1;7470:74:0;;;22658:21:1;22715:2;22695:18;;;22688:30;22754:34;22734:18;;;22727:62;-1:-1:-1;;;22805:18:1;;;22798:36;22851:19;;7470:74:0;22474:402:1;7470:74:0;-1:-1:-1;;;;;7580:17:0;;;:9;:17;;;;;;;;;;;7600:22;;;7580:42;;7644:20;;;;;;;;:30;;7616:6;;7580:9;7644:30;;7616:6;;7644:30;:::i;:::-;;;;;;;;7709:9;-1:-1:-1;;;;;7692:35:0;7701:6;-1:-1:-1;;;;;7692:35:0;;7720:6;7692:35;;;;160:25:1;;148:2;133:18;;14:177;61697:1634:0;61736:23;61762:24;61780:4;61762:9;:24::i;:::-;61736:50;;61797:25;61868:16;;61846:19;;61825:18;;:40;;;;:::i;:::-;:59;;;;:::i;:::-;61797:87;-1:-1:-1;61908:20:0;;;:46;;-1:-1:-1;61932:22:0;;61908:46;61905:60;;;61957:7;;61697:1634::o;61905:60::-;62016:23;62101:1;62081:17;62060:18;;62042:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;62016:86;-1:-1:-1;62113:26:0;62142:36;:15;62016:86;62142:19;:36::i;:::-;62113:65;-1:-1:-1;62227:21:0;62261:36;62113:65;62261:16;:36::i;:::-;62319:18;62340:44;:21;62366:17;62340:25;:44::i;:::-;62319:65;;62405:24;62432:83;62512:1;62493:18;;:20;;;;:::i;:::-;62472:42;;:17;:42;:::i;:::-;62447:19;;62432:35;;:10;;:14;:35::i;:83::-;62405:110;;62526:21;62550:80;62627:1;62608:18;;:20;;;;:::i;:::-;62587:42;;:17;:42;:::i;:::-;62565:16;;62550:32;;:10;;:14;:32::i;:80::-;62526:104;-1:-1:-1;62651:23:0;62526:104;62677:29;62690:16;62677:10;:29;:::i;:::-;:45;;;;:::i;:::-;62764:1;62743:18;:22;;;62776:19;:23;;;62810:16;:20;62651:71;-1:-1:-1;62874:19:0;;;;;:42;;;62915:1;62897:15;:19;62874:42;62871:210;;;62932:46;62945:15;62962;62932:12;:46::i;:::-;63050:18;;62998:71;;;23083:25:1;;;23139:2;23124:18;;23117:34;;;23167:18;;;23160:34;;;;62998:71:0;;;;;;23071:2:1;62998:71:0;;;62871:210;63186:15;;63178:55;;63161:12;;-1:-1:-1;;;;;63186:15:0;;63215:13;;63161:12;63178:55;63161:12;63178:55;63215:13;63186:15;63178:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63267:16:0;;63259:64;;63160:73;;-1:-1:-1;;;;;;63267:16:0;;63297:21;;63259:64;;;;63297:21;63267:16;63259:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;61697:1634:0:o;13383:471::-;13441:7;13686:1;13691;13686:6;13682:47;;-1:-1:-1;13716:1:0;13709:8;;13682:47;13741:9;13753:5;13757:1;13753;:5;:::i;:::-;13741:17;-1:-1:-1;13786:1:0;13777:5;13781:1;13741:17;13777:5;:::i;:::-;:10;13769:56;;;;-1:-1:-1;;;13769:56:0;;23407:2:1;13769:56:0;;;23389:21:1;23446:2;23426:18;;;23419:30;23485:34;23465:18;;;23458:62;-1:-1:-1;;;23536:18:1;;;23529:31;23577:19;;13769:56:0;23205:397:1;14330:132:0;14388:7;14415:39;14419:1;14422;14415:39;;;;;;;;;;;;;;;;;:3;:39::i;12932:192::-;13018:7;13054:12;13046:6;;;;13038:29;;;;-1:-1:-1;;;13038:29:0;;;;;;;;:::i;:::-;-1:-1:-1;13078:9:0;13090:5;13094:1;13090;:5;:::i;:::-;13078:17;12932:192;-1:-1:-1;;;;;12932:192:0:o;12493:136::-;12551:7;12578:43;12582:1;12585;12578:43;;;;;;;;;;;;;;;;;:3;:43::i;60513:601::-;60665:16;;;60679:1;60665:16;;;;;;;;60641:21;;60665:16;;;;;;;;;;-1:-1:-1;60665:16:0;60641:40;;60710:4;60692;60697:1;60692:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;60692:23:0;;;-1:-1:-1;;;;;60692:23:0;;;;;60736:15;-1:-1:-1;;;;;60736:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60726:4;60731:1;60726:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;60726:32:0;;;-1:-1:-1;;;;;60726:32:0;;;;;60771:62;60788:4;60803:15;60821:11;60771:8;:62::i;:::-;60872:224;;-1:-1:-1;;;60872:224:0;;-1:-1:-1;;;;;60872:15:0;:66;;;;:224;;60953:11;;60979:1;;61023:4;;61050;;61070:15;;60872:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60568:546;60513:601;:::o;61126:559::-;61274:62;61291:4;61306:15;61324:11;61274:8;:62::i;:::-;61379:296;;-1:-1:-1;;;61379:296:0;;61451:4;61379:296;;;25321:34:1;25371:18;;;25364:34;;;61497:1:0;25414:18:1;;;25407:34;;;25457:18;;;25450:34;61591:42:0;25500:19:1;;;25493:44;61649:15:0;25553:19:1;;;25546:35;61379:15:0;-1:-1:-1;;;;;61379:31:0;;;;61418:9;;25255:19:1;;61379:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14958:278::-;15044:7;15079:12;15072:5;15064:28;;;;-1:-1:-1;;;15064:28:0;;;;;;;;:::i;:::-;-1:-1:-1;15103:9:0;15115:5;15119:1;15115;:5;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:180::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;-1:-1:-1;1548:23:1;;1397:180;-1:-1:-1;1397:180:1:o;1582:247::-;1641:6;1694:2;1682:9;1673:7;1669:23;1665:32;1662:52;;;1710:1;1707;1700:12;1662:52;1749:9;1736:23;1768:31;1793:5;1768:31;:::i;2069:388::-;2137:6;2145;2198:2;2186:9;2177:7;2173:23;2169:32;2166:52;;;2214:1;2211;2204:12;2166:52;2253:9;2240:23;2272:31;2297:5;2272:31;:::i;:::-;2322:5;-1:-1:-1;2379:2:1;2364:18;;2351:32;2392:33;2351:32;2392:33;:::i;:::-;2444:7;2434:17;;;2069:388;;;;;:::o;2462:456::-;2539:6;2547;2555;2608:2;2596:9;2587:7;2583:23;2579:32;2576:52;;;2624:1;2621;2614:12;2576:52;2663:9;2650:23;2682:31;2707:5;2682:31;:::i;:::-;2732:5;-1:-1:-1;2789:2:1;2774:18;;2761:32;2802:33;2761:32;2802:33;:::i;:::-;2462:456;;2854:7;;-1:-1:-1;;;2908:2:1;2893:18;;;;2880:32;;2462:456::o;3560:315::-;3628:6;3636;3689:2;3677:9;3668:7;3664:23;3660:32;3657:52;;;3705:1;3702;3695:12;3657:52;3741:9;3728:23;3718:33;;3801:2;3790:9;3786:18;3773:32;3814:31;3839:5;3814:31;:::i;4586:118::-;4672:5;4665:13;4658:21;4651:5;4648:32;4638:60;;4694:1;4691;4684:12;4709:382;4774:6;4782;4835:2;4823:9;4814:7;4810:23;4806:32;4803:52;;;4851:1;4848;4841:12;4803:52;4890:9;4877:23;4909:31;4934:5;4909:31;:::i;:::-;4959:5;-1:-1:-1;5016:2:1;5001:18;;4988:32;5029:30;4988:32;5029:30;:::i;5096:316::-;5173:6;5181;5189;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;-1:-1:-1;;5281:23:1;;;5351:2;5336:18;;5323:32;;-1:-1:-1;5402:2:1;5387:18;;;5374:32;;5096:316;-1:-1:-1;5096:316:1:o;5417:750::-;5509:6;5517;5525;5578:2;5566:9;5557:7;5553:23;5549:32;5546:52;;;5594:1;5591;5584:12;5546:52;5634:9;5621:23;5663:18;5704:2;5696:6;5693:14;5690:34;;;5720:1;5717;5710:12;5690:34;5758:6;5747:9;5743:22;5733:32;;5803:7;5796:4;5792:2;5788:13;5784:27;5774:55;;5825:1;5822;5815:12;5774:55;5865:2;5852:16;5891:2;5883:6;5880:14;5877:34;;;5907:1;5904;5897:12;5877:34;5962:7;5955:4;5945:6;5942:1;5938:14;5934:2;5930:23;5926:34;5923:47;5920:67;;;5983:1;5980;5973:12;5920:67;6014:4;6006:13;;;;-1:-1:-1;6038:6:1;-1:-1:-1;;6079:20:1;;6066:34;6109:28;6066:34;6109:28;:::i;:::-;6156:5;6146:15;;;5417:750;;;;;:::o;6172:380::-;6251:1;6247:12;;;;6294;;;6315:61;;6369:4;6361:6;6357:17;6347:27;;6315:61;6422:2;6414:6;6411:14;6391:18;6388:38;6385:161;;6468:10;6463:3;6459:20;6456:1;6449:31;6503:4;6500:1;6493:15;6531:4;6528:1;6521:15;6385:161;;6172:380;;;:::o;6557:356::-;6759:2;6741:21;;;6778:18;;;6771:30;6837:34;6832:2;6817:18;;6810:62;6904:2;6889:18;;6557:356::o;6918:127::-;6979:10;6974:3;6970:20;6967:1;6960:31;7010:4;7007:1;7000:15;7034:4;7031:1;7024:15;7050:168;7123:9;;;7154;;7171:15;;;7165:22;;7151:37;7141:71;;7192:18;;:::i;7223:217::-;7263:1;7289;7279:132;;7333:10;7328:3;7324:20;7321:1;7314:31;7368:4;7365:1;7358:15;7396:4;7393:1;7386:15;7279:132;-1:-1:-1;7425:9:1;;7223:217::o;8170:184::-;8240:6;8293:2;8281:9;8272:7;8268:23;8264:32;8261:52;;;8309:1;8306;8299:12;8261:52;-1:-1:-1;8332:16:1;;8170:184;-1:-1:-1;8170:184:1:o;9121:125::-;9186:9;;;9207:10;;;9204:36;;;9220:18;;:::i;9556:245::-;9623:6;9676:2;9664:9;9655:7;9651:23;9647:32;9644:52;;;9692:1;9689;9682:12;9644:52;9724:9;9718:16;9743:28;9765:5;9743:28;:::i;10085:681::-;10216:6;10224;10232;10240;10248;10256;10264;10272;10325:3;10313:9;10304:7;10300:23;10296:33;10293:53;;;10342:1;10339;10332:12;10293:53;10374:9;10368:16;10393:31;10418:5;10393:31;:::i;:::-;10443:5;10433:15;;;10488:2;10477:9;10473:18;10467:25;10457:35;;10532:2;10521:9;10517:18;10511:25;10501:35;;10576:2;10565:9;10561:18;10555:25;10545:35;;10620:3;10609:9;10605:19;10599:26;10589:36;;10665:3;10654:9;10650:19;10644:26;10634:36;;10710:3;10699:9;10695:19;10689:26;10679:36;;10755:3;10744:9;10740:19;10734:26;10724:36;;10085:681;;;;;;;;;;;:::o;10771:306::-;10859:6;10867;10875;10928:2;10916:9;10907:7;10903:23;10899:32;10896:52;;;10944:1;10941;10934:12;10896:52;10973:9;10967:16;10957:26;;11023:2;11012:9;11008:18;11002:25;10992:35;;11067:2;11056:9;11052:18;11046:25;11036:35;;10771:306;;;;;:::o;16510:127::-;16571:10;16566:3;16562:20;16559:1;16552:31;16602:4;16599:1;16592:15;16626:4;16623:1;16616:15;16642:135;16681:3;16702:17;;;16699:43;;16722:18;;:::i;:::-;-1:-1:-1;16769:1:1;16758:13;;16642:135::o;16782:794::-;17004:2;17016:21;;;16989:18;;17072:22;;;16956:4;17151:6;17125:2;17110:18;;16956:4;17185:304;17199:6;17196:1;17193:13;17185:304;;;17274:6;17261:20;17294:31;17319:5;17294:31;:::i;:::-;-1:-1:-1;;;;;17350:31:1;17338:44;;17405:4;17464:15;;;;17429:12;;;;17378:1;17214:9;17185:304;;;17189:3;17506;17498:11;;;;17561:6;17554:14;17547:22;17540:4;17529:9;17525:20;17518:52;16782:794;;;;;;:::o;18796:401::-;18998:2;18980:21;;;19037:2;19017:18;;;19010:30;19076:34;19071:2;19056:18;;19049:62;-1:-1:-1;;;19142:2:1;19127:18;;19120:35;19187:3;19172:19;;18796:401::o;19202:399::-;19404:2;19386:21;;;19443:2;19423:18;;;19416:30;19482:34;19477:2;19462:18;;19455:62;-1:-1:-1;;;19548:2:1;19533:18;;19526:33;19591:3;19576:19;;19202:399::o;21644:128::-;21711:9;;;21732:11;;;21729:37;;;21746:18;;:::i;23739:251::-;23809:6;23862:2;23850:9;23841:7;23837:23;23833:32;23830:52;;;23878:1;23875;23868:12;23830:52;23910:9;23904:16;23929:31;23954:5;23929:31;:::i;23995:980::-;24257:4;24305:3;24294:9;24290:19;24336:6;24325:9;24318:25;24362:2;24400:6;24395:2;24384:9;24380:18;24373:34;24443:3;24438:2;24427:9;24423:18;24416:31;24467:6;24502;24496:13;24533:6;24525;24518:22;24571:3;24560:9;24556:19;24549:26;;24610:2;24602:6;24598:15;24584:29;;24631:1;24641:195;24655:6;24652:1;24649:13;24641:195;;;24720:13;;-1:-1:-1;;;;;24716:39:1;24704:52;;24811:15;;;;24776:12;;;;24752:1;24670:9;24641:195;;;-1:-1:-1;;;;;;;24892:32:1;;;;24887:2;24872:18;;24865:60;-1:-1:-1;;;24956:3:1;24941:19;24934:35;24853:3;23995:980;-1:-1:-1;;;23995:980:1:o
Swarm Source
ipfs://8156d62f5ddd1039fe61d7e9232940938a926391402de1e3768cedb1a01450a9
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.