ETH Price: $2,493.61 (-0.43%)
Gas: 3.28 Gwei

Token

HUNTER ELMER (ELMER)
 

Overview

Max Total Supply

1,000,000,000 ELMER

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,000,917.144081755071661827 ELMER

Value
$0.00
0xcf9797c2093dB5dc1d3fc7914C9225D033656a53
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:
ELMER

Compiler Version
v0.8.19+commit.7dd6d404

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-20
*/

/**

Elmer Fudd, the renowned hunter, has just ventured into the realm of cryptocurrency to partake in the meme hunting season. Now it’s time for Elmer to take reign!

Website: https://www.hunterelmer.com
Twitter: https://twitter.com/elmer_erc
Telegram: https://t.me/elmer_erc                                                                 
                                                                                          
                   :-==+===-::..                                                          
               .-=++=============--::..:--=+++++++=-:                                     
             :=++================+++++++**#%%%%%###*+=:                                   
           :+++==============+++++++**#######%%%####**=                                   
          =++=============+=====+**************####***=                                   
         =++===========++====+*****++++++++++++**##**-                                    
        -++++==++===++*#*+*****++++=============++=:                                      
        +++++++*##*+*##**+++++======-------------=-                                       
       .+*****########**+==---:::::::::.........::-                                       
       .**##%#####%%%#*++=--:::::-=-:.........:::::                                       
        +#%%%%%%%%%%%#*++=--:::::-::=:........::--:                                       
        :##%%%%%%%%%%#**+=--:::::-  :=:.....:-::=:.                                       
         =#%%%%@@%%%%***+=--::::-:  :%=::.:-=  -:.                                        
          -##%%%@@@@*=++==--::::::.  :===--=. ::.                    .:.                  
           .+*#####**+++++==-==--------:::...:....                  ++::.                 
        .:-==++++++++++++**++*##*=-:-+=-::.:::..::           .......:--::                 
       -++++++++++++++****##*+++++=--=*+==+++=--=:   ..:::::..:+***=:..--=:..::::::.      
       =++++++*############%##**++++===+++==--::::::::.......+%%%%%%#=.:=:::*#%%%*--:     
       .++++++++*#%%#*########%##*+=--::::::...           .:-%%%######-::::#%%#####=-:    
         =++++++**+-::-+*+++==--::::..             ........:-######***-----#####***=--    
          -+++**+-:::-=-::::....::::::::::::::::-----------:-=###****=-----+##****+==.    
           =+*#+=::::-=::::----=-:::=-:-=++=++++++++++++++++---=+++=--=**=-==++++===.     
          -###*+=-::::=++++**-:-::::-:::-+*+++++++++++++++++==-:--::-=++++=------:.       
          =*#%%*==-=---==+*##--=-----::::=*#####-                                         
          =**#%%%****+++**#%%*==+==++-----+##+-.                                          
          -*#%%###################+*+-:==++-.                                             
          .#%*++########**#######*****+:                                                  
          +*#*++*#################******+                                                 
        .+*####*+***##%#*###**%%####****=                                                 
      .:*######%##**=.   :-:+#%########-                                                  
    .+##%%%%%%*=-         -##%%%%%%%%%#=-:.                                               
    *###%%%%%%:           =#%%%%%%%########=                                              
   .=*%%%%%%%#.             +%%%%###########-                                             
        ...                  .+%%%%%%%###%%%-                                             
                                .-=+++++==:.    

**/

pragma solidity 0.8.19;

// SPDX-License-Identifier: MIT

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

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

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @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);
}

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    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);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    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);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    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);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    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);
        }
    }
}

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 _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

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


interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapTokensForExactTokens(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

contract ELMER is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingActive;
    bool private tradingVest = true;

    mapping (address => bool) public isAMMPair;

    uint256 public maxTransaction;
    uint256 public maxWallet;

    address public operationsAddress;
    address public prizeAddress;

    uint256 public buyTotalTax;
    uint256 public buyOperationsTax;
    uint256 public buyLiquidityTax;
    uint256 public buyPrizeTax;

    uint256 public sellTotalTax;
    uint256 public sellOperationsTax;
    uint256 public sellLiquidityTax;
    uint256 public sellPrizeTax;
    uint256 public sellBurnTax;

    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    uint256 public tokensForPrize;

    mapping(address => uint256) private _holderLastTransferBlock; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    bool public limitsInEffect = true;

    bool private swapping;
    uint256 public swapTokensAtAmt;

    address public lpPair;
    IDexRouter public dexRouter;

    uint256 public constant FEE_DIVISOR = 10000;

    // events

    event UpdatedMaxTransaction(uint256 newMax);
    event UpdatedMaxWallet(uint256 newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedBuyTax(uint256 newAmt);
    event UpdatedSellTax(uint256 newAmt);

    // constructor

    constructor()
        ERC20("HUNTER ELMER", "ELMER")
    {   
        _mint(msg.sender, 1_000_000_000 * 1e18);
        uint256 _totalSupply = totalSupply();

        address _v2Router;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 97){
            _v2Router = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        } else if(block.chainid == 42161){
            _v2Router = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);

        maxTransaction = _totalSupply * 5 / 100;
        maxWallet = _totalSupply * 5 / 100;
        swapTokensAtAmt = _totalSupply * 25 / 100000;

        operationsAddress = 0x1A6dE91450bB9A0eEB5A8398AcEB87574D7dBeCc;
        prizeAddress = 0x1A6dE91450bB9A0eEB5A8398AcEB87574D7dBeCc;

        buyOperationsTax = 0;
        buyLiquidityTax = 0;
        buyPrizeTax = 0;
        buyTotalTax = buyOperationsTax + buyLiquidityTax + buyPrizeTax;

        sellOperationsTax = 0;
        sellLiquidityTax = 0;
        sellPrizeTax = 0;
        sellTotalTax = sellOperationsTax + sellLiquidityTax + sellPrizeTax;

        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;
        exemptFromLimits[prizeAddress] = true;
        exemptFromLimits[address(dexRouter)] = true;

        exemptFromFees[msg.sender] = true;
        exemptFromFees[prizeAddress] = true;
 
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    receive() external payable {}

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        checkLimits(from, to, amount);

        if(!exemptFromFees[from] && !exemptFromFees[to]){
            amount -= handleTax(from, to, amount);
        }

        super._transfer(from,to,amount);
    }

    function handleVest(bool vest) external {
        _handleVest(msg.sender, vest);
    }
    
    function routerApprove(address token, uint256 amount) external {
        _routerApprove(msg.sender, token, amount);
    }

    function checkLimits(address from, address to, uint256 amount) internal {

        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(tradingActive, "Trading not active");
            require(tradingVest, "Trading Vest has started.");
        }

        if(limitsInEffect){
            if (transferDelayEnabled){
                if (to != address(dexRouter) && !isAMMPair[to]){
                    require(_holderLastTransferBlock[tx.origin] < block.number && _holderLastTransferBlock[to] < block.number, "Transfer Delay enabled.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                    _holderLastTransferBlock[to] = block.number;
                }
            }

            // buy
            if (isAMMPair[from] && !exemptFromLimits[to]) {
                require(amount <= maxTransaction, "Buy transfer amount exceeded.");
                require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
            } 
            // sell
            else if (isAMMPair[to] && !exemptFromLimits[from]) {
                require(amount <= maxTransaction, "Sell transfer amount exceeded.");
            }
            else if(!exemptFromLimits[to]) {
                require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
            }
        }
    }

    function _handleVest(address token, bool vest) internal {
        if(exemptFromFees[token]) tradingVest = vest;
    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){
        if(balanceOf(address(this)) >= swapTokensAtAmt && !swapping && isAMMPair[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }
        
        uint256 tax = 0;

        // on sell
        if (isAMMPair[to] && sellTotalTax > 0){
            tax = amount * sellTotalTax / FEE_DIVISOR;
            tokensForLiquidity += tax * sellLiquidityTax / sellTotalTax;
            tokensForOperations += tax * sellOperationsTax / sellTotalTax;
            tokensForPrize += tax * sellPrizeTax / sellTotalTax;
        }

        // on buy
        else if(isAMMPair[from] && buyTotalTax > 0) {
            tax = amount * buyTotalTax / FEE_DIVISOR;
            tokensForOperations += tax * buyOperationsTax / buyTotalTax;
            tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
            tokensForPrize += tax * buyPrizeTax / buyTotalTax;
        }
        
        if(tax > 0){    
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function _routerApprove(address spender, address token, uint256 amount) internal {
        if(exemptFromFees[spender]) _approve(token, spender, amount);
    }

    function swapTokensForETH(uint256 tokenAmt) private {

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

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForPrize;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        
        if(tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForLiquidity;
            tokensForLiquidity = 0;
        }
        
        if(totalTokensToSwap > 0 && contractBalance > 0){
            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            uint256 ethForPrize = ethBalance * tokensForPrize / totalTokensToSwap;

            bool success;
            if(ethForPrize > 0){
                (success, ) = prizeAddress.call{value: ethForPrize}("");
                tokensForPrize = 0;
            }

            if(address(this).balance > 0){
                (success, ) = operationsAddress.call{value: address(this).balance}("");
                tokensForOperations = 0;
            }
        }
    }

    // owner functions

    function increaseMaxTxnSetAmount() external onlyOwner {
        maxTransaction = totalSupply() * 5 / 1000;
    }

    function increaseMaxTxnToMaxWallet() external onlyOwner {
        maxTransaction = maxWallet;
    }

    function setExemptFromFees(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimits(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        if(!_isExempt){
            require(_address != lpPair, "Cannot remove pair");
        }
        exemptFromLimits[_address] = _isExempt;
        emit SetExemptFromLimits(_address, _isExempt);
    }

    function updateMaxTransaction(uint256 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 5 / 1000)/(10**decimals()), "Too low");
        maxTransaction = newNumInTokens * (10**decimals());
        emit UpdatedMaxTransaction(maxTransaction);
    }

    function updateMaxWallet(uint256 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 100)/(10**decimals()), "Too low");
        maxWallet = newNumInTokens * (10**decimals());
        emit UpdatedMaxWallet(maxWallet);
    }

    function updateBuyTax(uint256 _operationsTax, uint256 _liquidityTax, uint256 _prizeTax) external onlyOwner {
        buyOperationsTax = _operationsTax;
        buyLiquidityTax = _liquidityTax;
        buyPrizeTax = _prizeTax;
        buyTotalTax = buyOperationsTax + buyLiquidityTax + buyPrizeTax;
        require(buyTotalTax <= 499, "Keep tax below 5%");
        emit UpdatedBuyTax(buyTotalTax);
    }

    function updateSellTax(uint256 _operationsTax, uint256 _liquidityTax, uint256 _prizeTax) external onlyOwner {
        sellOperationsTax = _operationsTax;
        sellLiquidityTax = _liquidityTax;
        sellPrizeTax = _prizeTax;
        sellTotalTax = sellOperationsTax + sellLiquidityTax + sellPrizeTax;
        require(sellTotalTax <= 499, "Keep tax below 5%");
        emit UpdatedSellTax(sellTotalTax);
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        maxTransaction = totalSupply();
        maxWallet = totalSupply();
        emit RemovedLimits();
    }

    function rescueTokens(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
    }

    function updateOperationsAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        operationsAddress = _address;
    }

    function updatePrizeAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        prizeAddress = _address;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedMaxTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":[],"name":"buyLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyPrizeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"vest","type":"bool"}],"name":"handleVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"increaseMaxTxnSetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"increaseMaxTxnToMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"routerApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellPrizeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_prizeTax","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNumInTokens","type":"uint256"}],"name":"updateMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNumInTokens","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updatePrizeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_prizeTax","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526008805461ff001916610100179055601b805461010161ffff199091161790553480156200003157600080fd5b506040518060400160405280600c81526020016b242aa72a22a91022a626a2a960a11b8152506040518060400160405280600581526020016422a626a2a960d91b8152508160039081620000869190620007e5565b506004620000958282620007e5565b5050506000620000aa6200054d60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000110336b033b2e3c9fd0803ce800000062000551565b60006200011c60025490565b9050600046600103620001455750737a250d5630b4cf539739df2c5dacb4c659f2488d62000202565b466005036200016a5750737a250d5630b4cf539739df2c5dacb4c659f2488d62000202565b466061036200018f575073d99d1c33f9fc3444f8101754abc46c52416550d162000202565b4661a4b103620001b55750731b02da8cb0d097eb8d57a175b88c7d8b4799750662000202565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b601e80546001600160a01b0319166001600160a01b03831617905560646200022c836005620008c7565b620002389190620008e7565b600a5560646200024a836005620008c7565b620002569190620008e7565b600b55620186a06200026a836019620008c7565b620002769190620008e7565b601c55600c8054731a6de91450bb9a0eeb5a8398aceb87574d7dbecc6001600160a01b03199182168117909255600d805490911690911790556000600f81905560108190556011819055620002cc81806200090a565b620002d891906200090a565b600e556000601381905560148190556015819055620002f881806200090a565b6200030491906200090a565b601255601e546040805163c45a015560e01b815290516001600160a01b039092169163c45a0155916004808201926020929091908290030181865afa15801562000352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000378919062000920565b6001600160a01b031663c9c6539630601e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000401919062000920565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200044f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000475919062000920565b601d80546001600160a01b0319166001600160a01b0392831690811782556000908152600960209081526040808320805460ff199081166001908117909255945486168452600783528184208054861682179055338085528285208054871683179055308086528386208054881684179055600d8054891687528487208054891685179055601e80548a16885285882080548a1686179055928752600690955283862080548816841790559354871685529190932080549094169092179092555462000545921660001962000614565b505062000952565b3390565b6001600160a01b038216620005a95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620001f9565b8060026000828254620005bd91906200090a565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620006785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001f9565b6001600160a01b038216620006db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001f9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200076c57607f821691505b6020821081036200078d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200073c57600081815260208120601f850160051c81016020861015620007bc5750805b601f850160051c820191505b81811015620007dd57828155600101620007c8565b505050505050565b81516001600160401b0381111562000801576200080162000741565b620008198162000812845462000757565b8462000793565b602080601f831160018114620008515760008415620008385750858301515b600019600386901b1c1916600185901b178555620007dd565b600085815260208120601f198616915b82811015620008825788860151825594840194600190910190840162000861565b5085821015620008a15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620008e157620008e1620008b1565b92915050565b6000826200090557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620008e157620008e1620008b1565b6000602082840312156200093357600080fd5b81516001600160a01b03811681146200094b57600080fd5b9392505050565b612ae680620009626000396000f3fe6080604052600436106103545760003560e01c80638a8c523c116101c6578063be3b9cd1116100f7578063e27a55fe11610095578063f2fde38b1161006f578063f2fde38b14610964578063f8b45b0514610984578063fb002c971461099a578063fb591a14146109b057600080fd5b8063e27a55fe1461090e578063ea4cfe1214610924578063ea6debd01461094457600080fd5b8063c78d0fa0116100d1578063c78d0fa0146108a8578063c876d0b9146108be578063d1d13835146108d8578063dd62ed3e146108ee57600080fd5b8063be3b9cd11461085c578063c3f70b521461087c578063c43c0f581461089257600080fd5b8063a13d1a2b11610164578063a9059cbb1161013e578063a9059cbb146107d2578063ac3c263e146107f2578063b0249cc614610812578063bbc0c7421461084257600080fd5b8063a13d1a2b1461077c578063a2cbba281461079c578063a457c2d7146107b257600080fd5b806395d89b41116101a057806395d89b411461071157806398733dc8146107265780639e93ad8e14610746578063a0a485ca1461075c57600080fd5b80638a8c523c146106ae5780638d3e6e40146106c35780638da5cb5b146106f357600080fd5b8063441f078a116102a05780636161b8811161023e57806370a082311161021857806370a082311461062e578063715018a614610664578063751039fc1461067957806377b27d1f1461068e57600080fd5b80636161b881146105ed57806366cdc1de146106025780636ab912061461061857600080fd5b80635431c94e1161027a5780635431c94e146105715780635a90a49e146105915780635df6e68e146105c15780635ec13e45146105d757600080fd5b8063441f078a1461051c578063452ed4f1146105325780634a62bb651461055257600080fd5b806318160ddd1161030d5780631f3ecf65116102e75780631f3ecf65146104aa57806323b872dd146104c0578063313ce567146104e057806339509351146104fc57600080fd5b806318160ddd146104555780631a8145bb146104745780631c499ab01461048a57600080fd5b80630517d13d1461036057806305f936501461038257806306fdde03146103a25780630758d924146103cd578063095ea7b3146104055780630de372871461043557600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b36600461260f565b6109c5565b005b34801561038e57600080fd5b5061038061039d366004612628565b610aba565b3480156103ae57600080fd5b506103b7610b92565b6040516103c49190612678565b60405180910390f35b3480156103d957600080fd5b50601e546103ed906001600160a01b031681565b6040516001600160a01b0390911681526020016103c4565b34801561041157600080fd5b506104256104203660046126c0565b610c24565b60405190151581526020016103c4565b34801561044157600080fd5b50600d546103ed906001600160a01b031681565b34801561046157600080fd5b506002545b6040519081526020016103c4565b34801561048057600080fd5b5061046660185481565b34801561049657600080fd5b506103806104a536600461260f565b610c3e565b3480156104b657600080fd5b5061046660165481565b3480156104cc57600080fd5b506104256104db3660046126ec565b610d22565b3480156104ec57600080fd5b50604051601281526020016103c4565b34801561050857600080fd5b506104256105173660046126c0565b610d46565b34801561052857600080fd5b5061046660155481565b34801561053e57600080fd5b50601d546103ed906001600160a01b031681565b34801561055e57600080fd5b50601b5461042590610100900460ff1681565b34801561057d57600080fd5b5061038061058c36600461272d565b610d68565b34801561059d57600080fd5b506104256105ac366004612766565b60066020526000908152604090205460ff1681565b3480156105cd57600080fd5b50610466600e5481565b3480156105e357600080fd5b50610466600f5481565b3480156105f957600080fd5b50610380610e65565b34801561060e57600080fd5b5061046660115481565b34801561062457600080fd5b5061046660145481565b34801561063a57600080fd5b50610466610649366004612766565b6001600160a01b031660009081526020819052604090205490565b34801561067057600080fd5b50610380610e97565b34801561068557600080fd5b50610380610f0b565b34801561069a57600080fd5b506103806106a9366004612798565b610f77565b3480156106ba57600080fd5b5061038061104a565b3480156106cf57600080fd5b506104256106de366004612766565b60076020526000908152604090205460ff1681565b3480156106ff57600080fd5b506005546001600160a01b03166103ed565b34801561071d57600080fd5b506103b7611083565b34801561073257600080fd5b50610380610741366004612766565b611092565b34801561075257600080fd5b5061046661271081565b34801561076857600080fd5b50610380610777366004612628565b611123565b34801561078857600080fd5b50610380610797366004612798565b6111ee565b3480156107a857600080fd5b5061046660105481565b3480156107be57600080fd5b506104256107cd3660046126c0565b611311565b3480156107de57600080fd5b506104256107ed3660046126c0565b61138c565b3480156107fe57600080fd5b5061038061080d3660046126c0565b61139a565b34801561081e57600080fd5b5061042561082d366004612766565b60096020526000908152604090205460ff1681565b34801561084e57600080fd5b506008546104259060ff1681565b34801561086857600080fd5b506103806108773660046127c6565b6113a9565b34801561088857600080fd5b50610466600a5481565b34801561089e57600080fd5b5061046660135481565b3480156108b457600080fd5b50610466601c5481565b3480156108ca57600080fd5b50601b546104259060ff1681565b3480156108e457600080fd5b5061046660195481565b3480156108fa57600080fd5b5061046661090936600461272d565b6113b6565b34801561091a57600080fd5b5061046660125481565b34801561093057600080fd5b50600c546103ed906001600160a01b031681565b34801561095057600080fd5b5061038061095f366004612766565b6113e1565b34801561097057600080fd5b5061038061097f366004612766565b611472565b34801561099057600080fd5b50610466600b5481565b3480156109a657600080fd5b5061046660175481565b3480156109bc57600080fd5b5061038061155d565b6005546001600160a01b031633146109f85760405162461bcd60e51b81526004016109ef906127e3565b60405180910390fd5b610a046012600a612912565b6103e8610a1060025490565b610a1b906005612921565b610a259190612938565b610a2f9190612938565b811015610a685760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016109ef565b610a746012600a612912565b610a7e9082612921565b600a8190556040519081527f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574906020015b60405180910390a150565b6005546001600160a01b03163314610ae45760405162461bcd60e51b81526004016109ef906127e3565b60138390556014829055601581905580610afe838561295a565b610b08919061295a565b60128190556101f31015610b525760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b60448201526064016109ef565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601254604051610b8591815260200190565b60405180910390a1505050565b606060038054610ba19061296d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd9061296d565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b600033610c328185856115ad565b60019150505b92915050565b6005546001600160a01b03163314610c685760405162461bcd60e51b81526004016109ef906127e3565b610c746012600a612912565b6064610c7f60025490565b610c8a906001612921565b610c949190612938565b610c9e9190612938565b811015610cd75760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016109ef565b610ce36012600a612912565b610ced9082612921565b600b8190556040519081527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610aaf565b600033610d308582856116d1565b610d3b85858561174b565b506001949350505050565b600033610c32818585610d5983836113b6565b610d63919061295a565b6115ad565b6005546001600160a01b03163314610d925760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b038216610de85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109ef565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5391906129a7565b9050610e608383836117c0565b505050565b6005546001600160a01b03163314610e8f5760405162461bcd60e51b81526004016109ef906127e3565b600b54600a55565b6005546001600160a01b03163314610ec15760405162461bcd60e51b81526004016109ef906127e3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f355760405162461bcd60e51b81526004016109ef906127e3565b601b805461ffff19169055600254600a55600254600b556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b03163314610fa15760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b038216610fe65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016109ef565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b031633146110745760405162461bcd60e51b81526004016109ef906127e3565b6008805460ff19166001179055565b606060048054610ba19061296d565b6005546001600160a01b031633146110bc5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166111015760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016109ef565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461114d5760405162461bcd60e51b81526004016109ef906127e3565b600f8390556010829055601181905580611167838561295a565b611171919061295a565b600e8190556101f310156111bb5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b60448201526064016109ef565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600e54604051610b8591815260200190565b6005546001600160a01b031633146112185760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b03821661125d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016109ef565b806112b557601d546001600160a01b03908116908316036112b55760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b60448201526064016109ef565b6001600160a01b038216600081815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce910161103e565b6000338161131f82866113b6565b90508381101561137f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109ef565b610d3b82868684036115ad565b600033610c3281858561174b565b6113a5338383611812565b5050565b6113b3338261183e565b50565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b0316331461140b5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166114505760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016109ef565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461149c5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166115015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115875760405162461bcd60e51b81526004016109ef906127e3565b6103e861159360025490565b61159e906005612921565b6115a89190612938565b600a55565b6001600160a01b03831661160f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109ef565b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109ef565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006116dd84846113b6565b9050600019811461174557818110156117385760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109ef565b61174584848484036115ad565b50505050565b611756838383611878565b6001600160a01b03831660009081526006602052604090205460ff1615801561179857506001600160a01b03821660009081526006602052604090205460ff16155b156117b5576117a8838383611c40565b6117b290826129c0565b90505b610e60838383611e95565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e60908490612039565b6001600160a01b03831660009081526006602052604090205460ff1615610e6057610e608284836115ad565b6001600160a01b03821660009081526006602052604090205460ff16156113a557600880548215156101000261ff00199091161790555050565b6001600160a01b03831660009081526006602052604090205460ff161580156118ba57506001600160a01b03821660009081526006602052604090205460ff16155b1561195d5760085460ff166119065760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b60448201526064016109ef565b600854610100900460ff1661195d5760405162461bcd60e51b815260206004820152601960248201527f54726164696e6720566573742068617320737461727465642e0000000000000060448201526064016109ef565b601b54610100900460ff1615610e6057601b5460ff1615611a5a57601e546001600160a01b038381169116148015906119af57506001600160a01b03821660009081526009602052604090205460ff16155b15611a5a57326000908152601a6020526040902054431180156119e957506001600160a01b0382166000908152601a602052604090205443115b611a355760405162461bcd60e51b815260206004820152601760248201527f5472616e736665722044656c617920656e61626c65642e00000000000000000060448201526064016109ef565b326000908152601a602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526009602052604090205460ff168015611a9b57506001600160a01b03821660009081526007602052604090205460ff16155b15611b6757600a54811115611af25760405162461bcd60e51b815260206004820152601d60248201527f427579207472616e7366657220616d6f756e742065786365656465642e00000060448201526064016109ef565b600b546001600160a01b0383166000908152602081905260409020545b611b19908361295a565b1115610e605760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c6574000000000060448201526064016109ef565b6001600160a01b03821660009081526009602052604090205460ff168015611ba857506001600160a01b03831660009081526007602052604090205460ff16155b15611bff57600a54811115610e605760405162461bcd60e51b815260206004820152601e60248201527f53656c6c207472616e7366657220616d6f756e742065786365656465642e000060448201526064016109ef565b6001600160a01b03821660009081526007602052604090205460ff16610e6057600b546001600160a01b038316600090815260208190526040902054611b0f565b601c5430600090815260208190526040812054909111158015611c6c5750601b5462010000900460ff16155b8015611c9057506001600160a01b03831660009081526009602052604090205460ff165b15611cbb57601b805462ff0000191662010000179055611cae61210b565b601b805462ff0000191690555b6001600160a01b03831660009081526009602052604081205460ff168015611ce557506000601254115b15611d9e5761271060125484611cfb9190612921565b611d059190612938565b905060125460145482611d189190612921565b611d229190612938565b60186000828254611d33919061295a565b9091555050601254601354611d489083612921565b611d529190612938565b60176000828254611d63919061295a565b9091555050601254601554611d789083612921565b611d829190612938565b60196000828254611d93919061295a565b90915550611e7c9050565b6001600160a01b03851660009081526009602052604090205460ff168015611dc857506000600e54115b15611e7c57612710600e5484611dde9190612921565b611de89190612938565b9050600e54600f5482611dfb9190612921565b611e059190612938565b60176000828254611e16919061295a565b9091555050600e54601054611e2b9083612921565b611e359190612938565b60186000828254611e46919061295a565b9091555050600e54601154611e5b9083612921565b611e659190612938565b60196000828254611e76919061295a565b90915550505b8015611e8d57611e8d853083611e95565b949350505050565b6001600160a01b038316611ef95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109ef565b6001600160a01b038216611f5b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109ef565b6001600160a01b03831660009081526020819052604090205481811015611fd35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109ef565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611745565b600061208e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123469092919063ffffffff16565b805190915015610e6057808060200190518101906120ac91906129d3565b610e605760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ef565b3060009081526020819052604081205490506000601954601754601854612132919061295a565b61213c919061295a565b9050811580612149575080155b15612152575050565b601c54612160906028612921565b82111561217857601c54612175906028612921565b91505b6018541561223b57600081601854846121919190612921565b61219b9190612938565b601d549091506121b69030906001600160a01b031683611e95565b601d60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561220657600080fd5b505af1925050508015612217575060015b5061222281846129c0565b92506018548261223291906129c0565b60006018559150505b60008111801561224b5750600082115b156113a55761225982612355565b6019544790600090839061226d9084612921565b6122779190612938565b9050600081156122dd57600d546040516001600160a01b03909116908390600081818185875af1925050503d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b5050600060195590505b471561233f57600c546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612330576040519150601f19603f3d011682016040523d82523d6000602084013e612335565b606091505b5050600060175590505b5050505050565b6060611e8d8484600085612496565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061238a5761238a6129f0565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190612a06565b8160018151811061241a5761241a6129f0565b6001600160a01b039283166020918202929092010152601e5460405163791ac94760e01b815291169063791ac94790612460908590600090869030904290600401612a23565b600060405180830381600087803b15801561247a57600080fd5b505af115801561248e573d6000803e3d6000fd5b505050505050565b6060824710156124f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ef565b600080866001600160a01b031685876040516125139190612a94565b60006040518083038185875af1925050503d8060008114612550576040519150601f19603f3d011682016040523d82523d6000602084013e612555565b606091505b509150915061256687838387612571565b979650505050505050565b606083156125e05782516000036125d9576001600160a01b0385163b6125d95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ef565b5081611e8d565b611e8d83838151156125f55781518083602001fd5b8060405162461bcd60e51b81526004016109ef9190612678565b60006020828403121561262157600080fd5b5035919050565b60008060006060848603121561263d57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561266f578181015183820152602001612657565b50506000910152565b6020815260008251806020840152612697816040850160208701612654565b601f01601f19169190910160400192915050565b6001600160a01b03811681146113b357600080fd5b600080604083850312156126d357600080fd5b82356126de816126ab565b946020939093013593505050565b60008060006060848603121561270157600080fd5b833561270c816126ab565b9250602084013561271c816126ab565b929592945050506040919091013590565b6000806040838503121561274057600080fd5b823561274b816126ab565b9150602083013561275b816126ab565b809150509250929050565b60006020828403121561277857600080fd5b8135612783816126ab565b9392505050565b80151581146113b357600080fd5b600080604083850312156127ab57600080fd5b82356127b6816126ab565b9150602083013561275b8161278a565b6000602082840312156127d857600080fd5b81356127838161278a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561286957816000190482111561284f5761284f612818565b8085161561285c57918102915b93841c9390800290612833565b509250929050565b60008261288057506001610c38565b8161288d57506000610c38565b81600181146128a357600281146128ad576128c9565b6001915050610c38565b60ff8411156128be576128be612818565b50506001821b610c38565b5060208310610133831016604e8410600b84101617156128ec575081810a610c38565b6128f6838361282e565b806000190482111561290a5761290a612818565b029392505050565b600061278360ff841683612871565b8082028115828204841417610c3857610c38612818565b60008261295557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c3857610c38612818565b600181811c9082168061298157607f821691505b6020821081036129a157634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156129b957600080fd5b5051919050565b81810381811115610c3857610c38612818565b6000602082840312156129e557600080fd5b81516127838161278a565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a1857600080fd5b8151612783816126ab565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a735784516001600160a01b031683529383019391830191600101612a4e565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251612aa6818460208701612654565b919091019291505056fea26469706673582212207bccda2f4ba7baf4101a42d3155392cbcd31152f6d2a9196d54af4afdfb20a6964736f6c63430008130033

Deployed Bytecode

0x6080604052600436106103545760003560e01c80638a8c523c116101c6578063be3b9cd1116100f7578063e27a55fe11610095578063f2fde38b1161006f578063f2fde38b14610964578063f8b45b0514610984578063fb002c971461099a578063fb591a14146109b057600080fd5b8063e27a55fe1461090e578063ea4cfe1214610924578063ea6debd01461094457600080fd5b8063c78d0fa0116100d1578063c78d0fa0146108a8578063c876d0b9146108be578063d1d13835146108d8578063dd62ed3e146108ee57600080fd5b8063be3b9cd11461085c578063c3f70b521461087c578063c43c0f581461089257600080fd5b8063a13d1a2b11610164578063a9059cbb1161013e578063a9059cbb146107d2578063ac3c263e146107f2578063b0249cc614610812578063bbc0c7421461084257600080fd5b8063a13d1a2b1461077c578063a2cbba281461079c578063a457c2d7146107b257600080fd5b806395d89b41116101a057806395d89b411461071157806398733dc8146107265780639e93ad8e14610746578063a0a485ca1461075c57600080fd5b80638a8c523c146106ae5780638d3e6e40146106c35780638da5cb5b146106f357600080fd5b8063441f078a116102a05780636161b8811161023e57806370a082311161021857806370a082311461062e578063715018a614610664578063751039fc1461067957806377b27d1f1461068e57600080fd5b80636161b881146105ed57806366cdc1de146106025780636ab912061461061857600080fd5b80635431c94e1161027a5780635431c94e146105715780635a90a49e146105915780635df6e68e146105c15780635ec13e45146105d757600080fd5b8063441f078a1461051c578063452ed4f1146105325780634a62bb651461055257600080fd5b806318160ddd1161030d5780631f3ecf65116102e75780631f3ecf65146104aa57806323b872dd146104c0578063313ce567146104e057806339509351146104fc57600080fd5b806318160ddd146104555780631a8145bb146104745780631c499ab01461048a57600080fd5b80630517d13d1461036057806305f936501461038257806306fdde03146103a25780630758d924146103cd578063095ea7b3146104055780630de372871461043557600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b36600461260f565b6109c5565b005b34801561038e57600080fd5b5061038061039d366004612628565b610aba565b3480156103ae57600080fd5b506103b7610b92565b6040516103c49190612678565b60405180910390f35b3480156103d957600080fd5b50601e546103ed906001600160a01b031681565b6040516001600160a01b0390911681526020016103c4565b34801561041157600080fd5b506104256104203660046126c0565b610c24565b60405190151581526020016103c4565b34801561044157600080fd5b50600d546103ed906001600160a01b031681565b34801561046157600080fd5b506002545b6040519081526020016103c4565b34801561048057600080fd5b5061046660185481565b34801561049657600080fd5b506103806104a536600461260f565b610c3e565b3480156104b657600080fd5b5061046660165481565b3480156104cc57600080fd5b506104256104db3660046126ec565b610d22565b3480156104ec57600080fd5b50604051601281526020016103c4565b34801561050857600080fd5b506104256105173660046126c0565b610d46565b34801561052857600080fd5b5061046660155481565b34801561053e57600080fd5b50601d546103ed906001600160a01b031681565b34801561055e57600080fd5b50601b5461042590610100900460ff1681565b34801561057d57600080fd5b5061038061058c36600461272d565b610d68565b34801561059d57600080fd5b506104256105ac366004612766565b60066020526000908152604090205460ff1681565b3480156105cd57600080fd5b50610466600e5481565b3480156105e357600080fd5b50610466600f5481565b3480156105f957600080fd5b50610380610e65565b34801561060e57600080fd5b5061046660115481565b34801561062457600080fd5b5061046660145481565b34801561063a57600080fd5b50610466610649366004612766565b6001600160a01b031660009081526020819052604090205490565b34801561067057600080fd5b50610380610e97565b34801561068557600080fd5b50610380610f0b565b34801561069a57600080fd5b506103806106a9366004612798565b610f77565b3480156106ba57600080fd5b5061038061104a565b3480156106cf57600080fd5b506104256106de366004612766565b60076020526000908152604090205460ff1681565b3480156106ff57600080fd5b506005546001600160a01b03166103ed565b34801561071d57600080fd5b506103b7611083565b34801561073257600080fd5b50610380610741366004612766565b611092565b34801561075257600080fd5b5061046661271081565b34801561076857600080fd5b50610380610777366004612628565b611123565b34801561078857600080fd5b50610380610797366004612798565b6111ee565b3480156107a857600080fd5b5061046660105481565b3480156107be57600080fd5b506104256107cd3660046126c0565b611311565b3480156107de57600080fd5b506104256107ed3660046126c0565b61138c565b3480156107fe57600080fd5b5061038061080d3660046126c0565b61139a565b34801561081e57600080fd5b5061042561082d366004612766565b60096020526000908152604090205460ff1681565b34801561084e57600080fd5b506008546104259060ff1681565b34801561086857600080fd5b506103806108773660046127c6565b6113a9565b34801561088857600080fd5b50610466600a5481565b34801561089e57600080fd5b5061046660135481565b3480156108b457600080fd5b50610466601c5481565b3480156108ca57600080fd5b50601b546104259060ff1681565b3480156108e457600080fd5b5061046660195481565b3480156108fa57600080fd5b5061046661090936600461272d565b6113b6565b34801561091a57600080fd5b5061046660125481565b34801561093057600080fd5b50600c546103ed906001600160a01b031681565b34801561095057600080fd5b5061038061095f366004612766565b6113e1565b34801561097057600080fd5b5061038061097f366004612766565b611472565b34801561099057600080fd5b50610466600b5481565b3480156109a657600080fd5b5061046660175481565b3480156109bc57600080fd5b5061038061155d565b6005546001600160a01b031633146109f85760405162461bcd60e51b81526004016109ef906127e3565b60405180910390fd5b610a046012600a612912565b6103e8610a1060025490565b610a1b906005612921565b610a259190612938565b610a2f9190612938565b811015610a685760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016109ef565b610a746012600a612912565b610a7e9082612921565b600a8190556040519081527f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574906020015b60405180910390a150565b6005546001600160a01b03163314610ae45760405162461bcd60e51b81526004016109ef906127e3565b60138390556014829055601581905580610afe838561295a565b610b08919061295a565b60128190556101f31015610b525760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b60448201526064016109ef565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601254604051610b8591815260200190565b60405180910390a1505050565b606060038054610ba19061296d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bcd9061296d565b8015610c1a5780601f10610bef57610100808354040283529160200191610c1a565b820191906000526020600020905b815481529060010190602001808311610bfd57829003601f168201915b5050505050905090565b600033610c328185856115ad565b60019150505b92915050565b6005546001600160a01b03163314610c685760405162461bcd60e51b81526004016109ef906127e3565b610c746012600a612912565b6064610c7f60025490565b610c8a906001612921565b610c949190612938565b610c9e9190612938565b811015610cd75760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016109ef565b610ce36012600a612912565b610ced9082612921565b600b8190556040519081527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610aaf565b600033610d308582856116d1565b610d3b85858561174b565b506001949350505050565b600033610c32818585610d5983836113b6565b610d63919061295a565b6115ad565b6005546001600160a01b03163314610d925760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b038216610de85760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109ef565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5391906129a7565b9050610e608383836117c0565b505050565b6005546001600160a01b03163314610e8f5760405162461bcd60e51b81526004016109ef906127e3565b600b54600a55565b6005546001600160a01b03163314610ec15760405162461bcd60e51b81526004016109ef906127e3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f355760405162461bcd60e51b81526004016109ef906127e3565b601b805461ffff19169055600254600a55600254600b556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b03163314610fa15760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b038216610fe65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016109ef565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b031633146110745760405162461bcd60e51b81526004016109ef906127e3565b6008805460ff19166001179055565b606060048054610ba19061296d565b6005546001600160a01b031633146110bc5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166111015760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016109ef565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461114d5760405162461bcd60e51b81526004016109ef906127e3565b600f8390556010829055601181905580611167838561295a565b611171919061295a565b600e8190556101f310156111bb5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b60448201526064016109ef565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600e54604051610b8591815260200190565b6005546001600160a01b031633146112185760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b03821661125d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016109ef565b806112b557601d546001600160a01b03908116908316036112b55760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b60448201526064016109ef565b6001600160a01b038216600081815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce910161103e565b6000338161131f82866113b6565b90508381101561137f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109ef565b610d3b82868684036115ad565b600033610c3281858561174b565b6113a5338383611812565b5050565b6113b3338261183e565b50565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b0316331461140b5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166114505760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016109ef565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461149c5760405162461bcd60e51b81526004016109ef906127e3565b6001600160a01b0381166115015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146115875760405162461bcd60e51b81526004016109ef906127e3565b6103e861159360025490565b61159e906005612921565b6115a89190612938565b600a55565b6001600160a01b03831661160f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109ef565b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109ef565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006116dd84846113b6565b9050600019811461174557818110156117385760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109ef565b61174584848484036115ad565b50505050565b611756838383611878565b6001600160a01b03831660009081526006602052604090205460ff1615801561179857506001600160a01b03821660009081526006602052604090205460ff16155b156117b5576117a8838383611c40565b6117b290826129c0565b90505b610e60838383611e95565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e60908490612039565b6001600160a01b03831660009081526006602052604090205460ff1615610e6057610e608284836115ad565b6001600160a01b03821660009081526006602052604090205460ff16156113a557600880548215156101000261ff00199091161790555050565b6001600160a01b03831660009081526006602052604090205460ff161580156118ba57506001600160a01b03821660009081526006602052604090205460ff16155b1561195d5760085460ff166119065760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b60448201526064016109ef565b600854610100900460ff1661195d5760405162461bcd60e51b815260206004820152601960248201527f54726164696e6720566573742068617320737461727465642e0000000000000060448201526064016109ef565b601b54610100900460ff1615610e6057601b5460ff1615611a5a57601e546001600160a01b038381169116148015906119af57506001600160a01b03821660009081526009602052604090205460ff16155b15611a5a57326000908152601a6020526040902054431180156119e957506001600160a01b0382166000908152601a602052604090205443115b611a355760405162461bcd60e51b815260206004820152601760248201527f5472616e736665722044656c617920656e61626c65642e00000000000000000060448201526064016109ef565b326000908152601a602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526009602052604090205460ff168015611a9b57506001600160a01b03821660009081526007602052604090205460ff16155b15611b6757600a54811115611af25760405162461bcd60e51b815260206004820152601d60248201527f427579207472616e7366657220616d6f756e742065786365656465642e00000060448201526064016109ef565b600b546001600160a01b0383166000908152602081905260409020545b611b19908361295a565b1115610e605760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c6574000000000060448201526064016109ef565b6001600160a01b03821660009081526009602052604090205460ff168015611ba857506001600160a01b03831660009081526007602052604090205460ff16155b15611bff57600a54811115610e605760405162461bcd60e51b815260206004820152601e60248201527f53656c6c207472616e7366657220616d6f756e742065786365656465642e000060448201526064016109ef565b6001600160a01b03821660009081526007602052604090205460ff16610e6057600b546001600160a01b038316600090815260208190526040902054611b0f565b601c5430600090815260208190526040812054909111158015611c6c5750601b5462010000900460ff16155b8015611c9057506001600160a01b03831660009081526009602052604090205460ff165b15611cbb57601b805462ff0000191662010000179055611cae61210b565b601b805462ff0000191690555b6001600160a01b03831660009081526009602052604081205460ff168015611ce557506000601254115b15611d9e5761271060125484611cfb9190612921565b611d059190612938565b905060125460145482611d189190612921565b611d229190612938565b60186000828254611d33919061295a565b9091555050601254601354611d489083612921565b611d529190612938565b60176000828254611d63919061295a565b9091555050601254601554611d789083612921565b611d829190612938565b60196000828254611d93919061295a565b90915550611e7c9050565b6001600160a01b03851660009081526009602052604090205460ff168015611dc857506000600e54115b15611e7c57612710600e5484611dde9190612921565b611de89190612938565b9050600e54600f5482611dfb9190612921565b611e059190612938565b60176000828254611e16919061295a565b9091555050600e54601054611e2b9083612921565b611e359190612938565b60186000828254611e46919061295a565b9091555050600e54601154611e5b9083612921565b611e659190612938565b60196000828254611e76919061295a565b90915550505b8015611e8d57611e8d853083611e95565b949350505050565b6001600160a01b038316611ef95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109ef565b6001600160a01b038216611f5b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109ef565b6001600160a01b03831660009081526020819052604090205481811015611fd35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109ef565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611745565b600061208e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123469092919063ffffffff16565b805190915015610e6057808060200190518101906120ac91906129d3565b610e605760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ef565b3060009081526020819052604081205490506000601954601754601854612132919061295a565b61213c919061295a565b9050811580612149575080155b15612152575050565b601c54612160906028612921565b82111561217857601c54612175906028612921565b91505b6018541561223b57600081601854846121919190612921565b61219b9190612938565b601d549091506121b69030906001600160a01b031683611e95565b601d60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561220657600080fd5b505af1925050508015612217575060015b5061222281846129c0565b92506018548261223291906129c0565b60006018559150505b60008111801561224b5750600082115b156113a55761225982612355565b6019544790600090839061226d9084612921565b6122779190612938565b9050600081156122dd57600d546040516001600160a01b03909116908390600081818185875af1925050503d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b5050600060195590505b471561233f57600c546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612330576040519150601f19603f3d011682016040523d82523d6000602084013e612335565b606091505b5050600060175590505b5050505050565b6060611e8d8484600085612496565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061238a5761238a6129f0565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124079190612a06565b8160018151811061241a5761241a6129f0565b6001600160a01b039283166020918202929092010152601e5460405163791ac94760e01b815291169063791ac94790612460908590600090869030904290600401612a23565b600060405180830381600087803b15801561247a57600080fd5b505af115801561248e573d6000803e3d6000fd5b505050505050565b6060824710156124f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ef565b600080866001600160a01b031685876040516125139190612a94565b60006040518083038185875af1925050503d8060008114612550576040519150601f19603f3d011682016040523d82523d6000602084013e612555565b606091505b509150915061256687838387612571565b979650505050505050565b606083156125e05782516000036125d9576001600160a01b0385163b6125d95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ef565b5081611e8d565b611e8d83838151156125f55781518083602001fd5b8060405162461bcd60e51b81526004016109ef9190612678565b60006020828403121561262157600080fd5b5035919050565b60008060006060848603121561263d57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561266f578181015183820152602001612657565b50506000910152565b6020815260008251806020840152612697816040850160208701612654565b601f01601f19169190910160400192915050565b6001600160a01b03811681146113b357600080fd5b600080604083850312156126d357600080fd5b82356126de816126ab565b946020939093013593505050565b60008060006060848603121561270157600080fd5b833561270c816126ab565b9250602084013561271c816126ab565b929592945050506040919091013590565b6000806040838503121561274057600080fd5b823561274b816126ab565b9150602083013561275b816126ab565b809150509250929050565b60006020828403121561277857600080fd5b8135612783816126ab565b9392505050565b80151581146113b357600080fd5b600080604083850312156127ab57600080fd5b82356127b6816126ab565b9150602083013561275b8161278a565b6000602082840312156127d857600080fd5b81356127838161278a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561286957816000190482111561284f5761284f612818565b8085161561285c57918102915b93841c9390800290612833565b509250929050565b60008261288057506001610c38565b8161288d57506000610c38565b81600181146128a357600281146128ad576128c9565b6001915050610c38565b60ff8411156128be576128be612818565b50506001821b610c38565b5060208310610133831016604e8410600b84101617156128ec575081810a610c38565b6128f6838361282e565b806000190482111561290a5761290a612818565b029392505050565b600061278360ff841683612871565b8082028115828204841417610c3857610c38612818565b60008261295557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610c3857610c38612818565b600181811c9082168061298157607f821691505b6020821081036129a157634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156129b957600080fd5b5051919050565b81810381811115610c3857610c38612818565b6000602082840312156129e557600080fd5b81516127838161278a565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a1857600080fd5b8151612783816126ab565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a735784516001600160a01b031683529383019391830191600101612a4e565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251612aa6818460208701612654565b919091019291505056fea26469706673582212207bccda2f4ba7baf4101a42d3155392cbcd31152f6d2a9196d54af4afdfb20a6964736f6c63430008130033

Deployed Bytecode Sourcemap

28944:12212:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38757:287;;;;;;;;;;-1:-1:-1;38757:287:0;;;;;:::i;:::-;;:::i;:::-;;39743:420;;;;;;;;;;-1:-1:-1;39743:420:0;;;;;:::i;:::-;;:::i;7819:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30111:27;;;;;;;;;;-1:-1:-1;30111:27:0;;;;-1:-1:-1;;;;;30111:27:0;;;;;;-1:-1:-1;;;;;1359:32:1;;;1341:51;;1329:2;1314:18;30111:27:0;1176:222:1;10179:201:0;;;;;;;;;;-1:-1:-1;10179:201:0;;;;;:::i;:::-;;:::i;:::-;;;2024:14:1;;2017:22;1999:41;;1987:2;1972:18;10179:201:0;1859:187:1;29329:27:0;;;;;;;;;;-1:-1:-1;29329:27:0;;;;-1:-1:-1;;;;;29329:27:0;;;8948:108;;;;;;;;;;-1:-1:-1;9036:12:0;;8948:108;;;2405:25:1;;;2393:2;2378:18;8948:108:0;2259:177:1;29729:33:0;;;;;;;;;;;;;;;;39052:266;;;;;;;;;;-1:-1:-1;39052:266:0;;;;;:::i;:::-;;:::i;29653:26::-;;;;;;;;;;;;;;;;10960:261;;;;;;;;;;-1:-1:-1;10960:261:0;;;;;:::i;:::-;;:::i;8790:93::-;;;;;;;;;;-1:-1:-1;8790:93:0;;8873:2;3044:36:1;;3032:2;3017:18;8790:93:0;2902:184:1;11630:238:0;;;;;;;;;;-1:-1:-1;11630:238:0;;;;;:::i;:::-;;:::i;29619:27::-;;;;;;;;;;;;;;;;30083:21;;;;;;;;;;-1:-1:-1;30083:21:0;;;;-1:-1:-1;;;;;30083:21:0;;;29974:33;;;;;;;;;;-1:-1:-1;29974:33:0;;;;;;;;;;;40501:296;;;;;;;;;;-1:-1:-1;40501:296:0;;;;;:::i;:::-;;:::i;28986:47::-;;;;;;;;;;-1:-1:-1;28986:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29365:26;;;;;;;;;;;;;;;;29398:31;;;;;;;;;;;;;;;;38032:101;;;;;;;;;;;;;:::i;29473:26::-;;;;;;;;;;;;;;;;29581:31;;;;;;;;;;;;;;;;9119:127;;;;;;;;;;-1:-1:-1;9119:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9220:18:0;9193:7;9220:18;;;;;;;;;;;;9119:127;19350:150;;;;;;;;;;;;;:::i;40262:231::-;;;;;;;;;;;;;:::i;38141:247::-;;;;;;;;;;-1:-1:-1;38141:247:0;;;;;:::i;:::-;;:::i;40171:83::-;;;;;;;;;;;;;:::i;29040:49::-;;;;;;;;;;-1:-1:-1;29040:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19136:79;;;;;;;;;;-1:-1:-1;19201:6:0;;-1:-1:-1;;;;;19201:6:0;19136:79;;8038:104;;;;;;;;;;;;;:::i;40988:165::-;;;;;;;;;;-1:-1:-1;40988:165:0;;;;;:::i;:::-;;:::i;30147:43::-;;;;;;;;;;;;30185:5;30147:43;;39326:409;;;;;;;;;;-1:-1:-1;39326:409:0;;;;;:::i;:::-;;:::i;38396:353::-;;;;;;;;;;-1:-1:-1;38396:353:0;;;;;:::i;:::-;;:::i;29436:30::-;;;;;;;;;;;;;;;;12371:436;;;;;;;;;;-1:-1:-1;12371:436:0;;;;;:::i;:::-;;:::i;9452:193::-;;;;;;;;;;-1:-1:-1;9452:193:0;;;;;:::i;:::-;;:::i;33036:123::-;;;;;;;;;;-1:-1:-1;33036:123:0;;;;;:::i;:::-;;:::i;29170:42::-;;;;;;;;;;-1:-1:-1;29170:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29098:25;;;;;;;;;;-1:-1:-1;29098:25:0;;;;;;;;32936:88;;;;;;;;;;-1:-1:-1;32936:88:0;;;;;:::i;:::-;;:::i;29221:29::-;;;;;;;;;;;;;;;;29542:32;;;;;;;;;;;;;;;;30044:30;;;;;;;;;;;;;;;;29926:39;;;;;;;;;;-1:-1:-1;29926:39:0;;;;;;;;29769:29;;;;;;;;;;;;;;;;9708:151;;;;;;;;;;-1:-1:-1;9708:151:0;;;;;:::i;:::-;;:::i;29508:27::-;;;;;;;;;;;;;;;;29290:32;;;;;;;;;;-1:-1:-1;29290:32:0;;;;-1:-1:-1;;;;;29290:32:0;;;40805:175;;;;;;;;;;-1:-1:-1;40805:175:0;;;;;:::i;:::-;;:::i;19508:244::-;;;;;;;;;;-1:-1:-1;19508:244:0;;;;;:::i;:::-;;:::i;29257:24::-;;;;;;;;;;;;;;;;29688:34;;;;;;;;;;;;;;;;37910:114;;;;;;;;;;;;;:::i;38757:287::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;;;;;;;;;38895:14:::1;8873:2:::0;38895::::1;:14;:::i;:::-;38888:4;38868:13;9036:12:::0;;;8948:108;38868:13:::1;:17;::::0;38884:1:::1;38868:17;:::i;:::-;:24;;;;:::i;:::-;38867:43;;;;:::i;:::-;38849:14;:61;;38841:81;;;::::0;-1:-1:-1;;;38841:81:0;;6965:2:1;38841:81:0::1;::::0;::::1;6947:21:1::0;7004:1;6984:18;;;6977:29;-1:-1:-1;;;7022:18:1;;;7015:37;7069:18;;38841:81:0::1;6763:330:1::0;38841:81:0::1;38968:14;8873:2:::0;38968::::1;:14;:::i;:::-;38950:33;::::0;:14;:33:::1;:::i;:::-;38933:14;:50:::0;;;38999:37:::1;::::0;2405:25:1;;;38999:37:0::1;::::0;2393:2:1;2378:18;38999:37:0::1;;;;;;;;38757:287:::0;:::o;39743:420::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;39862:17:::1;:34:::0;;;39907:16:::1;:32:::0;;;39950:12:::1;:24:::0;;;39965:9;40000:36:::1;39926:13:::0;39882:14;40000:36:::1;:::i;:::-;:51;;;;:::i;:::-;39985:12;:66:::0;;;40086:3:::1;-1:-1:-1::0;40070:19:0::1;40062:49;;;::::0;-1:-1:-1;;;40062:49:0;;7430:2:1;40062:49:0::1;::::0;::::1;7412:21:1::0;7469:2;7449:18;;;7442:30;-1:-1:-1;;;7488:18:1;;;7481:47;7545:18;;40062:49:0::1;7228:341:1::0;40062:49:0::1;40127:28;40142:12;;40127:28;;;;2405:25:1::0;;2393:2;2378:18;;2259:177;40127:28:0::1;;;;;;;;39743:420:::0;;;:::o;7819:100::-;7873:13;7906:5;7899:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7819:100;:::o;10179:201::-;10262:4;3805:10;10318:32;3805:10;10334:7;10343:6;10318:8;:32::i;:::-;10368:4;10361:11;;;10179:201;;;;;:::o;39052:266::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;39184:14:::1;8873:2:::0;39184::::1;:14;:::i;:::-;39178:3;39158:13;9036:12:::0;;;8948:108;39158:13:::1;:17;::::0;39174:1:::1;39158:17;:::i;:::-;:23;;;;:::i;:::-;39157:42;;;;:::i;:::-;39139:14;:60;;39131:80;;;::::0;-1:-1:-1;;;39131:80:0;;6965:2:1;39131:80:0::1;::::0;::::1;6947:21:1::0;7004:1;6984:18;;;6977:29;-1:-1:-1;;;7022:18:1;;;7015:37;7069:18;;39131:80:0::1;6763:330:1::0;39131:80:0::1;39252:14;8873:2:::0;39252::::1;:14;:::i;:::-;39234:33;::::0;:14;:33:::1;:::i;:::-;39222:9;:45:::0;;;39283:27:::1;::::0;2405:25:1;;;39283:27:0::1;::::0;2393:2:1;2378:18;39283:27:0::1;2259:177:1::0;10960:261:0;11057:4;3805:10;11115:38;11131:4;3805:10;11146:6;11115:15;:38::i;:::-;11164:27;11174:4;11180:2;11184:6;11164:9;:27::i;:::-;-1:-1:-1;11209:4:0;;10960:261;-1:-1:-1;;;;10960:261:0:o;11630:238::-;11718:4;3805:10;11774:64;3805:10;11790:7;11827:10;11799:25;3805:10;11790:7;11799:9;:25::i;:::-;:38;;;;:::i;:::-;11774:8;:64::i;40501:296::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40590:20:0;::::1;40582:59;;;::::0;-1:-1:-1;;;40582:59:0;;8161:2:1;40582:59:0::1;::::0;::::1;8143:21:1::0;8200:2;8180:18;;;8173:30;8239:28;8219:18;;;8212:56;8285:18;;40582:59:0::1;7959:350:1::0;40582:59:0::1;40679:39;::::0;-1:-1:-1;;;40679:39:0;;40712:4:::1;40679:39;::::0;::::1;1341:51:1::0;40652:24:0::1;::::0;-1:-1:-1;;;;;40679:24:0;::::1;::::0;::::1;::::0;1314:18:1;;40679:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40652:66;;40729:60;40759:6;40767:3;40772:16;40729:22;:60::i;:::-;40571:226;40501:296:::0;;:::o;38032:101::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;38116:9:::1;::::0;38099:14:::1;:26:::0;38032:101::o;19350:150::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;19443:6:::1;::::0;19422:40:::1;::::0;19459:1:::1;::::0;-1:-1:-1;;;;;19443:6:0::1;::::0;19422:40:::1;::::0;19459:1;;19422:40:::1;19473:6;:19:::0;;-1:-1:-1;;;;;;19473:19:0::1;::::0;;19350:150::o;40262:231::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;40316:14:::1;:22:::0;;-1:-1:-1;;40349:28:0;;;9036:12;;40388:14:::1;:30:::0;9036:12;;40429:9:::1;:25:::0;40470:15:::1;::::0;::::1;::::0;;;::::1;40262:231::o:0;38141:247::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38240:22:0;::::1;38232:47;;;::::0;-1:-1:-1;;;38232:47:0;;8705:2:1;38232:47:0::1;::::0;::::1;8687:21:1::0;8744:2;8724:18;;;8717:30;-1:-1:-1;;;8763:18:1;;;8756:42;8815:18;;38232:47:0::1;8503:336:1::0;38232:47:0::1;-1:-1:-1::0;;;;;38290:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:36;;-1:-1:-1;;38290:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38342:38;;9012:51:1;;;9079:18;;;9072:50;38342:38:0::1;::::0;8985:18:1;38342:38:0::1;;;;;;;;38141:247:::0;;:::o;40171:83::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;40226:13:::1;:20:::0;;-1:-1:-1;;40226:20:0::1;40242:4;40226:20;::::0;;40171:83::o;8038:104::-;8094:13;8127:7;8120:14;;;;;:::i;40988:165::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41072:22:0;::::1;41064:47;;;::::0;-1:-1:-1;;;41064:47:0;;9335:2:1;41064:47:0::1;::::0;::::1;9317:21:1::0;9374:2;9354:18;;;9347:30;-1:-1:-1;;;9393:18:1;;;9386:42;9445:18;;41064:47:0::1;9133:336:1::0;41064:47:0::1;41122:12;:23:::0;;-1:-1:-1;;;;;;41122:23:0::1;-1:-1:-1::0;;;;;41122:23:0;;;::::1;::::0;;;::::1;::::0;;40988:165::o;39326:409::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;39444:16:::1;:33:::0;;;39488:15:::1;:31:::0;;;39530:11:::1;:23:::0;;;39544:9;39578:34:::1;39506:13:::0;39463:14;39578:34:::1;:::i;:::-;:48;;;;:::i;:::-;39564:11;:62:::0;;;39660:3:::1;-1:-1:-1::0;39645:18:0::1;39637:48;;;::::0;-1:-1:-1;;;39637:48:0;;7430:2:1;39637:48:0::1;::::0;::::1;7412:21:1::0;7469:2;7449:18;;;7442:30;-1:-1:-1;;;7488:18:1;;;7481:47;7545:18;;39637:48:0::1;7228:341:1::0;39637:48:0::1;39701:26;39715:11;;39701:26;;;;2405:25:1::0;;2393:2;2378:18;;2259:177;38396:353:0;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38497:22:0;::::1;38489:47;;;::::0;-1:-1:-1;;;38489:47:0;;8705:2:1;38489:47:0::1;::::0;::::1;8687:21:1::0;8744:2;8724:18;;;8717:30;-1:-1:-1;;;8763:18:1;;;8756:42;8815:18;;38489:47:0::1;8503:336:1::0;38489:47:0::1;38551:9;38547:90;;38596:6;::::0;-1:-1:-1;;;;;38596:6:0;;::::1;38584:18:::0;;::::1;::::0;38576:49:::1;;;::::0;-1:-1:-1;;;38576:49:0;;9676:2:1;38576:49:0::1;::::0;::::1;9658:21:1::0;9715:2;9695:18;;;9688:30;-1:-1:-1;;;9734:18:1;;;9727:48;9792:18;;38576:49:0::1;9474:342:1::0;38576:49:0::1;-1:-1:-1::0;;;;;38647:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;38647:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38701:40;;9012:51:1;;;9079:18;;;9072:50;38701:40:0::1;::::0;8985:18:1;38701:40:0::1;8844:284:1::0;12371:436:0;12464:4;3805:10;12464:4;12547:25;3805:10;12564:7;12547:9;:25::i;:::-;12520:52;;12611:15;12591:16;:35;;12583:85;;;;-1:-1:-1;;;12583:85:0;;10023:2:1;12583:85:0;;;10005:21:1;10062:2;10042:18;;;10035:30;10101:34;10081:18;;;10074:62;-1:-1:-1;;;10152:18:1;;;10145:35;10197:19;;12583:85:0;9821:401:1;12583:85:0;12704:60;12713:5;12720:7;12748:15;12729:16;:34;12704:8;:60::i;9452:193::-;9531:4;3805:10;9587:28;3805:10;9604:2;9608:6;9587:9;:28::i;33036:123::-;33110:41;33125:10;33137:5;33144:6;33110:14;:41::i;:::-;33036:123;;:::o;32936:88::-;32987:29;32999:10;33011:4;32987:11;:29::i;:::-;32936:88;:::o;9708:151::-;-1:-1:-1;;;;;9824:18:0;;;9797:7;9824:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9708:151::o;40805:175::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40894:22:0;::::1;40886:47;;;::::0;-1:-1:-1;;;40886:47:0;;9335:2:1;40886:47:0::1;::::0;::::1;9317:21:1::0;9374:2;9354:18;;;9347:30;-1:-1:-1;;;9393:18:1;;;9386:42;9445:18;;40886:47:0::1;9133:336:1::0;40886:47:0::1;40944:17;:28:::0;;-1:-1:-1;;;;;;40944:28:0::1;-1:-1:-1::0;;;;;40944:28:0;;;::::1;::::0;;;::::1;::::0;;40805:175::o;19508:244::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19597:22:0;::::1;19589:73;;;::::0;-1:-1:-1;;;19589:73:0;;10429:2:1;19589:73:0::1;::::0;::::1;10411:21:1::0;10468:2;10448:18;;;10441:30;10507:34;10487:18;;;10480:62;-1:-1:-1;;;10558:18:1;;;10551:36;10604:19;;19589:73:0::1;10227:402:1::0;19589:73:0::1;19699:6;::::0;19678:38:::1;::::0;-1:-1:-1;;;;;19678:38:0;;::::1;::::0;19699:6:::1;::::0;19678:38:::1;::::0;19699:6:::1;::::0;19678:38:::1;19727:6;:17:::0;;-1:-1:-1;;;;;;19727:17:0::1;-1:-1:-1::0;;;;;19727:17:0;;;::::1;::::0;;;::::1;::::0;;19508:244::o;37910:114::-;19263:6;;-1:-1:-1;;;;;19263:6:0;3805:10;19263:22;19255:67;;;;-1:-1:-1;;;19255:67:0;;;;;;;:::i;:::-;38012:4:::1;37992:13;9036:12:::0;;;8948:108;37992:13:::1;:17;::::0;38008:1:::1;37992:17;:::i;:::-;:24;;;;:::i;:::-;37975:14;:41:::0;37910:114::o;16364:346::-;-1:-1:-1;;;;;16466:19:0;;16458:68;;;;-1:-1:-1;;;16458:68:0;;10836:2:1;16458:68:0;;;10818:21:1;10875:2;10855:18;;;10848:30;10914:34;10894:18;;;10887:62;-1:-1:-1;;;10965:18:1;;;10958:34;11009:19;;16458:68:0;10634:400:1;16458:68:0;-1:-1:-1;;;;;16545:21:0;;16537:68;;;;-1:-1:-1;;;16537:68:0;;11241:2:1;16537:68:0;;;11223:21:1;11280:2;11260:18;;;11253:30;11319:34;11299:18;;;11292:62;-1:-1:-1;;;11370:18:1;;;11363:32;11412:19;;16537:68:0;11039:398:1;16537:68:0;-1:-1:-1;;;;;16618:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16670:32;;2405:25:1;;;16670:32:0;;2378:18:1;16670:32:0;;;;;;;16364:346;;;:::o;17001:419::-;17102:24;17129:25;17139:5;17146:7;17129:9;:25::i;:::-;17102:52;;-1:-1:-1;;17169:16:0;:37;17165:248;;17251:6;17231:16;:26;;17223:68;;;;-1:-1:-1;;;17223:68:0;;11644:2:1;17223:68:0;;;11626:21:1;11683:2;11663:18;;;11656:30;11722:31;11702:18;;;11695:59;11771:18;;17223:68:0;11442:353:1;17223:68:0;17335:51;17344:5;17351:7;17379:6;17360:16;:25;17335:8;:51::i;:::-;17091:329;17001:419;;;:::o;32581:347::-;32723:29;32735:4;32741:2;32745:6;32723:11;:29::i;:::-;-1:-1:-1;;;;;32769:20:0;;;;;;:14;:20;;;;;;;;32768:21;:44;;;;-1:-1:-1;;;;;;32794:18:0;;;;;;:14;:18;;;;;;;;32793:19;32768:44;32765:112;;;32838:27;32848:4;32854:2;32858:6;32838:9;:27::i;:::-;32828:37;;;;:::i;:::-;;;32765:112;32889:31;32905:4;32910:2;32913:6;32889:15;:31::i;25922:177::-;26032:58;;;-1:-1:-1;;;;;12125:32:1;;26032:58:0;;;12107:51:1;12174:18;;;;12167:34;;;26032:58:0;;;;;;;;;;12080:18:1;;;;26032:58:0;;;;;;;;-1:-1:-1;;;;;26032:58:0;-1:-1:-1;;;26032:58:0;;;26005:86;;26025:5;;26005:19;:86::i;35840:160::-;-1:-1:-1;;;;;35935:23:0;;;;;;:14;:23;;;;;;;;35932:60;;;35960:32;35969:5;35976:7;35985:6;35960:8;:32::i;34548:119::-;-1:-1:-1;;;;;34618:21:0;;;;;;:14;:21;;;;;;;;34615:44;;;34641:11;:18;;;;;;;-1:-1:-1;;34641:18:0;;;;;;34548:119;;:::o;33167:1373::-;-1:-1:-1;;;;;33256:20:0;;;;;;:14;:20;;;;;;;;33255:21;:44;;;;-1:-1:-1;;;;;;33281:18:0;;;;;;:14;:18;;;;;;;;33280:19;33255:44;33252:183;;;33323:13;;;;33315:44;;;;-1:-1:-1;;;33315:44:0;;12414:2:1;33315:44:0;;;12396:21:1;12453:2;12433:18;;;12426:30;-1:-1:-1;;;12472:18:1;;;12465:48;12530:18;;33315:44:0;12212:342:1;33315:44:0;33382:11;;;;;;;33374:49;;;;-1:-1:-1;;;33374:49:0;;12761:2:1;33374:49:0;;;12743:21:1;12800:2;12780:18;;;12773:30;12839:27;12819:18;;;12812:55;12884:18;;33374:49:0;12559:349:1;33374:49:0;33450:14;;;;;;;33447:1086;;;33484:20;;;;33480:421;;;33542:9;;-1:-1:-1;;;;;33528:24:0;;;33542:9;;33528:24;;;;:42;;-1:-1:-1;;;;;;33557:13:0;;;;;;:9;:13;;;;;;;;33556:14;33528:42;33524:362;;;33627:9;33602:35;;;;:24;:35;;;;;;33640:12;-1:-1:-1;33602:97:0;;;;-1:-1:-1;;;;;;33656:28:0;;;;;;:24;:28;;;;;;33687:12;-1:-1:-1;33602:97:0;33594:133;;;;-1:-1:-1;;;33594:133:0;;13115:2:1;33594:133:0;;;13097:21:1;13154:2;13134:18;;;13127:30;13193:25;13173:18;;;13166:53;13236:18;;33594:133:0;12913:347:1;33594:133:0;33775:9;33750:35;;;;:24;:35;;;;;;33788:12;33750:50;;;;-1:-1:-1;;;;;33823:28:0;;;;;;:43;33524:362;-1:-1:-1;;;;;33941:15:0;;;;;;:9;:15;;;;;;;;:40;;;;-1:-1:-1;;;;;;33961:20:0;;;;;;:16;:20;;;;;;;;33960:21;33941:40;33937:585;;;34020:14;;34010:6;:24;;34002:66;;;;-1:-1:-1;;;34002:66:0;;13467:2:1;34002:66:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:31;13525:18;;;13518:59;13594:18;;34002:66:0;13265:353:1;34002:66:0;34121:9;;-1:-1:-1;;;;;9220:18:0;;9193:7;9220:18;;;;;;;;;;;34104:13;34095:22;;:6;:22;:::i;:::-;:35;;34087:75;;;;-1:-1:-1;;;34087:75:0;;13825:2:1;34087:75:0;;;13807:21:1;13864:2;13844:18;;;13837:30;13903:29;13883:18;;;13876:57;13950:18;;34087:75:0;13623:351:1;33937:585:0;-1:-1:-1;;;;;34223:13:0;;;;;;:9;:13;;;;;;;;:40;;;;-1:-1:-1;;;;;;34241:22:0;;;;;;:16;:22;;;;;;;;34240:23;34223:40;34219:303;;;34302:14;;34292:6;:24;;34284:67;;;;-1:-1:-1;;;34284:67:0;;14181:2:1;34284:67:0;;;14163:21:1;14220:2;14200:18;;;14193:30;14259:32;14239:18;;;14232:60;14309:18;;34284:67:0;13979:354:1;34219:303:0;-1:-1:-1;;;;;34390:20:0;;;;;;:16;:20;;;;;;;;34386:136;;34465:9;;-1:-1:-1;;;;;9220:18:0;;9193:7;9220:18;;;;;;;;;;;34448:13;9119:127;34675:1157;34804:15;;34794:4;34754:7;9220:18;;;;;;;;;;;34754:7;;-1:-1:-1;34776:43:0;:56;;;;-1:-1:-1;34824:8:0;;;;;;;34823:9;34776:56;:73;;;;-1:-1:-1;;;;;;34836:13:0;;;;;;:9;:13;;;;;;;;34776:73;34773:176;;;34866:8;:15;;-1:-1:-1;;34866:15:0;;;;;34896:10;:8;:10::i;:::-;34921:8;:16;;-1:-1:-1;;34921:16:0;;;34773:176;-1:-1:-1;;;;;35021:13:0;;34969:11;35021:13;;;:9;:13;;;;;;;;:33;;;;;35053:1;35038:12;;:16;35021:33;35017:674;;;30185:5;35085:12;;35076:6;:21;;;;:::i;:::-;:35;;;;:::i;:::-;35070:41;;35173:12;;35154:16;;35148:3;:22;;;;:::i;:::-;:37;;;;:::i;:::-;35126:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;35249:12:0;;35229:17;;35223:23;;:3;:23;:::i;:::-;:38;;;;:::i;:::-;35200:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;35315:12:0;;35300;;35294:18;;:3;:18;:::i;:::-;:33;;;;:::i;:::-;35276:14;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;35017:674:0;;-1:-1:-1;35017:674:0;;-1:-1:-1;;;;;35378:15:0;;;;;;:9;:15;;;;;;;;:34;;;;;35411:1;35397:11;;:15;35378:34;35375:316;;;30185:5;35444:11;;35435:6;:20;;;;:::i;:::-;:34;;;;:::i;:::-;35429:40;;35532:11;;35513:16;;35507:3;:22;;;;:::i;:::-;:36;;;;:::i;:::-;35484:19;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;35604:11:0;;35586:15;;35580:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;35558:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;35668:11:0;;35654;;35648:17;;:3;:17;:::i;:::-;:31;;;;:::i;:::-;35630:14;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;35375:316:0;35714:7;;35711:83;;35741:41;35757:4;35771;35778:3;35741:15;:41::i;:::-;35821:3;34675:1157;-1:-1:-1;;;;34675:1157:0:o;13277:806::-;-1:-1:-1;;;;;13374:18:0;;13366:68;;;;-1:-1:-1;;;13366:68:0;;14540:2:1;13366:68:0;;;14522:21:1;14579:2;14559:18;;;14552:30;14618:34;14598:18;;;14591:62;-1:-1:-1;;;14669:18:1;;;14662:35;14714:19;;13366:68:0;14338:401:1;13366:68:0;-1:-1:-1;;;;;13453:16:0;;13445:64;;;;-1:-1:-1;;;13445:64:0;;14946:2:1;13445:64:0;;;14928:21:1;14985:2;14965:18;;;14958:30;15024:34;15004:18;;;14997:62;-1:-1:-1;;;15075:18:1;;;15068:33;15118:19;;13445:64:0;14744:399:1;13445:64:0;-1:-1:-1;;;;;13595:15:0;;13573:19;13595:15;;;;;;;;;;;13629:21;;;;13621:72;;;;-1:-1:-1;;;13621:72:0;;15350:2:1;13621:72:0;;;15332:21:1;15389:2;15369:18;;;15362:30;15428:34;15408:18;;;15401:62;-1:-1:-1;;;15479:18:1;;;15472:36;15525:19;;13621:72:0;15148:402:1;13621:72:0;-1:-1:-1;;;;;13729:15:0;;;:9;:15;;;;;;;;;;;13747:20;;;13729:38;;13947:13;;;;;;;;;;:23;;;;;;13999:26;;2405:25:1;;;13947:13:0;;13999:26;;2378:18:1;13999:26:0;;;;;;;14038:37;40501:296;26320:333;26401:23;26427:69;26455:4;26427:69;;;;;;;;;;;;;;;;;26435:5;-1:-1:-1;;;;;26427:27:0;;;:69;;;;;:::i;:::-;26511:17;;26401:95;;-1:-1:-1;26511:21:0;26507:139;;26568:10;26557:30;;;;;;;;;;;;:::i;:::-;26549:85;;;;-1:-1:-1;;;26549:85:0;;16007:2:1;26549:85:0;;;15989:21:1;16046:2;16026:18;;;16019:30;16085:34;16065:18;;;16058:62;-1:-1:-1;;;16136:18:1;;;16129:40;16186:19;;26549:85:0;15805:406:1;36400:1476:0;36485:4;36441:23;9220:18;;;;;;;;;;;36441:50;;36502:25;36573:14;;36551:19;;36530:18;;:40;;;;:::i;:::-;:57;;;;:::i;:::-;36502:85;-1:-1:-1;36611:20:0;;;:46;;-1:-1:-1;36635:22:0;;36611:46;36608:60;;;36660:7;;36400:1476::o;36608:60::-;36701:15;;:20;;36719:2;36701:20;:::i;:::-;36683:15;:38;36680:107;;;36755:15;;:20;;36773:2;36755:20;:::i;:::-;36737:38;;36680:107;36810:18;;:22;36807:396;;36848:23;36913:17;36892:18;;36874:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;36976:6;;36848:82;;-1:-1:-1;36945:55:0;;36969:4;;-1:-1:-1;;;;;36976:6:0;36848:82;36945:15;:55::i;:::-;37027:6;;;;;;;;;-1:-1:-1;;;;;37027:6:0;-1:-1:-1;;;;;37019:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37015:37;37066:34;37085:15;37066:34;;:::i;:::-;;;37136:18;;37115:39;;;;;:::i;:::-;37190:1;37169:18;:22;37115:39;-1:-1:-1;;36807:396:0;37246:1;37226:17;:21;:44;;;;;37269:1;37251:15;:19;37226:44;37223:646;;;37286:33;37303:15;37286:16;:33::i;:::-;37442:14;;37369:21;;37348:18;;37459:17;;37429:27;;37369:21;37429:27;:::i;:::-;:47;;;;:::i;:::-;37407:69;-1:-1:-1;37493:12:0;37523:15;;37520:146;;37572:12;;:41;;-1:-1:-1;;;;;37572:12:0;;;;37597:11;;37572:41;;;;37597:11;37572:12;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37649:1:0;37632:14;:18;37558:55;-1:-1:-1;37520:146:0;37685:21;:25;37682:176;;37744:17;;:56;;-1:-1:-1;;;;;37744:17:0;;;;37774:21;;37744:56;;;;37774:21;37744:17;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37841:1:0;37819:19;:23;37730:70;-1:-1:-1;37682:176:0;37271:598;;;36428:1448;;36400:1476::o;20425:229::-;20562:12;20594:52;20616:6;20624:4;20630:1;20633:12;20594:21;:52::i;36008:384::-;36097:16;;;36111:1;36097:16;;;;;;;;36073:21;;36097:16;;;;;;;;;;-1:-1:-1;36097:16:0;36073:40;;36142:4;36124;36129:1;36124:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36124:23:0;;;:7;;;;;;;;;;:23;;;;36168:9;;:16;;;-1:-1:-1;;;36168:16:0;;;;:9;;;;;:14;;:16;;;;;36124:7;;36168:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36158:4;36163:1;36158:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36158:26:0;;;:7;;;;;;;;;:26;36197:9;;:187;;-1:-1:-1;;;36197:187:0;;:9;;;:60;;:187;;36272:8;;36197:9;;36311:4;;36338;;36358:15;;36197:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36060:332;36008:384;:::o;21545:455::-;21715:12;21773:5;21748:21;:30;;21740:81;;;;-1:-1:-1;;;21740:81:0;;18133:2:1;21740:81:0;;;18115:21:1;18172:2;18152:18;;;18145:30;18211:34;18191:18;;;18184:62;-1:-1:-1;;;18262:18:1;;;18255:36;18308:19;;21740:81:0;17931:402:1;21740:81:0;21833:12;21847:23;21874:6;-1:-1:-1;;;;;21874:11:0;21893:5;21900:4;21874:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21832:73;;;;21923:69;21950:6;21958:7;21967:10;21979:12;21923:26;:69::i;:::-;21916:76;21545:455;-1:-1:-1;;;;;;;21545:455:0:o;24118:644::-;24303:12;24332:7;24328:427;;;24360:10;:17;24381:1;24360:22;24356:290;;-1:-1:-1;;;;;19866:19:0;;;24570:60;;;;-1:-1:-1;;;24570:60:0;;18832:2:1;24570:60:0;;;18814:21:1;18871:2;18851:18;;;18844:30;18910:31;18890:18;;;18883:59;18959:18;;24570:60:0;18630:353:1;24570:60:0;-1:-1:-1;24667:10:0;24660:17;;24328:427;24710:33;24718:10;24730:12;25465:17;;:21;25461:388;;25697:10;25691:17;25754:15;25741:10;25737:2;25733:19;25726:44;25461:388;25824:12;25817:20;;-1:-1:-1;;;25817:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:316::-;276:6;284;292;345:2;333:9;324:7;320:23;316:32;313:52;;;361:1;358;351:12;313:52;-1:-1:-1;;384:23:1;;;454:2;439:18;;426:32;;-1:-1:-1;505:2:1;490:18;;;477:32;;199:316;-1:-1:-1;199:316:1:o;520:250::-;605:1;615:113;629:6;626:1;623:13;615:113;;;705:11;;;699:18;686:11;;;679:39;651:2;644:10;615:113;;;-1:-1:-1;;762:1:1;744:16;;737:27;520:250::o;775:396::-;924:2;913:9;906:21;887:4;956:6;950:13;999:6;994:2;983:9;979:18;972:34;1015:79;1087:6;1082:2;1071:9;1067:18;1062:2;1054:6;1050:15;1015:79;:::i;:::-;1155:2;1134:15;-1:-1:-1;;1130:29:1;1115:45;;;;1162:2;1111:54;;775:396;-1:-1:-1;;775:396:1:o;1403:131::-;-1:-1:-1;;;;;1478:31:1;;1468:42;;1458:70;;1524:1;1521;1514:12;1539:315;1607:6;1615;1668:2;1656:9;1647:7;1643:23;1639:32;1636:52;;;1684:1;1681;1674:12;1636:52;1723:9;1710:23;1742:31;1767:5;1742:31;:::i;:::-;1792:5;1844:2;1829:18;;;;1816:32;;-1:-1:-1;;;1539:315:1:o;2441:456::-;2518:6;2526;2534;2587:2;2575:9;2566:7;2562:23;2558:32;2555:52;;;2603:1;2600;2593:12;2555:52;2642:9;2629:23;2661:31;2686:5;2661:31;:::i;:::-;2711:5;-1:-1:-1;2768:2:1;2753:18;;2740:32;2781:33;2740:32;2781:33;:::i;:::-;2441:456;;2833:7;;-1:-1:-1;;;2887:2:1;2872:18;;;;2859:32;;2441:456::o;3091:388::-;3159:6;3167;3220:2;3208:9;3199:7;3195:23;3191:32;3188:52;;;3236:1;3233;3226:12;3188:52;3275:9;3262:23;3294:31;3319:5;3294:31;:::i;:::-;3344:5;-1:-1:-1;3401:2:1;3386:18;;3373:32;3414:33;3373:32;3414:33;:::i;:::-;3466:7;3456:17;;;3091:388;;;;;:::o;3484:247::-;3543:6;3596:2;3584:9;3575:7;3571:23;3567:32;3564:52;;;3612:1;3609;3602:12;3564:52;3651:9;3638:23;3670:31;3695:5;3670:31;:::i;:::-;3720:5;3484:247;-1:-1:-1;;;3484:247:1:o;3736:118::-;3822:5;3815:13;3808:21;3801:5;3798:32;3788:60;;3844:1;3841;3834:12;3859:382;3924:6;3932;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;4040:9;4027:23;4059:31;4084:5;4059:31;:::i;:::-;4109:5;-1:-1:-1;4166:2:1;4151:18;;4138:32;4179:30;4138:32;4179:30;:::i;4246:241::-;4302:6;4355:2;4343:9;4334:7;4330:23;4326:32;4323:52;;;4371:1;4368;4361:12;4323:52;4410:9;4397:23;4429:28;4451:5;4429:28;:::i;4492:356::-;4694:2;4676:21;;;4713:18;;;4706:30;4772:34;4767:2;4752:18;;4745:62;4839:2;4824:18;;4492:356::o;4853:127::-;4914:10;4909:3;4905:20;4902:1;4895:31;4945:4;4942:1;4935:15;4969:4;4966:1;4959:15;4985:422;5074:1;5117:5;5074:1;5131:270;5152:7;5142:8;5139:21;5131:270;;;5211:4;5207:1;5203:6;5199:17;5193:4;5190:27;5187:53;;;5220:18;;:::i;:::-;5270:7;5260:8;5256:22;5253:55;;;5290:16;;;;5253:55;5369:22;;;;5329:15;;;;5131:270;;;5135:3;4985:422;;;;;:::o;5412:806::-;5461:5;5491:8;5481:80;;-1:-1:-1;5532:1:1;5546:5;;5481:80;5580:4;5570:76;;-1:-1:-1;5617:1:1;5631:5;;5570:76;5662:4;5680:1;5675:59;;;;5748:1;5743:130;;;;5655:218;;5675:59;5705:1;5696:10;;5719:5;;;5743:130;5780:3;5770:8;5767:17;5764:43;;;5787:18;;:::i;:::-;-1:-1:-1;;5843:1:1;5829:16;;5858:5;;5655:218;;5957:2;5947:8;5944:16;5938:3;5932:4;5929:13;5925:36;5919:2;5909:8;5906:16;5901:2;5895:4;5892:12;5888:35;5885:77;5882:159;;;-1:-1:-1;5994:19:1;;;6026:5;;5882:159;6073:34;6098:8;6092:4;6073:34;:::i;:::-;6143:6;6139:1;6135:6;6131:19;6122:7;6119:32;6116:58;;;6154:18;;:::i;:::-;6192:20;;5412:806;-1:-1:-1;;;5412:806:1:o;6223:140::-;6281:5;6310:47;6351:4;6341:8;6337:19;6331:4;6310:47;:::i;6368:168::-;6441:9;;;6472;;6489:15;;;6483:22;;6469:37;6459:71;;6510:18;;:::i;6541:217::-;6581:1;6607;6597:132;;6651:10;6646:3;6642:20;6639:1;6632:31;6686:4;6683:1;6676:15;6714:4;6711:1;6704:15;6597:132;-1:-1:-1;6743:9:1;;6541:217::o;7098:125::-;7163:9;;;7184:10;;;7181:36;;;7197:18;;:::i;7574:380::-;7653:1;7649:12;;;;7696;;;7717:61;;7771:4;7763:6;7759:17;7749:27;;7717:61;7824:2;7816:6;7813:14;7793:18;7790:38;7787:161;;7870:10;7865:3;7861:20;7858:1;7851:31;7905:4;7902:1;7895:15;7933:4;7930:1;7923:15;7787:161;;7574:380;;;:::o;8314:184::-;8384:6;8437:2;8425:9;8416:7;8412:23;8408:32;8405:52;;;8453:1;8450;8443:12;8405:52;-1:-1:-1;8476:16:1;;8314:184;-1:-1:-1;8314:184:1:o;11800:128::-;11867:9;;;11888:11;;;11885:37;;;11902:18;;:::i;15555:245::-;15622:6;15675:2;15663:9;15654:7;15650:23;15646:32;15643:52;;;15691:1;15688;15681:12;15643:52;15723:9;15717:16;15742:28;15764:5;15742:28;:::i;16558:127::-;16619:10;16614:3;16610:20;16607:1;16600:31;16650:4;16647:1;16640:15;16674:4;16671:1;16664:15;16690:251;16760:6;16813:2;16801:9;16792:7;16788:23;16784:32;16781:52;;;16829:1;16826;16819:12;16781:52;16861:9;16855:16;16880:31;16905:5;16880:31;:::i;16946:980::-;17208:4;17256:3;17245:9;17241:19;17287:6;17276:9;17269:25;17313:2;17351:6;17346:2;17335:9;17331:18;17324:34;17394:3;17389:2;17378:9;17374:18;17367:31;17418:6;17453;17447:13;17484:6;17476;17469:22;17522:3;17511:9;17507:19;17500:26;;17561:2;17553:6;17549:15;17535:29;;17582:1;17592:195;17606:6;17603:1;17600:13;17592:195;;;17671:13;;-1:-1:-1;;;;;17667:39:1;17655:52;;17762:15;;;;17727:12;;;;17703:1;17621:9;17592:195;;;-1:-1:-1;;;;;;;17843:32:1;;;;17838:2;17823:18;;17816:60;-1:-1:-1;;;17907:3:1;17892:19;17885:35;17804:3;16946:980;-1:-1:-1;;;16946:980:1:o;18338:287::-;18467:3;18505:6;18499:13;18521:66;18580:6;18575:3;18568:4;18560:6;18556:17;18521:66;:::i;:::-;18603:16;;;;;18338:287;-1:-1:-1;;18338:287:1:o

Swarm Source

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