ETH Price: $3,467.05 (-1.41%)
Gas: 3 Gwei

Token

Super Choice (Choice)
 

Overview

Max Total Supply

100,000,000 Choice

Holders

87

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
31.942154921 Choice

Value
$0.00
0xB863980242C7af4926bB34478EDcE698023d464C
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:
SuperChoice

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-03
*/

// SPDX-License-Identifier: MIT

/* 

Super Choice
Twitter: https://twitter.com/SuperChoiceERC
Telegram: https://t.me/SuperChoicePortal
Website: https://www.superchoice.io/

*/

pragma solidity ^0.8.6;
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
        this;
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}
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);
}

interface DividendPayingTokenInterface {
  function dividendOf(address _owner) external view returns(uint256);
  function distributeDividends() external payable;
  function withdrawDividend() external;
  event DividendsDistributed(address indexed from, uint256 weiAmount);
  event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
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;
        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) {
        require(b != -1 || a != MIN_INT256);
        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 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;
        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;
    }
}

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;
    uint8 private _decimals;
    constructor(string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }
    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 _decimals;
    }
    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 {}
}

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;
  uint256 constant internal magnitude = 2**128;
  uint256 internal magnifiedDividendPerShare;
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  mapping(address => uint256) internal rawETHWithdrawnDividends;
  mapping(address => address) public userCurrentRewardToken;
  mapping(address => bool) public userHasCustomRewardToken;
  mapping(address => address) public userCurrentRewardAMM;
  mapping(address => bool) public userHasCustomRewardAMM;
  mapping(address => uint256) public rewardTokenSelectionCount; // keep track of how many people have each reward token selected (for fun mostly)
  mapping(address => bool) public ammIsWhiteListed; // only allow whitelisted AMMs
  mapping(address => bool) public ignoreRewardTokens;
  IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
  function updateDividendUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "CHOICE: The router already has that address");
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
  uint256 public totalDividendsDistributed; // dividends distributed per reward token
  constructor(string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol, _decimals) {
    // add whitelisted AMMs here -- more will get added postlaunch
    ammIsWhiteListed[address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)] = true; // UNISWAP V2 router
  }

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }
  // Customized function to send tokens to dividend recipients
  function swapETHForTokens(
        address recipient,
        uint256 ethAmount
    ) private returns (uint256) {
        bool swapSuccess;
        IERC20 token = IERC20(userCurrentRewardToken[recipient]);
        IUniswapV2Router02 swapRouter = uniswapV2Router;
        if(userHasCustomRewardAMM[recipient] && ammIsWhiteListed[userCurrentRewardAMM[recipient]]){
            swapRouter = IUniswapV2Router02(userCurrentRewardAMM[recipient]);
        }
        // generate the pancake pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = swapRouter.WETH();
        path[1] = address(token);
        try swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( //try to swap for tokens, if it fails (bad contract, or whatever other reason, send ETH)
            1, // accept any amount of Tokens above 1 wei (so it will fail if nothing returns)
            path,
            address(recipient),
            block.timestamp + 360
        ){
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }
        // if the swap failed, send them their ETH instead
        if(!swapSuccess){
            rawETHWithdrawnDividends[recipient] = rawETHWithdrawnDividends[recipient].add(ethAmount);
            (bool success,) = recipient.call{value: ethAmount, gas: 3000}("");
    
            if(!success) {
                withdrawnDividends[recipient] = withdrawnDividends[recipient].sub(ethAmount);
                rawETHWithdrawnDividends[recipient] = rawETHWithdrawnDividends[recipient].sub(ethAmount);
                return 0;
            }
        }
        return ethAmount;
    }
  
  function setIgnoreToken(address tokenAddress, bool isIgnored) external onlyOwner {
      ignoreRewardTokens[tokenAddress] = isIgnored;
  }
  
  function isIgnoredToken(address tokenAddress) public view returns (bool){
      return ignoreRewardTokens[tokenAddress];
  }
  
  function getRawETHDividends(address holder) external view returns (uint256){
      return rawETHWithdrawnDividends[holder];
  }
    
  function setWhiteListAMM(address ammAddress, bool whitelisted) external onlyOwner {
      ammIsWhiteListed[ammAddress] = whitelisted;
  }
  
  // call this to set a custom reward token (call from token contract only)
  function setRewardToken(address holder, address rewardTokenAddress, address ammContractAddress) external onlyOwner {
    if(userHasCustomRewardToken[holder] == true){
        if(rewardTokenSelectionCount[userCurrentRewardToken[holder]] > 0){
            rewardTokenSelectionCount[userCurrentRewardToken[holder]] -= 1; // remove count from old token
        }
    }

    userHasCustomRewardToken[holder] = true;
    userCurrentRewardToken[holder] = rewardTokenAddress;
    // only set custom AMM if the AMM is whitelisted.
    if(ammContractAddress != address(uniswapV2Router) && ammIsWhiteListed[ammContractAddress]){
        userHasCustomRewardAMM[holder] = true;
        userCurrentRewardAMM[holder] = ammContractAddress;
    } else {
        userHasCustomRewardAMM[holder] = false;
        userCurrentRewardAMM[holder] = address(uniswapV2Router);
    }
    rewardTokenSelectionCount[rewardTokenAddress] += 1; // add count to new token
  }
  // call this to go back to receiving ETH after setting another token. (call from token contract only)
  function unsetRewardToken(address holder) external onlyOwner {
    userHasCustomRewardToken[holder] = false;
    if(rewardTokenSelectionCount[userCurrentRewardToken[holder]] > 0){
        rewardTokenSelectionCount[userCurrentRewardToken[holder]] -= 1; // remove count from old token
    }
    userCurrentRewardToken[holder] = address(0);
    userCurrentRewardAMM[holder] = address(uniswapV2Router);
    userHasCustomRewardAMM[holder] = false;
  }
  function distributeDividends() public override payable {
    require(totalSupply() > 0);

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

      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
         // if no custom reward token or reward token is ignored, send ETH.
        if(!userHasCustomRewardToken[user] && !isIgnoredToken(userCurrentRewardToken[user])){
        
          withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
          rawETHWithdrawnDividends[user] = rawETHWithdrawnDividends[user].add(_withdrawableDividend);
          emit DividendWithdrawn(user, _withdrawableDividend);
          (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
    
          if(!success) {
            withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
            rawETHWithdrawnDividends[user] = rawETHWithdrawnDividends[user].sub(_withdrawableDividend);
            return 0;
          }
          return _withdrawableDividend;
          
        // the reward is a token, not ETH, use an IERC20 buyback instead!
        } else { 
          withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
          emit DividendWithdrawn(user, _withdrawableDividend);
          return swapETHForTokens(user, _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);
    }
  }
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    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 IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}


interface IUniswapV2Pair {
    function factory() external view returns (address);
}

contract SuperChoice is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool private swapping;

    CHOICEDividendTracker public dividendTracker;
    
    mapping(address => uint256) public holderETHUsedForBuyBacks;
    mapping(address => bool) public _isAllowedDuringDisabled;
    mapping(address => bool) public _isIgnoredAddress;

    address public liquidityWallet;
    address public operationsWallet;
    address private buyBackWallet;

    uint256 public maxSellTransactionAmount = 100000000  * (10**9);
    uint256 public swapTokensAtAmount = 100000 * (10**9);
    
    // Anti-bot and anti-whale mappings and variables for launch
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;
    
    
    // to track last sell to reduce sell penalty over time by 10% per week the holder sells *no* tokens.
    mapping (address => uint256) public _holderLastSellDate;
    
    // fees
    uint256 public RewardsFee = 5;
    uint256 public liquidityFee = 2; // This fee must be a TOTAL of LP, Operations Fee AND Buyback fee (Note, Buyback has been disabled)
    uint256 public totalFees = RewardsFee.add(liquidityFee);
    // this is a subset of the liquidity fee, not in addition to. operations fee + buyback fee cannot be higher than liquidity fee.  Will be reasonably reduced post launch.
    uint256 public operationsFee = 3;
    uint256 public buyBackFee = 0;
	uint256 public _maxSellPercent = 1; // Set the maximum percent allowed on sale per a single transaction
    
    // Disable trading initially
    bool isTradingEnabled = false;
    
    // Swap and liquify active status 
    bool isSwapAndLiquifyEnabled = false;

    // sells have fees of 4.8 and 12 (16.8 total) (4 * 1.2 and 10 * 1.2)
    uint256 public immutable sellFeeIncreaseFactor = 100;
    uint256 public immutable rewardFeeSellFactor = 100;

    // use by default 300,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 300000;

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event BuyBackWithNoFees(address indexed holder, uint256 indexed ethSpent);
    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event OperationsWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event BuyBackWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event FeesUpdated(uint256 indexed newRewardsFee, uint256 indexed newLiquidityFee, uint256 newOperationsFee, uint256 newBuyBackFee);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() ERC20("Super Choice", "Choice", 9) {

        dividendTracker = new CHOICEDividendTracker();
        liquidityWallet = owner();
        operationsWallet = (0x7A5a85BA12Eab427ea66D7748a964161A5c0C559);
        buyBackWallet = owner();
        
       IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(liquidityWallet);
        dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD)); // don't want dead address to take ETH!!!
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        // exclude from paying fees or having max transaction amount
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(dividendTracker), true);
        excludeFromFees(address(operationsWallet), true);
        excludeFromFees(address(buyBackWallet), true);
        
        _isAllowedDuringDisabled[address(this)] = true;
        _isAllowedDuringDisabled[owner()] = true;
        _isAllowedDuringDisabled[liquidityWallet] = true;
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 100000000 * (10**9));
    }

    receive() external payable {

    }
    
    // @dev Owner functions start -------------------------------------
    
    // enable / disable custom AMMs
    function setWhiteListAMM(address ammAddress, bool isWhiteListed) external onlyOwner {
      require(isContract(ammAddress), "CHOICE: setWhiteListAMM:: AMM is a wallet, not a contract");
      dividendTracker.setWhiteListAMM(ammAddress, isWhiteListed);
    }
    
    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount < totalSupply(), "Swap amount cannot be higher than total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }
    
    // remove transfer delay after launch
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }
    
    // migration feature (DO NOT CHANGE WITHOUT CONSULTATION)
    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "CHOICE: The dividend tracker already has that address");
        CHOICEDividendTracker newDividendTracker = CHOICEDividendTracker(payable(newAddress));
        require(newDividendTracker.owner() == address(this), "CHOICE: The new dividend tracker must be owned by the CHOICE token contract");
        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));
        emit UpdateDividendTracker(newAddress, address(dividendTracker));
        dividendTracker = newDividendTracker;
    }
    
    // updates the maximum amount of tokens that can be bought or sold by holders
    function updateMaxTxn(uint256 maxTxnAmount) external onlyOwner {
        maxSellTransactionAmount = maxTxnAmount;
    }
    
    // updates the minimum amount of tokens people must hold in order to get dividends
    function updateDividendTokensMinimum(uint256 minimumToEarnDivs) external onlyOwner {
        dividendTracker.updateDividendMinimum(minimumToEarnDivs);
    }

    // updates the default router for selling tokens
    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "CHOICE: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
    
    // updates the default router for buying tokens from dividend tracker
    function updateDividendUniswapV2Router(address newAddress) external onlyOwner {
        dividendTracker.updateDividendUniswapV2Router(newAddress);
    }
    
    // updates the current trading status of the contract 
    function updateTradingStatus(bool tradingStatus) external onlyOwner {
        isTradingEnabled = tradingStatus;
    }

    // excludes wallets from max txn and fees.
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // allows multiple exclusions at once
    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }
    
    function addToWhitelist(address wallet, bool status) external onlyOwner {
        _isAllowedDuringDisabled[wallet] = status;
    }
    
    function setIsBot(address wallet, bool status) external onlyOwner {
        _isIgnoredAddress[wallet] = status;
    }

    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }
    
    // allow adding additional AMM pairs to the list
    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "CHOICE: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }
    
    // sets the wallet that receives LP tokens to lock
    function updateLiquidityWallet(address newLiquidityWallet) external onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "CHOICE: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }
    
    // updates the operations wallet (marketing, charity, etc.)
    function updateOperationsWallet(address newOperationsWallet) external onlyOwner {
        require(newOperationsWallet != operationsWallet, "CHOICE: The operations wallet is already this address");
        excludeFromFees(newOperationsWallet, true);
        emit OperationsWalletUpdated(newOperationsWallet, operationsWallet);
        operationsWallet = newOperationsWallet;
    }
    
    // updates the wallet used for manual buybacks.
    function updateBuyBackWallet(address newBuyBackWallet) external onlyOwner {
        require(newBuyBackWallet != buyBackWallet, "CHOICE: The buyback wallet is already this address");
        excludeFromFees(newBuyBackWallet, true);
        emit BuyBackWalletUpdated(newBuyBackWallet, buyBackWallet);
        buyBackWallet = newBuyBackWallet;
    }
    
    // rebalance fees as needed
    function updateFees(uint256 RewardPerc, uint256 liquidityPerc, uint256 operationsPerc, uint256 buyBackPerc) external onlyOwner {
        require (operationsPerc.add(buyBackPerc) <= liquidityPerc, "CHOICE: updateFees:: Liquidity Perc must be equal to or higher than operations and buyback combined.");
        emit FeesUpdated(RewardPerc, liquidityPerc, operationsPerc, buyBackPerc);
        RewardsFee = RewardPerc;
        liquidityFee = liquidityPerc;
        operationsFee = operationsPerc;
        buyBackFee= buyBackPerc;
        
        totalFees = RewardsFee.add(liquidityFee);
        
    }

    // changes the gas reserve for processing dividend distribution
    function updateGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "CHOICE: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "CHOICE: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    // changes the amount of time to wait for claims (1-24 hours, expressed in seconds)
    function updateClaimWait(uint256 claimWait) external onlyOwner returns (bool){
        dividendTracker.updateClaimWait(claimWait);
        return true;
    }
    
    function setIgnoreToken(address tokenAddress, bool isIgnored) external onlyOwner returns (bool){
        dividendTracker.setIgnoreToken(tokenAddress, isIgnored);
        return true;
    }
    
    // determines if an AMM can be used for rewards
    function isAMMWhitelisted(address ammAddress) public view returns (bool){
        return dividendTracker.ammIsWhiteListed(ammAddress);
    }
    
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    
    function getUserCurrentRewardToken(address holder) public view returns (address){
        return dividendTracker.userCurrentRewardToken(holder);
    }
    
    function getUserHasCustomRewardToken(address holder) public view returns (bool){
        return dividendTracker.userHasCustomRewardToken(holder);
    }
    
    function getRewardTokenSelectionCount(address token) public view returns (uint256){
        return dividendTracker.rewardTokenSelectionCount(token);
    }
    
    function getLastProcessedIndex() external view returns(uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    // returns a number between 50 and 120 that determines the penalty a user pays on sells.
    
    function getHolderSellFactor(address holder) public view returns (uint256){
        // get time since last sell measured in 2 week increments
        uint256 timeSinceLastSale = (block.timestamp.sub(_holderLastSellDate[holder])).div(2 weeks);
        // protection in case someone tries to use a contract to facilitate buys/sells
        if(_holderLastSellDate[holder] == 0){
            return sellFeeIncreaseFactor;
        }
        // cap the sell factor cooldown to 14 weeks and 50% of sell tax
        if(timeSinceLastSale >= 7){
            return 50; // 50% sell factor is minimum
        }
        // return the fee factor minus the number of weeks since sale * 10.  SellFeeIncreaseFactor is immutable at 120 so the most this can subtract is 6*10 = 120 - 60 = 60%
        return sellFeeIncreaseFactor-(timeSinceLastSale.mul(10));
    }
    
     function getDividendTokensMinimum() external view returns (uint256) {
        return dividendTracker.minimumTokenBalanceForDividends();
    }
    
    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

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

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

    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 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 getRawETHDividends(address holder) public view returns (uint256){
        return dividendTracker.getRawETHDividends(holder);
    }
    
    function getETHAvailableForHolderBuyBack(address holder) public view returns (uint256){
        return getRawETHDividends(holder).sub(holderETHUsedForBuyBacks[msg.sender]);
    }
    
    function isIgnoredToken(address tokenAddress) public view returns (bool){
        return dividendTracker.isIgnoredToken(tokenAddress);
    }
    
    // @dev User Callable Functions start here! ---------------------------------------------
    
    // set the reward token for the user.  Call from here.
    function setRewardToken(address rewardTokenAddress) public returns (bool) {
        require(isContract(rewardTokenAddress), "CHOICE: setRewardToken:: Address is a wallet, not a contract.");
        require(rewardTokenAddress != address(this), "CHOICE: setRewardToken:: Cannot set reward token as this token due to Router limitations.");
        require(!isIgnoredToken(rewardTokenAddress), "CHOICE: setRewardToken:: Reward Token is ignored from being used as rewards.");
        dividendTracker.setRewardToken(msg.sender, rewardTokenAddress, address(uniswapV2Router));
        return true;
    }
    
    // set the reward token for the user with a custom AMM (AMM must be whitelisted).  Call from here.
    function setRewardTokenWithCustomAMM(address rewardTokenAddress, address ammContractAddress) public returns (bool) {
        require(isContract(rewardTokenAddress), "CHOICE: setRewardToken:: Address is a wallet, not a contract.");
        require(ammContractAddress != address(uniswapV2Router), "CHOICE: setRewardToken:: Use setRewardToken to use default Router");
        require(rewardTokenAddress != address(this), "CHOICE: setRewardToken:: Cannot set reward token as this token due to Router limitations.");
        require(!isIgnoredToken(rewardTokenAddress), "CHOICE: setRewardToken:: Reward Token is ignored from being used as rewards.");
        require(isAMMWhitelisted(ammContractAddress) == true, "CHOICE: setRewardToken:: AMM is not whitelisted!");
        dividendTracker.setRewardToken(msg.sender, rewardTokenAddress, ammContractAddress);
        return true;
    }
    
    // Unset the reward token back to ETH.  Call from here.
    function unsetRewardToken() public returns (bool){
        dividendTracker.unsetRewardToken(msg.sender);
        return true;
    }
    
    // Activate trading on the contract and enable swapAndLiquify for tax redemption against LP
    function activateContract() public onlyOwner {
        isTradingEnabled = true;
        isSwapAndLiquifyEnabled = true;
    }
    
    // Holders can buyback with no fees up to their claimed raw ETH amount.
    function buyBackTokensWithNoFees() external payable returns (bool) {
        uint256 userRawETHDividends = getRawETHDividends(msg.sender);
        require(userRawETHDividends >= holderETHUsedForBuyBacks[msg.sender].add(msg.value), "CHOICE: buyBackTokensWithNoFees:: Cannot Spend more than earned.");
        
        uint256 ethAmount = msg.value;
        
        // generate the pancake pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        
        // update amount to prevent user from buying with more ETH than they've received as raw rewards (lso update before transfer to prevent reentrancy)
        holderETHUsedForBuyBacks[msg.sender] = holderETHUsedForBuyBacks[msg.sender].add(msg.value);
        
        bool prevExclusion = _isExcludedFromFees[msg.sender]; // ensure we don't remove exclusions if the current wallet is already excluded
        // make the swap to the contract first to bypass fees
        _isExcludedFromFees[msg.sender] = true;
        
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( //try to swap for tokens, if it fails (bad contract, or whatever other reason, send ETH)
            0,
            path,
            address(msg.sender),
            block.timestamp + 360
        );
        
        _isExcludedFromFees[msg.sender] = prevExclusion; // set value to match original value
        emit BuyBackWithNoFees(msg.sender, ethAmount);
        return true;
    }
    
    // allows a user to manually claim their tokens.
    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }
    
    // allow a user to manuall process dividends.
    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }
    
    // @dev Token functions
    
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "CHOICE: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    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(!_isIgnoredAddress[to] || !_isIgnoredAddress[from], "CHOICE: To/from address is ignored");
        
        if(!isTradingEnabled) {
            require(_isAllowedDuringDisabled[to] || _isAllowedDuringDisabled[from], "Trading is currently disabled");
        }
        
        if(automatedMarketMakerPairs[to] && !isTradingEnabled && _isAllowedDuringDisabled[from]) {
            require((from == owner() || to == owner()) || _isAllowedDuringDisabled[from], "Only dev can trade against UNISWAP during migration");
        }
        
        // early exit with no other logic if transfering 0 (to prevent 0 transfers from triggering other logic)
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        // Prevent buying more than 1 txn per block at launch. Bot killer. Will be removed shortly after launch.
        
        if (transferDelayEnabled){
            if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair) && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]){
                require(_holderLastTransferTimestamp[to] < block.timestamp, "_transfer:: Transfer Delay enabled.  Please try again later.");
                _holderLastTransferTimestamp[to] = block.timestamp;
            }
        }
        
        // set last sell date to first purchase date for new wallet
        
        if(!isContract(to) && !_isExcludedFromFees[to]){
            if(_holderLastSellDate[to] == 0){
                _holderLastSellDate[to] == block.timestamp;
            }
        }
        
        // update sell date on buys to prevent gaming the decaying sell tax feature.  
        // Every buy moves the sell date up 1/3rd of the difference between last sale date and current timestamp
        
        if(!isContract(to) && automatedMarketMakerPairs[from] && !_isExcludedFromFees[to]){
            if(_holderLastSellDate[to] >= block.timestamp){
                _holderLastSellDate[to] = _holderLastSellDate[to].add(block.timestamp.sub(_holderLastSellDate[to]).div(3));
            }
        }
        
	if(automatedMarketMakerPairs[to]){

		require(amount <= maxSellTransactionAmount, "ERC20: Exceeds max sell amount");

		amount = amount.mul(_maxSellPercent).div(100); // Maximum sell of 99% per one single transaction, to ensure some loose change is left in the holders wallet .
	}

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(
            canSwap &&
            !swapping &&
            isSwapAndLiquifyEnabled &&
            !automatedMarketMakerPairs[from] &&
            from != liquidityWallet &&
            to != liquidityWallet &&
            from != operationsWallet &&
            to != operationsWallet &&
            from != buyBackWallet &&
            to != buyBackWallet &&
            !_isExcludedFromFees[to] &&
            !_isExcludedFromFees[from] &&
            from != address(this) &&
            from != address(dividendTracker)
        ) {

            swapping = true;
            
            uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            swapping = false;
        }


        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to] || from == address(this)) {
            takeFee = false;
        }
        if(takeFee) {
            uint256 fees = amount.mul(totalFees).div(100);
            // if sell, multiply by holderSellFactor (decaying sell penalty by 10% every 2 weeks without selling)
            if(automatedMarketMakerPairs[to]) {
                uint256 rewardSellFee = amount.mul(RewardsFee).div(100).mul(rewardFeeSellFactor).div(100);
                uint256 otherSellFee = amount.mul(liquidityFee).div(100).mul(getHolderSellFactor(from)).div(100);
                fees = rewardSellFee.add(otherSellFee);
                _holderLastSellDate[from] = block.timestamp; // update last sale date on sell!
                
            }
            amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
        }
        super._transfer(from, to, amount);
        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
        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 {
        
        if(liquidityFee > 0){ // dividing by 0 is not fun.
            // split the contract balance into proper pieces
            // figure out how many tokens should be sold for liquidity vs operations / buybacks.
            uint256 tokensForLiquidity;
            if(liquidityFee > 0){
                tokensForLiquidity = tokens.mul(liquidityFee.sub(buyBackFee.add(operationsFee))).div(liquidityFee);
            } else {
                tokensForLiquidity = 0;
            }
            uint256 tokensForBuyBackAndOperations = tokens.sub(tokensForLiquidity);
            uint256 half = tokensForLiquidity.div(2);
            uint256 otherHalf = tokensForLiquidity.sub(half);
            uint256 initialBalance = address(this).balance;
            // swap tokens for ETH
            swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
            // how much ETH did we just swap into?
            uint256 newBalance = address(this).balance.sub(initialBalance);
            // add liquidity to uniswap
            addLiquidity(otherHalf, newBalance);
            swapTokensForEth(tokensForBuyBackAndOperations);
            uint256 balanceForOperationsAndBuyBack = address(this).balance.sub(initialBalance);
            bool success;
            if(operationsFee > 0){
                // Send amounts to Operations Wallet
                uint256 operationsBalance = balanceForOperationsAndBuyBack.mul(operationsFee).div(buyBackFee.add(operationsFee));
                (success,) = payable(operationsWallet).call{value: operationsBalance}("");
                require(success, "CHOICE: SwapAndLiquify:: Unable to send ETH to Operations Wallet");
            }
            if(buyBackFee > 0){
                // Send amounts to BuyBack Wallet
                uint256 buyBackBalance = balanceForOperationsAndBuyBack.mul(buyBackFee).div(buyBackFee.add(operationsFee));
                (success,) = payable(buyBackWallet).call{value: buyBackBalance}("");
                require(success, "CHOICE: SwapAndLiquify:: Unable to send ETH to BuyBack Wallet");
            }
            emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForEth(tokens);
        uint256 dividends = address(this).balance;
        (bool success,) = address(dividendTracker).call{value: dividends}("");
        if(success) {
            emit SendDividends(tokens, dividends);
        }
    }

	function recoverContractETH(uint256 recoverRate) public onlyOwner{
        		uint256 ethAmount = address(this).balance;
        		if(ethAmount > 0){
            	sendToOperationsWallet(ethAmount.mul(recoverRate).div(100));
        		}
    	}
	function sendToOperationsWallet(uint256 amount) private {
        		payable(operationsWallet).transfer(amount);
    	}

    function setMaxSellPercent(uint256 maxSellPercent) public onlyOwner {
        require(maxSellPercent < 100, "Max sell percent must be under 100%");
        _maxSellPercent = maxSellPercent;
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }
    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }
    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }
    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }
    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }
        delete map.inserted[key];
        delete map.values[key];
        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];
        map.indexOf[lastKey] = index;
        delete map.indexOf[key];
        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

contract CHOICEDividendTracker is 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 IncludeInDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("CHOICE_Dividend_Tracker", "CHOICE_Dividend_Tracker", 9) {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 500 * (10**9); //must hold 500+ tokens to get divs
    }

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

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

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function includeInDividends(address account) external onlyOwner {
        require(excludedFromDividends[account]);
        excludedFromDividends[account] = false;
        emit IncludeInDividends(account);
    }
    
    function updateDividendMinimum(uint256 minimumToEarnDivs) external onlyOwner {
        minimumTokenBalanceForDividends = minimumToEarnDivs;
    }

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

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

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

    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 Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"BuyBackWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethSpent","type":"uint256"}],"name":"BuyBackWithNoFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newRewardsFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newOperationsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyBackFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"OperationsWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"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":[],"name":"RewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_holderLastSellDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isAllowedDuringDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isIgnoredAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSellPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackTokensWithNoFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"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 CHOICEDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"getDividendTokensMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getETHAvailableForHolderBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getHolderSellFactor","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":[{"internalType":"address","name":"holder","type":"address"}],"name":"getRawETHDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getRewardTokenSelectionCount","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":"holder","type":"address"}],"name":"getUserCurrentRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getUserHasCustomRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderETHUsedForBuyBacks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ammAddress","type":"address"}],"name":"isAMMWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"tokenAddress","type":"address"}],"name":"isIgnoredToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"recoverRate","type":"uint256"}],"name":"recoverContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFeeSellFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"isIgnored","type":"bool"}],"name":"setIgnoreToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setIsBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSellPercent","type":"uint256"}],"name":"setMaxSellPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"setRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"address","name":"ammContractAddress","type":"address"}],"name":"setRewardTokenWithCustomAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ammAddress","type":"address"},{"internalType":"bool","name":"isWhiteListed","type":"bool"}],"name":"setWhiteListAMM","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":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unsetRewardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBuyBackWallet","type":"address"}],"name":"updateBuyBackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumToEarnDivs","type":"uint256"}],"name":"updateDividendTokensMinimum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"RewardPerc","type":"uint256"},{"internalType":"uint256","name":"liquidityPerc","type":"uint256"},{"internalType":"uint256","name":"operationsPerc","type":"uint256"},{"internalType":"uint256","name":"buyBackPerc","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxnAmount","type":"uint256"}],"name":"updateMaxTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tradingStatus","type":"bool"}],"name":"updateTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","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"}]

60e060405267016345785d8a0000600e55655af3107a4000600f5560118054600160ff1990911617905560056013819055600260148190556200004f91906200069c602090811b620033b917901c565b6015556003601655600060175560016018556019805461ffff19169055606460a081905260c052620493e0601a553480156200008a57600080fd5b50604080518082018252600c81526b53757065722043686f69636560a01b60208083019182528351808501909452600684526543686f69636560d01b908401528151919291600991620000e1916003919062000a2c565b508151620000f790600490602085019062000a2c565b506005805460ff191660ff929092169190911790555060009050620001193390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040516200017d9062000abb565b604051809103906000f0801580156200019a573d6000803e3d6000fd5b50600780546001600160a01b03199081166001600160a01b0393841617909155600554600b80546101009092049093169082168117909255600c80548216737a5a85ba12eab427ea66d7748a964161a5c0c559179055600d805490911690911790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000278919062000ae0565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000ae0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200033a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000360919062000ae0565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620003948160016200070a565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620003db57600080fd5b505af1158015620003f0573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200043a57600080fd5b505af11580156200044f573d6000803e3d6000fd5b5050600754600b5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200049d57600080fd5b505af1158015620004b2573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004fe57600080fd5b505af115801562000513573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200055f57600080fd5b505af115801562000574573d6000803e3d6000fd5b5050600b546200059292506001600160a01b0316905060016200086f565b6200059f3060016200086f565b600754620005b8906001600160a01b031660016200086f565b600c54620005d1906001600160a01b031660016200086f565b600d54620005ea906001600160a01b031660016200086f565b3060009081526009602081905260408220805460ff19166001908117909155916200062260055461010090046001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600b5490911681526009909252902080549091166001179055620006946200068560055461010090046001600160a01b031690565b67016345785d8a000062000930565b505062000b6f565b600080620006ab838562000b0b565b905083811015620007035760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b0382166000908152601c602052604090205460ff1615158115151415620007a3576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c75656064820152608401620006fa565b6001600160a01b0382166000908152601c60205260409020805460ff19168215801591909117909155620008335760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200081957600080fd5b505af11580156200082e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620008d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620006fa565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009885760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620006fa565b620009a4816002546200069c60201b620033b91790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009d7918390620033b96200069c821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000a3a9062000b32565b90600052602060002090601f01602090048101928262000a5e576000855562000aa9565b82601f1062000a7957805160ff191683800117855562000aa9565b8280016001018555821562000aa9579182015b8281111562000aa957825182559160200191906001019062000a8c565b5062000ab792915062000ac9565b5090565b6131318062005dec83390190565b5b8082111562000ab7576000815560010162000aca565b60006020828403121562000af357600080fd5b81516001600160a01b03811681146200070357600080fd5b6000821982111562000b2d57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000b4757607f821691505b6020821081141562000b6957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05161522a62000bc2600039600081816108b40152613ec101526000818161069c015281816112fa015261134101526000818161081c0152818161222b0152613926015261522a6000f3fe6080604052600436106104b85760003560e01c806388bdd9be1161026b578063c6616ba11161014f578063dfb6d223116100c1578063e98030c711610085578063e98030c714610f41578063f27fd25414610f61578063f2fde38b14610f81578063f9fbb13814610fa1578063fcbb10e614610fb6578063fd72e22a14610fcc57600080fd5b8063dfb6d22314610ec1578063e2f4560514610ee1578063e37ba8f914610ef7578063e7841ec014610f17578063e884f26014610f2c57600080fd5b8063d32cf92911610113578063d32cf92914610df3578063d406450314610e13578063d469801614610e33578063d5de7e9d14610e53578063dad80fc414610e73578063dd62ed3e14610e7b57600080fd5b8063c6616ba114610d59578063c876d0b914610d79578063cd06ab7314610d93578063d257b34f14610db3578063d2bbdac214610dd357600080fd5b8063a3e56f22116101e8578063ad56c13c116101ac578063ad56c13c14610c44578063b62496f514610ca9578063bc93233f14610cd9578063c024666814610cf9578063c0f306ef14610d19578063c492f04614610d3957600080fd5b8063a3e56f2214610ba4578063a457c2d714610bc4578063a47e991714610be4578063a8b9d24014610c04578063a9059cbb14610c2457600080fd5b806398118cb41161022f57806398118cb414610b2d5780639a7a23d614610b435780639c1b8af514610b63578063a04018ee14610b79578063a26579ad14610b8f57600080fd5b806388bdd9be14610aa05780638aee812714610ac05780638da5cb5b14610ae05780638fda356d14610b0357806395d89b4114610b1857600080fd5b806331e79db01161039d57806365b8dbc01161030f578063719c7847116102d3578063719c7847146109b6578063727ccaee146109e35780638021974b14610a10578063870000e114610a30578063871c128d14610a50578063872d57c614610a7057600080fd5b806365b8dbc01461090b5780636843cd841461092b578063700bb1911461094b57806370a082311461096b578063715018a6146109a157600080fd5b80634be8f8b1116103615780634be8f8b11461083e5780634e71d92d146108545780634fbee19314610869578063514ac7a5146108a257806359992dbc146108d657806364b0f653146108f657600080fd5b806331e79db01461079557806339509351146107b55780633d01b8a7146107d5578063479c5266146107f557806349bd5a5e1461080a57600080fd5b80631694505e116104365780632501ff16116103fa5780632501ff16146106de5780632bc4d48b146106fe5780632c1f52161461071e57806330bb4cff1461073e57806330d5d18d14610753578063313ce5671461077357600080fd5b80631694505e1461061d57806318160ddd146106555780631a8dd2f71461066a57806322bd3f7f1461068a57806323b872dd146106be57600080fd5b806307f148ba1161047d57806307f148ba14610591578063090896be146105b1578063095ea7b3146105c75780630c416d3f146105e757806313114a9d1461060757600080fd5b8062637439146104c457806302259e9e1461050957806303c0f5d41461052d57806306e7b14d1461054f57806306fdde031461056f57600080fd5b366104bf57005b600080fd5b3480156104d057600080fd5b506104f46104df366004614a45565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561051557600080fd5b5061051f600e5481565b604051908152602001610500565b34801561053957600080fd5b5061054d610548366004614a70565b610fec565b005b34801561055b57600080fd5b5061054d61056a366004614a45565b611050565b34801561057b57600080fd5b50610584611161565b6040516105009190614aa9565b34801561059d57600080fd5b5061051f6105ac366004614a45565b6111f3565b3480156105bd57600080fd5b5061051f60165481565b3480156105d357600080fd5b506104f46105e2366004614afe565b61121c565b3480156105f357600080fd5b5061051f610602366004614a45565b611232565b34801561061357600080fd5b5061051f60155481565b34801561062957600080fd5b5060065461063d906001600160a01b031681565b6040516001600160a01b039091168152602001610500565b34801561066157600080fd5b5060025461051f565b34801561067657600080fd5b5061051f610685366004614a45565b6112a2565b34801561069657600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ca57600080fd5b506104f46106d9366004614b2a565b61136c565b3480156106ea57600080fd5b506104f46106f9366004614a45565b6113d5565b34801561070a57600080fd5b5061054d610719366004614b6b565b611445565b34801561072a57600080fd5b5060075461063d906001600160a01b031681565b34801561074a57600080fd5b5061051f61147a565b34801561075f57600080fd5b5061054d61076e366004614a45565b6114ed565b34801561077f57600080fd5b5060055460405160ff9091168152602001610500565b3480156107a157600080fd5b5061054d6107b0366004614a45565b611601565b3480156107c157600080fd5b506104f46107d0366004614afe565b611694565b3480156107e157600080fd5b506104f46107f0366004614a45565b6116ca565b34801561080157600080fd5b5061051f6116fd565b34801561081657600080fd5b5061063d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561084a57600080fd5b5061051f60175481565b34801561086057600080fd5b5061054d611747565b34801561087557600080fd5b506104f4610884366004614a45565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156108ae57600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108e257600080fd5b5061054d6108f1366004614b6b565b6117bf565b34801561090257600080fd5b5061051f611850565b34801561091757600080fd5b5061054d610926366004614a45565b61189a565b34801561093757600080fd5b5061051f610946366004614a45565b611999565b34801561095757600080fd5b5061054d610966366004614b6b565b6119cc565b34801561097757600080fd5b5061051f610986366004614a45565b6001600160a01b031660009081526020819052604090205490565b3480156109ad57600080fd5b5061054d611a9e565b3480156109c257600080fd5b5061051f6109d1366004614a45565b60086020526000908152604090205481565b3480156109ef57600080fd5b5061051f6109fe366004614a45565b60126020526000908152604090205481565b348015610a1c57600080fd5b5061054d610a2b366004614a45565b611b1e565b348015610a3c57600080fd5b5061054d610a4b366004614b84565b611b80565b348015610a5c57600080fd5b5061054d610a6b366004614b6b565b611bc3565b348015610a7c57600080fd5b506104f4610a8b366004614a45565b600a6020526000908152604090205460ff1681565b348015610aac57600080fd5b5061054d610abb366004614a45565b611d1d565b348015610acc57600080fd5b506104f4610adb366004614a45565b6120bb565b348015610aec57600080fd5b5060055461010090046001600160a01b031661063d565b348015610b0f57600080fd5b5061054d6121a9565b348015610b2457600080fd5b506105846121ea565b348015610b3957600080fd5b5061051f60145481565b348015610b4f57600080fd5b5061054d610b5e366004614a70565b6121f9565b348015610b6f57600080fd5b5061051f601a5481565b348015610b8557600080fd5b5061051f60185481565b348015610b9b57600080fd5b5061051f6122f5565b348015610bb057600080fd5b5061054d610bbf366004614b6b565b61233f565b348015610bd057600080fd5b506104f4610bdf366004614afe565b61238d565b348015610bf057600080fd5b506104f4610bff366004614a70565b6123dc565b348015610c1057600080fd5b5061051f610c1f366004614a45565b612480565b348015610c3057600080fd5b506104f4610c3f366004614afe565b6124b3565b348015610c5057600080fd5b50610c64610c5f366004614a45565b6124c0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610500565b348015610cb557600080fd5b506104f4610cc4366004614a45565b601c6020526000908152604090205460ff1681565b348015610ce557600080fd5b5061054d610cf4366004614a70565b61255b565b348015610d0557600080fd5b5061054d610d14366004614a70565b6125b6565b348015610d2557600080fd5b5061054d610d34366004614a45565b612645565b348015610d4557600080fd5b5061054d610d54366004614ba1565b6126a7565b348015610d6557600080fd5b5061054d610d74366004614c27565b612789565b348015610d8557600080fd5b506011546104f49060ff1681565b348015610d9f57600080fd5b5061054d610dae366004614a70565b6128d0565b348015610dbf57600080fd5b506104f4610dce366004614b6b565b6129e7565b348015610ddf57600080fd5b5061063d610dee366004614a45565b612a8c565b348015610dff57600080fd5b506104f4610e0e366004614c59565b612afb565b348015610e1f57600080fd5b5061054d610e2e366004614b6b565b612cb2565b348015610e3f57600080fd5b50600b5461063d906001600160a01b031681565b348015610e5f57600080fd5b506104f4610e6e366004614a45565b612d13565b6104f4612d46565b348015610e8757600080fd5b5061051f610e96366004614c59565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ecd57600080fd5b5061051f610edc366004614a45565b612fe6565b348015610eed57600080fd5b5061051f600f5481565b348015610f0357600080fd5b5061054d610f12366004614a45565b613019565b348015610f2357600080fd5b5061051f61312c565b348015610f3857600080fd5b5061054d613176565b348015610f4d57600080fd5b506104f4610f5c366004614b6b565b6131b2565b348015610f6d57600080fd5b50610c64610f7c366004614b6b565b613216565b348015610f8d57600080fd5b5061054d610f9c366004614a45565b613258565b348015610fad57600080fd5b506104f4613354565b348015610fc257600080fd5b5061051f60135481565b348015610fd857600080fd5b50600c5461063d906001600160a01b031681565b6005546001600160a01b036101009091041633146110255760405162461bcd60e51b815260040161101c90614c87565b60405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146110805760405162461bcd60e51b815260040161101c90614c87565b600d546001600160a01b03828116911614156110f95760405162461bcd60e51b815260206004820152603260248201527f43484f4943453a20546865206275796261636b2077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161101c565b6111048160016125b6565b600d546040516001600160a01b03918216918316907f79cc7a4346ee3e4ae1badce5b330777b11e18a64a4f1ee310a51437544c94c5290600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461117090614cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90614cbc565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050905090565b336000908152600860205260408120546112169061121084611232565b90613418565b92915050565b600061122933848461345a565b50600192915050565b600754604051630c416d3f60e01b81526001600160a01b0383811660048301526000921690630c416d3f906024015b602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614cf7565b6001600160a01b03811660009081526012602052604081205481906112d79062127500906112d1904290613418565b9061357f565b6001600160a01b03841660009081526012602052604090205490915061131f57507f000000000000000000000000000000000000000000000000000000000000000092915050565b600781106113305750603292915050565b61133b81600a6135c1565b611365907f0000000000000000000000000000000000000000000000000000000000000000614d26565b9392505050565b6000611379848484613640565b6113cb84336113c6856040518060600160405280602881526020016151a8602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614172565b61345a565b5060019392505050565b60075460405163e12b91b360e01b81526001600160a01b038381166004830152600092169063e12b91b3906024015b602060405180830381865afa158015611421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614d3d565b6005546001600160a01b036101009091041633146114755760405162461bcd60e51b815260040161101c90614c87565b600e55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190614cf7565b905090565b6005546001600160a01b0361010090910416331461151d5760405162461bcd60e51b815260040161101c90614c87565b600c546001600160a01b03828116911614156115995760405162461bcd60e51b815260206004820152603560248201527f43484f4943453a20546865206f7065726174696f6e732077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b606482015260840161101c565b6115a48160016125b6565b600c546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146116315760405162461bcd60e51b815260040161101c90614c87565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112299185906113c690866133b9565b600754604051633d01b8a760e01b81526001600160a01b0383811660048301526000921690633d01b8a790602401611404565b60075460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bc9190614d3d565b50565b6005546001600160a01b036101009091041633146117ef5760405162461bcd60e51b815260040161101c90614c87565b6064811061184b5760405162461bcd60e51b815260206004820152602360248201527f4d61782073656c6c2070657263656e74206d75737420626520756e646572203160448201526230302560e81b606482015260840161101c565b601855565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146118ca5760405162461bcd60e51b815260040161101c90614c87565b6006546001600160a01b038281169116141561193c5760405162461bcd60e51b815260206004820152602b60248201527f43484f4943453a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b606482015260840161101c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401611261565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190614d5a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03610100909104163314611ace5760405162461bcd60e51b815260040161101c90614c87565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314611b4e5760405162461bcd60e51b815260040161101c90614c87565b600754604051638021974b60e01b81526001600160a01b03838116600483015290911690638021974b9060240161165f565b6005546001600160a01b03610100909104163314611bb05760405162461bcd60e51b815260040161101c90614c87565b6019805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314611bf35760405162461bcd60e51b815260040161101c90614c87565b62030d408110158015611c0957506207a1208111155b611c7b5760405162461bcd60e51b815260206004820152603c60248201527f43484f4943453a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c30303000000000606482015260840161101c565b601a54811415611cea5760405162461bcd60e51b815260206004820152603460248201527f43484f4943453a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b606482015260840161101c565b601a5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601a55565b6005546001600160a01b03610100909104163314611d4d5760405162461bcd60e51b815260040161101c90614c87565b6007546001600160a01b0382811691161415611dc95760405162461bcd60e51b815260206004820152603560248201527f43484f4943453a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b606482015260840161101c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3a9190614d88565b6001600160a01b031614611eca5760405162461bcd60e51b815260206004820152604b60248201527f43484f4943453a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e6564206279207468652043484f49434520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a40161101c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611f0c57600080fd5b505af1158015611f20573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611fa46005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561204457600080fd5b505af1158015612058573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b60006120c6826141ac565b6120e25760405162461bcd60e51b815260040161101c90614da5565b6001600160a01b03821630141561210b5760405162461bcd60e51b815260040161101c90614e02565b612114826116ca565b156121315760405162461bcd60e51b815260040161101c90614e85565b60075460065460405163032e4c0d60e11b81523360048201526001600160a01b038581166024830152918216604482015291169063065c981a906064015b600060405180830381600087803b15801561218957600080fd5b505af115801561219d573d6000803e3d6000fd5b50600195945050505050565b6005546001600160a01b036101009091041633146121d95760405162461bcd60e51b815260040161101c90614c87565b6019805461ffff1916610101179055565b60606004805461117090614cbc565b6005546001600160a01b036101009091041633146122295760405162461bcd60e51b815260040161101c90614c87565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156122e75760405162461bcd60e51b815260206004820152604d60248201527f43484f4943453a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a40161101c565b6122f182826141e8565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461236f5760405162461bcd60e51b815260040161101c90614c87565b4780156122f1576122f161238860646112d184866135c1565b614348565b600061122933846113c6856040518060600160405280602581526020016151d0602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614172565b6005546000906001600160a01b0361010090910416331461240f5760405162461bcd60e51b815260040161101c90614c87565b60075460405163a47e991760e01b81526001600160a01b03858116600483015284151560248301529091169063a47e9917906044015b600060405180830381600087803b15801561245f57600080fd5b505af1158015612473573d6000803e3d6000fd5b5060019695505050505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611261565b6000611229338484613640565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190614ef7565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461258b5760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146125e65760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126755760405162461bcd60e51b815260040161101c90614c87565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161165f565b6005546001600160a01b036101009091041633146126d75760405162461bcd60e51b815260040161101c90614c87565b60005b828110156127485781601b60008686858181106126f9576126f9614f61565b905060200201602081019061270e9190614a45565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061274081614f77565b9150506126da565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161277c93929190614f92565b60405180910390a1505050565b6005546001600160a01b036101009091041633146127b95760405162461bcd60e51b815260040161101c90614c87565b826127c483836133b9565b111561286c5760405162461bcd60e51b8152602060048201526064602482018190527f43484f4943453a20757064617465466565733a3a204c6971756964697479205060448301527f657263206d75737420626520657175616c20746f206f72206869676865722074908201527f68616e206f7065726174696f6e7320616e64206275796261636b20636f6d62696084820152633732b21760e11b60a482015260c40161101c565b6040805183815260208101839052849186917f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe910160405180910390a360138490556014839055601682905560178190556128c784846133b9565b60155550505050565b6005546001600160a01b036101009091041633146129005760405162461bcd60e51b815260040161101c90614c87565b612909826141ac565b61297b5760405162461bcd60e51b815260206004820152603960248201527f43484f4943453a2073657457686974654c697374414d4d3a3a20414d4d20697360448201527f20612077616c6c65742c206e6f74206120636f6e747261637400000000000000606482015260840161101c565b60075460405163cd06ab7360e01b81526001600160a01b03848116600483015283151560248301529091169063cd06ab73906044015b600060405180830381600087803b1580156129cb57600080fd5b505af11580156129df573d6000803e3d6000fd5b505050505050565b6005546000906001600160a01b03610100909104163314612a1a5760405162461bcd60e51b815260040161101c90614c87565b6002548210612a835760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201526e37103a37ba30b61039bab838363c9760891b606482015260840161101c565b50600f55600190565b6007546040516356ef728f60e11b81526001600160a01b038381166004830152600092169063addee51e90602401602060405180830381865afa158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614d88565b6000612b06836141ac565b612b225760405162461bcd60e51b815260040161101c90614da5565b6006546001600160a01b0383811691161415612bb05760405162461bcd60e51b815260206004820152604160248201527f43484f4943453a20736574526577617264546f6b656e3a3a205573652073657460448201527f526577617264546f6b656e20746f207573652064656661756c7420526f7574656064820152603960f91b608482015260a40161101c565b6001600160a01b038316301415612bd95760405162461bcd60e51b815260040161101c90614e02565b612be2836116ca565b15612bff5760405162461bcd60e51b815260040161101c90614e85565b612c08826113d5565b1515600114612c725760405162461bcd60e51b815260206004820152603060248201527f43484f4943453a20736574526577617264546f6b656e3a3a20414d4d2069732060448201526f6e6f742077686974656c69737465642160801b606482015260840161101c565b60075460405163032e4c0d60e11b81523360048201526001600160a01b03858116602483015284811660448301529091169063065c981a90606401612445565b6005546001600160a01b03610100909104163314612ce25760405162461bcd60e51b815260040161101c90614c87565b60075460405163f9e2f5fb60e01b8152600481018390526001600160a01b039091169063f9e2f5fb9060240161165f565b60075460405163aa9582d360e01b81526001600160a01b038381166004830152600092169063aa9582d390602401611404565b600080612d5233611232565b33600090815260086020526040902054909150612d6f90346133b9565b811015612de6576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a206275794261636b546f6b656e73576974684e6f466565733a60448201527f3a2043616e6e6f74205370656e64206d6f7265207468616e206561726e65642e606482015260840161101c565b604080516002808252606082018352349260009291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614d88565b81600081518110612e8b57612e8b614f61565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612ebf57612ebf614f61565b6001600160a01b0390921660209283029190910182015233600090815260089091526040902054612ef090346133b9565b33600081815260086020908152604080832094909455601b90529182208054600160ff1982161790915560065460ff909116926001600160a01b039091169163b6f9de959186918690612f4542610168614feb565b6040518663ffffffff1660e01b8152600401612f649493929190615047565b6000604051808303818588803b158015612f7d57600080fd5b505af1158015612f91573d6000803e3d6000fd5b5050336000818152601b6020526040808220805460ff1916881515179055518895509193507faf9caa8e44a7ae08c0e421ad7c7f143d77214713719ebe5472be0aed7d0c1099925090a3600194505050505090565b60075460405163ea40e76760e01b81526001600160a01b038381166004830152600092169063ea40e76790602401611261565b6005546001600160a01b036101009091041633146130495760405162461bcd60e51b815260040161101c90614c87565b600b546001600160a01b03828116911614156130c45760405162461bcd60e51b815260206004820152603460248201527f43484f4943453a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b606482015260840161101c565b6130cf8160016125b6565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146131a65760405162461bcd60e51b815260040161101c90614c87565b6011805460ff19169055565b6005546000906001600160a01b036101009091041633146131e55760405162461bcd60e51b815260040161101c90614c87565b60075460405163e98030c760e01b8152600481018490526001600160a01b039091169063e98030c79060240161216f565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016124fe565b6005546001600160a01b036101009091041633146132885760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b0381166132ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161101c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075460405163e8f8fe3960e01b81523360048201526000916001600160a01b03169063e8f8fe3990602401600060405180830381600087803b15801561339a57600080fd5b505af11580156133ae573d6000803e3d6000fd5b505050506001905090565b6000806133c68385614feb565b9050838110156113655760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161101c565b600061136583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614172565b6001600160a01b0383166134bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161101c565b6001600160a01b03821661351d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161101c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061136583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614382565b6000826135d057506000611216565b60006135dc838561507c565b9050826135e9858361509b565b146113655760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161101c565b6001600160a01b0383166136665760405162461bcd60e51b815260040161101c906150bd565b6001600160a01b03821661368c5760405162461bcd60e51b815260040161101c90615102565b6001600160a01b0382166000908152600a602052604090205460ff1615806136cd57506001600160a01b0383166000908152600a602052604090205460ff16155b6137245760405162461bcd60e51b815260206004820152602260248201527f43484f4943453a20546f2f66726f6d20616464726573732069732069676e6f72604482015261195960f21b606482015260840161101c565b60195460ff166137b9576001600160a01b03821660009081526009602052604090205460ff168061376d57506001600160a01b03831660009081526009602052604090205460ff165b6137b95760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c6564000000604482015260640161101c565b6001600160a01b0382166000908152601c602052604090205460ff1680156137e4575060195460ff16155b801561380857506001600160a01b03831660009081526009602052604090205460ff165b156138cb576005546001600160a01b0384811661010090920416148061384057506005546001600160a01b0383811661010090920416145b8061386357506001600160a01b03831660009081526009602052604090205460ff165b6138cb5760405162461bcd60e51b815260206004820152603360248201527f4f6e6c79206465762063616e20747261646520616761696e737420554e49535760448201527220a810323ab934b7339036b4b3b930ba34b7b760691b606482015260840161101c565b806138e1576138dc838360006143b0565b505050565b60115460ff1615613a53576005546001600160a01b03838116610100909204161480159061391d57506006546001600160a01b03838116911614155b801561395b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561398057506001600160a01b0382166000908152601b602052604090205460ff16155b80156139a557506001600160a01b0383166000908152601b602052604090205460ff16155b15613a53576001600160a01b0382166000908152601060205260409020544211613a375760405162461bcd60e51b815260206004820152603c60248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e2020506c656173652074727920616761696e206c617465722e00000000606482015260840161101c565b6001600160a01b03821660009081526010602052604090204290555b613a5c826141ac565b158015613a8257506001600160a01b0382166000908152601b602052604090205460ff16155b15613ab7576001600160a01b038216600090815260126020526040902054613ab7576001600160a01b03821660005260126020525b613ac0826141ac565b158015613ae557506001600160a01b0383166000908152601c602052604090205460ff165b8015613b0a57506001600160a01b0382166000908152601b602052604090205460ff16155b15613b96576001600160a01b0382166000908152601260205260409020544211613b96576001600160a01b038216600090815260126020526040902054613b7c90613b5d906003906112d1904290613418565b6001600160a01b038416600090815260126020526040902054906133b9565b6001600160a01b0383166000908152601260205260409020555b6001600160a01b0382166000908152601c602052604090205460ff1615613c2657600e54811115613c095760405162461bcd60e51b815260206004820152601e60248201527f45524332303a2045786365656473206d61782073656c6c20616d6f756e740000604482015260640161101c565b613c2360646112d1601854846135c190919063ffffffff16565b90505b30600090815260208190526040902054600f5481108015908190613c545750600654600160a01b900460ff16155b8015613c675750601954610100900460ff165b8015613c8c57506001600160a01b0385166000908152601c602052604090205460ff16155b8015613ca65750600b546001600160a01b03868116911614155b8015613cc05750600b546001600160a01b03858116911614155b8015613cda5750600c546001600160a01b03868116911614155b8015613cf45750600c546001600160a01b03858116911614155b8015613d0e5750600d546001600160a01b03868116911614155b8015613d285750600d546001600160a01b03858116911614155b8015613d4d57506001600160a01b0384166000908152601b602052604090205460ff16155b8015613d7257506001600160a01b0385166000908152601b602052604090205460ff16155b8015613d8757506001600160a01b0385163014155b8015613da157506007546001600160a01b03868116911614155b15613e05576006805460ff60a01b1916600160a01b179055601554601454600091613dd1916112d19086906135c1565b9050613ddc816144b9565b30600090815260208190526040902054613df5816147c0565b50506006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680613e5357506001600160a01b0385166000908152601b602052604090205460ff165b80613e6657506001600160a01b03861630145b15613e6f575060005b8015613f74576000613e9160646112d1601554886135c190919063ffffffff16565b6001600160a01b0387166000908152601c602052604090205490915060ff1615613f5b576000613f0060646112d17f0000000000000000000000000000000000000000000000000000000000000000613efa60646112d16013548d6135c190919063ffffffff16565b906135c1565b90506000613f2f60646112d1613f158c6112a2565b613efa60646112d16014548e6135c190919063ffffffff16565b9050613f3b82826133b9565b6001600160a01b038a166000908152601260205260409020429055925050505b613f658582613418565b9450613f728730836143b0565b505b613f7f8686866143b0565b6007546001600160a01b031663e30443bc87613fb0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ff657600080fd5b505af1925050508015614007575060015b506007546001600160a01b031663e30443bc86614039816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561407f57600080fd5b505af1925050508015614090575060015b50600654600160a01b900460ff166129df57601a546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af192505050801561410f575060408051601f3d908101601f1916820190925261410c91810190614d5a565b60015b61411857614169565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050565b600081848411156141965760405162461bcd60e51b815260040161101c9190614aa9565b5060006141a38486614d26565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906141e057508115155b949350505050565b6001600160a01b0382166000908152601c602052604090205460ff161515811515141561427f576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840161101c565b6001600160a01b0382166000908152601c60205260409020805460ff1916821580159190911790915561430c5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156142f357600080fd5b505af1158015614307573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600c546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156122f1573d6000803e3d6000fd5b600081836143a35760405162461bcd60e51b815260040161101c9190614aa9565b5060006141a3848661509b565b6001600160a01b0383166143d65760405162461bcd60e51b815260040161101c906150bd565b6001600160a01b0382166143fc5760405162461bcd60e51b815260040161101c90615102565b61443981604051806060016040528060268152602001615182602691396001600160a01b0386166000908152602081905260409020549190614172565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461446890826133b9565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613572565b601454156117bc5760145460009015614506576144ff6014546112d16144f86144ef6016546017546133b990919063ffffffff16565b60145490613418565b85906135c1565b905061450a565b5060005b60006145168383613418565b9050600061452583600261357f565b905060006145338483613418565b90504761453f8361485f565b600061454b4783613418565b90506145578382614983565b6145608561485f565b600061456c4784613418565b905060008060165411156146745760006145a46145966016546017546133b990919063ffffffff16565b6016546112d19086906135c1565b600c546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146145f2576040519150601f19603f3d011682016040523d82523d6000602084013e6145f7565b606091505b50508092505081614672576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e642045544820746f204f7065726174696f6e732057616c6c6574606482015260840161101c565b505b601754156147745760006146a66146986016546017546133b990919063ffffffff16565b6017546112d19086906135c1565b600d546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146146f4576040519150601f19603f3d011682016040523d82523d6000602084013e6146f9565b606091505b505080925050816147725760405162461bcd60e51b815260206004820152603d60248201527f43484f4943453a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e642045544820746f204275794261636b2057616c6c6574000000606482015260840161101c565b505b60408051878152602081018590529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050505050565b6147c98161485f565b60075460405147916000916001600160a01b039091169083908381818185875af1925050503d806000811461481a576040519150601f19603f3d011682016040523d82523d6000602084013e61481f565b606091505b5050905080156138dc5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910161277c565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061489457614894614f61565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156148ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149119190614d88565b8160018151811061492457614924614f61565b6001600160a01b03928316602091820292909201015260065461494a913091168461345a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906129b1908590600090869030904290600401615145565b60065461499b9030906001600160a01b03168461345a565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614a0b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061168d9190614d5a565b6001600160a01b03811681146117bc57600080fd5b600060208284031215614a5757600080fd5b813561136581614a30565b80151581146117bc57600080fd5b60008060408385031215614a8357600080fd5b8235614a8e81614a30565b91506020830135614a9e81614a62565b809150509250929050565b600060208083528351808285015260005b81811015614ad657858101830151858201604001528201614aba565b81811115614ae8576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215614b1157600080fd5b8235614b1c81614a30565b946020939093013593505050565b600080600060608486031215614b3f57600080fd5b8335614b4a81614a30565b92506020840135614b5a81614a30565b929592945050506040919091013590565b600060208284031215614b7d57600080fd5b5035919050565b600060208284031215614b9657600080fd5b813561136581614a62565b600080600060408486031215614bb657600080fd5b833567ffffffffffffffff80821115614bce57600080fd5b818601915086601f830112614be257600080fd5b813581811115614bf157600080fd5b8760208260051b8501011115614c0657600080fd5b60209283019550935050840135614c1c81614a62565b809150509250925092565b60008060008060808587031215614c3d57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215614c6c57600080fd5b8235614c7781614a30565b91506020830135614a9e81614a30565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680614cd057607f821691505b60208210811415614cf157634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215614d0957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015614d3857614d38614d10565b500390565b600060208284031215614d4f57600080fd5b815161136581614a62565b600080600060608486031215614d6f57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215614d9a57600080fd5b815161136581614a30565b6020808252603d908201527f43484f4943453a20736574526577617264546f6b656e3a3a204164647265737360408201527f20697320612077616c6c65742c206e6f74206120636f6e74726163742e000000606082015260800190565b60208082526059908201527f43484f4943453a20736574526577617264546f6b656e3a3a2043616e6e6f742060408201527f7365742072657761726420746f6b656e206173207468697320746f6b656e206460608201527f756520746f20526f75746572206c696d69746174696f6e732e00000000000000608082015260a00190565b6020808252604c908201527f43484f4943453a20736574526577617264546f6b656e3a3a205265776172642060408201527f546f6b656e2069732069676e6f7265642066726f6d206265696e67207573656460608201526b1030b9903932bbb0b932399760a11b608082015260a00190565b600080600080600080600080610100898b031215614f1457600080fd5b8851614f1f81614a30565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614f8b57614f8b614d10565b5060010190565b6040808252810183905260008460608301825b86811015614fd5578235614fb881614a30565b6001600160a01b0316825260209283019290910190600101614fa5565b5080925050508215156020830152949350505050565b60008219821115614ffe57614ffe614d10565b500190565b600081518084526020808501945080840160005b8381101561503c5781516001600160a01b031687529582019590820190600101615017565b509495945050505050565b8481526080602082015260006150606080830186615003565b6001600160a01b03949094166040830152506060015292915050565b600081600019048311821515161561509657615096614d10565b500290565b6000826150b857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b85815284602082015260a06040820152600061516460a0830186615003565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122071d061725d66811635bfc12358f8e5b19d83abb47c5dff7dfa6a407559f40d8864736f6c634300080a00336080604052601180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b506040518060400160405280601781526020017f43484f4943455f4469766964656e645f547261636b65720000000000000000008152506040518060400160405280601781526020017f43484f4943455f4469766964656e645f547261636b657200000000000000000081525060098282828260039080519060200190620000c1929190620001b0565b508151620000d7906004906020850190620001b0565b506005805460ff191660ff929092169190911790555060009050620000f93390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050737a250d5630b4cf539739df2c5dacb4c659f2488d6000525050600f6020527f7e98db1b893d503d049bbf1a3858119b9172e4b74989a91dfee4165dd9ce42a8805460ff19166001179055610e10601a5564746a528800601b5562000293565b828054620001be9062000256565b90600052602060002090601f016020900481019282620001e257600085556200022d565b82601f10620001fd57805160ff19168380011785556200022d565b828001600101855582156200022d579182015b828111156200022d57825182559160200191906001019062000210565b506200023b9291506200023f565b5090565b5b808211156200023b576000815560010162000240565b600181811c908216806200026b57607f821691505b602082108114156200028d57634e487b7160e01b600052602260045260246000fd5b50919050565b612e8e80620002a36000396000f3fe6080604052600436106103035760003560e01c80638da5cb5b11610190578063c0f306ef116100dc578063e8f8fe3911610095578063f2fde38b1161006f578063f2fde38b14610a33578063f9e2f5fb14610a53578063fbcbc0f114610a73578063ffb2c47914610a9357600080fd5b8063e8f8fe39146109c6578063e98030c7146109e6578063ea40e76714610a0657600080fd5b8063c0f306ef146108db578063cd06ab73146108fb578063dd62ed3e1461091b578063e12b91b314610961578063e30443bc14610991578063e7841ec0146109b157600080fd5b8063a8b9d24011610149578063aafd847a11610123578063aafd847a14610839578063addee51e1461086f578063bc4c4b37146108a5578063be10b614146108c557600080fd5b8063a8b9d240146107c9578063a9059cbb146107e9578063aa9582d31461080957600080fd5b80638da5cb5b146107015780638ef3a3c01461072457806391b89fba1461075457806395d89b4114610774578063a457c2d714610789578063a47e9917146107a957600080fd5b8063313ce5671161024f5780636a47400211610208578063715018a6116101e2578063715018a6146106865780638021974b1461069b5780638271c905146106bb57806385a6b3ae146106eb57600080fd5b80636a474002146106255780636f2789ec1461063a57806370a082311461065057600080fd5b8063313ce567146104f557806331e79db01461051757806339509351146105375780633d01b8a7146105575780634e7b827f146105905780635183d6fd146105c057600080fd5b8063133b1d5e116102bc578063226cfa3d11610296578063226cfa3d1461047257806323b872dd1461049f57806327ce0147146104bf5780633009a609146104df57600080fd5b8063133b1d5e146103ef5780631694505e1461043d57806318160ddd1461045d57600080fd5b806303c8330214610317578063065c981a1461031f57806306fdde031461033f578063095ea7b31461036a57806309bbedde1461039a5780630c416d3f146103b957600080fd5b3661031257610310610ace565b005b600080fd5b610310610ace565b34801561032b57600080fd5b5061031061033a3660046129dc565b610b61565b34801561034b57600080fd5b50610354610d62565b6040516103619190612a27565b60405180910390f35b34801561037657600080fd5b5061038a610385366004612a7c565b610df4565b6040519015158152602001610361565b3480156103a657600080fd5b506013545b604051908152602001610361565b3480156103c557600080fd5b506103ab6103d4366004612aa8565b6001600160a01b031660009081526009602052604090205490565b3480156103fb57600080fd5b5061042561040a366004612aa8565b600c602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610361565b34801561044957600080fd5b50601154610425906001600160a01b031681565b34801561046957600080fd5b506002546103ab565b34801561047e57600080fd5b506103ab61048d366004612aa8565b60196020526000908152604090205481565b3480156104ab57600080fd5b5061038a6104ba366004612ac5565b610e0b565b3480156104cb57600080fd5b506103ab6104da366004612aa8565b610e74565b3480156104eb57600080fd5b506103ab60175481565b34801561050157600080fd5b5060055460405160ff9091168152602001610361565b34801561052357600080fd5b50610310610532366004612aa8565b610ed0565b34801561054357600080fd5b5061038a610552366004612a7c565b610ffd565b34801561056357600080fd5b5061038a610572366004612aa8565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561059c57600080fd5b5061038a6105ab366004612aa8565b60186020526000908152604090205460ff1681565b3480156105cc57600080fd5b506105e06105db366004612b06565b611033565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610361565b34801561063157600080fd5b50610310611187565b34801561064657600080fd5b506103ab601a5481565b34801561065c57600080fd5b506103ab61066b366004612aa8565b6001600160a01b031660009081526020819052604090205490565b34801561069257600080fd5b5061031061122d565b3480156106a757600080fd5b506103106106b6366004612aa8565b6112ad565b3480156106c757600080fd5b5061038a6106d6366004612aa8565b60106020526000908152604090205460ff1681565b3480156106f757600080fd5b506103ab60125481565b34801561070d57600080fd5b5060055461010090046001600160a01b0316610425565b34801561073057600080fd5b5061038a61073f366004612aa8565b600d6020526000908152604090205460ff1681565b34801561076057600080fd5b506103ab61076f366004612aa8565b611371565b34801561078057600080fd5b5061035461137c565b34801561079557600080fd5b5061038a6107a4366004612a7c565b61138b565b3480156107b557600080fd5b506103106107c4366004612b34565b6113da565b3480156107d557600080fd5b506103ab6107e4366004612aa8565b611435565b3480156107f557600080fd5b5061038a610804366004612a7c565b611461565b34801561081557600080fd5b5061038a610824366004612aa8565b600b6020526000908152604090205460ff1681565b34801561084557600080fd5b506103ab610854366004612aa8565b6001600160a01b031660009081526008602052604090205490565b34801561087b57600080fd5b5061042561088a366004612aa8565b600a602052600090815260409020546001600160a01b031681565b3480156108b157600080fd5b5061038a6108c0366004612b34565b61146e565b3480156108d157600080fd5b506103ab601b5481565b3480156108e757600080fd5b506103106108f6366004612aa8565b611522565b34801561090757600080fd5b50610310610916366004612b34565b6115c0565b34801561092757600080fd5b506103ab610936366004612b69565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561096d57600080fd5b5061038a61097c366004612aa8565b600f6020526000908152604090205460ff1681565b34801561099d57600080fd5b506103106109ac366004612a7c565b61161b565b3480156109bd57600080fd5b506017546103ab565b3480156109d257600080fd5b506103106109e1366004612aa8565b61178f565b3480156109f257600080fd5b50610310610a01366004612b06565b61188d565b348015610a1257600080fd5b506103ab610a21366004612aa8565b600e6020526000908152604090205481565b348015610a3f57600080fd5b50610310610a4e366004612aa8565b611a04565b348015610a5f57600080fd5b50610310610a6e366004612b06565b611b00565b348015610a7f57600080fd5b506105e0610a8e366004612aa8565b611b35565b348015610a9f57600080fd5b50610ab3610aae366004612b06565b611c9e565b60408051938452602084019290925290820152606001610361565b6000610ad960025490565b11610ae357600080fd5b3415610b5f57610b16610af560025490565b610b0334600160801b611db9565b610b0d9190612bb8565b60065490611e3f565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2601254610b5b9034611e3f565b6012555b565b6005546001600160a01b03610100909104163314610b9a5760405162461bcd60e51b8152600401610b9190612bda565b60405180910390fd5b6001600160a01b0383166000908152600b602052604090205460ff16151560011415610c2d576001600160a01b038084166000908152600a60209081526040808320549093168252600e9052205415610c2d576001600160a01b038084166000908152600a60209081526040808320549093168252600e9052908120805460019290610c27908490612c0f565b90915550505b6001600160a01b038084166000908152600b60209081526040808320805460ff19166001179055600a909152902080548483166001600160a01b0319909116179055601154828216911614801590610c9d57506001600160a01b0381166000908152600f602052604090205460ff165b15610cec576001600160a01b038084166000908152600d60209081526040808320805460ff19166001179055600c909152902080549183166001600160a01b0319909216919091179055610d2f565b6001600160a01b038084166000908152600d60209081526040808320805460ff19169055601154600c90925290912080546001600160a01b031916919092161790555b6001600160a01b0382166000908152600e60205260408120805460019290610d58908490612c26565b9091555050505050565b606060038054610d7190612c3e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9d90612c3e565b8015610dea5780601f10610dbf57610100808354040283529160200191610dea565b820191906000526020600020905b815481529060010190602001808311610dcd57829003601f168201915b5050505050905090565b6000610e01338484611e9e565b5060015b92915050565b6000610e18848484611fc2565b610e6a8433610e6585604051806060016040528060288152602001612e0c602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612020565b611e9e565b5060019392505050565b6001600160a01b03811660009081526007602090815260408083205491839052822054600654600160801b92610ec692610ec192610ebb91610eb69190611db9565b61205a565b9061206a565b6120a8565b610e059190612bb8565b6005546001600160a01b03610100909104163314610f005760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b03811660009081526018602052604090205460ff1615610f2657600080fd5b6001600160a01b0381166000908152601860205260408120805460ff19166001179055610f549082906120bb565b60405163131836e760e21b8152601360048201526001600160a01b0382166024820152730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e90634c60db9c9060440160006040518083038186803b158015610fae57600080fd5b505af4158015610fc2573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e01918590610e659086611e3f565b6000806000806000806000806013730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e63deb3d89690916040518263ffffffff1660e01b815260040161107b91815260200190565b602060405180830381865af4158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190612c79565b89106110e157506000965060001995508594508693508392508291508190508061117c565b6040516368d54f3f60e11b815260136004820152602481018a9052600090730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e9063d1aa9e7e90604401602060405180830381865af415801561113b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115f9190612c92565b905061116a81611b35565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606960248201527f43484f4943455f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e2043484f4943452060848201526831b7b73a3930b1ba1760b91b60a482015260c401610b91565b6005546001600160a01b0361010090910416331461125d5760405162461bcd60e51b8152600401610b9190612bda565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146112dd5760405162461bcd60e51b8152600401610b9190612bda565b6011546001600160a01b038281169116141561134f5760405162461bcd60e51b815260206004820152602b60248201527f43484f4943453a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b6064820152608401610b91565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e0582611435565b606060048054610d7190612c3e565b6000610e013384610e6585604051806060016040528060258152602001612e34602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612020565b6005546001600160a01b0361010090910416331461140a5760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6001600160a01b038116600090815260086020526040812054610e059061145b84610e74565b9061211a565b6000610e01338484611fc2565b6005546000906001600160a01b036101009091041633146114a15760405162461bcd60e51b8152600401610b9190612bda565b60006114ac8461215c565b90508015611518576001600160a01b038416600081815260196020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906115069085815260200190565b60405180910390a36001915050610e05565b5060009392505050565b6005546001600160a01b036101009091041633146115525760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b03811660009081526018602052604090205460ff1661157757600080fd5b6001600160a01b038116600081815260186020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6005546001600160a01b036101009091041633146115f05760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b0361010090910416331461164b5760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b03821660009081526018602052604090205460ff1615611670575050565b601b5481106117015761168382826120bb565b604051632f0ad01760e21b8152601360048201526001600160a01b038316602482015260448101829052730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e9063bc2b405c9060640160006040518083038186803b1580156116e457600080fd5b505af41580156116f8573d6000803e3d6000fd5b5050505061177f565b61170c8260006120bb565b60405163131836e760e21b8152601360048201526001600160a01b0383166024820152730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e90634c60db9c9060440160006040518083038186803b15801561176657600080fd5b505af415801561177a573d6000803e3d6000fd5b505050505b61178a82600161146e565b505050565b6005546001600160a01b036101009091041633146117bf5760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b038082166000908152600b60209081526040808320805460ff19169055600a8252808320549093168252600e905220541561183b576001600160a01b038082166000908152600a60209081526040808320549093168252600e9052908120805460019290611835908490612c0f565b90915550505b6001600160a01b039081166000908152600a6020908152604080832080546001600160a01b0319908116909155601154600c8452828520805491909616911617909355600d905220805460ff19169055565b6005546001600160a01b036101009091041633146118bd5760405162461bcd60e51b8152600401610b9190612bda565b610e1081101580156118d25750620151808111155b6119595760405162461bcd60e51b815260206004820152604c60248201527f43484f4943455f4469766964656e645f547261636b65723a20636c61696d576160448201527f6974206d757374206265207570646174656420746f206265747765656e20312060648201526b616e6420323420686f75727360a01b608482015260a401610b91565b601a548114156119d15760405162461bcd60e51b815260206004820152603e60248201527f43484f4943455f4469766964656e645f547261636b65723a2043616e6e6f742060448201527f75706461746520636c61696d5761697420746f2073616d652076616c756500006064820152608401610b91565b601a5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601a55565b6005546001600160a01b03610100909104163314611a345760405162461bcd60e51b8152600401610b9190612bda565b6001600160a01b038116611a995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b91565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314611b305760405162461bcd60e51b8152600401610b9190612bda565b601b55565b6040516317e142d160e01b8152601360048201526001600160a01b03821660248201528190600090819081908190819081908190730fe9e6d48173123d9a9fafa78134c6d9f5e10e6e906317e142d190604401602060405180830381865af4158015611ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc99190612c79565b9650600019955060008712611c2b57601754871115611bf757601754611bf09088906123da565b9550611c2b565b60175460135460009110611c0c576000611c1b565b601754601354611c1b9161211a565b9050611c27888261206a565b9650505b611c3488611435565b9450611c3f88610e74565b6001600160a01b038916600090815260196020526040902054909450925082611c69576000611c77565b601a54611c77908490611e3f565b9150428211611c87576000611c91565b611c91824261211a565b9050919395975091939597565b6013546000908190819080611cbe57505060175460009250829150611db2565b6017546000805a90506000805b8984108015611cd957508582105b15611da15784611ce881612caf565b60135490965086109050611cfb57600094505b600060136000018681548110611d1357611d13612cca565b60009182526020808320909101546001600160a01b03168083526019909152604090912054909150611d4490612417565b15611d6757611d5481600161146e565b15611d675781611d6381612caf565b9250505b82611d7181612caf565b93505060005a905080851115611d9857611d95611d8e868361211a565b8790611e3f565b95505b9350611ccb9050565b601785905590975095509193505050505b9193909250565b600082611dc857506000610e05565b6000611dd48385612ce0565b905082611de18583612bb8565b14611e385760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b91565b9392505050565b600080611e4c8385612c26565b905083811015611e385760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b91565b6001600160a01b038316611f005760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b91565b6001600160a01b038216611f615760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b91565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f43484f4943455f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610b91565b600081848411156120445760405162461bcd60e51b8152600401610b919190612a27565b5060006120518486612c0f565b95945050505050565b60008181811215610e0557600080fd5b6000806120778385612cff565b90506000831215801561208a5750838112155b8061209f575060008312801561209f57508381125b611e3857600080fd5b6000808212156120b757600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156120fa5760006120e8838361211a565b90506120f4848261243e565b50505050565b8082101561178a57600061210e828461211a565b90506120f484826124a2565b6000611e3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612020565b60008061216883611435565b905080156123d1576001600160a01b0383166000908152600b602052604090205460ff161580156121c157506001600160a01b038381166000908152600a6020908152604080832054909316825260109052205460ff16155b1561234d576001600160a01b0383166000908152600860205260409020546121e99082611e3f565b6001600160a01b0384166000908152600860209081526040808320939093556009905220546122189082611e3f565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906122679084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d80600081146122c1576040519150601f19603f3d011682016040523d82523d6000602084013e6122c6565b606091505b5050905080612346576001600160a01b0384166000908152600860205260409020546122f2908361211a565b6001600160a01b038516600090815260086020908152604080832093909355600990522054612321908361211a565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b6001600160a01b0383166000908152600860205260409020546123709082611e3f565b6001600160a01b038416600081815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906123bf9084815260200190565b60405180910390a2611e3883826124e6565b50600092915050565b6000806123e78385612d40565b9050600083121580156123fa5750838113155b8061209f575060008312801561209f5750838113611e3857600080fd5b60004282111561242957506000919050565b601a54612436428461211a565b101592915050565b61244882826127e1565b612482612463610eb683600654611db990919063ffffffff16565b6001600160a01b038416600090815260076020526040902054906123da565b6001600160a01b0390921660009081526007602052604090209190915550565b6124ac82826128c0565b6124826124c7610eb683600654611db990919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061206a565b6001600160a01b038083166000908152600a6020908152604080832054601154600d909352908320549293849391811692169060ff16801561254f57506001600160a01b038087166000908152600c60209081526040808320549093168252600f9052205460ff165b1561257157506001600160a01b038086166000908152600c6020526040902054165b604080516002808252606082018352600092602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f49190612c92565b8160008151811061260757612607612cca565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061263b5761263b612cca565b6001600160a01b039283166020918202929092010152821663b6f9de95876001848b61266942610168612c26565b6040518663ffffffff1660e01b81526004016126889493929190612d7f565b6000604051808303818588803b1580156126a157600080fd5b505af1935050505080156126b3575060015b6126c057600093506126c5565b600193505b836127d6576001600160a01b0387166000908152600960205260409020546126ed9087611e3f565b6001600160a01b038816600081815260096020526040808220939093559151610bb890899084818181858888f193505050503d806000811461274b576040519150601f19603f3d011682016040523d82523d6000602084013e612750565b606091505b50509050806127d4576001600160a01b03881660009081526008602052604090205461277c908861211a565b6001600160a01b0389166000908152600860209081526040808320939093556009905220546127ab908861211a565b6001600160a01b0389166000908152600960205260408120919091559550610e05945050505050565b505b509395945050505050565b6001600160a01b0382166128375760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610b91565b6002546128449082611e3f565b6002556001600160a01b03821660009081526020819052604090205461286a9082611e3f565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166129205760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b91565b61295d81604051806060016040528060228152602001612dea602291396001600160a01b0385166000908152602081905260409020549190612020565b6001600160a01b038316600090815260208190526040902055600254612983908261211a565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016128b4565b6001600160a01b03811681146129d957600080fd5b50565b6000806000606084860312156129f157600080fd5b83356129fc816129c4565b92506020840135612a0c816129c4565b91506040840135612a1c816129c4565b809150509250925092565b600060208083528351808285015260005b81811015612a5457858101830151858201604001528201612a38565b81811115612a66576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612a8f57600080fd5b8235612a9a816129c4565b946020939093013593505050565b600060208284031215612aba57600080fd5b8135611e38816129c4565b600080600060608486031215612ada57600080fd5b8335612ae5816129c4565b92506020840135612af5816129c4565b929592945050506040919091013590565b600060208284031215612b1857600080fd5b5035919050565b80358015158114612b2f57600080fd5b919050565b60008060408385031215612b4757600080fd5b8235612b52816129c4565b9150612b6060208401612b1f565b90509250929050565b60008060408385031215612b7c57600080fd5b8235612b87816129c4565b91506020830135612b97816129c4565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082612bd557634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015612c2157612c21612ba2565b500390565b60008219821115612c3957612c39612ba2565b500190565b600181811c90821680612c5257607f821691505b60208210811415612c7357634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612c8b57600080fd5b5051919050565b600060208284031215612ca457600080fd5b8151611e38816129c4565b6000600019821415612cc357612cc3612ba2565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615612cfa57612cfa612ba2565b500290565b600080821280156001600160ff1b0384900385131615612d2157612d21612ba2565b600160ff1b8390038412811615612d3a57612d3a612ba2565b50500190565b60008083128015600160ff1b850184121615612d5e57612d5e612ba2565b6001600160ff1b0384018313811615612d7957612d79612ba2565b50500390565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015612dc95784516001600160a01b031683529383019391830191600101612da4565b50506001600160a01b03969096166040850152505050606001529291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122011cdd3ce25c02edcc869b4af6ce6b52d3619b01857a2e73d72fb020d7d1e60f164736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106104b85760003560e01c806388bdd9be1161026b578063c6616ba11161014f578063dfb6d223116100c1578063e98030c711610085578063e98030c714610f41578063f27fd25414610f61578063f2fde38b14610f81578063f9fbb13814610fa1578063fcbb10e614610fb6578063fd72e22a14610fcc57600080fd5b8063dfb6d22314610ec1578063e2f4560514610ee1578063e37ba8f914610ef7578063e7841ec014610f17578063e884f26014610f2c57600080fd5b8063d32cf92911610113578063d32cf92914610df3578063d406450314610e13578063d469801614610e33578063d5de7e9d14610e53578063dad80fc414610e73578063dd62ed3e14610e7b57600080fd5b8063c6616ba114610d59578063c876d0b914610d79578063cd06ab7314610d93578063d257b34f14610db3578063d2bbdac214610dd357600080fd5b8063a3e56f22116101e8578063ad56c13c116101ac578063ad56c13c14610c44578063b62496f514610ca9578063bc93233f14610cd9578063c024666814610cf9578063c0f306ef14610d19578063c492f04614610d3957600080fd5b8063a3e56f2214610ba4578063a457c2d714610bc4578063a47e991714610be4578063a8b9d24014610c04578063a9059cbb14610c2457600080fd5b806398118cb41161022f57806398118cb414610b2d5780639a7a23d614610b435780639c1b8af514610b63578063a04018ee14610b79578063a26579ad14610b8f57600080fd5b806388bdd9be14610aa05780638aee812714610ac05780638da5cb5b14610ae05780638fda356d14610b0357806395d89b4114610b1857600080fd5b806331e79db01161039d57806365b8dbc01161030f578063719c7847116102d3578063719c7847146109b6578063727ccaee146109e35780638021974b14610a10578063870000e114610a30578063871c128d14610a50578063872d57c614610a7057600080fd5b806365b8dbc01461090b5780636843cd841461092b578063700bb1911461094b57806370a082311461096b578063715018a6146109a157600080fd5b80634be8f8b1116103615780634be8f8b11461083e5780634e71d92d146108545780634fbee19314610869578063514ac7a5146108a257806359992dbc146108d657806364b0f653146108f657600080fd5b806331e79db01461079557806339509351146107b55780633d01b8a7146107d5578063479c5266146107f557806349bd5a5e1461080a57600080fd5b80631694505e116104365780632501ff16116103fa5780632501ff16146106de5780632bc4d48b146106fe5780632c1f52161461071e57806330bb4cff1461073e57806330d5d18d14610753578063313ce5671461077357600080fd5b80631694505e1461061d57806318160ddd146106555780631a8dd2f71461066a57806322bd3f7f1461068a57806323b872dd146106be57600080fd5b806307f148ba1161047d57806307f148ba14610591578063090896be146105b1578063095ea7b3146105c75780630c416d3f146105e757806313114a9d1461060757600080fd5b8062637439146104c457806302259e9e1461050957806303c0f5d41461052d57806306e7b14d1461054f57806306fdde031461056f57600080fd5b366104bf57005b600080fd5b3480156104d057600080fd5b506104f46104df366004614a45565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561051557600080fd5b5061051f600e5481565b604051908152602001610500565b34801561053957600080fd5b5061054d610548366004614a70565b610fec565b005b34801561055b57600080fd5b5061054d61056a366004614a45565b611050565b34801561057b57600080fd5b50610584611161565b6040516105009190614aa9565b34801561059d57600080fd5b5061051f6105ac366004614a45565b6111f3565b3480156105bd57600080fd5b5061051f60165481565b3480156105d357600080fd5b506104f46105e2366004614afe565b61121c565b3480156105f357600080fd5b5061051f610602366004614a45565b611232565b34801561061357600080fd5b5061051f60155481565b34801561062957600080fd5b5060065461063d906001600160a01b031681565b6040516001600160a01b039091168152602001610500565b34801561066157600080fd5b5060025461051f565b34801561067657600080fd5b5061051f610685366004614a45565b6112a2565b34801561069657600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000006481565b3480156106ca57600080fd5b506104f46106d9366004614b2a565b61136c565b3480156106ea57600080fd5b506104f46106f9366004614a45565b6113d5565b34801561070a57600080fd5b5061054d610719366004614b6b565b611445565b34801561072a57600080fd5b5060075461063d906001600160a01b031681565b34801561074a57600080fd5b5061051f61147a565b34801561075f57600080fd5b5061054d61076e366004614a45565b6114ed565b34801561077f57600080fd5b5060055460405160ff9091168152602001610500565b3480156107a157600080fd5b5061054d6107b0366004614a45565b611601565b3480156107c157600080fd5b506104f46107d0366004614afe565b611694565b3480156107e157600080fd5b506104f46107f0366004614a45565b6116ca565b34801561080157600080fd5b5061051f6116fd565b34801561081657600080fd5b5061063d7f000000000000000000000000c485e527889e6056b3b7edfabc961e5edf497eb481565b34801561084a57600080fd5b5061051f60175481565b34801561086057600080fd5b5061054d611747565b34801561087557600080fd5b506104f4610884366004614a45565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156108ae57600080fd5b5061051f7f000000000000000000000000000000000000000000000000000000000000006481565b3480156108e257600080fd5b5061054d6108f1366004614b6b565b6117bf565b34801561090257600080fd5b5061051f611850565b34801561091757600080fd5b5061054d610926366004614a45565b61189a565b34801561093757600080fd5b5061051f610946366004614a45565b611999565b34801561095757600080fd5b5061054d610966366004614b6b565b6119cc565b34801561097757600080fd5b5061051f610986366004614a45565b6001600160a01b031660009081526020819052604090205490565b3480156109ad57600080fd5b5061054d611a9e565b3480156109c257600080fd5b5061051f6109d1366004614a45565b60086020526000908152604090205481565b3480156109ef57600080fd5b5061051f6109fe366004614a45565b60126020526000908152604090205481565b348015610a1c57600080fd5b5061054d610a2b366004614a45565b611b1e565b348015610a3c57600080fd5b5061054d610a4b366004614b84565b611b80565b348015610a5c57600080fd5b5061054d610a6b366004614b6b565b611bc3565b348015610a7c57600080fd5b506104f4610a8b366004614a45565b600a6020526000908152604090205460ff1681565b348015610aac57600080fd5b5061054d610abb366004614a45565b611d1d565b348015610acc57600080fd5b506104f4610adb366004614a45565b6120bb565b348015610aec57600080fd5b5060055461010090046001600160a01b031661063d565b348015610b0f57600080fd5b5061054d6121a9565b348015610b2457600080fd5b506105846121ea565b348015610b3957600080fd5b5061051f60145481565b348015610b4f57600080fd5b5061054d610b5e366004614a70565b6121f9565b348015610b6f57600080fd5b5061051f601a5481565b348015610b8557600080fd5b5061051f60185481565b348015610b9b57600080fd5b5061051f6122f5565b348015610bb057600080fd5b5061054d610bbf366004614b6b565b61233f565b348015610bd057600080fd5b506104f4610bdf366004614afe565b61238d565b348015610bf057600080fd5b506104f4610bff366004614a70565b6123dc565b348015610c1057600080fd5b5061051f610c1f366004614a45565b612480565b348015610c3057600080fd5b506104f4610c3f366004614afe565b6124b3565b348015610c5057600080fd5b50610c64610c5f366004614a45565b6124c0565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610500565b348015610cb557600080fd5b506104f4610cc4366004614a45565b601c6020526000908152604090205460ff1681565b348015610ce557600080fd5b5061054d610cf4366004614a70565b61255b565b348015610d0557600080fd5b5061054d610d14366004614a70565b6125b6565b348015610d2557600080fd5b5061054d610d34366004614a45565b612645565b348015610d4557600080fd5b5061054d610d54366004614ba1565b6126a7565b348015610d6557600080fd5b5061054d610d74366004614c27565b612789565b348015610d8557600080fd5b506011546104f49060ff1681565b348015610d9f57600080fd5b5061054d610dae366004614a70565b6128d0565b348015610dbf57600080fd5b506104f4610dce366004614b6b565b6129e7565b348015610ddf57600080fd5b5061063d610dee366004614a45565b612a8c565b348015610dff57600080fd5b506104f4610e0e366004614c59565b612afb565b348015610e1f57600080fd5b5061054d610e2e366004614b6b565b612cb2565b348015610e3f57600080fd5b50600b5461063d906001600160a01b031681565b348015610e5f57600080fd5b506104f4610e6e366004614a45565b612d13565b6104f4612d46565b348015610e8757600080fd5b5061051f610e96366004614c59565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610ecd57600080fd5b5061051f610edc366004614a45565b612fe6565b348015610eed57600080fd5b5061051f600f5481565b348015610f0357600080fd5b5061054d610f12366004614a45565b613019565b348015610f2357600080fd5b5061051f61312c565b348015610f3857600080fd5b5061054d613176565b348015610f4d57600080fd5b506104f4610f5c366004614b6b565b6131b2565b348015610f6d57600080fd5b50610c64610f7c366004614b6b565b613216565b348015610f8d57600080fd5b5061054d610f9c366004614a45565b613258565b348015610fad57600080fd5b506104f4613354565b348015610fc257600080fd5b5061051f60135481565b348015610fd857600080fd5b50600c5461063d906001600160a01b031681565b6005546001600160a01b036101009091041633146110255760405162461bcd60e51b815260040161101c90614c87565b60405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146110805760405162461bcd60e51b815260040161101c90614c87565b600d546001600160a01b03828116911614156110f95760405162461bcd60e51b815260206004820152603260248201527f43484f4943453a20546865206275796261636b2077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161101c565b6111048160016125b6565b600d546040516001600160a01b03918216918316907f79cc7a4346ee3e4ae1badce5b330777b11e18a64a4f1ee310a51437544c94c5290600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461117090614cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90614cbc565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050905090565b336000908152600860205260408120546112169061121084611232565b90613418565b92915050565b600061122933848461345a565b50600192915050565b600754604051630c416d3f60e01b81526001600160a01b0383811660048301526000921690630c416d3f906024015b602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614cf7565b6001600160a01b03811660009081526012602052604081205481906112d79062127500906112d1904290613418565b9061357f565b6001600160a01b03841660009081526012602052604090205490915061131f57507f000000000000000000000000000000000000000000000000000000000000006492915050565b600781106113305750603292915050565b61133b81600a6135c1565b611365907f0000000000000000000000000000000000000000000000000000000000000064614d26565b9392505050565b6000611379848484613640565b6113cb84336113c6856040518060600160405280602881526020016151a8602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614172565b61345a565b5060019392505050565b60075460405163e12b91b360e01b81526001600160a01b038381166004830152600092169063e12b91b3906024015b602060405180830381865afa158015611421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614d3d565b6005546001600160a01b036101009091041633146114755760405162461bcd60e51b815260040161101c90614c87565b600e55565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e89190614cf7565b905090565b6005546001600160a01b0361010090910416331461151d5760405162461bcd60e51b815260040161101c90614c87565b600c546001600160a01b03828116911614156115995760405162461bcd60e51b815260206004820152603560248201527f43484f4943453a20546865206f7065726174696f6e732077616c6c657420697360448201527420616c72656164792074686973206164647265737360581b606482015260840161101c565b6115a48160016125b6565b600c546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146116315760405162461bcd60e51b815260040161101c90614c87565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112299185906113c690866133b9565b600754604051633d01b8a760e01b81526001600160a01b0383811660048301526000921690633d01b8a790602401611404565b60075460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bc9190614d3d565b50565b6005546001600160a01b036101009091041633146117ef5760405162461bcd60e51b815260040161101c90614c87565b6064811061184b5760405162461bcd60e51b815260206004820152602360248201527f4d61782073656c6c2070657263656e74206d75737420626520756e646572203160448201526230302560e81b606482015260840161101c565b601855565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146118ca5760405162461bcd60e51b815260040161101c90614c87565b6006546001600160a01b038281169116141561193c5760405162461bcd60e51b815260206004820152602b60248201527f43484f4943453a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b606482015260840161101c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401611261565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190614d5a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03610100909104163314611ace5760405162461bcd60e51b815260040161101c90614c87565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314611b4e5760405162461bcd60e51b815260040161101c90614c87565b600754604051638021974b60e01b81526001600160a01b03838116600483015290911690638021974b9060240161165f565b6005546001600160a01b03610100909104163314611bb05760405162461bcd60e51b815260040161101c90614c87565b6019805460ff1916911515919091179055565b6005546001600160a01b03610100909104163314611bf35760405162461bcd60e51b815260040161101c90614c87565b62030d408110158015611c0957506207a1208111155b611c7b5760405162461bcd60e51b815260206004820152603c60248201527f43484f4943453a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c30303000000000606482015260840161101c565b601a54811415611cea5760405162461bcd60e51b815260206004820152603460248201527f43484f4943453a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b606482015260840161101c565b601a5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601a55565b6005546001600160a01b03610100909104163314611d4d5760405162461bcd60e51b815260040161101c90614c87565b6007546001600160a01b0382811691161415611dc95760405162461bcd60e51b815260206004820152603560248201527f43484f4943453a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b606482015260840161101c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3a9190614d88565b6001600160a01b031614611eca5760405162461bcd60e51b815260206004820152604b60248201527f43484f4943453a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e6564206279207468652043484f49434520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a40161101c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611f0c57600080fd5b505af1158015611f20573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611fa46005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561204457600080fd5b505af1158015612058573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b60006120c6826141ac565b6120e25760405162461bcd60e51b815260040161101c90614da5565b6001600160a01b03821630141561210b5760405162461bcd60e51b815260040161101c90614e02565b612114826116ca565b156121315760405162461bcd60e51b815260040161101c90614e85565b60075460065460405163032e4c0d60e11b81523360048201526001600160a01b038581166024830152918216604482015291169063065c981a906064015b600060405180830381600087803b15801561218957600080fd5b505af115801561219d573d6000803e3d6000fd5b50600195945050505050565b6005546001600160a01b036101009091041633146121d95760405162461bcd60e51b815260040161101c90614c87565b6019805461ffff1916610101179055565b60606004805461117090614cbc565b6005546001600160a01b036101009091041633146122295760405162461bcd60e51b815260040161101c90614c87565b7f000000000000000000000000c485e527889e6056b3b7edfabc961e5edf497eb46001600160a01b0316826001600160a01b031614156122e75760405162461bcd60e51b815260206004820152604d60248201527f43484f4943453a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a40161101c565b6122f182826141e8565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461236f5760405162461bcd60e51b815260040161101c90614c87565b4780156122f1576122f161238860646112d184866135c1565b614348565b600061122933846113c6856040518060600160405280602581526020016151d0602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614172565b6005546000906001600160a01b0361010090910416331461240f5760405162461bcd60e51b815260040161101c90614c87565b60075460405163a47e991760e01b81526001600160a01b03858116600483015284151560248301529091169063a47e9917906044015b600060405180830381600087803b15801561245f57600080fd5b505af1158015612473573d6000803e3d6000fd5b5060019695505050505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611261565b6000611229338484613640565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190614ef7565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461258b5760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146125e65760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b036101009091041633146126755760405162461bcd60e51b815260040161101c90614c87565b60075460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161165f565b6005546001600160a01b036101009091041633146126d75760405162461bcd60e51b815260040161101c90614c87565b60005b828110156127485781601b60008686858181106126f9576126f9614f61565b905060200201602081019061270e9190614a45565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061274081614f77565b9150506126da565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161277c93929190614f92565b60405180910390a1505050565b6005546001600160a01b036101009091041633146127b95760405162461bcd60e51b815260040161101c90614c87565b826127c483836133b9565b111561286c5760405162461bcd60e51b8152602060048201526064602482018190527f43484f4943453a20757064617465466565733a3a204c6971756964697479205060448301527f657263206d75737420626520657175616c20746f206f72206869676865722074908201527f68616e206f7065726174696f6e7320616e64206275796261636b20636f6d62696084820152633732b21760e11b60a482015260c40161101c565b6040805183815260208101839052849186917f16e6f67290546b8dd0e587f4b7f67d4f61932ae17ffd8c60d3509dbc05c175fe910160405180910390a360138490556014839055601682905560178190556128c784846133b9565b60155550505050565b6005546001600160a01b036101009091041633146129005760405162461bcd60e51b815260040161101c90614c87565b612909826141ac565b61297b5760405162461bcd60e51b815260206004820152603960248201527f43484f4943453a2073657457686974654c697374414d4d3a3a20414d4d20697360448201527f20612077616c6c65742c206e6f74206120636f6e747261637400000000000000606482015260840161101c565b60075460405163cd06ab7360e01b81526001600160a01b03848116600483015283151560248301529091169063cd06ab73906044015b600060405180830381600087803b1580156129cb57600080fd5b505af11580156129df573d6000803e3d6000fd5b505050505050565b6005546000906001600160a01b03610100909104163314612a1a5760405162461bcd60e51b815260040161101c90614c87565b6002548210612a835760405162461bcd60e51b815260206004820152602f60248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201526e37103a37ba30b61039bab838363c9760891b606482015260840161101c565b50600f55600190565b6007546040516356ef728f60e11b81526001600160a01b038381166004830152600092169063addee51e90602401602060405180830381865afa158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190614d88565b6000612b06836141ac565b612b225760405162461bcd60e51b815260040161101c90614da5565b6006546001600160a01b0383811691161415612bb05760405162461bcd60e51b815260206004820152604160248201527f43484f4943453a20736574526577617264546f6b656e3a3a205573652073657460448201527f526577617264546f6b656e20746f207573652064656661756c7420526f7574656064820152603960f91b608482015260a40161101c565b6001600160a01b038316301415612bd95760405162461bcd60e51b815260040161101c90614e02565b612be2836116ca565b15612bff5760405162461bcd60e51b815260040161101c90614e85565b612c08826113d5565b1515600114612c725760405162461bcd60e51b815260206004820152603060248201527f43484f4943453a20736574526577617264546f6b656e3a3a20414d4d2069732060448201526f6e6f742077686974656c69737465642160801b606482015260840161101c565b60075460405163032e4c0d60e11b81523360048201526001600160a01b03858116602483015284811660448301529091169063065c981a90606401612445565b6005546001600160a01b03610100909104163314612ce25760405162461bcd60e51b815260040161101c90614c87565b60075460405163f9e2f5fb60e01b8152600481018390526001600160a01b039091169063f9e2f5fb9060240161165f565b60075460405163aa9582d360e01b81526001600160a01b038381166004830152600092169063aa9582d390602401611404565b600080612d5233611232565b33600090815260086020526040902054909150612d6f90346133b9565b811015612de6576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a206275794261636b546f6b656e73576974684e6f466565733a60448201527f3a2043616e6e6f74205370656e64206d6f7265207468616e206561726e65642e606482015260840161101c565b604080516002808252606082018352349260009291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e789190614d88565b81600081518110612e8b57612e8b614f61565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612ebf57612ebf614f61565b6001600160a01b0390921660209283029190910182015233600090815260089091526040902054612ef090346133b9565b33600081815260086020908152604080832094909455601b90529182208054600160ff1982161790915560065460ff909116926001600160a01b039091169163b6f9de959186918690612f4542610168614feb565b6040518663ffffffff1660e01b8152600401612f649493929190615047565b6000604051808303818588803b158015612f7d57600080fd5b505af1158015612f91573d6000803e3d6000fd5b5050336000818152601b6020526040808220805460ff1916881515179055518895509193507faf9caa8e44a7ae08c0e421ad7c7f143d77214713719ebe5472be0aed7d0c1099925090a3600194505050505090565b60075460405163ea40e76760e01b81526001600160a01b038381166004830152600092169063ea40e76790602401611261565b6005546001600160a01b036101009091041633146130495760405162461bcd60e51b815260040161101c90614c87565b600b546001600160a01b03828116911614156130c45760405162461bcd60e51b815260206004820152603460248201527f43484f4943453a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b606482015260840161101c565b6130cf8160016125b6565b600b546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156114c4573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146131a65760405162461bcd60e51b815260040161101c90614c87565b6011805460ff19169055565b6005546000906001600160a01b036101009091041633146131e55760405162461bcd60e51b815260040161101c90614c87565b60075460405163e98030c760e01b8152600481018490526001600160a01b039091169063e98030c79060240161216f565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016124fe565b6005546001600160a01b036101009091041633146132885760405162461bcd60e51b815260040161101c90614c87565b6001600160a01b0381166132ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161101c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075460405163e8f8fe3960e01b81523360048201526000916001600160a01b03169063e8f8fe3990602401600060405180830381600087803b15801561339a57600080fd5b505af11580156133ae573d6000803e3d6000fd5b505050506001905090565b6000806133c68385614feb565b9050838110156113655760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161101c565b600061136583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614172565b6001600160a01b0383166134bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161101c565b6001600160a01b03821661351d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161101c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061136583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614382565b6000826135d057506000611216565b60006135dc838561507c565b9050826135e9858361509b565b146113655760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161101c565b6001600160a01b0383166136665760405162461bcd60e51b815260040161101c906150bd565b6001600160a01b03821661368c5760405162461bcd60e51b815260040161101c90615102565b6001600160a01b0382166000908152600a602052604090205460ff1615806136cd57506001600160a01b0383166000908152600a602052604090205460ff16155b6137245760405162461bcd60e51b815260206004820152602260248201527f43484f4943453a20546f2f66726f6d20616464726573732069732069676e6f72604482015261195960f21b606482015260840161101c565b60195460ff166137b9576001600160a01b03821660009081526009602052604090205460ff168061376d57506001600160a01b03831660009081526009602052604090205460ff165b6137b95760405162461bcd60e51b815260206004820152601d60248201527f54726164696e672069732063757272656e746c792064697361626c6564000000604482015260640161101c565b6001600160a01b0382166000908152601c602052604090205460ff1680156137e4575060195460ff16155b801561380857506001600160a01b03831660009081526009602052604090205460ff165b156138cb576005546001600160a01b0384811661010090920416148061384057506005546001600160a01b0383811661010090920416145b8061386357506001600160a01b03831660009081526009602052604090205460ff165b6138cb5760405162461bcd60e51b815260206004820152603360248201527f4f6e6c79206465762063616e20747261646520616761696e737420554e49535760448201527220a810323ab934b7339036b4b3b930ba34b7b760691b606482015260840161101c565b806138e1576138dc838360006143b0565b505050565b60115460ff1615613a53576005546001600160a01b03838116610100909204161480159061391d57506006546001600160a01b03838116911614155b801561395b57507f000000000000000000000000c485e527889e6056b3b7edfabc961e5edf497eb46001600160a01b0316826001600160a01b031614155b801561398057506001600160a01b0382166000908152601b602052604090205460ff16155b80156139a557506001600160a01b0383166000908152601b602052604090205460ff16155b15613a53576001600160a01b0382166000908152601060205260409020544211613a375760405162461bcd60e51b815260206004820152603c60248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e2020506c656173652074727920616761696e206c617465722e00000000606482015260840161101c565b6001600160a01b03821660009081526010602052604090204290555b613a5c826141ac565b158015613a8257506001600160a01b0382166000908152601b602052604090205460ff16155b15613ab7576001600160a01b038216600090815260126020526040902054613ab7576001600160a01b03821660005260126020525b613ac0826141ac565b158015613ae557506001600160a01b0383166000908152601c602052604090205460ff165b8015613b0a57506001600160a01b0382166000908152601b602052604090205460ff16155b15613b96576001600160a01b0382166000908152601260205260409020544211613b96576001600160a01b038216600090815260126020526040902054613b7c90613b5d906003906112d1904290613418565b6001600160a01b038416600090815260126020526040902054906133b9565b6001600160a01b0383166000908152601260205260409020555b6001600160a01b0382166000908152601c602052604090205460ff1615613c2657600e54811115613c095760405162461bcd60e51b815260206004820152601e60248201527f45524332303a2045786365656473206d61782073656c6c20616d6f756e740000604482015260640161101c565b613c2360646112d1601854846135c190919063ffffffff16565b90505b30600090815260208190526040902054600f5481108015908190613c545750600654600160a01b900460ff16155b8015613c675750601954610100900460ff165b8015613c8c57506001600160a01b0385166000908152601c602052604090205460ff16155b8015613ca65750600b546001600160a01b03868116911614155b8015613cc05750600b546001600160a01b03858116911614155b8015613cda5750600c546001600160a01b03868116911614155b8015613cf45750600c546001600160a01b03858116911614155b8015613d0e5750600d546001600160a01b03868116911614155b8015613d285750600d546001600160a01b03858116911614155b8015613d4d57506001600160a01b0384166000908152601b602052604090205460ff16155b8015613d7257506001600160a01b0385166000908152601b602052604090205460ff16155b8015613d8757506001600160a01b0385163014155b8015613da157506007546001600160a01b03868116911614155b15613e05576006805460ff60a01b1916600160a01b179055601554601454600091613dd1916112d19086906135c1565b9050613ddc816144b9565b30600090815260208190526040902054613df5816147c0565b50506006805460ff60a01b191690555b6006546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680613e5357506001600160a01b0385166000908152601b602052604090205460ff165b80613e6657506001600160a01b03861630145b15613e6f575060005b8015613f74576000613e9160646112d1601554886135c190919063ffffffff16565b6001600160a01b0387166000908152601c602052604090205490915060ff1615613f5b576000613f0060646112d17f0000000000000000000000000000000000000000000000000000000000000064613efa60646112d16013548d6135c190919063ffffffff16565b906135c1565b90506000613f2f60646112d1613f158c6112a2565b613efa60646112d16014548e6135c190919063ffffffff16565b9050613f3b82826133b9565b6001600160a01b038a166000908152601260205260409020429055925050505b613f658582613418565b9450613f728730836143b0565b505b613f7f8686866143b0565b6007546001600160a01b031663e30443bc87613fb0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ff657600080fd5b505af1925050508015614007575060015b506007546001600160a01b031663e30443bc86614039816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561407f57600080fd5b505af1925050508015614090575060015b50600654600160a01b900460ff166129df57601a546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af192505050801561410f575060408051601f3d908101601f1916820190925261410c91810190614d5a565b60015b61411857614169565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050565b600081848411156141965760405162461bcd60e51b815260040161101c9190614aa9565b5060006141a38486614d26565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906141e057508115155b949350505050565b6001600160a01b0382166000908152601c602052604090205460ff161515811515141561427f576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840161101c565b6001600160a01b0382166000908152601c60205260409020805460ff1916821580159190911790915561430c5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156142f357600080fd5b505af1158015614307573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600c546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156122f1573d6000803e3d6000fd5b600081836143a35760405162461bcd60e51b815260040161101c9190614aa9565b5060006141a3848661509b565b6001600160a01b0383166143d65760405162461bcd60e51b815260040161101c906150bd565b6001600160a01b0382166143fc5760405162461bcd60e51b815260040161101c90615102565b61443981604051806060016040528060268152602001615182602691396001600160a01b0386166000908152602081905260409020549190614172565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461446890826133b9565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613572565b601454156117bc5760145460009015614506576144ff6014546112d16144f86144ef6016546017546133b990919063ffffffff16565b60145490613418565b85906135c1565b905061450a565b5060005b60006145168383613418565b9050600061452583600261357f565b905060006145338483613418565b90504761453f8361485f565b600061454b4783613418565b90506145578382614983565b6145608561485f565b600061456c4784613418565b905060008060165411156146745760006145a46145966016546017546133b990919063ffffffff16565b6016546112d19086906135c1565b600c546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146145f2576040519150601f19603f3d011682016040523d82523d6000602084013e6145f7565b606091505b50508092505081614672576040805162461bcd60e51b81526020600482015260248101919091527f43484f4943453a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e642045544820746f204f7065726174696f6e732057616c6c6574606482015260840161101c565b505b601754156147745760006146a66146986016546017546133b990919063ffffffff16565b6017546112d19086906135c1565b600d546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146146f4576040519150601f19603f3d011682016040523d82523d6000602084013e6146f9565b606091505b505080925050816147725760405162461bcd60e51b815260206004820152603d60248201527f43484f4943453a2053776170416e644c6971756966793a3a20556e61626c652060448201527f746f2073656e642045544820746f204275794261636b2057616c6c6574000000606482015260840161101c565b505b60408051878152602081018590529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505050505050565b6147c98161485f565b60075460405147916000916001600160a01b039091169083908381818185875af1925050503d806000811461481a576040519150601f19603f3d011682016040523d82523d6000602084013e61481f565b606091505b5050905080156138dc5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910161277c565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061489457614894614f61565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156148ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149119190614d88565b8160018151811061492457614924614f61565b6001600160a01b03928316602091820292909201015260065461494a913091168461345a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906129b1908590600090869030904290600401615145565b60065461499b9030906001600160a01b03168461345a565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614a0b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061168d9190614d5a565b6001600160a01b03811681146117bc57600080fd5b600060208284031215614a5757600080fd5b813561136581614a30565b80151581146117bc57600080fd5b60008060408385031215614a8357600080fd5b8235614a8e81614a30565b91506020830135614a9e81614a62565b809150509250929050565b600060208083528351808285015260005b81811015614ad657858101830151858201604001528201614aba565b81811115614ae8576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215614b1157600080fd5b8235614b1c81614a30565b946020939093013593505050565b600080600060608486031215614b3f57600080fd5b8335614b4a81614a30565b92506020840135614b5a81614a30565b929592945050506040919091013590565b600060208284031215614b7d57600080fd5b5035919050565b600060208284031215614b9657600080fd5b813561136581614a62565b600080600060408486031215614bb657600080fd5b833567ffffffffffffffff80821115614bce57600080fd5b818601915086601f830112614be257600080fd5b813581811115614bf157600080fd5b8760208260051b8501011115614c0657600080fd5b60209283019550935050840135614c1c81614a62565b809150509250925092565b60008060008060808587031215614c3d57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215614c6c57600080fd5b8235614c7781614a30565b91506020830135614a9e81614a30565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680614cd057607f821691505b60208210811415614cf157634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215614d0957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015614d3857614d38614d10565b500390565b600060208284031215614d4f57600080fd5b815161136581614a62565b600080600060608486031215614d6f57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215614d9a57600080fd5b815161136581614a30565b6020808252603d908201527f43484f4943453a20736574526577617264546f6b656e3a3a204164647265737360408201527f20697320612077616c6c65742c206e6f74206120636f6e74726163742e000000606082015260800190565b60208082526059908201527f43484f4943453a20736574526577617264546f6b656e3a3a2043616e6e6f742060408201527f7365742072657761726420746f6b656e206173207468697320746f6b656e206460608201527f756520746f20526f75746572206c696d69746174696f6e732e00000000000000608082015260a00190565b6020808252604c908201527f43484f4943453a20736574526577617264546f6b656e3a3a205265776172642060408201527f546f6b656e2069732069676e6f7265642066726f6d206265696e67207573656460608201526b1030b9903932bbb0b932399760a11b608082015260a00190565b600080600080600080600080610100898b031215614f1457600080fd5b8851614f1f81614a30565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614f8b57614f8b614d10565b5060010190565b6040808252810183905260008460608301825b86811015614fd5578235614fb881614a30565b6001600160a01b0316825260209283019290910190600101614fa5565b5080925050508215156020830152949350505050565b60008219821115614ffe57614ffe614d10565b500190565b600081518084526020808501945080840160005b8381101561503c5781516001600160a01b031687529582019590820190600101615017565b509495945050505050565b8481526080602082015260006150606080830186615003565b6001600160a01b03949094166040830152506060015292915050565b600081600019048311821515161561509657615096614d10565b500290565b6000826150b857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b85815284602082015260a06040820152600061516460a0830186615003565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122071d061725d66811635bfc12358f8e5b19d83abb47c5dff7dfa6a407559f40d8864736f6c634300080a0033

Libraries Used

IterableMapping : 0x0fe9e6d48173123d9a9fafa78134c6d9f5e10e6eUnverified

Deployed Bytecode Sourcemap

21064:32717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21397:56;;;;;;;;;;-1:-1:-1;21397:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;567:14:1;;560:22;542:41;;530:2;515:18;21397:56:0;;;;;;;;21631:62;;;;;;;;;;;;;;;;;;;740:25:1;;;728:2;713:18;21631:62:0;594:177:1;30800:119:0;;;;;;;;;;-1:-1:-1;30800:119:0;;;;;:::i;:::-;;:::i;:::-;;32672:351;;;;;;;;;;-1:-1:-1;32672:351:0;;;;;:::i;:::-;;:::i;6233:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38914:180::-;;;;;;;;;;-1:-1:-1;38914:180:0;;;;;:::i;:::-;;:::i;22609:32::-;;;;;;;;;;;;;;;;7140:169;;;;;;;;;;-1:-1:-1;7140:169:0;;;;;:::i;:::-;;:::i;38761:141::-;;;;;;;;;;-1:-1:-1;38761:141:0;;;;;:::i;:::-;;:::i;22373:55::-;;;;;;;;;;;;;;;;21145:41;;;;;;;;;;-1:-1:-1;21145:41:0;;;;-1:-1:-1;;;;;21145:41:0;;;;;;-1:-1:-1;;;;;2399:32:1;;;2381:51;;2369:2;2354:18;21145:41:0;2208:230:1;6555:108:0;;;;;;;;;;-1:-1:-1;6643:12:0;;6555:108;;36362:857;;;;;;;;;;-1:-1:-1;36362:857:0;;;;;:::i;:::-;;:::i;23031:52::-;;;;;;;;;;;;;;;7315:355;;;;;;;;;;-1:-1:-1;7315:355:0;;;;;:::i;:::-;;:::i;34690:142::-;;;;;;;;;;-1:-1:-1;34690:142:0;;;;;:::i;:::-;;:::i;28859:121::-;;;;;;;;;;-1:-1:-1;28859:121:0;;;;;:::i;:::-;;:::i;21274:44::-;;;;;;;;;;-1:-1:-1;21274:44:0;;;;-1:-1:-1;;;;;21274:44:0;;;37503:141;;;;;;;;;;;;;:::i;32223:384::-;;;;;;;;;;-1:-1:-1;32223:384:0;;;;;:::i;:::-;;:::i;6449:100::-;;;;;;;;;;-1:-1:-1;6532:9:0;;6449:100;;6532:9;;;;3477:36:1;;3465:2;3450:18;6449:100:0;3335:184:1;31012:130:0;;;;;;;;;;-1:-1:-1;31012:130:0;;;;;:::i;:::-;;:::i;7676:218::-;;;;;;;;;;-1:-1:-1;7676:218:0;;;;;:::i;:::-;;:::i;39106:142::-;;;;;;;;;;-1:-1:-1;39106:142:0;;;;;:::i;:::-;;:::i;37232:143::-;;;;;;;;;;;;;:::i;21193:38::-;;;;;;;;;;;;;;;22648:29;;;;;;;;;;;;;;;;43204:103;;;;;;;;;;;;;:::i;37652:125::-;;;;;;;;;;-1:-1:-1;37652:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;37741:28:0;37717:4;37741:28;;;:19;:28;;;;;;;;;37652:125;23090:50;;;;;;;;;;;;;;;53580:198;;;;;;;;;;-1:-1:-1;53580:198:0;;;;;:::i;:::-;;:::i;36109:141::-;;;;;;;;;;;;;:::i;29300:317::-;;;;;;;;;;-1:-1:-1;29300:317:0;;;;;:::i;:::-;;:::i;37944:139::-;;;;;;;;;;-1:-1:-1;37944:139:0;;;;;:::i;:::-;;:::i;43370:271::-;;;;;;;;;;-1:-1:-1;43370:271:0;;;;;:::i;:::-;;:::i;6669:127::-;;;;;;;;;;-1:-1:-1;6669:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;6770:18:0;6743:7;6770:18;;;;;;;;;;;;6669:127;998:148;;;;;;;;;;;;;:::i;21331:59::-;;;;;;;;;;-1:-1:-1;21331:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;22118:55;;;;;;;;;;-1:-1:-1;22118:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;29704:154;;;;;;;;;;-1:-1:-1;29704:154:0;;;;;:::i;:::-;;:::i;29930:119::-;;;;;;;;;;-1:-1:-1;29930:119:0;;;;;:::i;:::-;;:::i;33755:410::-;;;;;;;;;;-1:-1:-1;33755:410:0;;;;;:::i;:::-;;:::i;21460:49::-;;;;;;;;;;-1:-1:-1;21460:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27934:830;;;;;;;;;;-1:-1:-1;27934:830:0;;;;;:::i;:::-;;:::i;39421:601::-;;;;;;;;;;-1:-1:-1;39421:601:0;;;;;:::i;:::-;;:::i;788:79::-;;;;;;;;;;-1:-1:-1;853:6:0;;;;;-1:-1:-1;;;;;853:6:0;788:79;;41341:128;;;;;;;;;;;;;:::i;6339:104::-;;;;;;;;;;;;;:::i;22235:31::-;;;;;;;;;;;;;;;;31439:266;;;;;;;;;;-1:-1:-1;31439:266:0;;;;;:::i;:::-;;:::i;23219:40::-;;;;;;;;;;;;;;;;22681:34;;;;;;;;;;;;;;;;37387:108;;;;;;;;;;;;;:::i;53203:246::-;;;;;;;;;;-1:-1:-1;53203:246:0;;;;;:::i;:::-;;:::i;7900:269::-;;;;;;;;;;-1:-1:-1;7900:269:0;;;;;:::i;:::-;;:::i;34434:191::-;;;;;;;;;;-1:-1:-1;34434:191:0;;;;;:::i;:::-;;:::i;37785:151::-;;;;;;;;;;-1:-1:-1;37785:151:0;;;;;:::i;:::-;;:::i;6802:175::-;;;;;;;;;;-1:-1:-1;6802:175:0;;;;;:::i;:::-;;:::i;38095:318::-;;;;;;;;;;-1:-1:-1;38095:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4335:32:1;;;4317:51;;4399:2;4384:18;;4377:34;;;;4427:18;;;4420:34;;;;4485:2;4470:18;;4463:34;;;;4528:3;4513:19;;4506:35;4355:3;4557:19;;4550:35;4616:3;4601:19;;4594:35;4660:3;4645:19;;4638:35;4304:3;4289:19;38095:318:0;3978:701:1;23532:58:0;;;;;;;;;;-1:-1:-1;23532:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30656:132;;;;;;;;;;-1:-1:-1;30656:132:0;;;;;:::i;:::-;;:::i;30105:182::-;;;;;;;;;;-1:-1:-1;30105:182:0;;;;;:::i;:::-;;:::i;31247:126::-;;;;;;;;;;-1:-1:-1;31247:126:0;;;;;:::i;:::-;;:::i;30338:306::-;;;;;;;;;;-1:-1:-1;30338:306:0;;;;;:::i;:::-;;:::i;33068:610::-;;;;;;;;;;-1:-1:-1;33068:610:0;;;;;:::i;:::-;;:::i;21954:39::-;;;;;;;;;;-1:-1:-1;21954:39:0;;;;;;;;27119:260;;;;;;;;;;-1:-1:-1;27119:260:0;;;;;:::i;:::-;;:::i;27453:253::-;;;;;;;;;;-1:-1:-1;27453:253:0;;;;;:::i;:::-;;:::i;35475:152::-;;;;;;;;;;-1:-1:-1;35475:152:0;;;;;:::i;:::-;;:::i;40138:887::-;;;;;;;;;;-1:-1:-1;40138:887:0;;;;;:::i;:::-;;:::i;29080:158::-;;;;;;;;;;-1:-1:-1;29080:158:0;;;;;:::i;:::-;;:::i;21518:30::-;;;;;;;;;;-1:-1:-1;21518:30:0;;;;-1:-1:-1;;;;;21518:30:0;;;35639:153;;;;;;;;;;-1:-1:-1;35639:153:0;;;;;:::i;:::-;;:::i;41558:1580::-;;;:::i;6983:151::-;;;;;;;;;;-1:-1:-1;6983:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;7099:18:0;;;7072:7;7099:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6983:151;35804:156;;;;;;;;;;-1:-1:-1;35804:156:0;;;;;:::i;:::-;;:::i;21700:52::-;;;;;;;;;;;;;;;;31773:373;;;;;;;;;;-1:-1:-1;31773:373:0;;;;;:::i;:::-;;:::i;35972:129::-;;;;;;;;;;;;;:::i;27761:98::-;;;;;;;;;;;;;:::i;34262:160::-;;;;;;;;;;-1:-1:-1;34262:160:0;;;;;:::i;:::-;;:::i;38421:328::-;;;;;;;;;;-1:-1:-1;38421:328:0;;;;;:::i;:::-;;:::i;1152:244::-;;;;;;;;;;-1:-1:-1;1152:244:0;;;;;:::i;:::-;;:::i;41098:134::-;;;;;;;;;;;;;:::i;22199:29::-;;;;;;;;;;;;;;;;21555:31;;;;;;;;;;-1:-1:-1;21555:31:0;;;;-1:-1:-1;;;;;21555:31:0;;;30800:119;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;30877:25:0;;;::::1;;::::0;;;:17:::1;:25;::::0;;;;:34;;-1:-1:-1;;30877:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30800:119::o;32672:351::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;32785:13:::1;::::0;-1:-1:-1;;;;;32765:33:0;;::::1;32785:13:::0;::::1;32765:33;;32757:96;;;::::0;-1:-1:-1;;;32757:96:0;;6785:2:1;32757:96:0::1;::::0;::::1;6767:21:1::0;6824:2;6804:18;;;6797:30;6863:34;6843:18;;;6836:62;-1:-1:-1;;;6914:18:1;;;6907:48;6972:19;;32757:96:0::1;6583:414:1::0;32757:96:0::1;32864:39;32880:16;32898:4;32864:15;:39::i;:::-;32958:13;::::0;32919:53:::1;::::0;-1:-1:-1;;;;;32958:13:0;;::::1;::::0;32919:53;::::1;::::0;::::1;::::0;32958:13:::1;::::0;32919:53:::1;32983:13;:32:::0;;-1:-1:-1;;;;;;32983:32:0::1;-1:-1:-1::0;;;;;32983:32:0;;;::::1;::::0;;;::::1;::::0;;32672:351::o;6233:100::-;6287:13;6320:5;6313:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6233:100;:::o;38914:180::-;39074:10;38992:7;39049:36;;;:24;:36;;;;;;39018:68;;:26;39037:6;39018:18;:26::i;:::-;:30;;:68::i;:::-;39011:75;38914:180;-1:-1:-1;;38914:180:0:o;7140:169::-;7223:4;7240:39;327:10;7263:7;7272:6;7240:8;:39::i;:::-;-1:-1:-1;7297:4:0;7140:169;;;;:::o;38761:141::-;38852:15;;:42;;-1:-1:-1;;;38852:42:0;;-1:-1:-1;;;;;2399:32:1;;;38852:42:0;;;2381:51:1;38826:7:0;;38852:15;;:34;;2354:18:1;;38852:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36362:857::-;-1:-1:-1;;;;;36563:27:0;;36428:7;36563:27;;;:19;:27;;;;;;36428:7;;36542:63;;36597:7;;36543:48;;:15;;:19;:48::i;:::-;36542:54;;:63::i;:::-;-1:-1:-1;;;;;36707:27:0;;;;;;:19;:27;;;;;;36514:91;;-1:-1:-1;36704:91:0;;-1:-1:-1;36762:21:0;;36362:857;-1:-1:-1;;36362:857:0:o;36704:91::-;36902:1;36881:17;:22;36878:92;;-1:-1:-1;36926:2:0;;36362:857;-1:-1:-1;;36362:857:0:o;36878:92::-;37185:25;:17;37207:2;37185:21;:25::i;:::-;37162:49;;:21;:49;:::i;:::-;37155:56;36362:857;-1:-1:-1;;;36362:857:0:o;7315:355::-;7455:4;7472:36;7482:6;7490:9;7501:6;7472:9;:36::i;:::-;7519:121;7528:6;327:10;7550:89;7588:6;7550:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7550:19:0;;;;;;:11;:19;;;;;;;;327:10;7550:33;;;;;;;;;;:37;:89::i;:::-;7519:8;:121::i;:::-;-1:-1:-1;7658:4:0;7315:355;;;;;:::o;34690:142::-;34780:15;;:44;;-1:-1:-1;;;34780:44:0;;-1:-1:-1;;;;;2399:32:1;;;34780:44:0;;;2381:51:1;34757:4:0;;34780:15;;:32;;2354:18:1;;34780:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28859:121::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;28933:24:::1;:39:::0;28859:121::o;37503:141::-;37593:15;;:43;;;-1:-1:-1;;;37593:43:0;;;;37566:7;;-1:-1:-1;;;;;37593:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37586:50;;37503:141;:::o;32223:384::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;32345:16:::1;::::0;-1:-1:-1;;;;;32322:39:0;;::::1;32345:16:::0;::::1;32322:39;;32314:105;;;::::0;-1:-1:-1;;;32314:105:0;;8290:2:1;32314:105:0::1;::::0;::::1;8272:21:1::0;8329:2;8309:18;;;8302:30;8368:34;8348:18;;;8341:62;-1:-1:-1;;;8419:18:1;;;8412:51;8480:19;;32314:105:0::1;8088:417:1::0;32314:105:0::1;32430:42;32446:19;32467:4;32430:15;:42::i;:::-;32533:16;::::0;32488:62:::1;::::0;-1:-1:-1;;;;;32533:16:0;;::::1;::::0;32488:62;::::1;::::0;::::1;::::0;32533:16:::1;::::0;32488:62:::1;32561:16;:38:::0;;-1:-1:-1;;;;;;32561:38:0::1;-1:-1:-1::0;;;;;32561:38:0;;;::::1;::::0;;;::::1;::::0;;32223:384::o;31012:130::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;31089:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31089:45:0;;-1:-1:-1;;;;;2399:32:1;;;31089:45:0::1;::::0;::::1;2381:51:1::0;31089:15:0;;::::1;::::0;:36:::1;::::0;2354:18:1;;31089:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31012:130:::0;:::o;7676:218::-;327:10;7764:4;7813:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7813:34:0;;;;;;;;;;7764:4;;7781:83;;7804:7;;7813:50;;7852:10;7813:38;:50::i;39106:142::-;39196:15;;:44;;-1:-1:-1;;;39196:44:0;;-1:-1:-1;;;;;2399:32:1;;;39196:44:0;;;2381:51:1;39173:4:0;;39196:15;;:30;;2354:18:1;;39196:44:0;2208:230:1;37232:143:0;37318:15;;:49;;;-1:-1:-1;;;37318:49:0;;;;37291:7;;-1:-1:-1;;;;;37318:15:0;;:47;;:49;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;43204:103;43241:15;;:58;;-1:-1:-1;;;43241:58:0;;43280:10;43241:58;;;8694:51:1;43241:15:0;8761:18:1;;;8754:50;-1:-1:-1;;;;;43241:15:0;;;;:30;;8667:18:1;;43241:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43204:103::o;53580:198::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;53684:3:::1;53667:14;:20;53659:68;;;::::0;-1:-1:-1;;;53659:68:0;;9017:2:1;53659:68:0::1;::::0;::::1;8999:21:1::0;9056:2;9036:18;;;9029:30;9095:34;9075:18;;;9068:62;-1:-1:-1;;;9146:18:1;;;9139:33;9189:19;;53659:68:0::1;8815:399:1::0;53659:68:0::1;53738:15;:32:::0;53580:198::o;36109:141::-;36201:15;;:41;;;-1:-1:-1;;;36201:41:0;;;;36174:7;;-1:-1:-1;;;;;36201:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;29300:317;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;29411:15:::1;::::0;-1:-1:-1;;;;;29389:38:0;;::::1;29411:15:::0;::::1;29389:38;;29381:94;;;::::0;-1:-1:-1;;;29381:94:0;;9421:2:1;29381:94:0::1;::::0;::::1;9403:21:1::0;9460:2;9440:18;;;9433:30;9499:34;9479:18;;;9472:62;-1:-1:-1;;;9550:18:1;;;9543:41;9601:19;;29381:94:0::1;9219:407:1::0;29381:94:0::1;29533:15;::::0;29491:59:::1;::::0;-1:-1:-1;;;;;29533:15:0;;::::1;::::0;29491:59;::::1;::::0;::::1;::::0;29533:15:::1;::::0;29491:59:::1;29561:15;:48:::0;;-1:-1:-1;;;;;;29561:48:0::1;-1:-1:-1::0;;;;;29561:48:0;;;::::1;::::0;;;::::1;::::0;;29300:317::o;37944:139::-;38041:15;;:34;;-1:-1:-1;;;38041:34:0;;-1:-1:-1;;;;;2399:32:1;;;38041:34:0;;;2381:51:1;38014:7:0;;38041:15;;:25;;2354:18:1;;38041:34:0;2208:230:1;43370:271:0;43502:15;;:28;;-1:-1:-1;;;;;;43502:28:0;;;;;740:25:1;;;43436:18:0;;;;;;-1:-1:-1;;;;;43502:15:0;;:23;;713:18:1;;43502:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43546:87;;;10173:25:1;;;10229:2;10214:18;;10207:34;;;10257:18;;;10250:34;;;10315:2;10300:18;;10293:34;;;43435:95:0;;-1:-1:-1;43435:95:0;;-1:-1:-1;43435:95:0;-1:-1:-1;43623:9:0;;43611:5;;43546:87;;10160:3:1;10145:19;43546:87:0;;;;;;;43424:217;;;43370:271;:::o;998:148::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;1089:6:::1;::::0;1068:40:::1;::::0;1105:1:::1;::::0;1089:6:::1;::::0;::::1;-1:-1:-1::0;;;;;1089:6:0::1;::::0;1068:40:::1;::::0;1105:1;;1068:40:::1;1119:6;:19:::0;;-1:-1:-1;;;;;;1119:19:0::1;::::0;;998:148::o;29704:154::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;29793:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;29793:57:0;;-1:-1:-1;;;;;2399:32:1;;;29793:57:0::1;::::0;::::1;2381:51:1::0;29793:15:0;;::::1;::::0;:45:::1;::::0;2354:18:1;;29793:57:0::1;2208:230:1::0;29930:119:0;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;30009:16:::1;:32:::0;;-1:-1:-1;;30009:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29930:119::o;33755:410::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;33855:6:::1;33843:8;:18;;:40;;;;;33877:6;33865:8;:18;;33843:40;33835:113;;;::::0;-1:-1:-1;;;33835:113:0;;10540:2:1;33835:113:0::1;::::0;::::1;10522:21:1::0;10579:2;10559:18;;;10552:30;10618:34;10598:18;;;10591:62;10689:30;10669:18;;;10662:58;10737:19;;33835:113:0::1;10338:424:1::0;33835:113:0::1;33979:16;;33967:8;:28;;33959:93;;;::::0;-1:-1:-1;;;33959:93:0;;10969:2:1;33959:93:0::1;::::0;::::1;10951:21:1::0;11008:2;10988:18;;;10981:30;11047:34;11027:18;;;11020:62;-1:-1:-1;;;11098:18:1;;;11091:50;11158:19;;33959:93:0::1;10767:416:1::0;33959:93:0::1;34102:16;::::0;34068:51:::1;::::0;34092:8;;34068:51:::1;::::0;;;::::1;34130:16;:27:::0;33755:410::o;27934:830::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;28043:15:::1;::::0;-1:-1:-1;;;;;28021:38:0;;::::1;28043:15:::0;::::1;28021:38;;28013:104;;;::::0;-1:-1:-1;;;28013:104:0;;11390:2:1;28013:104:0::1;::::0;::::1;11372:21:1::0;11429:2;11409:18;;;11402:30;11468:34;11448:18;;;11441:62;-1:-1:-1;;;11519:18:1;;;11512:51;11580:19;;28013:104:0::1;11188:417:1::0;28013:104:0::1;28128:40;28201:10;28128:85;;28270:4;-1:-1:-1::0;;;;;28232:43:0::1;:18;-1:-1:-1::0;;;;;28232:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28232:43:0::1;;28224:131;;;::::0;-1:-1:-1;;;28224:131:0;;12068:2:1;28224:131:0::1;::::0;::::1;12050:21:1::0;12107:2;12087:18;;;12080:30;12146:34;12126:18;;;12119:62;12217:34;12197:18;;;12190:62;-1:-1:-1;;;12268:19:1;;;12261:42;12320:19;;28224:131:0::1;11866:479:1::0;28224:131:0::1;28366:68;::::0;-1:-1:-1;;;28366:68:0;;-1:-1:-1;;;;;28366:39:0;::::1;:68;::::0;::::1;2381:51:1::0;;;28366:39:0;::::1;::::0;2354:18:1;;28366:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28445:54:0::1;::::0;-1:-1:-1;;;28445:54:0;;28493:4:::1;28445:54;::::0;::::1;2381:51:1::0;-1:-1:-1;;;;;28445:39:0;::::1;::::0;-1:-1:-1;28445:39:0::1;::::0;-1:-1:-1;2354:18:1;;28445:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28510:18;-1:-1:-1::0;;;;;28510:39:0::1;;28550:7;853:6:::0;;-1:-1:-1;;;;;853:6:0;;;;;;788:79;28550:7:::1;28510:48;::::0;-1:-1:-1;;;;;;28510:48:0::1;::::0;;;;;;-1:-1:-1;;;;;2399:32:1;;;28510:48:0::1;::::0;::::1;2381:51:1::0;2354:18;;28510:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28617:15:0::1;::::0;28569:65:::1;::::0;-1:-1:-1;;;28569:65:0;;-1:-1:-1;;;;;28617:15:0;;::::1;28569:65;::::0;::::1;2381:51:1::0;28569:39:0;;::::1;::::0;-1:-1:-1;28569:39:0::1;::::0;-1:-1:-1;2354:18:1;;28569:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28692:15:0::1;::::0;28650:59:::1;::::0;-1:-1:-1;;;;;28692:15:0;;::::1;::::0;-1:-1:-1;28650:59:0;;::::1;::::0;-1:-1:-1;28650:59:0::1;::::0;28692:15:::1;::::0;28650:59:::1;28720:15;:36:::0;;-1:-1:-1;;;;;;28720:36:0::1;-1:-1:-1::0;;;;;28720:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;27934:830:0:o;39421:601::-;39489:4;39514:30;39525:18;39514:10;:30::i;:::-;39506:104;;;;-1:-1:-1;;;39506:104:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39629:35:0;;39659:4;39629:35;;39621:137;;;;-1:-1:-1;;;39621:137:0;;;;;;;:::i;:::-;39778:34;39793:18;39778:14;:34::i;:::-;39777:35;39769:124;;;;-1:-1:-1;;;39769:124:0;;;;;;;:::i;:::-;39904:15;;39975;;39904:88;;-1:-1:-1;;;39904:88:0;;39935:10;39904:88;;;14003:34:1;-1:-1:-1;;;;;14073:15:1;;;14053:18;;;14046:43;39975:15:0;;;14105:18:1;;;14098:43;39904:15:0;;;:30;;13938:18:1;;39904:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40010:4:0;;39421:601;-1:-1:-1;;;;;39421:601:0:o;41341:128::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;41397:16:::1;:23:::0;;-1:-1:-1;;41431:30:0;;;;;41341:128::o;6339:104::-;6395:13;6428:7;6421:14;;;;;:::i;31439:266::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;31548:13:::1;-1:-1:-1::0;;;;;31540:21:0::1;:4;-1:-1:-1::0;;;;;31540:21:0::1;;;31532:111;;;::::0;-1:-1:-1;;;31532:111:0;;14354:2:1;31532:111:0::1;::::0;::::1;14336:21:1::0;14393:2;14373:18;;;14366:30;14432:34;14412:18;;;14405:62;14503:34;14483:18;;;14476:62;-1:-1:-1;;;14554:19:1;;;14547:44;14608:19;;31532:111:0::1;14152:481:1::0;31532:111:0::1;31656:41;31685:4;31691:5;31656:28;:41::i;:::-;31439:266:::0;;:::o;37387:108::-;37460:15;;:27;;;-1:-1:-1;;;37460:27:0;;;;37433:7;;-1:-1:-1;;;;;37460:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;53203:246;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;53301:21:::1;53338:13:::0;;53335:106:::1;;53368:59;53391:35;53422:3;53391:26;:9:::0;53405:11;53391:13:::1;:26::i;:35::-;53368:22;:59::i;7900:269::-:0;7993:4;8010:129;327:10;8033:7;8042:96;8081:15;8042:96;;;;;;;;;;;;;;;;;327:10;8042:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8042:34:0;;;;;;;;;;;;:38;:96::i;34434:191::-;913:6;;34524:4;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;34540:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;34540:55:0;;-1:-1:-1;;;;;8712:32:1;;;34540:55:0::1;::::0;::::1;8694:51:1::0;8788:14;;8781:22;8761:18;;;8754:50;34540:15:0;;::::1;::::0;:30:::1;::::0;8667:18:1;;34540:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;34613:4:0::1;::::0;34434:191;-1:-1:-1;;;;;;34434:191:0:o;37785:151::-;37881:15;;:47;;-1:-1:-1;;;37881:47:0;;-1:-1:-1;;;;;2399:32:1;;;37881:47:0;;;2381:51:1;37854:7:0;;37881:15;;:38;;2354:18:1;;37881:47:0;2208:230:1;6802:175:0;6888:4;6905:42;327:10;6929:9;6940:6;6905:9;:42::i;38095:318::-;38370:15;;:35;;-1:-1:-1;;;38370:35:0;;-1:-1:-1;;;;;2399:32:1;;;38370:35:0;;;2381:51:1;38191:7:0;;;;;;;;;;;;;;;;38370:15;;;:26;;2354:18:1;;38370:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38363:42;;;;;;;;;;;;;;;;38095:318;;;;;;;;;:::o;30656:132::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30739:32:0;;;::::1;;::::0;;;:24:::1;:32;::::0;;;;:41;;-1:-1:-1;;30739:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30656:132::o;30105:182::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30190:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;30190:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30245:34;;542:41:1;;;30245:34:0::1;::::0;515:18:1;30245:34:0::1;;;;;;;30105:182:::0;;:::o;31247:126::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;31322:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;31322:43:0;;-1:-1:-1;;;;;2399:32:1;;;31322:43:0::1;::::0;::::1;2381:51:1::0;31322:15:0;;::::1;::::0;:34:::1;::::0;2354:18:1;;31322:43:0::1;2208:230:1::0;30338:306:0;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;30457:9:::1;30453:115;30472:19:::0;;::::1;30453:115;;;30548:8;30513:19;:32;30533:8;;30542:1;30533:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30513:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;30513:32:0;:43;;-1:-1:-1;;30513:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30493:3;::::1;::::0;::::1;:::i;:::-;;;;30453:115;;;;30585:51;30617:8;;30627;30585:51;;;;;;;;:::i;:::-;;;;;;;;30338:306:::0;;;:::o;33068:610::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;33250:13;33215:31:::1;:14:::0;33234:11;33215:18:::1;:31::i;:::-;:48;;33206:162;;;::::0;-1:-1:-1;;;33206:162:0;;16886:2:1;33206:162:0::1;::::0;::::1;16868:21:1::0;16925:3;16905:18;;;16898:31;;;16965:34;16945:18;;;16938:62;17036:34;17016:18;;;17009:62;17108:34;17087:19;;;17080:63;-1:-1:-1;;;17159:19:1;;;17152:35;17204:19;;33206:162:0::1;16684:545:1::0;33206:162:0::1;33384:67;::::0;;17408:25:1;;;17464:2;17449:18;;17442:34;;;33408:13:0;;33396:10;;33384:67:::1;::::0;17381:18:1;33384:67:0::1;;;;;;;33462:10;:23:::0;;;33496:12:::1;:28:::0;;;33535:13:::1;:30:::0;;;33576:10:::1;:23:::0;;;33632:28:::1;33475:10:::0;33511:13;33632:14:::1;:28::i;:::-;33620:9;:40:::0;-1:-1:-1;;;;33068:610:0:o;27119:260::-;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;27220:22:::1;27231:10;27220;:22::i;:::-;27212:92;;;::::0;-1:-1:-1;;;27212:92:0;;17689:2:1;27212:92:0::1;::::0;::::1;17671:21:1::0;17728:2;17708:18;;;17701:30;17767:34;17747:18;;;17740:62;17838:27;17818:18;;;17811:55;17883:19;;27212:92:0::1;17487:421:1::0;27212:92:0::1;27313:15;::::0;:58:::1;::::0;-1:-1:-1;;;27313:58:0;;-1:-1:-1;;;;;8712:32:1;;;27313:58:0::1;::::0;::::1;8694:51:1::0;8788:14;;8781:22;8761:18;;;8754:50;27313:15:0;;::::1;::::0;:31:::1;::::0;8667:18:1;;27313:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27119:260:::0;;:::o;27453:253::-;913:6;;27534:4;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;6643:12;;27558:9:::1;:25;27550:85;;;::::0;-1:-1:-1;;;27550:85:0;;18115:2:1;27550:85:0::1;::::0;::::1;18097:21:1::0;18154:2;18134:18;;;18127:30;18193:34;18173:18;;;18166:62;-1:-1:-1;;;18244:18:1;;;18237:45;18299:19;;27550:85:0::1;17913:411:1::0;27550:85:0::1;-1:-1:-1::0;27646:18:0::1;:30:::0;27694:4:::1;::::0;27453:253::o;35475:152::-;35573:15;;:46;;-1:-1:-1;;;35573:46:0;;-1:-1:-1;;;;;2399:32:1;;;35573:46:0;;;2381:51:1;35547:7:0;;35573:15;;:38;;2354:18:1;;35573:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40138:887::-;40247:4;40272:30;40283:18;40272:10;:30::i;:::-;40264:104;;;;-1:-1:-1;;;40264:104:0;;;;;;;:::i;:::-;40417:15;;-1:-1:-1;;;;;40387:46:0;;;40417:15;;40387:46;;40379:124;;;;-1:-1:-1;;;40379:124:0;;18531:2:1;40379:124:0;;;18513:21:1;18570:2;18550:18;;;18543:30;18609:34;18589:18;;;18582:62;18680:34;18660:18;;;18653:62;-1:-1:-1;;;18731:19:1;;;18724:32;18773:19;;40379:124:0;18329:469:1;40379:124:0;-1:-1:-1;;;;;40522:35:0;;40552:4;40522:35;;40514:137;;;;-1:-1:-1;;;40514:137:0;;;;;;;:::i;:::-;40671:34;40686:18;40671:14;:34::i;:::-;40670:35;40662:124;;;;-1:-1:-1;;;40662:124:0;;;;;;;:::i;:::-;40805:36;40822:18;40805:16;:36::i;:::-;:44;;40845:4;40805:44;40797:105;;;;-1:-1:-1;;;40797:105:0;;19005:2:1;40797:105:0;;;18987:21:1;19044:2;19024:18;;;19017:30;19083:34;19063:18;;;19056:62;-1:-1:-1;;;19134:18:1;;;19127:46;19190:19;;40797:105:0;18803:412:1;40797:105:0;40913:15;;:82;;-1:-1:-1;;;40913:82:0;;40944:10;40913:82;;;14003:34:1;-1:-1:-1;;;;;14073:15:1;;;14053:18;;;14046:43;14125:15;;;14105:18;;;14098:43;40913:15:0;;;;:30;;13938:18:1;;40913:82:0;13763:384:1;29080:158:0;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;29174:15:::1;::::0;:56:::1;::::0;-1:-1:-1;;;29174:56:0;;::::1;::::0;::::1;740:25:1::0;;;-1:-1:-1;;;;;29174:15:0;;::::1;::::0;:37:::1;::::0;713:18:1;;29174:56:0::1;594:177:1::0;35639:153:0;35736:15;;:48;;-1:-1:-1;;;35736:48:0;;-1:-1:-1;;;;;2399:32:1;;;35736:48:0;;;2381:51:1;35713:4:0;;35736:15;;:40;;2354:18:1;;35736:48:0;2208:230:1;41558:1580:0;41619:4;41636:27;41666:30;41685:10;41666:18;:30::i;:::-;41763:10;41738:36;;;;:24;:36;;;;;;41636:60;;-1:-1:-1;41738:51:0;;41779:9;41738:40;:51::i;:::-;41715:19;:74;;41707:151;;;;;-1:-1:-1;;;41707:151:0;;19422:2:1;41707:151:0;;;19404:21:1;19441:18;;;19434:30;;;;19500:34;19480:18;;;19473:62;19571:34;19551:18;;;19544:62;19623:19;;41707:151:0;19220:428:1;41707:151:0;42013:16;;;42027:1;42013:16;;;;;;;;41899:9;;41879:17;;42013:16;42027:1;42013:16;;;;;;;;-1:-1:-1;;42050:15:0;;:22;;;-1:-1:-1;;;42050:22:0;;;;41989:40;;-1:-1:-1;;;;;;42050:15:0;;;;:20;;-1:-1:-1;42050:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42040:4;42045:1;42040:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;42040:32:0;;;-1:-1:-1;;;;;42040:32:0;;;;;42101:4;42083;42088:1;42083:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42083:23:0;;;:7;;;;;;;;;;:23;42347:10;42322:36;;;;:24;:36;;;;;;;:51;;42363:9;42322:40;:51::i;:::-;42308:10;42283:36;;;;:24;:36;;;;;;;;:90;;;;42415:19;:31;;;;;;;;-1:-1:-1;;42599:38:0;;;;;;42658:15;;42415:31;;;;;-1:-1:-1;;;;;42658:15:0;;;;:66;;42732:9;;42862:4;;42915:21;:15;42933:3;42915:21;:::i;:::-;42658:289;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42988:10:0;42968:31;;;;:19;:31;;;;;;:47;;-1:-1:-1;;42968:47:0;;;;;;;43068:40;43098:9;;-1:-1:-1;42988:10:0;;-1:-1:-1;43068:40:0;;-1:-1:-1;42968:31:0;43068:40;43126:4;43119:11;;;;;;41558:1580;:::o;35804:156::-;35904:15;;:48;;-1:-1:-1;;;35904:48:0;;-1:-1:-1;;;;;2399:32:1;;;35904:48:0;;;2381:51:1;35878:7:0;;35904:15;;:41;;2354:18:1;;35904:48:0;2208:230:1;31773:373:0;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;31892:15:::1;::::0;-1:-1:-1;;;;;31870:37:0;;::::1;31892:15:::0;::::1;31870:37;;31862:102;;;::::0;-1:-1:-1;;;31862:102:0;;21101:2:1;31862:102:0::1;::::0;::::1;21083:21:1::0;21140:2;21120:18;;;21113:30;21179:34;21159:18;;;21152:62;-1:-1:-1;;;21230:18:1;;;21223:50;21290:19;;31862:102:0::1;20899:416:1::0;31862:102:0::1;31975:41;31991:18;32011:4;31975:15;:41::i;:::-;32075:15;::::0;32032:59:::1;::::0;-1:-1:-1;;;;;32075:15:0;;::::1;::::0;32032:59;::::1;::::0;::::1;::::0;32075:15:::1;::::0;32032:59:::1;32102:15;:36:::0;;-1:-1:-1;;;;;;32102:36:0::1;-1:-1:-1::0;;;;;32102:36:0;;;::::1;::::0;;;::::1;::::0;;31773:373::o;35972:129::-;36054:15;;:39;;;-1:-1:-1;;;36054:39:0;;;;36027:7;;-1:-1:-1;;;;;36054:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;27761:98;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;27823:20:::1;:28:::0;;-1:-1:-1;;27823:28:0::1;::::0;;27761:98::o;34262:160::-;913:6;;34334:4;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;34350:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;34350:42:0;;::::1;::::0;::::1;740:25:1::0;;;-1:-1:-1;;;;;34350:15:0;;::::1;::::0;:31:::1;::::0;713:18:1;;34350:42:0::1;594:177:1::0;38421:328:0;38701:15;;:40;;-1:-1:-1;;;38701:40:0;;;;;740:25:1;;;38522:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38701:15:0;;;;:33;;713:18:1;;38701:40:0;594:177:1;1152:244:0;913:6;;-1:-1:-1;;;;;913:6:0;;;;;327:10;913:22;905:67;;;;-1:-1:-1;;;905:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1241:22:0;::::1;1233:73;;;::::0;-1:-1:-1;;;1233:73:0;;21522:2:1;1233:73:0::1;::::0;::::1;21504:21:1::0;21561:2;21541:18;;;21534:30;21600:34;21580:18;;;21573:62;-1:-1:-1;;;21651:18:1;;;21644:36;21697:19;;1233:73:0::1;21320:402:1::0;1233:73:0::1;1343:6;::::0;1322:38:::1;::::0;-1:-1:-1;;;;;1322:38:0;;::::1;::::0;1343:6:::1;::::0;::::1;;::::0;1322:38:::1;::::0;;;::::1;1371:6;:17:::0;;-1:-1:-1;;;;;1371:17:0;;::::1;;;-1:-1:-1::0;;;;;;1371:17:0;;::::1;::::0;;;::::1;::::0;;1152:244::o;41098:134::-;41158:15;;:44;;-1:-1:-1;;;41158:44:0;;41191:10;41158:44;;;2381:51:1;41142:4:0;;-1:-1:-1;;;;;41158:15:0;;:32;;2354:18:1;;41158:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41220:4;41213:11;;41098:134;:::o;4308:179::-;4366:7;;4398:5;4402:1;4398;:5;:::i;:::-;4386:17;;4427:1;4422;:6;;4414:46;;;;-1:-1:-1;;;4414:46:0;;21929:2:1;4414:46:0;;;21911:21:1;21968:2;21948:18;;;21941:30;22007:29;21987:18;;;21980:57;22054:18;;4414:46:0;21727:351:1;4493:136:0;4551:7;4578:43;4582:1;4585;4578:43;;;;;;;;;;;;;;;;;:3;:43::i;9550:378::-;-1:-1:-1;;;;;9686:19:0;;9678:68;;;;-1:-1:-1;;;9678:68:0;;22285:2:1;9678:68:0;;;22267:21:1;22324:2;22304:18;;;22297:30;22363:34;22343:18;;;22336:62;-1:-1:-1;;;22414:18:1;;;22407:34;22458:19;;9678:68:0;22083:400:1;9678:68:0;-1:-1:-1;;;;;9765:21:0;;9757:68;;;;-1:-1:-1;;;9757:68:0;;22690:2:1;9757:68:0;;;22672:21:1;22729:2;22709:18;;;22702:30;22768:34;22748:18;;;22741:62;-1:-1:-1;;;22819:18:1;;;22812:32;22861:19;;9757:68:0;22488:398:1;9757:68:0;-1:-1:-1;;;;;9836:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9888:32;;740:25:1;;;9888:32:0;;713:18:1;9888:32:0;;;;;;;;9550:378;;;:::o;5083:132::-;5141:7;5168:39;5172:1;5175;5168:39;;;;;;;;;;;;;;;;;:3;:39::i;4831:246::-;4889:7;4913:6;4909:47;;-1:-1:-1;4943:1:0;4936:8;;4909:47;4966:9;4978:5;4982:1;4978;:5;:::i;:::-;4966:17;-1:-1:-1;5011:1:0;5002:5;5006:1;4966:17;5002:5;:::i;:::-;:10;4994:56;;;;-1:-1:-1;;;4994:56:0;;23488:2:1;4994:56:0;;;23470:21:1;23527:2;23507:18;;;23500:30;23566:34;23546:18;;;23539:62;-1:-1:-1;;;23617:18:1;;;23610:31;23658:19;;4994:56:0;23286:397:1;44105:5357:0;-1:-1:-1;;;;;44237:18:0;;44229:68;;;;-1:-1:-1;;;44229:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44316:16:0;;44308:64;;;;-1:-1:-1;;;44308:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44392:21:0;;;;;;:17;:21;;;;;;;;44391:22;;:50;;-1:-1:-1;;;;;;44418:23:0;;;;;;:17;:23;;;;;;;;44417:24;44391:50;44383:97;;;;-1:-1:-1;;;44383:97:0;;24700:2:1;44383:97:0;;;24682:21:1;24739:2;24719:18;;;24712:30;24778:34;24758:18;;;24751:62;-1:-1:-1;;;24829:18:1;;;24822:32;24871:19;;44383:97:0;24498:398:1;44383:97:0;44505:16;;;;44501:153;;-1:-1:-1;;;;;44546:28:0;;;;;;:24;:28;;;;;;;;;:62;;-1:-1:-1;;;;;;44578:30:0;;;;;;:24;:30;;;;;;;;44546:62;44538:104;;;;-1:-1:-1;;;44538:104:0;;25103:2:1;44538:104:0;;;25085:21:1;25142:2;25122:18;;;25115:30;25181:31;25161:18;;;25154:59;25230:18;;44538:104:0;24901:353:1;44538:104:0;-1:-1:-1;;;;;44677:29:0;;;;;;:25;:29;;;;;;;;:50;;;;-1:-1:-1;44711:16:0;;;;44710:17;44677:50;:84;;;;-1:-1:-1;;;;;;44731:30:0;;;;;;:24;:30;;;;;;;;44677:84;44674:248;;;853:6;;-1:-1:-1;;;;;44787:15:0;;;853:6;;;;;44787:15;;:32;;-1:-1:-1;853:6:0;;-1:-1:-1;;;;;44806:13:0;;;853:6;;;;;44806:13;44787:32;44786:68;;;-1:-1:-1;;;;;;44824:30:0;;;;;;:24;:30;;;;;;;;44786:68;44778:132;;;;-1:-1:-1;;;44778:132:0;;25461:2:1;44778:132:0;;;25443:21:1;25500:2;25480:18;;;25473:30;25539:34;25519:18;;;25512:62;-1:-1:-1;;;25590:18:1;;;25583:49;25649:19;;44778:132:0;25259:415:1;44778:132:0;45058:11;45055:92;;45086:28;45102:4;45108:2;45112:1;45086:15;:28::i;:::-;44105:5357;;;:::o;45055:92::-;45295:20;;;;45291:420;;;853:6;;-1:-1:-1;;;;;45335:13:0;;;853:6;;;;;45335:13;;;;:47;;-1:-1:-1;45366:15:0;;-1:-1:-1;;;;;45352:30:0;;;45366:15;;45352:30;;45335:47;:79;;;;;45400:13;-1:-1:-1;;;;;45386:28:0;:2;-1:-1:-1;;;;;45386:28:0;;;45335:79;:107;;;;-1:-1:-1;;;;;;45419:23:0;;;;;;:19;:23;;;;;;;;45418:24;45335:107;:137;;;;-1:-1:-1;;;;;;45447:25:0;;;;;;:19;:25;;;;;;;;45446:26;45335:137;45331:369;;;-1:-1:-1;;;;;45500:32:0;;;;;;:28;:32;;;;;;45535:15;-1:-1:-1;45492:123:0;;;;-1:-1:-1;;;45492:123:0;;25881:2:1;45492:123:0;;;25863:21:1;25920:2;25900:18;;;25893:30;25959:34;25939:18;;;25932:62;26030:30;26010:18;;;26003:58;26078:19;;45492:123:0;25679:424:1;45492:123:0;-1:-1:-1;;;;;45634:32:0;;;;;;:28;:32;;;;;45669:15;45634:50;;45331:369;45814:14;45825:2;45814:10;:14::i;:::-;45813:15;:43;;;;-1:-1:-1;;;;;;45833:23:0;;;;;;:19;:23;;;;;;;;45832:24;45813:43;45810:182;;;-1:-1:-1;;;;;45875:23:0;;;;;;:19;:23;;;;;;45872:109;;-1:-1:-1;;;;;45923:23:0;;;;:19;:23;;45872:109;46228:14;46239:2;46228:10;:14::i;:::-;46227:15;:50;;;;-1:-1:-1;;;;;;46246:31:0;;;;;;:25;:31;;;;;;;;46227:50;:78;;;;-1:-1:-1;;;;;;46282:23:0;;;;;;:19;:23;;;;;;;;46281:24;46227:78;46224:295;;;-1:-1:-1;;;;;46324:23:0;;;;;;:19;:23;;;;;;46351:15;-1:-1:-1;46321:187:0;;-1:-1:-1;;;;;46460:23:0;;;;;;:19;:23;;;;;;46412:80;;46440:51;;46489:1;;46440:44;;:15;;:19;:44::i;:51::-;-1:-1:-1;;;;;46412:23:0;;;;;;:19;:23;;;;;;;:27;:80::i;:::-;-1:-1:-1;;;;;46386:23:0;;;;;;:19;:23;;;;;:106;46321:187;-1:-1:-1;;;;;46535:29:0;;;;;;:25;:29;;;;;;;;46532:285;;;46590:24;;46580:6;:34;;46572:77;;;;-1:-1:-1;;;46572:77:0;;26310:2:1;46572:77:0;;;26292:21:1;26349:2;26329:18;;;26322:30;26388:32;26368:18;;;26361:60;26438:18;;46572:77:0;26108:354:1;46572:77:0;46665:36;46697:3;46665:27;46676:15;;46665:6;:10;;:27;;;;:::i;:36::-;46656:45;;46532:285;46878:4;46829:28;6770:18;;;;;;;;;;;46944;;46920:42;;;;;;;46992:33;;-1:-1:-1;47017:8:0;;-1:-1:-1;;;47017:8:0;;;;47016:9;46992:33;:73;;;;-1:-1:-1;47042:23:0;;;;;;;46992:73;:122;;;;-1:-1:-1;;;;;;47083:31:0;;;;;;:25;:31;;;;;;;;47082:32;46992:122;:162;;;;-1:-1:-1;47139:15:0;;-1:-1:-1;;;;;47131:23:0;;;47139:15;;47131:23;;46992:162;:200;;;;-1:-1:-1;47177:15:0;;-1:-1:-1;;;;;47171:21:0;;;47177:15;;47171:21;;46992:200;:241;;;;-1:-1:-1;47217:16:0;;-1:-1:-1;;;;;47209:24:0;;;47217:16;;47209:24;;46992:241;:280;;;;-1:-1:-1;47256:16:0;;-1:-1:-1;;;;;47250:22:0;;;47256:16;;47250:22;;46992:280;:318;;;;-1:-1:-1;47297:13:0;;-1:-1:-1;;;;;47289:21:0;;;47297:13;;47289:21;;46992:318;:354;;;;-1:-1:-1;47333:13:0;;-1:-1:-1;;;;;47327:19:0;;;47333:13;;47327:19;;46992:354;:395;;;;-1:-1:-1;;;;;;47364:23:0;;;;;;:19;:23;;;;;;;;47363:24;46992:395;:438;;;;-1:-1:-1;;;;;;47405:25:0;;;;;;:19;:25;;;;;;;;47404:26;46992:438;:476;;;;-1:-1:-1;;;;;;47447:21:0;;47463:4;47447:21;;46992:476;:525;;;;-1:-1:-1;47501:15:0;;-1:-1:-1;;;;;47485:32:0;;;47501:15;;47485:32;;46992:525;46975:884;;;47546:8;:15;;-1:-1:-1;;;;47546:15:0;-1:-1:-1;;;47546:15:0;;;47654:9;;47546:8;47636:12;47546:15;;47611:53;;:38;;:20;;:24;:38::i;:53::-;47590:74;;47679:26;47694:10;47679:14;:26::i;:::-;47761:4;47722:18;6770;;;;;;;;;;;47782:32;6770:18;47782:20;:32::i;:::-;-1:-1:-1;;47831:8:0;:16;;-1:-1:-1;;;;47831:16:0;;;46975:884;47889:8;;-1:-1:-1;;;;;47998:25:0;;47873:12;47998:25;;;:19;:25;;;;;;47889:8;-1:-1:-1;;;47889:8:0;;;;;47888:9;;47998:25;;:52;;-1:-1:-1;;;;;;48027:23:0;;;;;;:19;:23;;;;;;;;47998:52;:77;;;-1:-1:-1;;;;;;48054:21:0;;48070:4;48054:21;47998:77;47995:124;;;-1:-1:-1;48102:5:0;47995:124;48132:7;48129:754;;;48156:12;48171:30;48197:3;48171:21;48182:9;;48171:6;:10;;:21;;;;:::i;:30::-;-1:-1:-1;;;;;48334:29:0;;;;;;:25;:29;;;;;;48156:45;;-1:-1:-1;48334:29:0;;48331:444;;;48384:21;48408:65;48469:3;48408:56;48444:19;48408:31;48435:3;48408:22;48419:10;;48408:6;:10;;:22;;;;:::i;:31::-;:35;;:56::i;:65::-;48384:89;;48492:20;48515:73;48584:3;48515:64;48553:25;48573:4;48553:19;:25::i;:::-;48515:33;48544:3;48515:24;48526:12;;48515:6;:10;;:24;;;;:::i;:73::-;48492:96;-1:-1:-1;48614:31:0;:13;48492:96;48614:17;:31::i;:::-;-1:-1:-1;;;;;48664:25:0;;;;;;:19;:25;;;;;48692:15;48664:43;;48607:38;-1:-1:-1;;;48331:444:0;48798:16;:6;48809:4;48798:10;:16::i;:::-;48789:25;;48829:42;48845:4;48859;48866;48829:15;:42::i;:::-;48141:742;48129:754;48893:33;48909:4;48915:2;48919:6;48893:15;:33::i;:::-;48941:15;;-1:-1:-1;;;;;48941:15:0;:26;48976:4;48983:15;48976:4;-1:-1:-1;;;;;6770:18:0;6743:7;6770:18;;;;;;;;;;;;6669:127;48983:15;48941:58;;-1:-1:-1;;;;;;48941:58:0;;;;;;;-1:-1:-1;;;;;26675:32:1;;;48941:58:0;;;26657:51:1;26724:18;;;26717:34;26630:18;;48941:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48937:74;49025:15;;-1:-1:-1;;;;;49025:15:0;:26;49060:2;49065:13;49060:2;-1:-1:-1;;;;;6770:18:0;6743:7;6770:18;;;;;;;;;;;;6669:127;49065:13;49025:54;;-1:-1:-1;;;;;;49025:54:0;;;;;;;-1:-1:-1;;;;;26675:32:1;;;49025:54:0;;;26657:51:1;26724:18;;;26717:34;26630:18;;49025:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49021:70;49105:8;;-1:-1:-1;;;49105:8:0;;;;49101:354;;49144:16;;49179:15;;:28;;-1:-1:-1;;;;;;49179:28:0;;;;;740:25:1;;;-1:-1:-1;;;;;49179:15:0;;;;:23;;713:18:1;;49179:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;49179:28:0;;;;;;;;-1:-1:-1;;49179:28:0;;;;;;;;;;;;:::i;:::-;;;49175:269;;;;;49305:86;;;10173:25:1;;;10229:2;10214:18;;10207:34;;;10257:18;;;10250:34;;;10315:2;10300:18;;10293:34;;;49381:9:0;;49370:4;;49305:86;;10160:3:1;10145:19;49305:86:0;;;;;;;49208:199;;;49175:269;49115:340;44218:5244;;;44105:5357;;;:::o;4635:190::-;4721:7;4757:12;4749:6;;;;4741:29;;;;-1:-1:-1;;;4741:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4781:9:0;4793:5;4797:1;4793;:5;:::i;:::-;4781:17;4635:190;-1:-1:-1;;;;;4635:190:0:o;34844:619::-;34904:4;35372:20;;35215:66;35412:23;;;;;;:42;;-1:-1:-1;35439:15:0;;;35412:42;35404:51;34844:619;-1:-1:-1;;;;34844:619:0:o;43688:405::-;-1:-1:-1;;;;;43779:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;43771:117;;;;;-1:-1:-1;;;43771:117:0;;26964:2:1;43771:117:0;;;26946:21:1;26983:18;;;26976:30;;;;27042:34;27022:18;;;27015:62;27113:34;27093:18;;;27086:62;27165:19;;43771:117:0;26762:428:1;43771:117:0;-1:-1:-1;;;;;43899:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;43899:39:0;;;;;;;;;;;;43951:79;;43976:15;;:42;;-1:-1:-1;;;43976:42:0;;-1:-1:-1;;;;;2399:32:1;;;43976:42:0;;;2381:51:1;43976:15:0;;;;:36;;2354:18:1;;43976:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43951:79;44045:40;;;;;;-1:-1:-1;;;;;44045:40:0;;;;;;;;43688:405;;:::o;53452:120::-;53529:16;;53521:42;;-1:-1:-1;;;;;53529:16:0;;;;53521:42;;;;;53556:6;;53529:16;53521:42;53529:16;53521:42;53556:6;53529:16;53521:42;;;;;;;;;;;;;;;;;;;5221:189;5307:7;5342:12;5335:5;5327:28;;;;-1:-1:-1;;;5327:28:0;;;;;;;;:::i;:::-;-1:-1:-1;5366:9:0;5378:5;5382:1;5378;:5;:::i;8175:569::-;-1:-1:-1;;;;;8315:20:0;;8307:70;;;;-1:-1:-1;;;8307:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8396:23:0;;8388:71;;;;-1:-1:-1;;;8388:71:0;;;;;;;:::i;:::-;8548;8570:6;8548:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8548:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;8528:17:0;;;:9;:17;;;;;;;;;;;:91;;;;8653:20;;;;;;;:32;;8678:6;8653:24;:32::i;:::-;-1:-1:-1;;;;;8630:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8701:35;740:25:1;;;8630:20:0;;8701:35;;;;;;713:18:1;8701:35:0;594:177:1;49470:2285:0;49542:12;;:16;49539:2209;;49807:12;;49763:26;;49807:16;49804:216;;49864:77;49928:12;;49864:59;49875:47;49892:29;49907:13;;49892:10;;:14;;:29;;;;:::i;:::-;49875:12;;;:16;:47::i;:::-;49864:6;;:10;:59::i;:77::-;49843:98;;49804:216;;;-1:-1:-1;50003:1:0;49804:216;50034:37;50074:30;:6;50085:18;50074:10;:30::i;:::-;50034:70;-1:-1:-1;50119:12:0;50134:25;:18;50157:1;50134:22;:25::i;:::-;50119:40;-1:-1:-1;50174:17:0;50194:28;:18;50119:40;50194:22;:28::i;:::-;50174:48;-1:-1:-1;50262:21:0;50334:22;50351:4;50334:16;:22::i;:::-;50493:18;50514:41;:21;50540:14;50514:25;:41::i;:::-;50493:62;;50611:35;50624:9;50635:10;50611:12;:35::i;:::-;50661:47;50678:29;50661:16;:47::i;:::-;50723:38;50764:41;:21;50790:14;50764:25;:41::i;:::-;50723:82;;50820:12;50866:1;50850:13;;:17;50847:417;;;50941:25;50969:84;51023:29;51038:13;;51023:10;;:14;;:29;;;;:::i;:::-;51004:13;;50969:49;;:30;;:34;:49::i;:84::-;51093:16;;51085:60;;50941:112;;-1:-1:-1;;;;;;51093:16:0;;50941:112;;51085:60;;;;50941:112;51093:16;51085:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51072:73;;;;;51172:7;51164:84;;;;;-1:-1:-1;;;51164:84:0;;27607:2:1;51164:84:0;;;27589:21:1;27626:18;;;27619:30;;;;27685:34;27665:18;;;27658:62;27756:34;27736:18;;;27729:62;27808:19;;51164:84:0;27405:428:1;51164:84:0;50868:396;50847:417;51281:10;;:14;51278:396;;51366:22;51391:81;51442:29;51457:13;;51442:10;;:14;;:29;;;;:::i;:::-;51426:10;;51391:46;;:30;;:34;:46::i;:81::-;51512:13;;51504:54;;51366:106;;-1:-1:-1;;;;;;51512:13:0;;51366:106;;51504:54;;;;51366:106;51512:13;51504:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51491:67;;;;;51585:7;51577:81;;;;-1:-1:-1;;;51577:81:0;;28040:2:1;51577:81:0;;;28022:21:1;28079:2;28059:18;;;28052:30;28118:34;28098:18;;;28091:62;28189:31;28169:18;;;28162:59;28238:19;;51577:81:0;27838:425:1;51577:81:0;51296:378;51278:396;51693:43;;;28470:25:1;;;28526:2;28511:18;;28504:34;;;28554:18;;;28547:34;;;51693:43:0;;28458:2:1;28443:18;51693:43:0;;;;;;;49559:2189;;;;;;;;49470:2285;:::o;52883:315::-;52948:24;52965:6;52948:16;:24::i;:::-;53061:15;;53053:51;;53003:21;;52983:17;;-1:-1:-1;;;;;53061:15:0;;;;53003:21;;52983:17;53053:51;52983:17;53053:51;53003:21;53061:15;53053:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53035:69;;;53118:7;53115:76;;;53147:32;;;17408:25:1;;;17464:2;17449:18;;17442:34;;;53147:32:0;;17381:18:1;53147:32:0;17234:248:1;51763:585:0;51913:16;;;51927:1;51913:16;;;;;;;;51889:21;;51913:16;;;;;;;;;;-1:-1:-1;51913:16:0;51889:40;;51958:4;51940;51945:1;51940:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51940:23:0;;;:7;;;;;;;;;;:23;;;;51984:15;;:22;;;-1:-1:-1;;;51984:22:0;;;;:15;;;;;:20;;:22;;;;;51940:7;;51984:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51974:4;51979:1;51974:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51974:32:0;;;:7;;;;;;;;;:32;52049:15;;52017:62;;52034:4;;52049:15;52067:11;52017:8;:62::i;:::-;52116:15;;:224;;-1:-1:-1;;;52116:224:0;;-1:-1:-1;;;;;52116:15:0;;;;:66;;:224;;52197:11;;52116:15;;52267:4;;52294;;52314:15;;52116:224;;;:::i;52356:519::-;52536:15;;52504:62;;52521:4;;-1:-1:-1;;;;;52536:15:0;52554:11;52504:8;:62::i;:::-;52607:15;;52811;;52607:260;;-1:-1:-1;;;52607:260:0;;52679:4;52607:260;;;29520:34:1;29570:18;;;29563:34;;;52607:15:0;29613:18:1;;;29606:34;;;29656:18;;;29649:34;-1:-1:-1;;;;;52811:15:0;;;29699:19:1;;;29692:44;52841:15:0;29752:19:1;;;29745:35;52607:15:0;;;:31;;52646:9;;29454:19:1;;52607:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;776:118::-;862:5;855:13;848:21;841:5;838:32;828:60;;884:1;881;874:12;899:382;964:6;972;1025:2;1013:9;1004:7;1000:23;996:32;993:52;;;1041:1;1038;1031:12;993:52;1080:9;1067:23;1099:31;1124:5;1099:31;:::i;:::-;1149:5;-1:-1:-1;1206:2:1;1191:18;;1178:32;1219:30;1178:32;1219:30;:::i;:::-;1268:7;1258:17;;;899:382;;;;;:::o;1286:597::-;1398:4;1427:2;1456;1445:9;1438:21;1488:6;1482:13;1531:6;1526:2;1515:9;1511:18;1504:34;1556:1;1566:140;1580:6;1577:1;1574:13;1566:140;;;1675:14;;;1671:23;;1665:30;1641:17;;;1660:2;1637:26;1630:66;1595:10;;1566:140;;;1724:6;1721:1;1718:13;1715:91;;;1794:1;1789:2;1780:6;1769:9;1765:22;1761:31;1754:42;1715:91;-1:-1:-1;1867:2:1;1846:15;-1:-1:-1;;1842:29:1;1827:45;;;;1874:2;1823:54;;1286:597;-1:-1:-1;;;1286:597:1:o;1888:315::-;1956:6;1964;2017:2;2005:9;1996:7;1992:23;1988:32;1985:52;;;2033:1;2030;2023:12;1985:52;2072:9;2059:23;2091:31;2116:5;2091:31;:::i;:::-;2141:5;2193:2;2178:18;;;;2165:32;;-1:-1:-1;;;1888:315:1:o;2443:456::-;2520:6;2528;2536;2589:2;2577:9;2568:7;2564:23;2560:32;2557:52;;;2605:1;2602;2595:12;2557:52;2644:9;2631:23;2663:31;2688:5;2663:31;:::i;:::-;2713:5;-1:-1:-1;2770:2:1;2755:18;;2742:32;2783:33;2742:32;2783:33;:::i;:::-;2443:456;;2835:7;;-1:-1:-1;;;2889:2:1;2874:18;;;;2861:32;;2443:456::o;2904:180::-;2963:6;3016:2;3004:9;2995:7;2991:23;2987:32;2984:52;;;3032:1;3029;3022:12;2984:52;-1:-1:-1;3055:23:1;;2904:180;-1:-1:-1;2904:180:1:o;3732:241::-;3788:6;3841:2;3829:9;3820:7;3816:23;3812:32;3809:52;;;3857:1;3854;3847:12;3809:52;3896:9;3883:23;3915:28;3937:5;3915:28;:::i;4684:750::-;4776:6;4784;4792;4845:2;4833:9;4824:7;4820:23;4816:32;4813:52;;;4861:1;4858;4851:12;4813:52;4901:9;4888:23;4930:18;4971:2;4963:6;4960:14;4957:34;;;4987:1;4984;4977:12;4957:34;5025:6;5014:9;5010:22;5000:32;;5070:7;5063:4;5059:2;5055:13;5051:27;5041:55;;5092:1;5089;5082:12;5041:55;5132:2;5119:16;5158:2;5150:6;5147:14;5144:34;;;5174:1;5171;5164:12;5144:34;5229:7;5222:4;5212:6;5209:1;5205:14;5201:2;5197:23;5193:34;5190:47;5187:67;;;5250:1;5247;5240:12;5187:67;5281:4;5273:13;;;;-1:-1:-1;5305:6:1;-1:-1:-1;;5346:20:1;;5333:34;5376:28;5333:34;5376:28;:::i;:::-;5423:5;5413:15;;;4684:750;;;;;:::o;5439:385::-;5525:6;5533;5541;5549;5602:3;5590:9;5581:7;5577:23;5573:33;5570:53;;;5619:1;5616;5609:12;5570:53;-1:-1:-1;;5642:23:1;;;5712:2;5697:18;;5684:32;;-1:-1:-1;5763:2:1;5748:18;;5735:32;;5814:2;5799:18;5786:32;;-1:-1:-1;5439:385:1;-1:-1:-1;5439:385:1:o;5829:388::-;5897:6;5905;5958:2;5946:9;5937:7;5933:23;5929:32;5926:52;;;5974:1;5971;5964:12;5926:52;6013:9;6000:23;6032:31;6057:5;6032:31;:::i;:::-;6082:5;-1:-1:-1;6139:2:1;6124:18;;6111:32;6152:33;6111:32;6152:33;:::i;6222:356::-;6424:2;6406:21;;;6443:18;;;6436:30;6502:34;6497:2;6482:18;;6475:62;6569:2;6554:18;;6222:356::o;7002:380::-;7081:1;7077:12;;;;7124;;;7145:61;;7199:4;7191:6;7187:17;7177:27;;7145:61;7252:2;7244:6;7241:14;7221:18;7218:38;7215:161;;;7298:10;7293:3;7289:20;7286:1;7279:31;7333:4;7330:1;7323:15;7361:4;7358:1;7351:15;7215:161;;7002:380;;;:::o;7387:184::-;7457:6;7510:2;7498:9;7489:7;7485:23;7481:32;7478:52;;;7526:1;7523;7516:12;7478:52;-1:-1:-1;7549:16:1;;7387:184;-1:-1:-1;7387:184:1:o;7576:127::-;7637:10;7632:3;7628:20;7625:1;7618:31;7668:4;7665:1;7658:15;7692:4;7689:1;7682:15;7708:125;7748:4;7776:1;7773;7770:8;7767:34;;;7781:18;;:::i;:::-;-1:-1:-1;7818:9:1;;7708:125::o;7838:245::-;7905:6;7958:2;7946:9;7937:7;7933:23;7929:32;7926:52;;;7974:1;7971;7964:12;7926:52;8006:9;8000:16;8025:28;8047:5;8025:28;:::i;9631:306::-;9719:6;9727;9735;9788:2;9776:9;9767:7;9763:23;9759:32;9756:52;;;9804:1;9801;9794:12;9756:52;9833:9;9827:16;9817:26;;9883:2;9872:9;9868:18;9862:25;9852:35;;9927:2;9916:9;9912:18;9906:25;9896:35;;9631:306;;;;;:::o;11610:251::-;11680:6;11733:2;11721:9;11712:7;11708:23;11704:32;11701:52;;;11749:1;11746;11739:12;11701:52;11781:9;11775:16;11800:31;11825:5;11800:31;:::i;12350:425::-;12552:2;12534:21;;;12591:2;12571:18;;;12564:30;12630:34;12625:2;12610:18;;12603:62;12701:31;12696:2;12681:18;;12674:59;12765:3;12750:19;;12350:425::o;12780:493::-;12982:2;12964:21;;;13021:2;13001:18;;;12994:30;13060:34;13055:2;13040:18;;13033:62;13131:34;13126:2;13111:18;;13104:62;13203:27;13197:3;13182:19;;13175:56;13263:3;13248:19;;12780:493::o;13278:480::-;13480:2;13462:21;;;13519:2;13499:18;;;13492:30;13558:34;13553:2;13538:18;;13531:62;13629:34;13624:2;13609:18;;13602:62;-1:-1:-1;;;13695:3:1;13680:19;;13673:43;13748:3;13733:19;;13278:480::o;14927:681::-;15058:6;15066;15074;15082;15090;15098;15106;15114;15167:3;15155:9;15146:7;15142:23;15138:33;15135:53;;;15184:1;15181;15174:12;15135:53;15216:9;15210:16;15235:31;15260:5;15235:31;:::i;:::-;15285:5;15275:15;;;15330:2;15319:9;15315:18;15309:25;15299:35;;15374:2;15363:9;15359:18;15353:25;15343:35;;15418:2;15407:9;15403:18;15397:25;15387:35;;15462:3;15451:9;15447:19;15441:26;15431:36;;15507:3;15496:9;15492:19;15486:26;15476:36;;15552:3;15541:9;15537:19;15531:26;15521:36;;15597:3;15586:9;15582:19;15576:26;15566:36;;14927:681;;;;;;;;;;;:::o;15613:127::-;15674:10;15669:3;15665:20;15662:1;15655:31;15705:4;15702:1;15695:15;15729:4;15726:1;15719:15;15745:135;15784:3;-1:-1:-1;;15805:17:1;;15802:43;;;15825:18;;:::i;:::-;-1:-1:-1;15872:1:1;15861:13;;15745:135::o;15885:794::-;16107:2;16119:21;;;16092:18;;16175:22;;;16059:4;16254:6;16228:2;16213:18;;16059:4;16288:304;16302:6;16299:1;16296:13;16288:304;;;16377:6;16364:20;16397:31;16422:5;16397:31;:::i;:::-;-1:-1:-1;;;;;16453:31:1;16441:44;;16508:4;16567:15;;;;16532:12;;;;16481:1;16317:9;16288:304;;;16292:3;16609;16601:11;;;;16664:6;16657:14;16650:22;16643:4;16632:9;16628:20;16621:52;15885:794;;;;;;:::o;19785:128::-;19825:3;19856:1;19852:6;19849:1;19846:13;19843:39;;;19862:18;;:::i;:::-;-1:-1:-1;19898:9:1;;19785:128::o;19918:461::-;19971:3;20009:5;20003:12;20036:6;20031:3;20024:19;20062:4;20091:2;20086:3;20082:12;20075:19;;20128:2;20121:5;20117:14;20149:1;20159:195;20173:6;20170:1;20167:13;20159:195;;;20238:13;;-1:-1:-1;;;;;20234:39:1;20222:52;;20294:12;;;;20329:15;;;;20270:1;20188:9;20159:195;;;-1:-1:-1;20370:3:1;;19918:461;-1:-1:-1;;;;;19918:461:1:o;20384:510::-;20655:6;20644:9;20637:25;20698:3;20693:2;20682:9;20678:18;20671:31;20618:4;20719:57;20771:3;20760:9;20756:19;20748:6;20719:57;:::i;:::-;-1:-1:-1;;;;;20812:32:1;;;;20807:2;20792:18;;20785:60;-1:-1:-1;20876:2:1;20861:18;20854:34;20711:65;20384:510;-1:-1:-1;;20384:510:1:o;22891:168::-;22931:7;22997:1;22993;22989:6;22985:14;22982:1;22979:21;22974:1;22967:9;22960:17;22956:45;22953:71;;;23004:18;;:::i;:::-;-1:-1:-1;23044:9:1;;22891:168::o;23064:217::-;23104:1;23130;23120:132;;23174:10;23169:3;23165:20;23162:1;23155:31;23209:4;23206:1;23199:15;23237:4;23234:1;23227:15;23120:132;-1:-1:-1;23266:9:1;;23064:217::o;23688:401::-;23890:2;23872:21;;;23929:2;23909:18;;;23902:30;23968:34;23963:2;23948:18;;23941:62;-1:-1:-1;;;24034:2:1;24019:18;;24012:35;24079:3;24064:19;;23688:401::o;24094:399::-;24296:2;24278:21;;;24335:2;24315:18;;;24308:30;24374:34;24369:2;24354:18;;24347:62;-1:-1:-1;;;24440:2:1;24425:18;;24418:33;24483:3;24468:19;;24094:399::o;28592:582::-;28891:6;28880:9;28873:25;28934:6;28929:2;28918:9;28914:18;28907:34;28977:3;28972:2;28961:9;28957:18;28950:31;28854:4;28998:57;29050:3;29039:9;29035:19;29027:6;28998:57;:::i;:::-;-1:-1:-1;;;;;29091:32:1;;;;29086:2;29071:18;;29064:60;-1:-1:-1;29155:3:1;29140:19;29133:35;28990:65;28592:582;-1:-1:-1;;;28592:582:1:o

Swarm Source

ipfs://11cdd3ce25c02edcc869b4af6ce6b52d3619b01857a2e73d72fb020d7d1e60f1
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.