ETH Price: $2,993.56 (-1.89%)
Gas: 3 Gwei

Token

Staked Pepe (stPEPE)
 

Overview

Max Total Supply

13,716,250,641.788162381359629573 stPEPE

Holders

112

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000032396800619 stPEPE

Value
$0.00
0xa7774f5ecdbab450d6a04be8f430448bf28a9d26
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:
StakedPepeToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
    SPDX-License-Identifier: MIT
    A Bankteller Production
    Pepe Stake
    Copyright 2023
*/

/*
    Pepe Stake - decentralized community staking for Pepe   

    - A store of value backed by PEPE that only goes up in value
    - Mint stPEPE with PEPE ERC20( 0x6982508145454ce325ddbe47a25d4ec3d2311933 )
    - Zero transfer or dev fees
    - Pay a low 5% fee on mint and reedem to fund the internal treasury
    - No pump and dump is possible and single sided liquidity is locked in the contract
    - 100% immutable with zero administrative functions
    - Redeem stPEPE for PEPE anytime
     
    Only at https://pepestake.com

    For more DeFi from BT 

    - ELEPHANT BEP20( 0xE283D0e3B8c102BAdF5E8166B73E02D96d92F688 )
    - Only at https://elephant.money

*/
pragma solidity 0.8.17;

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint8 private constant _NOT_ENTERED = 1;
    uint8 private constant _ENTERED = 2;

    uint8 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

abstract contract Context is ReentrancyGuard {

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }

}



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    bool private _paused;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event RunStatusUpdated(bool indexed paused);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _paused = false;
        emit RunStatusUpdated(_paused);
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Returns if paused status
     */
    function isPaused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Throws if called when contract is paused
     */
    modifier isRunning() {
        require(
            _paused == false,
            "Function unavailable because contract is paused"
        );
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        require(!_paused, "Ownable: contract is paused");
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    /**
     * @dev Pause the contract for functions that check run status
     * Can only be called by the current owner.
     */
    function updateRunStatus(bool paused) public virtual onlyOwner {
        emit RunStatusUpdated(paused);
        _paused = paused;
    }

}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    
    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract StakedPepeToken is IERC20, Ownable {

    using SafeMath for uint256;

    // token data
    string private constant _name = "Staked Pepe";
    string private constant _symbol = "stPEPE";
    uint8 private constant _decimals = 18;
    uint256 private constant precision = 10**18;

    uint256  private _total_users; //counts new minters
    uint256  private _total_txs;
    
    IERC20 public immutable underlying;

    uint256 private _totalSupply;

    // balances
    mapping (address => uint256) private _balances;
    mapping (address => uint8) private _users;
    mapping (address => mapping (address => uint256)) private _allowances;

    
    // 5% buy and sell Fees
    uint256 public mintFee        = 95000;            
    uint256 public sellFee        = 95000;            
    uint256 private constant feeDenominator = 10**5;

    constructor() Ownable() {

        // initialize underlying asset; PEPE
        underlying = IERC20( address(0x6982508145454Ce325dDbE47a25d4ec3d2311933) );

    }

    /** Returns the total number of tokens in existence */
    function totalSupply() external view override returns (uint256) { 
        return _totalSupply; 
    }

    /** Returns the number of tokens owned by `account` */
    function balanceOf(address account) public view override returns (uint256) { 
        return _balances[account]; 
    }

    /** Returns the number of tokens `spender` can transfer from `holder` */
    function allowance(address holder, address spender) external view override returns (uint256) { 
        return _allowances[holder][spender]; 
    }
    
    /** Token Name */
    function name() public pure override returns (string memory) {
        return _name;
    }

    /** Token Ticker Symbol */
    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    /** Tokens decimals */
    function decimals() public pure override returns (uint8) {
        return _decimals;
    }

    /** Approves `spender` to transfer `amount` tokens from caller */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
  
    /** Transfer Function */
    function transfer(address recipient, uint256 amount) external override nonReentrant returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    /** Transfer Function */
    function transferFrom(address sender, address recipient, uint256 amount) external override nonReentrant returns (bool) {
        _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, 'Insufficient Allowance');
        return _transferFrom(sender, recipient, amount);
    }
    
    /** Internal Transfer */
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        // make standard checks
        require(recipient != address(0) && sender != address(0), "Transfer To Zero");
        require(amount > 0, "Transfer Amt Zero");
        // track price change
        uint256 oldPrice = _calculatePrice();
        
        // subtract from sender
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        // give reduced amount to receiver
        _balances[recipient] = _balances[recipient].add(amount);

        
        // require price rises
        _requirePriceRises(oldPrice);

        //update globals
        _total_txs += 1;

        // Transfer Event
        emit Transfer(sender, recipient, amount);
        return true;
    }

    /** 
        Mint stPEPE tokens for sender by depositing PEPE into the contract
            Requirements:
                Approval from the PEPE prior to purchase
        
        @param numTokens number of PEPE tokens to mint stPEPE with
        @return tokensMinted number of stPEPE tokens minted
    */
    function mint(uint256 numTokens) external nonReentrant returns (uint256) {
        _checkGarbageCollector(address(this));
        return _mintWithBacking(numTokens, msg.sender);
    }

    /** 
        Mint stPEPE tokens for `recipient` by depositing PEPE into the contract
            Requirements:
                Approval from the PEPE prior to purchase
        
        @param numTokens number of PEPE tokens to mint stPEPE with
        @param recipient Account to receive minted stPEPE tokens
        @return tokensMinted number of stPEPE tokens minted
    */
    function mintTo(uint256 numTokens, address recipient) external nonReentrant returns (uint256) {
        _checkGarbageCollector(address(this));
        return _mintWithBacking(numTokens, recipient);
    }

    /** 
        Burns sender's stPEPE tokens and redeems their value in PEPE
        @param tokenAmount number of stPEPE tokens to redeem, must be greater than 0
    */
    function redeem(uint256 tokenAmount) external nonReentrant returns (uint256) {
        return _sell(msg.sender, tokenAmount, msg.sender);
    }
    
    /** 
        Burns sender's stPEPE tokens and redeems their value in PEPE for `recipient`
        @param tokenAmount number of stPEPE tokens to redeem, must be greater than 0
        @param recipient Recipient of PEPE transfer, must not be address(0)
    */
    function reedemTo(uint256 tokenAmount, address recipient) external nonReentrant returns (uint256) {
        return _sell(msg.sender, tokenAmount, recipient);
    }
    
    /** 
        Allows a user to remove their holdings from the supply 
        DOES NOT REDEEM UNDERLYING ASSET FOR USER
        @param amount number of stPEPE tokens to burn
    */
    function burn(uint256 amount) external nonReentrant {
        // get balance of caller
        uint256 bal = _balances[msg.sender];
        require(bal >= amount && bal > 0, 'Zero Holdings');
        // Track Change In Price
        uint256 oldPrice = _calculatePrice();
       
        // burn tokens from sender + supply
        _burn(msg.sender, amount);
        // require price rises
        _requirePriceRises(oldPrice);
        // Emit Call
        emit Burned(msg.sender, amount);
    }
    
    /** Stake tokens and deposits stPEPE in sender's address; must have prior approval for PEPE */
    function _mintWithBacking(uint256 amount, address recipient) internal returns (uint256) {
        
        // users token balance
        uint256 userTokenBalance = underlying.balanceOf(msg.sender);
        // ensure user has enough to send
        require(userTokenBalance > 0 && amount <= userTokenBalance, 'Insufficient Balance');

        // calculate price change
        uint256 oldPrice = _calculatePrice();

        // amount of underlying
        uint256 amountUnderlying = underlyingBalance();

        // transfer in token
        uint256 received = _transferIn(amount);

        // Handle Minting
        return _mintTo(recipient, received, amountUnderlying, oldPrice);
    }
    
    /** Burns stPEPE tokens and deposits PEPE tokens into recipient's address */
    function _sell(address seller, uint256 tokenAmount, address recipient) internal returns (uint256) {
        require(tokenAmount > 0 && _balances[seller] >= tokenAmount);
        require(seller != address(0) && recipient != address(0));
        
        // calculate price change
        uint256 oldPrice = _calculatePrice();

        // tokens post fee to swap for underlying asset
        uint256 tokensToSwap = tokenAmount.mul(sellFee).div(feeDenominator);

        // value of taxed tokens
        uint256 amountUnderlyingAsset = amountOut(tokensToSwap);

        // burn from sender + supply 
        _burn(seller, tokenAmount);

        // send Tokens to Seller
        require(
            underlying.transfer(recipient, amountUnderlyingAsset), 
            'Underlying Transfer Failure'
        );

        // require price rises
        _requirePriceRises(oldPrice);

        //update globals
        _total_txs += 1;

        // Differentiate Sell
        emit Redeemed(seller, tokenAmount, amountUnderlyingAsset);

        // return token redeemed and amount underlying
        return amountUnderlyingAsset;
    }

    /** Handles minting logic Tto create new stPEPE */
    function _mintTo(address recipient, uint256 received, uint256 totalBacking, uint256 oldPrice) private returns(uint256) {
        
        // find the number of tokens we should mint to keep up with the current price
        uint256 tokensToMintNoTax = _totalSupply == 0 ?
            received : 
            _totalSupply.mul(received).div(totalBacking);
        
        // apply fee to minted tokens to inflate price relative to total supply
        uint256 tokensToMint = tokensToMintNoTax.mul(mintFee).div(feeDenominator);
        
        require(tokensToMint > 0, 'Zero Amount');
        
        // mint to Buyer
        _mint(recipient, tokensToMint);


        // require price rises
        _requirePriceRises(oldPrice);

        //update globals
        _total_txs += 1;

        // differentiate purchase
        emit Minted(recipient, tokensToMint);
        return tokensToMint;
    }

    /** Requires the price of stPEPE to rise for the transaction to conclude */
    function _requirePriceRises(uint256 oldPrice) internal {
        // Calculate Price After Transaction
        uint256 newPrice = _calculatePrice();
        // Require Current Price >= Last Price
        require(newPrice >= oldPrice, 'Price Cannot Fall');
        // Emit The Price Change
        emit PriceChange(oldPrice, newPrice, _totalSupply);
    }

    /** Transfers `desiredAmount` of `token` in and verifies the transaction success */
    function _transferIn(uint256 desiredAmount) internal returns (uint256) {
        uint256 balBefore = underlyingBalance();
        require(
            underlying.transferFrom(msg.sender, address(this), desiredAmount),
            'Failure Transfer From'
        );
        uint256 balAfter = underlyingBalance();
        require(
            balAfter > balBefore,
            'Zero Received'
        );
        return balAfter - balBefore;
    }
    
    /** Mints tokens to the receivers address */
    function _mint(address receiver, uint amount) private {
        //user count is based on whenever a new account has been minted to
        if (_users[receiver] == 0){
            _users[receiver] = 1;
            _total_users += 1;
        }

        _balances[receiver] = _balances[receiver].add(amount);
        _totalSupply = _totalSupply.add(amount);
        emit Transfer(address(0), receiver, amount);
    }
    
    /** Burns `amount` of tokens from `account` */
    function _burn(address account, uint amount) private {
        _balances[account] = _balances[account].sub(amount, 'Insufficient Balance');
        _totalSupply = _totalSupply.sub(amount, 'Negative Supply');
        emit Transfer(account, address(0), amount);
    }

    /** Make sure there are no native tokens in the contract */
    function _checkGarbageCollector(address burnLocation) internal {
        uint256 bal = _balances[burnLocation];
        if (bal > 10**3) {
            // Track Change In Price
            uint256 oldPrice = _calculatePrice();    
            // burn amount
            _burn(burnLocation, bal);
            // Emit Collection
            emit GarbageCollected(bal);
            // Emit Price Difference
            emit PriceChange(oldPrice, _calculatePrice(), _totalSupply);
        }
    }
    
    /** Returns the balance of the underlying asset */
    function underlyingBalance() public view returns (uint256) {
        return underlying.balanceOf(address(this));
    }

    /** Returns the price of stPEPE in PEPE with 18 points of precision */
    function calculatePrice() external view returns (uint256) {
        return _calculatePrice();
    }
    
    /** Returns the current price of 1 token */
    function _calculatePrice() internal view returns (uint256) {
        return _totalSupply == 0 ? 10**18 : (underlyingBalance().mul(precision)).div(_totalSupply);
    }

    /** Returns the amount of stPEPE given numtokens of PEPE; accounting for fees**/
    function estimateMinted(uint256 numTokens) public view returns (uint256) {
        uint balance = underlyingBalance();
        return _totalSupply == 0 ? numTokens.mul(mintFee).div(feeDenominator) : _totalSupply.mul(numTokens).div(balance).mul(mintFee).div(feeDenominator);
    }

    /** Returns the amount of PEPE given numtokens of stPEPE **/
    function estimateRedeemed(uint256 numTokens) public view returns (uint256) {
        return amountOut(numTokens.mul(sellFee).div(feeDenominator));
    }


    /**
        Returns amount of underlying to receive for `numTokens` of stPEPE
     */
    function amountOut(uint256 numTokens) public view returns (uint256) {
        return _calculatePrice().mul(numTokens).div(precision);
    }

    /** Returns the value of `holder`'s holdings */
    function getValueOfHoldings(address holder) public view returns(uint256) {
        return amountOut(_balances[holder]);
    }

    /** Returns basic contract stats **/
    function getInfo() public view returns(uint256 users, uint256 txs, uint256 underlyingSupply, uint256 supply, uint256 price){
        users = _total_users;
        txs = _total_txs;
        underlyingSupply = underlyingBalance();
        supply = _totalSupply;
        price = _calculatePrice();
    } 

    /** Remove dust / airdrop tokens sent to the contract; Housekeeper can burn or recieve the coins*/
    function housekeeping(IERC20 token, bool burnDust) external {
        require(address(token) != address(underlying), 'Cannot withdraw underlying asset');
        require(address(token) != address(0), 'Zero Address');

        uint balance = token.balanceOf(address(this));
        require(balance > 0, 'Zero balance');
        
        address destination = (burnDust) ? address(0x000000000000000000000000000000000000dEaD) : msg.sender;
                
        token.transfer(destination, balance);

        emit DustCollected(address(token), destination, balance);
    }
    
    /** Events **/
    event PriceChange(uint256 previousPrice, uint256 currentPrice, uint256 totalSupply);
    event Burned(address from, uint256 amount);
    event GarbageCollected(uint256 amount);
    event Redeemed(address seller, uint256 amount, uint256 amountUnderlying);
    event Minted(address recipient, uint256 amount);
    event DustCollected(address token, address recipient, uint256 amount);

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DustCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GarbageCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"PriceChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountUnderlying","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"paused","type":"bool"}],"name":"RunStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"amountOut","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"estimateMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"estimateRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"internalType":"uint256","name":"users","type":"uint256"},{"internalType":"uint256","name":"txs","type":"uint256"},{"internalType":"uint256","name":"underlyingSupply","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getValueOfHoldings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"bool","name":"burnDust","type":"bool"}],"name":"housekeeping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reedemTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"updateRunStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052620173186008556201731860095534801561001e57600080fd5b506000805460ff191660011781556100333390565b60008054610100600160a81b0319166101006001600160a01b038416021781556001805460ff60a01b19169081905560405192935060ff600160a01b909104161515917f2a04a433f4a9e9958a2e686298f452d15ff8cad4449e4517bf21b843f27ceb019190a26040516001600160a01b038216906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350736982508145454ce325ddbe47a25d4ec3d2311933608052608051611dba61012760003960008181610323015281816107a101528181610845015281816113fd015281816115bd01526117a80152611dba6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a9059cbb116100a2578063db006a7511610071578063db006a751461043f578063dd62ed3e14610452578063ed13b2531461048b578063f2fde38b1461049e57600080fd5b8063a9059cbb146103ff578063b187bd2614610412578063b723b34e14610424578063d348b4091461043757600080fd5b80638da5cb5b116100de5780638da5cb5b146103a157806395d89b41146103b7578063a0712d68146103d9578063a7cb7a80146103ec57600080fd5b806370a082311461035d578063715018a61461038657806375fe9fba1461038e57600080fd5b8063313ce5671161017c5780635a9b0b891161014b5780635a9b0b89146102c857806363d0a1e0146102f85780636b014f831461030b5780636f307dc31461031e57600080fd5b8063313ce5671461028957806340efd24a1461029857806342966c68146102ad57806359356c5c146102c057600080fd5b806318160ddd116101b857806318160ddd146102525780631f02a29c1461025a57806323b872dd1461026d5780632b14ca561461028057600080fd5b806306fdde03146101df578063095ea7b31461021857806313966db51461023b575b600080fd5b60408051808201909152600b81526a5374616b6564205065706560a81b60208201525b60405161020f9190611aad565b60405180910390f35b61022b610226366004611b13565b6104b1565b604051901515815260200161020f565b61024460085481565b60405190815260200161020f565b600454610244565b610244610268366004611b3f565b61051e565b61022b61027b366004611b5c565b610540565b61024460095481565b6040516012815260200161020f565b6102ab6102a6366004611bab565b610618565b005b6102ab6102bb366004611bc8565b610693565b610244610789565b6102d0610819565b604080519586526020860194909452928401919091526060830152608082015260a00161020f565b6102ab610306366004611be1565b610843565b610244610319366004611bc8565b610a8f565b6103457f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161020f565b61024461036b366004611b3f565b6001600160a01b031660009081526005602052604090205490565b6102ab610b00565b61024461039c366004611bc8565b610bd9565b60005461010090046001600160a01b0316610345565b60408051808201909152600681526573745045504560d01b6020820152610202565b6102446103e7366004611bc8565b610bf3565b6102446103fa366004611c1a565b610c4e565b61022b61040d366004611b13565b610ca2565b600154600160a01b900460ff1661022b565b610244610432366004611c1a565b610ce1565b610244610d28565b61024461044d366004611bc8565b610d32565b610244610460366004611c3f565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b610244610499366004611bc8565b610d71565b6102ab6104ac366004611b3f565b610d92565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061050c9086815260200190565b60405180910390a35060015b92915050565b6001600160a01b03811660009081526005602052604081205461051890610bd9565b6000805460ff16600119016105705760405162461bcd60e51b815260040161056790611c6d565b60405180910390fd5b6000805460ff191660021781556040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b03881684526007815282842033855290529120546105d3918490610e8d565b6001600160a01b0385166000908152600760209081526040808320338452909152902055610602848484610ec7565b90506000805460ff191660011790559392505050565b6000546001600160a01b036101009091041633146106485760405162461bcd60e51b815260040161056790611ca4565b604051811515907f2a04a433f4a9e9958a2e686298f452d15ff8cad4449e4517bf21b843f27ceb0190600090a260018054911515600160a01b0260ff60a01b19909216919091179055565b60005460ff16600119016106b95760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002178155338152600560205260409020548181108015906106e35750600081115b61071f5760405162461bcd60e51b815260206004820152600d60248201526c5a65726f20486f6c64696e677360981b6044820152606401610567565b60006107296110a1565b905061073533846110d4565b61073e816111c3565b60408051338152602081018590527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7910160405180910390a150506000805460ff1916600117905550565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108149190611cd9565b905090565b6002546003546000808061082b610789565b9250600454915061083a6110a1565b90509091929394565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036108c45760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420776974686472617720756e6465726c79696e672061737365746044820152606401610567565b6001600160a01b0382166109095760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610567565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611cd9565b9050600081116109b55760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610567565b6000826109c257336109c6565b61dead5b60405163a9059cbb60e01b81526001600160a01b038083166004830152602482018590529192509085169063a9059cbb906044016020604051808303816000875af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190611cf2565b50604080516001600160a01b038087168252831660208201529081018390527f4b3832ed948bc80ab35e8cab3a5923e6e1a57696d02c846a8b6f54d39bf9acf09060600160405180910390a150505050565b600080610a9a610789565b9050600454600014610add57610ad8620186a0610acc600854610ad285610acc8960045461125a90919063ffffffff16565b906112dc565b9061125a565b610af9565b610af9620186a0610acc6008548661125a90919063ffffffff16565b9392505050565b6000546001600160a01b03610100909104163314610b305760405162461bcd60e51b815260040161056790611ca4565b600154600160a01b900460ff1615610b8a5760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a20636f6e74726163742069732070617573656400000000006044820152606401610567565b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b6000610518670de0b6b3a7640000610acc84610ad26110a1565b6000805460ff1660011901610c1a5760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c303061131e565b610c3a82336113db565b90506000805460ff19166001179055919050565b6000805460ff1660011901610c755760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c8d3384846114f9565b90506000805460ff1916600117905592915050565b6000805460ff1660011901610cc95760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c8d338484610ec7565b6000805460ff1660011901610d085760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610d1e3061131e565b610c8d83836113db565b60006108146110a1565b6000805460ff1660011901610d595760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c3a3383816114f9565b600061051861039c620186a0610acc6009548661125a90919063ffffffff16565b6000546001600160a01b03610100909104163314610dc25760405162461bcd60e51b815260040161056790611ca4565b6001600160a01b038116610e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610567565b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008184841115610eb15760405162461bcd60e51b81526004016105679190611aad565b506000610ebe8486611d25565b95945050505050565b60006001600160a01b03831615801590610ee957506001600160a01b03841615155b610f285760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220546f205a65726f60801b6044820152606401610567565b60008211610f6c5760405162461bcd60e51b81526020600482015260116024820152705472616e7366657220416d74205a65726f60781b6044820152606401610567565b6000610f766110a1565b9050610fde8360405180604001604052806014815260200173496e73756666696369656e742042616c616e636560601b81525060056000896001600160a01b03166001600160a01b0316815260200190815260200160002054610e8d9092919063ffffffff16565b6001600160a01b03808716600090815260056020526040808220939093559086168152205461100d90846116eb565b6001600160a01b03851660009081526005602052604090205561102f816111c3565b6001600360008282546110429190611d38565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161108e91815260200190565b60405180910390a3506001949350505050565b60006004546000146110c757610814600454610acc670de0b6b3a7640000610ad2610789565b50670de0b6b3a764000090565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038516600090815260059091529190912054611126918390610e8d565b6001600160a01b038316600090815260056020908152604091829020929092558051808201909152600f81526e4e6567617469766520537570706c7960881b9181019190915260045461117a918390610e8d565b6004556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60006111cd6110a1565b9050818110156112135760405162461bcd60e51b8152602060048201526011602482015270141c9a58d94810d85b9b9bdd0811985b1b607a1b6044820152606401610567565b600454604080518481526020810184905280820192909252517f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed19181900360600190a15050565b60008260000361126c57506000610518565b60006112788385611d4b565b9050826112858583611d62565b14610af95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610567565b6000610af983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061174a565b6001600160a01b0381166000908152600560205260409020546103e88111156113d757600061134b6110a1565b905061135783836110d4565b6040518281527f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e9060200160405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed1816113b46110a1565b6004546040805193845260208401929092529082015260600160405180910390a1505b5050565b6040516370a0823160e01b815233600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114689190611cd9565b905060008111801561147a5750808411155b6114bd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610567565b60006114c76110a1565b905060006114d3610789565b905060006114e087611778565b90506114ee868284866118be565b979650505050505050565b6000808311801561152257506001600160a01b0384166000908152600560205260409020548311155b61152b57600080fd5b6001600160a01b0384161580159061154b57506001600160a01b03821615155b61155457600080fd5b600061155e6110a1565b9050600061157e620186a0610acc6009548861125a90919063ffffffff16565b9050600061158b82610bd9565b905061159787876110d4565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190611cf2565b6116765760405162461bcd60e51b815260206004820152601b60248201527f556e6465726c79696e67205472616e73666572204661696c75726500000000006044820152606401610567565b61167f836111c3565b6001600360008282546116929190611d38565b9091555050604080516001600160a01b0389168152602081018890529081018290527ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec2629060600160405180910390a19695505050505050565b6000806116f88385611d38565b905083811015610af95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610567565b6000818361176b5760405162461bcd60e51b81526004016105679190611aad565b506000610ebe8486611d62565b600080611783610789565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156117f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181d9190611cf2565b6118615760405162461bcd60e51b81526020600482015260156024820152744661696c757265205472616e736665722046726f6d60581b6044820152606401610567565b600061186b610789565b90508181116118ac5760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b6044820152606401610567565b6118b68282611d25565b949350505050565b6000806004546000146118e9576118e484610acc8760045461125a90919063ffffffff16565b6118eb565b845b9050600061190b620186a0610acc6008548561125a90919063ffffffff16565b90506000811161194b5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b6044820152606401610567565b61195587826119c2565b61195e846111c3565b6001600360008282546119719190611d38565b9091555050604080516001600160a01b0389168152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a19695505050505050565b6001600160a01b03821660009081526006602052604081205460ff169003611a23576001600160a01b0382166000908152600660205260408120805460ff191660019081179091556002805491929091611a1d908490611d38565b90915550505b6001600160a01b038216600090815260056020526040902054611a4690826116eb565b6001600160a01b038316600090815260056020526040902055600454611a6c90826116eb565b6004556040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111b7565b600060208083528351808285015260005b81811015611ada57858101830151858201604001528201611abe565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611b1057600080fd5b50565b60008060408385031215611b2657600080fd5b8235611b3181611afb565b946020939093013593505050565b600060208284031215611b5157600080fd5b8135610af981611afb565b600080600060608486031215611b7157600080fd5b8335611b7c81611afb565b92506020840135611b8c81611afb565b929592945050506040919091013590565b8015158114611b1057600080fd5b600060208284031215611bbd57600080fd5b8135610af981611b9d565b600060208284031215611bda57600080fd5b5035919050565b60008060408385031215611bf457600080fd5b8235611bff81611afb565b91506020830135611c0f81611b9d565b809150509250929050565b60008060408385031215611c2d57600080fd5b823591506020830135611c0f81611afb565b60008060408385031215611c5257600080fd5b8235611c5d81611afb565b91506020830135611c0f81611afb565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ceb57600080fd5b5051919050565b600060208284031215611d0457600080fd5b8151610af981611b9d565b634e487b7160e01b600052601160045260246000fd5b8181038181111561051857610518611d0f565b8082018082111561051857610518611d0f565b808202811582820484141761051857610518611d0f565b600082611d7f57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122073b78a8e7318c2b293b07ad1933bdc69aa48ebd17dd2bf1290c080e224265d8f64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a9059cbb116100a2578063db006a7511610071578063db006a751461043f578063dd62ed3e14610452578063ed13b2531461048b578063f2fde38b1461049e57600080fd5b8063a9059cbb146103ff578063b187bd2614610412578063b723b34e14610424578063d348b4091461043757600080fd5b80638da5cb5b116100de5780638da5cb5b146103a157806395d89b41146103b7578063a0712d68146103d9578063a7cb7a80146103ec57600080fd5b806370a082311461035d578063715018a61461038657806375fe9fba1461038e57600080fd5b8063313ce5671161017c5780635a9b0b891161014b5780635a9b0b89146102c857806363d0a1e0146102f85780636b014f831461030b5780636f307dc31461031e57600080fd5b8063313ce5671461028957806340efd24a1461029857806342966c68146102ad57806359356c5c146102c057600080fd5b806318160ddd116101b857806318160ddd146102525780631f02a29c1461025a57806323b872dd1461026d5780632b14ca561461028057600080fd5b806306fdde03146101df578063095ea7b31461021857806313966db51461023b575b600080fd5b60408051808201909152600b81526a5374616b6564205065706560a81b60208201525b60405161020f9190611aad565b60405180910390f35b61022b610226366004611b13565b6104b1565b604051901515815260200161020f565b61024460085481565b60405190815260200161020f565b600454610244565b610244610268366004611b3f565b61051e565b61022b61027b366004611b5c565b610540565b61024460095481565b6040516012815260200161020f565b6102ab6102a6366004611bab565b610618565b005b6102ab6102bb366004611bc8565b610693565b610244610789565b6102d0610819565b604080519586526020860194909452928401919091526060830152608082015260a00161020f565b6102ab610306366004611be1565b610843565b610244610319366004611bc8565b610a8f565b6103457f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193381565b6040516001600160a01b03909116815260200161020f565b61024461036b366004611b3f565b6001600160a01b031660009081526005602052604090205490565b6102ab610b00565b61024461039c366004611bc8565b610bd9565b60005461010090046001600160a01b0316610345565b60408051808201909152600681526573745045504560d01b6020820152610202565b6102446103e7366004611bc8565b610bf3565b6102446103fa366004611c1a565b610c4e565b61022b61040d366004611b13565b610ca2565b600154600160a01b900460ff1661022b565b610244610432366004611c1a565b610ce1565b610244610d28565b61024461044d366004611bc8565b610d32565b610244610460366004611c3f565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b610244610499366004611bc8565b610d71565b6102ab6104ac366004611b3f565b610d92565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061050c9086815260200190565b60405180910390a35060015b92915050565b6001600160a01b03811660009081526005602052604081205461051890610bd9565b6000805460ff16600119016105705760405162461bcd60e51b815260040161056790611c6d565b60405180910390fd5b6000805460ff191660021781556040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b03881684526007815282842033855290529120546105d3918490610e8d565b6001600160a01b0385166000908152600760209081526040808320338452909152902055610602848484610ec7565b90506000805460ff191660011790559392505050565b6000546001600160a01b036101009091041633146106485760405162461bcd60e51b815260040161056790611ca4565b604051811515907f2a04a433f4a9e9958a2e686298f452d15ff8cad4449e4517bf21b843f27ceb0190600090a260018054911515600160a01b0260ff60a01b19909216919091179055565b60005460ff16600119016106b95760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002178155338152600560205260409020548181108015906106e35750600081115b61071f5760405162461bcd60e51b815260206004820152600d60248201526c5a65726f20486f6c64696e677360981b6044820152606401610567565b60006107296110a1565b905061073533846110d4565b61073e816111c3565b60408051338152602081018590527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7910160405180910390a150506000805460ff1916600117905550565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108149190611cd9565b905090565b6002546003546000808061082b610789565b9250600454915061083a6110a1565b90509091929394565b7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316826001600160a01b0316036108c45760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420776974686472617720756e6465726c79696e672061737365746044820152606401610567565b6001600160a01b0382166109095760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610567565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611cd9565b9050600081116109b55760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610567565b6000826109c257336109c6565b61dead5b60405163a9059cbb60e01b81526001600160a01b038083166004830152602482018590529192509085169063a9059cbb906044016020604051808303816000875af1158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190611cf2565b50604080516001600160a01b038087168252831660208201529081018390527f4b3832ed948bc80ab35e8cab3a5923e6e1a57696d02c846a8b6f54d39bf9acf09060600160405180910390a150505050565b600080610a9a610789565b9050600454600014610add57610ad8620186a0610acc600854610ad285610acc8960045461125a90919063ffffffff16565b906112dc565b9061125a565b610af9565b610af9620186a0610acc6008548661125a90919063ffffffff16565b9392505050565b6000546001600160a01b03610100909104163314610b305760405162461bcd60e51b815260040161056790611ca4565b600154600160a01b900460ff1615610b8a5760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a20636f6e74726163742069732070617573656400000000006044820152606401610567565b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b6000610518670de0b6b3a7640000610acc84610ad26110a1565b6000805460ff1660011901610c1a5760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c303061131e565b610c3a82336113db565b90506000805460ff19166001179055919050565b6000805460ff1660011901610c755760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c8d3384846114f9565b90506000805460ff1916600117905592915050565b6000805460ff1660011901610cc95760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c8d338484610ec7565b6000805460ff1660011901610d085760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610d1e3061131e565b610c8d83836113db565b60006108146110a1565b6000805460ff1660011901610d595760405162461bcd60e51b815260040161056790611c6d565b6000805460ff19166002179055610c3a3383816114f9565b600061051861039c620186a0610acc6009548661125a90919063ffffffff16565b6000546001600160a01b03610100909104163314610dc25760405162461bcd60e51b815260040161056790611ca4565b6001600160a01b038116610e275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610567565b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008184841115610eb15760405162461bcd60e51b81526004016105679190611aad565b506000610ebe8486611d25565b95945050505050565b60006001600160a01b03831615801590610ee957506001600160a01b03841615155b610f285760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220546f205a65726f60801b6044820152606401610567565b60008211610f6c5760405162461bcd60e51b81526020600482015260116024820152705472616e7366657220416d74205a65726f60781b6044820152606401610567565b6000610f766110a1565b9050610fde8360405180604001604052806014815260200173496e73756666696369656e742042616c616e636560601b81525060056000896001600160a01b03166001600160a01b0316815260200190815260200160002054610e8d9092919063ffffffff16565b6001600160a01b03808716600090815260056020526040808220939093559086168152205461100d90846116eb565b6001600160a01b03851660009081526005602052604090205561102f816111c3565b6001600360008282546110429190611d38565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161108e91815260200190565b60405180910390a3506001949350505050565b60006004546000146110c757610814600454610acc670de0b6b3a7640000610ad2610789565b50670de0b6b3a764000090565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038516600090815260059091529190912054611126918390610e8d565b6001600160a01b038316600090815260056020908152604091829020929092558051808201909152600f81526e4e6567617469766520537570706c7960881b9181019190915260045461117a918390610e8d565b6004556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60006111cd6110a1565b9050818110156112135760405162461bcd60e51b8152602060048201526011602482015270141c9a58d94810d85b9b9bdd0811985b1b607a1b6044820152606401610567565b600454604080518481526020810184905280820192909252517f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed19181900360600190a15050565b60008260000361126c57506000610518565b60006112788385611d4b565b9050826112858583611d62565b14610af95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610567565b6000610af983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061174a565b6001600160a01b0381166000908152600560205260409020546103e88111156113d757600061134b6110a1565b905061135783836110d4565b6040518281527f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e9060200160405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed1816113b46110a1565b6004546040805193845260208401929092529082015260600160405180910390a1505b5050565b6040516370a0823160e01b815233600482015260009081906001600160a01b037f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193316906370a0823190602401602060405180830381865afa158015611444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114689190611cd9565b905060008111801561147a5750808411155b6114bd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610567565b60006114c76110a1565b905060006114d3610789565b905060006114e087611778565b90506114ee868284866118be565b979650505050505050565b6000808311801561152257506001600160a01b0384166000908152600560205260409020548311155b61152b57600080fd5b6001600160a01b0384161580159061154b57506001600160a01b03821615155b61155457600080fd5b600061155e6110a1565b9050600061157e620186a0610acc6009548861125a90919063ffffffff16565b9050600061158b82610bd9565b905061159787876110d4565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933169063a9059cbb906044016020604051808303816000875af1158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190611cf2565b6116765760405162461bcd60e51b815260206004820152601b60248201527f556e6465726c79696e67205472616e73666572204661696c75726500000000006044820152606401610567565b61167f836111c3565b6001600360008282546116929190611d38565b9091555050604080516001600160a01b0389168152602081018890529081018290527ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec2629060600160405180910390a19695505050505050565b6000806116f88385611d38565b905083811015610af95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610567565b6000818361176b5760405162461bcd60e51b81526004016105679190611aad565b506000610ebe8486611d62565b600080611783610789565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906323b872dd906064016020604051808303816000875af11580156117f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181d9190611cf2565b6118615760405162461bcd60e51b81526020600482015260156024820152744661696c757265205472616e736665722046726f6d60581b6044820152606401610567565b600061186b610789565b90508181116118ac5760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b6044820152606401610567565b6118b68282611d25565b949350505050565b6000806004546000146118e9576118e484610acc8760045461125a90919063ffffffff16565b6118eb565b845b9050600061190b620186a0610acc6008548561125a90919063ffffffff16565b90506000811161194b5760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b6044820152606401610567565b61195587826119c2565b61195e846111c3565b6001600360008282546119719190611d38565b9091555050604080516001600160a01b0389168152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a19695505050505050565b6001600160a01b03821660009081526006602052604081205460ff169003611a23576001600160a01b0382166000908152600660205260408120805460ff191660019081179091556002805491929091611a1d908490611d38565b90915550505b6001600160a01b038216600090815260056020526040902054611a4690826116eb565b6001600160a01b038316600090815260056020526040902055600454611a6c90826116eb565b6004556040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111b7565b600060208083528351808285015260005b81811015611ada57858101830151858201604001528201611abe565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611b1057600080fd5b50565b60008060408385031215611b2657600080fd5b8235611b3181611afb565b946020939093013593505050565b600060208284031215611b5157600080fd5b8135610af981611afb565b600080600060608486031215611b7157600080fd5b8335611b7c81611afb565b92506020840135611b8c81611afb565b929592945050506040919091013590565b8015158114611b1057600080fd5b600060208284031215611bbd57600080fd5b8135610af981611b9d565b600060208284031215611bda57600080fd5b5035919050565b60008060408385031215611bf457600080fd5b8235611bff81611afb565b91506020830135611c0f81611b9d565b809150509250929050565b60008060408385031215611c2d57600080fd5b823591506020830135611c0f81611afb565b60008060408385031215611c5257600080fd5b8235611c5d81611afb565b91506020830135611c0f81611afb565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ceb57600080fd5b5051919050565b600060208284031215611d0457600080fd5b8151610af981611b9d565b634e487b7160e01b600052601160045260246000fd5b8181038181111561051857610518611d0f565b8082018082111561051857610518611d0f565b808202811582820484141761051857610518611d0f565b600082611d7f57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122073b78a8e7318c2b293b07ad1933bdc69aa48ebd17dd2bf1290c080e224265d8f64736f6c63430008110033

Deployed Bytecode Sourcemap

13881:14908:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15559:92;15638:5;;;;;;;;;;;;-1:-1:-1;;;15638:5:0;;;;15559:92;;;;;;;:::i;:::-;;;;;;;;15994:216;;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;15994:216:0;1023:187:1;14593:37:0;;;;;;;;;1361:25:1;;;1349:2;1334:18;14593:37:0;1215:177:1;14996:104:0;15079:12;;14996:104;;27185:127;;;;;;:::i;:::-;;:::i;16457:299::-;;;;;;:::i;:::-;;:::i;14649:37::-;;;;;;15823:92;;;14124:2;2252:36:1;;2240:2;2225:18;15823:92:0;2110:184:1;6088:138:0;;;;;;:::i;:::-;;:::i;:::-;;19718:507;;;;;;:::i;:::-;;:::i;25742:120::-;;;:::i;27362:306::-;;;:::i;:::-;;;;3112:25:1;;;3168:2;3153:18;;3146:34;;;;3196:18;;;3189:34;;;;3254:2;3239:18;;3232:34;3297:3;3282:19;;3275:35;3099:3;3084:19;27362:306:0;2853:463:1;27781:584:0;;;;;;:::i;:::-;;:::i;26370:282::-;;;;;;:::i;:::-;;:::i;14282:34::-;;;;;;;;-1:-1:-1;;;;;3900:32:1;;;3882:51;;3870:2;3855:18;14282:34:0;3722:217:1;15168:121:0;;;;;;:::i;:::-;-1:-1:-1;;;;;15262:18:0;15234:7;15262:18;;;:9;:18;;;;;;;15168:121;5302:207;;;:::i;26983:141::-;;;;;;:::i;:::-;;:::i;4271:79::-;4309:7;4336:6;;;;-1:-1:-1;;;;;4336:6:0;4271:79;;15691:96;15772:7;;;;;;;;;;;;-1:-1:-1;;;15772:7:0;;;;15691:96;;17957:186;;;;;;:::i;:::-;;:::i;19352:165::-;;;;;;:::i;:::-;;:::i;16250:169::-;;;;;;:::i;:::-;;:::i;4414:80::-;4479:7;;-1:-1:-1;;;4479:7:0;;;;4414:80;;18540:206;;;;;;:::i;:::-;;:::i;25946:101::-;;;:::i;18928:145::-;;;;;;:::i;:::-;;:::i;15375:149::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15487:19:0;;;15459:7;15487:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;15375:149;26726:154;;;;;;:::i;:::-;;:::i;5664:281::-;;;;;;:::i;:::-;;:::i;15994:216::-;16098:10;16069:4;16086:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16086:32:0;;;;;;;;;;:41;;;16143:37;16069:4;;16086:32;;16143:37;;;;16121:6;1361:25:1;;1349:2;1334:18;;1215:177;16143:37:0;;;;;;;;-1:-1:-1;16198:4:0;15994:216;;;;;:::o;27185:127::-;-1:-1:-1;;;;;27286:17:0;;27249:7;27286:17;;;:9;:17;;;;;;27276:28;;:9;:28::i;16457:299::-;16570:4;2303:7;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;;;;;;;;;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;16621:69:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;16621:69:0::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;16621:19:0;::::1;::::0;;:11:::1;:19:::0;;;;;16641:10:::1;16621:31:::0;;;;;;;:69:::1;::::0;16657:6;;16621:35:::1;:69::i;:::-;-1:-1:-1::0;;;;;16587:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;16607:10:::1;16587:31:::0;;;;;;;:103;16708:40:::1;16599:6:::0;16730:9;16741:6;16708:13:::1;:40::i;:::-;16701:47;;2615:7:::0;:22;;-1:-1:-1;;2615:22:0;1665:1;2615:22;;;16457:299;;-1:-1:-1;;;16457:299:0:o;6088:138::-;4627:6;;-1:-1:-1;;;;;4627:6:0;;;;;2786:10;4627:22;4619:67;;;;-1:-1:-1;;;4619:67:0;;;;;;;:::i;:::-;6167:24:::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;6202:7;:16:::0;;;::::1;;-1:-1:-1::0;;;6202:16:0::1;-1:-1:-1::0;;;;6202:16:0;;::::1;::::0;;;::::1;::::0;;6088:138::o;19718:507::-;2303:7;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;19839:10:::1;19829:21:::0;;:9:::1;:21;::::0;;;;;19869:13;;::::1;::::0;::::1;::::0;:24:::1;;;19892:1;19886:3;:7;19869:24;19861:50;;;::::0;-1:-1:-1;;;19861:50:0;;5788:2:1;19861:50:0::1;::::0;::::1;5770:21:1::0;5827:2;5807:18;;;5800:30;-1:-1:-1;;;5846:18:1;;;5839:43;5899:18;;19861:50:0::1;5586:337:1::0;19861:50:0::1;19956:16;19975:17;:15;:17::i;:::-;19956:36;;20057:25;20063:10;20075:6;20057:5;:25::i;:::-;20125:28;20144:8;20125:18;:28::i;:::-;20191:26;::::0;;20198:10:::1;6102:51:1::0;;6184:2;6169:18;;6162:34;;;20191:26:0::1;::::0;6075:18:1;20191:26:0::1;;;;;;;-1:-1:-1::0;;2615:7:0;:22;;-1:-1:-1;;2615:22:0;1665:1;2615:22;;;-1:-1:-1;19718:507:0:o;25742:120::-;25819:35;;-1:-1:-1;;;25819:35:0;;25848:4;25819:35;;;3882:51:1;25792:7:0;;25819:10;-1:-1:-1;;;;;25819:20:0;;;;3855:18:1;;25819:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25812:42;;25742:120;:::o;27362:306::-;27504:12;;27533:10;;27401:13;;;27573:19;:17;:19::i;:::-;27554:38;;27612:12;;27603:21;;27643:17;:15;:17::i;:::-;27635:25;;27362:306;;;;;:::o;27781:584::-;27886:10;-1:-1:-1;;;;;27860:37:0;27868:5;-1:-1:-1;;;;;27860:37:0;;27852:82;;;;-1:-1:-1;;;27852:82:0;;6598:2:1;27852:82:0;;;6580:21:1;;;6617:18;;;6610:30;6676:34;6656:18;;;6649:62;6728:18;;27852:82:0;6396:356:1;27852:82:0;-1:-1:-1;;;;;27953:28:0;;27945:53;;;;-1:-1:-1;;;27945:53:0;;6959:2:1;27945:53:0;;;6941:21:1;6998:2;6978:18;;;6971:30;-1:-1:-1;;;7017:18:1;;;7010:42;7069:18;;27945:53:0;6757:336:1;27945:53:0;28026:30;;-1:-1:-1;;;28026:30:0;;28050:4;28026:30;;;3882:51:1;28011:12:0;;-1:-1:-1;;;;;28026:15:0;;;;;3855:18:1;;28026:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28011:45;;28085:1;28075:7;:11;28067:36;;;;-1:-1:-1;;;28067:36:0;;7300:2:1;28067:36:0;;;7282:21:1;7339:2;7319:18;;;7312:30;-1:-1:-1;;;7358:18:1;;;7351:42;7410:18;;28067:36:0;7098:336:1;28067:36:0;28124:19;28147:8;28146:77;;28213:10;28146:77;;;28167:42;28146:77;28252:36;;-1:-1:-1;;;28252:36:0;;-1:-1:-1;;;;;6120:32:1;;;28252:36:0;;;6102:51:1;6169:18;;;6162:34;;;28124:99:0;;-1:-1:-1;28252:14:0;;;;;;6075:18:1;;28252:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28306:51:0;;;-1:-1:-1;;;;;7947:15:1;;;7929:34;;7999:15;;7994:2;7979:18;;7972:43;8031:18;;;8024:34;;;28306:51:0;;7879:2:1;7864:18;28306:51:0;;;;;;;27841:524;;27781:584;;:::o;26370:282::-;26434:7;26454:12;26469:19;:17;:19::i;:::-;26454:34;;26506:12;;26522:1;26506:17;:138;;26571:73;14747:5;26571:53;26616:7;;26571:40;26603:7;26571:27;26588:9;26571:12;;:16;;:27;;;;:::i;:::-;:31;;:40::i;:::-;:44;;:53::i;:73::-;26506:138;;;26526:42;14747:5;26526:22;26540:7;;26526:9;:13;;:22;;;;:::i;:42::-;26499:145;26370:282;-1:-1:-1;;;26370:282:0:o;5302:207::-;4627:6;;-1:-1:-1;;;;;4627:6:0;;;;;2786:10;4627:22;4619:67;;;;-1:-1:-1;;;4619:67:0;;;;;;;:::i;:::-;5376:7:::1;::::0;-1:-1:-1;;;5376:7:0;::::1;;;5375:8;5367:48;;;::::0;-1:-1:-1;;;5367:48:0;;8271:2:1;5367:48:0::1;::::0;::::1;8253:21:1::0;8310:2;8290:18;;;8283:30;8349:29;8329:18;;;8322:57;8396:18;;5367:48:0::1;8069:351:1::0;5367:48:0::1;5468:1;5452:6:::0;;5431:40:::1;::::0;5452:6:::1;::::0;;::::1;-1:-1:-1::0;;;;;5452:6:0::1;::::0;5431:40:::1;::::0;5468:1;;5431:40:::1;5499:1;5482:19:::0;;-1:-1:-1;;;;;;5482:19:0::1;::::0;;5302:207::o;26983:141::-;27042:7;27069:47;14170:6;27069:32;27091:9;27069:17;:15;:17::i;17957:186::-;18021:7;2303;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;18041:37:::1;18072:4;18041:22;:37::i;:::-;18096:39;18113:9;18124:10;18096:16;:39::i;:::-;18089:46;;2615:7:::0;:22;;-1:-1:-1;;2615:22:0;1665:1;2615:22;;;17957:186;;-1:-1:-1;17957:186:0:o;19352:165::-;19441:7;2303;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;19468:41:::1;19474:10;19486:11:::0;19499:9;19468:5:::1;:41::i;:::-;19461:48;;2615:7:::0;:22;;-1:-1:-1;;2615:22:0;1665:1;2615:22;;;19352:165;;-1:-1:-1;;19352:165:0:o;16250:169::-;16343:4;2303:7;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;16367:44:::1;16381:10;16393:9:::0;16404:6;16367:13:::1;:44::i;18540:206::-:0;18625:7;2303;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;18645:37:::1;18676:4;18645:22;:37::i;:::-;18700:38;18717:9;18728;18700:16;:38::i;25946:101::-:0;25995:7;26022:17;:15;:17::i;18928:145::-;18996:7;2303;;:19;:7;-1:-1:-1;;2303:19:0;2295:63;;;;-1:-1:-1;;;2295:63:0;;;;;;;:::i;:::-;2436:7;:18;;-1:-1:-1;;2436:18:0;1707:1;2436:18;;;19023:42:::1;19029:10;19041:11:::0;19029:10;19023:5:::1;:42::i;26726:154::-:0;26792:7;26819:53;26829:42;14747:5;26829:22;26843:7;;26829:9;:13;;:22;;;;:::i;5664:281::-;4627:6;;-1:-1:-1;;;;;4627:6:0;;;;;2786:10;4627:22;4619:67;;;;-1:-1:-1;;;4619:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5767:22:0;::::1;5745:110;;;::::0;-1:-1:-1;;;5745:110:0;;8627:2:1;5745:110:0::1;::::0;::::1;8609:21:1::0;8666:2;8646:18;;;8639:30;8705:34;8685:18;;;8678:62;-1:-1:-1;;;8756:18:1;;;8749:36;8802:19;;5745:110:0::1;8425:402:1::0;5745:110:0::1;5892:6;::::0;;5871:38:::1;::::0;-1:-1:-1;;;;;5871:38:0;;::::1;::::0;5892:6:::1;::::0;;::::1;;::::0;5871:38:::1;::::0;::::1;5920:6;:17:::0;;-1:-1:-1;;;;;5920:17:0;;::::1;;;-1:-1:-1::0;;;;;;5920:17:0;;::::1;::::0;;;::::1;::::0;;5664:281::o;7495:192::-;7581:7;7617:12;7609:6;;;;7601:29;;;;-1:-1:-1;;;7601:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7641:9:0;7653:5;7657:1;7653;:5;:::i;:::-;7641:17;7495:192;-1:-1:-1;;;;;7495:192:0:o;16798:833::-;16890:4;-1:-1:-1;;;;;16948:23:0;;;;;;:47;;-1:-1:-1;;;;;;16975:20:0;;;;16948:47;16940:76;;;;-1:-1:-1;;;16940:76:0;;9299:2:1;16940:76:0;;;9281:21:1;9338:2;9318:18;;;9311:30;-1:-1:-1;;;9357:18:1;;;9350:46;9413:18;;16940:76:0;9097:340:1;16940:76:0;17044:1;17035:6;:10;17027:40;;;;-1:-1:-1;;;17027:40:0;;9644:2:1;17027:40:0;;;9626:21:1;9683:2;9663:18;;;9656:30;-1:-1:-1;;;9702:18:1;;;9695:47;9759:18;;17027:40:0;9442:341:1;17027:40:0;17109:16;17128:17;:15;:17::i;:::-;17109:36;;17219:53;17241:6;17219:53;;;;;;;;;;;;;-1:-1:-1;;;17219:53:0;;;:9;:17;17229:6;-1:-1:-1;;;;;17219:17:0;-1:-1:-1;;;;;17219:17:0;;;;;;;;;;;;;:21;;:53;;;;;:::i;:::-;-1:-1:-1;;;;;17199:17:0;;;;;;;:9;:17;;;;;;:73;;;;17352:20;;;;;;;:32;;17377:6;17352:24;:32::i;:::-;-1:-1:-1;;;;;17329:20:0;;;;;;:9;:20;;;;;:55;17439:28;17458:8;17439:18;:28::i;:::-;17520:1;17506:10;;:15;;;;;;;:::i;:::-;;;;;;;;17583:9;-1:-1:-1;;;;;17566:35:0;17575:6;-1:-1:-1;;;;;17566:35:0;;17594:6;17566:35;;;;1361:25:1;;1349:2;1334:18;;1215:177;17566:35:0;;;;;;;;-1:-1:-1;17619:4:0;;16798:833;-1:-1:-1;;;;16798:833:0:o;26108:168::-;26158:7;26185:12;;26201:1;26185:17;:83;;26214:54;26255:12;;26215:34;14170:6;26215:19;:17;:19::i;26185:83::-;-1:-1:-1;26205:6:0;;26108:168::o;24829:269::-;24914:54;;;;;;;;;;;-1:-1:-1;;;24914:54:0;;;;;;;;-1:-1:-1;;;;;24914:18:0;;-1:-1:-1;24914:18:0;;;:9;:18;;;;;;;;:54;;24937:6;;24914:22;:54::i;:::-;-1:-1:-1;;;;;24893:18:0;;;;;;:9;:18;;;;;;;;;:75;;;;24994:43;;;;;;;;;;;-1:-1:-1;;;24994:43:0;;;;;;;:12;;:43;;25011:6;;24994:16;:43::i;:::-;24979:12;:58;25053:37;;1361:25:1;;;25079:1:0;;-1:-1:-1;;;;;25053:37:0;;;;;1349:2:1;1334:18;25053:37:0;;;;;;;;24829:269;;:::o;23366:360::-;23478:16;23497:17;:15;:17::i;:::-;23478:36;;23593:8;23581;:20;;23573:50;;;;-1:-1:-1;;;23573:50:0;;10120:2:1;23573:50:0;;;10102:21:1;10159:2;10139:18;;;10132:30;-1:-1:-1;;;10178:18:1;;;10171:47;10235:18;;23573:50:0;9918:341:1;23573:50:0;23705:12;;23673:45;;;10466:25:1;;;10522:2;10507:18;;10500:34;;;10550:18;;;10543:34;;;;23673:45:0;;;;;;10454:2:1;23673:45:0;;;23421:305;23366:360;:::o;7946:471::-;8004:7;8249:1;8254;8249:6;8245:47;;-1:-1:-1;8279:1:0;8272:8;;8245:47;8304:9;8316:5;8320:1;8316;:5;:::i;:::-;8304:17;-1:-1:-1;8349:1:0;8340:5;8344:1;8304:17;8340:5;:::i;:::-;:10;8332:56;;;;-1:-1:-1;;;8332:56:0;;11185:2:1;8332:56:0;;;11167:21:1;11224:2;11204:18;;;11197:30;11263:34;11243:18;;;11236:62;-1:-1:-1;;;11314:18:1;;;11307:31;11355:19;;8332:56:0;10983:397:1;8893:132:0;8951:7;8978:39;8982:1;8985;8978:39;;;;;;;;;;;;;;;;;:3;:39::i;25171:503::-;-1:-1:-1;;;;;25259:23:0;;25245:11;25259:23;;;:9;:23;;;;;;25303:5;25297:11;;25293:374;;;25363:16;25382:17;:15;:17::i;:::-;25363:36;;25446:24;25452:12;25466:3;25446:5;:24::i;:::-;25522:21;;1361:25:1;;;25522:21:0;;1349:2:1;1334:18;25522:21:0;;;;;;;25601:54;25613:8;25623:17;:15;:17::i;:::-;25642:12;;25601:54;;;10466:25:1;;;10522:2;10507:18;;10500:34;;;;10550:18;;;10543:34;10454:2;10439:18;25601:54:0;;;;;;;25310:357;25293:374;25234:440;25171:503;:::o;20337:705::-;20505:32;;-1:-1:-1;;;20505:32:0;;20526:10;20505:32;;;3882:51:1;20416:7:0;;;;-1:-1:-1;;;;;20505:10:0;:20;;;;3855:18:1;;20505:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20478:59;;20618:1;20599:16;:20;:50;;;;;20633:16;20623:6;:26;;20599:50;20591:83;;;;-1:-1:-1;;;20591:83:0;;11587:2:1;20591:83:0;;;11569:21:1;11626:2;11606:18;;;11599:30;-1:-1:-1;;;11645:18:1;;;11638:50;11705:18;;20591:83:0;11385:344:1;20591:83:0;20722:16;20741:17;:15;:17::i;:::-;20722:36;;20804:24;20831:19;:17;:19::i;:::-;20804:46;;20893:16;20912:19;20924:6;20912:11;:19::i;:::-;20893:38;;20978:56;20986:9;20997:8;21007:16;21025:8;20978:7;:56::i;:::-;20971:63;20337:705;-1:-1:-1;;;;;;;20337:705:0:o;21136:1156::-;21225:7;21267:1;21253:11;:15;:51;;;;-1:-1:-1;;;;;;21272:17:0;;;;;;:9;:17;;;;;;:32;-1:-1:-1;21272:32:0;21253:51;21245:60;;;;;;-1:-1:-1;;;;;21324:20:0;;;;;;:47;;-1:-1:-1;;;;;;21348:23:0;;;;21324:47;21316:56;;;;;;21428:16;21447:17;:15;:17::i;:::-;21428:36;;21534:20;21557:44;14747:5;21557:24;21573:7;;21557:11;:15;;:24;;;;:::i;:44::-;21534:67;;21648:29;21680:23;21690:12;21680:9;:23::i;:::-;21648:55;;21755:26;21761:6;21769:11;21755:5;:26::i;:::-;21850:53;;-1:-1:-1;;;21850:53:0;;-1:-1:-1;;;;;6120:32:1;;;21850:53:0;;;6102:51:1;6169:18;;;6162:34;;;21850:10:0;:19;;;;6075:18:1;;21850:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21828:131;;;;-1:-1:-1;;;21828:131:0;;11936:2:1;21828:131:0;;;11918:21:1;11975:2;11955:18;;;11948:30;12014:29;11994:18;;;11987:57;12061:18;;21828:131:0;11734:351:1;21828:131:0;22004:28;22023:8;22004:18;:28::i;:::-;22085:1;22071:10;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;22135:52:0;;;-1:-1:-1;;;;;12310:32:1;;12292:51;;12374:2;12359:18;;12352:34;;;12402:18;;;12395:34;;;22135:52:0;;12280:2:1;12265:18;22135:52:0;;;;;;;22263:21;21136:1156;-1:-1:-1;;;;;;21136:1156:0:o;6592:181::-;6650:7;;6682:5;6686:1;6682;:5;:::i;:::-;6670:17;;6711:1;6706;:6;;6698:46;;;;-1:-1:-1;;;6698:46:0;;12642:2:1;6698:46:0;;;12624:21:1;12681:2;12661:18;;;12654:30;12720:29;12700:18;;;12693:57;12767:18;;6698:46:0;12440:351:1;9521:278:0;9607:7;9642:12;9635:5;9627:28;;;;-1:-1:-1;;;9627:28:0;;;;;;;;:::i;:::-;-1:-1:-1;9666:9:0;9678:5;9682:1;9678;:5;:::i;23823:457::-;23885:7;23905:17;23925:19;:17;:19::i;:::-;23977:65;;-1:-1:-1;;;23977:65:0;;24001:10;23977:65;;;7929:34:1;24021:4:0;7979:18:1;;;7972:43;8031:18;;;8024:34;;;23905:39:0;;-1:-1:-1;23977:10:0;-1:-1:-1;;;;;23977:23:0;;;;7864:18:1;;23977:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23955:136;;;;-1:-1:-1;;;23955:136:0;;12998:2:1;23955:136:0;;;12980:21:1;13037:2;13017:18;;;13010:30;-1:-1:-1;;;13056:18:1;;;13049:51;13117:18;;23955:136:0;12796:345:1;23955:136:0;24102:16;24121:19;:17;:19::i;:::-;24102:38;;24184:9;24173:8;:20;24151:83;;;;-1:-1:-1;;;24151:83:0;;13348:2:1;24151:83:0;;;13330:21:1;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:43;13459:18;;24151:83:0;13146:337:1;24151:83:0;24252:20;24263:9;24252:8;:20;:::i;:::-;24245:27;23823:457;-1:-1:-1;;;;23823:457:0:o;22356:921::-;22466:7;22583:25;22611:12;;22627:1;22611:17;:102;;22669:44;22700:12;22669:26;22686:8;22669:12;;:16;;:26;;;;:::i;:44::-;22611:102;;;22644:8;22611:102;22583:130;;22815:20;22838:50;14747:5;22838:30;22860:7;;22838:17;:21;;:30;;;;:::i;:50::-;22815:73;;22932:1;22917:12;:16;22909:40;;;;-1:-1:-1;;;22909:40:0;;13690:2:1;22909:40:0;;;13672:21:1;13729:2;13709:18;;;13702:30;-1:-1:-1;;;13748:18:1;;;13741:41;13799:18;;22909:40:0;13488:335:1;22909:40:0;22996:30;23002:9;23013:12;22996:5;:30::i;:::-;23073:28;23092:8;23073:18;:28::i;:::-;23154:1;23140:10;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;23208:31:0;;;-1:-1:-1;;;;;6120:32:1;;6102:51;;6184:2;6169:18;;6162:34;;;23208:31:0;;6075:18:1;23208:31:0;;;;;;;23257:12;22356:921;-1:-1:-1;;;;;;22356:921:0:o;24342:423::-;-1:-1:-1;;;;;24487:16:0;;;;;;:6;:16;;;;;;;;:21;;24483:105;;-1:-1:-1;;;;;24524:16:0;;;;;;:6;:16;;;;;:20;;-1:-1:-1;;24524:20:0;24543:1;24524:20;;;;;;24559:12;:17;;24543:1;;24559:12;;:17;;24543:1;;24559:17;:::i;:::-;;;;-1:-1:-1;;24483:105:0;-1:-1:-1;;;;;24622:19:0;;;;;;:9;:19;;;;;;:31;;24646:6;24622:23;:31::i;:::-;-1:-1:-1;;;;;24600:19:0;;;;;;:9;:19;;;;;:53;24679:12;;:24;;24696:6;24679:16;:24::i;:::-;24664:12;:39;24719:38;;1361:25:1;;;-1:-1:-1;;;;;24719:38:0;;;24736:1;;24719:38;;1349:2:1;1334:18;24719:38:0;1215:177:1;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;1649:456::-;1726:6;1734;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1850:9;1837:23;1869:31;1894:5;1869:31;:::i;:::-;1919:5;-1:-1:-1;1976:2:1;1961:18;;1948:32;1989:33;1948:32;1989:33;:::i;:::-;1649:456;;2041:7;;-1:-1:-1;;;2095:2:1;2080:18;;;;2067:32;;1649:456::o;2299:118::-;2385:5;2378:13;2371:21;2364:5;2361:32;2351:60;;2407:1;2404;2397:12;2422:241;2478:6;2531:2;2519:9;2510:7;2506:23;2502:32;2499:52;;;2547:1;2544;2537:12;2499:52;2586:9;2573:23;2605:28;2627:5;2605:28;:::i;2668:180::-;2727:6;2780:2;2768:9;2759:7;2755:23;2751:32;2748:52;;;2796:1;2793;2786:12;2748:52;-1:-1:-1;2819:23:1;;2668:180;-1:-1:-1;2668:180:1:o;3321:396::-;3400:6;3408;3461:2;3449:9;3440:7;3436:23;3432:32;3429:52;;;3477:1;3474;3467:12;3429:52;3516:9;3503:23;3535:31;3560:5;3535:31;:::i;:::-;3585:5;-1:-1:-1;3642:2:1;3627:18;;3614:32;3655:30;3614:32;3655:30;:::i;:::-;3704:7;3694:17;;;3321:396;;;;;:::o;4152:315::-;4220:6;4228;4281:2;4269:9;4260:7;4256:23;4252:32;4249:52;;;4297:1;4294;4287:12;4249:52;4333:9;4320:23;4310:33;;4393:2;4382:9;4378:18;4365:32;4406:31;4431:5;4406:31;:::i;4472:388::-;4540:6;4548;4601:2;4589:9;4580:7;4576:23;4572:32;4569:52;;;4617:1;4614;4607:12;4569:52;4656:9;4643:23;4675:31;4700:5;4675:31;:::i;:::-;4725:5;-1:-1:-1;4782:2:1;4767:18;;4754:32;4795:33;4754:32;4795:33;:::i;4865:355::-;5067:2;5049:21;;;5106:2;5086:18;;;5079:30;5145:33;5140:2;5125:18;;5118:61;5211:2;5196:18;;4865:355::o;5225:356::-;5427:2;5409:21;;;5446:18;;;5439:30;5505:34;5500:2;5485:18;;5478:62;5572:2;5557:18;;5225:356::o;6207:184::-;6277:6;6330:2;6318:9;6309:7;6305:23;6301:32;6298:52;;;6346:1;6343;6336:12;6298:52;-1:-1:-1;6369:16:1;;6207:184;-1:-1:-1;6207:184:1:o;7439:245::-;7506:6;7559:2;7547:9;7538:7;7534:23;7530:32;7527:52;;;7575:1;7572;7565:12;7527:52;7607:9;7601:16;7626:28;7648:5;7626:28;:::i;8832:127::-;8893:10;8888:3;8884:20;8881:1;8874:31;8924:4;8921:1;8914:15;8948:4;8945:1;8938:15;8964:128;9031:9;;;9052:11;;;9049:37;;;9066:18;;:::i;9788:125::-;9853:9;;;9874:10;;;9871:36;;;9887:18;;:::i;10588:168::-;10661:9;;;10692;;10709:15;;;10703:22;;10689:37;10679:71;;10730:18;;:::i;10761:217::-;10801:1;10827;10817:132;;10871:10;10866:3;10862:20;10859:1;10852:31;10906:4;10903:1;10896:15;10934:4;10931:1;10924:15;10817:132;-1:-1:-1;10963:9:1;;10761:217::o

Swarm Source

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