Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000,000,000,000 KAYA
Holders
8
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
539,350,831,496,694,049.288719695 KAYAValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
KayaInu
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-09 */ // File: Kaya_Inu_flat.sol // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, 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); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; 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; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Kaya_Inu.sol pragma solidity ^0.8.2; // (Uni|Pancake)Swap libs are interchangeable /* For lines that are marked ERC20 Token Standard, learn more at https://eips.ethereum.org/EIPS/eip-20. */ contract ExtendedReflections is Context, IERC20, Ownable { // Keeps track of balances for address that are included in receiving reward. mapping (address => uint256) private _reflectionBalances; // Keeps track of balances for address that are excluded from receiving reward. mapping (address => uint256) private _tokenBalances; // Keeps track of which address are excluded from fee. mapping (address => bool) private _isExcludedFromFee; // Keeps track of which address are excluded from reward. mapping (address => bool) private _isExcludedFromReward; // An array of addresses that are excluded from reward. address[] private _excludedFromReward; // ERC20 Token Standard mapping (address => mapping (address => uint256)) private _allowances; // Liquidity pool provider router IUniswapV2Router02 internal _uniswapV2Router; // This Token and WETH pair contract address. address internal _uniswapV2Pair; // Where burnt tokens are sent to. This is an address that no one can have accesses to. address private constant burnAccount = 0x000000000000000000000000000000000000dEaD; address public marketingAddress; /* Tax rate = (_taxXXX / 10**_tax_XXXDecimals) percent. For example: if _taxBurn is 1 and _taxBurnDecimals is 2. Tax rate = 0.01% If you want tax rate for burn to be 5% for example, set _taxBurn to 5 and _taxBurnDecimals to 0. 5 * (10 ** 0) = 5 */ // Decimals of taxBurn. Used for have tax less than 1%. uint32 private _taxBurnDecimals; // Decimals of taxReward. Used for have tax less than 1%. uint32 private _taxRewardDecimals; // Decimals of taxLiquify. Used for have tax less than 1%. uint32 private _taxLiquifyDecimals; // Decimals of taxMarketing. Used for have tax less than 1%. uint32 private _taxMarketingDecimals; // This percent of a transaction will be burnt. uint32 private _taxBurn; // This percent of a transaction will be redistribute to all holders. uint32 private _taxReward; // This percent of a transaction will be added to the liquidity pool. More details at https://github.com/Sheldenshi/ERC20Deflationary. uint32 private _taxLiquify; // This percent of a transaction will be transferred to Marketing wallet. uint32 private _taxMarketing; // ERC20 Token Standard uint32 private _decimals; // ERC20 Token Standard uint256 private _totalSupply; // Current supply:= total supply - burnt tokens uint256 private _currentSupply; // A number that helps distributing fees to all holders respectively. uint256 private _reflectionTotal; // Total amount of tokens rewarded / distributing. uint256 private _totalRewarded; // Total amount of tokens burnt. uint256 private _totalBurnt; // Total amount of tokens locked in the LP (this token and WETH pair). uint256 private _totalTokensLockedInLiquidity; // Total amount of ETH locked in the LP (this token and WETH pair). uint256 private _totalETHLockedInLiquidity; // A threshold for swap and liquify. uint256 private _minTokensBeforeSwap; // ERC20 Token Standard string private _name; // ERC20 Token Standard string private _symbol; // Whether a previous call of SwapAndLiquify process is still in process. bool private _inSwapAndLiquify; bool private _autoSwapAndLiquifyEnabled; bool private _autoBurnEnabled; bool private _rewardEnabled; bool private _marketingRewardEnabled; // Prevent reentrancy. modifier lockTheSwap { require(!_inSwapAndLiquify, "Currently in swap and liquify."); _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } // Return values of _getValues function. struct ValuesFromAmount { // Amount of tokens for to transfer. uint256 amount; // Amount tokens charged for burning. uint256 tBurnFee; // Amount tokens charged to reward. uint256 tRewardFee; // Amount tokens charged to add to liquidity. uint256 tLiquifyFee; uint256 tMarketingFee; // Amount tokens after fees. uint256 tTransferAmount; // Reflection of amount. uint256 rAmount; // Reflection of burn fee. uint256 rBurnFee; // Reflection of reward fee. uint256 rRewardFee; // Reflection of liquify fee. uint256 rLiquifyFee; uint256 rMarketingFee; // Reflection of transfer amount. uint256 rTransferAmount; } /* Events */ event Burn(address from, uint256 amount); event TaxBurnUpdate(uint32 previousTax, uint32 previousDecimals, uint32 currentTax, uint32 currentDecimal); event TaxRewardUpdate(uint32 previousTax, uint32 previousDecimals, uint32 currentTax, uint32 currentDecimal); event TaxLiquifyUpdate(uint32 previousTax, uint32 previousDecimals, uint32 currentTax, uint32 currentDecimal); event TaxMarketingUpdate(uint32 previousTax, uint32 previousDecimals, uint32 currentTax, uint32 currentDecimal); event MinTokensBeforeSwapUpdated(uint256 previous, uint256 current); event MarketingAddressUpdated(address previous, address current); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensAddedToLiquidity ); event ExcludeAccountFromReward(address account); event IncludeAccountInReward(address account); event ExcludeAccountFromFee(address account); event IncludeAccountInFee(address account); event EnabledAutoBurn(); event EnabledReward(); event EnabledAutoSwapAndLiquify(); event EnabledMarketingReward(); event DisabledAutoBurn(); event DisabledReward(); event DisabledAutoSwapAndLiquify(); event DisabledMarketingReward(); event Airdrop(uint256 amount); constructor (string memory name_, string memory symbol_, uint32 decimals_, uint256 tokenSupply_) { // Sets the values for `name`, `symbol`, `totalSupply`, `currentSupply`, and `rTotal`. _name = name_; _symbol = symbol_; _decimals = decimals_; _totalSupply = tokenSupply_ * (10 ** decimals_); _currentSupply = _totalSupply; _reflectionTotal = (~uint256(0) - (~uint256(0) % _totalSupply)); // Mint _reflectionBalances[_msgSender()] = _reflectionTotal; // exclude owner and this contract from fee. excludeAccountFromFee(owner()); excludeAccountFromFee(address(this)); // exclude owner, burnAccount, and this contract from receiving rewards. _excludeAccountFromReward(owner()); _excludeAccountFromReward(burnAccount); _excludeAccountFromReward(address(this)); emit Transfer(address(0), _msgSender(), _totalSupply); } // allow the contract to receive ETH receive() external payable {} /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint32) { return _decimals; } /** * @dev Returns the address of this token and WETH pair. */ function uniswapV2Pair() public view virtual returns (address) { return _uniswapV2Pair; } /** * @dev Returns the current burn tax. */ function taxBurn() public view virtual returns (uint32) { return _taxBurn; } /** * @dev Returns the current reward tax. */ function taxReward() public view virtual returns (uint32) { return _taxReward; } /** * @dev Returns the current liquify tax. */ function taxLiquify() public view virtual returns (uint32) { return _taxLiquify; } function taxMarketing() public view virtual returns (uint32) { return _taxMarketing; } /** * @dev Returns the current burn tax decimals. */ function taxBurnDecimals() public view virtual returns (uint32) { return _taxBurnDecimals; } /** * @dev Returns the current reward tax decimals. */ function taxRewardDecimals() public view virtual returns (uint32) { return _taxRewardDecimals; } /** * @dev Returns the current liquify tax decimals. */ function taxLiquifyDecimals() public view virtual returns (uint32) { return _taxLiquifyDecimals; } function taxMarketingDecimals() public view virtual returns (uint32) { return _taxMarketingDecimals; } /** * @dev Returns true if auto burn feature is enabled. */ function autoBurnEnabled() public view virtual returns (bool) { return _autoBurnEnabled; } /** * @dev Returns true if reward feature is enabled. */ function rewardEnabled() public view virtual returns (bool) { return _rewardEnabled; } /** * @dev Returns true if auto swap and liquify feature is enabled. */ function autoSwapAndLiquifyEnabled() public view virtual returns (bool) { return _autoSwapAndLiquifyEnabled; } function marketingRewardEnabled() public view virtual returns (bool) { return _marketingRewardEnabled; } /** * @dev Returns the threshold before swap and liquify. */ function minTokensBeforeSwap() external view virtual returns (uint256) { return _minTokensBeforeSwap; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } /** * @dev Returns current supply of the token. * (currentSupply := totalSupply - totalBurnt) */ function currentSupply() external view virtual returns (uint256) { return _currentSupply; } /** * @dev Returns the total number of tokens burnt. */ function totalBurnt() external view virtual returns (uint256) { return _totalBurnt; } /** * @dev Returns the total number of tokens locked in the LP. */ function totalTokensLockedInLiquidity() external view virtual returns (uint256) { return _totalTokensLockedInLiquidity; } /** * @dev Returns the total number of ETH locked in the LP. */ function totalETHLockedInLiquidity() external view virtual returns (uint256) { return _totalETHLockedInLiquidity; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { if (_isExcludedFromReward[account]) return _tokenBalances[account]; return tokenFromReflection(_reflectionBalances[account]); } /** * @dev Returns whether an account is excluded from reward. */ function isExcludedFromReward(address account) external view returns (bool) { return _isExcludedFromReward[account]; } /** * @dev Returns whether an account is excluded from fee. */ function isExcludedFromFee(address account) external view returns (bool) { return _isExcludedFromFee[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); require(_allowances[sender][_msgSender()] >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Burn} event indicating the amount burnt. * Emits a {Transfer} event with `to` set to the burn address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != burnAccount, "ERC20: burn from the burn address"); uint256 accountBalance = balanceOf(account); require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); uint256 rAmount = _getRAmount(amount); // Transfer from account to the burnAccount if (_isExcludedFromReward[account]) { _tokenBalances[account] -= amount; } _reflectionBalances[account] -= rAmount; _tokenBalances[burnAccount] += amount; _reflectionBalances[burnAccount] += rAmount; _currentSupply -= amount; _totalBurnt += amount; emit Burn(account, amount); emit Transfer(account, burnAccount, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ 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"); ValuesFromAmount memory values = _getValues(amount, _isExcludedFromFee[sender]); if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) { _transferFromExcluded(sender, recipient, values); } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) { _transferToExcluded(sender, recipient, values); } else if (!_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) { _transferStandard(sender, recipient, values); } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) { _transferBothExcluded(sender, recipient, values); } else { _transferStandard(sender, recipient, values); } emit Transfer(sender, recipient, values.tTransferAmount); if (!_isExcludedFromFee[sender]) { _afterTokenTransfer(values); } } /** * @dev Performs all the functionalities that are enabled. */ function _afterTokenTransfer(ValuesFromAmount memory values) internal virtual { // Burn if (_autoBurnEnabled) { _tokenBalances[address(this)] += values.tBurnFee; _reflectionBalances[address(this)] += values.rBurnFee; _approve(address(this), _msgSender(), values.tBurnFee); burnFrom(address(this), values.tBurnFee); } // Marketing Reward if (_marketingRewardEnabled) { sendFeeToAddress(marketingAddress, values.rMarketingFee, values.tMarketingFee); } // Reflect if (_rewardEnabled) { _distributeFee(values.rRewardFee, values.tRewardFee); } // Add to liquidity pool if (_autoSwapAndLiquifyEnabled) { // add liquidity fee to this contract. _tokenBalances[address(this)] += values.tLiquifyFee; _reflectionBalances[address(this)] += values.rLiquifyFee; uint256 contractBalance = _tokenBalances[address(this)]; // whether the current contract balances makes the threshold to swap and liquify. bool overMinTokensBeforeSwap = contractBalance >= _minTokensBeforeSwap; if (overMinTokensBeforeSwap && !_inSwapAndLiquify && _msgSender() != _uniswapV2Pair && _autoSwapAndLiquifyEnabled ) { swapAndLiquify(contractBalance); } } } /** * @dev Performs transfer between two accounts that are both included in receiving reward. */ function _transferStandard(address sender, address recipient, ValuesFromAmount memory values) private { _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount; _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount; } /** * @dev Performs transfer from an included account to an excluded account. * (included and excluded from receiving reward.) */ function _transferToExcluded(address sender, address recipient, ValuesFromAmount memory values) private { _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount; _tokenBalances[recipient] = _tokenBalances[recipient] + values.tTransferAmount; _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount; } /** * @dev Performs transfer from an excluded account to an included account. * (included and excluded from receiving reward.) */ function _transferFromExcluded(address sender, address recipient, ValuesFromAmount memory values) private { _tokenBalances[sender] = _tokenBalances[sender] - values.amount; _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount; _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount; } /** * @dev Performs transfer between two accounts that are both excluded in receiving reward. */ function _transferBothExcluded(address sender, address recipient, ValuesFromAmount memory values) private { _tokenBalances[sender] = _tokenBalances[sender] - values.amount; _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount; _tokenBalances[recipient] = _tokenBalances[recipient] + values.tTransferAmount; _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount; } /** * @dev Destroys `amount` tokens from the caller. * */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), currentAllowance - amount); _burn(account, amount); } /** * @dev Excludes an account from receiving reward. * * Emits a {ExcludeAccountFromReward} event. * * Requirements: * * - `account` is included in receiving reward. */ function _excludeAccountFromReward(address account) internal { require(!_isExcludedFromReward[account], "Account is already excluded."); if(_reflectionBalances[account] > 0) { _tokenBalances[account] = tokenFromReflection(_reflectionBalances[account]); } _isExcludedFromReward[account] = true; _excludedFromReward.push(account); emit ExcludeAccountFromReward(account); } /** * @dev Includes an account from receiving reward. * * Emits a {IncludeAccountInReward} event. * * Requirements: * * - `account` is excluded in receiving reward. */ function _includeAccountInReward(address account) internal { require(_isExcludedFromReward[account], "Account is already included."); for (uint256 i = 0; i < _excludedFromReward.length; i++) { if (_excludedFromReward[i] == account) { _excludedFromReward[i] = _excludedFromReward[_excludedFromReward.length - 1]; _tokenBalances[account] = 0; _isExcludedFromReward[account] = false; _excludedFromReward.pop(); break; } } emit IncludeAccountInReward(account); } /** * @dev Excludes an account from fee. * * Emits a {ExcludeAccountFromFee} event. * * Requirements: * * - `account` is included in fee. */ function excludeAccountFromFee(address account) internal { require(!_isExcludedFromFee[account], "Account is already excluded."); _isExcludedFromFee[account] = true; emit ExcludeAccountFromFee(account); } /** * @dev Includes an account from fee. * * Emits a {IncludeAccountFromFee} event. * * Requirements: * * - `account` is excluded in fee. */ function includeAccountInFee(address account) internal { require(_isExcludedFromFee[account], "Account is already included."); _isExcludedFromFee[account] = false; emit IncludeAccountInFee(account); } /** * @dev Airdrop tokens to all holders that are included from reward. * Requirements: * - the caller must have a balance of at least `amount`. */ function airdrop(uint256 amount) public { address sender = _msgSender(); //require(!_isExcludedFromReward[sender], "Excluded addresses cannot call this function"); require(balanceOf(sender) >= amount, "The caller must have balance >= amount."); ValuesFromAmount memory values = _getValues(amount, false); if (_isExcludedFromReward[sender]) { _tokenBalances[sender] -= values.amount; } _reflectionBalances[sender] -= values.rAmount; _reflectionTotal = _reflectionTotal - values.rAmount; _totalRewarded += amount; emit Airdrop(amount); } /** * @dev Returns the reflected amount of a token. * Requirements: * - `amount` must be less than total supply. */ function reflectionFromToken(uint256 amount, bool deductTransferFee) internal view returns(uint256) { require(amount <= _totalSupply, "Amount must be less than supply"); ValuesFromAmount memory values = _getValues(amount, deductTransferFee); return values.rTransferAmount; } /** * @dev Used to figure out the balance after reflection. * Requirements: * - `rAmount` must be less than reflectTotal. */ function tokenFromReflection(uint256 rAmount) internal view returns(uint256) { require(rAmount <= _reflectionTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount / currentRate; } /** * @dev Swap half of contract's token balance for ETH, * and pair it up with the other half to add to the * liquidity pool. * * Emits {SwapAndLiquify} event indicating the amount of tokens swapped to eth, * the amount of ETH added to the LP, and the amount of tokens added to the LP. */ function swapAndLiquify(uint256 contractBalance) private lockTheSwap { // Split the contract balance into two halves. uint256 tokensToSwap = contractBalance / 2; uint256 tokensAddToLiquidity = contractBalance - tokensToSwap; // Contract's current ETH balance. uint256 initialBalance = address(this).balance; // Swap half of the tokens to ETH. swapTokensForEth(tokensToSwap); // Figure out the exact amount of tokens received from swapping. uint256 ethAddToLiquify = address(this).balance - initialBalance; // Add to the LP of this token and WETH pair (half ETH and half this token). addLiquidity(ethAddToLiquify, tokensAddToLiquidity); _totalETHLockedInLiquidity += address(this).balance - initialBalance; _totalTokensLockedInLiquidity += contractBalance - balanceOf(address(this)); emit SwapAndLiquify(tokensToSwap, ethAddToLiquify, tokensAddToLiquidity); } /** * @dev Swap `amount` tokens for ETH. * * Emits {Transfer} event. From this contract to the token and WETH Pair. */ function swapTokensForEth(uint256 amount) 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), amount); // Swap tokens to ETH _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), // this contract will receive the eth that were swapped from the token block.timestamp + 60 * 1000 ); } /** * @dev Add `ethAmount` of ETH and `tokenAmount` of tokens to the LP. * Depends on the current rate for the pair between this token and WETH, * `ethAmount` and `tokenAmount` might not match perfectly. * Dust(leftover) ETH or token will be refunded to this contract * (usually very small quantity). * * Emits {Transfer} event. From this contract to the token and WETH Pai. */ function addLiquidity(uint256 ethAmount, uint256 tokenAmount) private { _approve(address(this), address(_uniswapV2Router), tokenAmount); // Add the ETH and token to LP. // The LP tokens will be sent to burnAccount. // No one will have access to them, so the liquidity will be locked forever. _uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable burnAccount, // the LP is sent to burnAccount. block.timestamp + 60 * 1000 ); } /** * @dev Distribute the `tRewardFee` tokens to all holders that are included in receiving reward. * amount received is based on how many token one owns. */ function _distributeFee(uint256 rRewardFee, uint256 tRewardFee) private { // This would decrease rate, thus increase amount reward receive based on one's balance. _reflectionTotal = _reflectionTotal - rRewardFee; _totalRewarded += tRewardFee; } /** * @dev Returns fees and transfer amount in both tokens and reflections. * tXXXX stands for tokenXXXX * rXXXX stands for reflectionXXXX * More details can be found at comments for ValuesForAmount Struct. */ function _getValues(uint256 amount, bool deductTransferFee) private view returns (ValuesFromAmount memory) { ValuesFromAmount memory values; values.amount = amount; _getTValues(values, deductTransferFee); _getRValues(values, deductTransferFee); return values; } /** * @dev Adds fees and transfer amount in tokens to `values`. * tXXXX stands for tokenXXXX * More details can be found at comments for ValuesForAmount Struct. */ function _getTValues(ValuesFromAmount memory values, bool deductTransferFee) view private { if (deductTransferFee) { values.tTransferAmount = values.amount; } else { // calculate fee values.tBurnFee = _calculateTax(values.amount, _taxBurn, _taxBurnDecimals); values.tRewardFee = _calculateTax(values.amount, _taxReward, _taxRewardDecimals); values.tLiquifyFee = _calculateTax(values.amount, _taxLiquify, _taxLiquifyDecimals); values.tMarketingFee = _calculateTax(values.amount, _taxMarketing, _taxMarketingDecimals); // amount after fee values.tTransferAmount = values.amount - values.tBurnFee - values.tRewardFee - values.tLiquifyFee - values.tMarketingFee; } } /** * @dev Adds fees and transfer amount in reflection to `values`. * rXXXX stands for reflectionXXXX * More details can be found at comments for ValuesForAmount Struct. */ function _getRValues(ValuesFromAmount memory values, bool deductTransferFee) view private { uint256 currentRate = _getRate(); values.rAmount = values.amount * currentRate; if (deductTransferFee) { values.rTransferAmount = values.rAmount; } else { values.rAmount = values.amount * currentRate; values.rBurnFee = values.tBurnFee * currentRate; values.rRewardFee = values.tRewardFee * currentRate; values.rLiquifyFee = values.tLiquifyFee * currentRate; values.rMarketingFee = values.tMarketingFee * currentRate; values.rTransferAmount = values.rAmount - values.rBurnFee - values.rRewardFee - values.rLiquifyFee - values.rMarketingFee; } } /** * @dev Returns `amount` in reflection. */ function _getRAmount(uint256 amount) private view returns (uint256) { uint256 currentRate = _getRate(); return amount * currentRate; } /** * @dev Returns the current reflection rate. */ function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply / tSupply; } /** * @dev Returns the current reflection supply and token supply. */ function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _reflectionTotal; uint256 tSupply = _totalSupply; for (uint256 i = 0; i < _excludedFromReward.length; i++) { if (_reflectionBalances[_excludedFromReward[i]] > rSupply || _tokenBalances[_excludedFromReward[i]] > tSupply) return (_reflectionTotal, _totalSupply); rSupply = rSupply - _reflectionBalances[_excludedFromReward[i]]; tSupply = tSupply - _tokenBalances[_excludedFromReward[i]]; } if (rSupply < _reflectionTotal / _totalSupply) return (_reflectionTotal, _totalSupply); return (rSupply, tSupply); } /** * @dev Returns fee based on `amount` and `taxRate` */ function _calculateTax(uint256 amount, uint32 tax, uint32 taxDecimals_) private pure returns (uint256) { return amount * tax / (10 ** taxDecimals_) / (10 ** 2); } /* Owner functions */ /** * @dev Enables the auto burn feature. * Burn transaction amount * `taxBurn_` amount of tokens each transaction when enabled. * * Emits a {EnabledAutoBurn} event. * * Requirements: * * - auto burn feature mush be disabled. * - tax must be greater than 0. * - tax decimals + 2 must be less than token decimals. * (because tax rate is in percentage) */ function enableAutoBurn(uint32 taxBurn_, uint32 taxBurnDecimals_) public onlyOwner { require(!_autoBurnEnabled, "Auto burn feature is already enabled."); require(taxBurn_ > 0, "Tax must be greater than 0."); require(taxBurnDecimals_ + 2 <= decimals(), "Tax decimals must be less than token decimals - 2"); _autoBurnEnabled = true; setTaxBurn(taxBurn_, taxBurnDecimals_); emit EnabledAutoBurn(); } /** * @dev Enables the reward feature. * Distribute transaction amount * `taxReward_` amount of tokens each transaction when enabled. * * Emits a {EnabledReward} event. * * Requirements: * * - reward feature mush be disabled. * - tax must be greater than 0. * - tax decimals + 2 must be less than token decimals. * (because tax rate is in percentage) */ function enableReward(uint32 taxReward_, uint32 taxRewardDecimals_) public onlyOwner { require(!_rewardEnabled, "Reward feature is already enabled."); require(taxReward_ > 0, "Tax must be greater than 0."); require(taxRewardDecimals_ + 2 <= decimals(), "Tax decimals must be less than token decimals - 2"); _rewardEnabled = true; setTaxReward(taxReward_, taxRewardDecimals_); emit EnabledReward(); } /** * @dev Enables the auto swap and liquify feature. * Swaps half of transaction amount * `taxLiquify_` amount of tokens * to ETH and pair with the other half of tokens to the LP each transaction when enabled. * * Emits a {EnabledAutoSwapAndLiquify} event. * * Requirements: * * - auto swap and liquify feature mush be disabled. * - tax must be greater than 0. * - tax decimals + 2 must be less than token decimals. * (because tax rate is in percentage) */ function enableAutoSwapAndLiquify(uint32 taxLiquify_, uint32 taxLiquifyDecimals_, address routerAddress, uint256 minTokensBeforeSwap_) public onlyOwner { require(!_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature is already enabled."); require(taxLiquify_ > 0, "Tax must be greater than 0."); require(taxLiquifyDecimals_ + 2 <= decimals(), "Tax decimals must be less than token decimals - 2"); _minTokensBeforeSwap = minTokensBeforeSwap_; // init Router IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(routerAddress); _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).getPair(address(this), uniswapV2Router.WETH()); if (_uniswapV2Pair == address(0)) { _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()) .createPair(address(this), uniswapV2Router.WETH()); } _uniswapV2Router = uniswapV2Router; // exclude uniswapV2Router from receiving reward. _excludeAccountFromReward(address(uniswapV2Router)); // exclude WETH and this Token Pair from receiving reward. _excludeAccountFromReward(_uniswapV2Pair); // exclude uniswapV2Router from paying fees. excludeAccountFromFee(address(uniswapV2Router)); // exclude WETH and this Token Pair from paying fees. excludeAccountFromFee(_uniswapV2Pair); // enable _autoSwapAndLiquifyEnabled = true; setTaxLiquify(taxLiquify_, taxLiquifyDecimals_); emit EnabledAutoSwapAndLiquify(); } function enableMarketingTax(uint32 taxMarketing_, uint32 taxMarketingDecimals_, address marketingAddress_) public onlyOwner { require(!_marketingRewardEnabled, "Marketing tax feature is already enabled."); require(taxMarketing_ > 0, "Tax must be greater than 0."); require(taxMarketingDecimals_ + 2 <= decimals(), "Tax decimals must be less than token decimals - 2"); _marketingRewardEnabled = true; setMarketingTax(taxMarketing_, taxMarketingDecimals_); setMarketingAddress(marketingAddress_); emit EnabledMarketingReward(); } /** * @dev Disables the auto burn feature. * * Emits a {DisabledAutoBurn} event. * * Requirements: * * - auto burn feature mush be enabled. */ function disableAutoBurn() public onlyOwner { require(_autoBurnEnabled, "Auto burn feature is already disabled."); setTaxBurn(0, 0); _autoBurnEnabled = false; emit DisabledAutoBurn(); } /** * @dev Disables the reward feature. * * Emits a {DisabledReward} event. * * Requirements: * * - reward feature mush be enabled. */ function disableReward() public onlyOwner { require(_rewardEnabled, "Reward feature is already disabled."); setTaxReward(0, 0); _rewardEnabled = false; emit DisabledReward(); } /** * @dev Disables the auto swap and liquify feature. * * Emits a {DisabledAutoSwapAndLiquify} event. * * Requirements: * * - auto swap and liquify feature mush be enabled. */ function disableAutoSwapAndLiquify() public onlyOwner { require(_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature is already disabled."); setTaxLiquify(0, 0); _autoSwapAndLiquifyEnabled = false; emit DisabledAutoSwapAndLiquify(); } function disableMarketingTax() public onlyOwner { require(_marketingRewardEnabled, "Marketing reward feature is already disabled."); setMarketingTax(0, 0); _marketingRewardEnabled = false; emit DisabledMarketingReward(); } /** * @dev Updates `_minTokensBeforeSwap` * * Emits a {MinTokensBeforeSwap} event. * * Requirements: * * - `minTokensBeforeSwap_` must be less than _currentSupply. */ function setMinTokensBeforeSwap(uint256 minTokensBeforeSwap_) public onlyOwner { require(minTokensBeforeSwap_ < _currentSupply, "minTokensBeforeSwap must be higher than current supply."); uint256 previous = _minTokensBeforeSwap; _minTokensBeforeSwap = minTokensBeforeSwap_; emit MinTokensBeforeSwapUpdated(previous, _minTokensBeforeSwap); } /** * @dev Updates taxBurn * * Emits a {TaxBurnUpdate} event. * * Requirements: * * - auto burn feature must be enabled. * - total tax rate must be less than 100%. */ function setTaxBurn(uint32 taxBurn_, uint32 taxBurnDecimals_) public onlyOwner { require(_autoBurnEnabled, "Auto burn feature must be enabled. Try the EnableAutoBurn function."); uint32 previousTax = _taxBurn; uint32 previousDecimals = _taxBurnDecimals; _taxBurn = taxBurn_; _taxBurnDecimals = taxBurnDecimals_; emit TaxBurnUpdate(previousTax, previousDecimals, taxBurn_, taxBurnDecimals_); } /** * @dev Updates taxReward * * Emits a {TaxRewardUpdate} event. * * Requirements: * * - reward feature must be enabled. * - total tax rate must be less than 100%. */ function setTaxReward(uint32 taxReward_, uint32 taxRewardDecimals_) public onlyOwner { require(_rewardEnabled, "Reward feature must be enabled. Try the EnableReward function."); uint32 previousTax = _taxReward; uint32 previousDecimals = _taxRewardDecimals; _taxReward = taxReward_; _taxBurnDecimals = taxRewardDecimals_; emit TaxRewardUpdate(previousTax, previousDecimals, taxReward_, taxRewardDecimals_); } /** * @dev Updates taxLiquify * * Emits a {TaxLiquifyUpdate} event. * * Requirements: * * - auto swap and liquify feature must be enabled. * - total tax rate must be less than 100%. */ function setTaxLiquify(uint32 taxLiquify_, uint32 taxLiquifyDecimals_) public onlyOwner { require(_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature must be enabled. Try the EnableAutoSwapAndLiquify function."); uint32 previousTax = _taxLiquify; uint32 previousDecimals = _taxLiquifyDecimals; _taxLiquify = taxLiquify_; _taxLiquifyDecimals = taxLiquifyDecimals_; emit TaxLiquifyUpdate(previousTax, previousDecimals, taxLiquify_, taxLiquifyDecimals_); } function setMarketingTax(uint32 taxMarketing_, uint32 taxMarketingDecimals_) public onlyOwner { require(_marketingRewardEnabled, "Marketing reward feature must be enabled. Try the enableMarketingTax function."); uint32 previousTax = _taxMarketing; uint32 previousDecimals = _taxMarketingDecimals; _taxMarketing = taxMarketing_; _taxMarketingDecimals = taxMarketingDecimals_; emit TaxMarketingUpdate(previousTax, previousDecimals, taxMarketing_, taxMarketingDecimals_); } function setMarketingAddress(address marketingAddress_) public onlyOwner { require(marketingAddress != marketingAddress_, "New Marketing address must be different than old one."); address previous = marketingAddress; marketingAddress = marketingAddress_; emit MarketingAddressUpdated(previous, marketingAddress_); } function sendFeeToAddress(address _addr, uint256 _rAmount, uint256 _tAmount) private { if (_isExcludedFromReward[_addr]) _tokenBalances[_addr] += _tAmount; _reflectionBalances[_addr] += _rAmount; } } contract KayaInu is ExtendedReflections { uint256 private _tokenSupply = 1000000000000000000; // 1 quintillion uint32 private _taxBurn = 12; uint32 private _taxReward = 88; uint32 private _taxMarketing = 500; uint32 private _taxLiquify = 400; uint32 private _taxDecimals = 2; uint32 private _decimals = 9; uint256 private _minTokensBeforeSwap = 0; // * (10 ** _decimals); /** * @dev Choose proper router address according to your network: * Ethereum mainnet: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D (Uniswap) * BSC mainnet: 0x10ED43C718714eb63d5aA57B78B54704E256024E (PancakeSwap) */ address private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address private _marketingAddress = 0xdA1ba4167d63Bb4f7CA30CE811eb60705103fF25; constructor () ExtendedReflections("Kaya Inu", "KAYA", _decimals, _tokenSupply) { enableAutoBurn(_taxBurn, _taxDecimals); enableReward(_taxReward, _taxDecimals); enableMarketingTax(_taxMarketing, _taxDecimals, _marketingAddress); enableAutoSwapAndLiquify(_taxLiquify, _taxDecimals, _routerAddress, _minTokensBeforeSwap); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledAutoBurn","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledAutoSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledMarketingReward","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledReward","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledAutoBurn","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledAutoSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledMarketingReward","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeAccountFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeAccountFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeAccountInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeAccountInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previous","type":"address"},{"indexed":false,"internalType":"address","name":"current","type":"address"}],"name":"MarketingAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAddedToLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousDecimals","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentDecimal","type":"uint32"}],"name":"TaxBurnUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousDecimals","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentDecimal","type":"uint32"}],"name":"TaxLiquifyUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousDecimals","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentDecimal","type":"uint32"}],"name":"TaxMarketingUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousDecimals","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentTax","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"currentDecimal","type":"uint32"}],"name":"TaxRewardUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"autoBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoSwapAndLiquifyEnabled","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"disableAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxBurn_","type":"uint32"},{"internalType":"uint32","name":"taxBurnDecimals_","type":"uint32"}],"name":"enableAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxLiquify_","type":"uint32"},{"internalType":"uint32","name":"taxLiquifyDecimals_","type":"uint32"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"uint256","name":"minTokensBeforeSwap_","type":"uint256"}],"name":"enableAutoSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxMarketing_","type":"uint32"},{"internalType":"uint32","name":"taxMarketingDecimals_","type":"uint32"},{"internalType":"address","name":"marketingAddress_","type":"address"}],"name":"enableMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxReward_","type":"uint32"},{"internalType":"uint32","name":"taxRewardDecimals_","type":"uint32"}],"name":"enableReward","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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingRewardEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensBeforeSwap","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"marketingAddress_","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxMarketing_","type":"uint32"},{"internalType":"uint32","name":"taxMarketingDecimals_","type":"uint32"}],"name":"setMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokensBeforeSwap_","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxBurn_","type":"uint32"},{"internalType":"uint32","name":"taxBurnDecimals_","type":"uint32"}],"name":"setTaxBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxLiquify_","type":"uint32"},{"internalType":"uint32","name":"taxLiquifyDecimals_","type":"uint32"}],"name":"setTaxLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"taxReward_","type":"uint32"},{"internalType":"uint32","name":"taxRewardDecimals_","type":"uint32"}],"name":"setTaxReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxBurn","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxBurnDecimals","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLiquify","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLiquifyDecimals","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxMarketing","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxMarketingDecimals","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReward","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRewardDecimals","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHLockedInLiquidity","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":"totalTokensLockedInLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052670de0b6b3a76400006016556017805474090000000200000190000001f4000000580000000c6001600160c01b03199091161790556000601855601980546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d17909155601a805490911673da1ba4167d63bb4f7ca30ce811eb60705103ff251790553480156200009357600080fd5b50604051806040016040528060088152602001674b61796120496e7560c01b815250604051806040016040528060048152602001634b41594160e01b815250601760149054906101000a900463ffffffff1660165462000102620000fc620002fd60201b60201c565b62000301565b835162000117906013906020870190620019c7565b5082516200012d906014906020860190620019c7565b50600a805463ffffffff60a01b1916600160a01b63ffffffff8516021781556200015990839062001b23565b62000165908262001be7565b600b819055600c8190556200017d9060001962001c7e565b6200018b9060001962001c09565b600d8190553360009081526001602052604081209190915554620001b8906001600160a01b031662000351565b620001c33062000351565b620001e0620001da6000546001600160a01b031690565b6200041b565b620001ed61dead6200041b565b620001f8306200041b565b600b5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505060175462000257925063ffffffff8082169250600160801b909104166200057a565b6017546200027d9063ffffffff6401000000008204811691600160801b90041662000748565b601754601a54620002b59163ffffffff680100000000000000008204811692600160801b90920416906001600160a01b031662000916565b601754601954601854620002f79263ffffffff6c010000000000000000000000008204811693600160801b90920416916001600160a01b039091169062000af9565b62001cd7565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526003602052604090205460ff1615620003c05760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e0000000060448201526064015b60405180910390fd5b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e91015b60405180910390a150565b6001600160a01b03811660009081526004602052604090205460ff1615620004865760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401620003b7565b6001600160a01b03811660009081526001602052604090205415620004e3576001600160a01b038116600090815260016020526040902054620004c9906200107b565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f910162000410565b6000546001600160a01b03163314620005c55760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b60155462010000900460ff16156200062e5760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b6064820152608401620003b7565b60008263ffffffff1611620006755760405162461bcd60e51b815260206004820152601b602482015260008051602062005b038339815191526044820152606401620003b7565b6200068c600a54600160a01b900463ffffffff1690565b63ffffffff166200069f82600262001a98565b63ffffffff161115620006fe5760405162461bcd60e51b8152602060048201526031602482015260008051602062005ac383398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b6064820152608401620003b7565b6015805462ff00001916620100001790556200071b828262001105565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6000546001600160a01b03163314620007935760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b6015546301000000900460ff1615620007fa5760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b6064820152608401620003b7565b60008263ffffffff1611620008415760405162461bcd60e51b815260206004820152601b602482015260008051602062005b038339815191526044820152606401620003b7565b62000858600a54600160a01b900463ffffffff1690565b63ffffffff166200086b82600262001a98565b63ffffffff161115620008ca5760405162461bcd60e51b8152602060048201526031602482015260008051602062005ac383398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b6064820152608401620003b7565b6015805463ff00000019166301000000179055620008e9828262001277565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000546001600160a01b03163314620009615760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b601554640100000000900460ff1615620009d05760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b6064820152608401620003b7565b60008363ffffffff161162000a175760405162461bcd60e51b815260206004820152601b602482015260008051602062005b038339815191526044820152606401620003b7565b62000a2e600a54600160a01b900463ffffffff1690565b63ffffffff1662000a4183600262001a98565b63ffffffff16111562000aa05760405162461bcd60e51b8152602060048201526031602482015260008051602062005ac383398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b6064820152608401620003b7565b6015805460ff60201b191664010000000017905562000ac08383620013df565b62000acb816200154a565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b6000546001600160a01b0316331462000b445760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b601554610100900460ff161562000bb85760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b6064820152608401620003b7565b60008463ffffffff161162000bff5760405162461bcd60e51b815260206004820152601b602482015260008051602062005b038339815191526044820152606401620003b7565b62000c16600a54600160a01b900463ffffffff1690565b63ffffffff1662000c2984600262001a98565b63ffffffff16111562000c885760405162461bcd60e51b8152602060048201526031602482015260008051602062005ac383398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b6064820152608401620003b7565b806012819055506000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000cce57600080fd5b505afa15801562000ce3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d09919062001a6d565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801562000d5257600080fd5b505afa15801562000d67573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d8d919062001a6d565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801562000dd457600080fd5b505afa15801562000de9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e0f919062001a6d565b600880546001600160a01b0319166001600160a01b0392909216918217905562000fd157806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000e6d57600080fd5b505afa15801562000e82573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ea8919062001a6d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801562000ef157600080fd5b505afa15801562000f06573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2c919062001a6d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801562000f7557600080fd5b505af115801562000f8a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fb0919062001a6d565b600880546001600160a01b0319166001600160a01b03929092169190911790555b600780546001600160a01b0319166001600160a01b03831617905562000ff7816200041b565b6008546200100e906001600160a01b03166200041b565b620010198162000351565b60085462001030906001600160a01b031662000351565b6015805461ff0019166101001790556200104b85856200167c565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a15050505050565b6000600d54821115620010e45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620003b7565b6000620010f062001805565b9050620010fe818462001ac3565b9392505050565b6000546001600160a01b03163314620011505760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b60155462010000900460ff16620011dc5760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a401620003b7565b600a80546009805463ffffffff86811664010000000081810263ffffffff60201b19871617909655868216600160a01b81810263ffffffff60a01b19861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f84ba5d5cf1d43f3f37d007c975f7d0a9614a775fa74ced7fd5e43f865b7178ab906080015b60405180910390a150505050565b6000546001600160a01b03163314620012c25760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b6015546301000000900460ff16620013435760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e00006064820152608401620003b7565b600a80546009805463ffffffff8681166801000000000000000081810263ffffffff60401b19871617909655868216600160a01b810263ffffffff60a01b1985161790945560408051969095048216808752600160c01b90930490911660208601819052938501526060840191909152917f320ff236531ee7e60c9ff23c6d44362d351d607ee43175d3af1134439db7ed1b9060800162001269565b6000546001600160a01b031633146200142a5760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b601554640100000000900460ff16620014c35760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a401620003b7565b600a805463ffffffff83811663ffffffff19868316600160801b8181029290921663ffffffff63ffffffff60801b011986161783179095556040805191850484168083529390941660208201819052938101949094526060840152917f16563cf9040b99a947778746ba8b7ba63ba4269f6c2ad3b49fadbdf7d0b43ddd9060800162001269565b6000546001600160a01b03163314620015955760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b6009546001600160a01b03828116911614156200161b5760405162461bcd60e51b815260206004820152603560248201527f4e6577204d61726b6574696e672061646472657373206d75737420626520646960448201527f66666572656e74207468616e206f6c64206f6e652e00000000000000000000006064820152608401620003b7565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a9910160405180910390a15050565b6000546001600160a01b03163314620016c75760405162461bcd60e51b8152602060048201819052602482015260008051602062005ae38339815191526044820152606401620003b7565b601554610100900460ff166200176c5760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a401620003b7565b600a80546009805463ffffffff8681166c0100000000000000000000000081810263ffffffff60601b19871617909655868216600160e01b8181026001600160e01b03861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f4b304b94548ee9f98cb230df3b1108ae3f7899db5796dd75ae2412885b6d38519060800162001269565b60008080620018136200182b565b909250905062001824818362001ac3565b9250505090565b600d54600b546000918291825b60055481101562001993578260016000600584815481106200185e576200185e62001cc1565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620018cd5750816002600060058481548110620018a657620018a662001cc1565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620018e457600d54600b54945094505050509091565b6001600060058381548110620018fe57620018fe62001cc1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546200192f908462001c09565b925060026000600583815481106200194b576200194b62001cc1565b60009182526020808320909101546001600160a01b031683528201929092526040019020546200197c908362001c09565b9150806200198a8162001c60565b91505062001838565b50600b54600d54620019a6919062001ac3565b821015620019be57600d54600b549350935050509091565b90939092509050565b828054620019d59062001c23565b90600052602060002090601f016020900481019282620019f9576000855562001a44565b82601f1062001a1457805160ff191683800117855562001a44565b8280016001018555821562001a44579182015b8281111562001a4457825182559160200191906001019062001a27565b5062001a5292915062001a56565b5090565b5b8082111562001a52576000815560010162001a57565b60006020828403121562001a8057600080fd5b81516001600160a01b0381168114620010fe57600080fd5b600063ffffffff80831681851680830382111562001aba5762001aba62001c95565b01949350505050565b60008262001ad55762001ad562001cab565b500490565b600181815b8085111562001b1b57816000190482111562001aff5762001aff62001c95565b8085161562001b0d57918102915b93841c939080029062001adf565b509250929050565b6000620010fe63ffffffff84168360008262001b425750600162001be1565b8162001b515750600062001be1565b816001811462001b6a576002811462001b755762001b95565b600191505062001be1565b60ff84111562001b895762001b8962001c95565b50506001821b62001be1565b5060208310610133831016604e8410600b841016171562001bba575081810a62001be1565b62001bc6838362001ada565b806000190482111562001bdd5762001bdd62001c95565b0290505b92915050565b600081600019048311821515161562001c045762001c0462001c95565b500290565b60008282101562001c1e5762001c1e62001c95565b500390565b600181811c9082168062001c3857607f821691505b6020821081141562001c5a57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562001c775762001c7762001c95565b5060010190565b60008262001c905762001c9062001cab565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b613ddc8062001ce76000396000f3fe6080604052600436106103035760003560e01c8063771282f611610190578063a65e0723116100dc578063dd62ed3e11610095578063ea1c38b21161006f578063ea1c38b214610932578063f2fde38b14610954578063f91f054014610974578063fbfa089c1461098957600080fd5b8063dd62ed3e146108b5578063e2314bea146108fb578063e5d41c6b1461091d57600080fd5b8063a65e0723146107f1578063a9059cbb14610811578063aa5e875214610831578063ad8e91dd14610851578063af1d855414610873578063d42ac3771461089357600080fd5b806390c364b21161014957806397dc4a131161012357806397dc4a13146107735780639dd255da14610793578063a457c2d7146107b1578063a5ece941146107d157600080fd5b806390c364b21461072957806395d89b4114610749578063966ff6501461075e57600080fd5b8063771282f61461065d57806379cc679014610672578063882f86d61461069257806388f82020146106b25780638da5cb5b146106eb578063906e9dd01461070957600080fd5b8063313ce5671161024f57806349bd5a5e116102085780636e999d36116101e25780636e999d36146105fe57806370a0823114610613578063715018a6146106335780637656e1461461064857600080fd5b806349bd5a5e1461057e5780635342acb4146105b05780636483ea8b146105e957600080fd5b8063313ce567146104c757806339509351146104e95780633add8b701461050957806342966c6814610529578063470d5cbd1461054957806348a464731461055e57600080fd5b8063166769d2116102bc57806317ee69951161029657806317ee69951461044c57806318160ddd1461046b5780631c3034951461048a57806323b872dd146104a757600080fd5b8063166769d2146103ed57806317371a3c1461040d5780631757354e1461042d57600080fd5b806301b715311461030f57806306fdde0314610347578063095ea7b3146103695780630b60e5641461039957806313f42605146103b057806313facdb7146103cb57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b50600a54600160201b900463ffffffff165b60405163ffffffff90911681526020015b60405180910390f35b34801561035357600080fd5b5061035c6109ab565b60405161033e9190613a03565b34801561037557600080fd5b506103896103843660046138c9565b610a3d565b604051901515815260200161033e565b3480156103a557600080fd5b506103ae610a54565b005b3480156103bc57600080fd5b50600a5463ffffffff1661032d565b3480156103d757600080fd5b50600a54600160601b900463ffffffff1661032d565b3480156103f957600080fd5b506103ae61040836600461396f565b610b3a565b34801561041957600080fd5b506103ae61042836600461393c565b610c8a565b34801561043957600080fd5b50601554600160201b900460ff16610389565b34801561045857600080fd5b506015546301000000900460ff16610389565b34801561047757600080fd5b50600b545b60405190815260200161033e565b34801561049657600080fd5b50601554610100900460ff16610389565b3480156104b357600080fd5b506103896104c2366004613888565b610dc8565b3480156104d357600080fd5b50600a54600160a01b900463ffffffff1661032d565b3480156104f557600080fd5b506103896105043660046138c9565b610e9e565b34801561051557600080fd5b506103ae6105243660046139b6565b610ed5565b34801561053557600080fd5b506103ae6105443660046138f5565b6113a6565b34801561055557600080fd5b506103ae6113b3565b34801561056a57600080fd5b506103ae6105793660046138f5565b611485565b34801561058a57600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161033e565b3480156105bc57600080fd5b506103896105cb366004613815565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f557600080fd5b506103ae61156c565b34801561060a57600080fd5b5060105461047c565b34801561061f57600080fd5b5061047c61062e366004613815565b611649565b34801561063f57600080fd5b506103ae6116a8565b34801561065457600080fd5b506103ae6116de565b34801561066957600080fd5b50600c5461047c565b34801561067e57600080fd5b506103ae61068d3660046138c9565b6117b1565b34801561069e57600080fd5b506103ae6106ad36600461393c565b611839565b3480156106be57600080fd5b506103896106cd366004613815565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106f757600080fd5b506000546001600160a01b0316610598565b34801561071557600080fd5b506103ae610724366004613815565b611988565b34801561073557600080fd5b506103ae61074436600461393c565b611a88565b34801561075557600080fd5b5061035c611bc6565b34801561076a57600080fd5b50600f5461047c565b34801561077f57600080fd5b506103ae61078e3660046138f5565b611bd5565b34801561079f57600080fd5b5060155462010000900460ff16610389565b3480156107bd57600080fd5b506103896107cc3660046138c9565b611d38565b3480156107dd57600080fd5b50600954610598906001600160a01b031681565b3480156107fd57600080fd5b506103ae61080c36600461393c565b611dc9565b34801561081d57600080fd5b5061038961082c3660046138c9565b611f25565b34801561083d57600080fd5b506103ae61084c36600461393c565b611f32565b34801561085d57600080fd5b50600954600160c01b900463ffffffff1661032d565b34801561087f57600080fd5b506103ae61088e36600461393c565b61207f565b34801561089f57600080fd5b50600a54600160401b900463ffffffff1661032d565b3480156108c157600080fd5b5061047c6108d036600461384f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561090757600080fd5b50600a54600160801b900463ffffffff1661032d565b34801561092957600080fd5b5060125461047c565b34801561093e57600080fd5b50600954600160e01b900463ffffffff1661032d565b34801561096057600080fd5b506103ae61096f366004613815565b6121c3565b34801561098057600080fd5b5060115461047c565b34801561099557600080fd5b50600954600160a01b900463ffffffff1661032d565b6060601380546109ba90613d0f565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613d0f565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6000610a4a33848461225b565b5060015b92915050565b6000546001600160a01b03163314610a875760405162461bcd60e51b8152600401610a7e90613ae0565b60405180910390fd5b601554600160201b900460ff16610af65760405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574696e6720726577617264206665617475726520697320616c726560448201526c30b23c903234b9b0b13632b21760991b6064820152608401610a7e565b610b01600080611f32565b6015805464ff00000000191690556040517fc006fa0ca84a65d09adbbde41e9930dc143f38f39dfc5fde66f1a18c573243e090600090a1565b6000546001600160a01b03163314610b645760405162461bcd60e51b8152600401610a7e90613ae0565b601554600160201b900460ff1615610bd05760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b6064820152608401610a7e565b60008363ffffffff1611610bf65760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610c11836002613b9e565b63ffffffff161115610c355760405162461bcd60e51b8152600401610a7e90613a58565b6015805464ff000000001916600160201b179055610c538383611f32565b610c5c81611988565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b6000546001600160a01b03163314610cb45760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff1615610d195760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b6064820152608401610a7e565b60008263ffffffff1611610d3f5760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610d5a826002613b9e565b63ffffffff161115610d7e5760405162461bcd60e51b8152600401610a7e90613a58565b6015805463ff00000019166301000000179055610d9b828261207f565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000610dd584848461237f565b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610e595760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a7e565b6001600160a01b038416600090815260066020908152604080832033808552925290912054610e94918691610e8f908690613cf8565b61225b565b5060019392505050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a4a918590610e8f908690613b86565b6000546001600160a01b03163314610eff5760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff1615610f715760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b6064820152608401610a7e565b60008463ffffffff1611610f975760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610fb2846002613b9e565b63ffffffff161115610fd65760405162461bcd60e51b8152600401610a7e90613a58565b806012819055506000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561101b57600080fd5b505afa15801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190613832565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561109b57600080fd5b505afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613832565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111519190613832565b600880546001600160a01b0319166001600160a01b0392909216918217905561130657806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e59190613832565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190613832565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190613832565b600880546001600160a01b0319166001600160a01b03929092169190911790555b600780546001600160a01b0319166001600160a01b03831617905561132a81612643565b60085461133f906001600160a01b0316612643565b611348816127a3565b60085461135d906001600160a01b03166127a3565b6015805461ff0019166101001790556113768585611dc9565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a15050505050565b6113b03382612860565b50565b6000546001600160a01b031633146113dd5760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff166114425760405162461bcd60e51b815260206004820152602360248201527f526577617264206665617475726520697320616c72656164792064697361626c60448201526232b21760e91b6064820152608401610a7e565b61144d60008061207f565b6015805463ff000000191690556040517f9843194c3ceed34b5019222853f7806a15e8658437ee2a92d9497af23775eb1c90600090a1565b6000546001600160a01b031633146114af5760405162461bcd60e51b8152600401610a7e90613ae0565b600c5481106115265760405162461bcd60e51b815260206004820152603760248201527f6d696e546f6b656e734265666f726553776170206d757374206265206869676860448201527f6572207468616e2063757272656e7420737570706c792e0000000000000000006064820152608401610a7e565b601280549082905560408051828152602081018490527fd2f58a5c369e86bc74f3b5be6f9a34224ebb43d603f7acee04b07ef21c7d14bf91015b60405180910390a15050565b6000546001600160a01b031633146115965760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff166116085760405162461bcd60e51b815260206004820152603260248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152711030b63932b0b23c903234b9b0b13632b21760711b6064820152608401610a7e565b611613600080611dc9565b6015805461ff00191690556040517f8b81884e0d82e2abd8363cce812b78c588d27387411db0470222a728a917783e90600090a1565b6001600160a01b03811660009081526004602052604081205460ff161561168657506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610a4e90612af9565b6000546001600160a01b031633146116d25760405162461bcd60e51b8152600401610a7e90613ae0565b6116dc6000612b7d565b565b6000546001600160a01b031633146117085760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff1661176f5760405162461bcd60e51b815260206004820152602660248201527f4175746f206275726e206665617475726520697320616c72656164792064697360448201526530b13632b21760d11b6064820152608401610a7e565b61177a600080611839565b6015805462ff0000191690556040517f6d4de23ebf419282b51fea4d5ebe9d980cf43df3f9e8ddde137786adfc2c5d6a90600090a1565b60006117bd83336108d0565b90508181101561181b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610a7e565b61182a8333610e8f8585613cf8565b6118348383612860565b505050565b6000546001600160a01b031633146118635760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff166118ed5760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a401610a7e565b600a80546009805463ffffffff868116600160201b81810267ffffffff0000000019871617909655868216600160a01b81810263ffffffff60a01b19861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f84ba5d5cf1d43f3f37d007c975f7d0a9614a775fa74ced7fd5e43f865b7178ab906080015b60405180910390a150505050565b6000546001600160a01b031633146119b25760405162461bcd60e51b8152600401610a7e90613ae0565b6009546001600160a01b0382811691161415611a2e5760405162461bcd60e51b815260206004820152603560248201527f4e6577204d61726b6574696e672061646472657373206d757374206265206469604482015274333332b932b73a103a3430b71037b6321037b7329760591b6064820152608401610a7e565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a99101611560565b6000546001600160a01b03163314611ab25760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff1615611b195760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b6064820152608401610a7e565b60008263ffffffff1611611b3f5760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16611b5a826002613b9e565b63ffffffff161115611b7e5760405162461bcd60e51b8152600401610a7e90613a58565b6015805462ff0000191662010000179055611b998282611839565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6060601480546109ba90613d0f565b3381611be082611649565b1015611c3e5760405162461bcd60e51b815260206004820152602760248201527f5468652063616c6c6572206d75737420686176652062616c616e6365203e3d2060448201526630b6b7bab73a1760c91b6064820152608401610a7e565b6000611c4b836000612bcd565b6001600160a01b03831660009081526004602052604090205490915060ff1615611c9f5780516001600160a01b03831660009081526002602052604081208054909190611c99908490613cf8565b90915550505b60c08101516001600160a01b03831660009081526001602052604081208054909190611ccc908490613cf8565b909155505060c0810151600d54611ce39190613cf8565b600d8190555082600e6000828254611cfb9190613b86565b90915550506040518381527fd0ecdf4854f39daba34ba0e2c1ed0132a7023a5434bffc90b24f3335fb90e5e39060200160405180910390a1505050565b3360009081526006602090815260408083206001600160a01b038616845290915281205482811015611dba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a7e565b610e943385610e8f8685613cf8565b6000546001600160a01b03163314611df35760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff16611e965760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a401610a7e565b600a80546009805463ffffffff868116600160601b81810263ffffffff60601b19871617909655868216600160e01b8181026001600160e01b03861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f4b304b94548ee9f98cb230df3b1108ae3f7899db5796dd75ae2412885b6d38519060800161197a565b6000610a4a33848461237f565b6000546001600160a01b03163314611f5c5760405162461bcd60e51b8152600401610a7e90613ae0565b601554600160201b900460ff16611ff25760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a401610a7e565b600a805463ffffffff83811663ffffffff19868316600160801b8181029290921673ffffffff000000000000000000000000ffffffff1986161783179095556040805191850484168083529390941660208201819052938101949094526060840152917f16563cf9040b99a947778746ba8b7ba63ba4269f6c2ad3b49fadbdf7d0b43ddd9060800161197a565b6000546001600160a01b031633146120a95760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff166121285760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e00006064820152608401610a7e565b600a80546009805463ffffffff868116600160401b8181026bffffffff000000000000000019871617909655868216600160a01b810263ffffffff60a01b1985161790945560408051969095048216808752600160c01b90930490911660208601819052938501526060840191909152917f320ff236531ee7e60c9ff23c6d44362d351d607ee43175d3af1134439db7ed1b9060800161197a565b6000546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610a7e90613ae0565b6001600160a01b0381166122525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7e565b6113b081612b7d565b6001600160a01b0383166122bd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a7e565b6001600160a01b03821661231e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a7e565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166123e35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a7e565b6001600160a01b0382166124455760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a7e565b6001600160a01b03831660009081526003602052604081205461246c90839060ff16612bcd565b6001600160a01b03851660009081526004602052604090205490915060ff1680156124b057506001600160a01b03831660009081526004602052604090205460ff16155b156124c5576124c0848483612bf4565b6125c3565b6001600160a01b03841660009081526004602052604090205460ff1615801561250657506001600160a01b03831660009081526004602052604090205460ff165b15612516576124c0848483612ca9565b6001600160a01b03841660009081526004602052604090205460ff1615801561255857506001600160a01b03831660009081526004602052604090205460ff16155b15612568576124c0848483612d46565b6001600160a01b03841660009081526004602052604090205460ff1680156125a857506001600160a01b03831660009081526004602052604090205460ff165b156125b8576124c0848483612d6e565b6125c3848483612d46565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161260c91815260200190565b60405180910390a36001600160a01b03841660009081526003602052604090205460ff1661263d5761263d81612dca565b50505050565b6001600160a01b03811660009081526004602052604090205460ff16156126ac5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610a7e565b6001600160a01b03811660009081526001602052604090205415612706576001600160a01b0381166000908152600160205260409020546126ec90612af9565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f91015b60405180910390a150565b6001600160a01b03811660009081526003602052604090205460ff161561280c5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610a7e565b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e9101612798565b6001600160a01b03821661dead14156128c55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610a7e565b60006128d083611649565b90508181101561292d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a7e565b600061293883612f71565b6001600160a01b03851660009081526004602052604090205490915060ff161561298a576001600160a01b03841660009081526002602052604081208054859290612984908490613cf8565b90915550505b6001600160a01b038416600090815260016020526040812080548392906129b2908490613cf8565b909155505061dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc80548592906129f5908490613b86565b909155505061dead600090815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d8054839290612a38908490613b86565b9250508190555082600c6000828254612a519190613cf8565b9250508190555082600f6000828254612a6a9190613b86565b9091555050604080516001600160a01b0386168152602081018590527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a160405183815261dead906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000600d54821115612b605760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a7e565b6000612b6a612f88565b9050612b768184613bc6565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612bd561379b565b612bdd61379b565b838152612bea8184612fab565b612b7681846130b1565b80516001600160a01b038416600090815260026020526040902054612c199190613cf8565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054612c509190613cf8565b6001600160a01b038085166000908152600160205260408082209390935561016084015191851681529190912054612c889190613b86565b6001600160a01b039092166000908152600160205260409020919091555050565b60c08101516001600160a01b038416600090815260016020526040902054612cd19190613cf8565b6001600160a01b0380851660009081526001602090815260408083209490945560a08501519286168252600290529190912054612d0e9190613b86565b6001600160a01b038316600090815260026020908152604080832093909355610160840151600190915291902054612c889190613b86565b60c08101516001600160a01b038416600090815260016020526040902054612c509190613cf8565b80516001600160a01b038416600090815260026020526040902054612d939190613cf8565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054612cd19190613cf8565b60155462010000900460ff1615612e4d57602080820151306000908152600290925260408220805491929091612e01908490613b86565b909155505060e08101513060009081526001602052604081208054909190612e2a908490613b86565b90915550612e3f90503033836020015161225b565b612e4d3082602001516117b1565b601554600160201b900460ff1615612e81576009546101408201516080830151612e81926001600160a01b0316919061319a565b6015546301000000900460ff1615612ea657612ea6816101000151826040015161321b565b601554610100900460ff16156113b05760608101513060009081526002602052604081208054909190612eda908490613b86565b90915550506101208101513060009081526001602052604081208054909190612f04908490613b86565b90915550503060009081526002602052604090205460125481108015908190612f30575060155460ff16155b8015612f5057506008546001600160a01b0316336001600160a01b031614155b8015612f635750601554610100900460ff165b15611834576118348261324a565b600080612f7c612f88565b9050612b768184613cd9565b6000806000612f95613385565b9092509050612fa48183613bc6565b9250505090565b8015612fbc57815160a08301525050565b8151600a54600954612fe6929163ffffffff600160201b909104811691600160a01b900416613508565b60208301528151600a54600954613015929163ffffffff600160401b909104811691600160c01b900416613508565b60408301528151600a54600954613044929163ffffffff600160601b909104811691600160e01b900416613508565b60608301528151600a54613068919063ffffffff600160801b820481169116613508565b60808301819052606083015160408401516020850151855161308a9190613cf8565b6130949190613cf8565b61309e9190613cf8565b6130a89190613cf8565b60a08301525050565b60006130bb612f88565b83519091506130cb908290613cd9565b60c084015281156130e65760c0830151610160840152505050565b82516130f3908290613cd9565b60c08401526020830151613108908290613cd9565b60e0840152604083015161311d908290613cd9565b6101008401526060830151613133908290613cd9565b6101208401526080830151613149908290613cd9565b610140840181905261012084015161010085015160e086015160c08701516131719190613cf8565b61317b9190613cf8565b6131859190613cf8565b61318f9190613cf8565b610160840152505050565b6001600160a01b03831660009081526004602052604090205460ff16156131e9576001600160a01b038316600090815260026020526040812080548392906131e3908490613b86565b90915550505b6001600160a01b03831660009081526001602052604081208054849290613211908490613b86565b9091555050505050565b81600d546132299190613cf8565b600d8190555080600e60008282546132419190613b86565b90915550505050565b60155460ff161561329d5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610a7e565b6015805460ff1916600117905560006132b7600283613bc6565b905060006132c58284613cf8565b9050476132d183613543565b60006132dd8247613cf8565b90506132e981846136b5565b6132f38247613cf8565b601160008282546133049190613b86565b90915550613313905030611649565b61331d9086613cf8565b6010600082825461332e9190613b86565b909155505060408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff19169055505050565b600d54600b546000918291825b6005548110156134d7578260016000600584815481106133b4576133b4613d7b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061341f57508160026000600584815481106133f8576133f8613d7b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561343557600d54600b54945094505050509091565b600160006005838154811061344c5761344c613d7b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461347b9084613cf8565b9250600260006005838154811061349457613494613d7b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134c39083613cf8565b9150806134cf81613d4a565b915050613392565b50600b54600d546134e89190613bc6565b8210156134ff57600d54600b549350935050509091565b90939092509050565b6000606461351783600a613c2b565b61352763ffffffff861687613cd9565b6135319190613bc6565b61353b9190613bc6565b949350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061357857613578613d7b565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156135cc57600080fd5b505afa1580156135e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136049190613832565b8160018151811061361757613617613d7b565b6001600160a01b03928316602091820292909201015260075461363d913091168461225b565b6007546001600160a01b031663791ac947836000843061365f4261ea60613b86565b6040518663ffffffff1660e01b815260040161367f959493929190613b15565b600060405180830381600087803b15801561369957600080fd5b505af11580156136ad573d6000803e3d6000fd5b505050505050565b6007546136cd9030906001600160a01b03168361225b565b6007546001600160a01b031663f305d71983308460008061dead6136f34261ea60613b86565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561375b57600080fd5b505af115801561376f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613794919061390e565b5050505050565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803563ffffffff8116811461381057600080fd5b919050565b60006020828403121561382757600080fd5b8135612b7681613d91565b60006020828403121561384457600080fd5b8151612b7681613d91565b6000806040838503121561386257600080fd5b823561386d81613d91565b9150602083013561387d81613d91565b809150509250929050565b60008060006060848603121561389d57600080fd5b83356138a881613d91565b925060208401356138b881613d91565b929592945050506040919091013590565b600080604083850312156138dc57600080fd5b82356138e781613d91565b946020939093013593505050565b60006020828403121561390757600080fd5b5035919050565b60008060006060848603121561392357600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561394f57600080fd5b613958836137fc565b9150613966602084016137fc565b90509250929050565b60008060006060848603121561398457600080fd5b61398d846137fc565b925061399b602085016137fc565b915060408401356139ab81613d91565b809150509250925092565b600080600080608085870312156139cc57600080fd5b6139d5856137fc565b93506139e3602086016137fc565b925060408501356139f381613d91565b9396929550929360600135925050565b600060208083528351808285015260005b81811015613a3057858101830151858201604001528201613a14565b81811115613a42576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526031908201527f54617820646563696d616c73206d757374206265206c657373207468616e207460408201527037b5b2b7103232b1b4b6b0b6399016901960791b606082015260800190565b6020808252601b908201527f546178206d7573742062652067726561746572207468616e20302e0000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b655784516001600160a01b031683529383019391830191600101613b40565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613b9957613b99613d65565b500190565b600063ffffffff808316818516808303821115613bbd57613bbd613d65565b01949350505050565b600082613be357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613c23578160001904821115613c0957613c09613d65565b80851615613c1657918102915b93841c9390800290613bed565b509250929050565b6000612b7663ffffffff841683600082613c4757506001610a4e565b81613c5457506000610a4e565b8160018114613c6a5760028114613c7457613c90565b6001915050610a4e565b60ff841115613c8557613c85613d65565b50506001821b610a4e565b5060208310610133831016604e8410600b8410161715613cb3575081810a610a4e565b613cbd8383613be8565b8060001904821115613cd157613cd1613d65565b029392505050565b6000816000190483118215151615613cf357613cf3613d65565b500290565b600082821015613d0a57613d0a613d65565b500390565b600181811c90821680613d2357607f821691505b60208210811415613d4457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d5e57613d5e613d65565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146113b057600080fdfea2646970667358221220bac1949254ace4834711f98943002a7498d2fb7a5e0f72abd1af85a8d1bbb71c64736f6c6343000807003354617820646563696d616c73206d757374206265206c657373207468616e20744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546178206d7573742062652067726561746572207468616e20302e0000000000
Deployed Bytecode
0x6080604052600436106103035760003560e01c8063771282f611610190578063a65e0723116100dc578063dd62ed3e11610095578063ea1c38b21161006f578063ea1c38b214610932578063f2fde38b14610954578063f91f054014610974578063fbfa089c1461098957600080fd5b8063dd62ed3e146108b5578063e2314bea146108fb578063e5d41c6b1461091d57600080fd5b8063a65e0723146107f1578063a9059cbb14610811578063aa5e875214610831578063ad8e91dd14610851578063af1d855414610873578063d42ac3771461089357600080fd5b806390c364b21161014957806397dc4a131161012357806397dc4a13146107735780639dd255da14610793578063a457c2d7146107b1578063a5ece941146107d157600080fd5b806390c364b21461072957806395d89b4114610749578063966ff6501461075e57600080fd5b8063771282f61461065d57806379cc679014610672578063882f86d61461069257806388f82020146106b25780638da5cb5b146106eb578063906e9dd01461070957600080fd5b8063313ce5671161024f57806349bd5a5e116102085780636e999d36116101e25780636e999d36146105fe57806370a0823114610613578063715018a6146106335780637656e1461461064857600080fd5b806349bd5a5e1461057e5780635342acb4146105b05780636483ea8b146105e957600080fd5b8063313ce567146104c757806339509351146104e95780633add8b701461050957806342966c6814610529578063470d5cbd1461054957806348a464731461055e57600080fd5b8063166769d2116102bc57806317ee69951161029657806317ee69951461044c57806318160ddd1461046b5780631c3034951461048a57806323b872dd146104a757600080fd5b8063166769d2146103ed57806317371a3c1461040d5780631757354e1461042d57600080fd5b806301b715311461030f57806306fdde0314610347578063095ea7b3146103695780630b60e5641461039957806313f42605146103b057806313facdb7146103cb57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b50600a54600160201b900463ffffffff165b60405163ffffffff90911681526020015b60405180910390f35b34801561035357600080fd5b5061035c6109ab565b60405161033e9190613a03565b34801561037557600080fd5b506103896103843660046138c9565b610a3d565b604051901515815260200161033e565b3480156103a557600080fd5b506103ae610a54565b005b3480156103bc57600080fd5b50600a5463ffffffff1661032d565b3480156103d757600080fd5b50600a54600160601b900463ffffffff1661032d565b3480156103f957600080fd5b506103ae61040836600461396f565b610b3a565b34801561041957600080fd5b506103ae61042836600461393c565b610c8a565b34801561043957600080fd5b50601554600160201b900460ff16610389565b34801561045857600080fd5b506015546301000000900460ff16610389565b34801561047757600080fd5b50600b545b60405190815260200161033e565b34801561049657600080fd5b50601554610100900460ff16610389565b3480156104b357600080fd5b506103896104c2366004613888565b610dc8565b3480156104d357600080fd5b50600a54600160a01b900463ffffffff1661032d565b3480156104f557600080fd5b506103896105043660046138c9565b610e9e565b34801561051557600080fd5b506103ae6105243660046139b6565b610ed5565b34801561053557600080fd5b506103ae6105443660046138f5565b6113a6565b34801561055557600080fd5b506103ae6113b3565b34801561056a57600080fd5b506103ae6105793660046138f5565b611485565b34801561058a57600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161033e565b3480156105bc57600080fd5b506103896105cb366004613815565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156105f557600080fd5b506103ae61156c565b34801561060a57600080fd5b5060105461047c565b34801561061f57600080fd5b5061047c61062e366004613815565b611649565b34801561063f57600080fd5b506103ae6116a8565b34801561065457600080fd5b506103ae6116de565b34801561066957600080fd5b50600c5461047c565b34801561067e57600080fd5b506103ae61068d3660046138c9565b6117b1565b34801561069e57600080fd5b506103ae6106ad36600461393c565b611839565b3480156106be57600080fd5b506103896106cd366004613815565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106f757600080fd5b506000546001600160a01b0316610598565b34801561071557600080fd5b506103ae610724366004613815565b611988565b34801561073557600080fd5b506103ae61074436600461393c565b611a88565b34801561075557600080fd5b5061035c611bc6565b34801561076a57600080fd5b50600f5461047c565b34801561077f57600080fd5b506103ae61078e3660046138f5565b611bd5565b34801561079f57600080fd5b5060155462010000900460ff16610389565b3480156107bd57600080fd5b506103896107cc3660046138c9565b611d38565b3480156107dd57600080fd5b50600954610598906001600160a01b031681565b3480156107fd57600080fd5b506103ae61080c36600461393c565b611dc9565b34801561081d57600080fd5b5061038961082c3660046138c9565b611f25565b34801561083d57600080fd5b506103ae61084c36600461393c565b611f32565b34801561085d57600080fd5b50600954600160c01b900463ffffffff1661032d565b34801561087f57600080fd5b506103ae61088e36600461393c565b61207f565b34801561089f57600080fd5b50600a54600160401b900463ffffffff1661032d565b3480156108c157600080fd5b5061047c6108d036600461384f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561090757600080fd5b50600a54600160801b900463ffffffff1661032d565b34801561092957600080fd5b5060125461047c565b34801561093e57600080fd5b50600954600160e01b900463ffffffff1661032d565b34801561096057600080fd5b506103ae61096f366004613815565b6121c3565b34801561098057600080fd5b5060115461047c565b34801561099557600080fd5b50600954600160a01b900463ffffffff1661032d565b6060601380546109ba90613d0f565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613d0f565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6000610a4a33848461225b565b5060015b92915050565b6000546001600160a01b03163314610a875760405162461bcd60e51b8152600401610a7e90613ae0565b60405180910390fd5b601554600160201b900460ff16610af65760405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574696e6720726577617264206665617475726520697320616c726560448201526c30b23c903234b9b0b13632b21760991b6064820152608401610a7e565b610b01600080611f32565b6015805464ff00000000191690556040517fc006fa0ca84a65d09adbbde41e9930dc143f38f39dfc5fde66f1a18c573243e090600090a1565b6000546001600160a01b03163314610b645760405162461bcd60e51b8152600401610a7e90613ae0565b601554600160201b900460ff1615610bd05760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b6064820152608401610a7e565b60008363ffffffff1611610bf65760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610c11836002613b9e565b63ffffffff161115610c355760405162461bcd60e51b8152600401610a7e90613a58565b6015805464ff000000001916600160201b179055610c538383611f32565b610c5c81611988565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b6000546001600160a01b03163314610cb45760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff1615610d195760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b6064820152608401610a7e565b60008263ffffffff1611610d3f5760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610d5a826002613b9e565b63ffffffff161115610d7e5760405162461bcd60e51b8152600401610a7e90613a58565b6015805463ff00000019166301000000179055610d9b828261207f565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000610dd584848461237f565b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610e595760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a7e565b6001600160a01b038416600090815260066020908152604080832033808552925290912054610e94918691610e8f908690613cf8565b61225b565b5060019392505050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a4a918590610e8f908690613b86565b6000546001600160a01b03163314610eff5760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff1615610f715760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b6064820152608401610a7e565b60008463ffffffff1611610f975760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16610fb2846002613b9e565b63ffffffff161115610fd65760405162461bcd60e51b8152600401610a7e90613a58565b806012819055506000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561101b57600080fd5b505afa15801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190613832565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561109b57600080fd5b505afa1580156110af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d39190613832565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111519190613832565b600880546001600160a01b0319166001600160a01b0392909216918217905561130657806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e59190613832565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112659190613832565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156112ad57600080fd5b505af11580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190613832565b600880546001600160a01b0319166001600160a01b03929092169190911790555b600780546001600160a01b0319166001600160a01b03831617905561132a81612643565b60085461133f906001600160a01b0316612643565b611348816127a3565b60085461135d906001600160a01b03166127a3565b6015805461ff0019166101001790556113768585611dc9565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a15050505050565b6113b03382612860565b50565b6000546001600160a01b031633146113dd5760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff166114425760405162461bcd60e51b815260206004820152602360248201527f526577617264206665617475726520697320616c72656164792064697361626c60448201526232b21760e91b6064820152608401610a7e565b61144d60008061207f565b6015805463ff000000191690556040517f9843194c3ceed34b5019222853f7806a15e8658437ee2a92d9497af23775eb1c90600090a1565b6000546001600160a01b031633146114af5760405162461bcd60e51b8152600401610a7e90613ae0565b600c5481106115265760405162461bcd60e51b815260206004820152603760248201527f6d696e546f6b656e734265666f726553776170206d757374206265206869676860448201527f6572207468616e2063757272656e7420737570706c792e0000000000000000006064820152608401610a7e565b601280549082905560408051828152602081018490527fd2f58a5c369e86bc74f3b5be6f9a34224ebb43d603f7acee04b07ef21c7d14bf91015b60405180910390a15050565b6000546001600160a01b031633146115965760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff166116085760405162461bcd60e51b815260206004820152603260248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152711030b63932b0b23c903234b9b0b13632b21760711b6064820152608401610a7e565b611613600080611dc9565b6015805461ff00191690556040517f8b81884e0d82e2abd8363cce812b78c588d27387411db0470222a728a917783e90600090a1565b6001600160a01b03811660009081526004602052604081205460ff161561168657506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610a4e90612af9565b6000546001600160a01b031633146116d25760405162461bcd60e51b8152600401610a7e90613ae0565b6116dc6000612b7d565b565b6000546001600160a01b031633146117085760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff1661176f5760405162461bcd60e51b815260206004820152602660248201527f4175746f206275726e206665617475726520697320616c72656164792064697360448201526530b13632b21760d11b6064820152608401610a7e565b61177a600080611839565b6015805462ff0000191690556040517f6d4de23ebf419282b51fea4d5ebe9d980cf43df3f9e8ddde137786adfc2c5d6a90600090a1565b60006117bd83336108d0565b90508181101561181b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610a7e565b61182a8333610e8f8585613cf8565b6118348383612860565b505050565b6000546001600160a01b031633146118635760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff166118ed5760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a401610a7e565b600a80546009805463ffffffff868116600160201b81810267ffffffff0000000019871617909655868216600160a01b81810263ffffffff60a01b19861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f84ba5d5cf1d43f3f37d007c975f7d0a9614a775fa74ced7fd5e43f865b7178ab906080015b60405180910390a150505050565b6000546001600160a01b031633146119b25760405162461bcd60e51b8152600401610a7e90613ae0565b6009546001600160a01b0382811691161415611a2e5760405162461bcd60e51b815260206004820152603560248201527f4e6577204d61726b6574696e672061646472657373206d757374206265206469604482015274333332b932b73a103a3430b71037b6321037b7329760591b6064820152608401610a7e565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a99101611560565b6000546001600160a01b03163314611ab25760405162461bcd60e51b8152600401610a7e90613ae0565b60155462010000900460ff1615611b195760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b6064820152608401610a7e565b60008263ffffffff1611611b3f5760405162461bcd60e51b8152600401610a7e90613aa9565b600a54600160a01b900463ffffffff16611b5a826002613b9e565b63ffffffff161115611b7e5760405162461bcd60e51b8152600401610a7e90613a58565b6015805462ff0000191662010000179055611b998282611839565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6060601480546109ba90613d0f565b3381611be082611649565b1015611c3e5760405162461bcd60e51b815260206004820152602760248201527f5468652063616c6c6572206d75737420686176652062616c616e6365203e3d2060448201526630b6b7bab73a1760c91b6064820152608401610a7e565b6000611c4b836000612bcd565b6001600160a01b03831660009081526004602052604090205490915060ff1615611c9f5780516001600160a01b03831660009081526002602052604081208054909190611c99908490613cf8565b90915550505b60c08101516001600160a01b03831660009081526001602052604081208054909190611ccc908490613cf8565b909155505060c0810151600d54611ce39190613cf8565b600d8190555082600e6000828254611cfb9190613b86565b90915550506040518381527fd0ecdf4854f39daba34ba0e2c1ed0132a7023a5434bffc90b24f3335fb90e5e39060200160405180910390a1505050565b3360009081526006602090815260408083206001600160a01b038616845290915281205482811015611dba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a7e565b610e943385610e8f8685613cf8565b6000546001600160a01b03163314611df35760405162461bcd60e51b8152600401610a7e90613ae0565b601554610100900460ff16611e965760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a401610a7e565b600a80546009805463ffffffff868116600160601b81810263ffffffff60601b19871617909655868216600160e01b8181026001600160e01b03861617909555604080519790960483168088529490930490911660208601819052938501526060840152917f4b304b94548ee9f98cb230df3b1108ae3f7899db5796dd75ae2412885b6d38519060800161197a565b6000610a4a33848461237f565b6000546001600160a01b03163314611f5c5760405162461bcd60e51b8152600401610a7e90613ae0565b601554600160201b900460ff16611ff25760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a401610a7e565b600a805463ffffffff83811663ffffffff19868316600160801b8181029290921673ffffffff000000000000000000000000ffffffff1986161783179095556040805191850484168083529390941660208201819052938101949094526060840152917f16563cf9040b99a947778746ba8b7ba63ba4269f6c2ad3b49fadbdf7d0b43ddd9060800161197a565b6000546001600160a01b031633146120a95760405162461bcd60e51b8152600401610a7e90613ae0565b6015546301000000900460ff166121285760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e00006064820152608401610a7e565b600a80546009805463ffffffff868116600160401b8181026bffffffff000000000000000019871617909655868216600160a01b810263ffffffff60a01b1985161790945560408051969095048216808752600160c01b90930490911660208601819052938501526060840191909152917f320ff236531ee7e60c9ff23c6d44362d351d607ee43175d3af1134439db7ed1b9060800161197a565b6000546001600160a01b031633146121ed5760405162461bcd60e51b8152600401610a7e90613ae0565b6001600160a01b0381166122525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7e565b6113b081612b7d565b6001600160a01b0383166122bd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a7e565b6001600160a01b03821661231e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a7e565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166123e35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a7e565b6001600160a01b0382166124455760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a7e565b6001600160a01b03831660009081526003602052604081205461246c90839060ff16612bcd565b6001600160a01b03851660009081526004602052604090205490915060ff1680156124b057506001600160a01b03831660009081526004602052604090205460ff16155b156124c5576124c0848483612bf4565b6125c3565b6001600160a01b03841660009081526004602052604090205460ff1615801561250657506001600160a01b03831660009081526004602052604090205460ff165b15612516576124c0848483612ca9565b6001600160a01b03841660009081526004602052604090205460ff1615801561255857506001600160a01b03831660009081526004602052604090205460ff16155b15612568576124c0848483612d46565b6001600160a01b03841660009081526004602052604090205460ff1680156125a857506001600160a01b03831660009081526004602052604090205460ff165b156125b8576124c0848483612d6e565b6125c3848483612d46565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a0015160405161260c91815260200190565b60405180910390a36001600160a01b03841660009081526003602052604090205460ff1661263d5761263d81612dca565b50505050565b6001600160a01b03811660009081526004602052604090205460ff16156126ac5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610a7e565b6001600160a01b03811660009081526001602052604090205415612706576001600160a01b0381166000908152600160205260409020546126ec90612af9565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f91015b60405180910390a150565b6001600160a01b03811660009081526003602052604090205460ff161561280c5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610a7e565b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e9101612798565b6001600160a01b03821661dead14156128c55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610a7e565b60006128d083611649565b90508181101561292d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a7e565b600061293883612f71565b6001600160a01b03851660009081526004602052604090205490915060ff161561298a576001600160a01b03841660009081526002602052604081208054859290612984908490613cf8565b90915550505b6001600160a01b038416600090815260016020526040812080548392906129b2908490613cf8565b909155505061dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc80548592906129f5908490613b86565b909155505061dead600090815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d8054839290612a38908490613b86565b9250508190555082600c6000828254612a519190613cf8565b9250508190555082600f6000828254612a6a9190613b86565b9091555050604080516001600160a01b0386168152602081018590527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a160405183815261dead906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000600d54821115612b605760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a7e565b6000612b6a612f88565b9050612b768184613bc6565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612bd561379b565b612bdd61379b565b838152612bea8184612fab565b612b7681846130b1565b80516001600160a01b038416600090815260026020526040902054612c199190613cf8565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054612c509190613cf8565b6001600160a01b038085166000908152600160205260408082209390935561016084015191851681529190912054612c889190613b86565b6001600160a01b039092166000908152600160205260409020919091555050565b60c08101516001600160a01b038416600090815260016020526040902054612cd19190613cf8565b6001600160a01b0380851660009081526001602090815260408083209490945560a08501519286168252600290529190912054612d0e9190613b86565b6001600160a01b038316600090815260026020908152604080832093909355610160840151600190915291902054612c889190613b86565b60c08101516001600160a01b038416600090815260016020526040902054612c509190613cf8565b80516001600160a01b038416600090815260026020526040902054612d939190613cf8565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054612cd19190613cf8565b60155462010000900460ff1615612e4d57602080820151306000908152600290925260408220805491929091612e01908490613b86565b909155505060e08101513060009081526001602052604081208054909190612e2a908490613b86565b90915550612e3f90503033836020015161225b565b612e4d3082602001516117b1565b601554600160201b900460ff1615612e81576009546101408201516080830151612e81926001600160a01b0316919061319a565b6015546301000000900460ff1615612ea657612ea6816101000151826040015161321b565b601554610100900460ff16156113b05760608101513060009081526002602052604081208054909190612eda908490613b86565b90915550506101208101513060009081526001602052604081208054909190612f04908490613b86565b90915550503060009081526002602052604090205460125481108015908190612f30575060155460ff16155b8015612f5057506008546001600160a01b0316336001600160a01b031614155b8015612f635750601554610100900460ff165b15611834576118348261324a565b600080612f7c612f88565b9050612b768184613cd9565b6000806000612f95613385565b9092509050612fa48183613bc6565b9250505090565b8015612fbc57815160a08301525050565b8151600a54600954612fe6929163ffffffff600160201b909104811691600160a01b900416613508565b60208301528151600a54600954613015929163ffffffff600160401b909104811691600160c01b900416613508565b60408301528151600a54600954613044929163ffffffff600160601b909104811691600160e01b900416613508565b60608301528151600a54613068919063ffffffff600160801b820481169116613508565b60808301819052606083015160408401516020850151855161308a9190613cf8565b6130949190613cf8565b61309e9190613cf8565b6130a89190613cf8565b60a08301525050565b60006130bb612f88565b83519091506130cb908290613cd9565b60c084015281156130e65760c0830151610160840152505050565b82516130f3908290613cd9565b60c08401526020830151613108908290613cd9565b60e0840152604083015161311d908290613cd9565b6101008401526060830151613133908290613cd9565b6101208401526080830151613149908290613cd9565b610140840181905261012084015161010085015160e086015160c08701516131719190613cf8565b61317b9190613cf8565b6131859190613cf8565b61318f9190613cf8565b610160840152505050565b6001600160a01b03831660009081526004602052604090205460ff16156131e9576001600160a01b038316600090815260026020526040812080548392906131e3908490613b86565b90915550505b6001600160a01b03831660009081526001602052604081208054849290613211908490613b86565b9091555050505050565b81600d546132299190613cf8565b600d8190555080600e60008282546132419190613b86565b90915550505050565b60155460ff161561329d5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610a7e565b6015805460ff1916600117905560006132b7600283613bc6565b905060006132c58284613cf8565b9050476132d183613543565b60006132dd8247613cf8565b90506132e981846136b5565b6132f38247613cf8565b601160008282546133049190613b86565b90915550613313905030611649565b61331d9086613cf8565b6010600082825461332e9190613b86565b909155505060408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff19169055505050565b600d54600b546000918291825b6005548110156134d7578260016000600584815481106133b4576133b4613d7b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061341f57508160026000600584815481106133f8576133f8613d7b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561343557600d54600b54945094505050509091565b600160006005838154811061344c5761344c613d7b565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461347b9084613cf8565b9250600260006005838154811061349457613494613d7b565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134c39083613cf8565b9150806134cf81613d4a565b915050613392565b50600b54600d546134e89190613bc6565b8210156134ff57600d54600b549350935050509091565b90939092509050565b6000606461351783600a613c2b565b61352763ffffffff861687613cd9565b6135319190613bc6565b61353b9190613bc6565b949350505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061357857613578613d7b565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156135cc57600080fd5b505afa1580156135e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136049190613832565b8160018151811061361757613617613d7b565b6001600160a01b03928316602091820292909201015260075461363d913091168461225b565b6007546001600160a01b031663791ac947836000843061365f4261ea60613b86565b6040518663ffffffff1660e01b815260040161367f959493929190613b15565b600060405180830381600087803b15801561369957600080fd5b505af11580156136ad573d6000803e3d6000fd5b505050505050565b6007546136cd9030906001600160a01b03168361225b565b6007546001600160a01b031663f305d71983308460008061dead6136f34261ea60613b86565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561375b57600080fd5b505af115801561376f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613794919061390e565b5050505050565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803563ffffffff8116811461381057600080fd5b919050565b60006020828403121561382757600080fd5b8135612b7681613d91565b60006020828403121561384457600080fd5b8151612b7681613d91565b6000806040838503121561386257600080fd5b823561386d81613d91565b9150602083013561387d81613d91565b809150509250929050565b60008060006060848603121561389d57600080fd5b83356138a881613d91565b925060208401356138b881613d91565b929592945050506040919091013590565b600080604083850312156138dc57600080fd5b82356138e781613d91565b946020939093013593505050565b60006020828403121561390757600080fd5b5035919050565b60008060006060848603121561392357600080fd5b8351925060208401519150604084015190509250925092565b6000806040838503121561394f57600080fd5b613958836137fc565b9150613966602084016137fc565b90509250929050565b60008060006060848603121561398457600080fd5b61398d846137fc565b925061399b602085016137fc565b915060408401356139ab81613d91565b809150509250925092565b600080600080608085870312156139cc57600080fd5b6139d5856137fc565b93506139e3602086016137fc565b925060408501356139f381613d91565b9396929550929360600135925050565b600060208083528351808285015260005b81811015613a3057858101830151858201604001528201613a14565b81811115613a42576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526031908201527f54617820646563696d616c73206d757374206265206c657373207468616e207460408201527037b5b2b7103232b1b4b6b0b6399016901960791b606082015260800190565b6020808252601b908201527f546178206d7573742062652067726561746572207468616e20302e0000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b655784516001600160a01b031683529383019391830191600101613b40565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613b9957613b99613d65565b500190565b600063ffffffff808316818516808303821115613bbd57613bbd613d65565b01949350505050565b600082613be357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613c23578160001904821115613c0957613c09613d65565b80851615613c1657918102915b93841c9390800290613bed565b509250929050565b6000612b7663ffffffff841683600082613c4757506001610a4e565b81613c5457506000610a4e565b8160018114613c6a5760028114613c7457613c90565b6001915050610a4e565b60ff841115613c8557613c85613d65565b50506001821b610a4e565b5060208310610133831016604e8410600b8410161715613cb3575081810a610a4e565b613cbd8383613be8565b8060001904821115613cd157613cd1613d65565b029392505050565b6000816000190483118215151615613cf357613cf3613d65565b500290565b600082821015613d0a57613d0a613d65565b500390565b600181811c90821680613d2357607f821691505b60208210811415613d4457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d5e57613d5e613d65565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146113b057600080fdfea2646970667358221220bac1949254ace4834711f98943002a7498d2fb7a5e0f72abd1af85a8d1bbb71c64736f6c63430008070033
Deployed Bytecode Sourcemap
60847:1206:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22975:90;;;;;;;;;;-1:-1:-1;23049:8:0;;-1:-1:-1;;;23049:8:0;;;;22975:90;;;20341:10:1;20329:23;;;20311:42;;20299:2;20284:18;22975:90:0;;;;;;;;21867:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27642:169::-;;;;;;;;;;-1:-1:-1;27642:169:0;;;;;:::i;:::-;;:::i;:::-;;;5055:14:1;;5048:22;5030:41;;5018:2;5003:18;27642:169:0;4890:187:1;56595:275:0;;;;;;;;;;;;;:::i;:::-;;24081:116;;;;;;;;;;-1:-1:-1;24168:21:0;;;;24081:116;;23302:96;;;;;;;;;;-1:-1:-1;23379:11:0;;-1:-1:-1;;;23379:11:0;;;;23302:96;;54570:600;;;;;;;;;;-1:-1:-1;54570:600:0;;;;;:::i;:::-;;:::i;51913:463::-;;;;;;;;;;-1:-1:-1;51913:463:0;;;;;:::i;:::-;;:::i;24800:118::-;;;;;;;;;;-1:-1:-1;24887:23:0;;-1:-1:-1;;;24887:23:0;;;;24800:118;;24469:100;;;;;;;;;;-1:-1:-1;24547:14:0;;;;;;;24469:100;;25186:110;;;;;;;;;;-1:-1:-1;25276:12:0;;25186:110;;;18569:25:1;;;18557:2;18542:18;25186:110:0;18423:177:1;24666:124:0;;;;;;;;;;-1:-1:-1;24756:26:0;;;;;;;24666:124;;28293:381;;;;;;;;;;-1:-1:-1;28293:381:0;;;;;:::i;:::-;;:::i;22623:92::-;;;;;;;;;;-1:-1:-1;22698:9:0;;-1:-1:-1;;;22698:9:0;;;;22623:92;;29083:215;;;;;;;;;;-1:-1:-1;29083:215:0;;;;;:::i;:::-;;:::i;52940:1622::-;;;;;;;;;;-1:-1:-1;52940:1622:0;;;;;:::i;:::-;;:::i;37771:91::-;;;;;;;;;;-1:-1:-1;37771:91:0;;;;;:::i;:::-;;:::i;55816:229::-;;;;;;;;;;;;;:::i;57107:385::-;;;;;;;;;;-1:-1:-1;57107:385:0;;;;;:::i;:::-;;:::i;22803:103::-;;;;;;;;;;-1:-1:-1;22884:14:0;;-1:-1:-1;;;;;22884:14:0;22803:103;;;-1:-1:-1;;;;;3646:32:1;;;3628:51;;3616:2;3601:18;22803:103:0;3482:203:1;26767:126:0;;;;;;;;;;-1:-1:-1;26767:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;26858:27:0;26834:4;26858:27;;;:18;:27;;;;;;;;;26767:126;56291:294;;;;;;;;;;;;;:::i;25803:135::-;;;;;;;;;;-1:-1:-1;25901:29:0;;25803:135;;26219:235;;;;;;;;;;-1:-1:-1;26219:235:0;;;;;:::i;:::-;;:::i;13731:94::-;;;;;;;;;;;;;:::i;55374:238::-;;;;;;;;;;;;;:::i;25425:105::-;;;;;;;;;;-1:-1:-1;25508:14:0;;25425:105;;38181:332;;;;;;;;;;-1:-1:-1;38181:332:0;;;;;:::i;:::-;;:::i;57735:455::-;;;;;;;;;;-1:-1:-1;57735:455:0;;;;;:::i;:::-;;:::i;26546:132::-;;;;;;;;;;-1:-1:-1;26546:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;26640:30:0;26616:4;26640:30;;;:21;:30;;;;;;;;;26546:132;13080:87;;;;;;;;;;-1:-1:-1;13126:7:0;13153:6;-1:-1:-1;;;;;13153:6:0;13080:87;;60237:360;;;;;;;;;;-1:-1:-1;60237:360:0;;;;;:::i;:::-;;:::i;50998:476::-;;;;;;;;;;-1:-1:-1;50998:476:0;;;;;:::i;:::-;;:::i;22077:95::-;;;;;;;;;;;;;:::i;25612:99::-;;;;;;;;;;-1:-1:-1;25692:11:0;;25612:99;;41149:653;;;;;;;;;;-1:-1:-1;41149:653:0;;;;;:::i;:::-;;:::i;24283:104::-;;;;;;;;;;-1:-1:-1;24363:16:0;;;;;;;24283:104;;29801:375;;;;;;;;;;-1:-1:-1;29801:375:0;;;;;:::i;:::-;;:::i;15785:31::-;;;;;;;;;;-1:-1:-1;15785:31:0;;;;-1:-1:-1;;;;;15785:31:0;;;59165:523;;;;;;;;;;-1:-1:-1;59165:523:0;;;;;:::i;:::-;;:::i;27106:175::-;;;;;;;;;;-1:-1:-1;27106:175:0;;;;;:::i;:::-;;:::i;59696:533::-;;;;;;;;;;-1:-1:-1;59696:533:0;;;;;:::i;:::-;;:::i;23770:110::-;;;;;;;;;;-1:-1:-1;23854:18:0;;-1:-1:-1;;;23854:18:0;;;;23770:110;;58434:470;;;;;;;;;;-1:-1:-1;58434:470:0;;;;;:::i;:::-;;:::i;23136:94::-;;;;;;;;;;-1:-1:-1;23212:10:0;;-1:-1:-1;;;23212:10:0;;;;23136:94;;27344:151;;;;;;;;;;-1:-1:-1;27344:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;27460:18:0;;;27433:7;27460:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;27344:151;23406:100;;;;;;;;;;-1:-1:-1;23485:13:0;;-1:-1:-1;;;23485:13:0;;;;23406:100;;25004:117;;;;;;;;;;-1:-1:-1;25093:20:0;;25004:117;;23961:112;;;;;;;;;;-1:-1:-1;24046:19:0;;-1:-1:-1;;;24046:19:0;;;;23961:112;;13980:192;;;;;;;;;;-1:-1:-1;13980:192:0;;;;;:::i;:::-;;:::i;26027:129::-;;;;;;;;;;-1:-1:-1;26122:26:0;;26027:129;;23584:106;;;;;;;;;;-1:-1:-1;23666:16:0;;-1:-1:-1;;;23666:16:0;;;;23584:106;;21867:91;21912:13;21945:5;21938:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21867:91;:::o;27642:169::-;27725:4;27742:39;11948:10;27765:7;27774:6;27742:8;:39::i;:::-;-1:-1:-1;27799:4:0;27642:169;;;;;:::o;56595:275::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;;;;;;;;;56662:23:::1;::::0;-1:-1:-1;;;56662:23:0;::::1;;;56654:81;;;::::0;-1:-1:-1;;;56654:81:0;;11727:2:1;56654:81:0::1;::::0;::::1;11709:21:1::0;11766:2;11746:18;;;11739:30;11805:34;11785:18;;;11778:62;-1:-1:-1;;;11856:18:1;;;11849:43;11909:19;;56654:81:0::1;11525:409:1::0;56654:81:0::1;56748:21;56764:1;56767::::0;56748:15:::1;:21::i;:::-;56780:23;:31:::0;;-1:-1:-1;;56780:31:0::1;::::0;;56837:25:::1;::::0;::::1;::::0;56806:5:::1;::::0;56837:25:::1;56595:275::o:0;54570:600::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;54714:23:::1;::::0;-1:-1:-1;;;54714:23:0;::::1;;;54713:24;54705:78;;;::::0;-1:-1:-1;;;54705:78:0;;16107:2:1;54705:78:0::1;::::0;::::1;16089:21:1::0;16146:2;16126:18;;;16119:30;16185:34;16165:18;;;16158:62;-1:-1:-1;;;16236:18:1;;;16229:39;16285:19;;54705:78:0::1;15905:405:1::0;54705:78:0::1;54818:1;54802:13;:17;;;54794:57;;;;-1:-1:-1::0;;;54794:57:0::1;;;;;;;:::i;:::-;22698:9:::0;;-1:-1:-1;;;22698:9:0;;;;54870:25:::1;:21:::0;54894:1:::1;54870:25;:::i;:::-;:40;;;;54862:102;;;;-1:-1:-1::0;;;54862:102:0::1;;;;;;;:::i;:::-;54977:23;:30:::0;;-1:-1:-1;;54977:30:0::1;-1:-1:-1::0;;;54977:30:0::1;::::0;;55018:53:::1;55034:13:::0;55049:21;55018:15:::1;:53::i;:::-;55082:38;55102:17;55082:19;:38::i;:::-;55138:24;::::0;::::1;::::0;;;::::1;54570:600:::0;;;:::o;51913:463::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;52018:14:::1;::::0;;;::::1;;;52017:15;52009:62;;;::::0;-1:-1:-1;;;52009:62:0;;17816:2:1;52009:62:0::1;::::0;::::1;17798:21:1::0;17855:2;17835:18;;;17828:30;17894:34;17874:18;;;17867:62;-1:-1:-1;;;17945:18:1;;;17938:32;17987:19;;52009:62:0::1;17614:398:1::0;52009:62:0::1;52103:1;52090:10;:14;;;52082:54;;;;-1:-1:-1::0;;;52082:54:0::1;;;;;;;:::i;:::-;22698:9:::0;;-1:-1:-1;;;22698:9:0;;;;52155:22:::1;:18:::0;52176:1:::1;52155:22;:::i;:::-;:37;;;;52147:99;;;;-1:-1:-1::0;;;52147:99:0::1;;;;;;;:::i;:::-;52259:14;:21:::0;;-1:-1:-1;;52259:21:0::1;::::0;::::1;::::0;;52291:44:::1;52304:10:::0;52316:18;52291:12:::1;:44::i;:::-;52353:15;::::0;::::1;::::0;;;::::1;51913:463:::0;;:::o;28293:381::-;28399:4;28416:36;28426:6;28434:9;28445:6;28416:9;:36::i;:::-;-1:-1:-1;;;;;28471:19:0;;;;;;:11;:19;;;;;;;;11948:10;28471:33;;;;;;;;:43;-1:-1:-1;28471:43:0;28463:96;;;;-1:-1:-1;;;28463:96:0;;13274:2:1;28463:96:0;;;13256:21:1;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:38;13451:19;;28463:96:0;13072:404:1;28463:96:0;-1:-1:-1;;;;;28601:19:0;;;;;;:11;:19;;;;;;;;11948:10;28601:33;;;;;;;;;28570:74;;28579:6;;28601:42;;28637:6;;28601:42;:::i;:::-;28570:8;:74::i;:::-;-1:-1:-1;28662:4:0;28293:381;;;;;:::o;29083:215::-;11948:10;29171:4;29220:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29220:34:0;;;;;;;;;;29171:4;;29188:80;;29211:7;;29220:47;;29257:10;;29220:47;:::i;52940:1622::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;53112:26:::1;::::0;::::1;::::0;::::1;;;53111:27;53103:89;;;::::0;-1:-1:-1;;;53103:89:0;;10072:2:1;53103:89:0::1;::::0;::::1;10054:21:1::0;10111:2;10091:18;;;10084:30;10150:34;10130:18;;;10123:62;-1:-1:-1;;;10201:18:1;;;10194:47;10258:19;;53103:89:0::1;9870:413:1::0;53103:89:0::1;53225:1;53211:11;:15;;;53203:55;;;;-1:-1:-1::0;;;53203:55:0::1;;;;;;;:::i;:::-;22698:9:::0;;-1:-1:-1;;;22698:9:0;;;;53277:23:::1;:19:::0;53299:1:::1;53277:23;:::i;:::-;:38;;;;53269:100;;;;-1:-1:-1::0;;;53269:100:0::1;;;;;;;:::i;:::-;53405:20;53382;:43;;;;53462:34;53518:13;53462:70;;53580:15;-1:-1:-1::0;;;;;53580:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53562:52:0::1;;53623:4;53630:15;-1:-1:-1::0;;;;;53630:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53562:91;::::0;-1:-1:-1;;;;;;53562:91:0::1;::::0;;;;;;-1:-1:-1;;;;;3920:15:1;;;53562:91:0::1;::::0;::::1;3902:34:1::0;3972:15;;3952:18;;;3945:43;3837:18;;53562:91:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53545:14;:108:::0;;-1:-1:-1;;;;;;53545:108:0::1;-1:-1:-1::0;;;;;53545:108:0;;;::::1;::::0;;::::1;::::0;;53666:190:::1;;53750:15;-1:-1:-1::0;;;;;53750:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53732:73:0::1;;53814:4;53821:15;-1:-1:-1::0;;;;;53821:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53732:112;::::0;-1:-1:-1;;;;;;53732:112:0::1;::::0;;;;;;-1:-1:-1;;;;;3920:15:1;;;53732:112:0::1;::::0;::::1;3902:34:1::0;3972:15;;3952:18;;;3945:43;3837:18;;53732:112:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53715:14;:129:::0;;-1:-1:-1;;;;;;53715:129:0::1;-1:-1:-1::0;;;;;53715:129:0;;;::::1;::::0;;;::::1;::::0;;53666:190:::1;53876:16;:34:::0;;-1:-1:-1;;;;;;53876:34:0::1;-1:-1:-1::0;;;;;53876:34:0;::::1;;::::0;;53982:51:::1;53876:34:::0;53982:25:::1;:51::i;:::-;54138:14;::::0;54112:41:::1;::::0;-1:-1:-1;;;;;54138:14:0::1;54112:25;:41::i;:::-;54220:47;54250:15;54220:21;:47::i;:::-;54363:14;::::0;54341:37:::1;::::0;-1:-1:-1;;;;;54363:14:0::1;54341:21;:37::i;:::-;54410:26;:33:::0;;-1:-1:-1;;54410:33:0::1;;;::::0;;54454:47:::1;54468:11:::0;54481:19;54454:13:::1;:47::i;:::-;54527:27;::::0;::::1;::::0;;;::::1;53092:1470;52940:1622:::0;;;;:::o;37771:91::-;37827:27;11948:10;37847:6;37827:5;:27::i;:::-;37771:91;:::o;55816:229::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;55877:14:::1;::::0;;;::::1;;;55869:62;;;::::0;-1:-1:-1;;;55869:62:0;;11323:2:1;55869:62:0::1;::::0;::::1;11305:21:1::0;11362:2;11342:18;;;11335:30;11401:34;11381:18;;;11374:62;-1:-1:-1;;;11452:18:1;;;11445:33;11495:19;;55869:62:0::1;11121:399:1::0;55869:62:0::1;55944:18;55957:1;55960::::0;55944:12:::1;:18::i;:::-;55973:14;:22:::0;;-1:-1:-1;;55973:22:0::1;::::0;;56021:16:::1;::::0;::::1;::::0;55990:5:::1;::::0;56021:16:::1;55816:229::o:0;57107:385::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;57228:14:::1;;57205:20;:37;57197:105;;;::::0;-1:-1:-1;;;57197:105:0;;9240:2:1;57197:105:0::1;::::0;::::1;9222:21:1::0;9279:2;9259:18;;;9252:30;9318:34;9298:18;;;9291:62;9389:25;9369:18;;;9362:53;9432:19;;57197:105:0::1;9038:419:1::0;57197:105:0::1;57334:20;::::0;;57365:43;;;;57426:58:::1;::::0;;19764:25:1;;;19820:2;19805:18;;19798:34;;;57426:58:0::1;::::0;19737:18:1;57426:58:0::1;;;;;;;;57186:306;57107:385:::0;:::o;56291:294::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;56364:26:::1;::::0;::::1;::::0;::::1;;;56356:89;;;::::0;-1:-1:-1;;;56356:89:0;;14044:2:1;56356:89:0::1;::::0;::::1;14026:21:1::0;14083:2;14063:18;;;14056:30;14122:34;14102:18;;;14095:62;-1:-1:-1;;;14173:18:1;;;14166:48;14231:19;;56356:89:0::1;13842:414:1::0;56356:89:0::1;56458:19;56472:1;56475::::0;56458:13:::1;:19::i;:::-;56488:26;:34:::0;;-1:-1:-1;;56488:34:0::1;::::0;;56549:28:::1;::::0;::::1;::::0;56517:5:::1;::::0;56549:28:::1;56291:294::o:0;26219:235::-;-1:-1:-1;;;;;26317:30:0;;26293:7;26317:30;;;:21;:30;;;;;;;;26313:66;;;-1:-1:-1;;;;;;26356:23:0;;;;;:14;:23;;;;;;;26219:235::o;26313:66::-;-1:-1:-1;;;;;26417:28:0;;;;;;:19;:28;;;;;;26397:49;;:19;:49::i;13731:94::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;13796:21:::1;13814:1;13796:9;:21::i;:::-;13731:94::o:0;55374:238::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;55437:16:::1;::::0;;;::::1;;;55429:67;;;::::0;-1:-1:-1;;;55429:67:0;;16517:2:1;55429:67:0::1;::::0;::::1;16499:21:1::0;16556:2;16536:18;;;16529:30;16595:34;16575:18;;;16568:62;-1:-1:-1;;;16646:18:1;;;16639:36;16692:19;;55429:67:0::1;16315:402:1::0;55429:67:0::1;55509:16;55520:1;55523::::0;55509:10:::1;:16::i;:::-;55536;:24:::0;;-1:-1:-1;;55536:24:0::1;::::0;;55586:18:::1;::::0;::::1;::::0;55555:5:::1;::::0;55586:18:::1;55374:238::o:0;38181:332::-;38258:24;38285:32;38295:7;11948:10;27344:151;:::i;38285:32::-;38258:59;;38356:6;38336:16;:26;;38328:75;;;;-1:-1:-1;;;38328:75:0;;15296:2:1;38328:75:0;;;15278:21:1;15335:2;15315:18;;;15308:30;15374:34;15354:18;;;15347:62;-1:-1:-1;;;15425:18:1;;;15418:34;15469:19;;38328:75:0;15094:400:1;38328:75:0;38414:58;38423:7;11948:10;38446:25;38465:6;38446:16;:25;:::i;38414:58::-;38483:22;38489:7;38498:6;38483:5;:22::i;:::-;38247:266;38181:332;;:::o;57735:455::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;57833:16:::1;::::0;;;::::1;;;57825:96;;;::::0;-1:-1:-1;;;57825:96:0;;10847:2:1;57825:96:0::1;::::0;::::1;10829:21:1::0;10886:2;10866:18;;;10859:30;10925:34;10905:18;;;10898:62;10996:34;10976:18;;;10969:62;-1:-1:-1;;;11047:19:1;;;11040:34;11091:19;;57825:96:0::1;10645:471:1::0;57825:96:0::1;57955:8;::::0;;58000:16:::1;::::0;;57955:8:::1;58027:19:::0;;::::1;-1:-1:-1::0;;;58027:19:0;;::::1;-1:-1:-1::0;;58027:19:0;::::1;;::::0;;;58057:35;;::::1;-1:-1:-1::0;;;58057:35:0;;::::1;-1:-1:-1::0;;;;58057:35:0;::::1;;::::0;;;58110:72:::1;::::0;;57955:8;;;::::1;::::0;::::1;20616:34:1::0;;;58000:16:0;;;::::1;::::0;;::::1;20681:2:1::0;20666:18;;20659:43;;;20718:18;;;20711:43;20785:2;20770:18;;20763:43;57955:8:0;58110:72:::1;::::0;20574:3:1;20559:19;58110:72:0::1;;;;;;;;57814:376;;57735:455:::0;;:::o;60237:360::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;60329:16:::1;::::0;-1:-1:-1;;;;;60329:37:0;;::::1;:16:::0;::::1;:37;;60321:103;;;::::0;-1:-1:-1;;;60321:103:0;;8818:2:1;60321:103:0::1;::::0;::::1;8800:21:1::0;8857:2;8837:18;;;8830:30;8896:34;8876:18;;;8869:62;-1:-1:-1;;;8947:18:1;;;8940:51;9008:19;;60321:103:0::1;8616:417:1::0;60321:103:0::1;60456:16;::::0;;-1:-1:-1;;;;;60483:36:0;;::::1;-1:-1:-1::0;;;;;;60483:36:0;::::1;::::0;::::1;::::0;;;60537:52:::1;::::0;;60456:16;;;::::1;3902:34:1::0;;;3967:2;3952:18;;3945:43;;;;60537:52:0::1;::::0;3837:18:1;60537:52:0::1;3690:304:1::0;50998:476:0;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;51101:16:::1;::::0;;;::::1;;;51100:17;51092:67;;;::::0;-1:-1:-1;;;51092:67:0;;7191:2:1;51092:67:0::1;::::0;::::1;7173:21:1::0;7230:2;7210:18;;;7203:30;7269:34;7249:18;;;7242:62;-1:-1:-1;;;7320:18:1;;;7313:35;7365:19;;51092:67:0::1;6989:401:1::0;51092:67:0::1;51189:1;51178:8;:12;;;51170:52;;;;-1:-1:-1::0;;;51170:52:0::1;;;;;;;:::i;:::-;22698:9:::0;;-1:-1:-1;;;22698:9:0;;;;51241:20:::1;:16:::0;51260:1:::1;51241:20;:::i;:::-;:35;;;;51233:97;;;;-1:-1:-1::0;;;51233:97:0::1;;;;;;;:::i;:::-;51351:16;:23:::0;;-1:-1:-1;;51351:23:0::1;::::0;::::1;::::0;;51385:38:::1;51396:8:::0;51406:16;51385:10:::1;:38::i;:::-;51449:17;::::0;::::1;::::0;;;::::1;50998:476:::0;;:::o;22077:95::-;22124:13;22157:7;22150:14;;;;;:::i;41149:653::-;11948:10;41369:6;41348:17;11948:10;41348:9;:17::i;:::-;:27;;41340:79;;;;-1:-1:-1;;;41340:79:0;;9664:2:1;41340:79:0;;;9646:21:1;9703:2;9683:18;;;9676:30;9742:34;9722:18;;;9715:62;-1:-1:-1;;;9793:18:1;;;9786:37;9840:19;;41340:79:0;9462:403:1;41340:79:0;41430:30;41463:25;41474:6;41482:5;41463:10;:25::i;:::-;-1:-1:-1;;;;;41503:29:0;;;;;;:21;:29;;;;;;41430:58;;-1:-1:-1;41503:29:0;;41499:101;;;41575:13;;-1:-1:-1;;;;;41549:22:0;;41575:13;41549:22;;;:14;:22;;;;;:39;;:22;;41575:13;41549:39;;41575:13;;41549:39;:::i;:::-;;;;-1:-1:-1;;41499:101:0;41641:14;;;;-1:-1:-1;;;;;41610:27:0;;;;;;:19;:27;;;;;:45;;:27;;;:45;;41641:14;;41610:45;:::i;:::-;;;;-1:-1:-1;;41714:14:0;;;;41695:16;;:33;;41714:14;41695:33;:::i;:::-;41676:16;:52;;;;41757:6;41739:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;41779:15:0;;18569:25:1;;;41779:15:0;;18557:2:1;18542:18;41779:15:0;;;;;;;41189:613;;41149:653;:::o;29801:375::-;11948:10;29894:4;29938:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29938:34:0;;;;;;;;;;29991:35;;;;29983:85;;;;-1:-1:-1;;;29983:85:0;;18219:2:1;29983:85:0;;;18201:21:1;18258:2;18238:18;;;18231:30;18297:34;18277:18;;;18270:62;-1:-1:-1;;;18348:18:1;;;18341:35;18393:19;;29983:85:0;18017:401:1;29983:85:0;30079:67;11948:10;30102:7;30111:34;30130:15;30111:16;:34;:::i;59165:523::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;59272:26:::1;::::0;::::1;::::0;::::1;;;59264:128;;;::::0;-1:-1:-1;;;59264:128:0;;6693:2:1;59264:128:0::1;::::0;::::1;6675:21:1::0;6732:2;6712:18;;;6705:30;6771:34;6751:18;;;6744:62;6842:34;6822:18;;;6815:62;6914:27;6893:19;;;6886:56;6959:19;;59264:128:0::1;6491:493:1::0;59264:128:0::1;59426:11;::::0;;59474:19:::1;::::0;;59426:11:::1;59504:25:::0;;::::1;-1:-1:-1::0;;;59504:25:0;;::::1;-1:-1:-1::0;;;;59504:25:0;::::1;;::::0;;;59540:41;;::::1;-1:-1:-1::0;;;59540:41:0;;::::1;-1:-1:-1::0;;;;;59540:41:0;::::1;;::::0;;;59599:81:::1;::::0;;59426:11;;;::::1;::::0;::::1;20616:34:1::0;;;59474:19:0;;;::::1;::::0;;::::1;20681:2:1::0;20666:18;;20659:43;;;20718:18;;;20711:43;20785:2;20770:18;;20763:43;59426:11:0;59599:81:::1;::::0;20574:3:1;20559:19;59599:81:0::1;20364:448:1::0;27106:175:0;27192:4;27209:42;11948:10;27233:9;27244:6;27209:9;:42::i;59696:533::-;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;59809:23:::1;::::0;-1:-1:-1;;;59809:23:0;::::1;;;59801:114;;;::::0;-1:-1:-1;;;59801:114:0;;16924:2:1;59801:114:0::1;::::0;::::1;16906:21:1::0;16963:2;16943:18;;;16936:30;17002:34;16982:18;;;16975:62;17073:34;17053:18;;;17046:62;-1:-1:-1;;;17124:19:1;;;17117:45;17179:19;;59801:114:0::1;16722:482:1::0;59801:114:0::1;59949:13;::::0;;::::1;60071:45:::0;;::::1;-1:-1:-1::0;;60031:29:0;;::::1;-1:-1:-1::0;;;60031:29:0;;::::1;60071:45:::0;;;;-1:-1:-1;;60071:45:0;;;;::::1;::::0;;;60134:87:::1;::::0;;59949:13;;::::1;::::0;::::1;20616:34:1::0;;;59999:21:0;;;::::1;20681:2:1::0;20666:18;;20659:43;;;20718:18;;;20711:43;;;;20785:2;20770:18;;20763:43;59949:13:0;60134:87:::1;::::0;20574:3:1;20559:19;60134:87:0::1;20364:448:1::0;58434:470:0;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;58538:14:::1;::::0;;;::::1;;;58530:89;;;::::0;-1:-1:-1;;;58530:89:0;;14463:2:1;58530:89:0::1;::::0;::::1;14445:21:1::0;14502:2;14482:18;;;14475:30;14541:34;14521:18;;;14514:62;14612:32;14592:18;;;14585:60;14662:19;;58530:89:0::1;14261:426:1::0;58530:89:0::1;58653:10;::::0;;58700:18:::1;::::0;;58653:10:::1;58729:23:::0;;::::1;-1:-1:-1::0;;;58729:23:0;;::::1;-1:-1:-1::0;;58729:23:0;::::1;;::::0;;;58763:37;;::::1;-1:-1:-1::0;;;58763:37:0;::::1;-1:-1:-1::0;;;;58763:37:0;::::1;;::::0;;;58818:78:::1;::::0;;58653:10;;;::::1;::::0;::::1;20616:34:1::0;;;-1:-1:-1;;;58700:18:0;;::::1;::::0;;::::1;20681:2:1::0;20666:18;;20659:43;;;20718:18;;;20711:43;20785:2;20770:18;;20763:43;;;;58653:10:0;58818:78:::1;::::0;20574:3:1;20559:19;58818:78:0::1;20364:448:1::0;13980:192:0;13126:7;13153:6;-1:-1:-1;;;;;13153:6:0;11948:10;13300:23;13292:68;;;;-1:-1:-1;;;13292:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14069:22:0;::::1;14061:73;;;::::0;-1:-1:-1;;;14061:73:0;;8008:2:1;14061:73:0::1;::::0;::::1;7990:21:1::0;8047:2;8027:18;;;8020:30;8086:34;8066:18;;;8059:62;-1:-1:-1;;;8137:18:1;;;8130:36;8183:19;;14061:73:0::1;7806:402:1::0;14061:73:0::1;14145:19;14155:8;14145:9;:19::i;31831:346::-:0;-1:-1:-1;;;;;31933:19:0;;31925:68;;;;-1:-1:-1;;;31925:68:0;;17411:2:1;31925:68:0;;;17393:21:1;17450:2;17430:18;;;17423:30;17489:34;17469:18;;;17462:62;-1:-1:-1;;;17540:18:1;;;17533:34;17584:19;;31925:68:0;17209:400:1;31925:68:0;-1:-1:-1;;;;;32012:21:0;;32004:68;;;;-1:-1:-1;;;32004:68:0;;8415:2:1;32004:68:0;;;8397:21:1;8454:2;8434:18;;;8427:30;8493:34;8473:18;;;8466:62;-1:-1:-1;;;8544:18:1;;;8537:32;8586:19;;32004:68:0;8213:398:1;32004:68:0;-1:-1:-1;;;;;32085:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32137:32;;18569:25:1;;;32137:32:0;;18542:18:1;32137:32:0;;;;;;;31831:346;;;:::o;32667:1217::-;-1:-1:-1;;;;;32773:20:0;;32765:70;;;;-1:-1:-1;;;32765:70:0;;15701:2:1;32765:70:0;;;15683:21:1;15740:2;15720:18;;;15713:30;15779:34;15759:18;;;15752:62;-1:-1:-1;;;15830:18:1;;;15823:35;15875:19;;32765:70:0;15499:401:1;32765:70:0;-1:-1:-1;;;;;32854:23:0;;32846:71;;;;-1:-1:-1;;;32846:71:0;;5886:2:1;32846:71:0;;;5868:21:1;5925:2;5905:18;;;5898:30;5964:34;5944:18;;;5937:62;-1:-1:-1;;;6015:18:1;;;6008:33;6058:19;;32846:71:0;5684:399:1;32846:71:0;-1:-1:-1;;;;;32982:26:0;;32930:30;32982:26;;;:18;:26;;;;;;32963:46;;32974:6;;32982:26;;32963:10;:46::i;:::-;-1:-1:-1;;;;;33034:29:0;;;;;;:21;:29;;;;;;32930:79;;-1:-1:-1;33034:29:0;;:66;;;;-1:-1:-1;;;;;;33068:32:0;;;;;;:21;:32;;;;;;;;33067:33;33034:66;33030:677;;;33117:48;33139:6;33147:9;33158:6;33117:21;:48::i;:::-;33030:677;;;-1:-1:-1;;;;;33188:29:0;;;;;;:21;:29;;;;;;;;33187:30;:66;;;;-1:-1:-1;;;;;;33221:32:0;;;;;;:21;:32;;;;;;;;33187:66;33183:524;;;33270:46;33290:6;33298:9;33309:6;33270:19;:46::i;33183:524::-;-1:-1:-1;;;;;33339:29:0;;;;;;:21;:29;;;;;;;;33338:30;:67;;;;-1:-1:-1;;;;;;33373:32:0;;;;;;:21;:32;;;;;;;;33372:33;33338:67;33334:373;;;33422:44;33440:6;33448:9;33459:6;33422:17;:44::i;33334:373::-;-1:-1:-1;;;;;33488:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;33521:32:0;;;;;;:21;:32;;;;;;;;33488:65;33484:223;;;33570:48;33592:6;33600:9;33611:6;33570:21;:48::i;33484:223::-;33651:44;33669:6;33677:9;33688:6;33651:17;:44::i;:::-;33741:9;-1:-1:-1;;;;;33724:51:0;33733:6;-1:-1:-1;;;;;33724:51:0;;33752:6;:22;;;33724:51;;;;18569:25:1;;18557:2;18542:18;;18423:177;33724:51:0;;;;;;;;-1:-1:-1;;;;;33793:26:0;;;;;;:18;:26;;;;;;;;33788:87;;33836:27;33856:6;33836:19;:27::i;:::-;32754:1130;32667:1217;;;:::o;38752:454::-;-1:-1:-1;;;;;38833:30:0;;;;;;:21;:30;;;;;;;;38832:31;38824:72;;;;-1:-1:-1;;;38824:72:0;;10490:2:1;38824:72:0;;;10472:21:1;10529:2;10509:18;;;10502:30;10568;10548:18;;;10541:58;10616:18;;38824:72:0;10288:352:1;38824:72:0;-1:-1:-1;;;;;38912:28:0;;38943:1;38912:28;;;:19;:28;;;;;;:32;38909:139;;-1:-1:-1;;;;;39007:28:0;;;;;;:19;:28;;;;;;38987:49;;:19;:49::i;:::-;-1:-1:-1;;;;;38961:23:0;;;;;;:14;:23;;;;;:75;38909:139;-1:-1:-1;;;;;39058:30:0;;;;;;:21;:30;;;;;;;;:37;;-1:-1:-1;;39058:37:0;39091:4;39058:37;;;;;;39106:19;:33;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39106:33:0;;;;;39165;;3628:51:1;;;39165:33:0;;3601:18:1;39165:33:0;;;;;;;;38752:454;:::o;40268:240::-;-1:-1:-1;;;;;40345:27:0;;;;;;:18;:27;;;;;;;;40344:28;40336:69;;;;-1:-1:-1;;;40336:69:0;;10490:2:1;40336:69:0;;;10472:21:1;10529:2;10509:18;;;10502:30;10568;10548:18;;;10541:58;10616:18;;40336:69:0;10288:352:1;40336:69:0;-1:-1:-1;;;;;40418:27:0;;;;;;:18;:27;;;;;;;;;:34;;-1:-1:-1;;40418:34:0;40448:4;40418:34;;;40470:30;;3628:51:1;;;40470:30:0;;3601:18:1;40470:30:0;3482:203:1;30567:820:0;-1:-1:-1;;;;;30651:22:0;;15734:42;30651:22;;30643:68;;;;-1:-1:-1;;;30643:68:0;;14894:2:1;30643:68:0;;;14876:21:1;14933:2;14913:18;;;14906:30;14972:34;14952:18;;;14945:62;-1:-1:-1;;;15023:18:1;;;15016:31;15064:19;;30643:68:0;14692:397:1;30643:68:0;30724:22;30749:18;30759:7;30749:9;:18::i;:::-;30724:43;;30804:6;30786:14;:24;;30778:71;;;;-1:-1:-1;;;30778:71:0;;6290:2:1;30778:71:0;;;6272:21:1;6329:2;6309:18;;;6302:30;6368:34;6348:18;;;6341:62;-1:-1:-1;;;6419:18:1;;;6412:32;6461:19;;30778:71:0;6088:398:1;30778:71:0;30862:15;30880:19;30892:6;30880:11;:19::i;:::-;-1:-1:-1;;;;;30969:30:0;;;;;;:21;:30;;;;;;30862:37;;-1:-1:-1;30969:30:0;;30965:96;;;-1:-1:-1;;;;;31016:23:0;;;;;;:14;:23;;;;;:33;;31043:6;;31016:23;:33;;31043:6;;31016:33;:::i;:::-;;;;-1:-1:-1;;30965:96:0;-1:-1:-1;;;;;31072:28:0;;;;;;:19;:28;;;;;:39;;31104:7;;31072:28;:39;;31104:7;;31072:39;:::i;:::-;;;;-1:-1:-1;;15734:42:0;31124:27;;;;:14;:27;;;:37;;31155:6;;31124:27;:37;;31155:6;;31124:37;:::i;:::-;;;;-1:-1:-1;;15734:42:0;31172:32;;;;:19;:32;;;:43;;31208:7;;31172:32;:43;;31208:7;;31172:43;:::i;:::-;;;;;;;;31246:6;31228:14;;:24;;;;;;;:::i;:::-;;;;;;;;31280:6;31265:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;31304:21:0;;;-1:-1:-1;;;;;4191:32:1;;4173:51;;4255:2;4240:18;;4233:34;;;31304:21:0;;4146:18:1;31304:21:0;;;;;;;31341:38;;18569:25:1;;;15734:42:0;;-1:-1:-1;;;;;31341:38:0;;;;;18557:2:1;18542:18;31341:38:0;;;;;;;30632:755;;30567:820;;:::o;42424:261::-;42492:7;42531:16;;42520:7;:27;;42512:82;;;;-1:-1:-1;;;42512:82:0;;7597:2:1;42512:82:0;;;7579:21:1;7636:2;7616:18;;;7609:30;7675:34;7655:18;;;7648:62;-1:-1:-1;;;7726:18:1;;;7719:40;7776:19;;42512:82:0;7395:406:1;42512:82:0;42605:19;42628:10;:8;:10::i;:::-;42605:33;-1:-1:-1;42656:21:0;42605:33;42656:7;:21;:::i;:::-;42649:28;42424:261;-1:-1:-1;;;42424:261:0:o;14180:173::-;14236:16;14255:6;;-1:-1:-1;;;;;14272:17:0;;;-1:-1:-1;;;;;;14272:17:0;;;;;;14305:40;;14255:6;;;;;;;14305:40;;14236:16;14305:40;14225:128;14180:173;:::o;46657:311::-;46739:23;;:::i;:::-;46775:30;;:::i;:::-;46816:22;;;46849:38;46816:6;46869:17;46849:11;:38::i;:::-;46898;46910:6;46918:17;46898:11;:38::i;36696:387::-;36873:13;;-1:-1:-1;;;;;36848:22:0;;36873:13;36848:22;;;:14;:22;;;;;;:38;;36873:13;36848:38;:::i;:::-;-1:-1:-1;;;;;36823:22:0;;;;;;:14;:22;;;;;;;;:63;;;;36957:14;;;;36927:19;:27;;;;;;;:44;;36957:14;36927:44;:::i;:::-;-1:-1:-1;;;;;36897:27:0;;;;;;;:19;:27;;;;;;:74;;;;37048:22;;;;37015:30;;;;;;;;;;:55;;37048:22;37015:55;:::i;:::-;-1:-1:-1;;;;;36982:30:0;;;;;;;:19;:30;;;;;:88;;;;-1:-1:-1;;36696:387:0:o;36134:401::-;36319:14;;;;-1:-1:-1;;;;;36289:27:0;;;;;;:19;:27;;;;;;:44;;36319:14;36289:44;:::i;:::-;-1:-1:-1;;;;;36259:27:0;;;;;;;:19;:27;;;;;;;;:74;;;;36400:22;;;;36372:25;;;;;:14;:25;;;;;;;:50;;36400:22;36372:50;:::i;:::-;-1:-1:-1;;;;;36344:25:0;;;;;;:14;:25;;;;;;;;:78;;;;36499:22;;;;36466:19;:30;;;;;;;:55;;36499:22;36466:55;:::i;35648:325::-;35837:14;;;;-1:-1:-1;;;;;35807:27:0;;;;;;:19;:27;;;;;;:44;;35837:14;35807:44;:::i;37205:473::-;37374:13;;-1:-1:-1;;;;;37349:22:0;;37374:13;37349:22;;;:14;:22;;;;;;:38;;37374:13;37349:38;:::i;:::-;-1:-1:-1;;;;;37324:22:0;;;;;;:14;:22;;;;;;;;:63;;;;37458:14;;;;37428:19;:27;;;;;;;:44;;37458:14;37428:44;:::i;33976:1550::-;34086:16;;;;;;;34082:289;;;34152:15;;;;;34142:4;34119:29;;;;:14;:29;;;;;;:48;;34152:15;;34119:29;;:48;;34152:15;;34119:48;:::i;:::-;;;;-1:-1:-1;;34220:15:0;;;;34210:4;34182:34;;;;:19;:34;;;;;:53;;:34;;;:53;;34220:15;;34182:53;:::i;:::-;;;;-1:-1:-1;34250:54:0;;-1:-1:-1;34267:4:0;11948:10;34288:6;:15;;;34250:8;:54::i;:::-;34319:40;34336:4;34343:6;:15;;;34319:8;:40::i;:::-;34427:23;;-1:-1:-1;;;34427:23:0;;;;34423:134;;;34484:16;;34502:20;;;;34524;;;;34467:78;;-1:-1:-1;;;;;34484:16:0;;34502:20;34467:16;:78::i;:::-;34593:14;;;;;;;34589:99;;;34624:52;34639:6;:17;;;34658:6;:17;;;34624:14;:52::i;:::-;34746:26;;;;;;;34742:767;;;34874:18;;;;34864:4;34841:29;;;;:14;:29;;;;;:51;;:29;;;:51;;34874:18;;34841:51;:::i;:::-;;;;-1:-1:-1;;34945:18:0;;;;34935:4;34907:34;;;;:19;:34;;;;;:56;;:34;;;:56;;34945:18;;34907:56;:::i;:::-;;;;-1:-1:-1;;35029:4:0;34980:23;35006:29;;;:14;:29;;;;;;35197:20;;35178:39;;;;;;;35238:62;;-1:-1:-1;35283:17:0;;;;35282:18;35238:62;:113;;;;-1:-1:-1;35337:14:0;;-1:-1:-1;;;;;35337:14:0;11948:10;-1:-1:-1;;;;;35321:30:0;;;35238:113;:160;;;;-1:-1:-1;35372:26:0;;;;;;;35238:160;35234:264;;;35451:31;35466:15;35451:14;:31::i;49072:157::-;49131:7;49151:19;49173:10;:8;:10::i;:::-;49151:32;-1:-1:-1;49201:20:0;49151:32;49201:6;:20;:::i;49305:160::-;49346:7;49367:15;49384;49403:19;:17;:19::i;:::-;49366:56;;-1:-1:-1;49366:56:0;-1:-1:-1;49440:17:0;49366:56;;49440:17;:::i;:::-;49433:24;;;;49305:160;:::o;47169:832::-;47284:17;47280:704;;;47343:13;;47318:22;;;:38;47169:832;;:::o;47280:704::-;47451:13;;47466:8;;47476:16;;47437:56;;47451:13;47466:8;-1:-1:-1;;;47466:8:0;;;;;;-1:-1:-1;;;47476:16:0;;;47437:13;:56::i;:::-;47419:15;;;:74;47542:13;;47557:10;;47569:18;;47528:60;;47542:13;47557:10;-1:-1:-1;;;47557:10:0;;;;;;-1:-1:-1;;;47569:18:0;;;47528:13;:60::i;:::-;47508:17;;;:80;47638:13;;47653:11;;47666:19;;47624:62;;47638:13;47653:11;-1:-1:-1;;;47653:11:0;;;;;;-1:-1:-1;;;47666:19:0;;;47624:13;:62::i;:::-;47603:18;;;:83;47738:13;;47753;;47724:66;;47738:13;47753;-1:-1:-1;;;47753:13:0;;;;;47768:21;47724:13;:66::i;:::-;47701:20;;;:89;;;47931:18;;;;47911:17;;;;47893:15;;;;47877:13;;:31;;47893:15;47877:31;:::i;:::-;:51;;;;:::i;:::-;:72;;;;:::i;:::-;:95;;;;:::i;:::-;47852:22;;;:120;47169:832;;:::o;48211:790::-;48312:19;48334:10;:8;:10::i;:::-;48374:13;;48312:32;;-1:-1:-1;48374:27:0;;48312:32;;48374:27;:::i;:::-;48357:14;;;:44;48414:570;;;;48477:14;;;;48452:22;;;:39;38247:266;38181:332;;:::o;48414:570::-;48541:13;;:27;;48557:11;;48541:27;:::i;:::-;48524:14;;;:44;48601:15;;;;:29;;48619:11;;48601:29;:::i;:::-;48583:15;;;:47;48665:17;;;;:31;;48685:11;;48665:31;:::i;:::-;48645:17;;;:51;48732:18;;;;:32;;48753:11;;48732:32;:::i;:::-;48711:18;;;:53;48802:20;;;;:34;;48825:11;;48802:34;:::i;:::-;48779:20;;;:57;;;48931:18;;;;48911:17;;;;48893:15;;;;48876:14;;;;:32;;48893:15;48876:32;:::i;:::-;:52;;;;:::i;:::-;:73;;;;:::i;:::-;:96;;;;:::i;:::-;48851:22;;;:121;48301:700;48211:790;;:::o;60605:235::-;-1:-1:-1;;;;;60705:28:0;;;;;;:21;:28;;;;;;;;60701:80;;;-1:-1:-1;;;;;60748:21:0;;;;;;:14;:21;;;;;:33;;60773:8;;60748:21;:33;;60773:8;;60748:33;:::i;:::-;;;;-1:-1:-1;;60701:80:0;-1:-1:-1;;;;;60794:26:0;;;;;;:19;:26;;;;;:38;;60824:8;;60794:26;:38;;60824:8;;60794:38;:::i;:::-;;;;-1:-1:-1;;;;;60605:235:0:o;46124:276::-;46343:10;46324:16;;:29;;;;:::i;:::-;46305:16;:48;;;;46382:10;46364:14;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;46124:276:0:o;43030:1001::-;18370:17;;;;18369:18;18361:61;;;;-1:-1:-1;;;18361:61:0;;12141:2:1;18361:61:0;;;12123:21:1;12180:2;12160:18;;;12153:30;12219:32;12199:18;;;12192:60;12269:18;;18361:61:0;11939:354:1;18361:61:0;18433:17;:24;;-1:-1:-1;;18433:24:0;18453:4;18433:24;;;:17;43189:19:::1;43207:1;43189:15:::0;:19:::1;:::i;:::-;43166:42:::0;-1:-1:-1;43219:28:0::1;43250:30;43166:42:::0;43250:15;:30:::1;:::i;:::-;43219:61:::0;-1:-1:-1;43362:21:0::1;43440:30;43457:12:::0;43440:16:::1;:30::i;:::-;43557:23;43583:38;43607:14:::0;43583:21:::1;:38;:::i;:::-;43557:64;;43720:51;43733:15;43750:20;43720:12;:51::i;:::-;43814:38;43838:14:::0;43814:21:::1;:38;:::i;:::-;43784:26;;:68;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;43914:24:0::1;::::0;-1:-1:-1;43932:4:0::1;43914:9;:24::i;:::-;43896:42;::::0;:15;:42:::1;:::i;:::-;43863:29;;:75;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43956:67:0::1;::::0;;20045:25:1;;;20101:2;20086:18;;20079:34;;;20129:18;;;20122:34;;;43956:67:0::1;::::0;20033:2:1;20018:18;43956:67:0::1;;;;;;;-1:-1:-1::0;;18480:17:0;:25;;-1:-1:-1;;18480:25:0;;;-1:-1:-1;;;43030:1001:0:o;49560:696::-;49657:16;;49702:12;;49610:7;;;;;49731:385;49755:19;:26;49751:30;;49731:385;;;49853:7;49807:19;:43;49827:19;49847:1;49827:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49827:22:0;49807:43;;;;;;;;;;;;;:53;;:105;;;49905:7;49864:14;:38;49879:19;49899:1;49879:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49879:22:0;49864:38;;;;;;;;;;;;;:48;49807:105;49803:150;;;49922:16;;49940:12;;49914:39;;;;;;;49560:696;;:::o;49803:150::-;49988:19;:43;50008:19;50028:1;50008:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50008:22:0;49988:43;;;;;;;;;;;;;49978:53;;:7;:53;:::i;:::-;49968:63;;50066:14;:38;50081:19;50101:1;50081:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50081:22:0;50066:38;;;;;;;;;;;;;50056:48;;:7;:48;:::i;:::-;50046:58;-1:-1:-1;49783:3:0;;;;:::i;:::-;;;;49731:385;;;;50159:12;;50140:16;;:31;;;;:::i;:::-;50130:7;:41;50126:86;;;50181:16;;50199:12;;50173:39;;;;;;49560:696;;:::o;50126:86::-;50231:7;;50240;;-1:-1:-1;49560:696:0;-1:-1:-1;49560:696:0:o;50339:176::-;50433:7;50499;50476:18;50482:12;50476:2;:18;:::i;:::-;50460:12;;;;:6;:12;:::i;:::-;:35;;;;:::i;:::-;:47;;;;:::i;:::-;50453:54;50339:176;-1:-1:-1;;;;50339:176:0:o;44189:647::-;44334:16;;;44348:1;44334:16;;;;;;;;44310:21;;44334:16;;;;;;;;;;-1:-1:-1;44334:16:0;44310:40;;44379:4;44361;44366:1;44361:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44361:23:0;;;:7;;;;;;;;;;:23;;;;44405:16;;:23;;;-1:-1:-1;;;44405:23:0;;;;:16;;;;;:21;;:23;;;;;44361:7;;44405:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44395:4;44400:1;44395:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44395:33:0;;;:7;;;;;;;;;:33;44473:16;;44441:58;;44458:4;;44473:16;44492:6;44441:8;:58::i;:::-;44545:16;;-1:-1:-1;;;;;44545:16:0;:67;44627:6;44545:16;44666:4;44694;44786:27;:15;44804:9;44786:27;:::i;:::-;44545:283;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44239:597;44189:647;:::o;45280:653::-;45393:16;;45361:63;;45378:4;;-1:-1:-1;;;;;45393:16:0;45412:11;45361:8;:63::i;:::-;45619:16;;-1:-1:-1;;;;;45619:16:0;:32;45659:9;45692:4;45713:11;45619:16;;15734:42;45887:27;:15;45905:9;45887:27;:::i;:::-;45619:306;;;;;;-1:-1:-1;;;;;;45619:306:0;;;-1:-1:-1;;;;;4637:15:1;;;45619:306:0;;;4619:34:1;4669:18;;;4662:34;;;;4712:18;;;4705:34;;;;4755:18;;;4748:34;;;;4819:15;;;4798:19;;;4791:44;4851:19;;;4844:35;;;;4553:19;;45619:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45280:653;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:163:1:-;81:20;;141:10;130:22;;120:33;;110:61;;167:1;164;157:12;110:61;14:163;;;:::o;182:247::-;241:6;294:2;282:9;273:7;269:23;265:32;262:52;;;310:1;307;300:12;262:52;349:9;336:23;368:31;393:5;368:31;:::i;434:251::-;504:6;557:2;545:9;536:7;532:23;528:32;525:52;;;573:1;570;563:12;525:52;605:9;599:16;624:31;649:5;624:31;:::i;690:388::-;758:6;766;819:2;807:9;798:7;794:23;790:32;787:52;;;835:1;832;825:12;787:52;874:9;861:23;893:31;918:5;893:31;:::i;:::-;943:5;-1:-1:-1;1000:2:1;985:18;;972:32;1013:33;972:32;1013:33;:::i;:::-;1065:7;1055:17;;;690:388;;;;;:::o;1083:456::-;1160:6;1168;1176;1229:2;1217:9;1208:7;1204:23;1200:32;1197:52;;;1245:1;1242;1235:12;1197:52;1284:9;1271:23;1303:31;1328:5;1303:31;:::i;:::-;1353:5;-1:-1:-1;1410:2:1;1395:18;;1382:32;1423:33;1382:32;1423:33;:::i;:::-;1083:456;;1475:7;;-1:-1:-1;;;1529:2:1;1514:18;;;;1501:32;;1083:456::o;1544:315::-;1612:6;1620;1673:2;1661:9;1652:7;1648:23;1644:32;1641:52;;;1689:1;1686;1679:12;1641:52;1728:9;1715:23;1747:31;1772:5;1747:31;:::i;:::-;1797:5;1849:2;1834:18;;;;1821:32;;-1:-1:-1;;;1544:315:1:o;1864:180::-;1923:6;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;-1:-1:-1;2015:23:1;;1864:180;-1:-1:-1;1864:180:1:o;2049:306::-;2137:6;2145;2153;2206:2;2194:9;2185:7;2181:23;2177:32;2174:52;;;2222:1;2219;2212:12;2174:52;2251:9;2245:16;2235:26;;2301:2;2290:9;2286:18;2280:25;2270:35;;2345:2;2334:9;2330:18;2324:25;2314:35;;2049:306;;;;;:::o;2360:256::-;2426:6;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2526:28;2544:9;2526:28;:::i;:::-;2516:38;;2573:37;2606:2;2595:9;2591:18;2573:37;:::i;:::-;2563:47;;2360:256;;;;;:::o;2621:391::-;2696:6;2704;2712;2765:2;2753:9;2744:7;2740:23;2736:32;2733:52;;;2781:1;2778;2771:12;2733:52;2804:28;2822:9;2804:28;:::i;:::-;2794:38;;2851:37;2884:2;2873:9;2869:18;2851:37;:::i;:::-;2841:47;;2938:2;2927:9;2923:18;2910:32;2951:31;2976:5;2951:31;:::i;:::-;3001:5;2991:15;;;2621:391;;;;;:::o;3017:460::-;3101:6;3109;3117;3125;3178:3;3166:9;3157:7;3153:23;3149:33;3146:53;;;3195:1;3192;3185:12;3146:53;3218:28;3236:9;3218:28;:::i;:::-;3208:38;;3265:37;3298:2;3287:9;3283:18;3265:37;:::i;:::-;3255:47;;3352:2;3341:9;3337:18;3324:32;3365:31;3390:5;3365:31;:::i;:::-;3017:460;;;;-1:-1:-1;3415:5:1;;3467:2;3452:18;3439:32;;-1:-1:-1;;3017:460:1:o;5082:597::-;5194:4;5223:2;5252;5241:9;5234:21;5284:6;5278:13;5327:6;5322:2;5311:9;5307:18;5300:34;5352:1;5362:140;5376:6;5373:1;5370:13;5362:140;;;5471:14;;;5467:23;;5461:30;5437:17;;;5456:2;5433:26;5426:66;5391:10;;5362:140;;;5520:6;5517:1;5514:13;5511:91;;;5590:1;5585:2;5576:6;5565:9;5561:22;5557:31;5550:42;5511:91;-1:-1:-1;5663:2:1;5642:15;-1:-1:-1;;5638:29:1;5623:45;;;;5670:2;5619:54;;5082:597;-1:-1:-1;;;5082:597:1:o;12298:413::-;12500:2;12482:21;;;12539:2;12519:18;;;12512:30;12578:34;12573:2;12558:18;;12551:62;-1:-1:-1;;;12644:2:1;12629:18;;12622:47;12701:3;12686:19;;12298:413::o;12716:351::-;12918:2;12900:21;;;12957:2;12937:18;;;12930:30;12996:29;12991:2;12976:18;;12969:57;13058:2;13043:18;;12716:351::o;13481:356::-;13683:2;13665:21;;;13702:18;;;13695:30;13761:34;13756:2;13741:18;;13734:62;13828:2;13813:18;;13481:356::o;18605:980::-;18867:4;18915:3;18904:9;18900:19;18946:6;18935:9;18928:25;18972:2;19010:6;19005:2;18994:9;18990:18;18983:34;19053:3;19048:2;19037:9;19033:18;19026:31;19077:6;19112;19106:13;19143:6;19135;19128:22;19181:3;19170:9;19166:19;19159:26;;19220:2;19212:6;19208:15;19194:29;;19241:1;19251:195;19265:6;19262:1;19259:13;19251:195;;;19330:13;;-1:-1:-1;;;;;19326:39:1;19314:52;;19421:15;;;;19386:12;;;;19362:1;19280:9;19251:195;;;-1:-1:-1;;;;;;;19502:32:1;;;;19497:2;19482:18;;19475:60;-1:-1:-1;;;19566:3:1;19551:19;19544:35;19463:3;18605:980;-1:-1:-1;;;18605:980:1:o;20817:128::-;20857:3;20888:1;20884:6;20881:1;20878:13;20875:39;;;20894:18;;:::i;:::-;-1:-1:-1;20930:9:1;;20817:128::o;20950:228::-;20989:3;21017:10;21054:2;21051:1;21047:10;21084:2;21081:1;21077:10;21115:3;21111:2;21107:12;21102:3;21099:21;21096:47;;;21123:18;;:::i;:::-;21159:13;;20950:228;-1:-1:-1;;;;20950:228:1:o;21183:217::-;21223:1;21249;21239:132;;21293:10;21288:3;21284:20;21281:1;21274:31;21328:4;21325:1;21318:15;21356:4;21353:1;21346:15;21239:132;-1:-1:-1;21385:9:1;;21183:217::o;21405:422::-;21494:1;21537:5;21494:1;21551:270;21572:7;21562:8;21559:21;21551:270;;;21631:4;21627:1;21623:6;21619:17;21613:4;21610:27;21607:53;;;21640:18;;:::i;:::-;21690:7;21680:8;21676:22;21673:55;;;21710:16;;;;21673:55;21789:22;;;;21749:15;;;;21551:270;;;21555:3;21405:422;;;;;:::o;21832:147::-;21891:5;21920:53;21961:10;21951:8;21947:25;21941:4;22033:5;22063:8;22053:80;;-1:-1:-1;22104:1:1;22118:5;;22053:80;22152:4;22142:76;;-1:-1:-1;22189:1:1;22203:5;;22142:76;22234:4;22252:1;22247:59;;;;22320:1;22315:130;;;;22227:218;;22247:59;22277:1;22268:10;;22291:5;;;22315:130;22352:3;22342:8;22339:17;22336:43;;;22359:18;;:::i;:::-;-1:-1:-1;;22415:1:1;22401:16;;22430:5;;22227:218;;22529:2;22519:8;22516:16;22510:3;22504:4;22501:13;22497:36;22491:2;22481:8;22478:16;22473:2;22467:4;22464:12;22460:35;22457:77;22454:159;;;-1:-1:-1;22566:19:1;;;22598:5;;22454:159;22645:34;22670:8;22664:4;22645:34;:::i;:::-;22715:6;22711:1;22707:6;22703:19;22694:7;22691:32;22688:58;;;22726:18;;:::i;:::-;22764:20;;21984:806;-1:-1:-1;;;21984:806:1:o;22795:168::-;22835:7;22901:1;22897;22893:6;22889:14;22886:1;22883:21;22878:1;22871:9;22864:17;22860:45;22857:71;;;22908:18;;:::i;:::-;-1:-1:-1;22948:9:1;;22795:168::o;22968:125::-;23008:4;23036:1;23033;23030:8;23027:34;;;23041:18;;:::i;:::-;-1:-1:-1;23078:9:1;;22968:125::o;23098:380::-;23177:1;23173:12;;;;23220;;;23241:61;;23295:4;23287:6;23283:17;23273:27;;23241:61;23348:2;23340:6;23337:14;23317:18;23314:38;23311:161;;;23394:10;23389:3;23385:20;23382:1;23375:31;23429:4;23426:1;23419:15;23457:4;23454:1;23447:15;23311:161;;23098:380;;;:::o;23483:135::-;23522:3;-1:-1:-1;;23543:17:1;;23540:43;;;23563:18;;:::i;:::-;-1:-1:-1;23610:1:1;23599:13;;23483:135::o;23623:127::-;23684:10;23679:3;23675:20;23672:1;23665:31;23715:4;23712:1;23705:15;23739:4;23736:1;23729:15;23755:127;23816:10;23811:3;23807:20;23804:1;23797:31;23847:4;23844:1;23837:15;23871:4;23868:1;23861:15;24019:131;-1:-1:-1;;;;;24094:31:1;;24084:42;;24074:70;;24140:1;24137;24130:12
Swarm Source
ipfs://bac1949254ace4834711f98943002a7498d2fb7a5e0f72abd1af85a8d1bbb71c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.