ETH Price: $2,454.07 (-1.89%)

Token

Bluey (Bluey)
 

Overview

Max Total Supply

420,690,000,000 Bluey

Holders

488

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.75068793 Bluey

Value
$0.00
0xBCBE368E75C77BFEc82d4bda216E52eFdd0c5a6f
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:
Bluey

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

https://t.me/Bluey_Official

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

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

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

library Address {

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

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

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
abstract contract Auth {
    address public owner;
    mapping (address => bool) internal authorizations;
    
    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true; 
    }
    
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }
    
    function authorize(address adr) public authorized {
        authorizations[adr] = true;
    }

    function unauthorize(address adr) public authorized {
        authorizations[adr] = false;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }
    
    function transferOwnership(address payable adr) public authorized {
        require(adr != address(0), "Zero Address");
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);}
    
    function renounceOwnership() external authorized {
        emit OwnershipTransferred(address(0));
        owner = address(0);}
    
    event OwnershipTransferred(address owner);
}


interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

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

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

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

interface IPair {
    function sync() external;
}

interface IWeth {
    function deposit() external payable;
}
contract Bluey is IERC20, Auth {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    string private constant _name = 'Bluey';
    string private constant _symbol = 'Bluey';
    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 420690000000 * (10 ** _decimals);

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _maxTxAmount = ( _totalSupply * 10000 ) / 10000;
    uint256 public _maxWalletAmount = ( _totalSupply * 10000 ) / 10000;

    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) _isBot;
    mapping (address => bool) isWhitelisted;
    mapping (address => bool) isBlacklisted;

    IRouter public immutable router;
    address public immutable pair;
    bool tradingEnabled = false;
    uint256 startedTime;

    uint256 constant feeDenominator = 10000;

    struct Fee {
        uint256 stakingFee;
        uint256 burnFee;
        uint256 liquidFee; // marketingFee + autoLPFee + teamFee
        uint256 totalFee;
    }

    enum TransactionType {BUY, SELL, TRANSFER}

    mapping (TransactionType => Fee) public fees;

    bool swapAndLiquifyEnabled = false;
    uint256 swapTimes; 
    uint256 minTransactionsBeforeSwap = 7;
    bool swapping; 
    bool antiBotEnabled = true;

    uint256 swapThreshold = ( _totalSupply * 300 ) / 100000;
    uint256 _minTokenAmount = ( _totalSupply * 15 ) / 100000;

    uint256 marketing_divisor = 0;
    uint256 liquidity_divisor = 100;
    uint256 team_divisor = 0;
    uint256 total_divisor = 100;

    address liquidity_receiver; 
    address staking_receiver;
    address marketing_receiver;

    address team1_receiver;
    address team2_receiver;
    address team3_receiver;
    address team4_receiver;

    event WhitelistUpdated(address indexed account, bool indexed whitelisted);
    event BotUpdated(address indexed account, bool indexed isBot);
    event BlacklistedUpdated(address indexed account, bool indexed blacklisted);
    event AntiBotStateUpdated(bool indexed enabled);
    event TradingEnabled();
    event TradingDisabled();
    event SwapBackSettingsUpdated(bool indexed enabled, uint256 threshold, uint256 minLimit, uint256 _minTransactions);
    event MaxLimitsUpdated(uint256 maxTxAmount, uint256 maxWalletAmount);
    event UnsupportedTokensRecoverd(address indexed token, address receiver, uint256 amount);
    event DivisorsUpdated(uint256 team, uint256 liquidity, uint256 marketing);
    event TeamFundsDistributed(address team1, address team2, address team3, address team4, uint256 amount);
    event FeesUpdated(TransactionType indexed transactionType, uint256 burnFee, uint256 stakingFee, uint256 swapAndLiquifyFee);
    event FeesAddressesUpdated(address marketing, address liquidity, address staking);
    event TeamAddressesUpdated(address team1, address team2, address team3, address team4);
    event ForceAdjustedLP(bool indexed bluey, uint256 amount, bool indexed add);
    event TokensAirdroped(address indexed sender, uint256 length, uint256 airdropedAmount);


    modifier lockTheSwap {
        swapping = true; 
        _;
        swapping = false;
    }

    

    constructor() Auth(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // eth - 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        // initilasing Fees
        fees[TransactionType.SELL] = Fee (0, 0, 0, 0);
        fees[TransactionType.BUY] = Fee (0, 0, 0, 0);
        fees[TransactionType.TRANSFER] = Fee (0, 0, 0, 0);
        
        isBlacklisted[address(0)] = true;
       
        isWhitelisted[msg.sender] = true;
        isWhitelisted[address(this)] = true;

        liquidity_receiver = address(this);
        team1_receiver = msg.sender;
        team2_receiver = msg.sender;
        team3_receiver = msg.sender;
        team4_receiver = msg.sender;
        staking_receiver = msg.sender;
        marketing_receiver = msg.sender;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function totalSupply() public pure override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}

    function isBot(address _address) public view returns (bool) {
        return _isBot[_address];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD));
    }

    function whitelistAddress(address _address, bool _whitelist) external authorized { 
        require(isWhitelisted[_address] != _whitelist, "Already set");
        isWhitelisted[_address] = _whitelist;

        emit WhitelistUpdated(_address, _whitelist);
    }

    function blacklistAddress(address _address, bool _blacklist) external authorized { 
        require(isBlacklisted[_address] != _blacklist, "Already set");
        isBlacklisted[_address] = _blacklist;

        emit BlacklistedUpdated(_address, _blacklist);
    }

    function updateBot(address _address, bool isBot_) external authorized {
        require(_isBot[_address] != isBot_, "Already set");
        _isBot[_address] = isBot_;

        emit BotUpdated(_address, isBot_);
    }

    function enableAntiBot(bool _enable) external authorized {
        require(antiBotEnabled != _enable, "Already set");
        antiBotEnabled = _enable;

        emit AntiBotStateUpdated(_enable);
    }

    function enableTrading(uint256 _input) external authorized {
        require(!tradingEnabled, "Already Enabled!");
        tradingEnabled = true;
        if(startedTime == 0) // initialise only once
            startedTime = block.timestamp.add(_input);
        
        emit TradingEnabled();
        
    }

    function updateSwapBackSettings(bool _enabled, uint256 _threshold, uint256 _minLimit, uint256 _minTransactionsBeforeSwap) external authorized {
        swapAndLiquifyEnabled = _enabled; 
        swapThreshold = _threshold;
        _minTokenAmount = _minLimit;
        minTransactionsBeforeSwap = _minTransactionsBeforeSwap;

        emit SwapBackSettingsUpdated( _enabled, _threshold, _minLimit, _minTransactionsBeforeSwap);
    }

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

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = allowance(msg.sender, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(msg.sender, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);

        bool takeFee = true;
        if (isWhitelisted[sender] || isWhitelisted[recipient]) {
            takeFee = false;

        } else {
            require(tradingEnabled, "Trading is Paused");
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            if (recipient != pair) {
                require(_balances[recipient] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        TransactionType transactionType;

        if(sender == pair) {
            transactionType = TransactionType.BUY;
            if(recipient != address(router) && block.timestamp <= startedTime) {
                _isBot[recipient] = true;
            }
        } else if (recipient == pair) {
            transactionType = TransactionType.SELL;
        } else {
            transactionType = TransactionType.TRANSFER;
        }

        swapTimes = swapTimes.add(1);
        if(shouldSwapBack(sender, amount)){
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }

        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = takeFee ? takeTotalFee(sender, amount, transactionType) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(!isBlacklisted[sender], "Blackisted");
        require(!isBlacklisted[recipient], "Blackisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

    function takeTotalFee(address sender, uint256 amount, TransactionType transactionType) internal returns (uint256) {
        Fee memory fee = fees[transactionType];
        uint256 totalFees = _isBot[sender] && antiBotEnabled? (feeDenominator - 100) : fee.totalFee; // 99% fees if bot
        if (totalFees == 0) {
            return amount;
        }
        uint256 feeAmount = (amount.mul(totalFees)).div(feeDenominator);
        uint256 burnAmount = (feeAmount.mul(fee.burnFee)).div(totalFees);
        uint256 stakingAmount = (feeAmount.mul(fee.stakingFee)).div(totalFees);

        uint256 liquidAmount = feeAmount.sub(burnAmount).sub(stakingAmount);

        if(burnAmount > 0) {
            _balances[address(DEAD)] = _balances[address(DEAD)].add(burnAmount);
            emit Transfer(sender, address(DEAD), burnAmount);
        }
        if(stakingAmount > 0) {
            _balances[address(staking_receiver)] = _balances[address(staking_receiver)].add(stakingAmount);
            emit Transfer(sender, address(staking_receiver), stakingAmount);
        }
        if(liquidAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(liquidAmount);
            emit Transfer(sender, address(this), liquidAmount);
        } 
        return amount.sub(feeAmount);

    }

    function updateMaxLimits(uint256 _transaction, uint256 _wallet) external authorized {
        require(_transaction >= 1, "Max txn limit cannot be less than 0.00001%");
        require(_wallet >= 500000, "Max Wallet limit cannot be less than 5%");
        uint256 newTxLimit = ( _totalSupply * _transaction ) / 10000000;
        uint256 newWalletLimit = ( _totalSupply * _wallet ) / 10000000;
        _maxTxAmount = newTxLimit;
        _maxWalletAmount = newWalletLimit;

        emit MaxLimitsUpdated(_maxTxAmount, _maxWalletAmount);
    }

    function recoverUnsupportedTokens(address _token, address _receiver, uint256 _percentage) external authorized {
        uint256 amount = IERC20(_token).balanceOf(address(this));
        uint256 amountToWithdraw = amount.mul(_percentage).div(10000);
        IERC20(_token).safeTransfer(_receiver, amountToWithdraw);

        emit UnsupportedTokensRecoverd(_token, _receiver, amountToWithdraw);
    }

    function updateDivisors(uint256 _team, uint256 _liquidity, uint256 _marketing) external authorized {
        team_divisor = _team;
        liquidity_divisor = _liquidity;
        marketing_divisor = _marketing;
        total_divisor = _team.add(_liquidity).add(_marketing);

        emit DivisorsUpdated(_team, _liquidity, _marketing);
    }

    function distributeTeamFunds(uint256 _numerator, uint256 _denominator) external authorized {
        uint256 ethAmount = address(this).balance;
        uint256 distributeAmount = ethAmount.mul(_numerator).div(_denominator);
        uint256 amountToSend = distributeAmount.div(4);
        transferETH(team1_receiver, amountToSend);
        transferETH(team2_receiver, amountToSend);
        transferETH(team3_receiver, amountToSend);
        transferETH(team4_receiver, amountToSend);

        emit TeamFundsDistributed(team1_receiver, team2_receiver, team3_receiver, team4_receiver, distributeAmount);
    }

    function updateFee(TransactionType transactionType, uint256 _burnFee, uint256 _stakingFee, uint256 _swapAndLiquifyFee) external authorized {
        require(_burnFee.add(_stakingFee).add(_swapAndLiquifyFee) <= feeDenominator.mul(3).div(20), "Tax cannot be more than 15%");
        Fee storage fee = fees[transactionType];
        fee.burnFee = _burnFee;
        fee.stakingFee = _stakingFee;
        fee.liquidFee = _swapAndLiquifyFee;
        fee.totalFee = _burnFee.add(_stakingFee).add(_swapAndLiquifyFee);    

        emit FeesUpdated(transactionType, _burnFee, _stakingFee, _swapAndLiquifyFee);
    }

    function updateFeesAddresses(address _marketing, address _liquidity, address _staking) external authorized {
        require(_marketing != address(0), "Zero Address");
        require(_liquidity != address(0), "Zero Address");
        require(_staking != address(0), "Zero Address");
        marketing_receiver = _marketing;
        liquidity_receiver = _liquidity;
        staking_receiver = _staking;

        emit FeesAddressesUpdated( _marketing, _liquidity, _staking);
    }

    function updateTeamAddresses(address _team1, address _team2, address _team3, address _team4) external authorized {
        require(_team1 != address(0), "Zero Address");
        require(_team2 != address(0), "Zero Address");
        require(_team3 != address(0), "Zero Address");
        require(_team4 != address(0), "Zero Address");
        team1_receiver = _team1;
        team2_receiver = _team2;
        team3_receiver = _team3;
        team4_receiver = _team4;

        emit TeamAddressesUpdated( _team1, _team2, _team3, _team4);
    }

    function shouldSwapBack(address sender, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapAndLiquifyEnabled && aboveMin && 
             swapTimes >= minTransactionsBeforeSwap && aboveThreshold && sender != pair;
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 amountToLiquify = tokens.mul(liquidity_divisor).div(total_divisor).div(2);
        uint256 amountToSwap = tokens.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForETH(amountToSwap);

        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = total_divisor.sub(liquidity_divisor.div(2));

        if(amountToLiquify > 0){
            addLiquidity(amountToLiquify, deltaBalance.mul(liquidity_divisor).div(totalETHFee).div(2)); 
        }
        // transfer ETH to marketing, teamFunds stay in contract for future distribution.
        transferETH(marketing_receiver, deltaBalance.mul(marketing_divisor).div(totalETHFee));
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);
    }

    function transferETH(address recipient, uint256 amount) private {
        if(amount == 0) return;
        (bool success, ) = payable(recipient).call{value: amount}("");
        require(success, "Unable to send ETH");
    }

    function airdropTokens(address[] calldata accounts, uint256[] calldata amounts) external authorized {
        uint256 length = accounts.length;
        require (length == amounts.length, "array length mismatched");
        uint256 airdropAmount = 0;
        
        for (uint256 i = 0; i < length; i++) {
            // updating balance directly instead of calling transfer to save gas
            _balances[accounts[i]] += amounts[i];
            airdropAmount += amounts[i];
            emit Transfer(msg.sender, accounts[i], amounts[i]);
        }
        _balances[msg.sender] -= airdropAmount;

        emit TokensAirdroped(msg.sender, length, airdropAmount);
    }

    function forceAdjustLP(bool bluey, uint256 amount, bool add) external payable authorized{
        if(!bluey) {
            require(add, "Cant withdraw bnb from pool");
            amount = msg.value;
            IWeth(router.WETH()).deposit{value: amount}();
            IERC20(router.WETH()).safeTransfer(pair, amount);
        }else {
            if(add) {
                _balances[msg.sender] -= amount;
                _balances[pair] += amount;
                emit Transfer(msg.sender, pair, amount);

            } else {
                _balances[pair] -= amount;
                _balances[msg.sender] += amount;
                emit Transfer(pair, msg.sender, amount);
            }
        }
        IPair(pair).sync();
        emit ForceAdjustedLP(bluey, amount, add);
    
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AntiBotStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isBot","type":"bool"}],"name":"BotUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"team","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"DivisorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketing","type":"address"},{"indexed":false,"internalType":"address","name":"liquidity","type":"address"},{"indexed":false,"internalType":"address","name":"staking","type":"address"}],"name":"FeesAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum Bluey.TransactionType","name":"transactionType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapAndLiquifyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"bluey","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"add","type":"bool"}],"name":"ForceAdjustedLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minTransactions","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"}],"name":"TeamAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamFundsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropedAmount","type":"uint256"}],"name":"TokensAirdroped","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedTokensRecoverd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"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":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"distributeTeamFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Bluey.TransactionType","name":"","type":"uint8"}],"name":"fees","outputs":[{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"liquidFee","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"bluey","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"add","type":"bool"}],"name":"forceAdjustLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"recoverUnsupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"isBot_","type":"bool"}],"name":"updateBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_team","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"}],"name":"updateDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Bluey.TransactionType","name":"transactionType","type":"uint8"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_stakingFee","type":"uint256"},{"internalType":"uint256","name":"_swapAndLiquifyFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"updateFeesAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transaction","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_minLimit","type":"uint256"},{"internalType":"uint256","name":"_minTransactionsBeforeSwap","type":"uint256"}],"name":"updateSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_team1","type":"address"},{"internalType":"address","name":"_team2","type":"address"},{"internalType":"address","name":"_team3","type":"address"},{"internalType":"address","name":"_team4","type":"address"}],"name":"updateTeamAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052612710620000156009600a62000757565b62000026906461f313f8806200076f565b62000034906127106200076f565b62000040919062000791565b600255612710620000546009600a62000757565b62000065906461f313f8806200076f565b62000073906127106200076f565b6200007f919062000791565b6003556009805460ff199081168255600c805490911690556007600e55600f805461ff001916610100179055620186a090620000bd90600a62000757565b620000ce906461f313f8806200076f565b620000dc9061012c6200076f565b620000e8919062000791565b601055620186a0620000fd6009600a62000757565b6200010e906461f313f8806200076f565b6200011b90600f6200076f565b62000127919062000791565b60115560006012556064601355600060145560646015553480156200014b57600080fd5b50600080546001600160a01b0319163390811782558152600160208181526040808420805460ff1916909317909255815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d9392849263c45a0155926004808401938290030181865afa158015620001c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ed9190620007b4565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002619190620007b4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d59190620007b4565b6001600160a01b03838116608090815290821660a0526040805180830182526000808252602080830182815283850183815260608086018581526001808752600b80875297517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5593517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d05591517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d15590517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d2558551808801875284815280840185815281880186815282840187815287805288875292517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765590517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7755517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7855517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7955855196870186528387528683018481528787018581529188018581526002865295845296517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345595517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916355594517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916365591517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91637557f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7805460ff199081168617909155338083526007909352838220805482168617905530808352939091208054909116909317909255601680546001600160a01b0319908116909217905560198054821683179055601a8054821683179055601b8054821683179055601c8054821683179055601780548216831790556018805490911690911790559050620005c46009600a62000757565b620005d5906461f313f8806200076f565b33600081815260046020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620006186009600a62000757565b62000629906461f313f8806200076f565b60405190815260200160405180910390a35050620007df565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620006995781600019048211156200067d576200067d62000642565b808516156200068b57918102915b93841c93908002906200065d565b509250929050565b600082620006b25750600162000751565b81620006c15750600062000751565b8160018114620006da5760028114620006e55762000705565b600191505062000751565b60ff841115620006f957620006f962000642565b50506001821b62000751565b5060208310610133831016604e8410600b84101617156200072a575081810a62000751565b62000736838362000658565b80600019048211156200074d576200074d62000642565b0290505b92915050565b60006200076860ff841683620006a1565b9392505050565b60008160001904831182151516156200078c576200078c62000642565b500290565b600082620007af57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620007c757600080fd5b81516001600160a01b03811681146200076857600080fd5b60805160a05161368c620008836000396000818161064c01528181611017015281816111020152818161114d015281816111a20152818161121b0152818161125a0152818161205e0152818161210e015281816121bd01526125f401526000818161076001528181610f3f015281816110390152818161214b01528181612b0201528181612bbb01528181612bf701528181612c710152612cd9015261368c6000f3fe60806040526004361061023f5760003560e01c806370a082311161012e578063b6a5d7de116100ab578063f319ae771161006f578063f319ae771461072e578063f887ea401461074e578063fac1b9bc14610782578063fc5ea5e6146107a2578063fe9fbb80146107c257600080fd5b8063b6a5d7de1461068e578063b9a45aac146106ae578063dd62ed3e146106ce578063f0b37c04146106ee578063f2fde38b1461070e57600080fd5b80638e5c3ad3116100f25780638e5c3ad3146105fa57806395d89b411461024b578063a457c2d71461061a578063a8aa1b311461063a578063a9059cbb1461066e57600080fd5b806370a0823114610541578063715018a6146105775780637d1db4a51461058c57806382aa7c68146105a25780638da5cb5b146105c257600080fd5b806339264b66116101bc5780634a5a863a116101805780634a5a863a146104b8578063569c9b33146104d85780636b7f8b90146104eb5780636c0a24eb1461050b578063706f69371461052157600080fd5b806339264b66146103ff578063395093511461041f5780633bbac5791461043f57806340005fbe14610478578063455a43961461049857600080fd5b80632b112e49116102035780632b112e491461031d5780632f54bf6e14610332578063313ce567146103615780633385f9aa1461037d578063357c13541461039d57600080fd5b806306fdde031461024b578063095ea7b3146102885780630eefe44b146102b857806318160ddd146102da57806323b872dd146102fd57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506040805180820182526005815264426c75657960d81b6020820152905161027f9190612f0d565b60405180910390f35b34801561029457600080fd5b506102a86102a3366004612f58565b6107e2565b604051901515815260200161027f565b3480156102c457600080fd5b506102d86102d3366004612f98565b6107f9565b005b3480156102e657600080fd5b506102ef61095b565b60405190815260200161027f565b34801561030957600080fd5b506102a8610318366004612fd1565b61097d565b34801561032957600080fd5b506102ef6109a0565b34801561033e57600080fd5b506102a861034d366004613012565b6000546001600160a01b0391821691161490565b34801561036d57600080fd5b506040516009815260200161027f565b34801561038957600080fd5b506102d861039836600461302f565b6109f4565b3480156103a957600080fd5b506103df6103b836600461308b565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161027f565b34801561040b57600080fd5b506102d861041a366004612fd1565b610b4d565b34801561042b57600080fd5b506102a861043a366004612f58565b610c4a565b34801561044b57600080fd5b506102a861045a366004613012565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561048457600080fd5b506102d86104933660046130a6565b610c6b565b3480156104a457600080fd5b506102d86104b33660046130ff565b610d87565b3480156104c457600080fd5b506102d86104d3366004613138565b610e40565b6102d86104e6366004613164565b610ec3565b3480156104f757600080fd5b506102d861050636600461319b565b61130f565b34801561051757600080fd5b506102ef60035481565b34801561052d57600080fd5b506102d861053c366004613204565b6113ab565b34801561054d57600080fd5b506102ef61055c366004613012565b6001600160a01b031660009081526004602052604090205490565b34801561058357600080fd5b506102d86115b5565b34801561059857600080fd5b506102ef60025481565b3480156105ae57600080fd5b506102d86105bd366004613270565b611620565b3480156105ce57600080fd5b506000546105e2906001600160a01b031681565b6040516001600160a01b03909116815260200161027f565b34801561060657600080fd5b506102d8610615366004613289565b6116dc565b34801561062657600080fd5b506102a8610635366004612f58565b611768565b34801561064657600080fd5b506105e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561067a57600080fd5b506102a8610689366004612f58565b6117e2565b34801561069a57600080fd5b506102d86106a9366004613012565b6117ef565b3480156106ba57600080fd5b506102d86106c93660046130ff565b61183b565b3480156106da57600080fd5b506102ef6106e93660046132aa565b6118f4565b3480156106fa57600080fd5b506102d8610709366004613012565b61191f565b34801561071a57600080fd5b506102d8610729366004613012565b611965565b34801561073a57600080fd5b506102d86107493660046132d8565b611a1c565b34801561075a57600080fd5b506105e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561078e57600080fd5b506102d861079d3660046130ff565b611bb9565b3480156107ae57600080fd5b506102d86107bd3660046132d8565b611c72565b3480156107ce57600080fd5b506102a86107dd366004613012565b611d81565b60006107ef338484611d9f565b5060015b92915050565b61080233611d81565b6108275760405162461bcd60e51b815260040161081e906132fa565b60405180910390fd5b61083f60146108396127106003611ebb565b90611ec7565b6108538261084d8686611ed3565b90611ed3565b11156108a15760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e203135250000000000604482015260640161081e565b6000600b60008660028111156108b9576108b961331f565b60028111156108ca576108ca61331f565b81526020810191909152604001600020600181018590558381556002810183905590506108fb8261084d8686611ed3565b60038201558460028111156109125761091261331f565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b60006109696009600a61342f565b610978906461f313f88061343e565b905090565b600061098a843384611edf565b610995848484611f59565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610978906109df6009600a61342f565b6109ee906461f313f88061343e565b906122fe565b6109fd33611d81565b610a195760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b038416610a3f5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038316610a655760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038216610a8b5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038116610ab15760405162461bcd60e51b815260040161081e9061345d565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610b5633611d81565b610b725760405162461bcd60e51b815260040161081e906132fa565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190613483565b90506000610bf16127106108398486611ebb565b9050610c076001600160a01b038616858361230a565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b8910161094c565b60006107ef338484610c5c33886118f4565b610c66919061349c565b611d9f565b610c7433611d81565b610c905760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b038316610cb65760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038216610cdc5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038116610d025760405162461bcd60e51b815260040161081e9061345d565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610d9033611d81565b610dac5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610dec5760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610e4933611d81565b610e655760405162461bcd60e51b815260040161081e906132fa565b601483905560138290556012819055610e828161084d8585611ed3565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610d7a565b610ecc33611d81565b610ee85760405162461bcd60e51b815260040161081e906132fa565b826110ce5780610f3a5760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c0000000000604482015260640161081e565b3491507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf91906134d9565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b50505050506110c97f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b991906134d9565b6001600160a01b0316919061230a565b611258565b80156111985733600090815260046020526040812080548492906110f39084906134f6565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600460205260408120805484929061114090849061349c565b90915550506040518281527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169033906000805160206136378339815191529060200160405180910390a3611258565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600090815260046020526040812080548492906111e09084906134f6565b9091555050336000908152600460205260408120805484929061120490849061349c565b909155505060405182815233906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906000805160206136378339815191529060200160405180910390a35b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161130291815260200190565b60405180910390a3505050565b61131833611d81565b6113345760405162461bcd60e51b815260040161081e906132fa565b801515600f60019054906101000a900460ff161515036113665760405162461bcd60e51b815260040161081e906134b4565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6113b433611d81565b6113d05760405162461bcd60e51b815260040161081e906132fa565b828181146114205760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d617463686564000000000000000000604482015260640161081e565b6000805b8281101561154d5784848281811061143e5761143e61350d565b905060200201356004600089898581811061145b5761145b61350d565b90506020020160208101906114709190613012565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461149f919061349c565b9091555085905084828181106114b7576114b761350d565b90506020020135826114c9919061349c565b91508686828181106114dd576114dd61350d565b90506020020160208101906114f29190613012565b6001600160a01b03163360008051602061363783398151915287878581811061151d5761151d61350d565b9050602002013560405161153391815260200190565b60405180910390a38061154581613523565b915050611424565b50336000908152600460205260408120805483929061156d9084906134f6565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6115be33611d81565b6115da5760405162461bcd60e51b815260040161081e906132fa565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61162933611d81565b6116455760405162461bcd60e51b815260040161081e906132fa565b60095460ff161561168b5760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b604482015260640161081e565b6009805460ff19166001179055600a546000036116b0576116ac4282611ed3565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6116e533611d81565b6117015760405162461bcd60e51b815260040161081e906132fa565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b60008061177533856118f4565b9050828110156117d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161081e565b6109953385858403611d9f565b60006107ef338484611f59565b6117f833611d81565b6118145760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61184433611d81565b6118605760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036118a05760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61192833611d81565b6119445760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03166000908152600160205260409020805460ff19169055565b61196e33611d81565b61198a5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b0381166119b05760405162461bcd60e51b815260040161081e9061345d565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611a2533611d81565b611a415760405162461bcd60e51b815260040161081e906132fa565b6001821015611aa55760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b606482015260840161081e565b6207a120811015611b085760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b606482015260840161081e565b60006298968083611b1b6009600a61342f565b611b2a906461f313f88061343e565b611b34919061343e565b611b3e919061353c565b905060006298968083611b536009600a61342f565b611b62906461f313f88061343e565b611b6c919061343e565b611b76919061353c565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610b3f565b611bc233611d81565b611bde5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611c1e5760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611c7b33611d81565b611c975760405162461bcd60e51b815260040161081e906132fa565b476000611ca8836108398487611ebb565b90506000611cb7826004611ec7565b601954909150611cd0906001600160a01b031682612361565b601a54611ce6906001600160a01b031682612361565b601b54611cfc906001600160a01b031682612361565b601c54611d12906001600160a01b031682612361565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611e015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081e565b6001600160a01b038216611e625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081e565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611302565b6000610999828461343e565b6000610999828461353c565b6000610999828461349c565b6000611eeb84846118f4565b90506000198114611f535781811015611f465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161081e565b611f538484848403611d9f565b50505050565b611f64838383612405565b6001600160a01b03831660009081526007602052604090205460019060ff1680611fa657506001600160a01b03831660009081526007602052604090205460ff165b15611fb35750600061210a565b60095460ff16611ff95760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b604482015260640161081e565b60025482111561205c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161081e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461210a576003546001600160a01b0384166000908152600460205260409020546120bc90849061349c565b111561210a5760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d69740000000000604482015260640161081e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316036121bb57600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03161415801561218d5750600a544211155b156121b6576001600160a01b0384166000908152600660205260409020805460ff191660011790555b612200565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036121fc57506001612200565b5060025b600d5461220e906001611ed3565b600d5561221b8584612595565b156122315761222b601054612632565b6000600d555b6001600160a01b03851660009081526004602052604090205461225490846122fe565b6001600160a01b0386166000908152600460205260408120919091558261227b5783612286565b612286868584612713565b6001600160a01b0386166000908152600460205260409020549091506122ac9082611ed3565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613637833981519152906122ee9085815260200190565b60405180910390a3505050505050565b600061099982846134f6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261235c9084906129d9565b505050565b8060000361236d575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146123ba576040519150601f19603f3d011682016040523d82523d6000602084013e6123bf565b606091505b505090508061235c5760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b604482015260640161081e565b6001600160a01b03831660009081526008602052604090205460ff161561245b5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161081e565b6001600160a01b03821660009081526008602052604090205460ff16156124b15760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161081e565b600081116125135760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081e565b6001600160a01b03831660009081526004602052604090205481111561235c5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161081e565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156125c95750600c5460ff165b80156125d25750815b80156125e25750600e54600d5410155b80156125eb5750805b801561262957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff1916600117905560155460135460009161265c916002916108399182908790611ebb565b9050600061266a83836122fe565b90504761267682612aab565b600061268247836122fe565b905060006126a861269f6002601354611ec790919063ffffffff16565b601554906122fe565b905084156126d7576126d7856126d260026108398561083960135489611ebb90919063ffffffff16565b612c6b565b601854601254612701916001600160a01b0316906126fc908490610839908790611ebb565b612361565b5050600f805460ff1916905550505050565b600080600b600084600281111561272c5761272c61331f565b600281111561273d5761273d61331f565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156127aa5750600f54610100900460ff165b6127b85781606001516127c5565b6127c560646127106134f6565b9050806000036127d9578492505050610999565b60006127eb6127106108398885611ebb565b9050600061280a83610839866020015185611ebb90919063ffffffff16565b9050600061282984610839876000015186611ebb90919063ffffffff16565b9050600061283b826109ee86866122fe565b905082156128e05761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd5461287a9084611ed3565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c1690600080516020613637833981519152906128d79087815260200190565b60405180910390a35b8115612959576017546001600160a01b031660009081526004602052604090205461290b9083611ed3565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613637833981519152910160405180910390a35b80156129c157306000908152600460205260409020546129799082611ed3565b30600081815260046020526040908190209290925590516001600160a01b038c1690600080516020613637833981519152906129b89085815260200190565b60405180910390a35b6129cb89856122fe565b9a9950505050505050505050565b6000612a2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d519092919063ffffffff16565b80519091501561235c5780806020019051810190612a4c919061355e565b61235c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ae057612ae061350d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8291906134d9565b81600181518110612b9557612b9561350d565b60200260200101906001600160a01b031690816001600160a01b031681525050612be0307f000000000000000000000000000000000000000000000000000000000000000084611d9f565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612c3590859060009086903090429060040161357b565b600060405180830381600087803b158015612c4f57600080fd5b505af1158015612c63573d6000803e3d6000fd5b505050505050565b612c96307f000000000000000000000000000000000000000000000000000000000000000084611d9f565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612d25573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d4a91906135ec565b5050505050565b6060612d608484600085612d68565b949350505050565b606082471015612dc95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161081e565b600080866001600160a01b03168587604051612de5919061361a565b60006040518083038185875af1925050503d8060008114612e22576040519150601f19603f3d011682016040523d82523d6000602084013e612e27565b606091505b5091509150612e3887838387612e43565b979650505050505050565b60608315612eb2578251600003612eab576001600160a01b0385163b612eab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081e565b5081612d60565b612d608383815115612ec75781518083602001fd5b8060405162461bcd60e51b815260040161081e9190612f0d565b60005b83811015612efc578181015183820152602001612ee4565b83811115611f535750506000910152565b6020815260008251806020840152612f2c816040850160208701612ee1565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612f5557600080fd5b50565b60008060408385031215612f6b57600080fd5b8235612f7681612f40565b946020939093013593505050565b803560038110612f9357600080fd5b919050565b60008060008060808587031215612fae57600080fd5b612fb785612f84565b966020860135965060408601359560600135945092505050565b600080600060608486031215612fe657600080fd5b8335612ff181612f40565b9250602084013561300181612f40565b929592945050506040919091013590565b60006020828403121561302457600080fd5b813561099981612f40565b6000806000806080858703121561304557600080fd5b843561305081612f40565b9350602085013561306081612f40565b9250604085013561307081612f40565b9150606085013561308081612f40565b939692955090935050565b60006020828403121561309d57600080fd5b61099982612f84565b6000806000606084860312156130bb57600080fd5b83356130c681612f40565b925060208401356130d681612f40565b915060408401356130e681612f40565b809150509250925092565b8015158114612f5557600080fd5b6000806040838503121561311257600080fd5b823561311d81612f40565b9150602083013561312d816130f1565b809150509250929050565b60008060006060848603121561314d57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561317957600080fd5b8335613184816130f1565b92506020840135915060408401356130e6816130f1565b6000602082840312156131ad57600080fd5b8135610999816130f1565b60008083601f8401126131ca57600080fd5b50813567ffffffffffffffff8111156131e257600080fd5b6020830191508360208260051b85010111156131fd57600080fd5b9250929050565b6000806000806040858703121561321a57600080fd5b843567ffffffffffffffff8082111561323257600080fd5b61323e888389016131b8565b9096509450602087013591508082111561325757600080fd5b50613264878288016131b8565b95989497509550505050565b60006020828403121561328257600080fd5b5035919050565b6000806000806080858703121561329f57600080fd5b8435612fb7816130f1565b600080604083850312156132bd57600080fd5b82356132c881612f40565b9150602083013561312d81612f40565b600080604083850312156132eb57600080fd5b50508035926020909101359150565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561338657816000190482111561336c5761336c613335565b8085161561337957918102915b93841c9390800290613350565b509250929050565b60008261339d575060016107f3565b816133aa575060006107f3565b81600181146133c057600281146133ca576133e6565b60019150506107f3565b60ff8411156133db576133db613335565b50506001821b6107f3565b5060208310610133831016604e8410600b8410161715613409575081810a6107f3565b613413838361334b565b806000190482111561342757613427613335565b029392505050565b600061099960ff84168361338e565b600081600019048311821515161561345857613458613335565b500290565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b60006020828403121561349557600080fd5b5051919050565b600082198211156134af576134af613335565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6000602082840312156134eb57600080fd5b815161099981612f40565b60008282101561350857613508613335565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161353557613535613335565b5060010190565b60008261355957634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561357057600080fd5b8151610999816130f1565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135cb5784516001600160a01b0316835293830193918301916001016135a6565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561360157600080fd5b8351925060208401519150604084015190509250925092565b6000825161362c818460208701612ee1565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220667b80dec95551baa0f6645f3d73d62fdf3d863355fac5517df504ec3cca48dd64736f6c634300080e0033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806370a082311161012e578063b6a5d7de116100ab578063f319ae771161006f578063f319ae771461072e578063f887ea401461074e578063fac1b9bc14610782578063fc5ea5e6146107a2578063fe9fbb80146107c257600080fd5b8063b6a5d7de1461068e578063b9a45aac146106ae578063dd62ed3e146106ce578063f0b37c04146106ee578063f2fde38b1461070e57600080fd5b80638e5c3ad3116100f25780638e5c3ad3146105fa57806395d89b411461024b578063a457c2d71461061a578063a8aa1b311461063a578063a9059cbb1461066e57600080fd5b806370a0823114610541578063715018a6146105775780637d1db4a51461058c57806382aa7c68146105a25780638da5cb5b146105c257600080fd5b806339264b66116101bc5780634a5a863a116101805780634a5a863a146104b8578063569c9b33146104d85780636b7f8b90146104eb5780636c0a24eb1461050b578063706f69371461052157600080fd5b806339264b66146103ff578063395093511461041f5780633bbac5791461043f57806340005fbe14610478578063455a43961461049857600080fd5b80632b112e49116102035780632b112e491461031d5780632f54bf6e14610332578063313ce567146103615780633385f9aa1461037d578063357c13541461039d57600080fd5b806306fdde031461024b578063095ea7b3146102885780630eefe44b146102b857806318160ddd146102da57806323b872dd146102fd57600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506040805180820182526005815264426c75657960d81b6020820152905161027f9190612f0d565b60405180910390f35b34801561029457600080fd5b506102a86102a3366004612f58565b6107e2565b604051901515815260200161027f565b3480156102c457600080fd5b506102d86102d3366004612f98565b6107f9565b005b3480156102e657600080fd5b506102ef61095b565b60405190815260200161027f565b34801561030957600080fd5b506102a8610318366004612fd1565b61097d565b34801561032957600080fd5b506102ef6109a0565b34801561033e57600080fd5b506102a861034d366004613012565b6000546001600160a01b0391821691161490565b34801561036d57600080fd5b506040516009815260200161027f565b34801561038957600080fd5b506102d861039836600461302f565b6109f4565b3480156103a957600080fd5b506103df6103b836600461308b565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161027f565b34801561040b57600080fd5b506102d861041a366004612fd1565b610b4d565b34801561042b57600080fd5b506102a861043a366004612f58565b610c4a565b34801561044b57600080fd5b506102a861045a366004613012565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561048457600080fd5b506102d86104933660046130a6565b610c6b565b3480156104a457600080fd5b506102d86104b33660046130ff565b610d87565b3480156104c457600080fd5b506102d86104d3366004613138565b610e40565b6102d86104e6366004613164565b610ec3565b3480156104f757600080fd5b506102d861050636600461319b565b61130f565b34801561051757600080fd5b506102ef60035481565b34801561052d57600080fd5b506102d861053c366004613204565b6113ab565b34801561054d57600080fd5b506102ef61055c366004613012565b6001600160a01b031660009081526004602052604090205490565b34801561058357600080fd5b506102d86115b5565b34801561059857600080fd5b506102ef60025481565b3480156105ae57600080fd5b506102d86105bd366004613270565b611620565b3480156105ce57600080fd5b506000546105e2906001600160a01b031681565b6040516001600160a01b03909116815260200161027f565b34801561060657600080fd5b506102d8610615366004613289565b6116dc565b34801561062657600080fd5b506102a8610635366004612f58565b611768565b34801561064657600080fd5b506105e27f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d81565b34801561067a57600080fd5b506102a8610689366004612f58565b6117e2565b34801561069a57600080fd5b506102d86106a9366004613012565b6117ef565b3480156106ba57600080fd5b506102d86106c93660046130ff565b61183b565b3480156106da57600080fd5b506102ef6106e93660046132aa565b6118f4565b3480156106fa57600080fd5b506102d8610709366004613012565b61191f565b34801561071a57600080fd5b506102d8610729366004613012565b611965565b34801561073a57600080fd5b506102d86107493660046132d8565b611a1c565b34801561075a57600080fd5b506105e27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561078e57600080fd5b506102d861079d3660046130ff565b611bb9565b3480156107ae57600080fd5b506102d86107bd3660046132d8565b611c72565b3480156107ce57600080fd5b506102a86107dd366004613012565b611d81565b60006107ef338484611d9f565b5060015b92915050565b61080233611d81565b6108275760405162461bcd60e51b815260040161081e906132fa565b60405180910390fd5b61083f60146108396127106003611ebb565b90611ec7565b6108538261084d8686611ed3565b90611ed3565b11156108a15760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e203135250000000000604482015260640161081e565b6000600b60008660028111156108b9576108b961331f565b60028111156108ca576108ca61331f565b81526020810191909152604001600020600181018590558381556002810183905590506108fb8261084d8686611ed3565b60038201558460028111156109125761091261331f565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b60006109696009600a61342f565b610978906461f313f88061343e565b905090565b600061098a843384611edf565b610995848484611f59565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610978906109df6009600a61342f565b6109ee906461f313f88061343e565b906122fe565b6109fd33611d81565b610a195760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b038416610a3f5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038316610a655760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038216610a8b5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038116610ab15760405162461bcd60e51b815260040161081e9061345d565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610b5633611d81565b610b725760405162461bcd60e51b815260040161081e906132fa565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190613483565b90506000610bf16127106108398486611ebb565b9050610c076001600160a01b038616858361230a565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b8910161094c565b60006107ef338484610c5c33886118f4565b610c66919061349c565b611d9f565b610c7433611d81565b610c905760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b038316610cb65760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038216610cdc5760405162461bcd60e51b815260040161081e9061345d565b6001600160a01b038116610d025760405162461bcd60e51b815260040161081e9061345d565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610d9033611d81565b610dac5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610dec5760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610e4933611d81565b610e655760405162461bcd60e51b815260040161081e906132fa565b601483905560138290556012819055610e828161084d8585611ed3565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610d7a565b610ecc33611d81565b610ee85760405162461bcd60e51b815260040161081e906132fa565b826110ce5780610f3a5760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c0000000000604482015260640161081e565b3491507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf91906134d9565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b50505050506110c97f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b991906134d9565b6001600160a01b0316919061230a565b611258565b80156111985733600090815260046020526040812080548492906110f39084906134f6565b90915550506001600160a01b037f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d166000908152600460205260408120805484929061114090849061349c565b90915550506040518281527f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b03169033906000805160206136378339815191529060200160405180910390a3611258565b6001600160a01b037f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d16600090815260046020526040812080548492906111e09084906134f6565b9091555050336000908152600460205260408120805484929061120490849061349c565b909155505060405182815233906001600160a01b037f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d16906000805160206136378339815191529060200160405180910390a35b7f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161130291815260200190565b60405180910390a3505050565b61131833611d81565b6113345760405162461bcd60e51b815260040161081e906132fa565b801515600f60019054906101000a900460ff161515036113665760405162461bcd60e51b815260040161081e906134b4565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6113b433611d81565b6113d05760405162461bcd60e51b815260040161081e906132fa565b828181146114205760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d617463686564000000000000000000604482015260640161081e565b6000805b8281101561154d5784848281811061143e5761143e61350d565b905060200201356004600089898581811061145b5761145b61350d565b90506020020160208101906114709190613012565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461149f919061349c565b9091555085905084828181106114b7576114b761350d565b90506020020135826114c9919061349c565b91508686828181106114dd576114dd61350d565b90506020020160208101906114f29190613012565b6001600160a01b03163360008051602061363783398151915287878581811061151d5761151d61350d565b9050602002013560405161153391815260200190565b60405180910390a38061154581613523565b915050611424565b50336000908152600460205260408120805483929061156d9084906134f6565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6115be33611d81565b6115da5760405162461bcd60e51b815260040161081e906132fa565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61162933611d81565b6116455760405162461bcd60e51b815260040161081e906132fa565b60095460ff161561168b5760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b604482015260640161081e565b6009805460ff19166001179055600a546000036116b0576116ac4282611ed3565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6116e533611d81565b6117015760405162461bcd60e51b815260040161081e906132fa565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b60008061177533856118f4565b9050828110156117d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161081e565b6109953385858403611d9f565b60006107ef338484611f59565b6117f833611d81565b6118145760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61184433611d81565b6118605760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036118a05760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61192833611d81565b6119445760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03166000908152600160205260409020805460ff19169055565b61196e33611d81565b61198a5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b0381166119b05760405162461bcd60e51b815260040161081e9061345d565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611a2533611d81565b611a415760405162461bcd60e51b815260040161081e906132fa565b6001821015611aa55760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b606482015260840161081e565b6207a120811015611b085760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b606482015260840161081e565b60006298968083611b1b6009600a61342f565b611b2a906461f313f88061343e565b611b34919061343e565b611b3e919061353c565b905060006298968083611b536009600a61342f565b611b62906461f313f88061343e565b611b6c919061343e565b611b76919061353c565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610b3f565b611bc233611d81565b611bde5760405162461bcd60e51b815260040161081e906132fa565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611c1e5760405162461bcd60e51b815260040161081e906134b4565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611c7b33611d81565b611c975760405162461bcd60e51b815260040161081e906132fa565b476000611ca8836108398487611ebb565b90506000611cb7826004611ec7565b601954909150611cd0906001600160a01b031682612361565b601a54611ce6906001600160a01b031682612361565b601b54611cfc906001600160a01b031682612361565b601c54611d12906001600160a01b031682612361565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611e015760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081e565b6001600160a01b038216611e625760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081e565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611302565b6000610999828461343e565b6000610999828461353c565b6000610999828461349c565b6000611eeb84846118f4565b90506000198114611f535781811015611f465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161081e565b611f538484848403611d9f565b50505050565b611f64838383612405565b6001600160a01b03831660009081526007602052604090205460019060ff1680611fa657506001600160a01b03831660009081526007602052604090205460ff165b15611fb35750600061210a565b60095460ff16611ff95760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b604482015260640161081e565b60025482111561205c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161081e565b7f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b0316836001600160a01b03161461210a576003546001600160a01b0384166000908152600460205260409020546120bc90849061349c565b111561210a5760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d69740000000000604482015260640161081e565b60007f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b0316856001600160a01b0316036121bb57600090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b03161415801561218d5750600a544211155b156121b6576001600160a01b0384166000908152600660205260409020805460ff191660011790555b612200565b7f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b0316846001600160a01b0316036121fc57506001612200565b5060025b600d5461220e906001611ed3565b600d5561221b8584612595565b156122315761222b601054612632565b6000600d555b6001600160a01b03851660009081526004602052604090205461225490846122fe565b6001600160a01b0386166000908152600460205260408120919091558261227b5783612286565b612286868584612713565b6001600160a01b0386166000908152600460205260409020549091506122ac9082611ed3565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613637833981519152906122ee9085815260200190565b60405180910390a3505050505050565b600061099982846134f6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261235c9084906129d9565b505050565b8060000361236d575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146123ba576040519150601f19603f3d011682016040523d82523d6000602084013e6123bf565b606091505b505090508061235c5760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b604482015260640161081e565b6001600160a01b03831660009081526008602052604090205460ff161561245b5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161081e565b6001600160a01b03821660009081526008602052604090205460ff16156124b15760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161081e565b600081116125135760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081e565b6001600160a01b03831660009081526004602052604090205481111561235c5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161081e565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156125c95750600c5460ff165b80156125d25750815b80156125e25750600e54600d5410155b80156125eb5750805b801561262957507f0000000000000000000000003a00d34d8ecb36f8ec87ae050d699924fdaef54d6001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff1916600117905560155460135460009161265c916002916108399182908790611ebb565b9050600061266a83836122fe565b90504761267682612aab565b600061268247836122fe565b905060006126a861269f6002601354611ec790919063ffffffff16565b601554906122fe565b905084156126d7576126d7856126d260026108398561083960135489611ebb90919063ffffffff16565b612c6b565b601854601254612701916001600160a01b0316906126fc908490610839908790611ebb565b612361565b5050600f805460ff1916905550505050565b600080600b600084600281111561272c5761272c61331f565b600281111561273d5761273d61331f565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156127aa5750600f54610100900460ff165b6127b85781606001516127c5565b6127c560646127106134f6565b9050806000036127d9578492505050610999565b60006127eb6127106108398885611ebb565b9050600061280a83610839866020015185611ebb90919063ffffffff16565b9050600061282984610839876000015186611ebb90919063ffffffff16565b9050600061283b826109ee86866122fe565b905082156128e05761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd5461287a9084611ed3565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c1690600080516020613637833981519152906128d79087815260200190565b60405180910390a35b8115612959576017546001600160a01b031660009081526004602052604090205461290b9083611ed3565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613637833981519152910160405180910390a35b80156129c157306000908152600460205260409020546129799082611ed3565b30600081815260046020526040908190209290925590516001600160a01b038c1690600080516020613637833981519152906129b89085815260200190565b60405180910390a35b6129cb89856122fe565b9a9950505050505050505050565b6000612a2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d519092919063ffffffff16565b80519091501561235c5780806020019051810190612a4c919061355e565b61235c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161081e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ae057612ae061350d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8291906134d9565b81600181518110612b9557612b9561350d565b60200260200101906001600160a01b031690816001600160a01b031681525050612be0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611d9f565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612c3590859060009086903090429060040161357b565b600060405180830381600087803b158015612c4f57600080fd5b505af1158015612c63573d6000803e3d6000fd5b505050505050565b612c96307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611d9f565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612d25573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d4a91906135ec565b5050505050565b6060612d608484600085612d68565b949350505050565b606082471015612dc95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161081e565b600080866001600160a01b03168587604051612de5919061361a565b60006040518083038185875af1925050503d8060008114612e22576040519150601f19603f3d011682016040523d82523d6000602084013e612e27565b606091505b5091509150612e3887838387612e43565b979650505050505050565b60608315612eb2578251600003612eab576001600160a01b0385163b612eab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161081e565b5081612d60565b612d608383815115612ec75781518083602001fd5b8060405162461bcd60e51b815260040161081e9190612f0d565b60005b83811015612efc578181015183820152602001612ee4565b83811115611f535750506000910152565b6020815260008251806020840152612f2c816040850160208701612ee1565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612f5557600080fd5b50565b60008060408385031215612f6b57600080fd5b8235612f7681612f40565b946020939093013593505050565b803560038110612f9357600080fd5b919050565b60008060008060808587031215612fae57600080fd5b612fb785612f84565b966020860135965060408601359560600135945092505050565b600080600060608486031215612fe657600080fd5b8335612ff181612f40565b9250602084013561300181612f40565b929592945050506040919091013590565b60006020828403121561302457600080fd5b813561099981612f40565b6000806000806080858703121561304557600080fd5b843561305081612f40565b9350602085013561306081612f40565b9250604085013561307081612f40565b9150606085013561308081612f40565b939692955090935050565b60006020828403121561309d57600080fd5b61099982612f84565b6000806000606084860312156130bb57600080fd5b83356130c681612f40565b925060208401356130d681612f40565b915060408401356130e681612f40565b809150509250925092565b8015158114612f5557600080fd5b6000806040838503121561311257600080fd5b823561311d81612f40565b9150602083013561312d816130f1565b809150509250929050565b60008060006060848603121561314d57600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561317957600080fd5b8335613184816130f1565b92506020840135915060408401356130e6816130f1565b6000602082840312156131ad57600080fd5b8135610999816130f1565b60008083601f8401126131ca57600080fd5b50813567ffffffffffffffff8111156131e257600080fd5b6020830191508360208260051b85010111156131fd57600080fd5b9250929050565b6000806000806040858703121561321a57600080fd5b843567ffffffffffffffff8082111561323257600080fd5b61323e888389016131b8565b9096509450602087013591508082111561325757600080fd5b50613264878288016131b8565b95989497509550505050565b60006020828403121561328257600080fd5b5035919050565b6000806000806080858703121561329f57600080fd5b8435612fb7816130f1565b600080604083850312156132bd57600080fd5b82356132c881612f40565b9150602083013561312d81612f40565b600080604083850312156132eb57600080fd5b50508035926020909101359150565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561338657816000190482111561336c5761336c613335565b8085161561337957918102915b93841c9390800290613350565b509250929050565b60008261339d575060016107f3565b816133aa575060006107f3565b81600181146133c057600281146133ca576133e6565b60019150506107f3565b60ff8411156133db576133db613335565b50506001821b6107f3565b5060208310610133831016604e8410600b8410161715613409575081810a6107f3565b613413838361334b565b806000190482111561342757613427613335565b029392505050565b600061099960ff84168361338e565b600081600019048311821515161561345857613458613335565b500290565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b60006020828403121561349557600080fd5b5051919050565b600082198211156134af576134af613335565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6000602082840312156134eb57600080fd5b815161099981612f40565b60008282101561350857613508613335565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161353557613535613335565b5060010190565b60008261355957634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561357057600080fd5b8151610999816130f1565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135cb5784516001600160a01b0316835293830193918301916001016135a6565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561360157600080fd5b8351925060208401519150604084015190509250925092565b6000825161362c818460208701612ee1565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220667b80dec95551baa0f6645f3d73d62fdf3d863355fac5517df504ec3cca48dd64736f6c634300080e0033

Deployed Bytecode Sourcemap

13791:19658:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18230:67;;;;;;;;;;-1:-1:-1;18290:5:0;;;;;;;;;;;-1:-1:-1;;;18290:5:0;;;;18230:67;;;;18290:5;18230:67;:::i;:::-;;;;;;;;19042:159;;;;;;;;;;-1:-1:-1;19042:159:0;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;19042:159:0;1121:187:1;28029:615:0;;;;;;;;;;-1:-1:-1;28029:615:0;;;;;:::i;:::-;;:::i;:::-;;18453:84;;;;;;;;;;;;;:::i;:::-;;;2049:25:1;;;2037:2;2022:18;18453:84:0;1903:177:1;21102:249:0;;;;;;;;;;-1:-1:-1;21102:249:0;;;;;:::i;:::-;;:::i;19213:121::-;;;;;;;;;;;;;:::i;11982:103::-;;;;;;;;;;-1:-1:-1;11982:103:0;;;;;:::i;:::-;12037:4;12072:5;-1:-1:-1;;;;;12061:16:0;;;12072:5;;12061:16;;11982:103;18380:67;;;;;;;;;;-1:-1:-1;18380:67:0;;14026:1;2940:36:1;;2928:2;2913:18;18380:67:0;2798:184:1;29148:552:0;;;;;;;;;;-1:-1:-1;29148:552:0;;;;;:::i;:::-;;:::i;14995:44::-;;;;;;;;;;-1:-1:-1;14995:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4118:25:1;;;4174:2;4159:18;;4152:34;;;;4202:18;;;4195:34;4260:2;4245:18;;4238:34;4105:3;4090:19;14995:44:0;3887:391:1;26636:404:0;;;;;;;;;;-1:-1:-1;26636:404:0;;;;;:::i;:::-;;:::i;21359:209::-;;;;;;;;;;-1:-1:-1;21359:209:0;;;;;:::i;:::-;;:::i;18932:102::-;;;;;;;;;;-1:-1:-1;18932:102:0;;;;;:::i;:::-;-1:-1:-1;;;;;19010:16:0;18986:4;19010:16;;;:6;:16;;;;;;;;;18932:102;28652:488;;;;;;;;;;-1:-1:-1;28652:488:0;;;;;:::i;:::-;;:::i;19615:267::-;;;;;;;;;;-1:-1:-1;19615:267:0;;;;;:::i;:::-;;:::i;27048:348::-;;;;;;;;;;-1:-1:-1;27048:348:0;;;;;:::i;:::-;;:::i;32634:812::-;;;;;;:::i;:::-;;:::i;20119:206::-;;;;;;;;;;-1:-1:-1;20119:206:0;;;;;:::i;:::-;;:::i;14257:66::-;;;;;;;;;;;;;;;;31941:685;;;;;;;;;;-1:-1:-1;31941:685:0;;;;;:::i;:::-;;:::i;18543:103::-;;;;;;;;;;-1:-1:-1;18543:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;18626:18:0;18609:7;18626:18;;;:9;:18;;;;;;;18543:103;12445:128;;;;;;;;;;;;;:::i;14188:62::-;;;;;;;;;;;;;;;;20333:316;;;;;;;;;;-1:-1:-1;20333:316:0;;;;;:::i;:::-;;:::i;11359:20::-;;;;;;;;;;-1:-1:-1;11359:20:0;;;;-1:-1:-1;;;;;11359:20:0;;;;;;-1:-1:-1;;;;;7842:32:1;;;7824:51;;7812:2;7797:18;11359:20:0;7678:203:1;20657:437:0;;;;;;;;;;-1:-1:-1;20657:437:0;;;;;:::i;:::-;;:::i;21576:407::-;;;;;;;;;;-1:-1:-1;21576:407:0;;;;;:::i;:::-;;:::i;14624:29::-;;;;;;;;;;;;;;;18652:139;;;;;;;;;;-1:-1:-1;18652:139:0;;;;;:::i;:::-;;:::i;11773:95::-;;;;;;;;;;-1:-1:-1;11773:95:0;;;;;:::i;:::-;;:::i;19342:265::-;;;;;;;;;;-1:-1:-1;19342:265:0;;;;;:::i;:::-;;:::i;18797:127::-;;;;;;;;;;-1:-1:-1;18797:127:0;;;;;:::i;:::-;;:::i;11876:98::-;;;;;;;;;;-1:-1:-1;11876:98:0;;;;;:::i;:::-;;:::i;12212:221::-;;;;;;;;;;-1:-1:-1;12212:221:0;;;;;:::i;:::-;;:::i;26080:548::-;;;;;;;;;;-1:-1:-1;26080:548:0;;;;;:::i;:::-;;:::i;14586:31::-;;;;;;;;;;;;;;;19890:221;;;;;;;;;;-1:-1:-1;19890:221:0;;;;;:::i;:::-;;:::i;27404:617::-;;;;;;;;;;-1:-1:-1;27404:617:0;;;;;:::i;:::-;;:::i;12093:107::-;;;;;;;;;;-1:-1:-1;12093:107:0;;;;;:::i;:::-;;:::i;19042:159::-;19117:4;19134:37;19143:10;19155:7;19164:6;19134:8;:37::i;:::-;-1:-1:-1;19189:4:0;19042:159;;;;;:::o;28029:615::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;;;;;;;;;28240:29:::1;28266:2;28240:21;14756:5;28259:1;28240:18;:21::i;:::-;:25:::0;::::1;:29::i;:::-;28187:49;28217:18:::0;28187:25:::1;:8:::0;28200:11;28187:12:::1;:25::i;:::-;:29:::0;::::1;:49::i;:::-;:82;;28179:122;;;::::0;-1:-1:-1;;;28179:122:0;;10009:2:1;28179:122:0::1;::::0;::::1;9991:21:1::0;10048:2;10028:18;;;10021:30;10087:29;10067:18;;;10060:57;10134:18;;28179:122:0::1;9807:351:1::0;28179:122:0::1;28312:15;28330:4;:21;28335:15;28330:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28330:21:0;28362:11:::1;::::0;::::1;:22:::0;;;28395:28;;;28434:13:::1;::::0;::::1;:34:::0;;;28330:21;-1:-1:-1;28494:49:0::1;28450:18:::0;28494:25:::1;28376:8:::0;28412:11;28494:12:::1;:25::i;:49::-;28479:12;::::0;::::1;:64:::0;28577:15;28565:71:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;;10497:25:1;;;10553:2;10538:18;;10531:34;;;10581:18;;;10574:34;;;28565:71:0::1;::::0;10485:2:1;10470:18;28565:71:0::1;;;;;;;;28168:476;28029:615:::0;;;;:::o;18453:84::-;18506:7;14090:15;14026:1;14090:2;:15;:::i;:::-;14074:32;;:12;:32;:::i;:::-;18516:19;;18453:84;:::o;21102:249::-;21225:4;21242:41;21258:4;21264:10;21276:6;21242:15;:41::i;:::-;21294:27;21304:4;21310:2;21314:6;21294:9;:27::i;:::-;-1:-1:-1;21339:4:0;21102:249;;;;;;:::o;19213:121::-;14139:42;19266:7;18626:18;;;:9;:18;;;;19293:33;;14090:15;14026:1;14090:2;:15;:::i;:::-;14074:32;;:12;:32;:::i;:::-;19293:16;;:33::i;29148:552::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29280:20:0;::::1;29272:45;;;;-1:-1:-1::0;;;29272:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29336:20:0;::::1;29328:45;;;;-1:-1:-1::0;;;29328:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29392:20:0;::::1;29384:45;;;;-1:-1:-1::0;;;29384:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29448:20:0;::::1;29440:45;;;;-1:-1:-1::0;;;29440:45:0::1;;;;;;;:::i;:::-;29496:14;:23:::0;;-1:-1:-1;;;;;29496:23:0;;::::1;-1:-1:-1::0;;;;;;29496:23:0;;::::1;::::0;::::1;::::0;;;29530:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29564:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29598:14:::1;:23:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29639:53:::1;::::0;;12917:34:1;;;12982:2;12967:18;;12960:43;;;;13019:18;;13012:43;;;;13086:2;13071:18;;13064:43;29639:53:0::1;::::0;12866:3:1;12851:19;29639:53:0::1;;;;;;;;29148:552:::0;;;;:::o;26636:404::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;26774:39:::1;::::0;-1:-1:-1;;;26774:39:0;;26807:4:::1;26774:39;::::0;::::1;7824:51:1::0;26757:14:0::1;::::0;-1:-1:-1;;;;;26774:24:0;::::1;::::0;::::1;::::0;7797:18:1;;26774:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26757:56:::0;-1:-1:-1;26824:24:0::1;26851:34;26879:5;26851:23;26757:56:::0;26862:11;26851:10:::1;:23::i;:34::-;26824:61:::0;-1:-1:-1;26896:56:0::1;-1:-1:-1::0;;;;;26896:27:0;::::1;26924:9:::0;26824:61;26896:27:::1;:56::i;:::-;26970:62;::::0;;-1:-1:-1;;;;;13499:32:1;;;13481:51;;13563:2;13548:18;;13541:34;;;26970:62:0;::::1;::::0;::::1;::::0;13454:18:1;26970:62:0::1;13307:274:1::0;21359:209:0;21447:4;21464:74;21473:10;21485:7;21527:10;21494:30;21504:10;21516:7;21494:9;:30::i;:::-;:43;;;;:::i;:::-;21464:8;:74::i;28652:488::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28778:24:0;::::1;28770:49;;;;-1:-1:-1::0;;;28770:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28838:24:0;::::1;28830:49;;;;-1:-1:-1::0;;;28830:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28898:22:0;::::1;28890:47;;;;-1:-1:-1::0;;;28890:47:0::1;;;;;;;:::i;:::-;28948:18;:31:::0;;-1:-1:-1;;;;;28948:31:0;;::::1;-1:-1:-1::0;;;;;;28948:31:0;;::::1;::::0;::::1;::::0;;;28990:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29032:16:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29077:55:::1;::::0;;13959:34:1;;;14024:2;14009:18;;14002:43;;;;14061:18;;;14054:43;29077:55:0::1;::::0;13909:2:1;13894:18;29077:55:0::1;;;;;;;;28652:488:::0;;;:::o;19615:267::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19716:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;19708:61:::1;;;;-1:-1:-1::0;;;19708:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19780:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;19780:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19834:40;;19780:36;;:23;19834:40:::1;::::0;::::1;19615:267:::0;;:::o;27048:348::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;27158:12:::1;:20:::0;;;27189:17:::1;:30:::0;;;27230:17:::1;:30:::0;;;27287:37:::1;27250:10:::0;27287:21:::1;27173:5:::0;27209:10;27287:9:::1;:21::i;:37::-;27271:13;:53:::0;27342:46:::1;::::0;;10497:25:1;;;10553:2;10538:18;;10531:34;;;10581:18;;;10574:34;;;27342:46:0::1;::::0;10485:2:1;10470:18;27342:46:0::1;10295:319:1::0;32634:812:0;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;32737:5:::1;32733:620;;32767:3;32759:43;;;::::0;-1:-1:-1;;;32759:43:0;;14650:2:1;32759:43:0::1;::::0;::::1;14632:21:1::0;14689:2;14669:18;;;14662:30;14728:29;14708:18;;;14701:57;14775:18;;32759:43:0::1;14448:351:1::0;32759:43:0::1;32826:9;32817:18;;32856:6;-1:-1:-1::0;;;;;32856:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32850:28:0::1;;32886:6;32850:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32910:48;32945:4;32951:6;32917;-1:-1:-1::0;;;;;32917:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32910:34:0::1;::::0;:48;:34:::1;:48::i;:::-;32733:620;;;32993:3;32990:352;;;33027:10;33017:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33042:6;;33017:21;:31:::1;::::0;33042:6;;33017:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;33077:4:0::1;33067:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33086:6;;33067:15;:25:::1;::::0;33086:6;;33067:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33116:34:0::1;::::0;2049:25:1;;;33137:4:0::1;-1:-1:-1::0;;;;;33116:34:0::1;::::0;33125:10:::1;::::0;-1:-1:-1;;;;;;;;;;;33116:34:0;2037:2:1;2022:18;33116:34:0::1;;;;;;;32990:352;;;-1:-1:-1::0;;;;;33203:4:0::1;33193:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33212:6;;33193:15;:25:::1;::::0;33212:6;;33193:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33247:10:0::1;33237:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33262:6;;33237:21;:31:::1;::::0;33262:6;;33237:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;33292:34:0::1;::::0;2049:25:1;;;33307:10:0::1;::::0;-1:-1:-1;;;;;33301:4:0::1;33292:34;::::0;-1:-1:-1;;;;;;;;;;;33292:34:0;2037:2:1;2022:18;33292:34:0::1;;;;;;;32990:352;33369:4;-1:-1:-1::0;;;;;33363:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33428:3;33397:35;;33413:5;33397:35;;;33420:6;33397:35;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;33397:35:0::1;;;;;;;;32634:812:::0;;;:::o;20119:206::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;20213:7:::1;20195:25;;:14;;;;;;;;;;;:25;;::::0;20187:49:::1;;;;-1:-1:-1::0;;;20187:49:0::1;;;;;;;:::i;:::-;20247:14;:24:::0;;-1:-1:-1;;20247:24:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;20289:28:::1;::::0;::::1;::::0;-1:-1:-1;;20289:28:0::1;20119:206:::0;:::o;31941:685::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;32069:8;32104:24;;::::1;32095:61;;;::::0;-1:-1:-1;;;32095:61:0;;15392:2:1;32095:61:0::1;::::0;::::1;15374:21:1::0;15431:2;15411:18;;;15404:30;15470:25;15450:18;;;15443:53;15513:18;;32095:61:0::1;15190:347:1::0;32095:61:0::1;32167:21;32218:9:::0;32213:289:::1;32237:6;32233:1;:10;32213:289;;;32373:7;;32381:1;32373:10;;;;;;;:::i;:::-;;;;;;;32347:9;:22;32357:8;;32366:1;32357:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32347:22:0::1;-1:-1:-1::0;;;;;32347:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32415:7:0;;-1:-1:-1;32415:7:0;32423:1;32415:10;;::::1;;;;;:::i;:::-;;;;;;;32398:27;;;;;:::i;:::-;;;32466:8;;32475:1;32466:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32445:45:0::1;32454:10;-1:-1:-1::0;;;;;;;;;;;32479:7:0;;32487:1;32479:10;;::::1;;;;;:::i;:::-;;;;;;;32445:45;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;32445:45:0::1;;;;;;;;32245:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32213:289;;;-1:-1:-1::0;32522:10:0::1;32512:21;::::0;;;:9:::1;:21;::::0;;;;:38;;32537:13;;32512:21;:38:::1;::::0;32537:13;;32512:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;32568:50:0::1;::::0;;15988:25:1;;;16044:2;16029:18;;16022:34;;;32584:10:0::1;::::0;32568:50:::1;::::0;15961:18:1;32568:50:0::1;;;;;;;32041:585;;31941:685:::0;;;;:::o;12445:128::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;12510:32:::1;::::0;12539:1:::1;7824:51:1::0;;12510:32:0::1;::::0;7812:2:1;7797:18;12510:32:0::1;;;;;;;12569:1;12553:18:::0;;-1:-1:-1;;;;;;12553:18:0::1;::::0;;12445:128::o;20333:316::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;20412:14:::1;::::0;::::1;;20411:15;20403:44;;;::::0;-1:-1:-1;;;20403:44:0;;16269:2:1;20403:44:0::1;::::0;::::1;16251:21:1::0;16308:2;16288:18;;;16281:30;-1:-1:-1;;;16327:18:1;;;16320:46;16383:18;;20403:44:0::1;16067:340:1::0;20403:44:0::1;20458:14;:21:::0;;-1:-1:-1;;20458:21:0::1;20475:4;20458:21;::::0;;20493:11:::1;::::0;20458:14:::1;20493:16:::0;20490:99:::1;;20562:27;:15;20582:6:::0;20562:19:::1;:27::i;:::-;20548:11;:41:::0;20490:99:::1;20615:16;::::0;::::1;::::0;;;::::1;20333:316:::0;:::o;20657:437::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;20810:21:::1;:32:::0;;-1:-1:-1;;20810:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20854:13:::1;:26:::0;;;20891:15:::1;:27:::0;;;20929:25:::1;:54:::0;;;21001:85:::1;::::0;;10497:25:1;;;10553:2;10538:18;;10531:34;;;10581:18;;;10574:34;;;21001:85:0::1;::::0;10485:2:1;10470:18;21001:85:0::1;;;;;;;20657:437:::0;;;;:::o;21576:407::-;21669:4;21686:24;21713:30;21723:10;21735:7;21713:9;:30::i;:::-;21686:57;;21782:15;21762:16;:35;;21754:85;;;;-1:-1:-1;;;21754:85:0;;16614:2:1;21754:85:0;;;16596:21:1;16653:2;16633:18;;;16626:30;16692:34;16672:18;;;16665:62;-1:-1:-1;;;16743:18:1;;;16736:35;16788:19;;21754:85:0;16412:401:1;21754:85:0;21875:65;21884:10;21896:7;21924:15;21905:16;:34;21875:8;:65::i;18652:139::-;18730:4;18737:40;18747:10;18759:9;18770:6;18737:9;:40::i;11773:95::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11834:19:0::1;;::::0;;;11856:4:::1;11834:19;::::0;;;;;;;:26;;-1:-1:-1;;11834:26:0::1;::::0;;::::1;::::0;;11773:95::o;19342:265::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19443:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;19435:61:::1;;;;-1:-1:-1::0;;;19435:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19507:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;19507:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19561:38;;19507:36;;:23;19561:38:::1;::::0;::::1;19342:265:::0;;:::o;18797:127::-;-1:-1:-1;;;;;18895:18:0;;;18878:7;18895:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18797:127::o;11876:98::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11939:19:0::1;11961:5;11939:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;11939:27:0::1;::::0;;11876:98::o;12212:221::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12297:17:0;::::1;12289:42;;;;-1:-1:-1::0;;;12289:42:0::1;;;;;;;:::i;:::-;12342:5;:11:::0;;-1:-1:-1;;;;;;12342:11:0::1;-1:-1:-1::0;;;;;12342:11:0;::::1;::::0;;::::1;::::0;;12364:19;;;-1:-1:-1;12364:19:0::1;::::0;;;;;;;;:26;;-1:-1:-1;;12364:26:0::1;::::0;;::::1;::::0;;;12406:25;;7824:51:1;;;12406:25:0::1;::::0;7797:18:1;12406:25:0::1;;;;;;;12212:221:::0;:::o;26080:548::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;26199:1:::1;26183:12;:17;;26175:72;;;::::0;-1:-1:-1;;;26175:72:0;;17236:2:1;26175:72:0::1;::::0;::::1;17218:21:1::0;17275:2;17255:18;;;17248:30;17314:34;17294:18;;;17287:62;-1:-1:-1;;;17365:18:1;;;17358:40;17415:19;;26175:72:0::1;17034:406:1::0;26175:72:0::1;26277:6;26266:7;:17;;26258:69;;;::::0;-1:-1:-1;;;26258:69:0;;17647:2:1;26258:69:0::1;::::0;::::1;17629:21:1::0;17686:2;17666:18;;;17659:30;17725:34;17705:18;;;17698:62;-1:-1:-1;;;17776:18:1;;;17769:37;17823:19;;26258:69:0::1;17445:403:1::0;26258:69:0::1;26338:18;26393:8;26376:12:::0;14090:15:::1;14026:1;14090:2;:15;:::i;:::-;14074:32;::::0;:12:::1;:32;:::i;:::-;26361:27;;;;:::i;:::-;26359:42;;;;:::i;:::-;26338:63:::0;-1:-1:-1;26412:22:0::1;26466:8;26454:7:::0;14090:15:::1;14026:1;14090:2;:15;:::i;:::-;14074:32;::::0;:12:::1;:32;:::i;:::-;26439:22;;;;:::i;:::-;26437:37;;;;:::i;:::-;26485:12;:25:::0;;;26521:16:::1;:33:::0;;;26572:48:::1;::::0;;15988:25:1;;;16044:2;16029:18;;16022:34;;;26521:33:0;;-1:-1:-1;26572:48:0::1;::::0;15961:18:1;26572:48:0::1;15814:248:1::0;19890:221:0;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19979:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;19971:50:::1;;;;-1:-1:-1::0;;;19971:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20032:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:25;;-1:-1:-1;;20032:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20075:28;;20032:25;;:16;20075:28:::1;::::0;::::1;19890:221:::0;;:::o;27404:617::-;11701:24;11714:10;11701:12;:24::i;:::-;11693:48;;;;-1:-1:-1;;;11693:48:0;;;;;;;:::i;:::-;27526:21:::1;27506:17;27585:43;27615:12:::0;27585:25:::1;27526:21:::0;27599:10;27585:13:::1;:25::i;:43::-;27558:70:::0;-1:-1:-1;27639:20:0::1;27662:23;27558:70:::0;27683:1:::1;27662:20;:23::i;:::-;27708:14;::::0;27639:46;;-1:-1:-1;27696:41:0::1;::::0;-1:-1:-1;;;;;27708:14:0::1;27639:46:::0;27696:11:::1;:41::i;:::-;27760:14;::::0;27748:41:::1;::::0;-1:-1:-1;;;;;27760:14:0::1;27776:12:::0;27748:11:::1;:41::i;:::-;27812:14;::::0;27800:41:::1;::::0;-1:-1:-1;;;;;27812:14:0::1;27828:12:::0;27800:11:::1;:41::i;:::-;27864:14;::::0;27852:41:::1;::::0;-1:-1:-1;;;;;27864:14:0::1;27880:12:::0;27852:11:::1;:41::i;:::-;27932:14;::::0;27948::::1;::::0;27964::::1;::::0;27980::::1;::::0;27911:102:::1;::::0;;-1:-1:-1;;;;;27932:14:0;;::::1;18372:34:1::0;;27948:14:0;;::::1;18437:2:1::0;18422:18;;18415:43;27964:14:0;;::::1;18474:18:1::0;;;18467:43;27980:14:0;;;::::1;18541:2:1::0;18526:18;;18519:43;18593:3;18578:19;;18571:35;;;27911:102:0;;::::1;::::0;;;;18321:3:1;27911:102:0;;::::1;27495:526;;;27404:617:::0;;:::o;12093:107::-;-1:-1:-1;;;;;12173:19:0;12149:4;12173:19;;;:14;:19;;;;;;;;;12093:107::o;21991:372::-;-1:-1:-1;;;;;22119:19:0;;22111:68;;;;-1:-1:-1;;;22111:68:0;;18819:2:1;22111:68:0;;;18801:21:1;18858:2;18838:18;;;18831:30;18897:34;18877:18;;;18870:62;-1:-1:-1;;;18948:18:1;;;18941:34;18992:19;;22111:68:0;18617:400:1;22111:68:0;-1:-1:-1;;;;;22198:21:0;;22190:68;;;;-1:-1:-1;;;22190:68:0;;19224:2:1;22190:68:0;;;19206:21:1;19263:2;19243:18;;;19236:30;19302:34;19282:18;;;19275:62;-1:-1:-1;;;19353:18:1;;;19346:32;19395:19;;22190:68:0;19022:398:1;22190:68:0;-1:-1:-1;;;;;22271:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22323:32;;2049:25:1;;;22323:32:0;;2022:18:1;22323:32:0;1903:177:1;1692:98:0;1750:7;1777:5;1781:1;1777;:5;:::i;1798:98::-;1856:7;1883:5;1887:1;1883;:5;:::i;1480:98::-;1538:7;1565:5;1569:1;1565;:5;:::i;22371:453::-;22506:24;22533:25;22543:5;22550:7;22533:9;:25::i;:::-;22506:52;;-1:-1:-1;;22573:16:0;:37;22569:248;;22655:6;22635:16;:26;;22627:68;;;;-1:-1:-1;;;22627:68:0;;19627:2:1;22627:68:0;;;19609:21:1;19666:2;19646:18;;;19639:30;19705:31;19685:18;;;19678:59;19754:18;;22627:68:0;19425:353:1;22627:68:0;22739:51;22748:5;22755:7;22783:6;22764:16;:25;22739:8;:51::i;:::-;22495:329;22371:453;;;:::o;22832:1517::-;22921:37;22932:6;22940:9;22951:6;22921:10;:37::i;:::-;-1:-1:-1;;;;;23005:21:0;;22971:12;23005:21;;;:13;:21;;;;;;22986:4;;23005:21;;;:49;;-1:-1:-1;;;;;;23030:24:0;;;;;;:13;:24;;;;;;;;23005:49;23001:429;;;-1:-1:-1;23081:5:0;23001:429;;;23129:14;;;;23121:44;;;;-1:-1:-1;;;23121:44:0;;19985:2:1;23121:44:0;;;19967:21:1;20024:2;20004:18;;;19997:30;-1:-1:-1;;;20043:18:1;;;20036:47;20100:18;;23121:44:0;19783:341:1;23121:44:0;23198:12;;23188:6;:22;;23180:75;;;;-1:-1:-1;;;23180:75:0;;20331:2:1;23180:75:0;;;20313:21:1;20370:2;20350:18;;;20343:30;20409:34;20389:18;;;20382:62;-1:-1:-1;;;20460:18:1;;;20453:38;20508:19;;23180:75:0;20129:404:1;23180:75:0;23287:4;-1:-1:-1;;;;;23274:17:0;:9;-1:-1:-1;;;;;23274:17:0;;23270:147;;23353:16;;-1:-1:-1;;;;;23320:20:0;;;;;;:9;:20;;;;;;:29;;23343:6;;23320:29;:::i;:::-;:49;;23312:89;;;;-1:-1:-1;;;23312:89:0;;20740:2:1;23312:89:0;;;20722:21:1;20779:2;20759:18;;;20752:30;20818:29;20798:18;;;20791:57;20865:18;;23312:89:0;20538:351:1;23312:89:0;23442:31;23499:4;-1:-1:-1;;;;;23489:14:0;:6;-1:-1:-1;;;;;23489:14:0;;23486:392;;23538:19;23520:37;;23596:6;-1:-1:-1;;;;;23575:28:0;:9;-1:-1:-1;;;;;23575:28:0;;;:62;;;;;23626:11;;23607:15;:30;;23575:62;23572:126;;;-1:-1:-1;;;;;23658:17:0;;;;;;:6;:17;;;;;:24;;-1:-1:-1;;23658:24:0;23678:4;23658:24;;;23572:126;23486:392;;;23732:4;-1:-1:-1;;;;;23719:17:0;:9;-1:-1:-1;;;;;23719:17:0;;23715:163;;-1:-1:-1;23771:20:0;23715:163;;;-1:-1:-1;23842:24:0;23715:163;23902:9;;:16;;23916:1;23902:13;:16::i;:::-;23890:9;:28;23932:30;23947:6;23955;23932:14;:30::i;:::-;23929:118;;;23978:29;23993:13;;23978:14;:29::i;:::-;24034:1;24022:9;:13;23929:118;-1:-1:-1;;;;;24079:17:0;;;;;;:9;:17;;;;;;:29;;24101:6;24079:21;:29::i;:::-;-1:-1:-1;;;;;24059:17:0;;;;;;:9;:17;;;;;:49;;;;24144:7;:64;;24202:6;24144:64;;;24154:45;24167:6;24175;24183:15;24154:12;:45::i;:::-;-1:-1:-1;;;;;24242:20:0;;;;;;:9;:20;;;;;;24119:89;;-1:-1:-1;24242:40:0;;24119:89;24242:24;:40::i;:::-;-1:-1:-1;;;;;24219:20:0;;;;;;;:9;:20;;;;;;;:63;;;;24298:43;;;;;;-1:-1:-1;;;;;;;;;;;24298:43:0;;;24326:14;2049:25:1;;2037:2;2022:18;;1903:177;24298:43:0;;;;;;;;22910:1439;;;22832:1517;;;:::o;1586:98::-;1644:7;1671:5;1675:1;1671;:5;:::i;8185:211::-;8329:58;;;-1:-1:-1;;;;;13499:32:1;;8329:58:0;;;13481:51:1;13548:18;;;;13541:34;;;8329:58:0;;;;;;;;;;13454:18:1;;;;8329:58:0;;;;;;;;-1:-1:-1;;;;;8329:58:0;-1:-1:-1;;;8329:58:0;;;8302:86;;8322:5;;8302:19;:86::i;:::-;8185:211;;;:::o;31707:226::-;31785:6;31795:1;31785:11;31782:23;;31707:226;;:::o;31782:23::-;31816:12;31842:9;-1:-1:-1;;;;;31834:23:0;31865:6;31834:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31815:61;;;31895:7;31887:38;;;;-1:-1:-1;;;31887:38:0;;21306:2:1;31887:38:0;;;21288:21:1;21345:2;21325:18;;;21318:30;-1:-1:-1;;;21364:18:1;;;21357:48;21422:18;;31887:38:0;21104:342:1;24357:382:0;-1:-1:-1;;;;;24462:21:0;;;;;;:13;:21;;;;;;;;24461:22;24453:45;;;;-1:-1:-1;;;24453:45:0;;21653:2:1;24453:45:0;;;21635:21:1;21692:2;21672:18;;;21665:30;-1:-1:-1;;;21711:18:1;;;21704:40;21761:18;;24453:45:0;21451:334:1;24453:45:0;-1:-1:-1;;;;;24518:24:0;;;;;;:13;:24;;;;;;;;24517:25;24509:48;;;;-1:-1:-1;;;24509:48:0;;21653:2:1;24509:48:0;;;21635:21:1;21692:2;21672:18;;;21665:30;-1:-1:-1;;;21711:18:1;;;21704:40;21761:18;;24509:48:0;21451:334:1;24509:48:0;24585:1;24576:6;:10;24568:64;;;;-1:-1:-1;;;24568:64:0;;21992:2:1;24568:64:0;;;21974:21:1;22031:2;22011:18;;;22004:30;22070:34;22050:18;;;22043:62;-1:-1:-1;;;22121:18:1;;;22114:39;22170:19;;24568:64:0;21790:405:1;24568:64:0;-1:-1:-1;;;;;18626:18:0;;18609:7;18626:18;;;:9;:18;;;;;;24651:6;:27;;24643:88;;;;-1:-1:-1;;;24643:88:0;;22402:2:1;24643:88:0;;;22384:21:1;22441:2;22421:18;;;22414:30;22480:34;22460:18;;;22453:62;-1:-1:-1;;;22531:18:1;;;22524:47;22588:19;;24643:88:0;22200:413:1;29708:376:0;29830:15;;29906:13;;29896:4;29787;18626:18;;;:9;:18;;;;;;29938:8;;29787:4;;29820:25;;;;-1:-1:-1;29878:41:0;;29938:8;;29937:9;:34;;;;-1:-1:-1;29950:21:0;;;;29937:34;:46;;;;;29975:8;29937:46;:103;;;;;30015:25;;30002:9;;:38;;29937:103;:121;;;;;30044:14;29937:121;:139;;;;;30072:4;-1:-1:-1;;;;;30062:14:0;:6;-1:-1:-1;;;;;30062:14:0;;;29937:139;29930:146;29708:376;-1:-1:-1;;;;;29708:376:0:o;30092:814::-;17044:8;:15;;-1:-1:-1;;17044:15:0;17055:4;17044:15;;;30223:13:::1;::::0;30200:17:::1;::::0;17044:8;;30189:55:::1;::::0;30242:1:::1;::::0;30189:48:::1;::::0;;;:6;;:10:::1;:29::i;:55::-;30163:81:::0;-1:-1:-1;30255:20:0::1;30278:27;:6:::0;30163:81;30278:10:::1;:27::i;:::-;30255:50:::0;-1:-1:-1;30343:21:0::1;30375:30;30255:50:::0;30375:16:::1;:30::i;:::-;30418:20;30441:41;:21;30467:14:::0;30441:25:::1;:41::i;:::-;30418:64;;30493:19;30515:43;30533:24;30555:1;30533:17;;:21;;:24;;;;:::i;:::-;30515:13;::::0;;:17:::1;:43::i;:::-;30493:65:::0;-1:-1:-1;30574:19:0;;30571:141:::1;;30609:90;30622:15;30639:59;30696:1;30639:52;30679:11;30639:35;30656:17;;30639:12;:16;;:35;;;;:::i;:59::-;30609:12;:90::i;:::-;30825:18;::::0;30862:17:::1;::::0;30813:85:::1;::::0;-1:-1:-1;;;;;30825:18:0::1;::::0;30845:52:::1;::::0;30885:11;;30845:35:::1;::::0;:12;;:16:::1;:35::i;:52::-;30813:11;:85::i;:::-;-1:-1:-1::0;;17083:8:0;:16;;-1:-1:-1;;17083:16:0;;;-1:-1:-1;;;;30092:814:0:o;24747:1325::-;24852:7;24872:14;24889:4;:21;24894:15;24889:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;24889:21:0;;;24872:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24941:14:0;;;;:6;:14;;;;;;;24872:38;;-1:-1:-1;;24941:14:0;;:32;;;;-1:-1:-1;24959:14:0;;;;;;;24941:32;:71;;25000:3;:12;;;24941:71;;;24976:20;24993:3;14756:5;24976:20;:::i;:::-;24921:91;;25046:9;25059:1;25046:14;25042:60;;25084:6;25077:13;;;;;;25042:60;25112:17;25132:43;14756:5;25133:21;:6;25144:9;25133:10;:21::i;25132:43::-;25112:63;;25186:18;25207:43;25240:9;25208:26;25222:3;:11;;;25208:9;:13;;:26;;;;:::i;25207:43::-;25186:64;;25261:21;25285:46;25321:9;25286:29;25300:3;:14;;;25286:9;:13;;:29;;;;:::i;25285:46::-;25261:70;-1:-1:-1;25344:20:0;25367:44;25261:70;25367:25;:9;25381:10;25367:13;:25::i;:44::-;25344:67;-1:-1:-1;25427:14:0;;25424:176;;14139:42;25485:24;;:9;:24;;;;:40;;25514:10;25485:28;:40::i;:::-;14139:42;25458:24;;;;:9;:24;;;:67;;;;:24;25545:43;-1:-1:-1;;;;;25545:43:0;;;-1:-1:-1;;;;;;;;;;;25545:43:0;;;25577:10;2049:25:1;;2037:2;2022:18;;1903:177;25545:43:0;;;;;;;;25424:176;25613:17;;25610:221;;25704:16;;-1:-1:-1;;;;;25704:16:0;25686:36;;;;:9;:36;;;;;;:55;;25727:13;25686:40;:55::i;:::-;25665:16;;;-1:-1:-1;;;;;25665:16:0;;;25647:36;;;;:9;:36;;;;;;;;;:94;;;;25786:16;;25761:58;;2049:25:1;;;25786:16:0;;;;25761:58;;;;-1:-1:-1;;;;;;;;;;;25761:58:0;2022:18:1;25761:58:0;;;;;;;25610:221;25844:16;;25841:182;;25922:4;25904:24;;;;:9;:24;;;;;;:42;;25933:12;25904:28;:42::i;:::-;25895:4;25877:24;;;;:9;:24;;;;;;;:69;;;;25966:45;;-1:-1:-1;;;;;25966:45:0;;;-1:-1:-1;;;;;;;;;;;25966:45:0;;;25998:12;2049:25:1;;2037:2;2022:18;;1903:177;25966:45:0;;;;;;;;25841:182;26041:21;:6;26052:9;26041:10;:21::i;:::-;26034:28;24747:1325;-1:-1:-1;;;;;;;;;;24747:1325:0:o;10608:716::-;11032:23;11058:69;11086:4;11058:69;;;;;;;;;;;;;;;;;11066:5;-1:-1:-1;;;;;11058:27:0;;;:69;;;;;:::i;:::-;11142:17;;11032:95;;-1:-1:-1;11142:21:0;11138:179;;11239:10;11228:30;;;;;;;;;;;;:::i;:::-;11220:85;;;;-1:-1:-1;;;11220:85:0;;23070:2:1;11220:85:0;;;23052:21:1;23109:2;23089:18;;;23082:30;23148:34;23128:18;;;23121:62;-1:-1:-1;;;23199:18:1;;;23192:40;23249:19;;11220:85:0;22868:406:1;31265:434:0;31355:16;;;31369:1;31355:16;;;;;;;;31331:21;;31355:16;;;;;;;;;;-1:-1:-1;31355:16:0;31331:40;;31400:4;31382;31387:1;31382:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31382:23:0;;;-1:-1:-1;;;;;31382:23:0;;;;;31426:6;-1:-1:-1;;;;;31426:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31416:4;31421:1;31416:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31416:23:0;;;-1:-1:-1;;;;;31416:23:0;;;;;31450:53;31467:4;31482:6;31491:11;31450:8;:53::i;:::-;31514:177;;-1:-1:-1;;;31514:177:0;;-1:-1:-1;;;;;31514:6:0;:57;;;;:177;;31586:11;;31612:1;;31628:4;;31655;;31675:15;;31514:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31320:379;31265:434;:::o;30914:343::-;30995:53;31012:4;31027:6;31036:11;30995:8;:53::i;:::-;31200:18;;31059:190;;-1:-1:-1;;;31059:190:0;;31122:4;31059:190;;;24737:34:1;24787:18;;;24780:34;;;31168:1:0;24830:18:1;;;24823:34;;;24873:18;;;24866:34;-1:-1:-1;;;;;31200:18:0;;;24916:19:1;;;24909:44;31233:15:0;24969:19:1;;;24962:35;31059:6:0;:22;;;;;;31089:9;;24671:19:1;;31059:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;30914:343;;:::o;4119:229::-;4256:12;4288:52;4310:6;4318:4;4324:1;4327:12;4288:21;:52::i;:::-;4281:59;4119:229;-1:-1:-1;;;;4119:229:0:o;4624:455::-;4794:12;4852:5;4827:21;:30;;4819:81;;;;-1:-1:-1;;;4819:81:0;;25521:2:1;4819:81:0;;;25503:21:1;25560:2;25540:18;;;25533:30;25599:34;25579:18;;;25572:62;-1:-1:-1;;;25650:18:1;;;25643:36;25696:19;;4819:81:0;25319:402:1;4819:81:0;4912:12;4926:23;4953:6;-1:-1:-1;;;;;4953:11:0;4972:5;4979:4;4953:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4911:73;;;;5002:69;5029:6;5037:7;5046:10;5058:12;5002:26;:69::i;:::-;4995:76;4624:455;-1:-1:-1;;;;;;;4624:455:0:o;6183:644::-;6368:12;6397:7;6393:427;;;6425:10;:17;6446:1;6425:22;6421:290;;-1:-1:-1;;;;;3560:19:0;;;6635:60;;;;-1:-1:-1;;;6635:60:0;;26207:2:1;6635:60:0;;;26189:21:1;26246:2;26226:18;;;26219:30;26285:31;26265:18;;;26258:59;26334:18;;6635:60:0;26005:353:1;6635:60:0;-1:-1:-1;6732:10:0;6725:17;;6393:427;6775:33;6783:10;6795:12;7309:17;;:21;7305:388;;7541:10;7535:17;7598:15;7585:10;7581:2;7577:19;7570:44;7305:388;7668:12;7661:20;;-1:-1:-1;;;7661:20:0;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;720:70;665:131;:::o;801:315::-;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1313:156::-;1394:20;;1443:1;1433:12;;1423:40;;1459:1;1456;1449:12;1423:40;1313:156;;;:::o;1474:424::-;1580:6;1588;1596;1604;1657:3;1645:9;1636:7;1632:23;1628:33;1625:53;;;1674:1;1671;1664:12;1625:53;1697:42;1729:9;1697:42;:::i;:::-;1687:52;1786:2;1771:18;;1758:32;;-1:-1:-1;1837:2:1;1822:18;;1809:32;;1888:2;1873:18;1860:32;;-1:-1:-1;1474:424:1;-1:-1:-1;;;1474:424:1:o;2085:456::-;2162:6;2170;2178;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2286:9;2273:23;2305:31;2330:5;2305:31;:::i;:::-;2355:5;-1:-1:-1;2412:2:1;2397:18;;2384:32;2425:33;2384:32;2425:33;:::i;:::-;2085:456;;2477:7;;-1:-1:-1;;;2531:2:1;2516:18;;;;2503:32;;2085:456::o;2546:247::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;2987:671::-;3073:6;3081;3089;3097;3150:3;3138:9;3129:7;3125:23;3121:33;3118:53;;;3167:1;3164;3157:12;3118:53;3206:9;3193:23;3225:31;3250:5;3225:31;:::i;:::-;3275:5;-1:-1:-1;3332:2:1;3317:18;;3304:32;3345:33;3304:32;3345:33;:::i;:::-;3397:7;-1:-1:-1;3456:2:1;3441:18;;3428:32;3469:33;3428:32;3469:33;:::i;:::-;3521:7;-1:-1:-1;3580:2:1;3565:18;;3552:32;3593:33;3552:32;3593:33;:::i;:::-;2987:671;;;;-1:-1:-1;2987:671:1;;-1:-1:-1;;2987:671:1:o;3663:219::-;3742:6;3795:2;3783:9;3774:7;3770:23;3766:32;3763:52;;;3811:1;3808;3801:12;3763:52;3834:42;3866:9;3834:42;:::i;4283:529::-;4360:6;4368;4376;4429:2;4417:9;4408:7;4404:23;4400:32;4397:52;;;4445:1;4442;4435:12;4397:52;4484:9;4471:23;4503:31;4528:5;4503:31;:::i;:::-;4553:5;-1:-1:-1;4610:2:1;4595:18;;4582:32;4623:33;4582:32;4623:33;:::i;:::-;4675:7;-1:-1:-1;4734:2:1;4719:18;;4706:32;4747:33;4706:32;4747:33;:::i;:::-;4799:7;4789:17;;;4283:529;;;;;:::o;4817:118::-;4903:5;4896:13;4889:21;4882:5;4879:32;4869:60;;4925:1;4922;4915:12;4940:382;5005:6;5013;5066:2;5054:9;5045:7;5041:23;5037:32;5034:52;;;5082:1;5079;5072:12;5034:52;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5247:2:1;5232:18;;5219:32;5260:30;5219:32;5260:30;:::i;:::-;5309:7;5299:17;;;4940:382;;;;;:::o;5327:316::-;5404:6;5412;5420;5473:2;5461:9;5452:7;5448:23;5444:32;5441:52;;;5489:1;5486;5479:12;5441:52;-1:-1:-1;;5512:23:1;;;5582:2;5567:18;;5554:32;;-1:-1:-1;5633:2:1;5618:18;;;5605:32;;5327:316;-1:-1:-1;5327:316:1:o;5648:444::-;5719:6;5727;5735;5788:2;5776:9;5767:7;5763:23;5759:32;5756:52;;;5804:1;5801;5794:12;5756:52;5843:9;5830:23;5862:28;5884:5;5862:28;:::i;:::-;5909:5;-1:-1:-1;5961:2:1;5946:18;;5933:32;;-1:-1:-1;6017:2:1;6002:18;;5989:32;6030:30;5989:32;6030:30;:::i;6097:241::-;6153:6;6206:2;6194:9;6185:7;6181:23;6177:32;6174:52;;;6222:1;6219;6212:12;6174:52;6261:9;6248:23;6280:28;6302:5;6280:28;:::i;6343:367::-;6406:8;6416:6;6470:3;6463:4;6455:6;6451:17;6447:27;6437:55;;6488:1;6485;6478:12;6437:55;-1:-1:-1;6511:20:1;;6554:18;6543:30;;6540:50;;;6586:1;6583;6576:12;6540:50;6623:4;6615:6;6611:17;6599:29;;6683:3;6676:4;6666:6;6663:1;6659:14;6651:6;6647:27;6643:38;6640:47;6637:67;;;6700:1;6697;6690:12;6637:67;6343:367;;;;;:::o;6715:773::-;6837:6;6845;6853;6861;6914:2;6902:9;6893:7;6889:23;6885:32;6882:52;;;6930:1;6927;6920:12;6882:52;6970:9;6957:23;6999:18;7040:2;7032:6;7029:14;7026:34;;;7056:1;7053;7046:12;7026:34;7095:70;7157:7;7148:6;7137:9;7133:22;7095:70;:::i;:::-;7184:8;;-1:-1:-1;7069:96:1;-1:-1:-1;7272:2:1;7257:18;;7244:32;;-1:-1:-1;7288:16:1;;;7285:36;;;7317:1;7314;7307:12;7285:36;;7356:72;7420:7;7409:8;7398:9;7394:24;7356:72;:::i;:::-;6715:773;;;;-1:-1:-1;7447:8:1;-1:-1:-1;;;;6715:773:1:o;7493:180::-;7552:6;7605:2;7593:9;7584:7;7580:23;7576:32;7573:52;;;7621:1;7618;7611:12;7573:52;-1:-1:-1;7644:23:1;;7493:180;-1:-1:-1;7493:180:1:o;7886:446::-;7969:6;7977;7985;7993;8046:3;8034:9;8025:7;8021:23;8017:33;8014:53;;;8063:1;8060;8053:12;8014:53;8102:9;8089:23;8121:28;8143:5;8121:28;:::i;8337:388::-;8405:6;8413;8466:2;8454:9;8445:7;8441:23;8437:32;8434:52;;;8482:1;8479;8472:12;8434:52;8521:9;8508:23;8540:31;8565:5;8540:31;:::i;:::-;8590:5;-1:-1:-1;8647:2:1;8632:18;;8619:32;8660:33;8619:32;8660:33;:::i;8990:248::-;9058:6;9066;9119:2;9107:9;9098:7;9094:23;9090:32;9087:52;;;9135:1;9132;9125:12;9087:52;-1:-1:-1;;9158:23:1;;;9228:2;9213:18;;;9200:32;;-1:-1:-1;8990:248:1:o;9467:335::-;9669:2;9651:21;;;9708:2;9688:18;;;9681:30;-1:-1:-1;;;9742:2:1;9727:18;;9720:41;9793:2;9778:18;;9467:335::o;10163:127::-;10224:10;10219:3;10215:20;10212:1;10205:31;10255:4;10252:1;10245:15;10279:4;10276:1;10269:15;10619:127;10680:10;10675:3;10671:20;10668:1;10661:31;10711:4;10708:1;10701:15;10735:4;10732:1;10725:15;10751:422;10840:1;10883:5;10840:1;10897:270;10918:7;10908:8;10905:21;10897:270;;;10977:4;10973:1;10969:6;10965:17;10959:4;10956:27;10953:53;;;10986:18;;:::i;:::-;11036:7;11026:8;11022:22;11019:55;;;11056:16;;;;11019:55;11135:22;;;;11095:15;;;;10897:270;;;10901:3;10751:422;;;;;:::o;11178:806::-;11227:5;11257:8;11247:80;;-1:-1:-1;11298:1:1;11312:5;;11247:80;11346:4;11336:76;;-1:-1:-1;11383:1:1;11397:5;;11336:76;11428:4;11446:1;11441:59;;;;11514:1;11509:130;;;;11421:218;;11441:59;11471:1;11462:10;;11485:5;;;11509:130;11546:3;11536:8;11533:17;11530:43;;;11553:18;;:::i;:::-;-1:-1:-1;;11609:1:1;11595:16;;11624:5;;11421:218;;11723:2;11713:8;11710:16;11704:3;11698:4;11695:13;11691:36;11685:2;11675:8;11672:16;11667:2;11661:4;11658:12;11654:35;11651:77;11648:159;;;-1:-1:-1;11760:19:1;;;11792:5;;11648:159;11839:34;11864:8;11858:4;11839:34;:::i;:::-;11909:6;11905:1;11901:6;11897:19;11888:7;11885:32;11882:58;;;11920:18;;:::i;:::-;11958:20;;11178:806;-1:-1:-1;;;11178:806:1:o;11989:140::-;12047:5;12076:47;12117:4;12107:8;12103:19;12097:4;12076:47;:::i;12134:168::-;12174:7;12240:1;12236;12232:6;12228:14;12225:1;12222:21;12217:1;12210:9;12203:17;12199:45;12196:71;;;12247:18;;:::i;:::-;-1:-1:-1;12287:9:1;;12134:168::o;12307:336::-;12509:2;12491:21;;;12548:2;12528:18;;;12521:30;-1:-1:-1;;;12582:2:1;12567:18;;12560:42;12634:2;12619:18;;12307:336::o;13118:184::-;13188:6;13241:2;13229:9;13220:7;13216:23;13212:32;13209:52;;;13257:1;13254;13247:12;13209:52;-1:-1:-1;13280:16:1;;13118:184;-1:-1:-1;13118:184:1:o;13586:128::-;13626:3;13657:1;13653:6;13650:1;13647:13;13644:39;;;13663:18;;:::i;:::-;-1:-1:-1;13699:9:1;;13586:128::o;14108:335::-;14310:2;14292:21;;;14349:2;14329:18;;;14322:30;-1:-1:-1;;;14383:2:1;14368:18;;14361:41;14434:2;14419:18;;14108:335::o;14804:251::-;14874:6;14927:2;14915:9;14906:7;14902:23;14898:32;14895:52;;;14943:1;14940;14933:12;14895:52;14975:9;14969:16;14994:31;15019:5;14994:31;:::i;15060:125::-;15100:4;15128:1;15125;15122:8;15119:34;;;15133:18;;:::i;:::-;-1:-1:-1;15170:9:1;;15060:125::o;15542:127::-;15603:10;15598:3;15594:20;15591:1;15584:31;15634:4;15631:1;15624:15;15658:4;15655:1;15648:15;15674:135;15713:3;15734:17;;;15731:43;;15754:18;;:::i;:::-;-1:-1:-1;15801:1:1;15790:13;;15674:135::o;17853:217::-;17893:1;17919;17909:132;;17963:10;17958:3;17954:20;17951:1;17944:31;17998:4;17995:1;17988:15;18026:4;18023:1;18016:15;17909:132;-1:-1:-1;18055:9:1;;17853:217::o;22618:245::-;22685:6;22738:2;22726:9;22717:7;22713:23;22709:32;22706:52;;;22754:1;22751;22744:12;22706:52;22786:9;22780:16;22805:28;22827:5;22805:28;:::i;23411:980::-;23673:4;23721:3;23710:9;23706:19;23752:6;23741:9;23734:25;23778:2;23816:6;23811:2;23800:9;23796:18;23789:34;23859:3;23854:2;23843:9;23839:18;23832:31;23883:6;23918;23912:13;23949:6;23941;23934:22;23987:3;23976:9;23972:19;23965:26;;24026:2;24018:6;24014:15;24000:29;;24047:1;24057:195;24071:6;24068:1;24065:13;24057:195;;;24136:13;;-1:-1:-1;;;;;24132:39:1;24120:52;;24227:15;;;;24192:12;;;;24168:1;24086:9;24057:195;;;-1:-1:-1;;;;;;;24308:32:1;;;;24303:2;24288:18;;24281:60;-1:-1:-1;;;24372:3:1;24357:19;24350:35;24269:3;23411:980;-1:-1:-1;;;23411:980:1:o;25008:306::-;25096:6;25104;25112;25165:2;25153:9;25144:7;25140:23;25136:32;25133:52;;;25181:1;25178;25171:12;25133:52;25210:9;25204:16;25194:26;;25260:2;25249:9;25245:18;25239:25;25229:35;;25304:2;25293:9;25289:18;25283:25;25273:35;;25008:306;;;;;:::o;25726:274::-;25855:3;25893:6;25887:13;25909:53;25955:6;25950:3;25943:4;25935:6;25931:17;25909:53;:::i;:::-;25978:16;;;;;25726:274;-1:-1:-1;;25726:274:1:o

Swarm Source

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