ETH Price: $3,392.54 (+1.24%)

Token

DiamondHandToken (DT)
 

Overview

Max Total Supply

400,212.316938428906745104 DT

Holders

55

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.595804548074641569 DT

Value
$0.00
0x1C452A4a44C924e2e3B6D0cEdBe8C2c9Bc8B9F57
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:
DiamondHandToken

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-10
*/

//SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;


interface IERC20 {
  function transfer(address to, uint256 value) external returns (bool);
  function approve(address spender, uint256 value) external returns (bool);
  function transferFrom(address from, address to, uint256 value) external returns (bool);
  function totalSupply() external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
  function allowance(address owner, address spender) external view returns (uint256);
  function decimals() external view returns (uint8);
  function burn(uint256 amount) external;
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


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


interface IPancakeRouter01 {
    function factory () external pure returns (address);
    function factoryV1 () external pure returns (address);
    function factoryV2 () external pure returns (address);
    function WETH () external pure returns (address);
    function WPLS () external pure returns (address);
    function WAVAX () external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

pragma solidity >=0.6.2;

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

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

pragma solidity >=0.6.2;

interface IFactory {
function getPair (address token1, address token2) external pure returns (address);
}



contract DiamondHandToken {

    using SafeMath for uint256;

    address payable public _dev = payable (0x60859bAF5f538c5F82219e286E73Df1DE43ceEde); // receives ETH of buy and vest function
 
    uint8 public contractBuyFee = 30;

    address public contrAddr;

    address public constant _routerAddr = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //  Uniswap V2 on test and mainnet equal on ETHEREUM
    IRouter public constant _router = IRouter(_routerAddr);

    IFactory public _factory = IFactory(_router.factory());
    address public tradingPair = address(0);

    uint256 public overallVestedToken;
    uint256 public overallCollectedDividends;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Vest (address indexed user, uint256 stakeAmount, uint256 vestTime);
    event EnterVesting (address indexed user, uint256 rawAmount, uint256 vestedTokenAmt, uint256 entryTime);
    event ClaimRewards (address indexed user, uint256 rewardAmount, uint256 claimTime);
    event ReinvestRewards (address indexed user, uint256 rewardAmount, uint256 reinvestTime);

    modifier onlyDev() {
        require(_dev == msg.sender, "Ownable: caller is not the dev");
        _;
    }

    string public constant name = "DiamondHandToken";
    string public constant symbol = "DT";
    uint256 public constant decimals = 18;

    uint256 public constant _monthlyDevmint = 2000 * 1e18; // 2 k token

    uint256 public _totalSupply;

    bool public noVestandBuyVest = false;

    mapping(address => uint256) private _Balances;

    /* Time of contract launch */
    uint256 public constant launchTime = 1702128000; // Sets Starttime of the contract, Days and Month // TODO
    uint256 public constant oneDay =  1 days;  // 60; // TODO
    uint256 public constant oneMonth =  30 days; //699; // TODO

    uint256 public currentDay;
    uint256 public currentMonth;

    uint256 public lastBuyVestDay;
    uint8 public buyBackPerecent = 40; // 40 equals 4%
    uint8 public percentToReceive = 20; // percentage of tokens to be received when doing a regular buy from DEX
    
    uint256 public constant rewardDays = 365; // rewarded days when user does vesting

    uint256 private constant weiPerSfor1perDay = 11574074074074;  // this token/wei amount need to be accounted per second to have 1 ETH per day
    
    struct userVestData{
      uint256 vestTime;
      uint256 userVestDay;
      uint256 userVestAmt;
      uint256 amount;
      uint256 claimed;
      uint256 lastUpdate;
      uint256 collected;
    }   

    // mapping for all user vesting data
    mapping(address => mapping(uint256 => userVestData)) public vests;

    // counter for users vesting 
    mapping(address => uint256) public vestID;

    // day's total ETH vesting amount 
    mapping(uint256 => uint256) public vestingEntry;

    // total ETH amount for vesting   
    uint256 public vestingEntry_allDays;

    // counting unique (unique for every day only) Auction enteries for each day
    mapping(uint256 => uint256) public usersCountDaily;

    // counting unique (unique for every day only) users
    uint256 public usersCount = 0;

    // mapping for allowance
    mapping (address => mapping (address => uint256)) private _allowance;

    // Auction memebrs overall data 
    struct userVesting_GlobalData{
        uint256 overall_collectedTokens;
        uint256 totalVestingAmount;
        uint256 overall_stakedTokens;
    }

    // new map for every user's overall data  
    mapping(address => userVesting_GlobalData) public mapUserVest_globalData;
    

    // Addresses that excluded from transferTax when receiving
    mapping(address => bool) private _excludedFromTaxReceiver;
    

    constructor() {
        contrAddr = address(this);

        _excludedFromTaxReceiver[msg.sender] = true;
        _excludedFromTaxReceiver[contrAddr] = true;
        _excludedFromTaxReceiver[_routerAddr] = true;
        _excludedFromTaxReceiver[_dev] = true;

        _mint(_dev, 400000 * 1e18); // initial supply mint to DEV
    }
    

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }


    function balanceOf(address account) external view returns (uint256) {
        return _Balances[account];
    }


    function allowance(address owner_, address spender) external view returns (uint256) {
        return _allowance[owner_][spender];
    }


    function approve(address spender, uint256 value) public returns (bool) {
        _allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _allowance[msg.sender][spender] =
        _allowance[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }


    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 oldValue = _allowance[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowance[msg.sender][spender] = 0;
        } else {
            _allowance[msg.sender][spender] = oldValue.sub(subtractedValue);
        }
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }


    // Set addresses of dev ad dev1
    function setDevs(address payable dev) external onlyDev {
        _dev = dev;
     }


    // Set the fee that goes to dev with each auction entry
    function setDevBuyFee(uint8 _devBuyFee) external onlyDev {
      require(_devBuyFee <= 30, "setDevBuyFee: Dev Auction Fee cant be above 30%" );
        contractBuyFee = _devBuyFee;
     }


    // Set the bool to prefent users from using the vest and buyAndVest function.
    function setNoVestandBuyVest(bool _noVestandBuyVest) external onlyDev {      
        noVestandBuyVest = _noVestandBuyVest;
     }



    function devMint() external onlyDev {
        uint256 thisMonth = (block.timestamp - launchTime) / oneMonth;

        require (thisMonth > currentMonth, "devMint: you already minted this month!");

        _mint(_dev, _monthlyDevmint);

        currentMonth = thisMonth;
    }


    // Set the percentage to be received when buying from DEX
     function setPercentToReceive(uint8 _percentToReceive) external onlyDev {
        require (20 <= _percentToReceive, "Value to small, use at least 20!");
        require (_percentToReceive <= 100, "Value to big, use at max 100!");
        percentToReceive = _percentToReceive;
     }
     

    // Set address to be in- or excluded from Tax when receiving
    function setExcludedFromTaxReceiver(address _account, bool _excluded) external onlyDev {
        _excludedFromTaxReceiver[_account] = _excluded;
     }


    // Returns if the address is excluded from Tax or not when receiving.    
    function isExcludedFromTaxReceiver(address _account) public view returns (bool) {
        return _excludedFromTaxReceiver[_account];
    }


   function transferToZero(uint256 amount) internal returns (bool) {
        _Balances[contrAddr] = _Balances[contrAddr].sub(amount, "Token: transfer amount exceeds balance");
        _Balances[address(0)] = _Balances[address(0)].add(amount);
        emit Transfer(contrAddr, address(0), amount);
        return true;
    }


    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }  


    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        if( msg.sender != contrAddr ) {
          _allowance[from][msg.sender] = _allowance[from][msg.sender].sub(amount);
        }
        _transfer(from, to, amount);
        return true;
    }


    // internal transfer function to apply the transfer tax ONLY for buys from DEX liquidity
    function _transfer(address from, address to, uint256 amount) internal virtual {

        // For Taxed Transfer (if pair is sender (token BUY) tax of "percentToReceive"-% applies)
        bool _isTaxedRecipient = !isExcludedFromTaxReceiver(to);

            if ( from == tradingPair && _isTaxedRecipient ) {   // if sender is pair (its a buy tx) AND if it is a TaxedRecipient  
            _Balances[from] = _Balances[from].sub(amount, "transfer amount exceeds balance");
            uint256 taxedAmount = amount.mul(percentToReceive).div(100);
            _Balances[to] = _Balances[to].add(taxedAmount);
            _Balances[address(0)] = _Balances[address(0)].add(amount.sub(taxedAmount));
            emit Transfer(from, to, taxedAmount);
            emit Transfer(from, address(0), amount.sub(taxedAmount));
            } 
              else {
            _Balances[from] = _Balances[from].sub(amount, "transfer amount exceeds balance");
            _Balances[to] = _Balances[to].add(amount);
            emit Transfer(from, to, amount);
            }
    }


    function _mint(address _user, uint256 _amount) internal { 
      _Balances[_user] = _Balances[_user].add(_amount);
      _totalSupply = _totalSupply.add(_amount);
      emit Transfer(address(0), _user, _amount);
    }



    // internal function to stake user Token
    function vestIntern (uint256 _amount) internal {
      vests[msg.sender][vestID[msg.sender]].amount = _amount;
      vests[msg.sender][vestID[msg.sender]].vestTime = block.timestamp;
      vests[msg.sender][vestID[msg.sender]].lastUpdate = block.timestamp;

      vestID[msg.sender]++;
      overallVestedToken += _amount;

      emit Vest(msg.sender, _amount, block.timestamp);
    }
 


    // function to see which day it is
    function thisDay() public view returns (uint256) {
        return 1 + ((block.timestamp - launchTime) / oneDay);
    }


    // function to see how many seconds until next day
    function sToNextDay() public view returns (uint256) {
        uint256 sSinceLaunch = (block.timestamp - launchTime);
        uint256 sOfFullPassedDays = thisDay().sub(1).mul(oneDay);

        return sSinceLaunch - sOfFullPassedDays;
    }


    // function to update the current day and to initiate the burn and buyback
    function dailyUpdate() public { 


        // set the pair address if not done
        if (tradingPair == address(0)) {
            tradingPair = _factory.getPair(_router.WETH(), contrAddr);
          }

        // this is true once per day
        if (currentDay != thisDay()) {
          currentDay = thisDay();
      }
    }



    // function for users to buy and vest tokens tax free
    function buyAndVest (uint256 minTokenToReceive) external payable returns (bool) {
        require(!noVestandBuyVest, "Buy and Vest is currently disabled!");

        uint256 rawAmount = msg.value;
        require(rawAmount > 0, "No ETH to buy Token!");

        uint256 ETHtaxAmt = rawAmount.mul(contractBuyFee).div(100);

        // transfer eth buy tax to dev
        _dev.transfer(ETHtaxAmt);

        uint256 tokenBalbefore = IERC20(contrAddr).balanceOf(address(0));

        // swap ETH to Token
        address[] memory path = new address[](2);
          path[0] = _router.WETH();
          path[1] = contrAddr;

          // Buyback token from LP from received ETH
           _router.swapExactETHForTokens { value: rawAmount.sub(ETHtaxAmt) } (
          minTokenToReceive,
          path,
          address(0), // sends Token to manager to be vested
          block.timestamp +100
        ); 

        uint256 amountUserTokens = (IERC20(contrAddr).balanceOf(address(0))).sub(tokenBalbefore);

        // stroing users vesting data
        vestIntern(amountUserTokens);

        // stroing global vesting data
        mapUserVest_globalData[msg.sender].overall_stakedTokens += amountUserTokens;
        mapUserVest_globalData[msg.sender].totalVestingAmount += rawAmount;

        // update the day
        dailyUpdate();

        // storing spent ETH amounts
        vestingEntry[currentDay] += rawAmount;
        vestingEntry_allDays += rawAmount;    

        // counting daiyl uinque users
        if (vests[msg.sender][vestID[msg.sender] - 1].userVestAmt == 0) {
            usersCount++;
            usersCountDaily[currentDay]++;
        }

        vests[msg.sender][vestID[msg.sender] - 1].userVestAmt += rawAmount; 
        vests[msg.sender][vestID[msg.sender] - 1].userVestDay = currentDay;        

        lastBuyVestDay = currentDay;        

        emit EnterVesting (msg.sender, rawAmount, amountUserTokens,  block.timestamp);
        
        return true;        
    }


    // function for users to vest their tokens
    function userVest (uint256 vestAmount) external returns (bool) {

        require(!noVestandBuyVest, "User Vest is currently disabled!");
        require ( vestAmount <= IERC20(contrAddr).balanceOf(msg.sender), "Users token balance is to low!");

        IERC20(contrAddr).transferFrom(msg.sender, address(0), vestAmount);

        // stroing users vesting data
        vestIntern(vestAmount);

        // stroing global vesting data
        mapUserVest_globalData[msg.sender].overall_stakedTokens += vestAmount;

        // update the day
        dailyUpdate();

        // counting daiyl uinque users
        if (vests[msg.sender][vestID[msg.sender] - 1].userVestAmt == 0) {
            usersCount++;
            usersCountDaily[currentDay]++;
        }

        vests[msg.sender][vestID[msg.sender] - 1].userVestDay = currentDay; 
        
        emit EnterVesting (msg.sender, 0 , vestAmount,  block.timestamp);
        
        return true;        
    }


  // only called when claim (collect) is called
    // calculates the earned rewards since LAST UPDATE
    // earning is 1% per day
    function calcReward (address _user, uint256 _stakeIndex) public view returns (uint256) {
      if(vests[_user][_stakeIndex].vestTime == 0){
        return 0;
      }
      // value 11574074074074 gives 1 ether per day as multiplier!
      uint256 multiplier = (block.timestamp - vests[_user][_stakeIndex].lastUpdate).mul(weiPerSfor1perDay);
      // for example: if user amount is 100 and user has staked for 100 days and not collected so far,
      // reward would be 100, if 100 was already collected reward will be 0
      if(vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether).add(vests[_user][_stakeIndex].collected) >   
        vests[_user][_stakeIndex].amount.mul(rewardDays).div(100)) {
        return(vests[_user][_stakeIndex].amount.mul(rewardDays).div(100).sub(vests[_user][_stakeIndex].collected));
      }
      // in same example: below rewardDays days of vestIntern the reward is vests.amount * days/100
      return vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether);
    }


    // (not called internally) Only for viewing the earned rewards in UI
    // caculates claimable rewards
    function calcClaim (address _user, uint256 _stakeIndex) external view returns (uint256) {
      if (vests[_user][_stakeIndex].vestTime == 0){
        return 0;
      }
      // value 11574074074074 gives 1 ether per day as multiplier!
      uint256 multiplier = (block.timestamp - vests[_user][_stakeIndex].lastUpdate).mul(weiPerSfor1perDay);

      if (multiplier.mul(vests[_user][_stakeIndex].amount).div(100 ether).add(vests[_user][_stakeIndex].collected) >
        vests[_user][_stakeIndex].amount.mul(rewardDays).div(100)){
        return(vests[_user][_stakeIndex].amount.mul(rewardDays).div(100).sub(vests[_user][_stakeIndex].claimed));
      }
      return vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether).add(vests[_user][_stakeIndex].collected)
      .sub(vests[_user][_stakeIndex].claimed);
    }


    // function to update the collected rewards to user vestIntern collected value and update the last updated value
    function _collect (address _user, uint256 _stakeIndex) internal {
      vests[_user][_stakeIndex].collected = vests[_user][_stakeIndex].collected.add(calcReward(_user, _stakeIndex));
      vests[_user][_stakeIndex].lastUpdate = block.timestamp;
    }


    // function for users to claim rewards
    function claimRewards (uint256 _stakeIndex) external {

      _collect(msg.sender, _stakeIndex);

      uint256 reward = vests[msg.sender][_stakeIndex].collected.sub(vests[msg.sender][_stakeIndex].claimed);
      vests[msg.sender][_stakeIndex].claimed = vests[msg.sender][_stakeIndex].collected;

      // mint rewards to user
      _mint(msg.sender, reward);

      overallCollectedDividends += reward;

      emit ClaimRewards (msg.sender, reward, block.timestamp);
    }


    function claimAll () external {

        uint256 userVests = vestID[msg.sender];
        uint256 totalClaim;

        // update all vests and calculate totalClaim
        for (uint256 i; i < userVests; i ++) 
        {
            _collect(msg.sender, i);

            totalClaim += vests[msg.sender][i].collected - (vests[msg.sender][i].claimed);
            vests[msg.sender][i].claimed = vests[msg.sender][i].collected;

        }

        // mint all rewards to User
        _mint(msg.sender, totalClaim);

        overallCollectedDividends += totalClaim;

        emit ClaimRewards (msg.sender, totalClaim, block.timestamp);

    }



    // function for users to claim rewards
    function reinvestRewards (uint256 _stakeIndex) external {

      _collect(msg.sender, _stakeIndex);

      uint256 reward = vests[msg.sender][_stakeIndex].collected - (vests[msg.sender][_stakeIndex].claimed);
      vests[msg.sender][_stakeIndex].claimed = vests[msg.sender][_stakeIndex].collected;

      // mint rewards to user
      vestIntern(reward);

      overallCollectedDividends += reward;

      
        // stroing global vesting data
        mapUserVest_globalData[msg.sender].overall_stakedTokens += reward;

        // update the day
        dailyUpdate();

        // counting users
        if (vests[msg.sender][vestID[msg.sender] - 1].userVestAmt == 0) {
            usersCount++;
            usersCountDaily[currentDay]++;
        }

        vests[msg.sender][vestID[msg.sender] - 1].userVestAmt += reward; 
        vests[msg.sender][vestID[msg.sender] - 1].userVestDay = currentDay;    

      emit ReinvestRewards (msg.sender, reward, block.timestamp);
    }




    function reinvestAll () external {

        uint256 userVests = vestID[msg.sender];
        uint256 totalClaim;

        // update all vests and calculate totalClaim
        for (uint256 i; i < userVests; i ++) 
        {
            _collect(msg.sender, i);

            totalClaim += vests[msg.sender][i].collected - (vests[msg.sender][i].claimed);
            vests[msg.sender][i].claimed = vests[msg.sender][i].collected;

        }

        // reinvest all rewards to new userVest
        vestIntern(totalClaim);

        overallCollectedDividends += totalClaim;

        emit ReinvestRewards (msg.sender, totalClaim, block.timestamp);

    }







////// Test functions TODO to be removed!!

    function securityETHWithdrawal () public  onlyDev {

        uint256 ETHbal = address(this).balance;
        (_dev).transfer(ETHbal);
    }
    
    function securityTokenWithdrawal (address tokenAddr) public onlyDev {        

        uint256 tokenBal = IERC20(tokenAddr).balanceOf(address(this));
        IERC20(tokenAddr).transfer(_dev, tokenBal);
    }


}

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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimTime","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rawAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestedTokenAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryTime","type":"uint256"}],"name":"EnterVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reinvestTime","type":"uint256"}],"name":"ReinvestRewards","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestTime","type":"uint256"}],"name":"Vest","type":"event"},{"inputs":[],"name":"_dev","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_factory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_monthlyDevmint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_routerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokenToReceive","type":"uint256"}],"name":"buyAndVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyBackPerecent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"calcClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"calcReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contrAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractBuyFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMonth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExcludedFromTaxReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBuyVestDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mapUserVest_globalData","outputs":[{"internalType":"uint256","name":"overall_collectedTokens","type":"uint256"},{"internalType":"uint256","name":"totalVestingAmount","type":"uint256"},{"internalType":"uint256","name":"overall_stakedTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noVestandBuyVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallCollectedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallVestedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentToReceive","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinvestAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"reinvestRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sToNextDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityETHWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"securityTokenWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_devBuyFee","type":"uint8"}],"name":"setDevBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"dev","type":"address"}],"name":"setDevs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromTaxReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_noVestandBuyVest","type":"bool"}],"name":"setNoVestandBuyVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_percentToReceive","type":"uint8"}],"name":"setPercentToReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thisDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestAmount","type":"uint256"}],"name":"userVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usersCountDaily","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingEntry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingEntry_allDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vests","outputs":[{"internalType":"uint256","name":"vestTime","type":"uint256"},{"internalType":"uint256","name":"userVestDay","type":"uint256"},{"internalType":"uint256","name":"userVestAmt","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"internalType":"uint256","name":"collected","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060408190525f80546001600160a81b031916741e60859baf5f538c5f82219e286e73df1de43ceede17905563c45a015560e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063c45a015590608490602090600481865afa1580156200006e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200009491906200028b565b600280546001600160a01b03929092166001600160a01b03199283161790556003805490911690556007805460ff19169055600c805461142861ffff199091161790555f601255348015620000e7575f80fd5b50600180546001600160a01b03191630178155335f90815260156020526040808220805460ff19908116851790915583546001600160a01b03908116845282842080548316861790557fae7858b0e6478d70b0bb8f531bf48447d53a94e3d093939dbb30c2ffee23e39180548316861790558354811684529183208054909116909317909255546200018591166954b40b1f852bda0000006200018b565b620002d3565b6001600160a01b0382165f90815260086020526040902054620001af90826200021d565b6001600160a01b0383165f90815260086020526040902055600654620001d690826200021d565b6006556040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f806200022b8385620002b3565b905083811015620002825760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640160405180910390fd5b90505b92915050565b5f602082840312156200029c575f80fd5b81516001600160a01b038116811462000282575f80fd5b808201808211156200028557634e487b7160e01b5f52601160045260245ffd5b612e0480620002e15f395ff3fe60806040526004361061037c575f3560e01c8063790ca413116101d3578063a9059cbb116100fd578063d42f6e391161009d578063dd62ed3e1161006d578063dd62ed3e14610ace578063e6e66cd914610b12578063e79ffa1114610b2b578063edae876f146105ed575f80fd5b8063d42f6e3914610a52578063d4366c5314610a71578063daf1b93d14610a90578063db6fbc6914610aaf575f80fd5b8063c6d98c82116100d8578063c6d98c82146109ea578063c8b18b5b14610a09578063cc42467514610a1f578063d1058e5914610a3e575f80fd5b8063a9059cbb14610998578063bf627bf5146109b7578063c5cc6b6a146109cb575f80fd5b80638a508d781161017357806395d89b411161014357806395d89b411461091d578063a16c1c351461094a578063a3262e5914610966578063a457c2d714610979575f80fd5b80638a508d781461087b5780638c0a8904146108945780638cb79811146108a95780638d6f5385146108c8575f80fd5b80637fa04136116101ae5780637fa041361461078e57806384a86e6d146107b957806385c1a33c14610851578063862a4d4714610866575f80fd5b8063790ca4131461074457806379e10daa1461075b5780637c69e2071461077a575f80fd5b80633d3383a1116102b457806353645caa11610254578063632567f011610224578063632567f01461069457806363f4df77146106c45780636ba13a82146106fb57806370a0823114610710575f80fd5b806353645caa1461062c57806356a5c973146106415780635996d1f1146106605780635c9302c91461067f575f80fd5b80634bd9351b1161028f5780634bd9351b146105ae5780634ef474b6146105c45780634fe1c353146105d9578063504de2b0146105ed575f80fd5b80633d3383a11461055b5780633e0f83431461057a5780633eaaf86b14610599575f80fd5b80632234a8e91161031f57806324a97146116102fa57806324a97146146104e9578063313ce56714610514578063386b338114610528578063395093511461053c575f80fd5b80632234a8e91461049757806323b872dd146104ab57806324293f3d146104ca575f80fd5b80630962ef791161035a5780630962ef79146104395780630d1a0c3b1461045a57806318160ddd1461046e5780632024fdf214610482575f80fd5b806306fdde031461038057806307283166146103d1578063095ea7b31461040a575b5f80fd5b34801561038b575f80fd5b506103bb6040518060400160405280601081526020016f2234b0b6b7b7322430b7322a37b5b2b760811b81525081565b6040516103c891906129af565b60405180910390f35b3480156103dc575f80fd5b506103fc6103eb3660046129fb565b60116020525f908152604090205481565b6040519081526020016103c8565b348015610415575f80fd5b50610429610424366004612a29565b610b49565b60405190151581526020016103c8565b348015610444575f80fd5b506104586104533660046129fb565b610bb5565b005b348015610465575f80fd5b50610458610c72565b348015610479575f80fd5b506006546103fc565b34801561048d575f80fd5b506103fc60105481565b3480156104a2575f80fd5b50610458610d53565b3480156104b6575f80fd5b506104296104c5366004612a53565b610dc1565b3480156104d5575f80fd5b506104586104e43660046129fb565b610e3b565b3480156104f4575f80fd5b506103fc610503366004612a91565b600e6020525f908152604090205481565b34801561051f575f80fd5b506103fc601281565b348015610533575f80fd5b506103fc61102a565b348015610547575f80fd5b50610429610556366004612a29565b611070565b348015610566575f80fd5b50610458610575366004612ab9565b6110f3565b348015610585575f80fd5b506103fc610594366004612a29565b61112f565b3480156105a4575f80fd5b506103fc60065481565b3480156105b9575f80fd5b506103fc6201518081565b3480156105cf575f80fd5b506103fc600b5481565b3480156105e4575f80fd5b506104586112dd565b3480156105f8575f80fd5b50610614737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103c8565b348015610637575f80fd5b506103fc61016d81565b34801561064c575f80fd5b506103fc61065b366004612a29565b611433565b34801561066b575f80fd5b5061045861067a366004612a91565b6115b0565b34801561068a575f80fd5b506103fc60095481565b34801561069f575f80fd5b50600c546106b290610100900460ff1681565b60405160ff90911681526020016103c8565b3480156106cf575f80fd5b506104296106de366004612a91565b6001600160a01b03165f9081526015602052604090205460ff1690565b348015610706575f80fd5b506103fc60125481565b34801561071b575f80fd5b506103fc61072a366004612a91565b6001600160a01b03165f9081526008602052604090205490565b34801561074f575f80fd5b506103fc636574698081565b348015610766575f80fd5b50600154610614906001600160a01b031681565b348015610785575f80fd5b506104586116bb565b348015610799575f80fd5b506103fc6107a83660046129fb565b600f6020525f908152604090205481565b3480156107c4575f80fd5b5061081c6107d3366004612a29565b600d602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154908060030154908060040154908060050154908060060154905087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016103c8565b34801561085c575f80fd5b506103fc60045481565b348015610871575f80fd5b506103fc600a5481565b348015610886575f80fd5b50600c546106b29060ff1681565b34801561089f575f80fd5b506103fc60055481565b3480156108b4575f80fd5b506104296108c33660046129fb565b611787565b3480156108d3575f80fd5b506109026108e2366004612a91565b60146020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103c8565b348015610928575f80fd5b506103bb60405180604001604052806002815260200161111560f21b81525081565b348015610955575f80fd5b506103fc686c6b935b8bbd40000081565b6104296109743660046129fb565b611a48565b348015610984575f80fd5b50610429610993366004612a29565b611f9d565b3480156109a3575f80fd5b506104296109b2366004612a29565b612080565b3480156109c2575f80fd5b506103fc612095565b3480156109d6575f80fd5b50600254610614906001600160a01b031681565b3480156109f5575f80fd5b50610458610a04366004612ad4565b6120c2565b348015610a14575f80fd5b506103fc62278d0081565b348015610a2a575f80fd5b50610458610a39366004612b0b565b612115565b348015610a49575f80fd5b50610458612202565b348015610a5d575f80fd5b50600354610614906001600160a01b031681565b348015610a7c575f80fd5b50610458610a8b366004612b0b565b612297565b348015610a9b575f80fd5b505f546106b290600160a01b900460ff1681565b348015610aba575f80fd5b50610458610ac9366004612a91565b61234b565b348015610ad9575f80fd5b506103fc610ae8366004612b2b565b6001600160a01b039182165f90815260136020908152604080832093909416825291909152205490565b348015610b1d575f80fd5b506007546104299060ff1681565b348015610b36575f80fd5b505f54610614906001600160a01b031681565b335f8181526013602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ba39086815260200190565b60405180910390a35060015b92915050565b610bbf3382612395565b335f908152600d6020908152604080832084845290915281206004810154600690910154610bec91612402565b335f818152600d6020908152604080832087845290915290206006810154600490910155909150610c1d908261244a565b8060055f828254610c2e9190612b6b565b90915550506040805182815242602082015233917f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f91015b60405180910390a25050565b335f908152600e602052604081205490805b82811015610cfc57610c963382612395565b335f908152600d6020908152604080832084845290915290206004810154600690910154610cc49190612b7e565b610cce9083612b6b565b335f908152600d60209081526040808320858452909152902060068101546004909101559150600101610c84565b50610d06816124c5565b8060055f828254610d179190612b6b565b90915550506040805182815242602082015233917fef49f1d9b41ab582062e7628620a0e586f314d7ad9e0c5b3bd33dbcf771dfb489101610c66565b5f546001600160a01b03163314610d855760405162461bcd60e51b8152600401610d7c90612b91565b60405180910390fd5b5f805460405147926001600160a01b039092169183156108fc02918491818181858888f19350505050158015610dbd573d5f803e3d5ffd5b5050565b6001545f906001600160a01b03163314610e26576001600160a01b0384165f908152601360209081526040808320338452909152902054610e029083612402565b6001600160a01b0385165f9081526013602090815260408083203384529091529020555b610e31848484612572565b5060019392505050565b610e453382612395565b335f908152600d6020908152604080832084845290915281206004810154600690910154610e739190612b7e565b335f908152600d60209081526040808320868452909152902060068101546004909101559050610ea2816124c5565b8060055f828254610eb39190612b6b565b9091555050335f9081526014602052604081206002018054839290610ed9908490612b6b565b90915550610ee790506112dd565b335f908152600d60209081526040808320600e909252822054909190610f0f90600190612b7e565b81526020019081526020015f20600201545f03610f5c5760128054905f610f3583612bc8565b90915550506009545f908152601160205260408120805491610f5683612bc8565b91905055505b335f908152600d60209081526040808320600e909252822054839290610f8490600190612b7e565b81526020019081526020015f206002015f828254610fa29190612b6b565b9091555050600954335f908152600d60209081526040808320600e909252822054909190610fd290600190612b7e565b81526020019081526020015f2060010181905550336001600160a01b03167fef49f1d9b41ab582062e7628620a0e586f314d7ad9e0c5b3bd33dbcf771dfb488242604051610c66929190918252602082015260400190565b5f8061103a636574698042612b7e565b90505f61105d620151806110576001611051612095565b90612402565b9061282e565b90506110698183612b7e565b9250505090565b335f9081526013602090815260408083206001600160a01b038616845290915281205461109d90836128ac565b335f8181526013602090815260408083206001600160a01b038916808552908352928190208590555193845290927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610ba3565b5f546001600160a01b0316331461111c5760405162461bcd60e51b8152600401610d7c90612b91565b6007805460ff1916911515919091179055565b6001600160a01b0382165f908152600d60209081526040808320848452909152812054810361115f57505f610baf565b6001600160a01b0383165f908152600d6020908152604080832085845290915281206005015461119b90650a86cc92e3da906110579042612b7e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600301549091506111dd906064906111d79061016d61282e565b9061290a565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600681015460039091015461122f91906112299068056bc75e2d63100000906111d790879061282e565b906128ac565b1115611282576001600160a01b0384165f908152600d602090815260408083208684529091529020600481015460039091015461127a9190611051906064906111d79061016d61282e565b915050610baf565b6001600160a01b0384165f908152600d602090815260408083208684529091529020600481015460068201546003909201546112d592611051916112299068056bc75e2d63100000906111d7908861282e565b949350505050565b6003546001600160a01b03166114155760025f9054906101000a90046001600160a01b03166001600160a01b031663e6a43905737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611360573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113849190612be0565b60015460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156113d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f49190612be0565b600380546001600160a01b0319166001600160a01b03929092169190911790555b61141d612095565b600954146114315761142d612095565b6009555b565b6001600160a01b0382165f908152600d60209081526040808320848452909152812054810361146357505f610baf565b6001600160a01b0383165f908152600d6020908152604080832085845290915281206005015461149f90650a86cc92e3da906110579042612b7e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600301549091506114db906064906111d79061016d61282e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600681015460039091015461152691906112299068056bc75e2d63100000906111d7908761282e565b1115611571576001600160a01b0384165f908152600d602090815260408083208684529091529020600681015460039091015461127a9190611051906064906111d79061016d61282e565b6001600160a01b0384165f908152600d602090815260408083208684529091529020600301546112d59068056bc75e2d63100000906111d7908461282e565b5f546001600160a01b031633146115d95760405162461bcd60e51b8152600401610d7c90612b91565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561161d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116419190612bfb565b5f5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015611692573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b69190612c12565b505050565b5f546001600160a01b031633146116e45760405162461bcd60e51b8152600401610d7c90612b91565b5f62278d006116f7636574698042612b7e565b6117019190612c2d565b9050600a5481116117645760405162461bcd60e51b815260206004820152602760248201527f6465764d696e743a20796f7520616c7265616479206d696e7465642074686973604482015266206d6f6e74682160c81b6064820152608401610d7c565b5f54611782906001600160a01b0316686c6b935b8bbd40000061244a565b600a55565b6007545f9060ff16156117dc5760405162461bcd60e51b815260206004820181905260248201527f5573657220566573742069732063757272656e746c792064697361626c6564216044820152606401610d7c565b6001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118469190612bfb565b8211156118955760405162461bcd60e51b815260206004820152601e60248201527f557365727320746f6b656e2062616c616e636520697320746f206c6f772100006044820152606401610d7c565b6001546040516323b872dd60e01b81523360048201525f6024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156118e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061190d9190612c12565b50611917826124c5565b335f9081526014602052604081206002018054849290611938908490612b6b565b9091555061194690506112dd565b335f908152600d60209081526040808320600e90925282205490919061196e90600190612b7e565b81526020019081526020015f20600201545f036119bb5760128054905f61199483612bc8565b90915550506009545f9081526011602052604081208054916119b583612bc8565b91905055505b600954335f908152600d60209081526040808320600e9092528220549091906119e690600190612b7e565b815260208082019290925260409081015f908120600101939093558051928352908201849052429082015233907f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b79060600160405180910390a2506001919050565b6007545f9060ff1615611aa95760405162461bcd60e51b815260206004820152602360248201527f42757920616e6420566573742069732063757272656e746c792064697361626c60448201526265642160e81b6064820152608401610d7c565b3480611aee5760405162461bcd60e51b81526020600482015260146024820152734e6f2045544820746f2062757920546f6b656e2160601b6044820152606401610d7c565b5f8054611b0d906064906111d7908590600160a01b900460ff1661282e565b5f80546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015611b45573d5f803e3d5ffd5b506001546040516370a0823160e01b81525f60048201819052916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb19190612bfb565b6040805160028082526060820183529293505f929091602083019080368337019050509050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4a9190612be0565b815f81518110611c5c57611c5c612c60565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611c8c57611c8c612c60565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d637ff36ab5611cc88686612402565b88845f611cd6426064612b6b565b6040518663ffffffff1660e01b8152600401611cf59493929190612c74565b5f6040518083038185885af1158015611d10573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052611d389190810190612cde565b506001546040516370a0823160e01b81525f6004820181905291611daa9185916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d86573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110519190612bfb565b9050611db5816124c5565b335f9081526014602052604081206002018054839290611dd6908490612b6b565b9091555050335f9081526014602052604081206001018054879290611dfc908490612b6b565b90915550611e0a90506112dd565b6009545f908152600f602052604081208054879290611e2a908490612b6b565b925050819055508460105f828254611e429190612b6b565b9091555050335f908152600d60209081526040808320600e909252822054909190611e6f90600190612b7e565b81526020019081526020015f20600201545f03611ebc5760128054905f611e9583612bc8565b90915550506009545f908152601160205260408120805491611eb683612bc8565b91905055505b335f908152600d60209081526040808320600e909252822054879290611ee490600190612b7e565b81526020019081526020015f206002015f828254611f029190612b6b565b9091555050600954335f908152600d60209081526040808320600e909252822054909190611f3290600190612b7e565b815260208082019290925260409081015f2060010192909255600954600b5581518781529081018390524281830152905133917f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b7919081900360600190a25060019695505050505050565b335f9081526013602090815260408083206001600160a01b0386168452909152812054808310611fef57335f9081526013602090815260408083206001600160a01b038816845290915281205561201d565b611ff98184612402565b335f9081526013602090815260408083206001600160a01b03891684529091529020555b335f8181526013602090815260408083206001600160a01b038916808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b5f61208c338484612572565b50600192915050565b5f620151806120a8636574698042612b7e565b6120b29190612c2d565b6120bd906001612b6b565b905090565b5f546001600160a01b031633146120eb5760405162461bcd60e51b8152600401610d7c90612b91565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461213e5760405162461bcd60e51b8152600401610d7c90612b91565b8060ff16601411156121925760405162461bcd60e51b815260206004820181905260248201527f56616c756520746f20736d616c6c2c20757365206174206c65617374203230216044820152606401610d7c565b60648160ff1611156121e65760405162461bcd60e51b815260206004820152601d60248201527f56616c756520746f206269672c20757365206174206d617820313030210000006044820152606401610d7c565b600c805460ff9092166101000261ff0019909216919091179055565b335f908152600e602052604081205490805b8281101561228c576122263382612395565b335f908152600d60209081526040808320848452909152902060048101546006909101546122549190612b7e565b61225e9083612b6b565b335f908152600d60209081526040808320858452909152902060068101546004909101559150600101612214565b50610c1d338261244a565b5f546001600160a01b031633146122c05760405162461bcd60e51b8152600401610d7c90612b91565b601e8160ff16111561232c5760405162461bcd60e51b815260206004820152602f60248201527f7365744465764275794665653a204465762041756374696f6e2046656520636160448201526e6e742062652061626f76652033302560881b6064820152608401610d7c565b5f805460ff909216600160a01b0260ff60a01b19909216919091179055565b5f546001600160a01b031633146123745760405162461bcd60e51b8152600401610d7c90612b91565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b6123ce6123a28383611433565b6001600160a01b0384165f908152600d60209081526040808320868452909152902060060154906128ac565b6001600160a01b03929092165f908152600d6020908152604080832093835292905220600681019190915542600590910155565b5f61244383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061294b565b9392505050565b6001600160a01b0382165f9081526008602052604090205461246c90826128ac565b6001600160a01b0383165f9081526008602052604090205560065461249190826128ac565b6006556040518181526001600160a01b038316905f905f80516020612daf8339815191529060200160405180910390a35050565b335f818152600d60209081526040808320600e80845282852080548652918452828520600301879055815485528285204290819055825486529285206005019290925593835290528154919061251a83612bc8565b91905055508060045f8282546125309190612b6b565b90915550506040805182815242602082015233917fa499197ed501de1424df2a7fb491b20a939468fbb6e47b99627aca4fe6fdb304910160405180910390a250565b6001600160a01b0382165f9081526015602052604081205460ff16600354901591506001600160a01b0385811691161480156125ab5750805b1561275757604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387165f9081526008909152919091205461260a91849061294b565b6001600160a01b0385165f90815260086020526040812091909155600c54612642906064906111d7908690610100900460ff1661282e565b6001600160a01b0385165f9081526008602052604090205490915061266790826128ac565b6001600160a01b0385165f908152600860205260409020556126bc61268c8483612402565b5f805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c754906128ac565b5f805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7556040516001600160a01b0385811691908716905f80516020612daf833981519152906127159085815260200190565b60405180910390a35f6001600160a01b0386165f80516020612daf8339815191526127408685612402565b60405190815260200160405180910390a350612828565b604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387165f908152600890915291909120546127b191849061294b565b6001600160a01b038086165f9081526008602052604080822093909355908516815220546127df90836128ac565b6001600160a01b038085165f8181526008602052604090819020939093559151908616905f80516020612daf8339815191529061281f9086815260200190565b60405180910390a35b50505050565b5f825f0361283d57505f610baf565b5f6128488385612d97565b9050826128558583612c2d565b146124435760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d7c565b5f806128b88385612b6b565b9050838110156124435760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d7c565b5f61244383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612983565b5f818484111561296e5760405162461bcd60e51b8152600401610d7c91906129af565b505f61297a8486612b7e565b95945050505050565b5f81836129a35760405162461bcd60e51b8152600401610d7c91906129af565b505f61297a8486612c2d565b5f602080835283518060208501525f5b818110156129db578581018301518582016040015282016129bf565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612a0b575f80fd5b5035919050565b6001600160a01b0381168114612a26575f80fd5b50565b5f8060408385031215612a3a575f80fd5b8235612a4581612a12565b946020939093013593505050565b5f805f60608486031215612a65575f80fd5b8335612a7081612a12565b92506020840135612a8081612a12565b929592945050506040919091013590565b5f60208284031215612aa1575f80fd5b813561244381612a12565b8015158114612a26575f80fd5b5f60208284031215612ac9575f80fd5b813561244381612aac565b5f8060408385031215612ae5575f80fd5b8235612af081612a12565b91506020830135612b0081612aac565b809150509250929050565b5f60208284031215612b1b575f80fd5b813560ff81168114612443575f80fd5b5f8060408385031215612b3c575f80fd5b8235612b4781612a12565b91506020830135612b0081612a12565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610baf57610baf612b57565b81810381811115610baf57610baf612b57565b6020808252601e908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206465760000604082015260600190565b5f60018201612bd957612bd9612b57565b5060010190565b5f60208284031215612bf0575f80fd5b815161244381612a12565b5f60208284031215612c0b575f80fd5b5051919050565b5f60208284031215612c22575f80fd5b815161244381612aac565b5f82612c4757634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6080820186835260206080602085015281875180845260a0860191506020890193505f5b81811015612cbe5784516001600160a01b031683529383019391830191600101612c99565b50506001600160a01b039690961660408501525050506060015292915050565b5f6020808385031215612cef575f80fd5b825167ffffffffffffffff80821115612d06575f80fd5b818501915085601f830112612d19575f80fd5b815181811115612d2b57612d2b612c4c565b8060051b604051601f19603f83011681018181108582111715612d5057612d50612c4c565b604052918252848201925083810185019188831115612d6d575f80fd5b938501935b82851015612d8b57845184529385019392850192612d72565b98975050505050505050565b8082028115828204841417610baf57610baf612b5756feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ca7c205ffc2fc974a160b586229b327da19eceb1f8458222f1a8752dd37b2b5664736f6c63430008170033

Deployed Bytecode

0x60806040526004361061037c575f3560e01c8063790ca413116101d3578063a9059cbb116100fd578063d42f6e391161009d578063dd62ed3e1161006d578063dd62ed3e14610ace578063e6e66cd914610b12578063e79ffa1114610b2b578063edae876f146105ed575f80fd5b8063d42f6e3914610a52578063d4366c5314610a71578063daf1b93d14610a90578063db6fbc6914610aaf575f80fd5b8063c6d98c82116100d8578063c6d98c82146109ea578063c8b18b5b14610a09578063cc42467514610a1f578063d1058e5914610a3e575f80fd5b8063a9059cbb14610998578063bf627bf5146109b7578063c5cc6b6a146109cb575f80fd5b80638a508d781161017357806395d89b411161014357806395d89b411461091d578063a16c1c351461094a578063a3262e5914610966578063a457c2d714610979575f80fd5b80638a508d781461087b5780638c0a8904146108945780638cb79811146108a95780638d6f5385146108c8575f80fd5b80637fa04136116101ae5780637fa041361461078e57806384a86e6d146107b957806385c1a33c14610851578063862a4d4714610866575f80fd5b8063790ca4131461074457806379e10daa1461075b5780637c69e2071461077a575f80fd5b80633d3383a1116102b457806353645caa11610254578063632567f011610224578063632567f01461069457806363f4df77146106c45780636ba13a82146106fb57806370a0823114610710575f80fd5b806353645caa1461062c57806356a5c973146106415780635996d1f1146106605780635c9302c91461067f575f80fd5b80634bd9351b1161028f5780634bd9351b146105ae5780634ef474b6146105c45780634fe1c353146105d9578063504de2b0146105ed575f80fd5b80633d3383a11461055b5780633e0f83431461057a5780633eaaf86b14610599575f80fd5b80632234a8e91161031f57806324a97146116102fa57806324a97146146104e9578063313ce56714610514578063386b338114610528578063395093511461053c575f80fd5b80632234a8e91461049757806323b872dd146104ab57806324293f3d146104ca575f80fd5b80630962ef791161035a5780630962ef79146104395780630d1a0c3b1461045a57806318160ddd1461046e5780632024fdf214610482575f80fd5b806306fdde031461038057806307283166146103d1578063095ea7b31461040a575b5f80fd5b34801561038b575f80fd5b506103bb6040518060400160405280601081526020016f2234b0b6b7b7322430b7322a37b5b2b760811b81525081565b6040516103c891906129af565b60405180910390f35b3480156103dc575f80fd5b506103fc6103eb3660046129fb565b60116020525f908152604090205481565b6040519081526020016103c8565b348015610415575f80fd5b50610429610424366004612a29565b610b49565b60405190151581526020016103c8565b348015610444575f80fd5b506104586104533660046129fb565b610bb5565b005b348015610465575f80fd5b50610458610c72565b348015610479575f80fd5b506006546103fc565b34801561048d575f80fd5b506103fc60105481565b3480156104a2575f80fd5b50610458610d53565b3480156104b6575f80fd5b506104296104c5366004612a53565b610dc1565b3480156104d5575f80fd5b506104586104e43660046129fb565b610e3b565b3480156104f4575f80fd5b506103fc610503366004612a91565b600e6020525f908152604090205481565b34801561051f575f80fd5b506103fc601281565b348015610533575f80fd5b506103fc61102a565b348015610547575f80fd5b50610429610556366004612a29565b611070565b348015610566575f80fd5b50610458610575366004612ab9565b6110f3565b348015610585575f80fd5b506103fc610594366004612a29565b61112f565b3480156105a4575f80fd5b506103fc60065481565b3480156105b9575f80fd5b506103fc6201518081565b3480156105cf575f80fd5b506103fc600b5481565b3480156105e4575f80fd5b506104586112dd565b3480156105f8575f80fd5b50610614737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103c8565b348015610637575f80fd5b506103fc61016d81565b34801561064c575f80fd5b506103fc61065b366004612a29565b611433565b34801561066b575f80fd5b5061045861067a366004612a91565b6115b0565b34801561068a575f80fd5b506103fc60095481565b34801561069f575f80fd5b50600c546106b290610100900460ff1681565b60405160ff90911681526020016103c8565b3480156106cf575f80fd5b506104296106de366004612a91565b6001600160a01b03165f9081526015602052604090205460ff1690565b348015610706575f80fd5b506103fc60125481565b34801561071b575f80fd5b506103fc61072a366004612a91565b6001600160a01b03165f9081526008602052604090205490565b34801561074f575f80fd5b506103fc636574698081565b348015610766575f80fd5b50600154610614906001600160a01b031681565b348015610785575f80fd5b506104586116bb565b348015610799575f80fd5b506103fc6107a83660046129fb565b600f6020525f908152604090205481565b3480156107c4575f80fd5b5061081c6107d3366004612a29565b600d602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154908060020154908060030154908060040154908060050154908060060154905087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016103c8565b34801561085c575f80fd5b506103fc60045481565b348015610871575f80fd5b506103fc600a5481565b348015610886575f80fd5b50600c546106b29060ff1681565b34801561089f575f80fd5b506103fc60055481565b3480156108b4575f80fd5b506104296108c33660046129fb565b611787565b3480156108d3575f80fd5b506109026108e2366004612a91565b60146020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103c8565b348015610928575f80fd5b506103bb60405180604001604052806002815260200161111560f21b81525081565b348015610955575f80fd5b506103fc686c6b935b8bbd40000081565b6104296109743660046129fb565b611a48565b348015610984575f80fd5b50610429610993366004612a29565b611f9d565b3480156109a3575f80fd5b506104296109b2366004612a29565b612080565b3480156109c2575f80fd5b506103fc612095565b3480156109d6575f80fd5b50600254610614906001600160a01b031681565b3480156109f5575f80fd5b50610458610a04366004612ad4565b6120c2565b348015610a14575f80fd5b506103fc62278d0081565b348015610a2a575f80fd5b50610458610a39366004612b0b565b612115565b348015610a49575f80fd5b50610458612202565b348015610a5d575f80fd5b50600354610614906001600160a01b031681565b348015610a7c575f80fd5b50610458610a8b366004612b0b565b612297565b348015610a9b575f80fd5b505f546106b290600160a01b900460ff1681565b348015610aba575f80fd5b50610458610ac9366004612a91565b61234b565b348015610ad9575f80fd5b506103fc610ae8366004612b2b565b6001600160a01b039182165f90815260136020908152604080832093909416825291909152205490565b348015610b1d575f80fd5b506007546104299060ff1681565b348015610b36575f80fd5b505f54610614906001600160a01b031681565b335f8181526013602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ba39086815260200190565b60405180910390a35060015b92915050565b610bbf3382612395565b335f908152600d6020908152604080832084845290915281206004810154600690910154610bec91612402565b335f818152600d6020908152604080832087845290915290206006810154600490910155909150610c1d908261244a565b8060055f828254610c2e9190612b6b565b90915550506040805182815242602082015233917f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f91015b60405180910390a25050565b335f908152600e602052604081205490805b82811015610cfc57610c963382612395565b335f908152600d6020908152604080832084845290915290206004810154600690910154610cc49190612b7e565b610cce9083612b6b565b335f908152600d60209081526040808320858452909152902060068101546004909101559150600101610c84565b50610d06816124c5565b8060055f828254610d179190612b6b565b90915550506040805182815242602082015233917fef49f1d9b41ab582062e7628620a0e586f314d7ad9e0c5b3bd33dbcf771dfb489101610c66565b5f546001600160a01b03163314610d855760405162461bcd60e51b8152600401610d7c90612b91565b60405180910390fd5b5f805460405147926001600160a01b039092169183156108fc02918491818181858888f19350505050158015610dbd573d5f803e3d5ffd5b5050565b6001545f906001600160a01b03163314610e26576001600160a01b0384165f908152601360209081526040808320338452909152902054610e029083612402565b6001600160a01b0385165f9081526013602090815260408083203384529091529020555b610e31848484612572565b5060019392505050565b610e453382612395565b335f908152600d6020908152604080832084845290915281206004810154600690910154610e739190612b7e565b335f908152600d60209081526040808320868452909152902060068101546004909101559050610ea2816124c5565b8060055f828254610eb39190612b6b565b9091555050335f9081526014602052604081206002018054839290610ed9908490612b6b565b90915550610ee790506112dd565b335f908152600d60209081526040808320600e909252822054909190610f0f90600190612b7e565b81526020019081526020015f20600201545f03610f5c5760128054905f610f3583612bc8565b90915550506009545f908152601160205260408120805491610f5683612bc8565b91905055505b335f908152600d60209081526040808320600e909252822054839290610f8490600190612b7e565b81526020019081526020015f206002015f828254610fa29190612b6b565b9091555050600954335f908152600d60209081526040808320600e909252822054909190610fd290600190612b7e565b81526020019081526020015f2060010181905550336001600160a01b03167fef49f1d9b41ab582062e7628620a0e586f314d7ad9e0c5b3bd33dbcf771dfb488242604051610c66929190918252602082015260400190565b5f8061103a636574698042612b7e565b90505f61105d620151806110576001611051612095565b90612402565b9061282e565b90506110698183612b7e565b9250505090565b335f9081526013602090815260408083206001600160a01b038616845290915281205461109d90836128ac565b335f8181526013602090815260408083206001600160a01b038916808552908352928190208590555193845290927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610ba3565b5f546001600160a01b0316331461111c5760405162461bcd60e51b8152600401610d7c90612b91565b6007805460ff1916911515919091179055565b6001600160a01b0382165f908152600d60209081526040808320848452909152812054810361115f57505f610baf565b6001600160a01b0383165f908152600d6020908152604080832085845290915281206005015461119b90650a86cc92e3da906110579042612b7e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600301549091506111dd906064906111d79061016d61282e565b9061290a565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600681015460039091015461122f91906112299068056bc75e2d63100000906111d790879061282e565b906128ac565b1115611282576001600160a01b0384165f908152600d602090815260408083208684529091529020600481015460039091015461127a9190611051906064906111d79061016d61282e565b915050610baf565b6001600160a01b0384165f908152600d602090815260408083208684529091529020600481015460068201546003909201546112d592611051916112299068056bc75e2d63100000906111d7908861282e565b949350505050565b6003546001600160a01b03166114155760025f9054906101000a90046001600160a01b03166001600160a01b031663e6a43905737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611360573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113849190612be0565b60015460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156113d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f49190612be0565b600380546001600160a01b0319166001600160a01b03929092169190911790555b61141d612095565b600954146114315761142d612095565b6009555b565b6001600160a01b0382165f908152600d60209081526040808320848452909152812054810361146357505f610baf565b6001600160a01b0383165f908152600d6020908152604080832085845290915281206005015461149f90650a86cc92e3da906110579042612b7e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600301549091506114db906064906111d79061016d61282e565b6001600160a01b0385165f908152600d602090815260408083208784529091529020600681015460039091015461152691906112299068056bc75e2d63100000906111d7908761282e565b1115611571576001600160a01b0384165f908152600d602090815260408083208684529091529020600681015460039091015461127a9190611051906064906111d79061016d61282e565b6001600160a01b0384165f908152600d602090815260408083208684529091529020600301546112d59068056bc75e2d63100000906111d7908461282e565b5f546001600160a01b031633146115d95760405162461bcd60e51b8152600401610d7c90612b91565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561161d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116419190612bfb565b5f5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303815f875af1158015611692573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b69190612c12565b505050565b5f546001600160a01b031633146116e45760405162461bcd60e51b8152600401610d7c90612b91565b5f62278d006116f7636574698042612b7e565b6117019190612c2d565b9050600a5481116117645760405162461bcd60e51b815260206004820152602760248201527f6465764d696e743a20796f7520616c7265616479206d696e7465642074686973604482015266206d6f6e74682160c81b6064820152608401610d7c565b5f54611782906001600160a01b0316686c6b935b8bbd40000061244a565b600a55565b6007545f9060ff16156117dc5760405162461bcd60e51b815260206004820181905260248201527f5573657220566573742069732063757272656e746c792064697361626c6564216044820152606401610d7c565b6001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118469190612bfb565b8211156118955760405162461bcd60e51b815260206004820152601e60248201527f557365727320746f6b656e2062616c616e636520697320746f206c6f772100006044820152606401610d7c565b6001546040516323b872dd60e01b81523360048201525f6024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156118e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061190d9190612c12565b50611917826124c5565b335f9081526014602052604081206002018054849290611938908490612b6b565b9091555061194690506112dd565b335f908152600d60209081526040808320600e90925282205490919061196e90600190612b7e565b81526020019081526020015f20600201545f036119bb5760128054905f61199483612bc8565b90915550506009545f9081526011602052604081208054916119b583612bc8565b91905055505b600954335f908152600d60209081526040808320600e9092528220549091906119e690600190612b7e565b815260208082019290925260409081015f908120600101939093558051928352908201849052429082015233907f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b79060600160405180910390a2506001919050565b6007545f9060ff1615611aa95760405162461bcd60e51b815260206004820152602360248201527f42757920616e6420566573742069732063757272656e746c792064697361626c60448201526265642160e81b6064820152608401610d7c565b3480611aee5760405162461bcd60e51b81526020600482015260146024820152734e6f2045544820746f2062757920546f6b656e2160601b6044820152606401610d7c565b5f8054611b0d906064906111d7908590600160a01b900460ff1661282e565b5f80546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015611b45573d5f803e3d5ffd5b506001546040516370a0823160e01b81525f60048201819052916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb19190612bfb565b6040805160028082526060820183529293505f929091602083019080368337019050509050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4a9190612be0565b815f81518110611c5c57611c5c612c60565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611c8c57611c8c612c60565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d637ff36ab5611cc88686612402565b88845f611cd6426064612b6b565b6040518663ffffffff1660e01b8152600401611cf59493929190612c74565b5f6040518083038185885af1158015611d10573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052611d389190810190612cde565b506001546040516370a0823160e01b81525f6004820181905291611daa9185916001600160a01b0316906370a0823190602401602060405180830381865afa158015611d86573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110519190612bfb565b9050611db5816124c5565b335f9081526014602052604081206002018054839290611dd6908490612b6b565b9091555050335f9081526014602052604081206001018054879290611dfc908490612b6b565b90915550611e0a90506112dd565b6009545f908152600f602052604081208054879290611e2a908490612b6b565b925050819055508460105f828254611e429190612b6b565b9091555050335f908152600d60209081526040808320600e909252822054909190611e6f90600190612b7e565b81526020019081526020015f20600201545f03611ebc5760128054905f611e9583612bc8565b90915550506009545f908152601160205260408120805491611eb683612bc8565b91905055505b335f908152600d60209081526040808320600e909252822054879290611ee490600190612b7e565b81526020019081526020015f206002015f828254611f029190612b6b565b9091555050600954335f908152600d60209081526040808320600e909252822054909190611f3290600190612b7e565b815260208082019290925260409081015f2060010192909255600954600b5581518781529081018390524281830152905133917f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b7919081900360600190a25060019695505050505050565b335f9081526013602090815260408083206001600160a01b0386168452909152812054808310611fef57335f9081526013602090815260408083206001600160a01b038816845290915281205561201d565b611ff98184612402565b335f9081526013602090815260408083206001600160a01b03891684529091529020555b335f8181526013602090815260408083206001600160a01b038916808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b5f61208c338484612572565b50600192915050565b5f620151806120a8636574698042612b7e565b6120b29190612c2d565b6120bd906001612b6b565b905090565b5f546001600160a01b031633146120eb5760405162461bcd60e51b8152600401610d7c90612b91565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461213e5760405162461bcd60e51b8152600401610d7c90612b91565b8060ff16601411156121925760405162461bcd60e51b815260206004820181905260248201527f56616c756520746f20736d616c6c2c20757365206174206c65617374203230216044820152606401610d7c565b60648160ff1611156121e65760405162461bcd60e51b815260206004820152601d60248201527f56616c756520746f206269672c20757365206174206d617820313030210000006044820152606401610d7c565b600c805460ff9092166101000261ff0019909216919091179055565b335f908152600e602052604081205490805b8281101561228c576122263382612395565b335f908152600d60209081526040808320848452909152902060048101546006909101546122549190612b7e565b61225e9083612b6b565b335f908152600d60209081526040808320858452909152902060068101546004909101559150600101612214565b50610c1d338261244a565b5f546001600160a01b031633146122c05760405162461bcd60e51b8152600401610d7c90612b91565b601e8160ff16111561232c5760405162461bcd60e51b815260206004820152602f60248201527f7365744465764275794665653a204465762041756374696f6e2046656520636160448201526e6e742062652061626f76652033302560881b6064820152608401610d7c565b5f805460ff909216600160a01b0260ff60a01b19909216919091179055565b5f546001600160a01b031633146123745760405162461bcd60e51b8152600401610d7c90612b91565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b6123ce6123a28383611433565b6001600160a01b0384165f908152600d60209081526040808320868452909152902060060154906128ac565b6001600160a01b03929092165f908152600d6020908152604080832093835292905220600681019190915542600590910155565b5f61244383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061294b565b9392505050565b6001600160a01b0382165f9081526008602052604090205461246c90826128ac565b6001600160a01b0383165f9081526008602052604090205560065461249190826128ac565b6006556040518181526001600160a01b038316905f905f80516020612daf8339815191529060200160405180910390a35050565b335f818152600d60209081526040808320600e80845282852080548652918452828520600301879055815485528285204290819055825486529285206005019290925593835290528154919061251a83612bc8565b91905055508060045f8282546125309190612b6b565b90915550506040805182815242602082015233917fa499197ed501de1424df2a7fb491b20a939468fbb6e47b99627aca4fe6fdb304910160405180910390a250565b6001600160a01b0382165f9081526015602052604081205460ff16600354901591506001600160a01b0385811691161480156125ab5750805b1561275757604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387165f9081526008909152919091205461260a91849061294b565b6001600160a01b0385165f90815260086020526040812091909155600c54612642906064906111d7908690610100900460ff1661282e565b6001600160a01b0385165f9081526008602052604090205490915061266790826128ac565b6001600160a01b0385165f908152600860205260409020556126bc61268c8483612402565b5f805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c754906128ac565b5f805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7556040516001600160a01b0385811691908716905f80516020612daf833981519152906127159085815260200190565b60405180910390a35f6001600160a01b0386165f80516020612daf8339815191526127408685612402565b60405190815260200160405180910390a350612828565b604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387165f908152600890915291909120546127b191849061294b565b6001600160a01b038086165f9081526008602052604080822093909355908516815220546127df90836128ac565b6001600160a01b038085165f8181526008602052604090819020939093559151908616905f80516020612daf8339815191529061281f9086815260200190565b60405180910390a35b50505050565b5f825f0361283d57505f610baf565b5f6128488385612d97565b9050826128558583612c2d565b146124435760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d7c565b5f806128b88385612b6b565b9050838110156124435760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d7c565b5f61244383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612983565b5f818484111561296e5760405162461bcd60e51b8152600401610d7c91906129af565b505f61297a8486612b7e565b95945050505050565b5f81836129a35760405162461bcd60e51b8152600401610d7c91906129af565b505f61297a8486612c2d565b5f602080835283518060208501525f5b818110156129db578581018301518582016040015282016129bf565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612a0b575f80fd5b5035919050565b6001600160a01b0381168114612a26575f80fd5b50565b5f8060408385031215612a3a575f80fd5b8235612a4581612a12565b946020939093013593505050565b5f805f60608486031215612a65575f80fd5b8335612a7081612a12565b92506020840135612a8081612a12565b929592945050506040919091013590565b5f60208284031215612aa1575f80fd5b813561244381612a12565b8015158114612a26575f80fd5b5f60208284031215612ac9575f80fd5b813561244381612aac565b5f8060408385031215612ae5575f80fd5b8235612af081612a12565b91506020830135612b0081612aac565b809150509250929050565b5f60208284031215612b1b575f80fd5b813560ff81168114612443575f80fd5b5f8060408385031215612b3c575f80fd5b8235612b4781612a12565b91506020830135612b0081612a12565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610baf57610baf612b57565b81810381811115610baf57610baf612b57565b6020808252601e908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206465760000604082015260600190565b5f60018201612bd957612bd9612b57565b5060010190565b5f60208284031215612bf0575f80fd5b815161244381612a12565b5f60208284031215612c0b575f80fd5b5051919050565b5f60208284031215612c22575f80fd5b815161244381612aac565b5f82612c4757634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6080820186835260206080602085015281875180845260a0860191506020890193505f5b81811015612cbe5784516001600160a01b031683529383019391830191600101612c99565b50506001600160a01b039690961660408501525050506060015292915050565b5f6020808385031215612cef575f80fd5b825167ffffffffffffffff80821115612d06575f80fd5b818501915085601f830112612d19575f80fd5b815181811115612d2b57612d2b612c4c565b8060051b604051601f19603f83011681018181108582111715612d5057612d50612c4c565b604052918252848201925083810185019188831115612d6d575f80fd5b938501935b82851015612d8b57845184529385019392850192612d72565b98975050505050505050565b8082028115828204841417610baf57610baf612b5756feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ca7c205ffc2fc974a160b586229b327da19eceb1f8458222f1a8752dd37b2b5664736f6c63430008170033

Deployed Bytecode Sourcemap

7546:19973:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8880:48;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8880:48:0;;;;;;;;;;;;:::i;:::-;;;;;;;;10714:50;;;;;;;;;;-1:-1:-1;10714:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;898:25:1;;;886:2;871:18;10714:50:0;752:177:1;12173:203:0;;;;;;;;;;-1:-1:-1;12173:203:0;;;;;:::i;:::-;;:::i;:::-;;;1555:14:1;;1548:22;1530:41;;1518:2;1503:18;12173:203:0;1390:187:1;24180:486:0;;;;;;;;;;-1:-1:-1;24180:486:0;;;;;:::i;:::-;;:::i;:::-;;26411:669;;;;;;;;;;;;;:::i;11801:93::-;;;;;;;;;;-1:-1:-1;11874:12:0;;11801:93;;10588:35;;;;;;;;;;;;;;;;27146:143;;;;;;;;;;;;;:::i;15388:290::-;;;;;;;;;;-1:-1:-1;15388:290:0;;;;;:::i;:::-;;:::i;25390:1007::-;;;;;;;;;;-1:-1:-1;25390:1007:0;;;;;:::i;:::-;;:::i;10402:41::-;;;;;;;;;;-1:-1:-1;10402:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;8978:37;;;;;;;;;;;;9013:2;8978:37;;17782:243;;;;;;;;;;;;;:::i;12384:297::-;;;;;;;;;;-1:-1:-1;12384:297:0;;;;;:::i;:::-;;:::i;13640:132::-;;;;;;;;;;-1:-1:-1;13640:132:0;;;;;:::i;:::-;;:::i;22911:834::-;;;;;;;;;;-1:-1:-1;22911:834:0;;;;;:::i;:::-;;:::i;9099:27::-;;;;;;;;;;;;;;;;9381:40;;;;;;;;;;;;9415:6;9381:40;;9579:29;;;;;;;;;;;;;;;;18115:339;;;;;;;;;;;;;:::i;7823:80::-;;;;;;;;;;;;7861:42;7823:80;;;;;-1:-1:-1;;;;;2828:32:1;;;2810:51;;2798:2;2783:18;7823:80:0;2664:203:1;9791:40:0;;;;;;;;;;;;9828:3;9791:40;;21762:1029;;;;;;;;;;-1:-1:-1;21762:1029:0;;;;;:::i;:::-;;:::i;27301:211::-;;;;;;;;;;-1:-1:-1;27301:211:0;;;;;:::i;:::-;;:::i;9511:25::-;;;;;;;;;;;;;;;;9671:34;;;;;;;;;;-1:-1:-1;9671:34:0;;;;;;;;;;;;;;3044:4:1;3032:17;;;3014:36;;3002:2;2987:18;9671:34:0;2872:184:1;14750:140:0;;;;;;;;;;-1:-1:-1;14750:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;14848:34:0;14824:4;14848:34;;;:24;:34;;;;;;;;;14750:140;10831:29;;;;;;;;;;;;;;;;11904:112;;;;;;;;;;-1:-1:-1;11904:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;11990:18:0;11963:7;11990:18;;;:9;:18;;;;;;;11904:112;9269:47;;;;;;;;;;;;9306:10;9269:47;;7790:24;;;;;;;;;;-1:-1:-1;7790:24:0;;;;-1:-1:-1;;;;;7790:24:0;;;13784:284;;;;;;;;;;;;;:::i;10492:47::-;;;;;;;;;;-1:-1:-1;10492:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;10293:65;;;;;;;;;;-1:-1:-1;10293:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3376:25:1;;;3432:2;3417:18;;3410:34;;;;3460:18;;;3453:34;;;;3518:2;3503:18;;3496:34;;;;3561:3;3546:19;;3539:35;3605:3;3590:19;;3583:35;3649:3;3634:19;;3627:35;3363:3;3348:19;10293:65:0;3061:607:1;8135:33:0;;;;;;;;;;;;;;;;9543:27;;;;;;;;;;;;;;;;9615:33;;;;;;;;;;-1:-1:-1;9615:33:0;;;;;;;;8175:40;;;;;;;;;;;;;;;;20630:987;;;;;;;;;;-1:-1:-1;20630:987:0;;;;;:::i;:::-;;:::i;11225:72::-;;;;;;;;;;-1:-1:-1;11225:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3875:25:1;;;3931:2;3916:18;;3909:34;;;;3959:18;;;3952:34;3863:2;3848:18;11225:72:0;3673:319:1;8935:36:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8935:36:0;;;;;9024:53;;;;;;;;;;;;9066:11;9024:53;;18525:2047;;;;;;:::i;:::-;;:::i;12691:463::-;;;;;;;;;;-1:-1:-1;12691:463:0;;;;;:::i;:::-;;:::i;15234:142::-;;;;;;;;;;-1:-1:-1;15234:142:0;;;;;:::i;:::-;;:::i;17596:120::-;;;;;;;;;;;;;:::i;8026:54::-;;;;;;;;;;-1:-1:-1;8026:54:0;;;;-1:-1:-1;;;;;8026:54:0;;;14508:153;;;;;;;;;;-1:-1:-1;14508:153:0;;;;;:::i;:::-;;:::i;9444:43::-;;;;;;;;;;;;9480:7;9444:43;;14142:285;;;;;;;;;;-1:-1:-1;14142:285:0;;;;;:::i;:::-;;:::i;24676:658::-;;;;;;;;;;;;;:::i;8087:39::-;;;;;;;;;;-1:-1:-1;8087:39:0;;;;-1:-1:-1;;;;;8087:39:0;;;13357:190;;;;;;;;;;-1:-1:-1;13357:190:0;;;;;:::i;:::-;;:::i;7749:32::-;;;;;;;;;;-1:-1:-1;7749:32:0;;;;-1:-1:-1;;;7749:32:0;;;;;;13201:85;;;;;;;;;;-1:-1:-1;13201:85:0;;;;;:::i;:::-;;:::i;12026:137::-;;;;;;;;;;-1:-1:-1;12026:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;12128:18:0;;;12101:7;12128:18;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;12026:137;9135:36;;;;;;;;;;-1:-1:-1;9135:36:0;;;;;;;;7616:82;;;;;;;;;;-1:-1:-1;7616:82:0;;;;-1:-1:-1;;;;;7616:82:0;;;12173:203;12266:10;12238:4;12255:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12255:31:0;;;;;;;;;;:39;;;12310:36;12238:4;;12255:31;;12310:36;;;;12289:5;898:25:1;;886:2;871:18;;752:177;12310:36:0;;;;;;;;-1:-1:-1;12364:4:0;12173:203;;;;;:::o;24180:486::-;24244:33;24253:10;24265:11;24244:8;:33::i;:::-;24356:10;24288:14;24350:17;;;:5;:17;;;;;;;;:30;;;;;;;;:38;;;;24305:40;;;;;:84;;:44;:84::i;:::-;24445:10;24439:17;;;;:5;:17;;;;;;;;:30;;;;;;;;:40;;;;24398:38;;;;:81;24288:101;;-1:-1:-1;24521:25:0;;24288:101;24521:5;:25::i;:::-;24586:6;24557:25;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;24608:50:0;;;6418:25:1;;;24642:15:0;6474:2:1;6459:18;;6452:34;24622:10:0;;24608:50;;6391:18:1;24608:50:0;;;;;;;;24233:433;24180:486;:::o;26411:669::-;26484:10;26457:17;26477:18;;;:6;:18;;;;;;;26457:17;26591:269;26611:9;26607:1;:13;26591:269;;;26653:23;26662:10;26674:1;26653:8;:23::i;:::-;26747:10;26741:17;;;;:5;:17;;;;;;;;:20;;;;;;;;:28;;;;26707:30;;;;;:63;;26741:28;26707:63;:::i;:::-;26693:77;;;;:::i;:::-;26822:10;26816:17;;;;:5;:17;;;;;;;;:20;;;;;;;;:30;;;;26785:28;;;;:61;26693:77;-1:-1:-1;26622:4:0;;26591:269;;;;26921:22;26932:10;26921;:22::i;:::-;26985:10;26956:25;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;27013:57:0;;;6418:25:1;;;27054:15:0;6474:2:1;6459:18;;6452:34;27030:10:0;;27013:57;;6391:18:1;27013:57:0;6244:248:1;27146:143:0;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;;;;;;;;;27209:14:::1;27259:4:::0;;27258:23:::1;::::0;27226:21:::1;::::0;-1:-1:-1;;;;;27259:4:0;;::::1;::::0;27258:23;::::1;;;::::0;27226:21;;27258:23;27209:14;27258:23;27226:21;27259:4;27258:23;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27196:93;27146:143::o:0;15388:290::-;15503:9;;15468:4;;-1:-1:-1;;;;;15503:9:0;15489:10;:23;15485:126;;-1:-1:-1;;;;;15559:16:0;;;;;;:10;:16;;;;;;;;15576:10;15559:28;;;;;;;;:40;;15592:6;15559:32;:40::i;:::-;-1:-1:-1;;;;;15528:16:0;;;;;;:10;:16;;;;;;;;15545:10;15528:28;;;;;;;:71;15485:126;15621:27;15631:4;15637:2;15641:6;15621:9;:27::i;:::-;-1:-1:-1;15666:4:0;15388:290;;;;;:::o;25390:1007::-;25457:33;25466:10;25478:11;25457:8;:33::i;:::-;25568:10;25501:14;25562:17;;;:5;:17;;;;;;;;:30;;;;;;;;:38;;;;25518:40;;;;;:83;;25562:38;25518:83;:::i;:::-;25657:10;25651:17;;;;:5;:17;;;;;;;;:30;;;;;;;;:40;;;;25610:38;;;;:81;25501:100;-1:-1:-1;25733:18:0;25501:100;25733:10;:18::i;:::-;25791:6;25762:25;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;25881:10:0;25858:34;;;;:22;:34;;;;;:55;;:65;;25917:6;;25858:34;:65;;25917:6;;25858:65;:::i;:::-;;;;-1:-1:-1;25963:13:0;;-1:-1:-1;25963:11:0;:13::i;:::-;26026:10;26020:17;;;;:5;:17;;;;;;;;26038:6;:18;;;;;;26020:17;;;26038:22;;26059:1;;26038:22;:::i;:::-;26020:41;;;;;;;;;;;:53;;;26077:1;26020:58;26016:147;;26095:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;26138:10:0;;26122:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;26016:147;26181:10;26175:17;;;;:5;:17;;;;;;;;26193:6;:18;;;;;;26232:6;;26175:17;26193:22;;26214:1;;26193:22;:::i;:::-;26175:41;;;;;;;;;;;:53;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;26306:10:0;;26256;26250:17;;;;:5;:17;;;;;;;;26268:6;:18;;;;;;26250:17;;;26268:22;;26289:1;;26268:22;:::i;:::-;26250:41;;;;;;;;;;;:53;;:66;;;;26353:10;-1:-1:-1;;;;;26336:53:0;;26365:6;26373:15;26336:53;;;;;;6418:25:1;;;6474:2;6459:18;;6452:34;6406:2;6391:18;;6244:248;17782:243:0;17825:7;;17869:28;9306:10;17869:15;:28;:::i;:::-;17845:53;;17909:25;17937:28;9415:6;17937:16;17951:1;17937:9;:7;:9::i;:::-;:13;;:16::i;:::-;:20;;:28::i;:::-;17909:56;-1:-1:-1;17985:32:0;17909:56;17985:12;:32;:::i;:::-;17978:39;;;;17782:243;:::o;12384:297::-;12537:10;12466:4;12526:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12526:31:0;;;;;;;;;;:47;;12562:10;12526:35;:47::i;:::-;12494:10;12483:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12483:31:0;;;;;;;;;;;;:90;;;12589:62;898:25:1;;;12483:31:0;;12589:62;;871:18:1;12589:62:0;752:177:1;13640:132:0;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;13727:16:::1;:36:::0;;-1:-1:-1;;13727:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13640:132::o;22911:834::-;-1:-1:-1;;;;;23012:12:0;;22990:7;23012:12;;;:5;:12;;;;;;;;:25;;;;;;;;:34;:39;;23008:73;;-1:-1:-1;23070:1:0;23063:8;;23008:73;-1:-1:-1;;;;;23197:12:0;;23157:18;23197:12;;;:5;:12;;;;;;;;:25;;;;;;;;:36;;;23178:79;;9925:14;;23179:54;;:15;:54;:::i;23178:79::-;-1:-1:-1;;;;;23388:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;23157:100;;-1:-1:-1;23388:57:0;;23441:3;;23388:48;;9828:3;23388:36;:48::i;:::-;:52;;:57::i;:::-;-1:-1:-1;;;;;23340:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;23287:32;;;;;23272:104;;23340:35;23272:63;;23325:9;;23272:48;;:10;;:14;:48::i;:63::-;:67;;:104::i;:::-;:173;23268:303;;;-1:-1:-1;;;;;23526:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:33;;;;23464:32;;;;;:96;;23526:33;23464:57;;23517:3;;23464:48;;9828:3;23464:36;:48::i;:96::-;23457:104;;;;;23268:303;-1:-1:-1;;;;;23703:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:33;;;;23654:35;;;;23586:32;;;;;:151;;:104;;:63;;23639:9;;23586:48;;23623:10;23586:36;:48::i;:151::-;23579:158;22911:834;-1:-1:-1;;;;22911:834:0:o;18115:339::-;18210:11;;-1:-1:-1;;;;;18210:11:0;18206:117;;18266:8;;;;;;;;;-1:-1:-1;;;;;18266:8:0;-1:-1:-1;;;;;18266:16:0;;7861:42;-1:-1:-1;;;;;18283:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18299:9;;18266:43;;;;;;-1:-1:-1;;;;;;18266:43:0;;;-1:-1:-1;;;;;7615:15:1;;;18266:43:0;;;7597:34:1;18299:9:0;;7647:18:1;;;7640:43;7532:18;;18266:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18252:11;:57;;-1:-1:-1;;;;;;18252:57:0;-1:-1:-1;;;;;18252:57:0;;;;;;;;;;18206:117;18391:9;:7;:9::i;:::-;18377:10;;:23;18373:74;;18428:9;:7;:9::i;:::-;18415:10;:22;18373:74;18115:339::o;21762:1029::-;-1:-1:-1;;;;;21861:12:0;;21840:7;21861:12;;;:5;:12;;;;;;;;:25;;;;;;;;:34;:39;;21858:72;;-1:-1:-1;21919:1:0;21912:8;;21858:72;-1:-1:-1;;;;;22046:12:0;;22006:18;22046:12;;;:5;:12;;;;;;;;:25;;;;;;;;:36;;;22027:79;;9925:14;;22028:54;;:15;:54;:::i;22027:79::-;-1:-1:-1;;;;;22418:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;22006:100;;-1:-1:-1;22418:57:0;;22471:3;;22418:48;;9828:3;22418:36;:48::i;:57::-;-1:-1:-1;;;;;22367:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;22299:32;;;;;:104;;22367:35;22299:63;;22352:9;;22299:48;;22336:10;22299:36;:48::i;:104::-;:176;22296:308;;;-1:-1:-1;;;;;22557:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;22495:32;;;;;:98;;22557:35;22495:57;;22548:3;;22495:48;;9828:3;22495:36;:48::i;22296:308::-;-1:-1:-1;;;;;22720:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;:63;;22773:9;;22720:48;;22757:10;22720:36;:48::i;27301:211::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;27409:42:::1;::::0;-1:-1:-1;;;27409:42:0;;27445:4:::1;27409:42;::::0;::::1;2810:51:1::0;27390:16:0::1;::::0;-1:-1:-1;;;;;27409:27:0;::::1;::::0;::::1;::::0;2783:18:1;;27409:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27489:4;::::0;27462:42:::1;::::0;-1:-1:-1;;;27462:42:0;;-1:-1:-1;;;;;27489:4:0;;::::1;27462:42;::::0;::::1;8065:51:1::0;8132:18;;;8125:34;;;27390:61:0;;-1:-1:-1;27462:26:0;::::1;::::0;::::1;::::0;8038:18:1;;27462:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27369:143;27301:211:::0;:::o;13784:284::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;13831:17:::1;9480:7;13852:28;9306:10;13852:15;:28;:::i;:::-;13851:41;;;;:::i;:::-;13831:61;;13926:12;;13914:9;:24;13905:77;;;::::0;-1:-1:-1;;;13905:77:0;;8844:2:1;13905:77:0::1;::::0;::::1;8826:21:1::0;8883:2;8863:18;;;8856:30;8922:34;8902:18;;;8895:62;-1:-1:-1;;;8973:18:1;;;8966:37;9020:19;;13905:77:0::1;8642:403:1::0;13905:77:0::1;14001:4;::::0;13995:28:::1;::::0;-1:-1:-1;;;;;14001:4:0::1;9066:11;13995:5;:28::i;:::-;14036:12;:24:::0;13784:284::o;20630:987::-;20715:16;;20687:4;;20715:16;;20714:17;20706:62;;;;-1:-1:-1;;;20706:62:0;;9252:2:1;20706:62:0;;;9234:21:1;;;9271:18;;;9264:30;9330:34;9310:18;;;9303:62;9382:18;;20706:62:0;9050:356:1;20706:62:0;20810:9;;20803:39;;-1:-1:-1;;;20803:39:0;;20831:10;20803:39;;;2810:51:1;-1:-1:-1;;;;;20810:9:0;;;;20803:27;;2783:18:1;;20803:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20789:10;:53;;20779:98;;;;-1:-1:-1;;;20779:98:0;;9613:2:1;20779:98:0;;;9595:21:1;9652:2;9632:18;;;9625:30;9691:32;9671:18;;;9664:60;9741:18;;20779:98:0;9411:354:1;20779:98:0;20897:9;;20890:66;;-1:-1:-1;;;20890:66:0;;20921:10;20890:66;;;10010:34:1;20897:9:0;10060:18:1;;;10053:43;10112:18;;;10105:34;;;-1:-1:-1;;;;;20897:9:0;;;;20890:30;;9945:18:1;;20890:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21008:22;21019:10;21008;:22::i;:::-;21106:10;21083:34;;;;:22;:34;;;;;:55;;:69;;21142:10;;21083:34;:69;;21142:10;;21083:69;:::i;:::-;;;;-1:-1:-1;21192:13:0;;-1:-1:-1;21192:11:0;:13::i;:::-;21268:10;21262:17;;;;:5;:17;;;;;;;;21280:6;:18;;;;;;21262:17;;;21280:22;;21301:1;;21280:22;:::i;:::-;21262:41;;;;;;;;;;;:53;;;21319:1;21262:58;21258:147;;21337:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;21380:10:0;;21364:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;21258:147;21473:10;;21423;21417:17;;;;:5;:17;;;;;;;;21435:6;:18;;;;;;21417:17;;;21435:22;;21456:1;;21435:22;:::i;:::-;21417:41;;;;;;;;;;;;;;-1:-1:-1;21417:41:0;;;:53;;:66;;;;21510:59;;3875:25:1;;;3916:18;;;3909:34;;;21553:15:0;3959:18:1;;;3952:34;21524:10:0;;21510:59;;3863:2:1;3848:18;21510:59:0;;;;;;;-1:-1:-1;21597:4:0;;20630:987;-1:-1:-1;20630:987:0:o;18525:2047::-;18625:16;;18599:4;;18625:16;;18624:17;18616:65;;;;-1:-1:-1;;;18616:65:0;;10684:2:1;18616:65:0;;;10666:21:1;10723:2;10703:18;;;10696:30;10762:34;10742:18;;;10735:62;-1:-1:-1;;;10813:18:1;;;10806:33;10856:19;;18616:65:0;10482:399:1;18616:65:0;18714:9;18742:13;18734:46;;;;-1:-1:-1;;;18734:46:0;;11088:2:1;18734:46:0;;;11070:21:1;11127:2;11107:18;;;11100:30;-1:-1:-1;;;11146:18:1;;;11139:50;11206:18;;18734:46:0;10886:344:1;18734:46:0;18793:17;18827:14;;18813:38;;18847:3;;18813:29;;:9;;-1:-1:-1;;;18827:14:0;;;;18813:13;:29::i;:38::-;18904:4;;;:24;;18793:58;;-1:-1:-1;;;;;;18904:4:0;;:24;;;;;18793:58;;18904:24;;:4;:24;18793:58;18904:4;:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18973:9:0;;18966:39;;-1:-1:-1;;;18966:39:0;;18941:22;18966:39;;;2810:51:1;;;18941:22:0;-1:-1:-1;;;;;18973:9:0;;18966:27;;2783:18:1;;18966:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19072:16;;;19086:1;19072:16;;;;;;;;18941:64;;-1:-1:-1;19048:21:0;;19072:16;;;;;;;;;;;;-1:-1:-1;19072:16:0;19048:40;;7861:42;-1:-1:-1;;;;;19111:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19101:4;19106:1;19101:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19101:24:0;;;:7;;;;;;;;;:24;19148:9;;;19138:7;;19148:9;;;19138:4;;19148:9;19138:7;;;;;;:::i;:::-;-1:-1:-1;;;;;19138:19:0;;;:7;;;;;;;;;;;:19;7861:42;19227:29;19266:24;:9;19280;19266:13;:24::i;:::-;19306:17;19336:4;19361:1;19415:20;:15;19432:3;19415:20;:::i;:::-;19227:219;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19227:219:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19495:9:0;;19488:39;;-1:-1:-1;;;19488:39:0;;19460:24;19488:39;;;2810:51:1;;;19460:24:0;19487:61;;19533:14;;-1:-1:-1;;;;;19495:9:0;;19488:27;;2783:18:1;;19488:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19487:61::-;19460:88;;19600:28;19611:16;19600:10;:28::i;:::-;19704:10;19681:34;;;;:22;:34;;;;;:55;;:75;;19740:16;;19681:34;:75;;19740:16;;19681:75;:::i;:::-;;;;-1:-1:-1;;19790:10:0;19767:34;;;;:22;:34;;;;;:53;;:66;;19824:9;;19767:34;:66;;19824:9;;19767:66;:::i;:::-;;;;-1:-1:-1;19873:13:0;;-1:-1:-1;19873:11:0;:13::i;:::-;19950:10;;19937:24;;;;:12;:24;;;;;:37;;19965:9;;19937:24;:37;;19965:9;;19937:37;:::i;:::-;;;;;;;;20009:9;19985:20;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;20085:10:0;20079:17;;;;:5;:17;;;;;;;;20097:6;:18;;;;;;20079:17;;;20097:22;;20118:1;;20097:22;:::i;:::-;20079:41;;;;;;;;;;;:53;;;20136:1;20079:58;20075:147;;20154:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;20197:10:0;;20181:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;20075:147;20240:10;20234:17;;;;:5;:17;;;;;;;;20252:6;:18;;;;;;20291:9;;20234:17;20252:22;;20273:1;;20252:22;:::i;:::-;20234:41;;;;;;;;;;;:53;;;:66;;;;;;;:::i;:::-;;;;-1:-1:-1;;20368:10:0;;20318;20312:17;;;;:5;:17;;;;;;;;20330:6;:18;;;;;;20312:17;;;20330:22;;20351:1;;20330:22;:::i;:::-;20312:41;;;;;;;;;;;;;;-1:-1:-1;20312:41:0;:53;;:66;;;;20416:10;;20399:14;:27;20452:72;;3875:25:1;;;3916:18;;;3909:34;;;20508:15:0;3959:18:1;;;3952:34;20452:72:0;;20466:10;;20452:72;;;;;;3863:2:1;20452:72:0;;;-1:-1:-1;20552:4:0;;18525:2047;-1:-1:-1;;;;;;18525:2047:0:o;12691:463::-;12825:10;12778:4;12814:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12814:31:0;;;;;;;;;;12860:27;;;12856:191;;12915:10;12938:1;12904:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12904:31:0;;;;;;;;;:35;12856:191;;;13006:29;:8;13019:15;13006:12;:29::i;:::-;12983:10;12972:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12972:31:0;;;;;;;;;:63;12856:191;13071:10;13092:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;13062:62:0;;13092:31;;;;;;;;;;;13062:62;;898:25:1;;;13062:62:0;;13071:10;13062:62;;871:18:1;13062:62:0;;;;;;;-1:-1:-1;13142:4:0;;12691:463;-1:-1:-1;;;12691:463:0:o;15234:142::-;15296:4;15313:33;15323:10;15335:2;15339:6;15313:9;:33::i;:::-;-1:-1:-1;15364:4:0;15234:142;;;;:::o;17596:120::-;17636:7;9415:6;17669:28;9306:10;17669:15;:28;:::i;:::-;17668:39;;;;:::i;:::-;17663:45;;:1;:45;:::i;:::-;17656:52;;17596:120;:::o;14508:153::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14606:34:0;;;::::1;;::::0;;;:24:::1;:34;::::0;;;;:46;;-1:-1:-1;;14606:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14508:153::o;14142:285::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;14239:17:::1;14233:23;;:2;:23;;14224:69;;;::::0;-1:-1:-1;;;14224:69:0;;13716:2:1;14224:69:0::1;::::0;::::1;13698:21:1::0;;;13735:18;;;13728:30;13794:34;13774:18;;;13767:62;13846:18;;14224:69:0::1;13514:356:1::0;14224:69:0::1;14334:3;14313:17;:24;;;;14304:67;;;::::0;-1:-1:-1;;;14304:67:0;;14077:2:1;14304:67:0::1;::::0;::::1;14059:21:1::0;14116:2;14096:18;;;14089:30;14155:31;14135:18;;;14128:59;14204:18;;14304:67:0::1;13875:353:1::0;14304:67:0::1;14382:16;:36:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;14382:36:0;;::::1;::::0;;;::::1;::::0;;14142:285::o;24676:658::-;24746:10;24719:17;24739:18;;;:6;:18;;;;;;;24719:17;24853:269;24873:9;24869:1;:13;24853:269;;;24915:23;24924:10;24936:1;24915:8;:23::i;:::-;25009:10;25003:17;;;;:5;:17;;;;;;;;:20;;;;;;;;:28;;;;24969:30;;;;;:63;;25003:28;24969:63;:::i;:::-;24955:77;;;;:::i;:::-;25084:10;25078:17;;;;:5;:17;;;;;;;;:20;;;;;;;;:30;;;;25047:28;;;;:61;24955:77;-1:-1:-1;24884:4:0;;24853:269;;;;25171:29;25177:10;25189;25171:5;:29::i;13357:190::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;13445:2:::1;13431:10;:16;;;;13423:77;;;::::0;-1:-1:-1;;;13423:77:0;;14435:2:1;13423:77:0::1;::::0;::::1;14417:21:1::0;14474:2;14454:18;;;14447:30;14513:34;14493:18;;;14486:62;-1:-1:-1;;;14564:18:1;;;14557:45;14619:19;;13423:77:0::1;14233:411:1::0;13423:77:0::1;13511:14;:27:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;13511:27:0::1;-1:-1:-1::0;;;;13511:27:0;;::::1;::::0;;;::::1;::::0;;13357:190::o;13201:85::-;8799:4;;-1:-1:-1;;;;;8799:4:0;8807:10;8799:18;8791:61;;;;-1:-1:-1;;;8791:61:0;;;;;;;:::i;:::-;13267:4:::1;:10:::0;;-1:-1:-1;;;;;;13267:10:0::1;-1:-1:-1::0;;;;;13267:10:0;;;::::1;::::0;;;::::1;::::0;;13201:85::o;23873:253::-;23984:71;24024:30;24035:5;24042:11;24024:10;:30::i;:::-;-1:-1:-1;;;;;23984:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;:39;:71::i;:::-;-1:-1:-1;;;;;23946:12:0;;;;;;;;:5;:12;;;;;;;;:25;;;;;;;:35;;;:109;;;;24103:15;24064:36;;;;:54;23873:253::o;1024:136::-;1082:7;1109:43;1113:1;1116;1109:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1102:50;1024:136;-1:-1:-1;;;1024:136:0:o;16871:221::-;-1:-1:-1;;;;;16956:16:0;;;;;;:9;:16;;;;;;:29;;16977:7;16956:20;:29::i;:::-;-1:-1:-1;;;;;16937:16:0;;;;;;:9;:16;;;;;:48;17009:12;;:25;;17026:7;17009:16;:25::i;:::-;16994:12;:40;17048:36;;898:25:1;;;-1:-1:-1;;;;;17048:36:0;;;17065:1;;-1:-1:-1;;;;;;;;;;;17048:36:0;886:2:1;871:18;17048:36:0;;;;;;;16871:221;;:::o;17150:393::-;17212:10;17206:17;;;;:5;:17;;;;;;;;17224:6;:18;;;;;;;;17206:37;;;;;;;;:44;;:54;;;17287:18;;17269:37;;;;;17318:15;17269:64;;;;17360:18;;17342:37;;;;;:48;;:66;;;;17419:18;;;;;:20;;;17224:18;17419:20;;;:::i;:::-;;;;;;17470:7;17448:18;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;17493:42:0;;;6418:25:1;;;17519:15:0;6474:2:1;6459:18;;6452:34;17498:10:0;;17493:42;;6391:18:1;17493:42:0;;;;;;;17150:393;:::o;15782:1079::-;-1:-1:-1;;;;;14848:34:0;;15972:22;14848:34;;;:24;:34;;;;;;;;16057:11;;15997:30;;;-1:-1:-1;;;;;;16049:19:0;;;16057:11;;16049:19;:40;;;;;16072:17;16049:40;16044:810;;;16195:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16195:15:0;;-1:-1:-1;16195:15:0;;;:9;:15;;;;;;;;:62;;16215:6;;16195:19;:62::i;:::-;-1:-1:-1;;;;;16177:15:0;;;;;;:9;:15;;;;;:80;;;;16305:16;;16294:37;;16327:3;;16294:28;;:6;;16305:16;;;;;16294:10;:28::i;:37::-;-1:-1:-1;;;;;16362:13:0;;;;;;:9;:13;;;;;;16272:59;;-1:-1:-1;16362:30:0;;16272:59;16362:17;:30::i;:::-;-1:-1:-1;;;;;16346:13:0;;;;;;:9;:13;;;;;:46;16431:50;16457:23;:6;16468:11;16457:10;:23::i;:::-;16431:21;;;:9;:21;;;;;:25;:50::i;:::-;16407:21;;;:9;:21;;;:74;:21;16501:31;-1:-1:-1;;;;;16501:31:0;;;;;;;;-1:-1:-1;;;;;;;;;;;16501:31:0;;;16520:11;898:25:1;;886:2;871:18;;752:177;16501:31:0;;;;;;;;16575:1;-1:-1:-1;;;;;16552:51:0;;-1:-1:-1;;;;;;;;;;;16579:23:0;:6;16590:11;16579:10;:23::i;:::-;16552:51;;898:25:1;;;886:2;871:18;16552:51:0;;;;;;;16092:527;16044:810;;;16674:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16674:15:0;;-1:-1:-1;16674:15:0;;;:9;:15;;;;;;;;:62;;16694:6;;16674:19;:62::i;:::-;-1:-1:-1;;;;;16656:15:0;;;;;;;:9;:15;;;;;;:80;;;;16767:13;;;;;;;:25;;16785:6;16767:17;:25::i;:::-;-1:-1:-1;;;;;16751:13:0;;;;;;;:9;:13;;;;;;;:41;;;;16812:26;;;;;;-1:-1:-1;;;;;;;;;;;16812:26:0;;;16831:6;898:25:1;;886:2;871:18;;752:177;16812:26:0;;;;;;;;16044:810;15860:1001;15782:1079;;;:::o;1368:250::-;1426:7;1450:1;1455;1450:6;1446:47;;-1:-1:-1;1480:1:0;1473:8;;1446:47;1505:9;1517:5;1521:1;1517;:5;:::i;:::-;1505:17;-1:-1:-1;1550:1:0;1541:5;1545:1;1505:17;1541:5;:::i;:::-;:10;1533:56;;;;-1:-1:-1;;;1533:56:0;;15024:2:1;1533:56:0;;;15006:21:1;15063:2;15043:18;;;15036:30;15102:34;15082:18;;;15075:62;-1:-1:-1;;;15153:18:1;;;15146:31;15194:19;;1533:56:0;14822:397:1;835:181:0;893:7;;925:5;929:1;925;:5;:::i;:::-;913:17;;954:1;949;:6;;941:46;;;;-1:-1:-1;;;941:46:0;;15426:2:1;941:46:0;;;15408:21:1;15465:2;15445:18;;;15438:30;15504:29;15484:18;;;15477:57;15551:18;;941:46:0;15224:351:1;1626:132:0;1684:7;1711:39;1715:1;1718;1711:39;;;;;;;;;;;;;;;;;:3;:39::i;1168:192::-;1254:7;1290:12;1282:6;;;;1274:29;;;;-1:-1:-1;;;1274:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;1168:192;-1:-1:-1;;;;;1168:192:0:o;1766:191::-;1852:7;1887:12;1880:5;1872:28;;;;-1:-1:-1;;;1872:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1911:9:0;1923:5;1927:1;1923;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:180::-;626:6;679:2;667:9;658:7;654:23;650:32;647:52;;;695:1;692;685:12;647:52;-1:-1:-1;718:23:1;;567:180;-1:-1:-1;567:180:1:o;934:131::-;-1:-1:-1;;;;;1009:31:1;;999:42;;989:70;;1055:1;1052;1045:12;989:70;934:131;:::o;1070:315::-;1138:6;1146;1199:2;1187:9;1178:7;1174:23;1170:32;1167:52;;;1215:1;1212;1205:12;1167:52;1254:9;1241:23;1273:31;1298:5;1273:31;:::i;:::-;1323:5;1375:2;1360:18;;;;1347:32;;-1:-1:-1;;;1070:315:1:o;1582:456::-;1659:6;1667;1675;1728:2;1716:9;1707:7;1703:23;1699:32;1696:52;;;1744:1;1741;1734:12;1696:52;1783:9;1770:23;1802:31;1827:5;1802:31;:::i;:::-;1852:5;-1:-1:-1;1909:2:1;1894:18;;1881:32;1922:33;1881:32;1922:33;:::i;:::-;1582:456;;1974:7;;-1:-1:-1;;;2028:2:1;2013:18;;;;2000:32;;1582:456::o;2043:247::-;2102:6;2155:2;2143:9;2134:7;2130:23;2126:32;2123:52;;;2171:1;2168;2161:12;2123:52;2210:9;2197:23;2229:31;2254:5;2229:31;:::i;2295:118::-;2381:5;2374:13;2367:21;2360:5;2357:32;2347:60;;2403:1;2400;2393:12;2418:241;2474:6;2527:2;2515:9;2506:7;2502:23;2498:32;2495:52;;;2543:1;2540;2533:12;2495:52;2582:9;2569:23;2601:28;2623:5;2601:28;:::i;4221:382::-;4286:6;4294;4347:2;4335:9;4326:7;4322:23;4318:32;4315:52;;;4363:1;4360;4353:12;4315:52;4402:9;4389:23;4421:31;4446:5;4421:31;:::i;:::-;4471:5;-1:-1:-1;4528:2:1;4513:18;;4500:32;4541:30;4500:32;4541:30;:::i;:::-;4590:7;4580:17;;;4221:382;;;;;:::o;4608:269::-;4665:6;4718:2;4706:9;4697:7;4693:23;4689:32;4686:52;;;4734:1;4731;4724:12;4686:52;4773:9;4760:23;4823:4;4816:5;4812:16;4805:5;4802:27;4792:55;;4843:1;4840;4833:12;5142:388;5210:6;5218;5271:2;5259:9;5250:7;5246:23;5242:32;5239:52;;;5287:1;5284;5277:12;5239:52;5326:9;5313:23;5345:31;5370:5;5345:31;:::i;:::-;5395:5;-1:-1:-1;5452:2:1;5437:18;;5424:32;5465:33;5424:32;5465:33;:::i;5982:127::-;6043:10;6038:3;6034:20;6031:1;6024:31;6074:4;6071:1;6064:15;6098:4;6095:1;6088:15;6114:125;6179:9;;;6200:10;;;6197:36;;;6213:18;;:::i;6497:128::-;6564:9;;;6585:11;;;6582:37;;;6599:18;;:::i;6630:354::-;6832:2;6814:21;;;6871:2;6851:18;;;6844:30;6910:32;6905:2;6890:18;;6883:60;6975:2;6960:18;;6630:354::o;6989:135::-;7028:3;7049:17;;;7046:43;;7069:18;;:::i;:::-;-1:-1:-1;7116:1:1;7105:13;;6989:135::o;7129:251::-;7199:6;7252:2;7240:9;7231:7;7227:23;7223:32;7220:52;;;7268:1;7265;7258:12;7220:52;7300:9;7294:16;7319:31;7344:5;7319:31;:::i;7694:184::-;7764:6;7817:2;7805:9;7796:7;7792:23;7788:32;7785:52;;;7833:1;7830;7823:12;7785:52;-1:-1:-1;7856:16:1;;7694:184;-1:-1:-1;7694:184:1:o;8170:245::-;8237:6;8290:2;8278:9;8269:7;8265:23;8261:32;8258:52;;;8306:1;8303;8296:12;8258:52;8338:9;8332:16;8357:28;8379:5;8357:28;:::i;8420:217::-;8460:1;8486;8476:132;;8530:10;8525:3;8521:20;8518:1;8511:31;8565:4;8562:1;8555:15;8593:4;8590:1;8583:15;8476:132;-1:-1:-1;8622:9:1;;8420:217::o;11235:127::-;11296:10;11291:3;11287:20;11284:1;11277:31;11327:4;11324:1;11317:15;11351:4;11348:1;11341:15;11367:127;11428:10;11423:3;11419:20;11416:1;11409:31;11459:4;11456:1;11449:15;11483:4;11480:1;11473:15;11499:900;11725:4;11773:3;11762:9;11758:19;11804:6;11793:9;11786:25;11830:2;11868:3;11863:2;11852:9;11848:18;11841:31;11892:6;11927;11921:13;11958:6;11950;11943:22;11996:3;11985:9;11981:19;11974:26;;12035:2;12027:6;12023:15;12009:29;;12056:1;12066:195;12080:6;12077:1;12074:13;12066:195;;;12145:13;;-1:-1:-1;;;;;12141:39:1;12129:52;;12236:15;;;;12201:12;;;;12177:1;12095:9;12066:195;;;-1:-1:-1;;;;;;;12317:32:1;;;;12312:2;12297:18;;12290:60;-1:-1:-1;;;12381:2:1;12366:18;12359:34;12278:3;11499:900;-1:-1:-1;;11499:900:1:o;12404:1105::-;12499:6;12530:2;12573;12561:9;12552:7;12548:23;12544:32;12541:52;;;12589:1;12586;12579:12;12541:52;12622:9;12616:16;12651:18;12692:2;12684:6;12681:14;12678:34;;;12708:1;12705;12698:12;12678:34;12746:6;12735:9;12731:22;12721:32;;12791:7;12784:4;12780:2;12776:13;12772:27;12762:55;;12813:1;12810;12803:12;12762:55;12842:2;12836:9;12864:2;12860;12857:10;12854:36;;;12870:18;;:::i;:::-;12916:2;12913:1;12909:10;12948:2;12942:9;13011:2;13007:7;13002:2;12998;12994:11;12990:25;12982:6;12978:38;13066:6;13054:10;13051:22;13046:2;13034:10;13031:18;13028:46;13025:72;;;13077:18;;:::i;:::-;13113:2;13106:22;13163:18;;;13197:15;;;;-1:-1:-1;13239:11:1;;;13235:20;;;13267:19;;;13264:39;;;13299:1;13296;13289:12;13264:39;13323:11;;;;13343:135;13359:6;13354:3;13351:15;13343:135;;;13425:10;;13413:23;;13376:12;;;;13456;;;;13343:135;;;13497:6;12404:1105;-1:-1:-1;;;;;;;;12404:1105:1:o;14649:168::-;14722:9;;;14753;;14770:15;;;14764:22;;14750:37;14740:71;;14791:18;;:::i

Swarm Source

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