Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 120 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 24175177 | 31 days ago | IN | 0 ETH | 0.00025853 | ||||
| Transfer | 24175148 | 31 days ago | IN | 0 ETH | 0.00002428 | ||||
| Approve | 23403122 | 139 days ago | IN | 0 ETH | 0.00005739 | ||||
| Transfer | 23056824 | 187 days ago | IN | 0 ETH | 0.00036936 | ||||
| Transfer | 23056761 | 187 days ago | IN | 0 ETH | 0.00036937 | ||||
| Transfer | 23056713 | 187 days ago | IN | 0 ETH | 0.00171921 | ||||
| Transfer | 22562175 | 256 days ago | IN | 0 ETH | 0.00004229 | ||||
| Transfer | 22561881 | 256 days ago | IN | 0 ETH | 0.00001737 | ||||
| Transfer | 22514759 | 263 days ago | IN | 0.00521 ETH | 0.0000883 | ||||
| Approve | 22022897 | 332 days ago | IN | 0 ETH | 0.00004221 | ||||
| Approve | 21776089 | 366 days ago | IN | 0 ETH | 0.00025254 | ||||
| Approve | 21627826 | 387 days ago | IN | 0 ETH | 0.00020138 | ||||
| Transfer | 21105947 | 460 days ago | IN | 0 ETH | 0.0008848 | ||||
| Approve | 20144353 | 594 days ago | IN | 0 ETH | 0.00007059 | ||||
| Approve | 20144295 | 594 days ago | IN | 0 ETH | 0.00011692 | ||||
| Approve | 20084927 | 602 days ago | IN | 0 ETH | 0.00057777 | ||||
| Transfer | 20084884 | 602 days ago | IN | 0 ETH | 0.00468127 | ||||
| Transfer | 20045243 | 608 days ago | IN | 0 ETH | 0.00027675 | ||||
| Transfer | 20045208 | 608 days ago | IN | 0 ETH | 0.00027895 | ||||
| Transfer | 20045166 | 608 days ago | IN | 0 ETH | 0.00026222 | ||||
| Approve | 20045118 | 608 days ago | IN | 0 ETH | 0.00023906 | ||||
| Approve | 20045004 | 608 days ago | IN | 0 ETH | 0.0002183 | ||||
| Approve | 19945077 | 622 days ago | IN | 0 ETH | 0.00022505 | ||||
| Approve | 19906454 | 627 days ago | IN | 0 ETH | 0.00014164 | ||||
| Approve | 19904963 | 628 days ago | IN | 0 ETH | 0.00017256 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24165728 | 32 days ago | 0.00034223 ETH | ||||
| Transfer | 24165728 | 32 days ago | 0.00034223 ETH | ||||
| Transfer | 23365761 | 144 days ago | 0.00115483 ETH | ||||
| Transfer | 23365761 | 144 days ago | 0.00115483 ETH | ||||
| Transfer | 23056713 | 187 days ago | 0.00178986 ETH | ||||
| Transfer | 23056713 | 187 days ago | 0.00178986 ETH | ||||
| Transfer | 20351437 | 565 days ago | 0.00067745 ETH | ||||
| Transfer | 20351437 | 565 days ago | 0.00067745 ETH | ||||
| Transfer | 20097266 | 601 days ago | 0.00120866 ETH | ||||
| Transfer | 20097266 | 601 days ago | 0.00120866 ETH | ||||
| Transfer | 20084884 | 602 days ago | 0 ETH | ||||
| Transfer | 20084884 | 602 days ago | 0 ETH | ||||
| Transfer | 19904238 | 628 days ago | 0.00008389 ETH | ||||
| Transfer | 19904238 | 628 days ago | 0.00008389 ETH | ||||
| Transfer | 19895672 | 629 days ago | 0.00077928 ETH | ||||
| Transfer | 19895672 | 629 days ago | 0.00077928 ETH | ||||
| Transfer | 19780883 | 645 days ago | 0.22392831 ETH | ||||
| Transfer | 19780873 | 645 days ago | 0.22392831 ETH | ||||
| Transfer | 19775921 | 646 days ago | 0.00038984 ETH | ||||
| Transfer | 19775921 | 646 days ago | 0.00038984 ETH | ||||
| Transfer | 19765710 | 647 days ago | 0.00023223 ETH | ||||
| Transfer | 19765710 | 647 days ago | 0.00023223 ETH | ||||
| Transfer | 19759769 | 648 days ago | 0.03722795 ETH | ||||
| Transfer | 19759769 | 648 days ago | 0.03722795 ETH | ||||
| Transfer | 19654722 | 663 days ago | 0.02036813 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CAWELON
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-03-09
*/
pragma solidity 0.8.19;
// SPDX-License-Identifier: MIT
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
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);
}
}
interface IFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
/**
* @title SafeMathInt
* @dev Math operations for int256 with overflow safety checks.
*/
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
/**
* @dev Multiplies two int256 variables and fails on overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
// Detect overflow when multiplying MIN_INT256 with -1
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
/**
* @dev Division of two int256 variables and fails on overflow.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
// Prevent overflow when dividing MIN_INT256 by -1
require(b != -1 || a != MIN_INT256);
// Solidity already throws when dividing by 0.
return a / b;
}
/**
* @dev Subtracts two int256 variables and fails on overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
/**
* @dev Adds two int256 variables and fails on overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
/**
* @title SafeMathUint
* @dev Math operations with safety checks that revert on error
*/
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account)
public
view
virtual
override
returns (uint256)
{
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `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);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
/**
* @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");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(
amount,
"ERC20: transfer amount exceeds balance"
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(
amount,
"ERC20: burn amount exceeds balance"
);
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
contract CAWELON is Context, ERC20, Ownable {
using SafeMath for uint256;
IRouter public router;
address public uniswapV2Pair;
bool private swapping;
struct airDropWallets {
uint256 amount;
uint256 unlockTime;
}
mapping(address => airDropWallets) public airDropWalletsData;
mapping(address => bool) public _isExcludedFromFee;
// store addresses that a automatic market maker pairs. Any transfer *to* these addresses
mapping(address => bool) public automatedMarketMakerPairs;
uint256 private ethRewardsBuyFee = 4;
uint256 private devBuyFee = 2;
uint256 private nativeBurnBuyFee = 2;
uint256 private nativeBurnSellFee = 4;
uint256 private cawBurnSellFee = 4;
uint256 public totalBuyFees = ethRewardsBuyFee.add(devBuyFee).add(nativeBurnBuyFee);
uint256 public totalSellFees = nativeBurnSellFee.add(cawBurnSellFee);
uint256 private countETHRewardFees = 0;
uint256 private countCAWBurnFee = 0;
uint256 private countNativeBurnFee = 0;
address public cawCollectWallet = payable(0xbf38fA464F04f18568938d24B72feA56da76bC4A);
address public devWallet = payable(0xB19171D64A218Bee27b6a9E88919857a86A90e2C);
DividendTracker public dividendTracker;
uint256 public swapTokensAtAmount = 210000000000 * 10**18; //0.05%
address constant deadWallet = 0x000000000000000000000000000000000000dEaD;
address public immutable CAW = address(0xf3b9569F82B18aEf890De263B84189bd33EBe452); // CAW
event SendDividends(uint256 tokenAmount, uint256 ethAmount);
constructor() ERC20("CAW Supporter", "CAWELON"){
dividendTracker = new DividendTracker();
// exclude from receiving dividends
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(deadWallet);
_isExcludedFromFee[address(this)] = true;
_isExcludedFromFee[0x2975466283CB67e37067CB4D53E5960002b39547] = true;
_isExcludedFromFee[deadWallet] = true;
_mint(0x2975466283CB67e37067CB4D53E5960002b39547, 420000000000000 * (10**18));
}
receive() external payable {}
function createPair() external onlyOwner {
IRouter _router = IRouter(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D));
address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
router = _router;
uniswapV2Pair = _pair;
automatedMarketMakerPairs[uniswapV2Pair] = true;
dividendTracker.excludeFromDividends(uniswapV2Pair);
}
function airDrop (address[] calldata recipients, uint256[] calldata amount, uint256 _unlockTime) public onlyOwner{
for (uint256 i = 0; i < recipients.length; i++){
IERC20(address(this)).transferFrom(msg.sender, recipients[i], amount[i] * (10**18));
airDropWalletsData[recipients[i]].amount = amount[i] * (10**18);
airDropWalletsData[recipients[i]].unlockTime = block.timestamp.add(_unlockTime * 86400);
}
}
/// @dev It will send all ETH to dev which are sended accidentally
function recoverETH() external onlyOwner {
uint256 ETHbalance = address(this).balance;
(bool success, ) = payable(owner()).call{value: ETHbalance}("");
require(success);
}
function excludeFromDividends(address account) public onlyOwner {
dividendTracker.excludeFromDividends(account);
}
function excludeFromFee(address account) public onlyOwner {
_isExcludedFromFee[account] = true;
}
function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
require(newAmount >= totalSupply() / 2000, "SwapTokensAtAmount must be greater than or equal to 0.05% of total supply");
swapTokensAtAmount = newAmount * 10**18;
}
function updateDividendTracker(address newAddress) public onlyOwner {
require(newAddress != address(dividendTracker), " The dividend tracker already has that address");
dividendTracker.recoverETH();
DividendTracker newDividendTracker = DividendTracker(payable(newAddress));
newDividendTracker.excludeFromDividends(
address(newDividendTracker)
);
newDividendTracker.excludeFromDividends(address(this));
newDividendTracker.excludeFromDividends(uniswapV2Pair);
newDividendTracker.excludeFromDividends(deadWallet);
dividendTracker = newDividendTracker;
}
function claim() external {
dividendTracker.processAccount(payable(msg.sender), false);
}
uint256 private devFeeActual;
uint256 private cawBurnFeeActual;
uint256 private nativeBurnFeeActual;
uint256 private ETHRewardsFeeActual;
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
if(from != uniswapV2Pair){
require(to != address(this), "You cannot send tokens to the contract address!");
}
if (amount == 0) {
super._transfer(from, to, 0);
return;
} else if (
!swapping && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]
) {
bool isSelling = automatedMarketMakerPairs[to];
bool isBuying = automatedMarketMakerPairs[from];
if (
isSelling && // sells only by detecting transfer to automated market maker pair
from != address(router) //router -> pair is removing liquidity which shouldn't have max
) {
if(block.timestamp <= airDropWalletsData[from].unlockTime && airDropWalletsData[from].amount > 0){
require(amount <= (balanceOf(from).sub(airDropWalletsData[from].amount)));
}
devFeeActual = 0;
ETHRewardsFeeActual = 0;
cawBurnFeeActual = cawBurnSellFee;
nativeBurnFeeActual = nativeBurnSellFee;
}
else if (
isBuying &&
to != address(router)
) {
devFeeActual = devBuyFee;
nativeBurnFeeActual = nativeBurnBuyFee;
ETHRewardsFeeActual = ethRewardsBuyFee;
}
else {
if(block.timestamp <= airDropWalletsData[from].unlockTime && airDropWalletsData[from].amount > 0){
require(amount <= (balanceOf(from).sub(airDropWalletsData[from].amount)), "wait for unlock period");
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (canSwap && !automatedMarketMakerPairs[from]) {
swapping = true;
burnNativeTokens(countNativeBurnFee);
buyCAWTokens(countCAWBurnFee);
swapTokensForDividendETH(countETHRewardFees);
swapAndSendDevETH();
swapping = false;
}
uint256 devFeeAmount = amount.mul(devFeeActual).div(100);
uint256 nativeFeeAmount = amount.mul(nativeBurnFeeActual).div(100);
uint256 cawFeeAmount = amount.mul(cawBurnFeeActual).div(100);
uint256 ETHRewardsFeeAmount = amount.mul(ETHRewardsFeeActual).div(100);
countNativeBurnFee += nativeFeeAmount;
countCAWBurnFee += cawFeeAmount;
countETHRewardFees += ETHRewardsFeeAmount;
uint256 fees = devFeeAmount + nativeFeeAmount + cawFeeAmount + ETHRewardsFeeAmount;
amount = amount.sub(fees);
super._transfer(from, address(this), fees);
}
super._transfer(from, to, amount);
try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
}
function burnNativeTokens(uint256 tokenAmount) private {
uint256 contractBalance = balanceOf(address(this));
if(tokenAmount > contractBalance){
return;
}
uint256 initialBalance = balanceOf(deadWallet);
bool success = IERC20(address(this)).transfer(deadWallet, tokenAmount);
uint256 swappedBalance = balanceOf(deadWallet).sub(initialBalance);
if(success){
_burn(deadWallet, swappedBalance);
countNativeBurnFee -= tokenAmount;
}
}
function buyCAWTokens(uint256 tokenAmount) private {
address[] memory path = new address[](3);
path[0] = address(this);
path[1] = router.WETH();
path[2] = CAW;
_approve(address(this), address(router), tokenAmount);
// make the swap
router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
cawCollectWallet,
block.timestamp
);
countCAWBurnFee -= tokenAmount;
}
function swapTokensForDividendETH(uint256 tokenAmount) private {
uint256 beforeSwap;
uint256 afterSwapDelta;
beforeSwap = address(this).balance;
uint256 contractBalance = balanceOf(address(this));
if(tokenAmount > contractBalance){
return;
}
swapTokensForETH(tokenAmount, payable(address(this)));
afterSwapDelta = address(this).balance - beforeSwap;
countETHRewardFees -= tokenAmount;
uint256 ETHRewards = afterSwapDelta;
(bool success, ) = address(dividendTracker).call{value: ETHRewards}("");
if(success){
emit SendDividends(tokenAmount, ETHRewards);
}
}
function swapTokensForETH(uint256 tokenAmount, address wallet) private {
// generate the pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
_approve(address(this), address(router), tokenAmount);
// make the swap
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
payable(wallet),
block.timestamp
);
}
function swapAndSendDevETH() private {
uint256 contractBalance = balanceOf(address(this));
if(contractBalance <= 0){
return;
}
swapTokensForETH(contractBalance, devWallet);
}
}
interface DividendPayingTokenOptionalInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(address _owner)
external
view
returns (uint256);
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(address _owner)
external
view
returns (uint256);
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(address _owner)
external
view
returns (uint256);
}
interface DividendPayingTokenInterface {
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner) external view returns (uint256);
/// @notice Distributes ether to token holders as dividends.
/// @dev SHOULD distribute the paid ether to token holders as dividends.
/// SHOULD NOT directly transfer ether to token holders in this function.
/// MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
function distributeDividends() external payable;
/// @notice Withdraws the ether distributed to the sender.
/// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
/// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
function withdrawDividend() external;
/// @dev This event MUST emit when ether is distributed to token holders.
/// @param from The address which sends ether to this contract.
/// @param weiAmount The amount of distributed ether in wei.
event DividendsDistributed(address indexed from, uint256 weiAmount);
/// @dev This event MUST emit when an address withdraws their dividend.
/// @param to The address which withdraws ether from this contract.
/// @param weiAmount The amount of withdrawn ether in wei.
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
contract DividendPayingToken is
ERC20,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
// With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
// For more discussion about choosing the value of `magnitude`,
// see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
uint256 internal constant magnitude = 2**128;
uint256 internal magnifiedDividendPerShare;
// About dividendCorrection:
// If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
// When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
// `dividendOf(_user)` should not be changed,
// but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
// To keep the `dividendOf(_user)` unchanged, we add a correction term:
// `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
// where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
// `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
// So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
constructor(string memory _name, string memory _symbol)
ERC20(_name, _symbol)
{}
/// @dev Distributes dividends whenever ether is paid to this contract.
receive() external payable {
distributeDividends();
}
/// @notice Distributes ether to token holders as dividends.
/// @dev It reverts if the total supply of tokens is 0.
/// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
/// About undistributed ether:
/// In each distribution, there is a small amount of ether not distributed,
/// the magnified amount of which is
/// `(msg.value * magnitude) % totalSupply()`.
/// With a well-chosen `magnitude`, the amount of undistributed ether
/// (de-magnified) in a distribution can be less than 1 wei.
/// We can actually keep track of the undistributed ether in a distribution
/// and try to distribute it in the next distribution,
/// but keeping track of such data on-chain costs much more than
/// the saved ether, so we don't do that.
function distributeDividends() public payable override {
require(totalSupply() > 0);
if (msg.value > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add(
(msg.value).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, msg.value);
totalDividendsDistributed = totalDividendsDistributed.add(
msg.value
);
}
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender));
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function _withdrawDividendOfUser(address payable user)
internal
virtual
returns (uint256)
{
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] = withdrawnDividends[user].add(
_withdrawableDividend
);
emit DividendWithdrawn(user, _withdrawableDividend);
(bool success, ) = user.call{
value: _withdrawableDividend,
gas: 3000
}("");
if (!success) {
withdrawnDividends[user] = withdrawnDividends[user].sub(
_withdrawableDividend
);
return 0;
}
return _withdrawableDividend;
}
return 0;
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(address _owner)
public
view
override
returns (uint256)
{
return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
}
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(address _owner)
public
view
override
returns (uint256)
{
return withdrawnDividends[_owner];
}
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(address _owner)
public
view
override
returns (uint256)
{
return
magnifiedDividendPerShare
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrections[_owner])
.toUint256Safe() / magnitude;
}
/// @dev Internal function that mints tokens to an account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account that will receive the created tokens.
/// @param value The amount that will be created.
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
/// @dev Internal function that burns an amount of the token of a given account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account whose tokens will be burnt.
/// @param value The amount that will be burnt.
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
}
library IterableMapping {
// Iterable mapping from address to uint;
struct Map {
address[] keys;
mapping(address => uint) values;
mapping(address => uint) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) public view returns (uint) {
return map.values[key];
}
function getIndexOfKey(Map storage map, address key) public view returns (int) {
if(!map.inserted[key]) {
return -1;
}
return int(map.indexOf[key]);
}
function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
return map.keys[index];
}
function size(Map storage map) public view returns (uint) {
return map.keys.length;
}
function set(Map storage map, address key, uint val) public {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) public {
if (!map.inserted[key]) {
return;
}
delete map.inserted[key];
delete map.values[key];
uint index = map.indexOf[key];
uint lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract DividendTracker is DividendPayingToken, Ownable {
using SafeMath for uint256;
using SafeMathInt for int256;
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
mapping (address => bool) public excludedFromDividends;
mapping (address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(address indexed account, uint256 amount, bool indexed automatic);
constructor() DividendPayingToken("Dividend_Tracker", "Dividend_Tracker") {
claimWait = 24 hours;
minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens
}
function _transfer(address, address, uint256) internal pure override {
require(false, "Dividend_Tracker: No transfers allowed");
}
function withdrawDividend() public pure override {
require(false, "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main contract.");
}
/// @dev It will send all ETH to curent contracty owner
function recoverETH() external onlyOwner {
uint256 ETHbalance = address(this).balance;
(bool success, ) = payable(owner()).call{value: ETHbalance}("");
require(success);
}
function excludeFromDividends(address account) external onlyOwner {
require(!excludedFromDividends[account]);
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function getNumberOfTokenHolders() external view returns(uint256) {
return tokenHoldersMap.keys.length;
}
function getAccount(address _account)
public view returns (
address account,
int256 index,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilNextClaimAvailable) {
account = _account;
index = tokenHoldersMap.getIndexOfKey(account);
withdrawableDividends = withdrawableDividendOf(account);
totalDividends = accumulativeDividendOf(account);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ?
lastClaimTime.add(claimWait) :
0;
secondsUntilNextClaimAvailable = nextClaimTime > block.timestamp ?
nextClaimTime.sub(block.timestamp) :
0;
}
function getAccountAtIndex(uint256 index)
public view returns (
address,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
if(index >= 10) {
return (0x0000000000000000000000000000000000000000, -1, 0, 0, 0, 0, 0);
}
address account = tokenHoldersMap.getKeyAtIndex(index);
return getAccount(account);
}
function setBalance(address payable account, uint256 newBalance) external onlyOwner {
if(excludedFromDividends[account]) {
return;
}
if(newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
}
else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
}
function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividendOfUser(account);
if(amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
return true;
}
return false;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"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":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CAW","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airDropWalletsData","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cawCollectWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a06040526004600b8190556002600c819055600d819055600e829055600f829055620000399162000032908262000368565b9062000368565b601055600f54600e546200004d9162000368565b601155600060128190556013819055601455601580546001600160a01b031990811673bf38fa464f04f18568938d24b72fea56da76bc4a179091556016805490911673b19171d64a218bee27b6a9e88919857a86a90e2c1790556c02a68bedbb190931f65000000060185573f3b9569f82b18aef890de263b84189bd33ebe452608052348015620000dd57600080fd5b506040518060400160405280600d81526020016c21a0ab9029bab83837b93a32b960991b8152506040518060400160405280600781526020016621a0aba2a627a760c91b8152508160039081620001359190620005c9565b506004620001448282620005c9565b505050620001616200015b620003d860201b60201c565b620003dc565b6040516200016f9062000517565b604051809103906000f0801580156200018c573d6000803e3d6000fd5b50601780546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015620001e457600080fd5b505af1158015620001f9573d6000803e3d6000fd5b505060175460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200024357600080fd5b505af115801562000258573d6000803e3d6000fd5b505060175460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620002a457600080fd5b505af1158015620002b9573d6000803e3d6000fd5b50503060009081526009602052604081208054600160ff1991821681179092557f45d4ff3cd355b0ea8a06b0debf8f8f4c613e478d25c008a7fb223c270679a5b1805482168317905561dead9092527f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb193075003785805490921617905550620003629050732975466283cb67e37067cb4d53e5960002b395476d14b5253145b397d65451000000006200042e565b620006b7565b60008062000377838562000695565b905083811015620003cf5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004865760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620003c6565b60025462000495908262000368565b6002556001600160a01b038216600090815260208190526040902054620004bd908262000368565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b611d148062002dc183390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200055057607f821691505b6020821081036200057157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200051257600081815260208120601f850160051c81016020861015620005a05750805b601f850160051c820191505b81811015620005c157828155600101620005ac565b505050505050565b81516001600160401b03811115620005e557620005e562000525565b620005fd81620005f684546200053b565b8462000577565b602080601f8311600181146200063557600084156200061c5750858301515b600019600386901b1c1916600185901b178555620005c1565b600085815260208120601f198616915b82811015620006665788860151825594840194600190910190840162000645565b5085821015620006855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003d257634e487b7160e01b600052601160045260246000fd5b6080516126e7620006da6000396000818161062d0152611cd701526126e76000f3fe6080604052600436106101e75760003560e01c806388bdd9be11610102578063b9e9370011610095578063e2f4560511610064578063e2f45605146105c5578063f2fde38b146105db578063f887ea40146105fb578063fce7416b1461061b57600080fd5b8063b9e9370014610533578063d0a3981414610549578063d257b34f1461055f578063dd62ed3e1461057f57600080fd5b80639e78fb4f116100d15780639e78fb4f146104ae578063a9059cbb146104c3578063b62496f5146104e3578063b84b0b6a1461051357600080fd5b806388bdd9be1461043b5780638da5cb5b1461045b5780638ea5220f1461047957806395d89b411461049957600080fd5b806331e79db01161017a57806370a082311161014957806370a082311461038d578063715018a6146103ad578063768dc710146103c25780637e002d2a146103f257600080fd5b806331e79db014610318578063437823ec1461033857806349bd5a5e146103585780634e71d92d1461037857600080fd5b806318160ddd116101b657806318160ddd1461028557806323b872dd146102a45780632c1f5216146102c4578063313ce567146102fc57600080fd5b80630614117a146101f357806306fdde031461020a578063095ea7b3146102355780630a3db14f1461026557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061020861064f565b005b34801561021657600080fd5b5061021f6106f8565b60405161022c919061222b565b60405180910390f35b34801561024157600080fd5b5061025561025036600461228e565b61078a565b604051901515815260200161022c565b34801561027157600080fd5b50610208610280366004612306565b6107a1565b34801561029157600080fd5b506002545b60405190815260200161022c565b3480156102b057600080fd5b506102556102bf36600461237a565b610993565b3480156102d057600080fd5b506017546102e4906001600160a01b031681565b6040516001600160a01b03909116815260200161022c565b34801561030857600080fd5b506040516012815260200161022c565b34801561032457600080fd5b506102086103333660046123bb565b6109fc565b34801561034457600080fd5b506102086103533660046123bb565b610a88565b34801561036457600080fd5b506007546102e4906001600160a01b031681565b34801561038457600080fd5b50610208610ad6565b34801561039957600080fd5b506102966103a83660046123bb565b610b4e565b3480156103b957600080fd5b50610208610b69565b3480156103ce57600080fd5b506102556103dd3660046123bb565b60096020526000908152604090205460ff1681565b3480156103fe57600080fd5b5061042661040d3660046123bb565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161022c565b34801561044757600080fd5b506102086104563660046123bb565b610b9f565b34801561046757600080fd5b506005546001600160a01b03166102e4565b34801561048557600080fd5b506016546102e4906001600160a01b031681565b3480156104a557600080fd5b5061021f610e39565b3480156104ba57600080fd5b50610208610e48565b3480156104cf57600080fd5b506102556104de36600461228e565b61106e565b3480156104ef57600080fd5b506102556104fe3660046123bb565b600a6020526000908152604090205460ff1681565b34801561051f57600080fd5b506015546102e4906001600160a01b031681565b34801561053f57600080fd5b5061029660105481565b34801561055557600080fd5b5061029660115481565b34801561056b57600080fd5b5061020861057a3660046123d8565b61107b565b34801561058b57600080fd5b5061029661059a3660046123f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105d157600080fd5b5061029660185481565b3480156105e757600080fd5b506102086105f63660046123bb565b61115a565b34801561060757600080fd5b506006546102e4906001600160a01b031681565b34801561062757600080fd5b506102e47f000000000000000000000000000000000000000000000000000000000000000081565b6005546001600160a01b031633146106825760405162461bcd60e51b81526004016106799061242a565b60405180910390fd5b4760006106976005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146106e1576040519150601f19603f3d011682016040523d82523d6000602084013e6106e6565b606091505b50509050806106f457600080fd5b5050565b6060600380546107079061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546107339061245f565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b5050505050905090565b60006107973384846111f2565b5060015b92915050565b6005546001600160a01b031633146107cb5760405162461bcd60e51b81526004016106799061242a565b60005b8481101561098b57306323b872dd338888858181106107ef576107ef612499565b905060200201602081019061080491906123bb565b87878681811061081657610816612499565b90506020020135670de0b6b3a764000061083091906124c5565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a891906124dc565b508383828181106108bb576108bb612499565b90506020020135670de0b6b3a76400006108d591906124c5565b600860008888858181106108eb576108eb612499565b905060200201602081019061090091906123bb565b6001600160a01b0316815260208101919091526040016000205561093161092a83620151806124c5565b4290611317565b6008600088888581811061094757610947612499565b905060200201602081019061095c91906123bb565b6001600160a01b0316815260208101919091526040016000206001015580610983816124fe565b9150506107ce565b505050505050565b60006109a084848461137d565b6109f284336109ed8560405180606001604052806028815260200161268a602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611900565b6111f2565b5060019392505050565b6005546001600160a01b03163314610a265760405162461bcd60e51b81526004016106799061242a565b60175460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015610a6d57600080fd5b505af1158015610a81573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610ab25760405162461bcd60e51b81526004016106799061242a565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60175460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b91906124dc565b50565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610b935760405162461bcd60e51b81526004016106799061242a565b610b9d600061193a565b565b6005546001600160a01b03163314610bc95760405162461bcd60e51b81526004016106799061242a565b6017546001600160a01b0390811690821603610c3e5760405162461bcd60e51b815260206004820152602e60248201527f20546865206469766964656e6420747261636b657220616c726561647920686160448201526d732074686174206164647265737360901b6064820152608401610679565b601760009054906101000a90046001600160a01b03166001600160a01b0316630614117a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b0384166004820181905284935091506331e79db090602401600060405180830381600087803b158015610cea57600080fd5b505af1158015610cfe573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015610da257600080fd5b505af1158015610db6573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b5050601780546001600160a01b0319166001600160a01b039490941693909317909255505050565b6060600480546107079061245f565b6005546001600160a01b03163314610e725760405162461bcd60e51b81526004016106799061242a565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190612517565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f609190612517565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612517565b600680546001600160a01b038581166001600160a01b031992831617909255600780548484169216821781556000918252600a602052604091829020805460ff191660011790556017549054915163031e79db60e41b815291831660048301529293509116906331e79db090602401600060405180830381600087803b15801561105a57600080fd5b505af115801561098b573d6000803e3d6000fd5b600061079733848461137d565b6005546001600160a01b031633146110a55760405162461bcd60e51b81526004016106799061242a565b6107d06110b160025490565b6110bb9190612534565b8110156111425760405162461bcd60e51b815260206004820152604960248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e206f7220657175616c20746f20302e303525206f6620746f74606482015268616c20737570706c7960b81b608482015260a401610679565b61115481670de0b6b3a76400006124c5565b60185550565b6005546001600160a01b031633146111845760405162461bcd60e51b81526004016106799061242a565b6001600160a01b0381166111e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610b4b8161193a565b6001600160a01b0383166112545760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b0382166112b55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806113248385612556565b9050838110156113765760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610679565b9392505050565b6001600160a01b0383166113a35760405162461bcd60e51b815260040161067990612569565b6007546001600160a01b0384811691161461142857306001600160a01b038316036114285760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b6064820152608401610679565b806000036114415761143c8383600061198c565b505050565b600754600160a01b900460ff1615801561147457506001600160a01b03831660009081526009602052604090205460ff16155b801561149957506001600160a01b03821660009081526009602052604090205460ff16155b15611806576001600160a01b038083166000908152600a602052604080822054928616825290205460ff91821691168180156114e357506006546001600160a01b03868116911614155b15611582576001600160a01b038516600090815260086020526040902060010154421180159061152a57506001600160a01b03851660009081526008602052604090205415155b15611567576001600160a01b03851660009081526008602052604090205461155b9061155587610b4e565b90611ad1565b83111561156757600080fd5b60006019819055601c55600f54601a55600e54601b5561166e565b80801561159d57506006546001600160a01b03858116911614155b156115b957600c54601955600d54601b55600b54601c5561166e565b6001600160a01b03851660009081526008602052604090206001015442118015906115fb57506001600160a01b03851660009081526008602052604090205415155b1561166e576001600160a01b0385166000908152600860205260409020546116269061155587610b4e565b83111561166e5760405162461bcd60e51b81526020600482015260166024820152751dd85a5d08199bdc881d5b9b1bd8dac81c195c9a5bd960521b6044820152606401610679565b600061167930610b4e565b601854909150811080159081906116a957506001600160a01b0387166000908152600a602052604090205460ff16155b156116f9576007805460ff60a01b1916600160a01b1790556014546116cd90611b13565b6116d8601354611bee565b6116e3601254611db9565b6116eb611ea4565b6007805460ff60a01b191690555b600061171b606461171560195489611ed390919063ffffffff16565b90611f55565b905060006117396064611715601b548a611ed390919063ffffffff16565b905060006117576064611715601a548b611ed390919063ffffffff16565b905060006117756064611715601c548c611ed390919063ffffffff16565b905082601460008282546117899190612556565b9250508190555081601360008282546117a29190612556565b9250508190555080601260008282546117bb9190612556565b909155506000905081836117cf8688612556565b6117d99190612556565b6117e39190612556565b90506117ef8a82611ad1565b99506117fc8c308361198c565b5050505050505050505b61181183838361198c565b6017546001600160a01b031663e30443bc8461182c81610b4e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561187257600080fd5b505af1925050508015611883575060015b506017546001600160a01b031663e30443bc8361189f81610b4e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156118e557600080fd5b505af19250505080156118f6575060015b1561143c57505050565b600081848411156119245760405162461bcd60e51b8152600401610679919061222b565b50600061193184866125ae565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166119b25760405162461bcd60e51b815260040161067990612569565b6001600160a01b038216611a145760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b611a5181604051806060016040528060268152602001612664602691396001600160a01b0386166000908152602081905260409020549190611900565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a809082611317565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161130a565b600061137683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611900565b6000611b1e30610b4e565b905080821115611b2c575050565b6000611b3961dead610b4e565b60405163a9059cbb60e01b815261dead600482015260248101859052909150600090309063a9059cbb906044016020604051808303816000875af1158015611b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba991906124dc565b90506000611bbc8361155561dead610b4e565b90508115610a8157611bd061dead82611f97565b8460146000828254611be291906125ae565b90915550505050505050565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611c2557611c25612499565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca29190612517565b81600181518110611cb557611cb5612499565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600281518110611d0957611d09612499565b6001600160a01b039283166020918202929092010152600654611d2f91309116846111f2565b600654601554604051635c11d79560e01b81526001600160a01b0392831692635c11d79592611d6c92879260009288929116904290600401612605565b600060405180830381600087803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505050508160136000828254611db091906125ae565b90915550505050565b47600080611dc630610b4e565b905080841115611dd65750505050565b611de084306120a2565b611dea83476125ae565b91508360126000828254611dfe91906125ae565b909155505060175460405183916000916001600160a01b039091169083908381818185875af1925050503d8060008114611e54576040519150601f19603f3d011682016040523d82523d6000602084013e611e59565b606091505b50509050801561098b5760408051878152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a1505050505050565b6000611eaf30610b4e565b905060008111611ebc5750565b601654610b4b9082906001600160a01b03166120a2565b600082600003611ee55750600061079b565b6000611ef183856124c5565b905082611efe8583612534565b146113765760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610679565b600061137683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121fd565b6001600160a01b038216611ff75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b61203481604051806060016040528060228152602001612642602291396001600160a01b0385166000908152602081905260409020549190611900565b6001600160a01b03831660009081526020819052604090205560025461205a9082611ad1565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120d7576120d7612499565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121549190612517565b8160018151811061216757612167612499565b6001600160a01b03928316602091820292909201015260065461218d91309116856111f2565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906121c6908690600090869088904290600401612605565b600060405180830381600087803b1580156121e057600080fd5b505af11580156121f4573d6000803e3d6000fd5b50505050505050565b6000818361221e5760405162461bcd60e51b8152600401610679919061222b565b5060006119318486612534565b600060208083528351808285015260005b818110156122585785810183015185820160400152820161223c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b4b57600080fd5b600080604083850312156122a157600080fd5b82356122ac81612279565b946020939093013593505050565b60008083601f8401126122cc57600080fd5b50813567ffffffffffffffff8111156122e457600080fd5b6020830191508360208260051b85010111156122ff57600080fd5b9250929050565b60008060008060006060868803121561231e57600080fd5b853567ffffffffffffffff8082111561233657600080fd5b61234289838a016122ba565b9097509550602088013591508082111561235b57600080fd5b50612368888289016122ba565b96999598509660400135949350505050565b60008060006060848603121561238f57600080fd5b833561239a81612279565b925060208401356123aa81612279565b929592945050506040919091013590565b6000602082840312156123cd57600080fd5b813561137681612279565b6000602082840312156123ea57600080fd5b5035919050565b6000806040838503121561240457600080fd5b823561240f81612279565b9150602083013561241f81612279565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061247357607f821691505b60208210810361249357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761079b5761079b6124af565b6000602082840312156124ee57600080fd5b8151801515811461137657600080fd5b600060018201612510576125106124af565b5060010190565b60006020828403121561252957600080fd5b815161137681612279565b60008261255157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561079b5761079b6124af565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8181038181111561079b5761079b6124af565b600081518084526020808501945080840160005b838110156125fa5781516001600160a01b0316875295820195908201906001016125d5565b509495945050505050565b85815284602082015260a06040820152600061262460a08301866125c1565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209d774fc17a1c3baf342d6cfb93f9ff3916b516ce86383f20ba5ccd9f5c234f5064736f6c6343000813003360806040523480156200001157600080fd5b5060408051808201825260108082526f2234bb34b232b7322faa3930b1b5b2b960811b602080840182905284518086019095529184529083015290818160036200005c8382620001a0565b5060046200006b8282620001a0565b50505050506200008a62000084620000a560201b60201c565b620000a9565b6201518060105569021e19e0c9bab24000006011556200026c565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012657607f821691505b6020821081036200014757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019b57600081815260208120601f850160051c81016020861015620001765750805b601f850160051c820191505b81811015620001975782815560010162000182565b5050505b505050565b81516001600160401b03811115620001bc57620001bc620000fb565b620001d481620001cd845462000111565b846200014d565b602080601f8311600181146200020c5760008415620001f35750858301515b600019600386901b1c1916600185901b17855562000197565b600085815260208120601f198616915b828110156200023d578886015182559484019460019091019084016200021c565b50858210156200025c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611a98806200027c6000396000f3fe6080604052600436106101d15760003560e01c806370a08231116100f7578063a9059cbb11610095578063dd62ed3e11610064578063dd62ed3e1461055e578063e30443bc146105a4578063f2fde38b146105c4578063fbcbc0f1146105e457600080fd5b8063a9059cbb146104d2578063aafd847a146104f2578063bc4c4b3714610528578063be10b6141461054857600080fd5b80638da5cb5b116100d15780638da5cb5b1461045557806391b89fba1461047d57806395d89b411461049d578063a8b9d240146104b257600080fd5b806370a08231146103f4578063715018a61461042a57806385a6b3ae1461043f57600080fd5b806323b872dd1161016f5780634e7b827f1161013e5780634e7b827f1461033a5780635183d6fd1461036a5780636a474002146103c95780636f2789ec146103de57600080fd5b806323b872dd146102be57806327ce0147146102de578063313ce567146102fe57806331e79db01461031a57600080fd5b8063095ea7b3116101ab578063095ea7b31461022d57806309bbedde1461025d57806318160ddd1461027c578063226cfa3d1461029157600080fd5b806303c83302146101e55780630614117a146101ed57806306fdde031461020257600080fd5b366101e0576101de610604565b005b600080fd5b6101de610604565b3480156101f957600080fd5b506101de610697565b34801561020e57600080fd5b50610217610740565b6040516102249190611744565b60405180910390f35b34801561023957600080fd5b5061024d6102483660046117a7565b6107d2565b6040519015158152602001610224565b34801561026957600080fd5b50600a545b604051908152602001610224565b34801561028857600080fd5b5060025461026e565b34801561029d57600080fd5b5061026e6102ac3660046117d3565b600f6020526000908152604090205481565b3480156102ca57600080fd5b5061024d6102d93660046117f0565b6107e9565b3480156102ea57600080fd5b5061026e6102f93660046117d3565b610852565b34801561030a57600080fd5b5060405160128152602001610224565b34801561032657600080fd5b506101de6103353660046117d3565b6108ae565b34801561034657600080fd5b5061024d6103553660046117d3565b600e6020526000908152604090205460ff1681565b34801561037657600080fd5b5061038a610385366004611831565b6109d5565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610224565b3480156103d557600080fd5b506101de610aa8565b3480156103ea57600080fd5b5061026e60105481565b34801561040057600080fd5b5061026e61040f3660046117d3565b6001600160a01b031660009081526020819052604090205490565b34801561043657600080fd5b506101de610b3c565b34801561044b57600080fd5b5061026e60085481565b34801561046157600080fd5b506009546040516001600160a01b039091168152602001610224565b34801561048957600080fd5b5061026e6104983660046117d3565b610b70565b3480156104a957600080fd5b50610217610b7b565b3480156104be57600080fd5b5061026e6104cd3660046117d3565b610b8a565b3480156104de57600080fd5b5061024d6104ed3660046117a7565b610bb6565b3480156104fe57600080fd5b5061026e61050d3660046117d3565b6001600160a01b031660009081526007602052604090205490565b34801561053457600080fd5b5061024d61054336600461184a565b610bc3565b34801561055457600080fd5b5061026e60115481565b34801561056a57600080fd5b5061026e610579366004611888565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105b057600080fd5b506101de6105bf3660046117a7565b610c71565b3480156105d057600080fd5b506101de6105df3660046117d3565b610d9e565b3480156105f057600080fd5b5061038a6105ff3660046117d3565b610e39565b600061060f60025490565b1161061957600080fd5b34156106955761064c61062b60025490565b61063934600160801b610f40565b61064391906118cc565b60055490610fc9565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106919034610fc9565b6008555b565b6009546001600160a01b031633146106ca5760405162461bcd60e51b81526004016106c1906118ee565b60405180910390fd5b4760006106df6009546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610729576040519150601f19603f3d011682016040523d82523d6000602084013e61072e565b606091505b505090508061073c57600080fd5b5050565b60606003805461074f90611923565b80601f016020809104026020016040519081016040528092919081815260200182805461077b90611923565b80156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b5050505050905090565b60006107df338484611028565b5060015b92915050565b60006107f684848461114c565b610848843361084385604051806060016040528060288152602001611a3b602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906111a8565b611028565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108a49261089f92610899916108949190610f40565b6111e2565b906111f2565b611230565b6107e391906118cc565b6009546001600160a01b031633146108d85760405162461bcd60e51b81526004016106c1906118ee565b6001600160a01b0381166000908152600e602052604090205460ff16156108fe57600080fd5b6001600160a01b0381166000908152600e60205260408120805460ff1916600117905561092c908290611243565b60405163131836e760e21b8152600a60048201526001600160a01b03821660248201527365be24c6a3b30a23c49d16ea71efb08c281f8ce390634c60db9c9060440160006040518083038186803b15801561098657600080fd5b505af415801561099a573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000806000806000806000600a8810610a04575060009550600019945085935083925082915081905080610a9d565b6040516368d54f3f60e11b8152600a6004820152602481018990526000907365be24c6a3b30a23c49d16ea71efb08c281f8ce39063d1aa9e7e90604401602060405180830381865af4158015610a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a82919061195d565b9050610a8d81610e39565b9750975097509750975097509750505b919395979092949650565b60405162461bcd60e51b815260206004820152605c60248201527f4469766964656e645f547261636b65723a20776974686472617744697669646560448201527f6e642064697361626c65642e20557365207468652027636c61696d272066756e60648201527f6374696f6e206f6e20746865206d61696e2020636f6e74726163742e00000000608482015260a4016106c1565b6009546001600160a01b03163314610b665760405162461bcd60e51b81526004016106c1906118ee565b61069560006112a2565b60006107e382610b8a565b60606004805461074f90611923565b6001600160a01b0381166000908152600760205260408120546107e390610bb084610852565b906112f4565b60006107df33848461114c565b6009546000906001600160a01b03163314610bf05760405162461bcd60e51b81526004016106c1906118ee565b6000610bfb84611336565b90508015610c67576001600160a01b0384166000818152600f6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c559085815260200190565b60405180910390a360019150506107e3565b5060009392505050565b6009546001600160a01b03163314610c9b5760405162461bcd60e51b81526004016106c1906118ee565b6001600160a01b0382166000908152600e602052604090205460ff1661073c576011548110610d4c57610cce8282611243565b604051632f0ad01760e21b8152600a60048201526001600160a01b0383166024820152604481018290527365be24c6a3b30a23c49d16ea71efb08c281f8ce39063bc2b405c906064015b60006040518083038186803b158015610d3057600080fd5b505af4158015610d44573d6000803e3d6000fd5b505050505050565b610d57826000611243565b60405163131836e760e21b8152600a60048201526001600160a01b03831660248201527365be24c6a3b30a23c49d16ea71efb08c281f8ce390634c60db9c90604401610d18565b6009546001600160a01b03163314610dc85760405162461bcd60e51b81526004016106c1906118ee565b6001600160a01b038116610e2d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c1565b610e36816112a2565b50565b6040516317e142d160e01b8152600a60048201526001600160a01b03821660248201528190600090819081908190819081907365be24c6a3b30a23c49d16ea71efb08c281f8ce3906317e142d190604401602060405180830381865af4158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb919061197a565b9550610ed687610b8a565b9450610ee187610852565b6001600160a01b0388166000908152600f6020526040902054909450925082610f0b576000610f19565b601054610f19908490610fc9565b9150428211610f29576000610f33565b610f3382426112f4565b9050919395979092949650565b600082600003610f52575060006107e3565b6000610f5e8385611993565b905082610f6b85836118cc565b14610fc25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106c1565b9392505050565b600080610fd683856119aa565b905083811015610fc25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106c1565b6001600160a01b03831661108a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106c1565b6001600160a01b0382166110eb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106c1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602660248201527f4469766964656e645f547261636b65723a204e6f207472616e736665727320616044820152651b1b1bddd95960d21b60648201526084016106c1565b505050565b600081848411156111cc5760405162461bcd60e51b81526004016106c19190611744565b5060006111d984866119bd565b95945050505050565b600081818112156107e357600080fd5b6000806111ff83856119d0565b9050600083121580156112125750838112155b80611227575060008312801561122757508381125b610fc257600080fd5b60008082121561123f57600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561128257600061127083836112f4565b905061127c848261147c565b50505050565b808210156111a357600061129682846112f4565b905061127c84826114e0565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610fc283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111a8565b60008061134283610b8a565b90508015611473576001600160a01b03831660009081526007602052604090205461136d9082610fc9565b6001600160a01b038416600081815260076020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113bc9084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114611416576040519150601f19603f3d011682016040523d82523d6000602084013e61141b565b606091505b505090508061146c576001600160a01b03841660009081526007602052604090205461144790836112f4565b6001600160a01b03909416600090815260076020526040812094909455509192915050565b5092915050565b50600092915050565b6114868282611524565b6114c06114a161089483600554610f4090919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611603565b6001600160a01b0390921660009081526006602052604090209190915550565b6114ea8282611640565b6114c061150561089483600554610f4090919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906111f2565b6001600160a01b03821661157a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106c1565b6002546115879082610fc9565b6002556001600160a01b0382166000908152602081905260409020546115ad9082610fc9565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60008061161083856119f8565b9050600083121580156116235750838113155b8061122757506000831280156112275750838113610fc257600080fd5b6001600160a01b0382166116a05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106c1565b6116dd81604051806060016040528060228152602001611a19602291396001600160a01b03851660009081526020819052604090205491906111a8565b6001600160a01b03831660009081526020819052604090205560025461170390826112f4565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016115f7565b600060208083528351808285015260005b8181101561177157858101830151858201604001528201611755565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e3657600080fd5b600080604083850312156117ba57600080fd5b82356117c581611792565b946020939093013593505050565b6000602082840312156117e557600080fd5b8135610fc281611792565b60008060006060848603121561180557600080fd5b833561181081611792565b9250602084013561182081611792565b929592945050506040919091013590565b60006020828403121561184357600080fd5b5035919050565b6000806040838503121561185d57600080fd5b823561186881611792565b91506020830135801515811461187d57600080fd5b809150509250929050565b6000806040838503121561189b57600080fd5b82356118a681611792565b9150602083013561187d81611792565b634e487b7160e01b600052601160045260246000fd5b6000826118e957634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061193757607f821691505b60208210810361195757634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561196f57600080fd5b8151610fc281611792565b60006020828403121561198c57600080fd5b5051919050565b80820281158282048414176107e3576107e36118b6565b808201808211156107e3576107e36118b6565b818103818111156107e3576107e36118b6565b80820182811260008312801582168215821617156119f0576119f06118b6565b505092915050565b818103600083128015838313168383128216171561146c5761146c6118b656fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220afa9414a8b43f72a06226a5750c204ae873fb796fefee21954022751dc0f227964736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101e75760003560e01c806388bdd9be11610102578063b9e9370011610095578063e2f4560511610064578063e2f45605146105c5578063f2fde38b146105db578063f887ea40146105fb578063fce7416b1461061b57600080fd5b8063b9e9370014610533578063d0a3981414610549578063d257b34f1461055f578063dd62ed3e1461057f57600080fd5b80639e78fb4f116100d15780639e78fb4f146104ae578063a9059cbb146104c3578063b62496f5146104e3578063b84b0b6a1461051357600080fd5b806388bdd9be1461043b5780638da5cb5b1461045b5780638ea5220f1461047957806395d89b411461049957600080fd5b806331e79db01161017a57806370a082311161014957806370a082311461038d578063715018a6146103ad578063768dc710146103c25780637e002d2a146103f257600080fd5b806331e79db014610318578063437823ec1461033857806349bd5a5e146103585780634e71d92d1461037857600080fd5b806318160ddd116101b657806318160ddd1461028557806323b872dd146102a45780632c1f5216146102c4578063313ce567146102fc57600080fd5b80630614117a146101f357806306fdde031461020a578063095ea7b3146102355780630a3db14f1461026557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061020861064f565b005b34801561021657600080fd5b5061021f6106f8565b60405161022c919061222b565b60405180910390f35b34801561024157600080fd5b5061025561025036600461228e565b61078a565b604051901515815260200161022c565b34801561027157600080fd5b50610208610280366004612306565b6107a1565b34801561029157600080fd5b506002545b60405190815260200161022c565b3480156102b057600080fd5b506102556102bf36600461237a565b610993565b3480156102d057600080fd5b506017546102e4906001600160a01b031681565b6040516001600160a01b03909116815260200161022c565b34801561030857600080fd5b506040516012815260200161022c565b34801561032457600080fd5b506102086103333660046123bb565b6109fc565b34801561034457600080fd5b506102086103533660046123bb565b610a88565b34801561036457600080fd5b506007546102e4906001600160a01b031681565b34801561038457600080fd5b50610208610ad6565b34801561039957600080fd5b506102966103a83660046123bb565b610b4e565b3480156103b957600080fd5b50610208610b69565b3480156103ce57600080fd5b506102556103dd3660046123bb565b60096020526000908152604090205460ff1681565b3480156103fe57600080fd5b5061042661040d3660046123bb565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161022c565b34801561044757600080fd5b506102086104563660046123bb565b610b9f565b34801561046757600080fd5b506005546001600160a01b03166102e4565b34801561048557600080fd5b506016546102e4906001600160a01b031681565b3480156104a557600080fd5b5061021f610e39565b3480156104ba57600080fd5b50610208610e48565b3480156104cf57600080fd5b506102556104de36600461228e565b61106e565b3480156104ef57600080fd5b506102556104fe3660046123bb565b600a6020526000908152604090205460ff1681565b34801561051f57600080fd5b506015546102e4906001600160a01b031681565b34801561053f57600080fd5b5061029660105481565b34801561055557600080fd5b5061029660115481565b34801561056b57600080fd5b5061020861057a3660046123d8565b61107b565b34801561058b57600080fd5b5061029661059a3660046123f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105d157600080fd5b5061029660185481565b3480156105e757600080fd5b506102086105f63660046123bb565b61115a565b34801561060757600080fd5b506006546102e4906001600160a01b031681565b34801561062757600080fd5b506102e47f000000000000000000000000f3b9569f82b18aef890de263b84189bd33ebe45281565b6005546001600160a01b031633146106825760405162461bcd60e51b81526004016106799061242a565b60405180910390fd5b4760006106976005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146106e1576040519150601f19603f3d011682016040523d82523d6000602084013e6106e6565b606091505b50509050806106f457600080fd5b5050565b6060600380546107079061245f565b80601f01602080910402602001604051908101604052809291908181526020018280546107339061245f565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b5050505050905090565b60006107973384846111f2565b5060015b92915050565b6005546001600160a01b031633146107cb5760405162461bcd60e51b81526004016106799061242a565b60005b8481101561098b57306323b872dd338888858181106107ef576107ef612499565b905060200201602081019061080491906123bb565b87878681811061081657610816612499565b90506020020135670de0b6b3a764000061083091906124c5565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a891906124dc565b508383828181106108bb576108bb612499565b90506020020135670de0b6b3a76400006108d591906124c5565b600860008888858181106108eb576108eb612499565b905060200201602081019061090091906123bb565b6001600160a01b0316815260208101919091526040016000205561093161092a83620151806124c5565b4290611317565b6008600088888581811061094757610947612499565b905060200201602081019061095c91906123bb565b6001600160a01b0316815260208101919091526040016000206001015580610983816124fe565b9150506107ce565b505050505050565b60006109a084848461137d565b6109f284336109ed8560405180606001604052806028815260200161268a602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611900565b6111f2565b5060019392505050565b6005546001600160a01b03163314610a265760405162461bcd60e51b81526004016106799061242a565b60175460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015610a6d57600080fd5b505af1158015610a81573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610ab25760405162461bcd60e51b81526004016106799061242a565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b60175460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b91906124dc565b50565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610b935760405162461bcd60e51b81526004016106799061242a565b610b9d600061193a565b565b6005546001600160a01b03163314610bc95760405162461bcd60e51b81526004016106799061242a565b6017546001600160a01b0390811690821603610c3e5760405162461bcd60e51b815260206004820152602e60248201527f20546865206469766964656e6420747261636b657220616c726561647920686160448201526d732074686174206164647265737360901b6064820152608401610679565b601760009054906101000a90046001600160a01b03166001600160a01b0316630614117a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8e57600080fd5b505af1158015610ca2573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b0384166004820181905284935091506331e79db090602401600060405180830381600087803b158015610cea57600080fd5b505af1158015610cfe573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015610da257600080fd5b505af1158015610db6573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b5050601780546001600160a01b0319166001600160a01b039490941693909317909255505050565b6060600480546107079061245f565b6005546001600160a01b03163314610e725760405162461bcd60e51b81526004016106799061242a565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190612517565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f609190612517565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612517565b600680546001600160a01b038581166001600160a01b031992831617909255600780548484169216821781556000918252600a602052604091829020805460ff191660011790556017549054915163031e79db60e41b815291831660048301529293509116906331e79db090602401600060405180830381600087803b15801561105a57600080fd5b505af115801561098b573d6000803e3d6000fd5b600061079733848461137d565b6005546001600160a01b031633146110a55760405162461bcd60e51b81526004016106799061242a565b6107d06110b160025490565b6110bb9190612534565b8110156111425760405162461bcd60e51b815260206004820152604960248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e206f7220657175616c20746f20302e303525206f6620746f74606482015268616c20737570706c7960b81b608482015260a401610679565b61115481670de0b6b3a76400006124c5565b60185550565b6005546001600160a01b031633146111845760405162461bcd60e51b81526004016106799061242a565b6001600160a01b0381166111e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b610b4b8161193a565b6001600160a01b0383166112545760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610679565b6001600160a01b0382166112b55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610679565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806113248385612556565b9050838110156113765760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610679565b9392505050565b6001600160a01b0383166113a35760405162461bcd60e51b815260040161067990612569565b6007546001600160a01b0384811691161461142857306001600160a01b038316036114285760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b6064820152608401610679565b806000036114415761143c8383600061198c565b505050565b600754600160a01b900460ff1615801561147457506001600160a01b03831660009081526009602052604090205460ff16155b801561149957506001600160a01b03821660009081526009602052604090205460ff16155b15611806576001600160a01b038083166000908152600a602052604080822054928616825290205460ff91821691168180156114e357506006546001600160a01b03868116911614155b15611582576001600160a01b038516600090815260086020526040902060010154421180159061152a57506001600160a01b03851660009081526008602052604090205415155b15611567576001600160a01b03851660009081526008602052604090205461155b9061155587610b4e565b90611ad1565b83111561156757600080fd5b60006019819055601c55600f54601a55600e54601b5561166e565b80801561159d57506006546001600160a01b03858116911614155b156115b957600c54601955600d54601b55600b54601c5561166e565b6001600160a01b03851660009081526008602052604090206001015442118015906115fb57506001600160a01b03851660009081526008602052604090205415155b1561166e576001600160a01b0385166000908152600860205260409020546116269061155587610b4e565b83111561166e5760405162461bcd60e51b81526020600482015260166024820152751dd85a5d08199bdc881d5b9b1bd8dac81c195c9a5bd960521b6044820152606401610679565b600061167930610b4e565b601854909150811080159081906116a957506001600160a01b0387166000908152600a602052604090205460ff16155b156116f9576007805460ff60a01b1916600160a01b1790556014546116cd90611b13565b6116d8601354611bee565b6116e3601254611db9565b6116eb611ea4565b6007805460ff60a01b191690555b600061171b606461171560195489611ed390919063ffffffff16565b90611f55565b905060006117396064611715601b548a611ed390919063ffffffff16565b905060006117576064611715601a548b611ed390919063ffffffff16565b905060006117756064611715601c548c611ed390919063ffffffff16565b905082601460008282546117899190612556565b9250508190555081601360008282546117a29190612556565b9250508190555080601260008282546117bb9190612556565b909155506000905081836117cf8688612556565b6117d99190612556565b6117e39190612556565b90506117ef8a82611ad1565b99506117fc8c308361198c565b5050505050505050505b61181183838361198c565b6017546001600160a01b031663e30443bc8461182c81610b4e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561187257600080fd5b505af1925050508015611883575060015b506017546001600160a01b031663e30443bc8361189f81610b4e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156118e557600080fd5b505af19250505080156118f6575060015b1561143c57505050565b600081848411156119245760405162461bcd60e51b8152600401610679919061222b565b50600061193184866125ae565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166119b25760405162461bcd60e51b815260040161067990612569565b6001600160a01b038216611a145760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610679565b611a5181604051806060016040528060268152602001612664602691396001600160a01b0386166000908152602081905260409020549190611900565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a809082611317565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161130a565b600061137683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611900565b6000611b1e30610b4e565b905080821115611b2c575050565b6000611b3961dead610b4e565b60405163a9059cbb60e01b815261dead600482015260248101859052909150600090309063a9059cbb906044016020604051808303816000875af1158015611b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba991906124dc565b90506000611bbc8361155561dead610b4e565b90508115610a8157611bd061dead82611f97565b8460146000828254611be291906125ae565b90915550505050505050565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611c2557611c25612499565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca29190612517565b81600181518110611cb557611cb5612499565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000f3b9569f82b18aef890de263b84189bd33ebe45281600281518110611d0957611d09612499565b6001600160a01b039283166020918202929092010152600654611d2f91309116846111f2565b600654601554604051635c11d79560e01b81526001600160a01b0392831692635c11d79592611d6c92879260009288929116904290600401612605565b600060405180830381600087803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505050508160136000828254611db091906125ae565b90915550505050565b47600080611dc630610b4e565b905080841115611dd65750505050565b611de084306120a2565b611dea83476125ae565b91508360126000828254611dfe91906125ae565b909155505060175460405183916000916001600160a01b039091169083908381818185875af1925050503d8060008114611e54576040519150601f19603f3d011682016040523d82523d6000602084013e611e59565b606091505b50509050801561098b5760408051878152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a1505050505050565b6000611eaf30610b4e565b905060008111611ebc5750565b601654610b4b9082906001600160a01b03166120a2565b600082600003611ee55750600061079b565b6000611ef183856124c5565b905082611efe8583612534565b146113765760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610679565b600061137683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121fd565b6001600160a01b038216611ff75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610679565b61203481604051806060016040528060228152602001612642602291396001600160a01b0385166000908152602081905260409020549190611900565b6001600160a01b03831660009081526020819052604090205560025461205a9082611ad1565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120d7576120d7612499565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612130573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121549190612517565b8160018151811061216757612167612499565b6001600160a01b03928316602091820292909201015260065461218d91309116856111f2565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906121c6908690600090869088904290600401612605565b600060405180830381600087803b1580156121e057600080fd5b505af11580156121f4573d6000803e3d6000fd5b50505050505050565b6000818361221e5760405162461bcd60e51b8152600401610679919061222b565b5060006119318486612534565b600060208083528351808285015260005b818110156122585785810183015185820160400152820161223c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b4b57600080fd5b600080604083850312156122a157600080fd5b82356122ac81612279565b946020939093013593505050565b60008083601f8401126122cc57600080fd5b50813567ffffffffffffffff8111156122e457600080fd5b6020830191508360208260051b85010111156122ff57600080fd5b9250929050565b60008060008060006060868803121561231e57600080fd5b853567ffffffffffffffff8082111561233657600080fd5b61234289838a016122ba565b9097509550602088013591508082111561235b57600080fd5b50612368888289016122ba565b96999598509660400135949350505050565b60008060006060848603121561238f57600080fd5b833561239a81612279565b925060208401356123aa81612279565b929592945050506040919091013590565b6000602082840312156123cd57600080fd5b813561137681612279565b6000602082840312156123ea57600080fd5b5035919050565b6000806040838503121561240457600080fd5b823561240f81612279565b9150602083013561241f81612279565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061247357607f821691505b60208210810361249357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761079b5761079b6124af565b6000602082840312156124ee57600080fd5b8151801515811461137657600080fd5b600060018201612510576125106124af565b5060010190565b60006020828403121561252957600080fd5b815161137681612279565b60008261255157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561079b5761079b6124af565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b8181038181111561079b5761079b6124af565b600081518084526020808501945080840160005b838110156125fa5781516001600160a01b0316875295820195908201906001016125d5565b509495945050505050565b85815284602082015260a06040820152600061262460a08301866125c1565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209d774fc17a1c3baf342d6cfb93f9ff3916b516ce86383f20ba5ccd9f5c234f5064736f6c63430008130033
Deployed Bytecode Sourcemap
13478:11172:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16785:219;;;;;;;;;;;;;:::i;:::-;;5914:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8222:210;;;;;;;;;;-1:-1:-1;8222:210:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8222:210:0;1023:187:1;16229:476:0;;;;;;;;;;-1:-1:-1;16229:476:0;;;;;:::i;:::-;;:::i;7034:108::-;;;;;;;;;;-1:-1:-1;7122:12:0;;7034:108;;;2579:25:1;;;2567:2;2552:18;7034:108:0;2433:177:1;8914:454:0;;;;;;;;;;-1:-1:-1;8914:454:0;;;;;:::i;:::-;;:::i;14745:38::-;;;;;;;;;;-1:-1:-1;14745:38:0;;;;-1:-1:-1;;;;;14745:38:0;;;;;;-1:-1:-1;;;;;3272:32:1;;;3254:51;;3242:2;3227:18;14745:38:0;3076:235:1;6876:93:0;;;;;;;;;;-1:-1:-1;6876:93:0;;6959:2;3458:36:1;;3446:2;3431:18;6876:93:0;3316:184:1;17012:130:0;;;;;;;;;;-1:-1:-1;17012:130:0;;;;;:::i;:::-;;:::i;17150:111::-;;;;;;;;;;-1:-1:-1;17150:111:0;;;;;:::i;:::-;;:::i;13594:28::-;;;;;;;;;;-1:-1:-1;13594:28:0;;;;-1:-1:-1;;;;;13594:28:0;;;18197:103;;;;;;;;;;;;;:::i;7205:177::-;;;;;;;;;;-1:-1:-1;7205:177:0;;;;;:::i;:::-;;:::i;1622:94::-;;;;;;;;;;;;;:::i;13823:51::-;;;;;;;;;;-1:-1:-1;13823:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13753:61;;;;;;;;;;-1:-1:-1;13753:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;4139:25:1;;;4195:2;4180:18;;4173:34;;;;4112:18;13753:61:0;3965:248:1;17537:652:0;;;;;;;;;;-1:-1:-1;17537:652:0;;;;;:::i;:::-;;:::i;1399:87::-;;;;;;;;;;-1:-1:-1;1472:6:0;;-1:-1:-1;;;;;1472:6:0;1399:87;;14651:79;;;;;;;;;;-1:-1:-1;14651:79:0;;;;-1:-1:-1;;;;;14651:79:0;;;6133:104;;;;;;;;;;;;;:::i;15798:423::-;;;;;;;;;;;;;:::i;7595:216::-;;;;;;;;;;-1:-1:-1;7595:216:0;;;;;:::i;:::-;;:::i;13978:57::-;;;;;;;;;;-1:-1:-1;13978:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14558:86;;;;;;;;;;-1:-1:-1;14558:86:0;;;;-1:-1:-1;;;;;14558:86:0;;;14253:83;;;;;;;;;;;;;;;;14343:68;;;;;;;;;;;;;;;;17269:260;;;;;;;;;;-1:-1:-1;17269:260:0;;;;;:::i;:::-;;:::i;7874:201::-;;;;;;;;;;-1:-1:-1;7874:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;8040:18:0;;;8008:7;8040:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7874:201;14792:57;;;;;;;;;;;;;;;;1724:192;;;;;;;;;;-1:-1:-1;1724:192:0;;;;;:::i;:::-;;:::i;13564:21::-;;;;;;;;;;-1:-1:-1;13564:21:0;;;;-1:-1:-1;;;;;13564:21:0;;;14945:82;;;;;;;;;;;;;;;16785:219;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;;;;;;;;;16864:21:::1;16843:18;16923:7;1472:6:::0;;-1:-1:-1;;;;;1472:6:0;;1399:87;16923:7:::1;-1:-1:-1::0;;;;;16915:21:0::1;16944:10;16915:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16896:63;;;16978:7;16970:16;;;::::0;::::1;;16826:178;;16785:219::o:0;5914:100::-;5968:13;6001:5;5994:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5914:100;:::o;8222:210::-;8341:4;8363:39;900:10;8386:7;8395:6;8363:8;:39::i;:::-;-1:-1:-1;8420:4:0;8222:210;;;;;:::o;16229:476::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;16360:9:::1;16355:343;16375:21:::0;;::::1;16355:343;;;16434:4;16419:34;16454:10;16466::::0;;16477:1;16466:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16481:6;;16488:1;16481:9;;;;;;;:::i;:::-;;;;;;;16494:6;16481:20;;;;:::i;:::-;16419:83;::::0;-1:-1:-1;;;;;;16419:83:0::1;::::0;;;;;;-1:-1:-1;;;;;6670:15:1;;;16419:83:0::1;::::0;::::1;6652:34:1::0;6722:15;;;;6702:18;;;6695:43;6754:18;;;6747:34;6587:18;;16419:83:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16561:6;;16568:1;16561:9;;;;;;;:::i;:::-;;;;;;;16574:6;16561:20;;;;:::i;:::-;16518:18;:33;16537:10;;16548:1;16537:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16518:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16518:33:0;:63;16644:40:::1;16664:19;:11:::0;16678:5:::1;16664:19;:::i;:::-;16644:15;::::0;:19:::1;:40::i;:::-;16597:18;:33;16616:10;;16627:1;16616:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16597:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16597:33:0;:44:::1;;:87:::0;16398:3;::::1;::::0;::::1;:::i;:::-;;;;16355:343;;;;16229:476:::0;;;;;:::o;8914:454::-;9054:4;9071:36;9081:6;9089:9;9100:6;9071:9;:36::i;:::-;9118:220;9141:6;900:10;9189:138;9245:6;9189:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9189:19:0;;;;;;:11;:19;;;;;;;;900:10;9189:33;;;;;;;;;;:37;:138::i;:::-;9118:8;:220::i;:::-;-1:-1:-1;9356:4:0;8914:454;;;;;:::o;17012:130::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17087:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;17087:45:0;;-1:-1:-1;;;;;3272:32:1;;;17087:45:0::1;::::0;::::1;3254:51:1::0;17087:15:0;;::::1;::::0;:36:::1;::::0;3227:18:1;;17087:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17012:130:::0;:::o;17150:111::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17219:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;17219:34:0::1;17249:4;17219:34;::::0;;17150:111::o;18197:103::-;18234:15;;:58;;-1:-1:-1;;;18234:58:0;;18273:10;18234:58;;;7398:51:1;18234:15:0;7465:18:1;;;7458:50;-1:-1:-1;;;;;18234:15:0;;;;:30;;7371:18:1;;18234:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18197:103::o;7205:177::-;-1:-1:-1;;;;;7356:18:0;7324:7;7356:18;;;;;;;;;;;;7205:177::o;1622:94::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;1687:21:::1;1705:1;1687:9;:21::i;:::-;1622:94::o:0;17537:652::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17645:15:::1;::::0;-1:-1:-1;;;;;17645:15:0;;::::1;17623:38:::0;;::::1;::::0;17615:97:::1;;;::::0;-1:-1:-1;;;17615:97:0;;7721:2:1;17615:97:0::1;::::0;::::1;7703:21:1::0;7760:2;7740:18;;;7733:30;7799:34;7779:18;;;7772:62;-1:-1:-1;;;7850:18:1;;;7843:44;7904:19;;17615:97:0::1;7519:410:1::0;17615:97:0::1;17724:15;;;;;;;;;-1:-1:-1::0;;;;;17724:15:0::1;-1:-1:-1::0;;;;;17724:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17848:92:0::1;::::0;-1:-1:-1;;;17848:92:0;;-1:-1:-1;;;;;17848:39:0;::::1;:92;::::0;::::1;3254:51:1::0;;;17825:10:0;;-1:-1:-1;17848:39:0;-1:-1:-1;17848:39:0::1;::::0;3227:18:1;;17848:92:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17953:54:0::1;::::0;-1:-1:-1;;;17953:54:0;;18001:4:::1;17953:54;::::0;::::1;3254:51:1::0;-1:-1:-1;;;;;17953:39:0;::::1;::::0;-1:-1:-1;17953:39:0::1;::::0;-1:-1:-1;3227:18:1;;17953:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18058:13:0::1;::::0;18018:54:::1;::::0;-1:-1:-1;;;18018:54:0;;-1:-1:-1;;;;;18058:13:0;;::::1;18018:54;::::0;::::1;3254:51:1::0;18018:39:0;;::::1;::::0;-1:-1:-1;18018:39:0::1;::::0;-1:-1:-1;3227:18:1;;18018:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18083:51:0::1;::::0;-1:-1:-1;;;18083:51:0;;14896:42:::1;18083:51;::::0;::::1;3254::1::0;-1:-1:-1;;;;;18083:39:0;::::1;::::0;-1:-1:-1;18083:39:0::1;::::0;-1:-1:-1;3227:18:1;;18083:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18145:15:0::1;:36:::0;;-1:-1:-1;;;;;;18145:36:0::1;-1:-1:-1::0;;;;;18145:36:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;17537:652:0:o;6133:104::-;6189:13;6222:7;6215:14;;;;;:::i;15798:423::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;15851:15:::1;15885:42;15851:78;;15940:13;15965:7;-1:-1:-1::0;;;;;15965:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15956:38:0::1;;16003:4;16010:7;-1:-1:-1::0;;;;;16010:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15956:69;::::0;-1:-1:-1;;;;;;15956:69:0::1;::::0;;;;;;-1:-1:-1;;;;;8420:15:1;;;15956:69:0::1;::::0;::::1;8402:34:1::0;8472:15;;8452:18;;;8445:43;8337:18;;15956:69:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16038:6;:16:::0;;-1:-1:-1;;;;;16038:16:0;;::::1;-1:-1:-1::0;;;;;;16038:16:0;;::::1;;::::0;;;16065:13:::1;:21:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;16099:40:0;;;:25:::1;:40;::::0;;;;;;:47;;-1:-1:-1;;16099:47:0::1;-1:-1:-1::0;16099:47:0::1;::::0;;16160:15:::1;::::0;16197:13;;16160:51;;-1:-1:-1;;;16160:51:0;;16197:13;;::::1;16160:51;::::0;::::1;3254::1::0;16065:21:0;;-1:-1:-1;16160:15:0;::::1;::::0;:36:::1;::::0;3227:18:1;;16160:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;7595:216:::0;7717:4;7739:42;900:10;7763:9;7774:6;7739:9;:42::i;17269:260::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;17388:4:::1;17372:13;7122:12:::0;;;7034:108;17372:13:::1;:20;;;;:::i;:::-;17359:9;:33;;17351:119;;;::::0;-1:-1:-1;;;17351:119:0;;8923:2:1;17351:119:0::1;::::0;::::1;8905:21:1::0;8962:2;8942:18;;;8935:30;9001:34;8981:18;;;8974:62;9072:34;9052:18;;;9045:62;-1:-1:-1;;;9123:19:1;;;9116:40;9173:19;;17351:119:0::1;8721:477:1::0;17351:119:0::1;17503:18;:9:::0;17515:6:::1;17503:18;:::i;:::-;17482;:39:::0;-1:-1:-1;17269:260:0:o;1724:192::-;1472:6;;-1:-1:-1;;;;;1472:6:0;900:10;1534:23;1526:68;;;;-1:-1:-1;;;1526:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1813:22:0;::::1;1805:73;;;::::0;-1:-1:-1;;;1805:73:0;;9405:2:1;1805:73:0::1;::::0;::::1;9387:21:1::0;9444:2;9424:18;;;9417:30;9483:34;9463:18;;;9456:62;-1:-1:-1;;;9534:18:1;;;9527:36;9580:19;;1805:73:0::1;9203:402:1::0;1805:73:0::1;1889:19;1899:8;1889:9;:19::i;12361:380::-:0;-1:-1:-1;;;;;12497:19:0;;12489:68;;;;-1:-1:-1;;;12489:68:0;;9812:2:1;12489:68:0;;;9794:21:1;9851:2;9831:18;;;9824:30;9890:34;9870:18;;;9863:62;-1:-1:-1;;;9941:18:1;;;9934:34;9985:19;;12489:68:0;9610:400:1;12489:68:0;-1:-1:-1;;;;;12576:21:0;;12568:68;;;;-1:-1:-1;;;12568:68:0;;10217:2:1;12568:68:0;;;10199:21:1;10256:2;10236:18;;;10229:30;10295:34;10275:18;;;10268:62;-1:-1:-1;;;10346:18:1;;;10339:32;10388:19;;12568:68:0;10015:398:1;12568:68:0;-1:-1:-1;;;;;12649:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12701:32;;2579:25:1;;;12701:32:0;;2552:18:1;12701:32:0;;;;;;;;12361:380;;;:::o;37573:181::-;37631:7;;37663:5;37667:1;37663;:5;:::i;:::-;37651:17;;37692:1;37687;:6;;37679:46;;;;-1:-1:-1;;;37679:46:0;;10750:2:1;37679:46:0;;;10732:21:1;10789:2;10769:18;;;10762:30;10828:29;10808:18;;;10801:57;10875:18;;37679:46:0;10548:351:1;37679:46:0;37745:1;37573:181;-1:-1:-1;;;37573:181:0:o;18478:3417::-;-1:-1:-1;;;;;18610:18:0;;18602:68;;;;-1:-1:-1;;;18602:68:0;;;;;;;:::i;:::-;18694:13;;-1:-1:-1;;;;;18686:21:0;;;18694:13;;18686:21;18683:131;;18745:4;-1:-1:-1;;;;;18731:19:0;;;18723:79;;;;-1:-1:-1;;;18723:79:0;;11512:2:1;18723:79:0;;;11494:21:1;11551:2;11531:18;;;11524:30;11590:34;11570:18;;;11563:62;-1:-1:-1;;;11641:18:1;;;11634:45;11696:19;;18723:79:0;11310:411:1;18723:79:0;18830:6;18840:1;18830:11;18826:2840;;18858:28;18874:4;18880:2;18884:1;18858:15;:28::i;:::-;18478:3417;;;:::o;18826:2840::-;18944:8;;-1:-1:-1;;;18944:8:0;;;;18943:9;:38;;;;-1:-1:-1;;;;;;18957:24:0;;;;;;:18;:24;;;;;;;;18956:25;18943:38;:65;;;;-1:-1:-1;;;;;;18986:22:0;;;;;;:18;:22;;;;;;;;18985:23;18943:65;18925:2741;;;-1:-1:-1;;;;;19052:29:0;;;19035:14;19052:29;;;:25;:29;;;;;;;19112:31;;;;;;;;19052:29;;;;;19112:31;19052:29;19184:120;;;;-1:-1:-1;19297:6:0;;-1:-1:-1;;;;;19281:23:0;;;19297:6;;19281:23;;19184:120;19162:1264;;;-1:-1:-1;;;;;19425:24:0;;;;;;:18;:24;;;;;:35;;;19406:15;:54;;;;:93;;-1:-1:-1;;;;;;19464:24:0;;19498:1;19464:24;;;:18;:24;;;;;:31;:35;;19406:93;19403:211;;;-1:-1:-1;;;;;19560:24:0;;;;;;:18;:24;;;;;:31;19540:52;;:15;19579:4;19540:9;:15::i;:::-;:19;;:52::i;:::-;19529:6;:64;;19521:73;;;;;;19649:1;19634:12;:16;;;19669:19;:23;19730:14;;19711:16;:33;19785:17;;19763:19;:39;19162:1264;;;19861:8;:50;;;;-1:-1:-1;19904:6:0;;-1:-1:-1;;;;;19890:21:0;;;19904:6;;19890:21;;19861:50;19839:587;;;19962:9;;19947:12;:24;20013:16;;19991:19;:38;20071:16;;20049:19;:38;19839:587;;;-1:-1:-1;;;;;20196:24:0;;;;;;:18;:24;;;;;:35;;;20177:15;:54;;;;:93;;-1:-1:-1;;;;;;20235:24:0;;20269:1;20235:24;;;:18;:24;;;;;:31;:35;;20177:93;20174:237;;;-1:-1:-1;;;;;20331:24:0;;;;;;:18;:24;;;;;:31;20311:52;;:15;20350:4;20311:9;:15::i;:52::-;20300:6;:64;;20292:99;;;;-1:-1:-1;;;20292:99:0;;11928:2:1;20292:99:0;;;11910:21:1;11967:2;11947:18;;;11940:30;-1:-1:-1;;;11986:18:1;;;11979:52;12048:18;;20292:99:0;11726:346:1;20292:99:0;20457:28;20488:24;20506:4;20488:9;:24::i;:::-;20568:18;;20457:55;;-1:-1:-1;20544:42:0;;;;;;;20619:43;;-1:-1:-1;;;;;;20631:31:0;;;;;;:25;:31;;;;;;;;20630:32;20619:43;20615:348;;;20683:8;:15;;-1:-1:-1;;;;20683:15:0;-1:-1:-1;;;20683:15:0;;;:8;20736:18;20719:36;;:16;:36::i;:::-;20776:29;20789:15;;20776:12;:29::i;:::-;20826:44;20851:18;;20826:24;:44::i;:::-;20891:19;:17;:19::i;:::-;20931:8;:16;;-1:-1:-1;;;;20931:16:0;;;20615:348;20979:20;21002:33;21031:3;21002:24;21013:12;;21002:6;:10;;:24;;;;:::i;:::-;:28;;:33::i;:::-;20979:56;;21050:23;21076:40;21112:3;21076:31;21087:19;;21076:6;:10;;:31;;;;:::i;:40::-;21050:66;;21131:20;21154:37;21187:3;21154:28;21165:16;;21154:6;:10;;:28;;;;:::i;:37::-;21131:60;;21206:27;21236:40;21272:3;21236:31;21247:19;;21236:6;:10;;:31;;;;:::i;:40::-;21206:70;;21327:15;21305:18;;:37;;;;;;;:::i;:::-;;;;;;;;21376:12;21357:15;;:31;;;;;;;:::i;:::-;;;;;;;;21425:19;21403:18;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;21461:12:0;;-1:-1:-1;21524:19:0;21509:12;21476:30;21491:15;21476:12;:30;:::i;:::-;:45;;;;:::i;:::-;:67;;;;:::i;:::-;21461:82;-1:-1:-1;21567:16:0;:6;21461:82;21567:10;:16::i;:::-;21558:25;;21598:42;21614:4;21628;21635;21598:15;:42::i;:::-;19020:2646;;;;;;;;;18925:2741;21678:33;21694:4;21700:2;21704:6;21678:15;:33::i;:::-;21728:15;;-1:-1:-1;;;;;21728:15:0;:26;21763:4;21770:15;21763:4;21770:9;:15::i;:::-;21728:58;;-1:-1:-1;;;;;;21728:58:0;;;;;;;-1:-1:-1;;;;;12285:32:1;;;21728:58:0;;;12267:51:1;12334:18;;;12327:34;12240:18;;21728:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21724:74;21812:15;;-1:-1:-1;;;;;21812:15:0;:26;21847:2;21852:13;21847:2;21852:9;:13::i;:::-;21812:54;;-1:-1:-1;;;;;;21812:54:0;;;;;;;-1:-1:-1;;;;;12285:32:1;;;21812:54:0;;;12267:51:1;12334:18;;;12327:34;12240:18;;21812:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21808:70;;;18478:3417;;;:::o;38476:192::-;38562:7;38598:12;38590:6;;;;38582:29;;;;-1:-1:-1;;;38582:29:0;;;;;;;;:::i;:::-;-1:-1:-1;38622:9:0;38634:5;38638:1;38634;:5;:::i;:::-;38622:17;38476:192;-1:-1:-1;;;;;38476:192:0:o;1924:173::-;1999:6;;;-1:-1:-1;;;;;2016:17:0;;;-1:-1:-1;;;;;;2016:17:0;;;;;;;2049:40;;1999:6;;;2016:17;1999:6;;2049:40;;1980:16;;2049:40;1969:128;1924:173;:::o;9860:610::-;-1:-1:-1;;;;;10000:20:0;;9992:70;;;;-1:-1:-1;;;9992:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10081:23:0;;10073:71;;;;-1:-1:-1;;;10073:71:0;;12707:2:1;10073:71:0;;;12689:21:1;12746:2;12726:18;;;12719:30;12785:34;12765:18;;;12758:62;-1:-1:-1;;;12836:18:1;;;12829:33;12879:19;;10073:71:0;12505:399:1;10073:71:0;10237:108;10273:6;10237:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10237:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;10217:17:0;;;:9;:17;;;;;;;;;;;:128;;;;10379:20;;;;;;;:32;;10404:6;10379:24;:32::i;:::-;-1:-1:-1;;;;;10356:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10427:35;2579:25:1;;;10356:20:0;;10427:35;;;;;;2552:18:1;10427:35:0;2433:177:1;38037:136:0;38095:7;38122:43;38126:1;38129;38122:43;;;;;;;;;;;;;;;;;:3;:43::i;21903:588::-;21983:23;22009:24;22027:4;22009:9;:24::i;:::-;21983:50;;22071:15;22057:11;:29;22054:66;;;22102:7;21903:588;:::o;22054:66::-;22140:22;22165:21;14896:42;22165:9;:21::i;:::-;22214:55;;-1:-1:-1;;;22214:55:0;;14896:42;22214:55;;;12267:51:1;12334:18;;;12327:34;;;22140:46:0;;-1:-1:-1;22199:12:0;;22229:4;;22214:30;;12240:18:1;;22214:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22199:70;;22282:22;22307:41;22333:14;22307:21;14896:42;22307:9;:21::i;:41::-;22282:66;;22370:7;22367:117;;;22391:33;14896:42;22409:14;22391:5;:33::i;:::-;22462:11;22440:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;21958:533:0;;;;21903:588;:::o;22505:545::-;22593:16;;;22607:1;22593:16;;;;;;;;;22569:21;;22593:16;;;;;;;;;;-1:-1:-1;22593:16:0;22569:40;;22638:4;22620;22625:1;22620:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22620:23:0;;;:7;;;;;;;;;;:23;;;;22664:6;;:13;;;-1:-1:-1;;;22664:13:0;;;;:6;;;;;:11;;:13;;;;;22620:7;;22664:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22654:4;22659:1;22654:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;22654:23:0;;;-1:-1:-1;;;;;22654:23:0;;;;;22698:3;22688:4;22693:1;22688:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22688:13:0;;;:7;;;;;;;;;:13;22746:6;;22714:53;;22731:4;;22746:6;22755:11;22714:8;:53::i;:::-;22806:6;;22942:16;;22806:193;;-1:-1:-1;;;22806:193:0;;-1:-1:-1;;;;;22806:6:0;;;;:60;;:193;;22881:11;;22806:6;;22923:4;;22942:16;;;22973:15;;22806:193;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23031:11;23012:15;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;22505:545:0:o;23058:749::-;23227:21;23142:18;;23285:24;23303:4;23285:9;:24::i;:::-;23259:50;;23347:15;23333:11;:29;23330:66;;;23378:7;;;23058:749;:::o;23330:66::-;23408:53;23425:11;23454:4;23408:16;:53::i;:::-;23489:34;23513:10;23489:21;:34;:::i;:::-;23472:51;;23556:11;23534:18;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;23653:15:0;;23645:52;;23599:14;;23578:18;;-1:-1:-1;;;;;23653:15:0;;;;23599:14;;23578:18;23645:52;23578:18;23645:52;23599:14;23653:15;23645:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23626:71;;;23721:7;23718:80;;;23748:38;;;4139:25:1;;;4195:2;4180:18;;4173:34;;;23748:38:0;;4112:18:1;23748:38:0;;;;;;;23121:686;;;;;23058:749;:::o;24395:252::-;24453:23;24479:24;24497:4;24479:9;:24::i;:::-;24453:50;;24546:1;24527:15;:20;24524:57;;24563:7;24395:252::o;24524:57::-;24627:9;;24593:44;;24610:15;;-1:-1:-1;;;;;24627:9:0;24593:16;:44::i;38927:471::-;38985:7;39230:1;39235;39230:6;39226:47;;-1:-1:-1;39260:1:0;39253:8;;39226:47;39285:9;39297:5;39301:1;39297;:5;:::i;:::-;39285:17;-1:-1:-1;39330:1:0;39321:5;39325:1;39285:17;39321:5;:::i;:::-;:10;39313:56;;;;-1:-1:-1;;;39313:56:0;;14575:2:1;39313:56:0;;;14557:21:1;14614:2;14594:18;;;14587:30;14653:34;14633:18;;;14626:62;-1:-1:-1;;;14704:18:1;;;14697:31;14745:19;;39313:56:0;14373:397:1;39874:132:0;39932:7;39959:39;39963:1;39966;39959:39;;;;;;;;;;;;;;;;;:3;:39::i;11468:455::-;-1:-1:-1;;;;;11552:21:0;;11544:67;;;;-1:-1:-1;;;11544:67:0;;14977:2:1;11544:67:0;;;14959:21:1;15016:2;14996:18;;;14989:30;15055:34;15035:18;;;15028:62;-1:-1:-1;;;15106:18:1;;;15099:31;15147:19;;11544:67:0;14775:397:1;11544:67:0;11707:105;11744:6;11707:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11707:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;11686:18:0;;:9;:18;;;;;;;;;;:126;11838:12;;:24;;11855:6;11838:16;:24::i;:::-;11823:12;:39;11878:37;;2579:25:1;;;11904:1:0;;-1:-1:-1;;;;;11878:37:0;;;;;2567:2:1;2552:18;11878:37:0;;;;;;;11468:455;;:::o;23815:572::-;23973:16;;;23987:1;23973:16;;;;;;;;23949:21;;23973:16;;;;;;;;;;-1:-1:-1;23973:16:0;23949:40;;24018:4;24000;24005:1;24000:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24000:23:0;;;:7;;;;;;;;;;:23;;;;24044:6;;:13;;;-1:-1:-1;;;24044:13:0;;;;:6;;;;;:11;;:13;;;;;24000:7;;24044:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24034:4;24039:1;24034:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24034:23:0;;;:7;;;;;;;;;:23;24102:6;;24070:53;;24087:4;;24102:6;24111:11;24070:8;:53::i;:::-;24162:6;;:217;;-1:-1:-1;;;24162:217:0;;-1:-1:-1;;;;;24162:6:0;;;;:57;;:217;;24234:11;;24162:6;;24304:4;;24331:6;;24353:15;;24162:217;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23886:501;23815:572;;:::o;40502:278::-;40588:7;40623:12;40616:5;40608:28;;;;-1:-1:-1;;;40608:28:0;;;;;;;;:::i;:::-;-1:-1:-1;40647:9:0;40659:5;40663:1;40659;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:367::-;1278:8;1288:6;1342:3;1335:4;1327:6;1323:17;1319:27;1309:55;;1360:1;1357;1350:12;1309:55;-1:-1:-1;1383:20:1;;1426:18;1415:30;;1412:50;;;1458:1;1455;1448:12;1412:50;1495:4;1487:6;1483:17;1471:29;;1555:3;1548:4;1538:6;1535:1;1531:14;1523:6;1519:27;1515:38;1512:47;1509:67;;;1572:1;1569;1562:12;1509:67;1215:367;;;;;:::o;1587:841::-;1718:6;1726;1734;1742;1750;1803:2;1791:9;1782:7;1778:23;1774:32;1771:52;;;1819:1;1816;1809:12;1771:52;1859:9;1846:23;1888:18;1929:2;1921:6;1918:14;1915:34;;;1945:1;1942;1935:12;1915:34;1984:70;2046:7;2037:6;2026:9;2022:22;1984:70;:::i;:::-;2073:8;;-1:-1:-1;1958:96:1;-1:-1:-1;2161:2:1;2146:18;;2133:32;;-1:-1:-1;2177:16:1;;;2174:36;;;2206:1;2203;2196:12;2174:36;;2245:72;2309:7;2298:8;2287:9;2283:24;2245:72;:::i;:::-;1587:841;;;;-1:-1:-1;2336:8:1;2418:2;2403:18;2390:32;;1587:841;-1:-1:-1;;;;1587:841:1:o;2615:456::-;2692:6;2700;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2816:9;2803:23;2835:31;2860:5;2835:31;:::i;:::-;2885:5;-1:-1:-1;2942:2:1;2927:18;;2914:32;2955:33;2914:32;2955:33;:::i;:::-;2615:456;;3007:7;;-1:-1:-1;;;3061:2:1;3046:18;;;;3033:32;;2615:456::o;3505:247::-;3564:6;3617:2;3605:9;3596:7;3592:23;3588:32;3585:52;;;3633:1;3630;3623:12;3585:52;3672:9;3659:23;3691:31;3716:5;3691:31;:::i;4218:180::-;4277:6;4330:2;4318:9;4309:7;4305:23;4301:32;4298:52;;;4346:1;4343;4336:12;4298:52;-1:-1:-1;4369:23:1;;4218:180;-1:-1:-1;4218:180:1:o;4403:388::-;4471:6;4479;4532:2;4520:9;4511:7;4507:23;4503:32;4500:52;;;4548:1;4545;4538:12;4500:52;4587:9;4574:23;4606:31;4631:5;4606:31;:::i;:::-;4656:5;-1:-1:-1;4713:2:1;4698:18;;4685:32;4726:33;4685:32;4726:33;:::i;:::-;4778:7;4768:17;;;4403:388;;;;;:::o;5019:356::-;5221:2;5203:21;;;5240:18;;;5233:30;5299:34;5294:2;5279:18;;5272:62;5366:2;5351:18;;5019:356::o;5590:380::-;5669:1;5665:12;;;;5712;;;5733:61;;5787:4;5779:6;5775:17;5765:27;;5733:61;5840:2;5832:6;5829:14;5809:18;5806:38;5803:161;;5886:10;5881:3;5877:20;5874:1;5867:31;5921:4;5918:1;5911:15;5949:4;5946:1;5939:15;5803:161;;5590:380;;;:::o;5975:127::-;6036:10;6031:3;6027:20;6024:1;6017:31;6067:4;6064:1;6057:15;6091:4;6088:1;6081:15;6107:127;6168:10;6163:3;6159:20;6156:1;6149:31;6199:4;6196:1;6189:15;6223:4;6220:1;6213:15;6239:168;6312:9;;;6343;;6360:15;;;6354:22;;6340:37;6330:71;;6381:18;;:::i;6792:277::-;6859:6;6912:2;6900:9;6891:7;6887:23;6883:32;6880:52;;;6928:1;6925;6918:12;6880:52;6960:9;6954:16;7013:5;7006:13;6999:21;6992:5;6989:32;6979:60;;7035:1;7032;7025:12;7074:135;7113:3;7134:17;;;7131:43;;7154:18;;:::i;:::-;-1:-1:-1;7201:1:1;7190:13;;7074:135::o;7934:251::-;8004:6;8057:2;8045:9;8036:7;8032:23;8028:32;8025:52;;;8073:1;8070;8063:12;8025:52;8105:9;8099:16;8124:31;8149:5;8124:31;:::i;8499:217::-;8539:1;8565;8555:132;;8609:10;8604:3;8600:20;8597:1;8590:31;8644:4;8641:1;8634:15;8672:4;8669:1;8662:15;8555:132;-1:-1:-1;8701:9:1;;8499:217::o;10418:125::-;10483:9;;;10504:10;;;10501:36;;;10517:18;;:::i;10904:401::-;11106:2;11088:21;;;11145:2;11125:18;;;11118:30;11184:34;11179:2;11164:18;;11157:62;-1:-1:-1;;;11250:2:1;11235:18;;11228:35;11295:3;11280:19;;10904:401::o;12372:128::-;12439:9;;;12460:11;;;12457:37;;;12474:18;;:::i;13320:461::-;13373:3;13411:5;13405:12;13438:6;13433:3;13426:19;13464:4;13493:2;13488:3;13484:12;13477:19;;13530:2;13523:5;13519:14;13551:1;13561:195;13575:6;13572:1;13569:13;13561:195;;;13640:13;;-1:-1:-1;;;;;13636:39:1;13624:52;;13696:12;;;;13731:15;;;;13672:1;13590:9;13561:195;;;-1:-1:-1;13772:3:1;;13320:461;-1:-1:-1;;;;;13320:461:1:o;13786:582::-;14085:6;14074:9;14067:25;14128:6;14123:2;14112:9;14108:18;14101:34;14171:3;14166:2;14155:9;14151:18;14144:31;14048:4;14192:57;14244:3;14233:9;14229:19;14221:6;14192:57;:::i;:::-;-1:-1:-1;;;;;14285:32:1;;;;14280:2;14265:18;;14258:60;-1:-1:-1;14349:3:1;14334:19;14327:35;14184:65;13786:582;-1:-1:-1;;;13786:582:1:o
Swarm Source
ipfs://afa9414a8b43f72a06226a5750c204ae873fb796fefee21954022751dc0f2279
Loading...
Loading
Loading...
Loading
Net Worth in USD
$10.61
Net Worth in ETH
0.00521
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,036.17 | 0.00521 | $10.61 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.