ETH Price: $2,306.83 (-0.39%)

Token

People Token ($PETOK)
 

Overview

Max Total Supply

1,000,000,000,000 $PETOK

Holders

40

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
578,650,301 $PETOK

Value
$0.00
0xb530ac7754169d27f7a6c7c8aa335059493972dd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PETOK

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-07
*/

// ░██████╗░█████╗░███████╗██╗░░░██╗  ██████╗░██╗░░░██╗
// ██╔════╝██╔══██╗██╔════╝██║░░░██║  ██╔══██╗╚██╗░██╔╝
// ╚█████╗░███████║█████╗░░██║░░░██║  ██████╦╝░╚████╔╝░
// ░╚═══██╗██╔══██║██╔══╝░░██║░░░██║  ██╔══██╗░░╚██╔╝░░
// ██████╔╝██║░░██║██║░░░░░╚██████╔╝  ██████╦╝░░░██║░░░
// ╚═════╝░╚═╝░░╚═╝╚═╝░░░░░░╚═════╝░  ╚═════╝░░░░╚═╝░░░

// ░█████╗░░█████╗░██╗███╗░░██╗░██████╗██╗░░░██╗██╗░░░░░████████╗░░░███╗░░██╗███████╗████████╗
// ██╔══██╗██╔══██╗██║████╗░██║██╔════╝██║░░░██║██║░░░░░╚══██╔══╝░░░████╗░██║██╔════╝╚══██╔══╝
// ██║░░╚═╝██║░░██║██║██╔██╗██║╚█████╗░██║░░░██║██║░░░░░░░░██║░░░░░░██╔██╗██║█████╗░░░░░██║░░░
// ██║░░██╗██║░░██║██║██║╚████║░╚═══██╗██║░░░██║██║░░░░░░░░██║░░░░░░██║╚████║██╔══╝░░░░░██║░░░
// ╚█████╔╝╚█████╔╝██║██║░╚███║██████╔╝╚██████╔╝███████╗░░░██║░░░██╗██║░╚███║███████╗░░░██║░░░
// ░╚════╝░░╚════╝░╚═╝╚═╝░░╚══╝╚═════╝░░╚═════╝░╚══════╝░░░╚═╝░░░╚═╝╚═╝░░╚══╝╚══════╝░░░╚═╝░░░

// SAFU By Coinsult

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    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;
    }
    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;
    }
    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;
    }
    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 abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

library IterableMapping {
    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();
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _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);
    }

    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);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns(uint256);
    function withdrawDividend() external;
  
    event DividendsDistributed(
        address indexed from,
        uint256 weiAmount
    );
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner) external view returns(uint256);
    function withdrawnDividendOf(address _owner) external view returns(uint256);
    function accumulativeDividendOf(address _owner) external view returns(uint256);
}

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 constant internal magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    
    address public immutable rewardToken;
    
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    constructor(string memory _name, string memory _symbol, address _rewardToken) ERC20(_name, _symbol) { 
        rewardToken = _rewardToken;
    }

    function distributeDividends(uint256 amount) public onlyOwner{
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(user, _withdrawableDividend);

            if(!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            }

            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner) public view override returns(uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns(uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view override returns(uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns(uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    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);
        }
    }
}

contract DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    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(uint256 minBalance, address _rewardToken) DividendPayingToken("Reward Tracker", "DividendTracker", _rewardToken) {
        claimWait = 3600;
        minimumTokenBalanceForDividends = minBalance * 10 ** 9;
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(false, "withdrawDividend disabled. Use the 'claim' function on the main contract.");
    }

    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance;
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function setLastProcessedIndex(uint256 index) external onlyOwner {
        lastProcessedIndex = index;
    }

    function getLastProcessedIndex() external view returns(uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if(lastClaimTime > block.timestamp)  {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if(excludedFromDividends[account]) {
            return;
        }

        if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if(numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while(gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if(canAutoClaim(lastClaimTimes[account])) {
                if(processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if(gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

        if(amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

contract PETOK is ERC20, Ownable {
    uint256 public liquidityFeeOnBuy;
    uint256 public marketingFeeOnBuy;
    uint256 public rewardsFeeOnBuy;

    uint256 private totalBuyFee;

    uint256 public liquidityFeeOnSell;
    uint256 public marketingFeeOnSell;
    uint256 public rewardsFeeOnSell;

    uint256 private totalSellFee;

    address public marketingWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;
    
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool    private swapping;
    uint256 public swapTokensAtAmount;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public automatedMarketMakerPairs;

    DividendTracker public dividendTracker;
    address public immutable rewardToken;
    uint256 public gasForProcessing = 300_000;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event MarketingWalletChanged(address marketingWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SellFeesUpdated(uint256 totalSellFee);
    event BuyFeesUpdated(uint256 totalBuyFee);
    event TransferFeesUpdated(uint256 fee1, uint256 fee2);

    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendMarketing(uint256 ethSend);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SendDividends(uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() payable ERC20("People Token", "$PETOK") {

        rewardToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // USDT

        liquidityFeeOnBuy       = 1;
        marketingFeeOnBuy       = 4;
        rewardsFeeOnBuy         = 3;

        totalBuyFee         = liquidityFeeOnBuy + marketingFeeOnBuy + rewardsFeeOnBuy;

        liquidityFeeOnSell      = 1;
        marketingFeeOnSell      = 5;
        rewardsFeeOnSell        = 5;

        totalSellFee        = liquidityFeeOnSell + marketingFeeOnSell + rewardsFeeOnSell;

        marketingWallet = 0x7E36E9bCE0a8664691a8a42Ef22BD8B2CA484C72;

        dividendTracker = new DividendTracker(1_000_000_000, rewardToken);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // UNISWAP Mainnet
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair   = _uniswapV2Pair;

        _approve(address(this), address(uniswapV2Router), type(uint256).max);

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[marketingWallet] = true;

        maxTransactionLimitEnabled = true;

        _isExcludedFromMaxTxLimit[owner()] = true;
        _isExcludedFromMaxTxLimit[address(this)] = true;
        _isExcludedFromMaxTxLimit[address(0xdead)] = true;
        _isExcludedFromMaxTxLimit[marketingWallet] = true;
        _isExcludedFromMaxTxLimit[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true; //pinklock
    
        _mint(owner(), 1e12 * (10 ** 9));
        swapTokensAtAmount = totalSupply() / 5_000;

        maxTransactionAmountBuy     = totalSupply() * 30 / 1000;
        maxTransactionAmountSell    = totalSupply() * 30 / 1000;
    }

    receive() external payable {

    }

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim native tokens");
        if (token == address(0x0)) {
            payable(msg.sender).transfer(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendETH(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "Account is already set to that state");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function updateBuyFees(uint256 _liquidityFeeOnBuy, uint256 _marketingFeeOnBuy, uint256 _rewardsFeeOnBuy) external onlyOwner {
        liquidityFeeOnBuy   = _liquidityFeeOnBuy;
        marketingFeeOnBuy    = _marketingFeeOnBuy;
        rewardsFeeOnBuy     = _rewardsFeeOnBuy;

        totalBuyFee = _liquidityFeeOnBuy + _marketingFeeOnBuy + _rewardsFeeOnBuy;

        require(totalBuyFee <= 8, "Buy fee cannot be more than 8%");

        emit BuyFeesUpdated(totalBuyFee);
    }

    function updateSellFees(uint256 _liquidityFeeOnSell, uint256 _marketingFeeOnSell, uint256 _rewardsFeeOnSell) external onlyOwner {
        liquidityFeeOnSell   = _liquidityFeeOnSell;
        marketingFeeOnSell    = _marketingFeeOnSell;
        rewardsFeeOnSell     = _rewardsFeeOnSell;

        totalSellFee = _liquidityFeeOnSell + _marketingFeeOnSell + _rewardsFeeOnSell;

        require(totalSellFee <= 11, "Sell fee cannot be more than 11%");

        emit SellFeesUpdated(totalSellFee);
    }

    function changeMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != marketingWallet, "Marketing wallet is already that address");
        require(!isContract(_marketingWallet), "Marketing wallet cannot be a contract");
        require(_marketingWallet != DEAD, "Marketing wallet cannot be the zero address");
        marketingWallet = _marketingWallet;
        emit MarketingWalletChanged(marketingWallet);
    }

    bool public tradingEnabled;

    function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(tradingEnabled || _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet enabled!");

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (maxTransactionLimitEnabled) 
        {
            if ((from == uniswapV2Pair || to == uniswapV2Pair) &&
                !_isExcludedFromMaxTxLimit[from] && 
                !_isExcludedFromMaxTxLimit[to]
            ) {
                if (from == uniswapV2Pair) {
                    require(
                        amount <= maxTransactionAmountBuy,  
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                } else {
                    require(
                        amount <= maxTransactionAmountSell, 
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( canSwap &&
            !swapping &&
            automatedMarketMakerPairs[to] &&
            totalBuyFee + totalSellFee > 0
        ) {
            swapping = true;
            
            uint256 liquidityTokens;

            if(liquidityFeeOnBuy + liquidityFeeOnSell > 0) {
                liquidityTokens = contractTokenBalance * (liquidityFeeOnBuy + liquidityFeeOnSell) / 100;
                swapAndLiquify(liquidityTokens);
            }

            contractTokenBalance -= liquidityTokens;

            uint256 ethShare = (marketingFeeOnBuy + marketingFeeOnSell) + (rewardsFeeOnBuy + rewardsFeeOnSell);
            
            if(contractTokenBalance > 0 && ethShare > 0) {
                uint256 initialBalance = address(this).balance;

                address[] memory path = new address[](2);
                path[0] = address(this);
                path[1] = uniswapV2Router.WETH();

                uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                    contractTokenBalance,
                    0,
                    path,
                    address(this),
                    block.timestamp);
                
                uint256 newBalance = address(this).balance - initialBalance;

                if((marketingFeeOnBuy + marketingFeeOnSell) > 0) {
                    uint256 marketingETH = newBalance * (marketingFeeOnBuy + marketingFeeOnSell) / ethShare;
                    sendETH(payable(marketingWallet), marketingETH);
                    emit SendMarketing(marketingETH);
                }

                if((rewardsFeeOnBuy + rewardsFeeOnSell) > 0) {
                    uint256 rewardETH = newBalance * (rewardsFeeOnBuy + rewardsFeeOnSell) / ethShare;
                    swapAndSendDividends(rewardETH);
                }
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 _totalFees;
            if(from == uniswapV2Pair) {
                _totalFees = totalBuyFee;
            } else if (to == uniswapV2Pair){
                _totalFees = totalSellFee;
            } else{
                _totalFees = 0;
            }
            uint256 fees = amount * _totalFees / 100;
            
            amount = amount - 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 {}

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp);
        
        uint256 newBalance = address(this).balance - initialBalance;

        uniswapV2Router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        );

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapAndSendDividends(uint256 amount) private{
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = rewardToken;

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            address(this),
            block.timestamp
        );
        
        uint256 balanceRewardToken = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(address(dividendTracker), balanceRewardToken);

        if (success) {
            dividendTracker.distributeDividends(balanceRewardToken);
            emit SendDividends(balanceRewardToken);
        }
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
        require(newAmount > totalSupply() / 100_000, "SwapTokensAtAmount must be greater than 0.001% of total supply");
        swapTokensAtAmount = newAmount;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200_000 && newValue <= 500_000, "gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner {
        dividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "claimWait must be updated to between 1 and 24 hours");
        dividendTracker.updateClaimWait(newClaimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function totalRewardsEarned(address account) public view returns (uint256) {
        return dividendTracker.accumulativeDividendOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner{
        dividendTracker.excludeFromDividends(account);
    }

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function claimAddress(address claimee) external onlyOwner {
        dividendTracker.processAccount(payable(claimee), false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function setLastProcessedIndex(uint256 index) external onlyOwner {
        dividendTracker.setLastProcessedIndex(index);
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    mapping(address => bool) private _isExcludedFromMaxTxLimit;
    bool    public  maxTransactionLimitEnabled;
    uint256 public  maxTransactionAmountBuy;
    uint256 public  maxTransactionAmountSell;

    event ExcludedFromMaxTransactionLimit(address indexed account, bool isExcluded);
    event MaxTransactionLimitStateChanged(bool maxTransactionLimit);
    event MaxTransactionLimitAmountChanged(uint256 maxTransactionAmountBuy, uint256 maxTransactionAmountSell);

    function setEnableMaxTransactionLimit(bool enable) external onlyOwner {
        require(enable != maxTransactionLimitEnabled, "Max transaction limit is already set to that state");
        maxTransactionLimitEnabled = enable;

        emit MaxTransactionLimitStateChanged(maxTransactionLimitEnabled);
    }

    function setMaxTransactionAmounts(uint256 _maxTransactionAmountBuy, uint256 _maxTransactionAmountSell) external onlyOwner {
        require(
            _maxTransactionAmountBuy  >= (totalSupply() / (10 ** decimals())) / 1_000 && 
            _maxTransactionAmountSell >= (totalSupply() / (10 ** decimals())) / 1_000, 
            "Max Transaction limis cannot be lower than 0.1% of total supply"
        ); 
        maxTransactionAmountBuy  = _maxTransactionAmountBuy  * (10 ** decimals());
        maxTransactionAmountSell = _maxTransactionAmountSell * (10 ** decimals());

        emit MaxTransactionLimitAmountChanged(maxTransactionAmountBuy, maxTransactionAmountSell);
    }

    function excludeFromMaxTransactionLimit(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxTxLimit[account] != exclude, "Account is already set to that state");
        _isExcludedFromMaxTxLimit[account] = exclude;

        emit ExcludedFromMaxTransactionLimit(account, exclude);
    }

    function isExcludedFromMaxTransaction(address account) public view returns(bool) {
        return _isExcludedFromMaxTxLimit[account];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBuyFee","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountSell","type":"uint256"}],"name":"MaxTransactionLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxTransactionLimit","type":"bool"}],"name":"MaxTransactionLimitStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalSellFee","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethSend","type":"uint256"}],"name":"SendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee2","type":"uint256"}],"name":"TransferFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimee","type":"address"}],"name":"claimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLastProcessedIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmountBuy","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmountSell","type":"uint256"}],"name":"setMaxTransactionAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"totalRewardsEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_rewardsFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_rewardsFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

620493e0601555600c60a09081526b2832b7b83632902a37b5b2b760a11b60c052610120604052600660e090815265245045544f4b60d01b61010052600362000049838262000be8565b50600462000058828262000be8565b505050620000756200006f620006d460201b60201c565b620006d8565b73dac17f958d2ee523a2206206994597c13d831ec760805260016006819055600460078190556003600881905591620000af919062000cca565b620000bb919062000cca565b6009556001600a8190556005600b819055600c81905590620000df90829062000cca565b620000eb919062000cca565b600d55600e80546001600160a01b031916737e36e9bce0a8664691a8a42ef22bd8b2ca484c72179055608051604051633b9aca0091906200012c9062000b36565b9182526001600160a01b03166020820152604001604051809103906000f0801580156200015d573d6000803e3d6000fd5b50601460006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000204919062000ce0565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000278919062000ce0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000ce0565b600f80546001600160a01b038086166001600160a01b0319928316811790935560108054918516919092161790559091506200032d9030906000196200072a565b6200033a81600162000856565b60145460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200038157600080fd5b505af115801562000396573d6000803e3d6000fd5b505060145460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620003e057600080fd5b505af1158015620003f5573d6000803e3d6000fd5b505060145460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200044157600080fd5b505af115801562000456573d6000803e3d6000fd5b505060145460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620004a257600080fd5b505af1158015620004b7573d6000803e3d6000fd5b50505050600160126000620004d1620009ba60201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560129093527f1120e10407cab1193d7c5139d9aae5536deb3d83e855f25f8e42f811c01f56f78054851660019081179091553084528284208054861682179055600e5490911683529082208054841682179055601880549093168117909255601790620005746005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260179093528183208054851660019081179091557f43fedf50e12e5c047fbe3576d03ab50250348e9a6030f531ab6d4ce10f5b03038054861682179055600e549091168352908220805484168217905573407993575c91ce7643a4d4ccacc9a98c36ee1bbe9091527f074a0fd27439428490cc7751d857bc1e8fdca06eda19210ccf4c6048437143cd80549092161790556200065d6200064d6005546001600160a01b031690565b683635c9adc5dea00000620009c9565b6113886200066a60025490565b62000676919062000d0b565b6011556103e86200068660025490565b6200069390601e62000d2e565b6200069f919062000d0b565b6019556103e8620006af60025490565b620006bc90601e62000d2e565b620006c8919062000d0b565b601a555062000d489050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316620007925760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620007f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000789565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503620008ee5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c75650000000000000000606482015260840162000789565b6001600160a01b0382166000908152601360205260409020805460ff191682158015919091179091556200097e5760145460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200096457600080fd5b505af115801562000979573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6001600160a01b03821662000a215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000789565b62000a3d8160025462000aca60201b620020ad1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a70918390620020ad62000aca821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000ad9838562000cca565b90508381101562000b2d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000789565b90505b92915050565b6122cd806200473883390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b6f57607f821691505b60208210810362000b9057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ac557600081815260208120601f850160051c8101602086101562000bbf5750805b601f850160051c820191505b8181101562000be05782815560010162000bcb565b505050505050565b81516001600160401b0381111562000c045762000c0462000b44565b62000c1c8162000c15845462000b5a565b8462000b96565b602080601f83116001811462000c54576000841562000c3b5750858301515b600019600386901b1c1916600185901b17855562000be0565b600085815260208120601f198616915b8281101562000c855788860151825594840194600190910190840162000c64565b508582101562000ca45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000b305762000b3062000cb4565b60006020828403121562000cf357600080fd5b81516001600160a01b038116811462000b2d57600080fd5b60008262000d2957634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141762000b305762000b3062000cb4565b6080516139bf62000d7960003960008181610b4d01528181613002015281816130c2015261316601526139bf6000f3fe6080604052600436106103a65760003560e01c80637b3c83b1116101e7578063b6f7f6811161010d578063e4893fdc116100a0578063f27fd2541161006f578063f27fd25414610afb578063f2fde38b14610b1b578063f7c618c114610b3b578063f9d0831a14610b6f57600080fd5b8063e4893fdc14610a90578063e4f24cb014610aa6578063e7841ec014610ac6578063e98030c714610adb57600080fd5b8063c17b5b8c116100dc578063c17b5b8c146109fe578063dc4c7dbc14610a1e578063dd62ed3e14610a34578063e2f4560514610a7a57600080fd5b8063b6f7f68114610988578063b94315ff146109a8578063bb85c6d1146109be578063c0246668146109de57600080fd5b80639c1b8af511610185578063a9059cbb11610154578063a9059cbb146108b3578063ad56c13c146108d3578063afa4f3b214610938578063b62496f51461095857600080fd5b80639c1b8af514610848578063a26579ad1461085e578063a457c2d714610873578063a8b9d2401461089357600080fd5b8063880bcbc1116101c1578063880bcbc1146107e05780638a8c523c146108005780638da5cb5b1461081557806395d89b411461083357600080fd5b80637b3c83b11461078a5780638095d564146107a0578063871c128d146107c057600080fd5b80633b364da8116102cc57806359136fa51161026a578063700bb19111610239578063700bb191146106ff57806370a082311461071f578063715018a61461075557806375f0a8741461076a57600080fd5b806359136fa51461069e5780635fc2e596146106b457806364b0f653146106ca5780636843cd84146106df57600080fd5b80634ada218b116102a65780634ada218b146106165780634e71d92d146106305780634fbee1931461064557806356a6cabf1461067e57600080fd5b80633b364da8146105b65780633f249df0146105d657806349bd5a5e146105f657600080fd5b8063286b3aa01161034457806330bb4cff1161031357806330bb4cff14610545578063313ce5671461055a57806331e79db014610576578063395093511461059657600080fd5b8063286b3aa0146104d35780632ba86bf2146104f55780632c1f52161461050f5780632ce86fbf1461052f57600080fd5b80631694505e116103805780631694505e1461042d57806318160ddd1461046557806318d9ceae1461047a57806323b872dd146104b357600080fd5b80630105d0fd146103b257806306fdde03146103db578063095ea7b3146103fd57600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103c860195481565b6040519081526020015b60405180910390f35b3480156103e757600080fd5b506103f0610b8f565b6040516103d2919061327a565b34801561040957600080fd5b5061041d6104183660046132dd565b610c21565b60405190151581526020016103d2565b34801561043957600080fd5b50600f5461044d906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b34801561047157600080fd5b506002546103c8565b34801561048657600080fd5b5061041d610495366004613309565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156104bf57600080fd5b5061041d6104ce366004613326565b610c38565b3480156104df57600080fd5b506104f36104ee366004613367565b610ca1565b005b34801561050157600080fd5b5060185461041d9060ff1681565b34801561051b57600080fd5b5060145461044d906001600160a01b031681565b34801561053b57600080fd5b506103c8600a5481565b34801561055157600080fd5b506103c8610d36565b34801561056657600080fd5b50604051600981526020016103d2565b34801561058257600080fd5b506104f3610591366004613309565b610da9565b3480156105a257600080fd5b5061041d6105b13660046132dd565b610e05565b3480156105c257600080fd5b506104f36105d1366004613367565b610e3b565b3480156105e257600080fd5b506104f36105f1366004613309565b610e96565b34801561060257600080fd5b5060105461044d906001600160a01b031681565b34801561062257600080fd5b5060165461041d9060ff1681565b34801561063c57600080fd5b506104f3610f3b565b34801561065157600080fd5b5061041d610660366004613309565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561068a57600080fd5b506104f361069936600461338e565b610fb3565b3480156106aa57600080fd5b506103c8601a5481565b3480156106c057600080fd5b506103c860075481565b3480156106d657600080fd5b506103c861109e565b3480156106eb57600080fd5b506103c86106fa366004613309565b6110e8565b34801561070b57600080fd5b506104f361071a366004613367565b611158565b34801561072b57600080fd5b506103c861073a366004613309565b6001600160a01b031660009081526020819052604090205490565b34801561076157600080fd5b506104f361122a565b34801561077657600080fd5b50600e5461044d906001600160a01b031681565b34801561079657600080fd5b506103c860065481565b3480156107ac57600080fd5b506104f36107bb3660046133ab565b611260565b3480156107cc57600080fd5b506104f36107db366004613367565b611343565b3480156107ec57600080fd5b506104f36107fb3660046133d7565b611485565b34801561080c57600080fd5b506104f361154f565b34801561082157600080fd5b506005546001600160a01b031661044d565b34801561083f57600080fd5b506103f06115db565b34801561085457600080fd5b506103c860155481565b34801561086a57600080fd5b506103c86115ea565b34801561087f57600080fd5b5061041d61088e3660046132dd565b611634565b34801561089f57600080fd5b506103c86108ae366004613309565b611683565b3480156108bf57600080fd5b5061041d6108ce3660046132dd565b6116b6565b3480156108df57600080fd5b506108f36108ee366004613309565b6116c3565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103d2565b34801561094457600080fd5b506104f3610953366004613367565b61175e565b34801561096457600080fd5b5061041d610973366004613309565b60136020526000908152604090205460ff1681565b34801561099457600080fd5b506104f36109a3366004613410565b611818565b3480156109b457600080fd5b506103c8600c5481565b3480156109ca57600080fd5b506104f36109d9366004613309565b611987565b3480156109ea57600080fd5b506104f36109f93660046133d7565b611b43565b348015610a0a57600080fd5b506104f3610a193660046133ab565b611c05565b348015610a2a57600080fd5b506103c8600b5481565b348015610a4057600080fd5b506103c8610a4f366004613432565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a8657600080fd5b506103c860115481565b348015610a9c57600080fd5b506103c860085481565b348015610ab257600080fd5b506103c8610ac1366004613309565b611cdb565b348015610ad257600080fd5b506103c8611d0e565b348015610ae757600080fd5b506104f3610af6366004613367565b611d58565b348015610b0757600080fd5b506108f3610b16366004613367565b611e30565b348015610b2757600080fd5b506104f3610b36366004613309565b611e72565b348015610b4757600080fd5b5061044d7f000000000000000000000000000000000000000000000000000000000000000081565b348015610b7b57600080fd5b506104f3610b8a366004613309565b611f0a565b606060038054610b9e90613460565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90613460565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b6000610c2e338484612113565b5060015b92915050565b6000610c45848484612238565b610c978433610c928560405180606001604052806028815260200161393d602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612a46565b612113565b5060019392505050565b6005546001600160a01b03163314610cd45760405162461bcd60e51b8152600401610ccb9061349a565b60405180910390fd5b60145460405163014359d560e51b8152600481018390526001600160a01b039091169063286b3aa0906024015b600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b5050505050565b601454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da491906134cf565b905090565b6005546001600160a01b03163314610dd35760405162461bcd60e51b8152600401610ccb9061349a565b60145460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d01565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c2e918590610c9290866120ad565b6005546001600160a01b03163314610e655760405162461bcd60e51b8152600401610ccb9061349a565b601454604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401610d01565b6005546001600160a01b03163314610ec05760405162461bcd60e51b8152600401610ccb9061349a565b60145460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3791906134e8565b5050565b60145460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb091906134e8565b50565b6005546001600160a01b03163314610fdd5760405162461bcd60e51b8152600401610ccb9061349a565b60185460ff161515811515036110505760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610ccb565b6018805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf906020015b60405180910390a150565b601454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6014546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611134573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3291906134cf565b6014546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190613505565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146112545760405162461bcd60e51b8152600401610ccb9061349a565b61125e6000612a80565b565b6005546001600160a01b0316331461128a5760405162461bcd60e51b8152600401610ccb9061349a565b600683905560078290556008819055806112a48385613549565b6112ae9190613549565b6009819055600810156113035760405162461bcd60e51b815260206004820152601e60248201527f427579206665652063616e6e6f74206265206d6f7265207468616e20382500006044820152606401610ccb565b7f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60095460405161133691815260200190565b60405180910390a1505050565b6005546001600160a01b0316331461136d5760405162461bcd60e51b8152600401610ccb9061349a565b62030d40811015801561138357506207a1208111155b6113ec5760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610ccb565b60155481036114525760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ccb565b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6005546001600160a01b031633146114af5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b03821660009081526017602052604090205481151560ff9091161515036114ef5760405162461bcd60e51b8152600401610ccb9061355c565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b031633146115795760405162461bcd60e51b8152600401610ccb9061349a565b60165460ff16156115cc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610ccb565b6016805460ff19166001179055565b606060048054610b9e90613460565b60145460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6000610c2e3384610c9285604051806060016040528060258152602001613965602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612a46565b6014546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611117565b6000610c2e338484612238565b60145460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561171f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174391906135a0565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146117885760405162461bcd60e51b8152600401610ccb9061349a565b620186a061179560025490565b61179f919061360a565b81116118135760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610ccb565b601155565b6005546001600160a01b031633146118425760405162461bcd60e51b8152600401610ccb9061349a565b6103e86118516009600a613710565b60025461185e919061360a565b611868919061360a565b821015801561189c57506103e86118816009600a613710565b60025461188e919061360a565b611898919061360a565b8110155b61190e5760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610ccb565b61191a6009600a613710565b611924908361371f565b6019556119336009600a613710565b61193d908261371f565b601a8190556019546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb1319261197b928252602082015260400190565b60405180910390a15050565b6005546001600160a01b031633146119b15760405162461bcd60e51b8152600401610ccb9061349a565b600e546001600160a01b0390811690821603611a205760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610ccb565b6001600160a01b0381163b15611a865760405162461bcd60e51b815260206004820152602560248201527f4d61726b6574696e672077616c6c65742063616e6e6f74206265206120636f6e6044820152641d1c9858dd60da1b6064820152608401610ccb565b61deac196001600160a01b03821601611af55760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610ccb565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001611093565b6005546001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b03821660009081526012602052604090205481151560ff909116151503611bad5760405162461bcd60e51b8152600401610ccb9061355c565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611543565b6005546001600160a01b03163314611c2f5760405162461bcd60e51b8152600401610ccb9061349a565b600a839055600b829055600c81905580611c498385613549565b611c539190613549565b600d819055600b1015611ca85760405162461bcd60e51b815260206004820181905260248201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e203131256044820152606401610ccb565b7f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c55600d5460405161133691815260200190565b6014546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce014790602401611117565b6014546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6005546001600160a01b03163314611d825760405162461bcd60e51b8152600401610ccb9061349a565b610e108110158015611d975750620151808111155b611dff5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b6064820152608401610ccb565b60145460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d01565b601454604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611701565b6005546001600160a01b03163314611e9c5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b038116611f015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ccb565b610fb081612a80565b6005546001600160a01b03163314611f345760405162461bcd60e51b8152600401610ccb9061349a565b306001600160a01b03821603611f8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610ccb565b6001600160a01b038116611fc65760405133904780156108fc02916000818181858888f19350505050158015610f37573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203391906134cf565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906134e8565b50505050565b6000806120ba8385613549565b90508381101561210c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ccb565b9392505050565b6001600160a01b0383166121755760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ccb565b6001600160a01b0382166121d65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ccb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661225e5760405162461bcd60e51b8152600401610ccb90613736565b6001600160a01b0382166122845760405162461bcd60e51b8152600401610ccb9061377b565b60165460ff16806122ad57506001600160a01b03831660009081526012602052604090205460ff165b806122d057506001600160a01b03821660009081526012602052604090205460ff165b61231c5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610ccb565b806000036123355761233083836000612ad2565b505050565b60185460ff1615612417576010546001600160a01b038481169116148061236957506010546001600160a01b038381169116145b801561238e57506001600160a01b03831660009081526017602052604090205460ff16155b80156123b357506001600160a01b03821660009081526017602052604090205460ff16155b15612417576010546001600160a01b03908116908416036123f5576019548111156123f05760405162461bcd60e51b8152600401610ccb906137be565b612417565b601a548111156124175760405162461bcd60e51b8152600401610ccb906137be565b30600090815260208190526040902054601154811080159081906124455750601054600160a01b900460ff16155b801561246957506001600160a01b03841660009081526013602052604090205460ff165b801561248457506000600d546009546124829190613549565b115b15612775576010805460ff60a01b1916600160a01b179055600a5460065460009182916124b19190613549565b11156124e8576064600a546006546124c99190613549565b6124d3908561371f565b6124dd919061360a565b90506124e881612bdb565b6124f2818461381b565b92506000600c546008546125069190613549565b600b546007546125169190613549565b6125209190613549565b90506000841180156125325750600081115b15612765576040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106125705761257061382e565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed9190613844565b816001815181106126005761260061382e565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac947906126469089906000908690309042906004016138a5565b600060405180830381600087803b15801561266057600080fd5b505af1158015612674573d6000803e3d6000fd5b5050505060008247612686919061381b565b90506000600b5460075461269a9190613549565b111561271557600084600b546007546126b39190613549565b6126bd908461371f565b6126c7919061360a565b600e549091506126e0906001600160a01b031682612e26565b6040518181527fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b9060200160405180910390a1505b6000600c546008546127279190613549565b111561276157600084600c546008546127409190613549565b61274a908461371f565b612754919061360a565b905061275f81612f3f565b505b5050505b50506010805460ff60a01b191690555b6010546001600160a01b03861660009081526012602052604090205460ff600160a01b9092048216159116806127c357506001600160a01b03851660009081526012602052604090205460ff165b156127cc575060005b801561284b576010546000906001600160a01b03908116908816036127f45750600954612817565b6010546001600160a01b03908116908716036128135750600d54612817565b5060005b60006064612825838861371f565b61282f919061360a565b905061283b818761381b565b9550612848883083612ad2565b50505b612856868686612ad2565b6014546001600160a01b031663e30443bc87612887816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156128cd57600080fd5b505af19250505080156128de575060015b506014546001600160a01b031663e30443bc86612910816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561295657600080fd5b505af1925050508015612967575060015b50601054600160a01b900460ff16612a3e576015546014546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156129e6575060408051601f3d908101601f191682019092526129e391810190613505565b60015b15612a3c5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b60008184841115612a6a5760405162461bcd60e51b8152600401610ccb919061327a565b506000612a77848661381b565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612af85760405162461bcd60e51b8152600401610ccb90613736565b6001600160a01b038216612b1e5760405162461bcd60e51b8152600401610ccb9061377b565b612b5b81604051806060016040528060268152602001613917602691396001600160a01b0386166000908152602081905260409020549190612a46565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612b8a90826120ad565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161222b565b6000612be860028361360a565b90506000612bf6828461381b565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110612c3057612c3061382e565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cad9190613844565b81600181518110612cc057612cc061382e565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac94790612d069087906000908690309042906004016138a5565b600060405180830381600087803b158015612d2057600080fd5b505af1158015612d34573d6000803e3d6000fd5b5050505060008247612d46919061381b565b600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612db5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612dda9190613505565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b80471015612e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ccb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ec3576040519150601f19603f3d011682016040523d82523d6000602084013e612ec8565b606091505b50509050806123305760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ccb565b6040805160028082526060820183526000926020830190803683375050600f54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcd9190613844565b81600081518110612fe057612fe061382e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106130345761303461382e565b6001600160a01b039283166020918202929092010152600f5460405163b6f9de9560e01b815291169063b6f9de9590849061307a906000908690309042906004016138e1565b6000604051808303818588803b15801561309357600080fd5b505af11580156130a7573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506370a082319150602401602060405180830381865afa158015613113573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313791906134cf565b60145460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156131b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d591906134e8565b905080156120a757601454604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561322357600080fd5b505af1158015613237573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161326c91815260200190565b60405180910390a150505050565b600060208083528351808285015260005b818110156132a75785810183015185820160400152820161328b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fb057600080fd5b600080604083850312156132f057600080fd5b82356132fb816132c8565b946020939093013593505050565b60006020828403121561331b57600080fd5b813561210c816132c8565b60008060006060848603121561333b57600080fd5b8335613346816132c8565b92506020840135613356816132c8565b929592945050506040919091013590565b60006020828403121561337957600080fd5b5035919050565b8015158114610fb057600080fd5b6000602082840312156133a057600080fd5b813561210c81613380565b6000806000606084860312156133c057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156133ea57600080fd5b82356133f5816132c8565b9150602083013561340581613380565b809150509250929050565b6000806040838503121561342357600080fd5b50508035926020909101359150565b6000806040838503121561344557600080fd5b8235613450816132c8565b91506020830135613405816132c8565b600181811c9082168061347457607f821691505b60208210810361349457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156134e157600080fd5b5051919050565b6000602082840312156134fa57600080fd5b815161210c81613380565b60008060006060848603121561351a57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c3257610c32613533565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600080600080600080600080610100898b0312156135bd57600080fd5b88516135c8816132c8565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008261362757634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561366757816000190482111561364d5761364d613533565b8085161561365a57918102915b93841c9390800290613631565b509250929050565b60008261367e57506001610c32565b8161368b57506000610c32565b81600181146136a157600281146136ab576136c7565b6001915050610c32565b60ff8411156136bc576136bc613533565b50506001821b610c32565b5060208310610133831016604e8410600b84101617156136ea575081810a610c32565b6136f4838361362c565b806000190482111561370857613708613533565b029392505050565b600061210c60ff84168361366f565b8082028115828204841417610c3257610c32613533565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b81810381811115610c3257610c32613533565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561385657600080fd5b815161210c816132c8565b600081518084526020808501945080840160005b8381101561389a5781516001600160a01b031687529582019590820190600101613875565b509495945050505050565b85815284602082015260a0604082015260006138c460a0830186613861565b6001600160a01b0394909416606083015250608001529392505050565b8481526080602082015260006138fa6080830186613861565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a86300514d6ebeb9ee67bd4be78fcf6c2ae3b09c35a1ed72b47cbe8c3cf7b13f64736f6c6343000811003360a06040523480156200001157600080fd5b50604051620022cd380380620022cd833981016040819052620000349162000149565b6040518060400160405280600e81526020016d2932bbb0b932102a3930b1b5b2b960911b8152506040518060400160405280600f81526020016e2234bb34b232b7322a3930b1b5b2b960891b81525082828281600390816200009791906200022d565b506004620000a682826200022d565b505050620000c3620000bd620000f360201b60201c565b620000f7565b6001600160a01b03166080525050610e10601155620000e782633b9aca00620002f9565b60125550620003259050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080604083850312156200015d57600080fd5b825160208401519092506001600160a01b03811681146200017d57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b357607f821691505b602082108103620001d457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022857600081815260208120601f850160051c81016020861015620002035750805b601f850160051c820191505b8181101562000224578281556001016200020f565b5050505b505050565b81516001600160401b0381111562000249576200024962000188565b62000261816200025a84546200019e565b84620001da565b602080601f831160018114620002995760008415620002805750858301515b600019600386901b1c1916600185901b17855562000224565b600085815260208120601f198616915b82811015620002ca57888601518255948401946001909101908401620002a9565b5085821015620002e95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176200031f57634e487b7160e01b600052601160045260246000fd5b92915050565b608051611f85620003486000396000818161055401526117e20152611f856000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063bc4c4b37116100b8578063e98030c71161007c578063e98030c714610529578063f2fde38b1461053c578063f7c618c11461054f578063fbcbc0f114610576578063ffb2c4791461058957600080fd5b8063bc4c4b37146104b9578063be10b614146104cc578063dd62ed3e146104d5578063e30443bc1461050e578063e7841ec01461052157600080fd5b806395d89b41116100ff57806395d89b411461044f578063a457c2d714610457578063a8b9d2401461046a578063a9059cbb1461047d578063aafd847a1461049057600080fd5b8063715018a61461040657806385a6b3ae1461040e5780638da5cb5b1461041757806391b89fba1461043c57600080fd5b80633009a609116101be5780634e7b827f116101825780634e7b827f146103515780635183d6fd146103745780636a474002146103cc5780636f2789ec146103d457806370a08231146103dd57600080fd5b80633009a60914610300578063313ce5671461030957806331e79db0146103185780633243c7911461032b578063395093511461033e57600080fd5b806318160ddd1161020557806318160ddd1461029f578063226cfa3d146102a757806323b872dd146102c757806327ce0147146102da578063286b3aa0146102ed57600080fd5b806306fdde0314610237578063095ea7b31461025557806309bbedde146102785780630dcb2e891461028a575b600080fd5b61023f6105b7565b60405161024c9190611bb7565b60405180910390f35b610268610263366004611c1a565b610649565b604051901515815260200161024c565b600a545b60405190815260200161024c565b61029d610298366004611c46565b610660565b005b60025461027c565b61027c6102b5366004611c5f565b60106020526000908152604090205481565b6102686102d5366004611c7c565b610722565b61027c6102e8366004611c5f565b61078b565b61029d6102fb366004611c46565b6107e7565b61027c600e5481565b6040516009815260200161024c565b61029d610326366004611c5f565b610816565b61029d610339366004611c46565b61093d565b61026861034c366004611c1a565b6109fb565b61026861035f366004611c5f565b600f6020526000908152604090205460ff1681565b610387610382366004611c46565b610a31565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161024c565b61029d610b85565b61027c60115481565b61027c6103eb366004611c5f565b6001600160a01b031660009081526020819052604090205490565b61029d610c07565b61027c60075481565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161024c565b61027c61044a366004611c5f565b610c3b565b61023f610c46565b610268610465366004611c1a565b610c55565b61027c610478366004611c5f565b610ca4565b61026861048b366004611c1a565b610cd0565b61027c61049e366004611c5f565b6001600160a01b031660009081526009602052604090205490565b6102686104c7366004611ccb565b610cdd565b61027c60125481565b61027c6104e3366004611d04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61029d61051c366004611c1a565b610d8b565b600e5461027c565b61029d610537366004611c46565b610ef5565b61029d61054a366004611c5f565b61102e565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b610387610584366004611c5f565b6110c6565b61059c610597366004611c46565b61122f565b6040805193845260208401929092529082015260600161024c565b6060600380546105c690611d32565b80601f01602080910402602001604051908101604052809291908181526020018280546105f290611d32565b801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b5050505050905090565b600061065633848461134c565b5060015b92915050565b6005546001600160a01b031633146106935760405162461bcd60e51b815260040161068a90611d6c565b60405180910390fd5b601254810361071d5760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a40161068a565b601255565b600061072f848484611470565b610781843361077c85604051806060016040528060288152602001611f03602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906114af565b61134c565b5060019392505050565b6001600160a01b03811660009081526008602090815260408083205491839052822054600654600160801b926107dd926107d8926107d2916107cd91906114e9565b611572565b90611582565b6115c0565b61065a9190611db7565b6005546001600160a01b031633146108115760405162461bcd60e51b815260040161068a90611d6c565b600e55565b6005546001600160a01b031633146108405760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0381166000908152600f602052604090205460ff161561086657600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff191660011790556108949082906115d3565b60405163131836e760e21b8152600a60048201526001600160a01b038216602482015273c618b3399de9cbd7ef45bc0cb11338ce06311eae90634c60db9c9060440160006040518083038186803b1580156108ee57600080fd5b505af4158015610902573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6005546001600160a01b031633146109675760405162461bcd60e51b815260040161068a90611d6c565b600061097260025490565b1161097c57600080fd5b80156109f8576109af61098e60025490565b61099c83600160801b6114e9565b6109a69190611db7565b60065490611638565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26007546109f49082611638565b6007555b50565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161065691859061077c9086611638565b600080600080600080600080600a73c618b3399de9cbd7ef45bc0cb11338ce06311eae63deb3d89690916040518263ffffffff1660e01b8152600401610a7991815260200190565b602060405180830381865af4158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190611dd9565b8910610adf575060009650600019955085945086935083925082915081905080610b7a565b6040516368d54f3f60e11b8152600a6004820152602481018a905260009073c618b3399de9cbd7ef45bc0cb11338ce06311eae9063d1aa9e7e90604401602060405180830381865af4158015610b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5d9190611df2565b9050610b68816110c6565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152604960248201527f77697468647261774469766964656e642064697361626c65642e20557365207460448201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2060648201526831b7b73a3930b1ba1760b91b608482015260a40161068a565b565b6005546001600160a01b03163314610c315760405162461bcd60e51b815260040161068a90611d6c565b610c056000611697565b600061065a82610ca4565b6060600480546105c690611d32565b6000610656338461077c85604051806060016040528060258152602001611f2b602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906114af565b6001600160a01b03811660009081526009602052604081205461065a90610cca8461078b565b906116e9565b6000610656338484611470565b6005546000906001600160a01b03163314610d0a5760405162461bcd60e51b815260040161068a90611d6c565b6000610d158461172b565b90508015610d81576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d6f9085815260200190565b60405180910390a3600191505061065a565b5060009392505050565b6005546001600160a01b03163314610db55760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0382166000908152600f602052604090205460ff16610ef1576012548110610e6657610de882826115d3565b604051632f0ad01760e21b8152600a60048201526001600160a01b03831660248201526044810182905273c618b3399de9cbd7ef45bc0cb11338ce06311eae9063bc2b405c9060640160006040518083038186803b158015610e4957600080fd5b505af4158015610e5d573d6000803e3d6000fd5b50505050610ee4565b610e718260006115d3565b60405163131836e760e21b8152600a60048201526001600160a01b038316602482015273c618b3399de9cbd7ef45bc0cb11338ce06311eae90634c60db9c9060440160006040518083038186803b158015610ecb57600080fd5b505af4158015610edf573d6000803e3d6000fd5b505050505b610eef826001610cdd565b505b5050565b6005546001600160a01b03163314610f1f5760405162461bcd60e51b815260040161068a90611d6c565b610e108110158015610f345750620151808111155b610f9c5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b606482015260840161068a565b6011548103610ffb5760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060448201526476616c756560d81b606482015260840161068a565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6005546001600160a01b031633146110585760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0381166110bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068a565b6109f881611697565b6040516317e142d160e01b8152600a60048201526001600160a01b0382166024820152819060009081908190819081908190819073c618b3399de9cbd7ef45bc0cb11338ce06311eae906317e142d190604401602060405180830381865af4158015611136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115a9190611dd9565b96506000199550600087126111bc57600e5487111561118857600e546111819088906118b0565b95506111bc565b600e54600a546000911061119d5760006111ac565b600e54600a546111ac916116e9565b90506111b88882611582565b9650505b6111c588610ca4565b94506111d08861078b565b6001600160a01b0389166000908152601060205260409020549094509250826111fa576000611208565b601154611208908490611638565b9150428211611218576000611222565b61122282426116e9565b9050919395975091939597565b600a5460009081908190808203611251575050600e5460009250829150611345565b600e546000805a90506000805b898410801561126c57508582105b15611334578461127b81611e0f565b600a549096508610905061128e57600094505b6000600a60000186815481106112a6576112a6611e28565b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506112d7906118ed565b156112fa576112e7816001610cdd565b156112fa57816112f681611e0f565b9250505b8261130481611e0f565b93505060005a90508085111561132b5761132861132186836116e9565b8790611638565b95505b935061125e9050565b600e85905590975095509193505050505b9193909250565b6001600160a01b0383166113ae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161068a565b6001600160a01b03821661140f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161068a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161068a565b600081848411156114d35760405162461bcd60e51b815260040161068a9190611bb7565b5060006114e08486611e3e565b95945050505050565b6000826000036114fb5750600061065a565b60006115078385611e51565b9050826115148583611db7565b1461156b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161068a565b9392505050565b6000818181121561065a57600080fd5b60008061158f8385611e68565b9050600083121580156115a25750838112155b806115b757506000831280156115b757508381125b61156b57600080fd5b6000808212156115cf57600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561161257600061160083836116e9565b905061160c8482611914565b50610eef565b80821015610eef57600061162682846116e9565b90506116328482611978565b50505050565b6000806116458385611e90565b90508381101561156b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161068a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061156b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114af565b60008061173783610ca4565b905080156118a7576001600160a01b0383166000908152600960205260409020546117629082611638565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906117b19084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af115801561182d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118519190611ea3565b9050806118a0576001600160a01b03841660009081526009602052604090205461187b90836116e9565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b6000806118bd8385611ec0565b9050600083121580156118d05750838113155b806115b757506000831280156115b7575083811361156b57600080fd5b6000428211156118ff57506000919050565b60115461190c42846116e9565b101592915050565b61191e82826119bc565b6119586119396107cd836006546114e990919063ffffffff16565b6001600160a01b038416600090815260086020526040902054906118b0565b6001600160a01b0390921660009081526008602052604090209190915550565b6119828282611aa7565b61195861199d6107cd836006546114e990919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611582565b6001600160a01b038216611a125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161068a565b611a1e60008383610eef565b600254611a2b9082611638565b6002556001600160a01b038216600090815260208190526040902054611a519082611638565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611b075760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161068a565b611b1382600083610eef565b611b5081604051806060016040528060228152602001611ee1602291396001600160a01b03851660009081526020819052604090205491906114af565b6001600160a01b038316600090815260208190526040902055600254611b7690826116e9565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a9b565b600060208083528351808285015260005b81811015611be457858101830151858201604001528201611bc8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109f857600080fd5b60008060408385031215611c2d57600080fd5b8235611c3881611c05565b946020939093013593505050565b600060208284031215611c5857600080fd5b5035919050565b600060208284031215611c7157600080fd5b813561156b81611c05565b600080600060608486031215611c9157600080fd5b8335611c9c81611c05565b92506020840135611cac81611c05565b929592945050506040919091013590565b80151581146109f857600080fd5b60008060408385031215611cde57600080fd5b8235611ce981611c05565b91506020830135611cf981611cbd565b809150509250929050565b60008060408385031215611d1757600080fd5b8235611d2281611c05565b91506020830135611cf981611c05565b600181811c90821680611d4657607f821691505b602082108103611d6657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611dd457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611deb57600080fd5b5051919050565b600060208284031215611e0457600080fd5b815161156b81611c05565b600060018201611e2157611e21611da1565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561065a5761065a611da1565b808202811582820484141761065a5761065a611da1565b8082018281126000831280158216821582161715611e8857611e88611da1565b505092915050565b8082018082111561065a5761065a611da1565b600060208284031215611eb557600080fd5b815161156b81611cbd565b81810360008312801583831316838312821617156118a0576118a0611da156fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fd9faf74f29aaf25a5d72b13e24ce7779f51d35d572822387da1d75265381d7d64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106103a65760003560e01c80637b3c83b1116101e7578063b6f7f6811161010d578063e4893fdc116100a0578063f27fd2541161006f578063f27fd25414610afb578063f2fde38b14610b1b578063f7c618c114610b3b578063f9d0831a14610b6f57600080fd5b8063e4893fdc14610a90578063e4f24cb014610aa6578063e7841ec014610ac6578063e98030c714610adb57600080fd5b8063c17b5b8c116100dc578063c17b5b8c146109fe578063dc4c7dbc14610a1e578063dd62ed3e14610a34578063e2f4560514610a7a57600080fd5b8063b6f7f68114610988578063b94315ff146109a8578063bb85c6d1146109be578063c0246668146109de57600080fd5b80639c1b8af511610185578063a9059cbb11610154578063a9059cbb146108b3578063ad56c13c146108d3578063afa4f3b214610938578063b62496f51461095857600080fd5b80639c1b8af514610848578063a26579ad1461085e578063a457c2d714610873578063a8b9d2401461089357600080fd5b8063880bcbc1116101c1578063880bcbc1146107e05780638a8c523c146108005780638da5cb5b1461081557806395d89b411461083357600080fd5b80637b3c83b11461078a5780638095d564146107a0578063871c128d146107c057600080fd5b80633b364da8116102cc57806359136fa51161026a578063700bb19111610239578063700bb191146106ff57806370a082311461071f578063715018a61461075557806375f0a8741461076a57600080fd5b806359136fa51461069e5780635fc2e596146106b457806364b0f653146106ca5780636843cd84146106df57600080fd5b80634ada218b116102a65780634ada218b146106165780634e71d92d146106305780634fbee1931461064557806356a6cabf1461067e57600080fd5b80633b364da8146105b65780633f249df0146105d657806349bd5a5e146105f657600080fd5b8063286b3aa01161034457806330bb4cff1161031357806330bb4cff14610545578063313ce5671461055a57806331e79db014610576578063395093511461059657600080fd5b8063286b3aa0146104d35780632ba86bf2146104f55780632c1f52161461050f5780632ce86fbf1461052f57600080fd5b80631694505e116103805780631694505e1461042d57806318160ddd1461046557806318d9ceae1461047a57806323b872dd146104b357600080fd5b80630105d0fd146103b257806306fdde03146103db578063095ea7b3146103fd57600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103c860195481565b6040519081526020015b60405180910390f35b3480156103e757600080fd5b506103f0610b8f565b6040516103d2919061327a565b34801561040957600080fd5b5061041d6104183660046132dd565b610c21565b60405190151581526020016103d2565b34801561043957600080fd5b50600f5461044d906001600160a01b031681565b6040516001600160a01b0390911681526020016103d2565b34801561047157600080fd5b506002546103c8565b34801561048657600080fd5b5061041d610495366004613309565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156104bf57600080fd5b5061041d6104ce366004613326565b610c38565b3480156104df57600080fd5b506104f36104ee366004613367565b610ca1565b005b34801561050157600080fd5b5060185461041d9060ff1681565b34801561051b57600080fd5b5060145461044d906001600160a01b031681565b34801561053b57600080fd5b506103c8600a5481565b34801561055157600080fd5b506103c8610d36565b34801561056657600080fd5b50604051600981526020016103d2565b34801561058257600080fd5b506104f3610591366004613309565b610da9565b3480156105a257600080fd5b5061041d6105b13660046132dd565b610e05565b3480156105c257600080fd5b506104f36105d1366004613367565b610e3b565b3480156105e257600080fd5b506104f36105f1366004613309565b610e96565b34801561060257600080fd5b5060105461044d906001600160a01b031681565b34801561062257600080fd5b5060165461041d9060ff1681565b34801561063c57600080fd5b506104f3610f3b565b34801561065157600080fd5b5061041d610660366004613309565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561068a57600080fd5b506104f361069936600461338e565b610fb3565b3480156106aa57600080fd5b506103c8601a5481565b3480156106c057600080fd5b506103c860075481565b3480156106d657600080fd5b506103c861109e565b3480156106eb57600080fd5b506103c86106fa366004613309565b6110e8565b34801561070b57600080fd5b506104f361071a366004613367565b611158565b34801561072b57600080fd5b506103c861073a366004613309565b6001600160a01b031660009081526020819052604090205490565b34801561076157600080fd5b506104f361122a565b34801561077657600080fd5b50600e5461044d906001600160a01b031681565b34801561079657600080fd5b506103c860065481565b3480156107ac57600080fd5b506104f36107bb3660046133ab565b611260565b3480156107cc57600080fd5b506104f36107db366004613367565b611343565b3480156107ec57600080fd5b506104f36107fb3660046133d7565b611485565b34801561080c57600080fd5b506104f361154f565b34801561082157600080fd5b506005546001600160a01b031661044d565b34801561083f57600080fd5b506103f06115db565b34801561085457600080fd5b506103c860155481565b34801561086a57600080fd5b506103c86115ea565b34801561087f57600080fd5b5061041d61088e3660046132dd565b611634565b34801561089f57600080fd5b506103c86108ae366004613309565b611683565b3480156108bf57600080fd5b5061041d6108ce3660046132dd565b6116b6565b3480156108df57600080fd5b506108f36108ee366004613309565b6116c3565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103d2565b34801561094457600080fd5b506104f3610953366004613367565b61175e565b34801561096457600080fd5b5061041d610973366004613309565b60136020526000908152604090205460ff1681565b34801561099457600080fd5b506104f36109a3366004613410565b611818565b3480156109b457600080fd5b506103c8600c5481565b3480156109ca57600080fd5b506104f36109d9366004613309565b611987565b3480156109ea57600080fd5b506104f36109f93660046133d7565b611b43565b348015610a0a57600080fd5b506104f3610a193660046133ab565b611c05565b348015610a2a57600080fd5b506103c8600b5481565b348015610a4057600080fd5b506103c8610a4f366004613432565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a8657600080fd5b506103c860115481565b348015610a9c57600080fd5b506103c860085481565b348015610ab257600080fd5b506103c8610ac1366004613309565b611cdb565b348015610ad257600080fd5b506103c8611d0e565b348015610ae757600080fd5b506104f3610af6366004613367565b611d58565b348015610b0757600080fd5b506108f3610b16366004613367565b611e30565b348015610b2757600080fd5b506104f3610b36366004613309565b611e72565b348015610b4757600080fd5b5061044d7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b348015610b7b57600080fd5b506104f3610b8a366004613309565b611f0a565b606060038054610b9e90613460565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90613460565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b5050505050905090565b6000610c2e338484612113565b5060015b92915050565b6000610c45848484612238565b610c978433610c928560405180606001604052806028815260200161393d602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612a46565b612113565b5060019392505050565b6005546001600160a01b03163314610cd45760405162461bcd60e51b8152600401610ccb9061349a565b60405180910390fd5b60145460405163014359d560e51b8152600481018390526001600160a01b039091169063286b3aa0906024015b600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b5050505050565b601454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da491906134cf565b905090565b6005546001600160a01b03163314610dd35760405162461bcd60e51b8152600401610ccb9061349a565b60145460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d01565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c2e918590610c9290866120ad565b6005546001600160a01b03163314610e655760405162461bcd60e51b8152600401610ccb9061349a565b601454604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401610d01565b6005546001600160a01b03163314610ec05760405162461bcd60e51b8152600401610ccb9061349a565b60145460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3791906134e8565b5050565b60145460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb091906134e8565b50565b6005546001600160a01b03163314610fdd5760405162461bcd60e51b8152600401610ccb9061349a565b60185460ff161515811515036110505760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610ccb565b6018805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf906020015b60405180910390a150565b601454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6014546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611134573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3291906134cf565b6014546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190613505565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146112545760405162461bcd60e51b8152600401610ccb9061349a565b61125e6000612a80565b565b6005546001600160a01b0316331461128a5760405162461bcd60e51b8152600401610ccb9061349a565b600683905560078290556008819055806112a48385613549565b6112ae9190613549565b6009819055600810156113035760405162461bcd60e51b815260206004820152601e60248201527f427579206665652063616e6e6f74206265206d6f7265207468616e20382500006044820152606401610ccb565b7f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60095460405161133691815260200190565b60405180910390a1505050565b6005546001600160a01b0316331461136d5760405162461bcd60e51b8152600401610ccb9061349a565b62030d40811015801561138357506207a1208111155b6113ec5760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610ccb565b60155481036114525760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610ccb565b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6005546001600160a01b031633146114af5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b03821660009081526017602052604090205481151560ff9091161515036114ef5760405162461bcd60e51b8152600401610ccb9061355c565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b031633146115795760405162461bcd60e51b8152600401610ccb9061349a565b60165460ff16156115cc5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610ccb565b6016805460ff19166001179055565b606060048054610b9e90613460565b60145460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6000610c2e3384610c9285604051806060016040528060258152602001613965602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612a46565b6014546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611117565b6000610c2e338484612238565b60145460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561171f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174391906135a0565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146117885760405162461bcd60e51b8152600401610ccb9061349a565b620186a061179560025490565b61179f919061360a565b81116118135760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610ccb565b601155565b6005546001600160a01b031633146118425760405162461bcd60e51b8152600401610ccb9061349a565b6103e86118516009600a613710565b60025461185e919061360a565b611868919061360a565b821015801561189c57506103e86118816009600a613710565b60025461188e919061360a565b611898919061360a565b8110155b61190e5760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610ccb565b61191a6009600a613710565b611924908361371f565b6019556119336009600a613710565b61193d908261371f565b601a8190556019546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb1319261197b928252602082015260400190565b60405180910390a15050565b6005546001600160a01b031633146119b15760405162461bcd60e51b8152600401610ccb9061349a565b600e546001600160a01b0390811690821603611a205760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610ccb565b6001600160a01b0381163b15611a865760405162461bcd60e51b815260206004820152602560248201527f4d61726b6574696e672077616c6c65742063616e6e6f74206265206120636f6e6044820152641d1c9858dd60da1b6064820152608401610ccb565b61deac196001600160a01b03821601611af55760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610ccb565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b90602001611093565b6005546001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b03821660009081526012602052604090205481151560ff909116151503611bad5760405162461bcd60e51b8152600401610ccb9061355c565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611543565b6005546001600160a01b03163314611c2f5760405162461bcd60e51b8152600401610ccb9061349a565b600a839055600b829055600c81905580611c498385613549565b611c539190613549565b600d819055600b1015611ca85760405162461bcd60e51b815260206004820181905260248201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e203131256044820152606401610ccb565b7f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c55600d5460405161133691815260200190565b6014546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce014790602401611117565b6014546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610d80573d6000803e3d6000fd5b6005546001600160a01b03163314611d825760405162461bcd60e51b8152600401610ccb9061349a565b610e108110158015611d975750620151808111155b611dff5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b6064820152608401610ccb565b60145460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d01565b601454604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611701565b6005546001600160a01b03163314611e9c5760405162461bcd60e51b8152600401610ccb9061349a565b6001600160a01b038116611f015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ccb565b610fb081612a80565b6005546001600160a01b03163314611f345760405162461bcd60e51b8152600401610ccb9061349a565b306001600160a01b03821603611f8c5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610ccb565b6001600160a01b038116611fc65760405133904780156108fc02916000818181858888f19350505050158015610f37573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203391906134cf565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906134e8565b50505050565b6000806120ba8385613549565b90508381101561210c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ccb565b9392505050565b6001600160a01b0383166121755760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ccb565b6001600160a01b0382166121d65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ccb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661225e5760405162461bcd60e51b8152600401610ccb90613736565b6001600160a01b0382166122845760405162461bcd60e51b8152600401610ccb9061377b565b60165460ff16806122ad57506001600160a01b03831660009081526012602052604090205460ff165b806122d057506001600160a01b03821660009081526012602052604090205460ff165b61231c5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610ccb565b806000036123355761233083836000612ad2565b505050565b60185460ff1615612417576010546001600160a01b038481169116148061236957506010546001600160a01b038381169116145b801561238e57506001600160a01b03831660009081526017602052604090205460ff16155b80156123b357506001600160a01b03821660009081526017602052604090205460ff16155b15612417576010546001600160a01b03908116908416036123f5576019548111156123f05760405162461bcd60e51b8152600401610ccb906137be565b612417565b601a548111156124175760405162461bcd60e51b8152600401610ccb906137be565b30600090815260208190526040902054601154811080159081906124455750601054600160a01b900460ff16155b801561246957506001600160a01b03841660009081526013602052604090205460ff165b801561248457506000600d546009546124829190613549565b115b15612775576010805460ff60a01b1916600160a01b179055600a5460065460009182916124b19190613549565b11156124e8576064600a546006546124c99190613549565b6124d3908561371f565b6124dd919061360a565b90506124e881612bdb565b6124f2818461381b565b92506000600c546008546125069190613549565b600b546007546125169190613549565b6125209190613549565b90506000841180156125325750600081115b15612765576040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106125705761257061382e565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed9190613844565b816001815181106126005761260061382e565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac947906126469089906000908690309042906004016138a5565b600060405180830381600087803b15801561266057600080fd5b505af1158015612674573d6000803e3d6000fd5b5050505060008247612686919061381b565b90506000600b5460075461269a9190613549565b111561271557600084600b546007546126b39190613549565b6126bd908461371f565b6126c7919061360a565b600e549091506126e0906001600160a01b031682612e26565b6040518181527fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b9060200160405180910390a1505b6000600c546008546127279190613549565b111561276157600084600c546008546127409190613549565b61274a908461371f565b612754919061360a565b905061275f81612f3f565b505b5050505b50506010805460ff60a01b191690555b6010546001600160a01b03861660009081526012602052604090205460ff600160a01b9092048216159116806127c357506001600160a01b03851660009081526012602052604090205460ff165b156127cc575060005b801561284b576010546000906001600160a01b03908116908816036127f45750600954612817565b6010546001600160a01b03908116908716036128135750600d54612817565b5060005b60006064612825838861371f565b61282f919061360a565b905061283b818761381b565b9550612848883083612ad2565b50505b612856868686612ad2565b6014546001600160a01b031663e30443bc87612887816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156128cd57600080fd5b505af19250505080156128de575060015b506014546001600160a01b031663e30443bc86612910816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561295657600080fd5b505af1925050508015612967575060015b50601054600160a01b900460ff16612a3e576015546014546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156129e6575060408051601f3d908101601f191682019092526129e391810190613505565b60015b15612a3c5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b60008184841115612a6a5760405162461bcd60e51b8152600401610ccb919061327a565b506000612a77848661381b565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612af85760405162461bcd60e51b8152600401610ccb90613736565b6001600160a01b038216612b1e5760405162461bcd60e51b8152600401610ccb9061377b565b612b5b81604051806060016040528060268152602001613917602691396001600160a01b0386166000908152602081905260409020549190612a46565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612b8a90826120ad565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161222b565b6000612be860028361360a565b90506000612bf6828461381b565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110612c3057612c3061382e565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cad9190613844565b81600181518110612cc057612cc061382e565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac94790612d069087906000908690309042906004016138a5565b600060405180830381600087803b158015612d2057600080fd5b505af1158015612d34573d6000803e3d6000fd5b5050505060008247612d46919061381b565b600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612db5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612dda9190613505565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b80471015612e765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ccb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ec3576040519150601f19603f3d011682016040523d82523d6000602084013e612ec8565b606091505b50509050806123305760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ccb565b6040805160028082526060820183526000926020830190803683375050600f54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcd9190613844565b81600081518110612fe057612fe061382e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7816001815181106130345761303461382e565b6001600160a01b039283166020918202929092010152600f5460405163b6f9de9560e01b815291169063b6f9de9590849061307a906000908690309042906004016138e1565b6000604051808303818588803b15801561309357600080fd5b505af11580156130a7573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031692506370a082319150602401602060405180830381865afa158015613113573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313791906134cf565b60145460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec79091169063a9059cbb906044016020604051808303816000875af11580156131b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d591906134e8565b905080156120a757601454604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561322357600080fd5b505af1158015613237573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161326c91815260200190565b60405180910390a150505050565b600060208083528351808285015260005b818110156132a75785810183015185820160400152820161328b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fb057600080fd5b600080604083850312156132f057600080fd5b82356132fb816132c8565b946020939093013593505050565b60006020828403121561331b57600080fd5b813561210c816132c8565b60008060006060848603121561333b57600080fd5b8335613346816132c8565b92506020840135613356816132c8565b929592945050506040919091013590565b60006020828403121561337957600080fd5b5035919050565b8015158114610fb057600080fd5b6000602082840312156133a057600080fd5b813561210c81613380565b6000806000606084860312156133c057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156133ea57600080fd5b82356133f5816132c8565b9150602083013561340581613380565b809150509250929050565b6000806040838503121561342357600080fd5b50508035926020909101359150565b6000806040838503121561344557600080fd5b8235613450816132c8565b91506020830135613405816132c8565b600181811c9082168061347457607f821691505b60208210810361349457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156134e157600080fd5b5051919050565b6000602082840312156134fa57600080fd5b815161210c81613380565b60008060006060848603121561351a57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c3257610c32613533565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600080600080600080600080610100898b0312156135bd57600080fd5b88516135c8816132c8565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008261362757634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561366757816000190482111561364d5761364d613533565b8085161561365a57918102915b93841c9390800290613631565b509250929050565b60008261367e57506001610c32565b8161368b57506000610c32565b81600181146136a157600281146136ab576136c7565b6001915050610c32565b60ff8411156136bc576136bc613533565b50506001821b610c32565b5060208310610133831016604e8410600b84101617156136ea575081810a610c32565b6136f4838361362c565b806000190482111561370857613708613533565b029392505050565b600061210c60ff84168361366f565b8082028115828204841417610c3257610c32613533565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b81810381811115610c3257610c32613533565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561385657600080fd5b815161210c816132c8565b600081518084526020808501945080840160005b8381101561389a5781516001600160a01b031687529582019590820190600101613875565b509495945050505050565b85815284602082015260a0604082015260006138c460a0830186613861565b6001600160a01b0394909416606083015250608001529392505050565b8481526080602082015260006138fa6080830186613861565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a86300514d6ebeb9ee67bd4be78fcf6c2ae3b09c35a1ed72b47cbe8c3cf7b13f64736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

33811:19469:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51421:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;51421:39:0;;;;;;;;17902:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18815:169::-;;;;;;;;;;-1:-1:-1;18815:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;18815:169:0;1205:187:1;34200:41:0;;;;;;;;;;-1:-1:-1;34200:41:0;;;;-1:-1:-1;;;;;34200:41:0;;;;;;-1:-1:-1;;;;;1588:32:1;;;1570:51;;1558:2;1543:18;34200:41:0;1397:230:1;18222:108:0;;;;;;;;;;-1:-1:-1;18310:12:0;;18222:108;;53136:141;;;;;;;;;;-1:-1:-1;53136:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;53235:34:0;53211:4;53235:34;;;:25;:34;;;;;;;;;53136:141;18992:355;;;;;;;;;;-1:-1:-1;18992:355:0;;;;;:::i;:::-;;:::i;51022:128::-;;;;;;;;;;-1:-1:-1;51022:128:0;;;;;:::i;:::-;;:::i;:::-;;51372:42;;;;;;;;;;-1:-1:-1;51372:42:0;;;;;;;;34573:38;;;;;;;;;;-1:-1:-1;34573:38:0;;;;-1:-1:-1;;;;;34573:38:0;;;34004:33;;;;;;;;;;;;;;;;48945:141;;;;;;;;;;;;;:::i;18122:92::-;;;;;;;;;;-1:-1:-1;18122:92:0;;18205:1;2904:36:1;;2892:2;2877:18;18122:92:0;2762:184:1;49556:129:0;;;;;;;;;;-1:-1:-1;49556:129:0;;;;;:::i;:::-;;:::i;19355:218::-;;;;;;;;;;-1:-1:-1;19355:218:0;;;;;:::i;:::-;;:::i;48382:179::-;;;;;;;;;;-1:-1:-1;48382:179:0;;;;;:::i;:::-;;:::i;50745:132::-;;;;;;;;;;-1:-1:-1;50745:132:0;;;;;:::i;:::-;;:::i;34248:29::-;;;;;;;;;;-1:-1:-1;34248:29:0;;;;-1:-1:-1;;;;;34248:29:0;;;41317:26;;;;;;;;;;-1:-1:-1;41317:26:0;;;;;;;;50634:103;;;;;;;;;;;;;:::i;39704:125::-;;;;;;;;;;-1:-1:-1;39704:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;39793:28:0;39769:4;39793:28;;;:19;:28;;;;;;;;;39704:125;51786:311;;;;;;;;;;-1:-1:-1;51786:311:0;;;;;:::i;:::-;;:::i;51467:40::-;;;;;;;;;;;;;;;;33890:32;;;;;;;;;;;;;;;;51158:141;;;;;;;;;;;;;:::i;49253:139::-;;;;;;;;;;-1:-1:-1;49253:139:0;;;;;:::i;:::-;;:::i;50355:271::-;;;;;;;;;;-1:-1:-1;50355:271:0;;;;;:::i;:::-;;:::i;18338:127::-;;;;;;;;;;-1:-1:-1;18338:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;18439:18:0;18412:7;18439:18;;;;;;;;;;;;18338:127;3433:103;;;;;;;;;;;;;:::i;34161:30::-;;;;;;;;;;-1:-1:-1;34161:30:0;;;;-1:-1:-1;;;;;34161:30:0;;;33851:32;;;;;;;;;;;;;;;;39837:486;;;;;;;;;;-1:-1:-1;39837:486:0;;;;;:::i;:::-;;:::i;47980:394::-;;;;;;;;;;-1:-1:-1;47980:394:0;;;;;:::i;:::-;;:::i;52802:326::-;;;;;;;;;;-1:-1:-1;52802:326:0;;;;;:::i;:::-;;:::i;41352:146::-;;;;;;;;;;;;;:::i;3210:87::-;;;;;;;;;;-1:-1:-1;3283:6:0;;-1:-1:-1;;;;;3283:6:0;3210:87;;18010:104;;;;;;;;;;;;;:::i;34661:41::-;;;;;;;;;;;;;;;;48829:108;;;;;;;;;;;;;:::i;19581:269::-;;;;;;;;;;-1:-1:-1;19581:269:0;;;;;:::i;:::-;;:::i;49094:151::-;;;;;;;;;;-1:-1:-1;49094:151:0;;;;;:::i;:::-;;:::i;18473:175::-;;;;;;;;;;-1:-1:-1;18473:175:0;;;;;:::i;:::-;;:::i;49693:318::-;;;;;;;;;;-1:-1:-1;49693:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4593:32:1;;;4575:51;;4657:2;4642:18;;4635:34;;;;4685:18;;;4678:34;;;;4743:2;4728:18;;4721:34;;;;4786:3;4771:19;;4764:35;4613:3;4815:19;;4808:35;4874:3;4859:19;;4852:35;4918:3;4903:19;;4896:35;4562:3;4547:19;49693:318:0;4236:701:1;47734:238:0;;;;;;;;;;-1:-1:-1;47734:238:0;;;;;:::i;:::-;;:::i;34506:58::-;;;;;;;;;;-1:-1:-1;34506:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52105:689;;;;;;;;;;-1:-1:-1;52105:689:0;;;;;:::i;:::-;;:::i;34084:31::-;;;;;;;;;;;;;;;;40845:464;;;;;;;;;;-1:-1:-1;40845:464:0;;;;;:::i;:::-;;:::i;39410:286::-;;;;;;;;;;-1:-1:-1;39410:286:0;;;;;:::i;:::-;;:::i;40331:506::-;;;;;;;;;;-1:-1:-1;40331:506:0;;;;;:::i;:::-;;:::i;34044:33::-;;;;;;;;;;;;;;;;18656:151;;;;;;;;;;-1:-1:-1;18656:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;18772:18:0;;;18745:7;18772:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18656:151;34404:33;;;;;;;;;;;;;;;;33929:30;;;;;;;;;;;;;;;;49400:148;;;;;;;;;;-1:-1:-1;49400:148:0;;;;;:::i;:::-;;:::i;50885:129::-;;;;;;;;;;;;;:::i;48569:252::-;;;;;;;;;;-1:-1:-1;48569:252:0;;;;;:::i;:::-;;:::i;50019:328::-;;;;;;;;;;-1:-1:-1;50019:328:0;;;;;:::i;:::-;;:::i;3544:201::-;;;;;;;;;;-1:-1:-1;3544:201:0;;;;;:::i;:::-;;:::i;34618:36::-;;;;;;;;;;;;;;;38108:441;;;;;;;;;;-1:-1:-1;38108:441:0;;;;;:::i;:::-;;:::i;17902:100::-;17956:13;17989:5;17982:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17902:100;:::o;18815:169::-;18898:4;18915:39;2836:10;18938:7;18947:6;18915:8;:39::i;:::-;-1:-1:-1;18972:4:0;18815:169;;;;;:::o;18992:355::-;19132:4;19149:36;19159:6;19167:9;19178:6;19149:9;:36::i;:::-;19196:121;19205:6;2836:10;19227:89;19265:6;19227:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19227:19:0;;;;;;:11;:19;;;;;;;;2836:10;19227:33;;;;;;;;;;:37;:89::i;:::-;19196:8;:121::i;:::-;-1:-1:-1;19335:4:0;18992:355;;;;;:::o;51022:128::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;;;;;;;;;51098:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;51098:44:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;51098:15:0;;::::1;::::0;:37:::1;::::0;133:18:1;;51098:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51022:128:::0;:::o;48945:141::-;49035:15;;:43;;;-1:-1:-1;;;49035:43:0;;;;49008:7;;-1:-1:-1;;;;;49035:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49028:50;;48945:141;:::o;49556:129::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;49632:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;49632:45:0;;-1:-1:-1;;;;;1588:32:1;;;49632:45:0::1;::::0;::::1;1570:51:1::0;49632:15:0;;::::1;::::0;:36:::1;::::0;1543:18:1;;49632:45:0::1;1397:230:1::0;19355:218:0;2836:10;19443:4;19492:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19492:34:0;;;;;;;;;;19443:4;;19460:83;;19483:7;;19492:50;;19531:10;19492:38;:50::i;48382:179::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;48481:15:::1;::::0;:72:::1;::::0;-1:-1:-1;;;48481:72:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;48481:15:0;;::::1;::::0;:53:::1;::::0;133:18:1;;48481:72:0::1;14:177:1::0;50745:132:0;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;50814:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;50814:55:0;;-1:-1:-1;;;;;6725:32:1;;;50814:55:0::1;::::0;::::1;6707:51:1::0;50814:15:0::1;6774:18:1::0;;;6767:50;50814:15:0;;::::1;::::0;:30:::1;::::0;6680:18:1;;50814:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50745:132:::0;:::o;50634:103::-;50671:15;;:58;;-1:-1:-1;;;50671:58:0;;50710:10;50671:58;;;6707:51:1;50671:15:0;6774:18:1;;;6767:50;-1:-1:-1;;;;;50671:15:0;;;;:30;;6680:18:1;;50671:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50634:103::o;51786:311::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;51885:26:::1;::::0;::::1;;51875:36;;::::0;::::1;;::::0;51867:99:::1;;;::::0;-1:-1:-1;;;51867:99:0;;7280:2:1;51867:99:0::1;::::0;::::1;7262:21:1::0;7319:2;7299:18;;;7292:30;7358:34;7338:18;;;7331:62;-1:-1:-1;;;7409:18:1;;;7402:48;7467:19;;51867:99:0::1;7078:414:1::0;51867:99:0::1;51977:26;:35:::0;;-1:-1:-1;;51977:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;52030:59:::1;::::0;51977:35:::1;52062:26:::0;;;1370:14:1;1363:22;1345:41;;52030:59:0::1;::::0;1333:2:1;1318:18;52030:59:0::1;;;;;;;;51786:311:::0;:::o;51158:141::-;51250:15;;:41;;;-1:-1:-1;;;51250:41:0;;;;51223:7;;-1:-1:-1;;;;;51250:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;49253:139;49350:15;;:34;;-1:-1:-1;;;49350:34:0;;-1:-1:-1;;;;;1588:32:1;;;49350:34:0;;;1570:51:1;49323:7:0;;49350:15;;:25;;1543:18:1;;49350:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50355:271::-;50487:15;;:28;;-1:-1:-1;;;;;;50487:28:0;;;;;160:25:1;;;50421:18:0;;;;;;-1:-1:-1;;;;;50487:15:0;;:23;;133:18:1;;50487:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50531:87;;;8039:25:1;;;8095:2;8080:18;;8073:34;;;8123:18;;;8116:34;;;8181:2;8166:18;;8159:34;;;50420:95:0;;-1:-1:-1;50420:95:0;;-1:-1:-1;50420:95:0;-1:-1:-1;50608:9:0;;50596:5;;50531:87;;8026:3:1;8011:19;50531:87:0;;;;;;;50409:217;;;50355:271;:::o;3433:103::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;3498:30:::1;3525:1;3498:18;:30::i;:::-;3433:103::o:0;39837:486::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;39972:17:::1;:40:::0;;;40023:17:::1;:41:::0;;;40075:15:::1;:38:::0;;;40097:16;40140:39:::1;40046:18:::0;39994;40140:39:::1;:::i;:::-;:58;;;;:::i;:::-;40126:11;:72:::0;;;40234:1:::1;-1:-1:-1::0;40219:16:0::1;40211:59;;;::::0;-1:-1:-1;;;40211:59:0;;8668:2:1;40211:59:0::1;::::0;::::1;8650:21:1::0;8707:2;8687:18;;;8680:30;8746:32;8726:18;;;8719:60;8796:18;;40211:59:0::1;8466:354:1::0;40211:59:0::1;40288:27;40303:11;;40288:27;;;;160:25:1::0;;148:2;133:18;;14:177;40288:27:0::1;;;;;;;;39837:486:::0;;;:::o;47980:394::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;48078:7:::1;48066:8;:19;;:42;;;;;48101:7;48089:8;:19;;48066:42;48058:107;;;::::0;-1:-1:-1;;;48058:107:0;;9027:2:1;48058:107:0::1;::::0;::::1;9009:21:1::0;9066:2;9046:18;;;9039:30;9105:34;9085:18;;;9078:62;-1:-1:-1;;;9156:18:1;;;9149:50;9216:19;;48058:107:0::1;8825:416:1::0;48058:107:0::1;48196:16;;48184:8;:28:::0;48176:85:::1;;;::::0;-1:-1:-1;;;48176:85:0;;9448:2:1;48176:85:0::1;::::0;::::1;9430:21:1::0;9487:2;9467:18;;;9460:30;9526:34;9506:18;;;9499:62;-1:-1:-1;;;9577:18:1;;;9570:42;9629:19;;48176:85:0::1;9246:408:1::0;48176:85:0::1;48311:16;::::0;48277:51:::1;::::0;48301:8;;48277:51:::1;::::0;;;::::1;48339:16;:27:::0;47980:394::o;52802:326::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52912:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:45;::::1;;:34;::::0;;::::1;:45;;::::0;52903:95:::1;;;;-1:-1:-1::0;;;52903:95:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53009:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:44;;-1:-1:-1;;53009:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;53071:49;;1345:41:1;;;53071:49:0::1;::::0;1318:18:1;53071:49:0::1;;;;;;;;52802:326:::0;;:::o;41352:146::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;41415:14:::1;::::0;::::1;;41414:15;41406:52;;;::::0;-1:-1:-1;;;41406:52:0;;10266:2:1;41406:52:0::1;::::0;::::1;10248:21:1::0;10305:2;10285:18;;;10278:30;10344:26;10324:18;;;10317:54;10388:18;;41406:52:0::1;10064:348:1::0;41406:52:0::1;41469:14;:21:::0;;-1:-1:-1;;41469:21:0::1;41486:4;41469:21;::::0;;41352:146::o;18010:104::-;18066:13;18099:7;18092:14;;;;;:::i;48829:108::-;48902:15;;:27;;;-1:-1:-1;;;48902:27:0;;;;48875:7;;-1:-1:-1;;;;;48902:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;19581:269;19674:4;19691:129;2836:10;19714:7;19723:96;19762:15;19723:96;;;;;;;;;;;;;;;;;2836:10;19723:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19723:34:0;;;;;;;;;;;;:38;:96::i;49094:151::-;49190:15;;:47;;-1:-1:-1;;;49190:47:0;;-1:-1:-1;;;;;1588:32:1;;;49190:47:0;;;1570:51:1;49163:7:0;;49190:15;;:38;;1543:18:1;;49190:47:0;1397:230:1;18473:175:0;18559:4;18576:42;2836:10;18600:9;18611:6;18576:9;:42::i;49693:318::-;49968:15;;:35;;-1:-1:-1;;;49968:35:0;;-1:-1:-1;;;;;1588:32:1;;;49968:35:0;;;1570:51:1;49789:7:0;;;;;;;;;;;;;;;;49968:15;;;:26;;1543:18:1;;49968:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49961:42;;;;;;;;;;;;;;;;49693:318;;;;;;;;;:::o;47734:238::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;47849:7:::1;47833:13;18310:12:::0;;;18222:108;47833:13:::1;:23;;;;:::i;:::-;47821:9;:35;47813:110;;;::::0;-1:-1:-1;;;47813:110:0;;11527:2:1;47813:110:0::1;::::0;::::1;11509:21:1::0;11566:2;11546:18;;;11539:30;11605:34;11585:18;;;11578:62;11676:32;11656:18;;;11649:60;11726:19;;47813:110:0::1;11325:426:1::0;47813:110:0::1;47934:18;:30:::0;47734:238::o;52105:689::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;52328:5:::1;52307:16;18205:1:::0;52307:2:::1;:16;:::i;:::-;18310:12:::0;;52290:34:::1;;;;:::i;:::-;52289:44;;;;:::i;:::-;52260:24;:73;;:164;;;;-1:-1:-1::0;52419:5:0::1;52398:16;18205:1:::0;52398:2:::1;:16;:::i;:::-;18310:12:::0;;52381:34:::1;;;;:::i;:::-;52380:44;;;;:::i;:::-;52351:25;:73;;52260:164;52238:278;;;::::0;-1:-1:-1;;;52238:278:0;;13341:2:1;52238:278:0::1;::::0;::::1;13323:21:1::0;13380:2;13360:18;;;13353:30;13419:34;13399:18;;;13392:62;13490:33;13470:18;;;13463:61;13541:19;;52238:278:0::1;13139:427:1::0;52238:278:0::1;52584:16;18205:1:::0;52584:2:::1;:16;:::i;:::-;52555:46;::::0;:24;:46:::1;:::i;:::-;52528:23;:73:::0;52668:16:::1;18205:1:::0;52668:2:::1;:16;:::i;:::-;52639:46;::::0;:25;:46:::1;:::i;:::-;52612:24;:73:::0;;;52736:23:::1;::::0;52703:83:::1;::::0;::::1;::::0;::::1;::::0;13918:25:1;;13974:2;13959:18;;13952:34;13906:2;13891:18;;13744:248;52703:83:0::1;;;;;;;;52105:689:::0;;:::o;40845:464::-;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;40960:15:::1;::::0;-1:-1:-1;;;;;40960:15:0;;::::1;40940:35:::0;;::::1;::::0;40932:88:::1;;;::::0;-1:-1:-1;;;40932:88:0;;14199:2:1;40932:88:0::1;::::0;::::1;14181:21:1::0;14238:2;14218:18;;;14211:30;14277:34;14257:18;;;14250:62;-1:-1:-1;;;14328:18:1;;;14321:38;14376:19;;40932:88:0::1;13997:404:1::0;40932:88:0::1;-1:-1:-1::0;;;;;38641:19:0;;;:23;41031:79:::1;;;::::0;-1:-1:-1;;;41031:79:0;;14608:2:1;41031:79:0::1;::::0;::::1;14590:21:1::0;14647:2;14627:18;;;14620:30;14686:34;14666:18;;;14659:62;-1:-1:-1;;;14737:18:1;;;14730:35;14782:19;;41031:79:0::1;14406:401:1::0;41031:79:0::1;-1:-1:-1::0;;;;;;;41129:24:0;::::1;::::0;41121:80:::1;;;::::0;-1:-1:-1;;;41121:80:0;;15014:2:1;41121:80:0::1;::::0;::::1;14996:21:1::0;15053:2;15033:18;;;15026:30;15092:34;15072:18;;;15065:62;-1:-1:-1;;;15143:18:1;;;15136:41;15194:19;;41121:80:0::1;14812:407:1::0;41121:80:0::1;41212:15;:34:::0;;-1:-1:-1;;;;;;41212:34:0::1;-1:-1:-1::0;;;;;41212:34:0;::::1;::::0;;::::1;::::0;;;41262:39:::1;::::0;1570:51:1;;;41262:39:0::1;::::0;1558:2:1;1543:18;41262:39:0::1;1397:230:1::0;39410:286:0;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39505:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;39497:89:::1;;;;-1:-1:-1::0;;;39497:89:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39597:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;39597:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39654:34;;1345:41:1;;;39654:34:0::1;::::0;1318:18:1;39654:34:0::1;1205:187:1::0;40331:506:0;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;40470:18:::1;:42:::0;;;40523:18:::1;:43:::0;;;40577:16:::1;:40:::0;;;40600:17;40645:41:::1;40547:19:::0;40493;40645:41:::1;:::i;:::-;:61;;;;:::i;:::-;40630:12;:76:::0;;;40743:2:::1;-1:-1:-1::0;40727:18:0::1;40719:63;;;::::0;-1:-1:-1;;;40719:63:0;;15426:2:1;40719:63:0::1;::::0;::::1;15408:21:1::0;;;15445:18;;;15438:30;15504:34;15484:18;;;15477:62;15556:18;;40719:63:0::1;15224:356:1::0;40719:63:0::1;40800:29;40816:12;;40800:29;;;;160:25:1::0;;148:2;133:18;;14:177;49400:148:0;49493:15;;:47;;-1:-1:-1;;;49493:47:0;;-1:-1:-1;;;;;1588:32:1;;;49493:47:0;;;1570:51:1;49466:7:0;;49493:15;;:38;;1543:18:1;;49493:47:0;1397:230:1;50885:129:0;50967:15;;:39;;;-1:-1:-1;;;50967:39:0;;;;50940:7;;-1:-1:-1;;;;;50967:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;48569:252;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;48670:5:::1;48654:12;:21;;:47;;;;;48695:6;48679:12;:22;;48654:47;48646:111;;;::::0;-1:-1:-1;;;48646:111:0;;15787:2:1;48646:111:0::1;::::0;::::1;15769:21:1::0;15826:2;15806:18;;;15799:30;15865:34;15845:18;;;15838:62;-1:-1:-1;;;15916:18:1;;;15909:49;15975:19;;48646:111:0::1;15585:415:1::0;48646:111:0::1;48768:15;::::0;:45:::1;::::0;-1:-1:-1;;;48768:45:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;48768:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;48768:45:0::1;14:177:1::0;50019:328:0;50299:15;;:40;;-1:-1:-1;;;50299:40:0;;;;;160:25:1;;;50120:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50299:15:0;;;;:33;;133:18:1;;50299:40:0;14:177:1;3544:201:0;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3633:22:0;::::1;3625:73;;;::::0;-1:-1:-1;;;3625:73:0;;16207:2:1;3625:73:0::1;::::0;::::1;16189:21:1::0;16246:2;16226:18;;;16219:30;16285:34;16265:18;;;16258:62;-1:-1:-1;;;16336:18:1;;;16329:36;16382:19;;3625:73:0::1;16005:402:1::0;3625:73:0::1;3709:28;3728:8;3709:18;:28::i;38108:441::-:0;3283:6;;-1:-1:-1;;;;;3283:6:0;2836:10;3345:23;3337:68;;;;-1:-1:-1;;;3337:68:0;;;;;;;:::i;:::-;38204:4:::1;-1:-1:-1::0;;;;;38187:22:0;::::1;::::0;38179:67:::1;;;::::0;-1:-1:-1;;;38179:67:0;;16614:2:1;38179:67:0::1;::::0;::::1;16596:21:1::0;;;16633:18;;;16626:30;16692:34;16672:18;;;16665:62;16744:18;;38179:67:0::1;16412:356:1::0;38179:67:0::1;-1:-1:-1::0;;;;;38261:21:0;::::1;38257:126;;38299:51;::::0;38307:10:::1;::::0;38328:21:::1;38299:51:::0;::::1;;;::::0;::::1;::::0;;;38328:21;38307:10;38299:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;38257:126;38455:35;::::0;-1:-1:-1;;;38455:35:0;;38484:4:::1;38455:35;::::0;::::1;1570:51:1::0;38420:5:0;;38393:17:::1;::::0;-1:-1:-1;;;;;38455:20:0;::::1;::::0;::::1;::::0;1543:18:1;;38455:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38501:40;::::0;-1:-1:-1;;;38501:40:0;;38521:10:::1;38501:40;::::0;::::1;16947:51:1::0;17014:18;;;17007:34;;;38437:53:0;;-1:-1:-1;;;;;;38501:19:0;::::1;::::0;::::1;::::0;16920:18:1;;38501:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38168:381;;38108:441:::0;:::o;3975:181::-;4033:7;;4065:5;4069:1;4065;:5;:::i;:::-;4053:17;;4094:1;4089;:6;;4081:46;;;;-1:-1:-1;;;4081:46:0;;17254:2:1;4081:46:0;;;17236:21:1;17293:2;17273:18;;;17266:30;17332:29;17312:18;;;17305:57;17379:18;;4081:46:0;17052:351:1;4081:46:0;4147:1;3975:181;-1:-1:-1;;;3975:181:0:o;21239:378::-;-1:-1:-1;;;;;21375:19:0;;21367:68;;;;-1:-1:-1;;;21367:68:0;;17610:2:1;21367:68:0;;;17592:21:1;17649:2;17629:18;;;17622:30;17688:34;17668:18;;;17661:62;-1:-1:-1;;;17739:18:1;;;17732:34;17783:19;;21367:68:0;17408:400:1;21367:68:0;-1:-1:-1;;;;;21454:21:0;;21446:68;;;;-1:-1:-1;;;21446:68:0;;18015:2:1;21446:68:0;;;17997:21:1;18054:2;18034:18;;;18027:30;18093:34;18073:18;;;18066:62;-1:-1:-1;;;18144:18:1;;;18137:32;18186:19;;21446:68:0;17813:398:1;21446:68:0;-1:-1:-1;;;;;21525:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21577:32;;160:25:1;;;21577:32:0;;133:18:1;21577:32:0;;;;;;;;21239:378;;;:::o;41506:4518::-;-1:-1:-1;;;;;41638:18:0;;41630:68;;;;-1:-1:-1;;;41630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41717:16:0;;41709:64;;;;-1:-1:-1;;;41709:64:0;;;;;;;:::i;:::-;41792:14;;;;;:43;;-1:-1:-1;;;;;;41810:25:0;;;;;;:19;:25;;;;;;;;41792:43;:70;;;-1:-1:-1;;;;;;41839:23:0;;;;;;:19;:23;;;;;;;;41792:70;41784:107;;;;-1:-1:-1;;;41784:107:0;;19228:2:1;41784:107:0;;;19210:21:1;19267:2;19247:18;;;19240:30;19306:26;19286:18;;;19279:54;19350:18;;41784:107:0;19026:348:1;41784:107:0;41907:6;41917:1;41907:11;41904:92;;41935:28;41951:4;41957:2;41961:1;41935:15;:28::i;:::-;41506:4518;;;:::o;41904:92::-;42012:26;;;;42008:752;;;42078:13;;-1:-1:-1;;;;;42070:21:0;;;42078:13;;42070:21;;:44;;-1:-1:-1;42101:13:0;;-1:-1:-1;;;;;42095:19:0;;;42101:13;;42095:19;42070:44;42069:99;;;;-1:-1:-1;;;;;;42137:31:0;;;;;;:25;:31;;;;;;;;42136:32;42069:99;:151;;;;-1:-1:-1;;;;;;42191:29:0;;;;;;:25;:29;;;;;;;;42190:30;42069:151;42065:684;;;42267:13;;-1:-1:-1;;;;;42267:13:0;;;42259:21;;;;42255:479;;42349:23;;42339:6;:33;;42305:180;;;;-1:-1:-1;;;42305:180:0;;;;;;;:::i;:::-;42255:479;;;42578:24;;42568:6;:34;;42534:180;;;;-1:-1:-1;;;42534:180:0;;;;;;;:::i;:::-;42821:4;42772:28;18439:18;;;;;;;;;;;42879;;42855:42;;;;;;;42914:33;;-1:-1:-1;42939:8:0;;-1:-1:-1;;;42939:8:0;;;;42938:9;42914:33;:79;;;;-1:-1:-1;;;;;;42964:29:0;;;;;;:25;:29;;;;;;;;42914:79;:126;;;;;43039:1;43024:12;;43010:11;;:26;;;;:::i;:::-;:30;42914:126;42910:1901;;;43067:8;:15;;-1:-1:-1;;;;43067:15:0;-1:-1:-1;;;43067:15:0;;;43174:18;;43154:17;;43067:15;;;;43154:38;;43174:18;43154:38;:::i;:::-;:42;43151:219;;;43301:3;43279:18;;43259:17;;:38;;;;:::i;:::-;43235:63;;:20;:63;:::i;:::-;:69;;;;:::i;:::-;43217:87;;43323:31;43338:15;43323:14;:31::i;:::-;43386:39;43410:15;43386:39;;:::i;:::-;;;43442:16;43523;;43505:15;;:34;;;;:::i;:::-;43482:18;;43462:17;;:38;;;;:::i;:::-;43461:79;;;;:::i;:::-;43442:98;;43595:1;43572:20;:24;:40;;;;;43611:1;43600:8;:12;43572:40;43569:1198;;;43724:16;;;43738:1;43724:16;;;;;;;;43658:21;;43633:22;;43724:16;43738:1;43724:16;;;;;;;;;;-1:-1:-1;43724:16:0;43700:40;;43777:4;43759;43764:1;43759:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43759:23:0;;;:7;;;;;;;;;;:23;;;;43811:15;;:22;;;-1:-1:-1;;;43811:22:0;;;;:15;;;;;:20;;:22;;;;;43759:7;;43811:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43801:4;43806:1;43801:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43801:32:0;;;:7;;;;;;;;;:32;43854:15;;:235;;-1:-1:-1;;;43854:235:0;;:15;;;:66;;:235;;43943:20;;43854:15;;44010:4;;44045;;44073:15;;43854:235;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44126:18;44171:14;44147:21;:38;;;;:::i;:::-;44126:59;;44252:1;44230:18;;44210:17;;:38;;;;:::i;:::-;44209:44;44206:304;;;44278:20;44357:8;44335:18;;44315:17;;:38;;;;:::i;:::-;44301:53;;:10;:53;:::i;:::-;:64;;;;:::i;:::-;44404:15;;44278:87;;-1:-1:-1;44388:47:0;;-1:-1:-1;;;;;44404:15:0;44278:87;44388:7;:47::i;:::-;44463:27;;160:25:1;;;44463:27:0;;148:2:1;133:18;44463:27:0;;;;;;;44255:255;44206:304;44572:1;44552:16;;44534:15;;:34;;;;:::i;:::-;44533:40;44530:222;;;44598:17;44670:8;44650:16;;44632:15;;:34;;;;:::i;:::-;44618:49;;:10;:49;:::i;:::-;:60;;;;:::i;:::-;44598:80;;44701:31;44722:9;44701:20;:31::i;:::-;44575:177;44530:222;43614:1153;;;43569:1198;-1:-1:-1;;44783:8:0;:16;;-1:-1:-1;;;;44783:16:0;;;42910:1901;44839:8;;-1:-1:-1;;;;;44863:25:0;;44823:12;44863:25;;;:19;:25;;;;;;44839:8;-1:-1:-1;;;44839:8:0;;;;;44838:9;;44863:25;;:52;;-1:-1:-1;;;;;;44892:23:0;;;;;;:19;:23;;;;;;;;44863:52;44860:99;;;-1:-1:-1;44942:5:0;44860:99;44974:7;44971:465;;;45042:13;;44998:18;;-1:-1:-1;;;;;45042:13:0;;;45034:21;;;;45031:229;;-1:-1:-1;45089:11:0;;45031:229;;;45132:13;;-1:-1:-1;;;;;45132:13:0;;;45126:19;;;;45122:138;;-1:-1:-1;45178:12:0;;45122:138;;;-1:-1:-1;45243:1:0;45122:138;45274:12;45311:3;45289:19;45298:10;45289:6;:19;:::i;:::-;:25;;;;:::i;:::-;45274:40;-1:-1:-1;45352:13:0;45274:40;45352:6;:13;:::i;:::-;45343:22;;45382:42;45398:4;45412;45419;45382:15;:42::i;:::-;44983:453;;44971:465;45448:33;45464:4;45470:2;45474:6;45448:15;:33::i;:::-;45498:15;;-1:-1:-1;;;;;45498:15:0;:26;45533:4;45540:15;45533:4;-1:-1:-1;;;;;18439:18:0;18412:7;18439:18;;;;;;;;;;;;18338:127;45540:15;45498:58;;-1:-1:-1;;;;;;45498:58:0;;;;;;;-1:-1:-1;;;;;16965:32:1;;;45498:58:0;;;16947:51:1;17014:18;;;17007:34;16920:18;;45498:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45494:74;45582:15;;-1:-1:-1;;;;;45582:15:0;:26;45617:2;45622:13;45617:2;-1:-1:-1;;;;;18439:18:0;18412:7;18439:18;;;;;;;;;;;;18338:127;45622:13;45582:54;;-1:-1:-1;;;;;;45582:54:0;;;;;;;-1:-1:-1;;;;;16965:32:1;;;45582:54:0;;;16947:51:1;17014:18;;;17007:34;16920:18;;45582:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45578:70;45664:8;;-1:-1:-1;;;45664:8:0;;;;45660:357;;45703:16;;45740:15;;:28;;-1:-1:-1;;;;;;45740:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;45740:15:0;;;;:23;;133:18:1;;45740:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:28:0;;;;;;;;-1:-1:-1;;45740:28:0;;;;;;;;;;;;:::i;:::-;;;45736:270;;;45866:86;;;8039:25:1;;;8095:2;8080:18;;8073:34;;;8123:18;;;8116:34;;;8181:2;8166:18;;8159:34;;;45942:9:0;;45931:4;;45866:86;;8026:3:1;8011:19;45866:86:0;;;;;;;45769:199;;;45736:270;45674:343;45660:357;41619:4405;;;41506:4518;;;:::o;4308:192::-;4394:7;4430:12;4422:6;;;;4414:29;;;;-1:-1:-1;;;4414:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4454:9:0;4466:5;4470:1;4466;:5;:::i;:::-;4454:17;4308:192;-1:-1:-1;;;;;4308:192:0:o;3753:191::-;3846:6;;;-1:-1:-1;;;;;3863:17:0;;;-1:-1:-1;;;;;;3863:17:0;;;;;;;3896:40;;3846:6;;;3863:17;3846:6;;3896:40;;3827:16;;3896:40;3816:128;3753:191;:::o;19858:569::-;-1:-1:-1;;;;;19998:20:0;;19990:70;;;;-1:-1:-1;;;19990:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20079:23:0;;20071:71;;;;-1:-1:-1;;;20071:71:0;;;;;;;:::i;:::-;20231;20253:6;20231:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20231:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;20211:17:0;;;:9;:17;;;;;;;;;;;:91;;;;20336:20;;;;;;;:32;;20361:6;20336:24;:32::i;:::-;-1:-1:-1;;;;;20313:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;20384:35;160:25:1;;;20313:20:0;;20384:35;;;;;;133:18:1;20384:35:0;14:177:1;46032:947:0;46091:12;46106:10;46115:1;46106:6;:10;:::i;:::-;46091:25;-1:-1:-1;46127:17:0;46147:13;46091:25;46147:6;:13;:::i;:::-;46256:16;;;46270:1;46256:16;;;;;;;;46127:33;;-1:-1:-1;46198:21:0;;46173:22;;46256:16;;;;;;;;;;-1:-1:-1;46256:16:0;46232:40;;46301:4;46283;46288:1;46283:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46283:23:0;;;:7;;;;;;;;;;:23;;;;46327:15;;:22;;;-1:-1:-1;;;46327:22:0;;;;:15;;;;;:20;;:22;;;;;46283:7;;46327:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46317:4;46322:1;46317:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46317:32:0;;;:7;;;;;;;;;:32;46362:15;;:207;;-1:-1:-1;;;46362:207:0;;:15;;;:66;;:207;;46443:4;;46362:15;;46506:4;;46533;;46553:15;;46362:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46590:18;46635:14;46611:21;:38;;;;:::i;:::-;46662:15;;:248;;-1:-1:-1;;;46662:248:0;;46735:4;46662:248;;;22149:34:1;22199:18;;;22192:34;;;46662:15:0;22242:18:1;;;22235:34;;;22285:18;;;22278:34;34322:42:0;22328:19:1;;;22321:44;46884:15:0;22381:19:1;;;22374:35;46590:59:0;;-1:-1:-1;;;;;;46662:15:0;;:31;;46590:59;;22083:19:1;;46662:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;46928:43:0;;;22622:25:1;;;22678:2;22663:18;;22656:34;;;22706:18;;;22699:34;;;46928:43:0;;-1:-1:-1;22610:2:1;22595:18;46928:43:0;;;;;;;46080:899;;;;;46032:947;:::o;38680:315::-;38793:6;38768:21;:31;;38760:73;;;;-1:-1:-1;;;38760:73:0;;22946:2:1;38760:73:0;;;22928:21:1;22985:2;22965:18;;;22958:30;23024:31;23004:18;;;22997:59;23073:18;;38760:73:0;22744:353:1;38760:73:0;38847:12;38865:9;-1:-1:-1;;;;;38865:14:0;38887:6;38865:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38846:52;;;38917:7;38909:78;;;;-1:-1:-1;;;38909:78:0;;23514:2:1;38909:78:0;;;23496:21:1;23553:2;23533:18;;;23526:30;23592:34;23572:18;;;23565:62;23663:28;23643:18;;;23636:56;23709:19;;38909:78:0;23312:422:1;46987:739:0;47075:16;;;47089:1;47075:16;;;;;;;;47051:21;;47075:16;;;;;;;;-1:-1:-1;;47112:15:0;;:22;;;-1:-1:-1;;;47112:22:0;;;;47051:40;;-1:-1:-1;;;;;;47112:15:0;;;;:20;;-1:-1:-1;47112:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47102:4;47107:1;47102:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;47102:32:0;;;-1:-1:-1;;;;;47102:32:0;;;;;47155:11;47145:4;47150:1;47145:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47145:21:0;;;:7;;;;;;;;;:21;47179:15;;:185;;-1:-1:-1;;;47179:185:0;;:15;;;:66;;47253:6;;47179:185;;:15;;47291:4;;47318;;47338:15;;47179:185;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47414:44:0;;-1:-1:-1;;;47414:44:0;;47452:4;47414:44;;;1570:51:1;47385:26:0;;-1:-1:-1;47421:11:0;-1:-1:-1;;;;;47414:29:0;;-1:-1:-1;47414:29:0;;-1:-1:-1;1543:18:1;;47414:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47521:15;;47484:74;;-1:-1:-1;;;47484:74:0;;-1:-1:-1;;;;;47521:15:0;;;47484:74;;;16947:51:1;17014:18;;;17007:34;;;47385:73:0;;-1:-1:-1;47469:12:0;;47491:11;47484:28;;;;;;16920:18:1;;47484:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47469:89;;47575:7;47571:148;;;47599:15;;:55;;-1:-1:-1;;;47599:55:0;;;;;160:25:1;;;-1:-1:-1;;;;;47599:15:0;;;;:35;;133:18:1;;47599:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47674:33;47688:18;47674:33;;;;160:25:1;;148:2;133:18;;14:177;47674:33:0;;;;;;;;47040:686;;;46987:739;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1632:247::-;1691:6;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;1799:9;1786:23;1818:31;1843:5;1818:31;:::i;1884:456::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2085:9;2072:23;2104:31;2129:5;2104:31;:::i;:::-;2154:5;-1:-1:-1;2211:2:1;2196:18;;2183:32;2224:33;2183:32;2224:33;:::i;:::-;1884:456;;2276:7;;-1:-1:-1;;;2330:2:1;2315:18;;;;2302:32;;1884:456::o;2345:180::-;2404:6;2457:2;2445:9;2436:7;2432:23;2428:32;2425:52;;;2473:1;2470;2463:12;2425:52;-1:-1:-1;2496:23:1;;2345:180;-1:-1:-1;2345:180:1:o;3159:118::-;3245:5;3238:13;3231:21;3224:5;3221:32;3211:60;;3267:1;3264;3257:12;3282:241;3338:6;3391:2;3379:9;3370:7;3366:23;3362:32;3359:52;;;3407:1;3404;3397:12;3359:52;3446:9;3433:23;3465:28;3487:5;3465:28;:::i;3528:316::-;3605:6;3613;3621;3674:2;3662:9;3653:7;3649:23;3645:32;3642:52;;;3690:1;3687;3680:12;3642:52;-1:-1:-1;;3713:23:1;;;3783:2;3768:18;;3755:32;;-1:-1:-1;3834:2:1;3819:18;;;3806:32;;3528:316;-1:-1:-1;3528:316:1:o;3849:382::-;3914:6;3922;3975:2;3963:9;3954:7;3950:23;3946:32;3943:52;;;3991:1;3988;3981:12;3943:52;4030:9;4017:23;4049:31;4074:5;4049:31;:::i;:::-;4099:5;-1:-1:-1;4156:2:1;4141:18;;4128:32;4169:30;4128:32;4169:30;:::i;:::-;4218:7;4208:17;;;3849:382;;;;;:::o;4942:248::-;5010:6;5018;5071:2;5059:9;5050:7;5046:23;5042:32;5039:52;;;5087:1;5084;5077:12;5039:52;-1:-1:-1;;5110:23:1;;;5180:2;5165:18;;;5152:32;;-1:-1:-1;4942:248:1:o;5195:388::-;5263:6;5271;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5379:9;5366:23;5398:31;5423:5;5398:31;:::i;:::-;5448:5;-1:-1:-1;5505:2:1;5490:18;;5477:32;5518:33;5477:32;5518:33;:::i;5588:380::-;5667:1;5663:12;;;;5710;;;5731:61;;5785:4;5777:6;5773:17;5763:27;;5731:61;5838:2;5830:6;5827:14;5807:18;5804:38;5801:161;;5884:10;5879:3;5875:20;5872:1;5865:31;5919:4;5916:1;5909:15;5947:4;5944:1;5937:15;5801:161;;5588:380;;;:::o;5973:356::-;6175:2;6157:21;;;6194:18;;;6187:30;6253:34;6248:2;6233:18;;6226:62;6320:2;6305:18;;5973:356::o;6334:184::-;6404:6;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;-1:-1:-1;6496:16:1;;6334:184;-1:-1:-1;6334:184:1:o;6828:245::-;6895:6;6948:2;6936:9;6927:7;6923:23;6919:32;6916:52;;;6964:1;6961;6954:12;6916:52;6996:9;6990:16;7015:28;7037:5;7015:28;:::i;7497:306::-;7585:6;7593;7601;7654:2;7642:9;7633:7;7629:23;7625:32;7622:52;;;7670:1;7667;7660:12;7622:52;7699:9;7693:16;7683:26;;7749:2;7738:9;7734:18;7728:25;7718:35;;7793:2;7782:9;7778:18;7772:25;7762:35;;7497:306;;;;;:::o;8204:127::-;8265:10;8260:3;8256:20;8253:1;8246:31;8296:4;8293:1;8286:15;8320:4;8317:1;8310:15;8336:125;8401:9;;;8422:10;;;8419:36;;;8435:18;;:::i;9659:400::-;9861:2;9843:21;;;9900:2;9880:18;;;9873:30;9939:34;9934:2;9919:18;;9912:62;-1:-1:-1;;;10005:2:1;9990:18;;9983:34;10049:3;10034:19;;9659:400::o;10417:681::-;10548:6;10556;10564;10572;10580;10588;10596;10604;10657:3;10645:9;10636:7;10632:23;10628:33;10625:53;;;10674:1;10671;10664:12;10625:53;10706:9;10700:16;10725:31;10750:5;10725:31;:::i;:::-;10775:5;10765:15;;;10820:2;10809:9;10805:18;10799:25;10789:35;;10864:2;10853:9;10849:18;10843:25;10833:35;;10908:2;10897:9;10893:18;10887:25;10877:35;;10952:3;10941:9;10937:19;10931:26;10921:36;;10997:3;10986:9;10982:19;10976:26;10966:36;;11042:3;11031:9;11027:19;11021:26;11011:36;;11087:3;11076:9;11072:19;11066:26;11056:36;;10417:681;;;;;;;;;;;:::o;11103:217::-;11143:1;11169;11159:132;;11213:10;11208:3;11204:20;11201:1;11194:31;11248:4;11245:1;11238:15;11276:4;11273:1;11266:15;11159:132;-1:-1:-1;11305:9:1;;11103:217::o;11756:422::-;11845:1;11888:5;11845:1;11902:270;11923:7;11913:8;11910:21;11902:270;;;11982:4;11978:1;11974:6;11970:17;11964:4;11961:27;11958:53;;;11991:18;;:::i;:::-;12041:7;12031:8;12027:22;12024:55;;;12061:16;;;;12024:55;12140:22;;;;12100:15;;;;11902:270;;;11906:3;11756:422;;;;;:::o;12183:806::-;12232:5;12262:8;12252:80;;-1:-1:-1;12303:1:1;12317:5;;12252:80;12351:4;12341:76;;-1:-1:-1;12388:1:1;12402:5;;12341:76;12433:4;12451:1;12446:59;;;;12519:1;12514:130;;;;12426:218;;12446:59;12476:1;12467:10;;12490:5;;;12514:130;12551:3;12541:8;12538:17;12535:43;;;12558:18;;:::i;:::-;-1:-1:-1;;12614:1:1;12600:16;;12629:5;;12426:218;;12728:2;12718:8;12715:16;12709:3;12703:4;12700:13;12696:36;12690:2;12680:8;12677:16;12672:2;12666:4;12663:12;12659:35;12656:77;12653:159;;;-1:-1:-1;12765:19:1;;;12797:5;;12653:159;12844:34;12869:8;12863:4;12844:34;:::i;:::-;12914:6;12910:1;12906:6;12902:19;12893:7;12890:32;12887:58;;;12925:18;;:::i;:::-;12963:20;;12183:806;-1:-1:-1;;;12183:806:1:o;12994:140::-;13052:5;13081:47;13122:4;13112:8;13108:19;13102:4;13081:47;:::i;13571:168::-;13644:9;;;13675;;13692:15;;;13686:22;;13672:37;13662:71;;13713:18;;:::i;18216:401::-;18418:2;18400:21;;;18457:2;18437:18;;;18430:30;18496:34;18491:2;18476:18;;18469:62;-1:-1:-1;;;18562:2:1;18547:18;;18540:35;18607:3;18592:19;;18216:401::o;18622:399::-;18824:2;18806:21;;;18863:2;18843:18;;;18836:30;18902:34;18897:2;18882:18;;18875:62;-1:-1:-1;;;18968:2:1;18953:18;;18946:33;19011:3;18996:19;;18622:399::o;19379:423::-;19581:2;19563:21;;;19620:2;19600:18;;;19593:30;19659:34;19654:2;19639:18;;19632:62;19730:29;19725:2;19710:18;;19703:57;19792:3;19777:19;;19379:423::o;19807:128::-;19874:9;;;19895:11;;;19892:37;;;19909:18;;:::i;20072:127::-;20133:10;20128:3;20124:20;20121:1;20114:31;20164:4;20161:1;20154:15;20188:4;20185:1;20178:15;20204:251;20274:6;20327:2;20315:9;20306:7;20302:23;20298:32;20295:52;;;20343:1;20340;20333:12;20295:52;20375:9;20369:16;20394:31;20419:5;20394:31;:::i;20460:461::-;20513:3;20551:5;20545:12;20578:6;20573:3;20566:19;20604:4;20633:2;20628:3;20624:12;20617:19;;20670:2;20663:5;20659:14;20691:1;20701:195;20715:6;20712:1;20709:13;20701:195;;;20780:13;;-1:-1:-1;;;;;20776:39:1;20764:52;;20836:12;;;;20871:15;;;;20812:1;20730:9;20701:195;;;-1:-1:-1;20912:3:1;;20460:461;-1:-1:-1;;;;;20460:461:1:o;20926:582::-;21225:6;21214:9;21207:25;21268:6;21263:2;21252:9;21248:18;21241:34;21311:3;21306:2;21295:9;21291:18;21284:31;21188:4;21332:57;21384:3;21373:9;21369:19;21361:6;21332:57;:::i;:::-;-1:-1:-1;;;;;21425:32:1;;;;21420:2;21405:18;;21398:60;-1:-1:-1;21489:3:1;21474:19;21467:35;21324:65;20926:582;-1:-1:-1;;;20926:582:1:o;23739:510::-;24010:6;23999:9;23992:25;24053:3;24048:2;24037:9;24033:18;24026:31;23973:4;24074:57;24126:3;24115:9;24111:19;24103:6;24074:57;:::i;:::-;-1:-1:-1;;;;;24167:32:1;;;;24162:2;24147:18;;24140:60;-1:-1:-1;24231:2:1;24216:18;24209:34;24066:65;23739:510;-1:-1:-1;;23739:510:1:o

Swarm Source

ipfs://fd9faf74f29aaf25a5d72b13e24ce7779f51d35d572822387da1d75265381d7d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.