ETH Price: $3,272.11 (-4.06%)
Gas: 7 Gwei

Token

0xOS AI (0xOS)
 

Overview

Max Total Supply

1,000,000,000 0xOS

Holders

416 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$24,270.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
privatepoor.eth
Balance
0.000000000429170618 0xOS

Value
$0.00 ( ~0 Eth) [0.0000%]
0x89A500AE0097f7f2A124dcDc18d8056Bc6D856DC
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

0xOS AI is committed to integrating the most advanced AI technologies in redefining how users interact with blockchain data.

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V2 (Ethereum)
0X74588AF8DE14287E91D89758636D277D66F217B6-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.00
0.0000000 Eth
$20.07
822,569.650 0X74588AF8DE14287E91D89758636D277D66F217B6
100.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
Contract

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**

Decentralized AI-based (DeAI) library & all-in-one service platform simplifying access to blockchain contracts/data (ERC20). Hold #0xOS, earn #ETH distribution.

Twitter/X:
twitter.com/0xOSAI

Linktree:
linktr.ee/0xOS

Website:
0xos.ai

Telegram:
t.me/Portal0xOS

Main Documentation:
documentation.0xos.ai


*/

pragma solidity 0.8.23;

// 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");

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

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

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

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

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;
    function mint(address to) external returns (uint liquidity);
}

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 getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

contract Contract is ERC20, Ownable {

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

    mapping (address => bool) public isAMMPair;

    address public marketingAddress;
    address public buybackAddress;
    address public redistroAddress;

    Taxes public buyTax;
    Taxes public sellTax;

    TokensForTax public tokensForTax;

    bool public limited = true;

    uint256 public swapTokensAtAmt;

    address public lpPair;
    IDexRouter internal dexRouter;
    IWETH internal immutable WETH;

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

    TxLimits public txLimits;

    uint64 public constant FEE_DIVISOR = 10000;

    // structs

    struct TxLimits {
        uint128 transactionLimit;
        uint128 walletLimit;
    }

    struct Taxes {
        uint48 marketingTax;
        uint48 buybackTax;
        uint48 redistroTax;
        uint48 totalTax;
    }

    struct TokensForTax {
        uint64 tokensForMarketing;
        uint64 tokensForBuyback;
        uint64 tokensForRedistro;
        bool gasSaver;
    }

    uint256 public launchBlock;
    bool public dynamicTaxOn;

    // events

    event UpdatedTransactionLimit(uint newMax);
    event UpdatedWalletLimit(uint newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedBuyTax(uint newAmt);
    event UpdatedSellTax(uint newAmt);

    // constructor

    constructor()
        ERC20("0xOS AI", "0xOS")
    {   
        address _v2Router;

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

        dynamicTaxOn = true;

        dexRouter = IDexRouter(_v2Router);

        marketingAddress = msg.sender;
        buybackAddress = msg.sender;
        redistroAddress = msg.sender;

        uint256 _totalSupply = 1 * 1e9 * 1e18;
        _mint(msg.sender, _totalSupply);

        txLimits.transactionLimit = uint128(totalSupply() * 5 / 1000);
        txLimits.walletLimit = uint128(totalSupply() * 5 / 1000);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        buyTax.marketingTax = 3000;
        buyTax.buybackTax = 0;
        buyTax.redistroTax = 0;
        buyTax.totalTax = buyTax.marketingTax + buyTax.buybackTax + buyTax.redistroTax;

        sellTax.marketingTax = 3000;
        sellTax.buybackTax = 0; 
        sellTax.redistroTax = 0;
        sellTax.totalTax = sellTax.marketingTax + sellTax.buybackTax + sellTax.redistroTax;

        tokensForTax.gasSaver = true;

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

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;
        exemptFromLimits[marketingAddress] = true;
        exemptFromLimits[buybackAddress] = true;
        exemptFromLimits[address(0xdead)] = true;

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            if(limited){
                require(launchBlock > 0, "not launched");
                checkLimits(from, to, amount);
            }
            amount -= handleTax(from, to, amount);
        }

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

    function checkLimits(address from, address to, uint256 amount) internal {
        bool exFromLimitsTo = exemptFromLimits[to];
        uint256 balanceOfTo = balanceOf(to);
        TxLimits memory _txLimits = txLimits;
        // buy
        if (isAMMPair[from] && !exFromLimitsTo) {
            require(amount <= _txLimits.transactionLimit, "Max Txn");
            require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
        } 
        // sell
        else if (isAMMPair[to] && !exemptFromLimits[from]) {
            require(amount <= _txLimits.transactionLimit, "Max Txn");
        }
        else if(!exFromLimitsTo) {
            require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
        }

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

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && !isAMMPair[from]) {
            convertTaxes();
        }

        if(dynamicTaxOn){
            setInternalTaxes();
        }
        
        uint128 tax = 0;

        Taxes memory taxes;

        if (isAMMPair[to]){
            taxes = sellTax;
        } else if(isAMMPair[from]){
            taxes = buyTax;
        }

        if(taxes.totalTax > 0){
            TokensForTax memory tokensForTaxUpdate = tokensForTax;
            tax = uint128(amount * taxes.totalTax / FEE_DIVISOR);
            tokensForTaxUpdate.tokensForMarketing += uint64(tax * taxes.marketingTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForBuyback += uint64(tax * taxes.buybackTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForRedistro += uint64(tax * taxes.redistroTax / taxes.totalTax / 1e9);
            tokensForTax = tokensForTaxUpdate;
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

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

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

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));
        TokensForTax memory tokensForTaxMem = tokensForTax;
        uint256 totalTokensToSwap = uint256(tokensForTaxMem.tokensForMarketing) + uint256(tokensForTaxMem.tokensForBuyback) + uint256(tokensForTaxMem.tokensForRedistro);
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        if(contractBalance > 0){

            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            bool success;

            if(tokensForTaxMem.tokensForBuyback > 0){
                (success,) = buybackAddress.call{value: ethBalance * tokensForTaxMem.tokensForBuyback/ totalTokensToSwap}("");  
            }

            if(tokensForTaxMem.tokensForRedistro > 0){
                (success,) = redistroAddress.call{value: ethBalance * tokensForTaxMem.tokensForRedistro/ totalTokensToSwap}("");  
            }

            ethBalance = address(this).balance;

            if(ethBalance > 0){
                (success,) = marketingAddress.call{value: ethBalance}("");  
            }
        }

        tokensForTaxMem.tokensForMarketing = 0;
        tokensForTaxMem.tokensForBuyback = 0;
        tokensForTaxMem.tokensForRedistro = 0;
        tokensForTax = tokensForTaxMem;
    }

    // owner functions
    function setExemptFromFee(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        require(_address != address(this), "Cannot unexempt contract");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimit(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 updateTransactionLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 5 / 1000)/(10**decimals()), "Too low");
        txLimits.transactionLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedTransactionLimit(txLimits.transactionLimit);
    }

    function updateWalletLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 5 / 1000)/(10**decimals()), "Too low");
        txLimits.walletLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedWalletLimit(txLimits.walletLimit);
    }

    function updateSwapTokensAmt(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmt = newAmount;
    }

    function updateBuyTax(uint48 _marketingTax, uint48 _buybackTax, uint48 _redistroTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.buybackTax = _buybackTax;
        taxes.redistroTax = _redistroTax;
        taxes.totalTax = _marketingTax + _buybackTax + _redistroTax;
        require(taxes.totalTax  <= 1000, "Keep tax at or below 10%");
        emit UpdatedBuyTax(taxes.totalTax);
        buyTax = taxes;
    }

    function updateSellTax(uint48 _marketingTax, uint48 _buybackTax, uint48 _redistroTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.buybackTax = _buybackTax;
        taxes.redistroTax = _redistroTax;
        taxes.totalTax = _marketingTax + _buybackTax + _redistroTax;
        require(taxes.totalTax  <= 1000, "Keep tax at or below 10%");
        emit UpdatedSellTax(taxes.totalTax);
        sellTax = taxes;
    }

    function removeTransferDelay() external onlyOwner {
        require(transferDelayEnabled, "Already disabled");
        transferDelayEnabled = false;
    }

    function removeDynamicTax() external onlyOwner {
        require(dynamicTaxOn, "Already disabled");
        dynamicTaxOn = false;
    }

    function removeLimits() external onlyOwner {
        limited = false;
        transferDelayEnabled = false;
        TxLimits memory _txLimits;
        uint256 supply = totalSupply();
        _txLimits.transactionLimit = uint128(supply);
        _txLimits.walletLimit = uint128(supply);
        txLimits = _txLimits;
        emit RemovedLimits();
    }

    function airdropToWallets(address[] calldata wallets, uint256[] calldata amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays length mismatch");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
        }
    }

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

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

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

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

    function setInternalTaxes() internal {
        Taxes memory newBuyTax = buyTax;
        Taxes memory newSellTax = sellTax;
        uint256 currentBlock = block.number;
        uint256 blocksSinceLaunch = currentBlock - launchBlock;
        if(blocksSinceLaunch >= 30){
            dynamicTaxOn = false;
            txLimits.transactionLimit = uint128(totalSupply() * 1 / 100);
            txLimits.walletLimit = uint128(totalSupply() * 1 / 100);

            newBuyTax.marketingTax = 300;
            newBuyTax.buybackTax = 100;
            newBuyTax.redistroTax = 100;
            newBuyTax.totalTax = 500;

            newSellTax.marketingTax = 300;
            newSellTax.buybackTax = 100;
            newSellTax.redistroTax = 100;
            newSellTax.totalTax = 500;

        } else if (blocksSinceLaunch >= 15){
            newBuyTax.marketingTax = 500;
            newBuyTax.buybackTax = 0;
            newBuyTax.redistroTax = 0;
            newBuyTax.totalTax = 500;

            newSellTax.marketingTax = 1500;
            newSellTax.buybackTax = 0;
            newSellTax.redistroTax = 0;
            newSellTax.totalTax = 1500;

        }

        if(buyTax.marketingTax != newBuyTax.marketingTax){
            buyTax = newBuyTax;
        }
        if(sellTax.marketingTax != newSellTax.marketingTax){
            sellTax = newSellTax;
        }
    }

    receive() payable external {}

    function enableTrading() external onlyOwner  {
        require(launchBlock == 0, "already launched");
        launchBlock = block.number;
    }
}

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":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedWalletLimit","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint48","name":"marketingTax","type":"uint48"},{"internalType":"uint48","name":"buybackTax","type":"uint48"},{"internalType":"uint48","name":"redistroTax","type":"uint48"},{"internalType":"uint48","name":"totalTax","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"dynamicTaxOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gweiMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","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":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistroAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeDynamicTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTransferDelay","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":[],"name":"sellTax","outputs":[{"internalType":"uint48","name":"marketingTax","type":"uint48"},{"internalType":"uint48","name":"buybackTax","type":"uint48"},{"internalType":"uint48","name":"redistroTax","type":"uint48"},{"internalType":"uint48","name":"totalTax","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromLimit","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":"tokensForTax","outputs":[{"internalType":"uint64","name":"tokensForMarketing","type":"uint64"},{"internalType":"uint64","name":"tokensForBuyback","type":"uint64"},{"internalType":"uint64","name":"tokensForRedistro","type":"uint64"},{"internalType":"bool","name":"gasSaver","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"txLimits","outputs":[{"internalType":"uint128","name":"transactionLimit","type":"uint128"},{"internalType":"uint128","name":"walletLimit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint48","name":"_marketingTax","type":"uint48"},{"internalType":"uint48","name":"_buybackTax","type":"uint48"},{"internalType":"uint48","name":"_redistroTax","type":"uint48"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateBuybackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateRedistroAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"_marketingTax","type":"uint48"},{"internalType":"uint48","name":"_buybackTax","type":"uint48"},{"internalType":"uint48","name":"_redistroTax","type":"uint48"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600f8054600160ff1991821681179092556014805490911690911790553480156200002d575f80fd5b506040518060400160405280600781526020016630784f5320414960c81b8152506040518060400160405280600481526020016330784f5360e01b81525081600390816200007c9190620008c9565b5060046200008b8282620008c9565b5050505f6200009f6200063f60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505f46600103620001125750737a250d5630b4cf539739df2c5dacb4c659f2488d62000184565b46600503620001375750737a250d5630b4cf539739df2c5dacb4c659f2488d62000184565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6018805460ff19166001179055601280546001600160a01b0383166001600160a01b03199182161790915560098054821633908117909155600a8054831682179055600b805490921681179091556b033b2e3c9fd0803ce800000090620001ec908262000643565b6103e8620001f960025490565b62000206906005620009a9565b620002129190620009c9565b601680546001600160801b0319166001600160801b03929092169190911790556103e86200023f60025490565b6200024c906005620009a9565b620002589190620009c9565b601680546001600160801b03928316600160801b029216919091179055620186a06200028360025490565b62000290906019620009a9565b6200029c9190620009c9565b601055600c80546001600160901b031916610bb8908117918290556c01000000000000000000000000820465ffffffffffff90811692620002ec92660100000000000090910490911690620009e9565b620002f89190620009e9565b600c805465ffffffffffff60901b1916600160901b65ffffffffffff93841602179055600d8054610bb86001600160901b03199091168117918290556c0100000000000000000000000082048316926200035e92660100000000000090041690620009e9565b6200036a9190620009e9565b600d805465ffffffffffff92909216600160901b0265ffffffffffff60901b19909216919091179055600e805460ff60c01b1916600160c01b179055601254604080516315ab88c960e31b815290516001600160a01b039092169163ad5c4648916004808201926020929091908290030181865afa158015620003ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000415919062000a12565b6001600160a01b039081166080526012546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa15801562000464573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200048a919062000a12565b6080516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af1158015620004d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ff919062000a12565b601180546001600160a01b0319166001600160a01b0392831690811782555f908152600860209081526040808320805460ff19908116600190811790925594548616845260078352818420805486168217905533808552828520805487168317905530808652838620805488168417905560098054891687528487208054891685179055600a80548a16885285882080548a16861790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548a168617905592875260069095528386208054881684179055808652838620805488168417905593548716855282852080548716831790555486168452922080549093169091179091556012546200061492165f1962000704565b601254620006379033906001600160a01b03166200063160025490565b62000704565b505062000a57565b3390565b6001600160a01b0382166200069b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200017b565b8060025f828254620006ae919062000a41565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620007685760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200017b565b6001600160a01b038216620007cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200017b565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200085457607f821691505b6020821081036200087357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620008c457805f5260205f20601f840160051c81016020851015620008a05750805b601f840160051c820191505b81811015620008c1575f8155600101620008ac565b50505b505050565b81516001600160401b03811115620008e557620008e56200082b565b620008fd81620008f684546200083f565b8462000879565b602080601f83116001811462000933575f84156200091b5750858301515b5f19600386901b1c1916600185901b1785556200098d565b5f85815260208120601f198616915b82811015620009635788860151825594840194600190910190840162000942565b50858210156200098157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620009c357620009c362000995565b92915050565b5f82620009e457634e487b7160e01b5f52601260045260245ffd5b500490565b65ffffffffffff81811683821601908082111562000a0b5762000a0b62000995565b5092915050565b5f6020828403121562000a23575f80fd5b81516001600160a01b038116811462000a3a575f80fd5b9392505050565b80820180821115620009c357620009c362000995565b60805161341662000a705f395f612ba601526134165ff3fe60806040526004361061028e575f3560e01c80638d3e6e4011610155578063c876d0b9116100be578063e65ce51c11610078578063e65ce51c14610893578063f270fde4146108b2578063f2fde38b146108fc578063f8686f071461091b578063fd607aad1461092f578063fe40fd711461094e575f80fd5b8063c876d0b9146107cb578063cc1776d3146107e4578063cc2fbd6614610821578063ccad03e114610840578063d00efb2f1461085f578063dd62ed3e14610874575f80fd5b8063a5ece9411161010f578063a5ece9411461070c578063a9059cbb1461072b578063a94b3e821461074a578063b0249cc614610769578063bedafd0114610797578063c78d0fa0146107b6575f80fd5b80638d3e6e401461064d5780638da5cb5b1461067b57806395d89b41146106985780639e7261af146106ac5780639e93ad8e146106c0578063a457c2d7146106ed575f80fd5b8063452ed4f1116101f757806370a08231116101b157806370a08231146105a5578063715018a6146105d957806371761551146105ed578063751039fc1461060c578063860a32ec146106205780638a8c523c14610639575f80fd5b8063452ed4f11461041f5780634f7041a5146104565780635431c94e146104c55780635a90a49e146104e457806366ebd39a146105125780636d7adcad14610531575f80fd5b806323b872dd1161024857806323b872dd1461036f5780632f0f5e4f1461038e578063313ce567146103ad578063362919a7146103c857806336e18e19146103e15780633950935114610400575f80fd5b806306fdde0314610299578063095ea7b3146102c357806318160ddd146102f257806321045918146103105780632307b441146103315780632369bf8314610350575f80fd5b3661029557005b5f80fd5b3480156102a4575f80fd5b506102ad610984565b6040516102ba9190612ddc565b60405180910390f35b3480156102ce575f80fd5b506102e26102dd366004612e29565b610a14565b60405190151581526020016102ba565b3480156102fd575f80fd5b506002545b6040519081526020016102ba565b34801561031b575f80fd5b5061032f61032a366004612e51565b610a2d565b005b34801561033c575f80fd5b5061032f61034b366004612eaf565b610b81565b34801561035b575f80fd5b5061032f61036a366004612f15565b610c55565b34801561037a575f80fd5b506102e2610389366004612f35565b610cc7565b348015610399575f80fd5b5061032f6103a8366004612f83565b610cea565b3480156103b8575f80fd5b50604051601281526020016102ba565b3480156103d3575f80fd5b506018546102e29060ff1681565b3480156103ec575f80fd5b5061032f6103fb366004612fc3565b610e6a565b34801561040b575f80fd5b506102e261041a366004612e29565b610f82565b34801561042a575f80fd5b5060115461043e906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b348015610461575f80fd5b50600c546104939065ffffffffffff80821691600160301b8104821691600160601b8204811691600160901b90041684565b6040805165ffffffffffff958616815293851660208501529184169183019190915290911660608201526080016102ba565b3480156104d0575f80fd5b5061032f6104df366004612fe9565b610fa3565b3480156104ef575f80fd5b506102e26104fe366004612f15565b60066020525f908152604090205460ff1681565b34801561051d575f80fd5b5061032f61052c366004612fc3565b611103565b34801561053c575f80fd5b50600e54610570906001600160401b0380821691600160401b8104821691600160801b82041690600160c01b900460ff1684565b6040516102ba94939291906001600160401b039485168152928416602084015292166040820152901515606082015260800190565b3480156105b0575f80fd5b506103026105bf366004612f15565b6001600160a01b03165f9081526020819052604090205490565b3480156105e4575f80fd5b5061032f611217565b3480156105f8575f80fd5b5061032f610607366004612f15565b61128a565b348015610617575f80fd5b5061032f6112fc565b34801561062b575f80fd5b50600f546102e29060ff1681565b348015610644575f80fd5b5061032f6113a7565b348015610658575f80fd5b506102e2610667366004612f15565b60076020525f908152604090205460ff1681565b348015610686575f80fd5b506005546001600160a01b031661043e565b3480156106a3575f80fd5b506102ad61141a565b3480156106b7575f80fd5b5061032f611429565b3480156106cb575f80fd5b506106d561271081565b6040516001600160401b0390911681526020016102ba565b3480156106f8575f80fd5b506102e2610707366004612e29565b6114a4565b348015610717575f80fd5b5060095461043e906001600160a01b031681565b348015610736575f80fd5b506102e2610745366004612e29565b61151e565b348015610755575f80fd5b50600b5461043e906001600160a01b031681565b348015610774575f80fd5b506102e2610783366004612f15565b60086020525f908152604090205460ff1681565b3480156107a2575f80fd5b5061032f6107b136600461302a565b61152b565b3480156107c1575f80fd5b5061030260105481565b3480156107d6575f80fd5b506014546102e29060ff1681565b3480156107ef575f80fd5b50600d546104939065ffffffffffff80821691600160301b8104821691600160601b8204811691600160901b90041684565b34801561082c575f80fd5b50600a5461043e906001600160a01b031681565b34801561084b575f80fd5b5061032f61085a36600461302a565b611655565b34801561086a575f80fd5b5061030260175481565b34801561087f575f80fd5b5061030261088e366004612fe9565b611777565b34801561089e575f80fd5b5061032f6108ad366004612f15565b6117a1565b3480156108bd575f80fd5b506016546108dc906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016102ba565b348015610907575f80fd5b5061032f610916366004612f15565b611813565b348015610926575f80fd5b5061032f6118fd565b34801561093a575f80fd5b5061032f610949366004612f83565b611978565b348015610959575f80fd5b5061030261096836600461305f565b601560209081525f928352604080842090915290825290205481565b6060600380546109939061307f565b80601f01602080910402602001604051908101604052809291908181526020018280546109bf9061307f565b8015610a0a5780601f106109e157610100808354040283529160200191610a0a565b820191905f5260205f20905b8154815290600101906020018083116109ed57829003601f168201915b5050505050905090565b5f33610a21818585611af8565b60019150505b92915050565b6005546001600160a01b03163314610a605760405162461bcd60e51b8152600401610a57906130b7565b60405180910390fd5b620186a0610a6d60025490565b610a78906001613100565b610a82919061312b565b811015610aef5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a57565b6103e8610afb60025490565b610b06906005613100565b610b10919061312b565b811115610b7c5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a57565b601055565b6005546001600160a01b03163314610bab5760405162461bcd60e51b8152600401610a57906130b7565b828114610bf35760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610a57565b5f5b83811015610c4e57610c4633868684818110610c1357610c1361313e565b9050602002016020810190610c289190612f15565b858585818110610c3a57610c3a61313e565b90506020020135611c1b565b600101610bf5565b5050505050565b6005546001600160a01b03163314610c7f5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b038116610ca55760405162461bcd60e51b8152600401610a5790613152565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b5f33610cd4858285611dbe565b610cdf858585611e36565b506001949350505050565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610a57906130b7565b604080516080810182525f606082015265ffffffffffff8581168252848116602083015283169181019190915281610d4c8486613178565b610d569190613178565b65ffffffffffff16606082018190526103e81015610db15760405162461bcd60e51b81526020600482015260186024820152774b65657020746178206174206f722062656c6f772031302560401b6044820152606401610a57565b606081015160405165ffffffffffff90911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c80546020840151604085015160609095015165ffffffffffff908116600160901b0265ffffffffffff60901b19968216600160601b0296909616600160601b600160c01b0319928216600160301b026001600160601b03199094169190951617919091171691909117919091179055505050565b6005546001600160a01b03163314610e945760405162461bcd60e51b8152600401610a57906130b7565b610ea06012600a61327e565b6103e8610eac60025490565b610eb7906005613100565b610ec1919061312b565b610ecb919061312b565b816001600160801b03161015610f0d5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610a57565b610f196012600a61327e565b610f2c906001600160801b038316613100565b601680546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33610a21818585610f948383611777565b610f9e919061328c565b611af8565b6005546001600160a01b03163314610fcd5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0382166110235760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610a57565b306001600160a01b038316036110895760405162461bcd60e51b815260206004820152602560248201527f5f746f6b656e20616464726573732063616e6e6f74206265206e6174697665206044820152643a37b5b2b760d91b6064820152608401610a57565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156110cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f1919061329f565b90506110fe838383611ef4565b505050565b6005546001600160a01b0316331461112d5760405162461bcd60e51b8152600401610a57906130b7565b6111396012600a61327e565b6103e861114560025490565b611150906005613100565b61115a919061312b565b611164919061312b565b816001600160801b031610156111a65760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610a57565b6111b26012600a61327e565b6111c5906001600160801b038316613100565b601680546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001610f77565b6005546001600160a01b031633146112415760405162461bcd60e51b8152600401610a57906130b7565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166112da5760405162461bcd60e51b8152600401610a5790613152565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113265760405162461bcd60e51b8152600401610a57906130b7565b600f805460ff19908116909155601480549091169055604080518082019091525f80825260208201525f61135960025490565b6001600160801b03811680845260208401819052600160801b8102176016556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6005546001600160a01b031633146113d15760405162461bcd60e51b8152600401610a57906130b7565b601754156114145760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606401610a57565b43601755565b6060600480546109939061307f565b6005546001600160a01b031633146114535760405162461bcd60e51b8152600401610a57906130b7565b60185460ff166114985760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610a57565b6018805460ff19169055565b5f33816114b18286611777565b9050838110156115115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a57565b610cdf8286868403611af8565b5f33610a21818585611e36565b6005546001600160a01b031633146115555760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b03821661159a5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a57565b306001600160a01b038316036115f25760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610a57565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461167f5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0382166116c45760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a57565b8061171c576011546001600160a01b039081169083160361171c5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610a57565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611649565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146117cb5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166117f15760405162461bcd60e51b8152600401610a5790613152565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461183d5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166118a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a57565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146119275760405162461bcd60e51b8152600401610a57906130b7565b60145460ff1661196c5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610a57565b6014805460ff19169055565b6005546001600160a01b031633146119a25760405162461bcd60e51b8152600401610a57906130b7565b604080516080810182525f606082015265ffffffffffff85811682528481166020830152831691810191909152816119da8486613178565b6119e49190613178565b65ffffffffffff16606082018190526103e81015611a3f5760405162461bcd60e51b81526020600482015260186024820152774b65657020746178206174206f722062656c6f772031302560401b6044820152606401610a57565b606081015160405165ffffffffffff90911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d80546020840151604085015160609095015165ffffffffffff908116600160901b0265ffffffffffff60901b19968216600160601b0296909616600160601b600160c01b0319928216600160301b026001600160601b03199094169190951617919091171691909117919091179055505050565b6001600160a01b038316611b5a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a57565b6001600160a01b038216611bbb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a57565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c7f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a57565b6001600160a01b038216611ce15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a57565b6001600160a01b0383165f9081526020819052604090205481811015611d585760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a57565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f611dc98484611777565b90505f198114611e305781811015611e235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a57565b611e308484848403611af8565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff16158015611e7657506001600160a01b0382165f9081526006602052604090205460ff16155b15611ee957600f5460ff1615611ed1575f60175411611ec65760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd081b185d5b98da195960a21b6044820152606401610a57565b611ed1838383611f46565b611edc8383836121da565b611ee690826132b6565b90505b6110fe838383611c1b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110fe908490612543565b6001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526016546001600160801b038082168352600160801b90910416818601529589168552600890935292205460ff928316939192168015611fad575082155b1561204e5780516001600160801b0316841115611ff65760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610a57565b60208101516001600160801b031661200e838661328c565b11156120495760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610a57565b61212e565b6001600160a01b0385165f9081526008602052604090205460ff16801561208d57506001600160a01b0386165f9081526007602052604090205460ff16155b156120d65780516001600160801b03168411156120495760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610a57565b8261212e5760208101516001600160801b03166120f3838661328c565b111561212e5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610a57565b60145460ff16156121d2576012546001600160a01b0386811691161480159061216557506011546001600160a01b03868116911614155b156121d257325f9081526013602052604090205443116121c05760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c8811195b185e48195b98589b195960521b6044820152606401610a57565b325f9081526013602052604090204390555b505050505050565b601054305f9081526020819052604081205490911115801561221457506001600160a01b0384165f9081526008602052604090205460ff16155b1561222157612221612614565b60185460ff161561223457612234612889565b604080516080810182525f8082526020808301829052828401829052606083018290526001600160a01b0387168252600890529182205460ff16156122bf575060408051608081018252600d5465ffffffffffff8082168352600160301b820481166020840152600160601b8204811693830193909352600160901b90049091166060820152612327565b6001600160a01b0386165f9081526008602052604090205460ff1615612327575060408051608081018252600c5465ffffffffffff8082168352600160301b820481166020840152600160601b8204811693830193909352600160901b900490911660608201525b606081015165ffffffffffff16156125315760408051608081018252600e546001600160401b038082168352600160401b820481166020840152600160801b82041692820192909252600160c01b90910460ff1615156060808301919091528201516127109061239f9065ffffffffffff1687613100565b6123a9919061312b565b9250633b9aca00826060015165ffffffffffff16835f015165ffffffffffff16856123d491906132c9565b6123de91906132f4565b6123e891906132f4565b815182906123f7908390613319565b6001600160401b031690525060608201516020830151633b9aca009165ffffffffffff908116916124299116866132c9565b61243391906132f4565b61243d91906132f4565b8160200181815161244e9190613319565b6001600160401b031690525060608201516040830151633b9aca009165ffffffffffff908116916124809116866132c9565b61248a91906132f4565b61249491906132f4565b816040018181516124a59190613319565b6001600160401b039081169091528251600e80546020860151604087015160608801511515600160c01b0260ff60c01b19918716600160801b029190911668ffffffffffffffffff60801b19928716600160401b026001600160801b031990941695909616949094179190911716929092171790555061252f87306001600160801b038616611c1b565b505b506001600160801b0316949350505050565b5f612597826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b3b9092919063ffffffff16565b8051909150156110fe57808060200190518101906125b59190613339565b6110fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a57565b305f9081526020819052604081205460408051608081018252600e546001600160401b03808216808452600160401b8304821660208501819052600160801b8404909216948401859052600160c01b90920460ff161515606084015293945090925f9291612682919061328c565b61268c919061328c565b9050821580612699575080155b156126a357505050565b6010546126b1906028613100565b8311156126c9576010546126c6906028613100565b92505b8215612851576126d883612b51565b602082015147905f906001600160401b03161561276657600a5460208501516001600160a01b03909116908490612718906001600160401b031685613100565b612722919061312b565b6040515f81818185875af1925050503d805f811461275b576040519150601f19603f3d011682016040523d82523d5f602084013e612760565b606091505b50909150505b60408401516001600160401b0316156127f057600b5460408501516001600160a01b039091169084906127a2906001600160401b031685613100565b6127ac919061312b565b6040515f81818185875af1925050503d805f81146127e5576040519150601f19603f3d011682016040523d82523d5f602084013e6127ea565b606091505b50909150505b479150811561284e576009546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612843576040519150601f19603f3d011682016040523d82523d5f602084013e612848565b606091505b50909150505b50505b505f808252602082018190526040820152600e80546060909201511515600160c01b026001600160c81b031990921691909117905550565b6040805160808082018352600c5465ffffffffffff8082168452600160301b8083048216602080870191909152600160601b808504841687890152600160901b94859004841660608089019190915288519687018952600d548086168852938404851692870192909252820483169685019690965291909104169281019290925260175490919043905f9061291e90836132b6565b9050601e81106129e5576018805460ff19169055606461293d60025490565b612948906001613100565b612952919061312b565b601680546001600160801b0319166001600160801b0392909216919091179055600254606490612983906001613100565b61298d919061312b565b601680546001600160801b03928316600160801b02921691909117905561012c8085526064602080870182905260408088018390526101f46060808a0182905294885291870183905286019190915290840152612a24565b600f8110612a24576101f48085525f602080870182905260408088018390526060808901949094526105dc808852918701839052860191909152908401525b8351600c5465ffffffffffff908116911614612aad578351600c805460208701516040880151606089015165ffffffffffff908116600160901b0265ffffffffffff60901b19928216600160601b0292909216600160601b600160c01b0319938216600160301b026001600160601b031990951691909616179290921716929092179190911790555b8251600d5465ffffffffffff908116911614611e30578251600d805460208601516040870151606088015165ffffffffffff908116600160901b0265ffffffffffff60901b19928216600160601b0292909216600160601b600160c01b0319938216600160301b026001600160601b0319909516919096161792909217169290921791909117905550505050565b6060612b4984845f85612c46565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612b8457612b8461313e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612bd857612bd861313e565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612c1d9085905f90869030904290600401613354565b5f604051808303815f87803b158015612c34575f80fd5b505af11580156121d2573d5f803e3d5ffd5b606082471015612ca75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a57565b5f80866001600160a01b03168587604051612cc291906133c5565b5f6040518083038185875af1925050503d805f8114612cfc576040519150601f19603f3d011682016040523d82523d5f602084013e612d01565b606091505b5091509150612d1287838387612d1d565b979650505050505050565b60608315612d8b5782515f03612d84576001600160a01b0385163b612d845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a57565b5081612b49565b612b498383815115612da05781518083602001fd5b8060405162461bcd60e51b8152600401610a579190612ddc565b5f5b83811015612dd4578181015183820152602001612dbc565b50505f910152565b602081525f8251806020840152612dfa816040850160208701612dba565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114612e24575f80fd5b919050565b5f8060408385031215612e3a575f80fd5b612e4383612e0e565b946020939093013593505050565b5f60208284031215612e61575f80fd5b5035919050565b5f8083601f840112612e78575f80fd5b5081356001600160401b03811115612e8e575f80fd5b6020830191508360208260051b8501011115612ea8575f80fd5b9250929050565b5f805f8060408587031215612ec2575f80fd5b84356001600160401b0380821115612ed8575f80fd5b612ee488838901612e68565b90965094506020870135915080821115612efc575f80fd5b50612f0987828801612e68565b95989497509550505050565b5f60208284031215612f25575f80fd5b612f2e82612e0e565b9392505050565b5f805f60608486031215612f47575f80fd5b612f5084612e0e565b9250612f5e60208501612e0e565b9150604084013590509250925092565b803565ffffffffffff81168114612e24575f80fd5b5f805f60608486031215612f95575f80fd5b612f9e84612f6e565b9250612fac60208501612f6e565b9150612fba60408501612f6e565b90509250925092565b5f60208284031215612fd3575f80fd5b81356001600160801b0381168114612f2e575f80fd5b5f8060408385031215612ffa575f80fd5b61300383612e0e565b915061301160208401612e0e565b90509250929050565b8015158114613027575f80fd5b50565b5f806040838503121561303b575f80fd5b61304483612e0e565b915060208301356130548161301a565b809150509250929050565b5f8060408385031215613070575f80fd5b50508035926020909101359150565b600181811c9082168061309357607f821691505b6020821081036130b157634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a276130ec565b634e487b7160e01b5f52601260045260245ffd5b5f8261313957613139613117565b500490565b634e487b7160e01b5f52603260045260245ffd5b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b65ffffffffffff818116838216019080821115613197576131976130ec565b5092915050565b600181815b808511156131d857815f19048211156131be576131be6130ec565b808516156131cb57918102915b93841c93908002906131a3565b509250929050565b5f826131ee57506001610a27565b816131fa57505f610a27565b8160018114613210576002811461321a57613236565b6001915050610a27565b60ff84111561322b5761322b6130ec565b50506001821b610a27565b5060208310610133831016604e8410600b8410161715613259575081810a610a27565b613263838361319e565b805f1904821115613276576132766130ec565b029392505050565b5f612f2e60ff8416836131e0565b80820180821115610a2757610a276130ec565b5f602082840312156132af575f80fd5b5051919050565b81810381811115610a2757610a276130ec565b6001600160801b038181168382160280821691908281146132ec576132ec6130ec565b505092915050565b5f6001600160801b038084168061330d5761330d613117565b92169190910492915050565b6001600160401b03818116838216019080821115613197576131976130ec565b5f60208284031215613349575f80fd5b8151612f2e8161301a565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156133a45784516001600160a01b03168352938301939183019160010161337f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f82516133d6818460208701612dba565b919091019291505056fea2646970667358221220db231868ebede8ce7df200f9bb502efde7f310e0221935d845dbad70d727812664736f6c63430008170033

Deployed Bytecode

0x60806040526004361061028e575f3560e01c80638d3e6e4011610155578063c876d0b9116100be578063e65ce51c11610078578063e65ce51c14610893578063f270fde4146108b2578063f2fde38b146108fc578063f8686f071461091b578063fd607aad1461092f578063fe40fd711461094e575f80fd5b8063c876d0b9146107cb578063cc1776d3146107e4578063cc2fbd6614610821578063ccad03e114610840578063d00efb2f1461085f578063dd62ed3e14610874575f80fd5b8063a5ece9411161010f578063a5ece9411461070c578063a9059cbb1461072b578063a94b3e821461074a578063b0249cc614610769578063bedafd0114610797578063c78d0fa0146107b6575f80fd5b80638d3e6e401461064d5780638da5cb5b1461067b57806395d89b41146106985780639e7261af146106ac5780639e93ad8e146106c0578063a457c2d7146106ed575f80fd5b8063452ed4f1116101f757806370a08231116101b157806370a08231146105a5578063715018a6146105d957806371761551146105ed578063751039fc1461060c578063860a32ec146106205780638a8c523c14610639575f80fd5b8063452ed4f11461041f5780634f7041a5146104565780635431c94e146104c55780635a90a49e146104e457806366ebd39a146105125780636d7adcad14610531575f80fd5b806323b872dd1161024857806323b872dd1461036f5780632f0f5e4f1461038e578063313ce567146103ad578063362919a7146103c857806336e18e19146103e15780633950935114610400575f80fd5b806306fdde0314610299578063095ea7b3146102c357806318160ddd146102f257806321045918146103105780632307b441146103315780632369bf8314610350575f80fd5b3661029557005b5f80fd5b3480156102a4575f80fd5b506102ad610984565b6040516102ba9190612ddc565b60405180910390f35b3480156102ce575f80fd5b506102e26102dd366004612e29565b610a14565b60405190151581526020016102ba565b3480156102fd575f80fd5b506002545b6040519081526020016102ba565b34801561031b575f80fd5b5061032f61032a366004612e51565b610a2d565b005b34801561033c575f80fd5b5061032f61034b366004612eaf565b610b81565b34801561035b575f80fd5b5061032f61036a366004612f15565b610c55565b34801561037a575f80fd5b506102e2610389366004612f35565b610cc7565b348015610399575f80fd5b5061032f6103a8366004612f83565b610cea565b3480156103b8575f80fd5b50604051601281526020016102ba565b3480156103d3575f80fd5b506018546102e29060ff1681565b3480156103ec575f80fd5b5061032f6103fb366004612fc3565b610e6a565b34801561040b575f80fd5b506102e261041a366004612e29565b610f82565b34801561042a575f80fd5b5060115461043e906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b348015610461575f80fd5b50600c546104939065ffffffffffff80821691600160301b8104821691600160601b8204811691600160901b90041684565b6040805165ffffffffffff958616815293851660208501529184169183019190915290911660608201526080016102ba565b3480156104d0575f80fd5b5061032f6104df366004612fe9565b610fa3565b3480156104ef575f80fd5b506102e26104fe366004612f15565b60066020525f908152604090205460ff1681565b34801561051d575f80fd5b5061032f61052c366004612fc3565b611103565b34801561053c575f80fd5b50600e54610570906001600160401b0380821691600160401b8104821691600160801b82041690600160c01b900460ff1684565b6040516102ba94939291906001600160401b039485168152928416602084015292166040820152901515606082015260800190565b3480156105b0575f80fd5b506103026105bf366004612f15565b6001600160a01b03165f9081526020819052604090205490565b3480156105e4575f80fd5b5061032f611217565b3480156105f8575f80fd5b5061032f610607366004612f15565b61128a565b348015610617575f80fd5b5061032f6112fc565b34801561062b575f80fd5b50600f546102e29060ff1681565b348015610644575f80fd5b5061032f6113a7565b348015610658575f80fd5b506102e2610667366004612f15565b60076020525f908152604090205460ff1681565b348015610686575f80fd5b506005546001600160a01b031661043e565b3480156106a3575f80fd5b506102ad61141a565b3480156106b7575f80fd5b5061032f611429565b3480156106cb575f80fd5b506106d561271081565b6040516001600160401b0390911681526020016102ba565b3480156106f8575f80fd5b506102e2610707366004612e29565b6114a4565b348015610717575f80fd5b5060095461043e906001600160a01b031681565b348015610736575f80fd5b506102e2610745366004612e29565b61151e565b348015610755575f80fd5b50600b5461043e906001600160a01b031681565b348015610774575f80fd5b506102e2610783366004612f15565b60086020525f908152604090205460ff1681565b3480156107a2575f80fd5b5061032f6107b136600461302a565b61152b565b3480156107c1575f80fd5b5061030260105481565b3480156107d6575f80fd5b506014546102e29060ff1681565b3480156107ef575f80fd5b50600d546104939065ffffffffffff80821691600160301b8104821691600160601b8204811691600160901b90041684565b34801561082c575f80fd5b50600a5461043e906001600160a01b031681565b34801561084b575f80fd5b5061032f61085a36600461302a565b611655565b34801561086a575f80fd5b5061030260175481565b34801561087f575f80fd5b5061030261088e366004612fe9565b611777565b34801561089e575f80fd5b5061032f6108ad366004612f15565b6117a1565b3480156108bd575f80fd5b506016546108dc906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016102ba565b348015610907575f80fd5b5061032f610916366004612f15565b611813565b348015610926575f80fd5b5061032f6118fd565b34801561093a575f80fd5b5061032f610949366004612f83565b611978565b348015610959575f80fd5b5061030261096836600461305f565b601560209081525f928352604080842090915290825290205481565b6060600380546109939061307f565b80601f01602080910402602001604051908101604052809291908181526020018280546109bf9061307f565b8015610a0a5780601f106109e157610100808354040283529160200191610a0a565b820191905f5260205f20905b8154815290600101906020018083116109ed57829003601f168201915b5050505050905090565b5f33610a21818585611af8565b60019150505b92915050565b6005546001600160a01b03163314610a605760405162461bcd60e51b8152600401610a57906130b7565b60405180910390fd5b620186a0610a6d60025490565b610a78906001613100565b610a82919061312b565b811015610aef5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a57565b6103e8610afb60025490565b610b06906005613100565b610b10919061312b565b811115610b7c5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a57565b601055565b6005546001600160a01b03163314610bab5760405162461bcd60e51b8152600401610a57906130b7565b828114610bf35760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610a57565b5f5b83811015610c4e57610c4633868684818110610c1357610c1361313e565b9050602002016020810190610c289190612f15565b858585818110610c3a57610c3a61313e565b90506020020135611c1b565b600101610bf5565b5050505050565b6005546001600160a01b03163314610c7f5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b038116610ca55760405162461bcd60e51b8152600401610a5790613152565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b5f33610cd4858285611dbe565b610cdf858585611e36565b506001949350505050565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610a57906130b7565b604080516080810182525f606082015265ffffffffffff8581168252848116602083015283169181019190915281610d4c8486613178565b610d569190613178565b65ffffffffffff16606082018190526103e81015610db15760405162461bcd60e51b81526020600482015260186024820152774b65657020746178206174206f722062656c6f772031302560401b6044820152606401610a57565b606081015160405165ffffffffffff90911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c80546020840151604085015160609095015165ffffffffffff908116600160901b0265ffffffffffff60901b19968216600160601b0296909616600160601b600160c01b0319928216600160301b026001600160601b03199094169190951617919091171691909117919091179055505050565b6005546001600160a01b03163314610e945760405162461bcd60e51b8152600401610a57906130b7565b610ea06012600a61327e565b6103e8610eac60025490565b610eb7906005613100565b610ec1919061312b565b610ecb919061312b565b816001600160801b03161015610f0d5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610a57565b610f196012600a61327e565b610f2c906001600160801b038316613100565b601680546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33610a21818585610f948383611777565b610f9e919061328c565b611af8565b6005546001600160a01b03163314610fcd5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0382166110235760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610a57565b306001600160a01b038316036110895760405162461bcd60e51b815260206004820152602560248201527f5f746f6b656e20616464726573732063616e6e6f74206265206e6174697665206044820152643a37b5b2b760d91b6064820152608401610a57565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156110cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f1919061329f565b90506110fe838383611ef4565b505050565b6005546001600160a01b0316331461112d5760405162461bcd60e51b8152600401610a57906130b7565b6111396012600a61327e565b6103e861114560025490565b611150906005613100565b61115a919061312b565b611164919061312b565b816001600160801b031610156111a65760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610a57565b6111b26012600a61327e565b6111c5906001600160801b038316613100565b601680546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001610f77565b6005546001600160a01b031633146112415760405162461bcd60e51b8152600401610a57906130b7565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166112da5760405162461bcd60e51b8152600401610a5790613152565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113265760405162461bcd60e51b8152600401610a57906130b7565b600f805460ff19908116909155601480549091169055604080518082019091525f80825260208201525f61135960025490565b6001600160801b03811680845260208401819052600160801b8102176016556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b6005546001600160a01b031633146113d15760405162461bcd60e51b8152600401610a57906130b7565b601754156114145760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606401610a57565b43601755565b6060600480546109939061307f565b6005546001600160a01b031633146114535760405162461bcd60e51b8152600401610a57906130b7565b60185460ff166114985760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610a57565b6018805460ff19169055565b5f33816114b18286611777565b9050838110156115115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a57565b610cdf8286868403611af8565b5f33610a21818585611e36565b6005546001600160a01b031633146115555760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b03821661159a5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a57565b306001600160a01b038316036115f25760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610a57565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461167f5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0382166116c45760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a57565b8061171c576011546001600160a01b039081169083160361171c5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610a57565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611649565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146117cb5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166117f15760405162461bcd60e51b8152600401610a5790613152565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461183d5760405162461bcd60e51b8152600401610a57906130b7565b6001600160a01b0381166118a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a57565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146119275760405162461bcd60e51b8152600401610a57906130b7565b60145460ff1661196c5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606401610a57565b6014805460ff19169055565b6005546001600160a01b031633146119a25760405162461bcd60e51b8152600401610a57906130b7565b604080516080810182525f606082015265ffffffffffff85811682528481166020830152831691810191909152816119da8486613178565b6119e49190613178565b65ffffffffffff16606082018190526103e81015611a3f5760405162461bcd60e51b81526020600482015260186024820152774b65657020746178206174206f722062656c6f772031302560401b6044820152606401610a57565b606081015160405165ffffffffffff90911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d80546020840151604085015160609095015165ffffffffffff908116600160901b0265ffffffffffff60901b19968216600160601b0296909616600160601b600160c01b0319928216600160301b026001600160601b03199094169190951617919091171691909117919091179055505050565b6001600160a01b038316611b5a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a57565b6001600160a01b038216611bbb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a57565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c7f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a57565b6001600160a01b038216611ce15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a57565b6001600160a01b0383165f9081526020819052604090205481811015611d585760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a57565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f611dc98484611777565b90505f198114611e305781811015611e235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a57565b611e308484848403611af8565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff16158015611e7657506001600160a01b0382165f9081526006602052604090205460ff16155b15611ee957600f5460ff1615611ed1575f60175411611ec65760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd081b185d5b98da195960a21b6044820152606401610a57565b611ed1838383611f46565b611edc8383836121da565b611ee690826132b6565b90505b6110fe838383611c1b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110fe908490612543565b6001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526016546001600160801b038082168352600160801b90910416818601529589168552600890935292205460ff928316939192168015611fad575082155b1561204e5780516001600160801b0316841115611ff65760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610a57565b60208101516001600160801b031661200e838661328c565b11156120495760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610a57565b61212e565b6001600160a01b0385165f9081526008602052604090205460ff16801561208d57506001600160a01b0386165f9081526007602052604090205460ff16155b156120d65780516001600160801b03168411156120495760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610a57565b8261212e5760208101516001600160801b03166120f3838661328c565b111561212e5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610a57565b60145460ff16156121d2576012546001600160a01b0386811691161480159061216557506011546001600160a01b03868116911614155b156121d257325f9081526013602052604090205443116121c05760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c8811195b185e48195b98589b195960521b6044820152606401610a57565b325f9081526013602052604090204390555b505050505050565b601054305f9081526020819052604081205490911115801561221457506001600160a01b0384165f9081526008602052604090205460ff16155b1561222157612221612614565b60185460ff161561223457612234612889565b604080516080810182525f8082526020808301829052828401829052606083018290526001600160a01b0387168252600890529182205460ff16156122bf575060408051608081018252600d5465ffffffffffff8082168352600160301b820481166020840152600160601b8204811693830193909352600160901b90049091166060820152612327565b6001600160a01b0386165f9081526008602052604090205460ff1615612327575060408051608081018252600c5465ffffffffffff8082168352600160301b820481166020840152600160601b8204811693830193909352600160901b900490911660608201525b606081015165ffffffffffff16156125315760408051608081018252600e546001600160401b038082168352600160401b820481166020840152600160801b82041692820192909252600160c01b90910460ff1615156060808301919091528201516127109061239f9065ffffffffffff1687613100565b6123a9919061312b565b9250633b9aca00826060015165ffffffffffff16835f015165ffffffffffff16856123d491906132c9565b6123de91906132f4565b6123e891906132f4565b815182906123f7908390613319565b6001600160401b031690525060608201516020830151633b9aca009165ffffffffffff908116916124299116866132c9565b61243391906132f4565b61243d91906132f4565b8160200181815161244e9190613319565b6001600160401b031690525060608201516040830151633b9aca009165ffffffffffff908116916124809116866132c9565b61248a91906132f4565b61249491906132f4565b816040018181516124a59190613319565b6001600160401b039081169091528251600e80546020860151604087015160608801511515600160c01b0260ff60c01b19918716600160801b029190911668ffffffffffffffffff60801b19928716600160401b026001600160801b031990941695909616949094179190911716929092171790555061252f87306001600160801b038616611c1b565b505b506001600160801b0316949350505050565b5f612597826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b3b9092919063ffffffff16565b8051909150156110fe57808060200190518101906125b59190613339565b6110fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a57565b305f9081526020819052604081205460408051608081018252600e546001600160401b03808216808452600160401b8304821660208501819052600160801b8404909216948401859052600160c01b90920460ff161515606084015293945090925f9291612682919061328c565b61268c919061328c565b9050821580612699575080155b156126a357505050565b6010546126b1906028613100565b8311156126c9576010546126c6906028613100565b92505b8215612851576126d883612b51565b602082015147905f906001600160401b03161561276657600a5460208501516001600160a01b03909116908490612718906001600160401b031685613100565b612722919061312b565b6040515f81818185875af1925050503d805f811461275b576040519150601f19603f3d011682016040523d82523d5f602084013e612760565b606091505b50909150505b60408401516001600160401b0316156127f057600b5460408501516001600160a01b039091169084906127a2906001600160401b031685613100565b6127ac919061312b565b6040515f81818185875af1925050503d805f81146127e5576040519150601f19603f3d011682016040523d82523d5f602084013e6127ea565b606091505b50909150505b479150811561284e576009546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612843576040519150601f19603f3d011682016040523d82523d5f602084013e612848565b606091505b50909150505b50505b505f808252602082018190526040820152600e80546060909201511515600160c01b026001600160c81b031990921691909117905550565b6040805160808082018352600c5465ffffffffffff8082168452600160301b8083048216602080870191909152600160601b808504841687890152600160901b94859004841660608089019190915288519687018952600d548086168852938404851692870192909252820483169685019690965291909104169281019290925260175490919043905f9061291e90836132b6565b9050601e81106129e5576018805460ff19169055606461293d60025490565b612948906001613100565b612952919061312b565b601680546001600160801b0319166001600160801b0392909216919091179055600254606490612983906001613100565b61298d919061312b565b601680546001600160801b03928316600160801b02921691909117905561012c8085526064602080870182905260408088018390526101f46060808a0182905294885291870183905286019190915290840152612a24565b600f8110612a24576101f48085525f602080870182905260408088018390526060808901949094526105dc808852918701839052860191909152908401525b8351600c5465ffffffffffff908116911614612aad578351600c805460208701516040880151606089015165ffffffffffff908116600160901b0265ffffffffffff60901b19928216600160601b0292909216600160601b600160c01b0319938216600160301b026001600160601b031990951691909616179290921716929092179190911790555b8251600d5465ffffffffffff908116911614611e30578251600d805460208601516040870151606088015165ffffffffffff908116600160901b0265ffffffffffff60901b19928216600160601b0292909216600160601b600160c01b0319938216600160301b026001600160601b0319909516919096161792909217169290921791909117905550505050565b6060612b4984845f85612c46565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612b8457612b8461313e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612bd857612bd861313e565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612c1d9085905f90869030904290600401613354565b5f604051808303815f87803b158015612c34575f80fd5b505af11580156121d2573d5f803e3d5ffd5b606082471015612ca75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a57565b5f80866001600160a01b03168587604051612cc291906133c5565b5f6040518083038185875af1925050503d805f8114612cfc576040519150601f19603f3d011682016040523d82523d5f602084013e612d01565b606091505b5091509150612d1287838387612d1d565b979650505050505050565b60608315612d8b5782515f03612d84576001600160a01b0385163b612d845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a57565b5081612b49565b612b498383815115612da05781518083602001fd5b8060405162461bcd60e51b8152600401610a579190612ddc565b5f5b83811015612dd4578181015183820152602001612dbc565b50505f910152565b602081525f8251806020840152612dfa816040850160208701612dba565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114612e24575f80fd5b919050565b5f8060408385031215612e3a575f80fd5b612e4383612e0e565b946020939093013593505050565b5f60208284031215612e61575f80fd5b5035919050565b5f8083601f840112612e78575f80fd5b5081356001600160401b03811115612e8e575f80fd5b6020830191508360208260051b8501011115612ea8575f80fd5b9250929050565b5f805f8060408587031215612ec2575f80fd5b84356001600160401b0380821115612ed8575f80fd5b612ee488838901612e68565b90965094506020870135915080821115612efc575f80fd5b50612f0987828801612e68565b95989497509550505050565b5f60208284031215612f25575f80fd5b612f2e82612e0e565b9392505050565b5f805f60608486031215612f47575f80fd5b612f5084612e0e565b9250612f5e60208501612e0e565b9150604084013590509250925092565b803565ffffffffffff81168114612e24575f80fd5b5f805f60608486031215612f95575f80fd5b612f9e84612f6e565b9250612fac60208501612f6e565b9150612fba60408501612f6e565b90509250925092565b5f60208284031215612fd3575f80fd5b81356001600160801b0381168114612f2e575f80fd5b5f8060408385031215612ffa575f80fd5b61300383612e0e565b915061301160208401612e0e565b90509250929050565b8015158114613027575f80fd5b50565b5f806040838503121561303b575f80fd5b61304483612e0e565b915060208301356130548161301a565b809150509250929050565b5f8060408385031215613070575f80fd5b50508035926020909101359150565b600181811c9082168061309357607f821691505b6020821081036130b157634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a276130ec565b634e487b7160e01b5f52601260045260245ffd5b5f8261313957613139613117565b500490565b634e487b7160e01b5f52603260045260245ffd5b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b65ffffffffffff818116838216019080821115613197576131976130ec565b5092915050565b600181815b808511156131d857815f19048211156131be576131be6130ec565b808516156131cb57918102915b93841c93908002906131a3565b509250929050565b5f826131ee57506001610a27565b816131fa57505f610a27565b8160018114613210576002811461321a57613236565b6001915050610a27565b60ff84111561322b5761322b6130ec565b50506001821b610a27565b5060208310610133831016604e8410600b8410161715613259575081810a610a27565b613263838361319e565b805f1904821115613276576132766130ec565b029392505050565b5f612f2e60ff8416836131e0565b80820180821115610a2757610a276130ec565b5f602082840312156132af575f80fd5b5051919050565b81810381811115610a2757610a276130ec565b6001600160801b038181168382160280821691908281146132ec576132ec6130ec565b505092915050565b5f6001600160801b038084168061330d5761330d613117565b92169190910492915050565b6001600160401b03818116838216019080821115613197576131976130ec565b5f60208284031215613349575f80fd5b8151612f2e8161301a565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156133a45784516001600160a01b03168352938301939183019160010161337f565b50506001600160a01b03969096166060850152505050608001529392505050565b5f82516133d6818460208701612dba565b919091019291505056fea2646970667358221220db231868ebede8ce7df200f9bb502efde7f310e0221935d845dbad70d727812664736f6c63430008170033

Deployed Bytecode Sourcemap

22490:14723:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4528:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6888:201;;;;;;;;;;-1:-1:-1;6888:201:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;6888:201:0;1107:187:1;5657:108:0;;;;;;;;;;-1:-1:-1;5745:12:0;;5657:108;;;1445:25:1;;;1433:2;1418:18;5657:108:0;1299:177:1;32336:346:0;;;;;;;;;;-1:-1:-1;32336:346:0;;;;;:::i;:::-;;:::i;:::-;;34350:333;;;;;;;;;;-1:-1:-1;34350:333:0;;;;;:::i;:::-;;:::i;35079:173::-;;;;;;;;;;-1:-1:-1;35079:173:0;;;;;:::i;:::-;;:::i;7669:261::-;;;;;;;;;;-1:-1:-1;7669:261:0;;;;;:::i;:::-;;:::i;32690:481::-;;;;;;;;;;-1:-1:-1;32690:481:0;;;;;:::i;:::-;;:::i;5499:93::-;;;;;;;;;;-1:-1:-1;5499:93:0;;5582:2;3987:36:1;;3975:2;3960:18;5499:93:0;3845:184:1;23862:24:0;;;;;;;;;;-1:-1:-1;23862:24:0;;;;;;;;31696:322;;;;;;;;;;-1:-1:-1;31696:322:0;;;;;:::i;:::-;;:::i;8339:238::-;;;;;;;;;;-1:-1:-1;8339:238:0;;;;;:::i;:::-;;:::i;22981:21::-;;;;;;;;;;-1:-1:-1;22981:21:0;;;;-1:-1:-1;;;;;22981:21:0;;;;;;-1:-1:-1;;;;;4504:32:1;;;4486:51;;4474:2;4459:18;22981:21:0;4340:203:1;22811:19:0;;;;;;;;;;-1:-1:-1;22811:19:0;;;;;;;;;-1:-1:-1;;;22811:19:0;;;;;-1:-1:-1;;;22811:19:0;;;;;-1:-1:-1;;;22811:19:0;;;;;;;;;4781:14:1;4822:15;;;4804:34;;4874:15;;;4869:2;4854:18;;4847:43;4926:15;;;4906:18;;;4899:43;;;;4978:15;;;4973:2;4958:18;;4951:43;4758:3;4743:19;22811::0;4548:452:1;34691:380:0;;;;;;;;;;-1:-1:-1;34691:380:0;;;;;:::i;:::-;;:::i;22535:47::-;;;;;;;;;;-1:-1:-1;22535:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32026:302;;;;;;;;;;-1:-1:-1;32026:302:0;;;;;:::i;:::-;;:::i;22866:32::-;;;;;;;;;;-1:-1:-1;22866:32:0;;;;-1:-1:-1;;;;;22866:32:0;;;;-1:-1:-1;;;22866:32:0;;;;;-1:-1:-1;;;22866:32:0;;;;-1:-1:-1;;;22866:32:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5544:15:1;;;5526:34;;5596:15;;;5591:2;5576:18;;5569:43;5648:15;;5643:2;5628:18;;5621:43;5707:14;;5700:22;5695:2;5680:18;;5673:50;5476:3;5461:19;;5270:459;5828:127:0;;;;;;;;;;-1:-1:-1;5828:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;5929:18:0;5902:7;5929:18;;;;;;;;;;;;5828:127;13442:150;;;;;;;;;;;;;:::i;35437:171::-;;;;;;;;;;-1:-1:-1;35437:171:0;;;;;:::i;:::-;;:::i;33982:360::-;;;;;;;;;;;;;:::i;22907:26::-;;;;;;;;;;-1:-1:-1;22907:26:0;;;;;;;;37064:146;;;;;;;;;;;;;:::i;22589:49::-;;;;;;;;;;-1:-1:-1;22589:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13228:79;;;;;;;;;;-1:-1:-1;13293:6:0;;-1:-1:-1;;;;;13293:6:0;13228:79;;4747:104;;;;;;;;;;;;;:::i;33836:138::-;;;;;;;;;;;;;:::i;23356:42::-;;;;;;;;;;;;23393:5;23356:42;;;;;-1:-1:-1;;;;;5896:31:1;;;5878:50;;5866:2;5851:18;23356:42:0;5734:200:1;9080:436:0;;;;;;;;;;-1:-1:-1;9080:436:0;;;;;:::i;:::-;;:::i;22698:31::-;;;;;;;;;;-1:-1:-1;22698:31:0;;;;-1:-1:-1;;;;;22698:31:0;;;6161:193;;;;;;;;;;-1:-1:-1;6161:193:0;;;;;:::i;:::-;;:::i;22772:30::-;;;;;;;;;;-1:-1:-1;22772:30:0;;;;-1:-1:-1;;;;;22772:30:0;;;22647:42;;;;;;;;;;-1:-1:-1;22647:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31009:319;;;;;;;;;;-1:-1:-1;31009:319:0;;;;;:::i;:::-;;:::i;22942:30::-;;;;;;;;;;;;;;;;23202:39;;;;;;;;;;-1:-1:-1;23202:39:0;;;;;;;;22837:20;;;;;;;;;;-1:-1:-1;22837:20:0;;;;;;;;;-1:-1:-1;;;22837:20:0;;;;;-1:-1:-1;;;22837:20:0;;;;;-1:-1:-1;;;22837:20:0;;;;;22736:29;;;;;;;;;;-1:-1:-1;22736:29:0;;;;-1:-1:-1;;;;;22736:29:0;;;31336:352;;;;;;;;;;-1:-1:-1;31336:352:0;;;;;:::i;:::-;;:::i;23829:26::-;;;;;;;;;;;;;;;;6417:151;;;;;;;;;;-1:-1:-1;6417:151:0;;;;;:::i;:::-;;:::i;35260:169::-;;;;;;;;;;-1:-1:-1;35260:169:0;;;;;:::i;:::-;;:::i;23323:24::-;;;;;;;;;;-1:-1:-1;23323:24:0;;;;-1:-1:-1;;;;;23323:24:0;;;;-1:-1:-1;;;23323:24:0;;;;;;;;;-1:-1:-1;;;;;6627:15:1;;;6609:34;;6679:15;;;;6674:2;6659:18;;6652:43;6529:18;23323:24:0;6382:319:1;13600:244:0;;;;;;;;;;-1:-1:-1;13600:244:0;;;;;:::i;:::-;;:::i;33671:157::-;;;;;;;;;;;;;:::i;33179:484::-;;;;;;;;;;-1:-1:-1;33179:484:0;;;;;:::i;:::-;;:::i;23248:66::-;;;;;;;;;;-1:-1:-1;23248:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4528:100;4582:13;4615:5;4608:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4528:100;:::o;6888:201::-;6971:4;514:10;7027:32;514:10;7043:7;7052:6;7027:8;:32::i;:::-;7077:4;7070:11;;;6888:201;;;;;:::o;32336:346::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;;;;;;;;;32457:6:::1;32436:13;5745:12:::0;;;5657:108;32436:13:::1;:17;::::0;32452:1:::1;32436:17;:::i;:::-;32435:28;;;;:::i;:::-;32422:9;:41;;32414:107;;;::::0;-1:-1:-1;;;32414:107:0;;8469:2:1;32414:107:0::1;::::0;::::1;8451:21:1::0;8508:2;8488:18;;;8481:30;8547:34;8527:18;;;8520:62;-1:-1:-1;;;8598:18:1;;;8591:51;8659:19;;32414:107:0::1;8267:417:1::0;32414:107:0::1;32575:4;32554:13;5745:12:::0;;;5657:108;32554:13:::1;:17;::::0;32570:1:::1;32554:17;:::i;:::-;32553:26;;;;:::i;:::-;32540:9;:39;;32532:104;;;::::0;-1:-1:-1;;;32532:104:0;;8891:2:1;32532:104:0::1;::::0;::::1;8873:21:1::0;8930:2;8910:18;;;8903:30;8969:34;8949:18;;;8942:62;-1:-1:-1;;;9020:18:1;;;9013:50;9080:19;;32532:104:0::1;8689:416:1::0;32532:104:0::1;32647:15;:27:::0;32336:346::o;34350:333::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;34475:37;;::::1;34467:72;;;::::0;-1:-1:-1;;;34467:72:0;;9312:2:1;34467:72:0::1;::::0;::::1;9294:21:1::0;9351:2;9331:18;;;9324:30;-1:-1:-1;;;9370:18:1;;;9363:52;9432:18;;34467:72:0::1;9110:346:1::0;34467:72:0::1;34554:9;34550:126;34569:18:::0;;::::1;34550:126;;;34608:56;34624:10;34636:7;;34644:1;34636:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34648:12;;34661:1;34648:15;;;;;;;:::i;:::-;;;;;;;34608;:56::i;:::-;34589:3;;34550:126;;;;34350:333:::0;;;;:::o;35079:173::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35167:22:0;::::1;35159:47;;;;-1:-1:-1::0;;;35159:47:0::1;;;;;;;:::i;:::-;35217:16;:27:::0;;-1:-1:-1;;;;;;35217:27:0::1;-1:-1:-1::0;;;;;35217:27:0;;;::::1;::::0;;;::::1;::::0;;35079:173::o;7669:261::-;7766:4;514:10;7824:38;7840:4;514:10;7855:6;7824:15;:38::i;:::-;7873:27;7883:4;7889:2;7893:6;7873:9;:27::i;:::-;-1:-1:-1;7918:4:0;;7669:261;-1:-1:-1;;;;7669:261:0:o;32690:481::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;32834:34:0::1;::::0;;::::1;::::0;;32879:30;;::::1;-1:-1:-1::0;;;32879:30:0;32920:32;::::1;-1:-1:-1::0;;;32920:32:0;;;;;32980:27:::1;32879:30:::0;32834:34;32980:27:::1;:::i;:::-;:42;;;;:::i;:::-;32963:59;;:14;::::0;::::1;:59:::0;;;33060:4:::1;-1:-1:-1::0;33041:23:0::1;33033:60;;;::::0;-1:-1:-1;;;33033:60:0;;10317:2:1;33033:60:0::1;::::0;::::1;10299:21:1::0;10356:2;10336:18;;;10329:30;-1:-1:-1;;;10375:18:1;;;10368:54;10439:18;;33033:60:0::1;10115:348:1::0;33033:60:0::1;33123:14;::::0;::::1;::::0;33109:29:::1;::::0;10643:14:1;10631:27;;;10613:46;;33109:29:0::1;::::0;10601:2:1;10586:18;33109:29:0::1;;;;;;;33149:14:::0;;:6:::1;:14:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;33149:14:0::1;-1:-1:-1::0;;;;33149:14:0;;::::1;-1:-1:-1::0;;;33149:14:0::1;::::0;;;;-1:-1:-1;;;;;;;;33149:14:0;;::::1;-1:-1:-1::0;;;33149:14:0::1;-1:-1:-1::0;;;;;;33149:14:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;32690:481:0:o;31696:322::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;31836:14:::1;5582:2:::0;31836::::1;:14;:::i;:::-;31829:4;31809:13;5745:12:::0;;;5657:108;31809:13:::1;:17;::::0;31825:1:::1;31809:17;:::i;:::-;:24;;;;:::i;:::-;31808:43;;;;:::i;:::-;31790:14;-1:-1:-1::0;;;;;31790:61:0::1;;;31782:81;;;::::0;-1:-1:-1;;;31782:81:0;;12249:2:1;31782:81:0::1;::::0;::::1;12231:21:1::0;12288:1;12268:18;;;12261:29;-1:-1:-1;;;12306:18:1;;;12299:37;12353:18;;31782:81:0::1;12047:330:1::0;31782:81:0::1;31928:14;5582:2:::0;31928::::1;:14;:::i;:::-;31910:33;::::0;-1:-1:-1;;;;;31910:33:0;::::1;;:::i;:::-;31874:8;:70:::0;;-1:-1:-1;;;;;;31874:70:0::1;-1:-1:-1::0;;;;;31874:70:0;;;::::1;::::0;;::::1;::::0;;31960:50:::1;::::0;12528:66:1;;;31960:50:0::1;::::0;12516:2:1;12501:18;31960:50:0::1;;;;;;;;31696:322:::0;:::o;8339:238::-;8427:4;514:10;8483:64;514:10;8499:7;8536:10;8508:25;514:10;8499:7;8508:9;:25::i;:::-;:38;;;;:::i;:::-;8483:8;:64::i;34691:380::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34780:20:0;::::1;34772:59;;;::::0;-1:-1:-1;;;34772:59:0;;12937:2:1;34772:59:0::1;::::0;::::1;12919:21:1::0;12976:2;12956:18;;;12949:30;13015:28;12995:18;;;12988:56;13061:18;;34772:59:0::1;12735:350:1::0;34772:59:0::1;34868:4;-1:-1:-1::0;;;;;34850:23:0;::::1;::::0;34842:73:::1;;;::::0;-1:-1:-1;;;34842:73:0;;13292:2:1;34842:73:0::1;::::0;::::1;13274:21:1::0;13331:2;13311:18;;;13304:30;13370:34;13350:18;;;13343:62;-1:-1:-1;;;13421:18:1;;;13414:35;13466:19;;34842:73:0::1;13090:401:1::0;34842:73:0::1;34953:39;::::0;-1:-1:-1;;;34953:39:0;;34986:4:::1;34953:39;::::0;::::1;4486:51:1::0;34926:24:0::1;::::0;-1:-1:-1;;;;;34953:24:0;::::1;::::0;::::1;::::0;4459:18:1;;34953:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34926:66;;35003:60;35033:6;35041:3;35046:16;35003:22;:60::i;:::-;34761:310;34691:380:::0;;:::o;32026:302::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;32161:14:::1;5582:2:::0;32161::::1;:14;:::i;:::-;32154:4;32134:13;5745:12:::0;;;5657:108;32134:13:::1;:17;::::0;32150:1:::1;32134:17;:::i;:::-;:24;;;;:::i;:::-;32133:43;;;;:::i;:::-;32115:14;-1:-1:-1::0;;;;;32115:61:0::1;;;32107:81;;;::::0;-1:-1:-1;;;32107:81:0;;12249:2:1;32107:81:0::1;::::0;::::1;12231:21:1::0;12288:1;12268:18;;;12261:29;-1:-1:-1;;;12306:18:1;;;12299:37;12353:18;;32107:81:0::1;12047:330:1::0;32107:81:0::1;32248:14;5582:2:::0;32248::::1;:14;:::i;:::-;32230:33;::::0;-1:-1:-1;;;;;32230:33:0;::::1;;:::i;:::-;32199:8;:65:::0;;-1:-1:-1;;;;;32199:65:0;;::::1;-1:-1:-1::0;;;32199:65:0;;::::1;::::0;::::1;;::::0;;;;32280:40:::1;::::0;32299:20;;;::::1;;12528:66:1::0;;32280:40:0::1;::::0;12516:2:1;12501:18;32280:40:0::1;12382:218:1::0;13442:150:0;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;13535:6:::1;::::0;13514:40:::1;::::0;13551:1:::1;::::0;-1:-1:-1;;;;;13535:6:0::1;::::0;13514:40:::1;::::0;13551:1;;13514:40:::1;13565:6;:19:::0;;-1:-1:-1;;;;;;13565:19:0::1;::::0;;13442:150::o;35437:171::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35524:22:0;::::1;35516:47;;;;-1:-1:-1::0;;;35516:47:0::1;;;;;;;:::i;:::-;35574:15;:26:::0;;-1:-1:-1;;;;;;35574:26:0::1;-1:-1:-1::0;;;;;35574:26:0;;;::::1;::::0;;;::::1;::::0;;35437:171::o;33982:360::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;34036:7:::1;:15:::0;;-1:-1:-1;;34036:15:0;;::::1;::::0;;;34062:20:::1;:28:::0;;;;::::1;::::0;;-1:-1:-1;;;;;;;;;34046:5:0::1;-1:-1:-1::0;;;;;;;34137:14:0::1;34154:13;5745:12:::0;;;5657:108;34154:13:::1;-1:-1:-1::0;;;;;34178:44:0;::::1;::::0;;;34233:21:::1;::::0;::::1;:39:::0;;;-1:-1:-1;;;34283:20:0;::::1;;:8;:20:::0;34319:15:::1;::::0;34137:30;;-1:-1:-1;34319:15:0::1;::::0;34178:26:::1;::::0;34319:15:::1;34025:317;;33982:360::o:0;37064:146::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;37128:11:::1;::::0;:16;37120:45:::1;;;::::0;-1:-1:-1;;;37120:45:0;;13887:2:1;37120:45:0::1;::::0;::::1;13869:21:1::0;13926:2;13906:18;;;13899:30;-1:-1:-1;;;13945:18:1;;;13938:46;14001:18;;37120:45:0::1;13685:340:1::0;37120:45:0::1;37190:12;37176:11;:26:::0;37064:146::o;4747:104::-;4803:13;4836:7;4829:14;;;;;:::i;33836:138::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;33902:12:::1;::::0;::::1;;33894:41;;;::::0;-1:-1:-1;;;33894:41:0;;14232:2:1;33894:41:0::1;::::0;::::1;14214:21:1::0;14271:2;14251:18;;;14244:30;-1:-1:-1;;;14290:18:1;;;14283:46;14346:18;;33894:41:0::1;14030:340:1::0;33894:41:0::1;33946:12;:20:::0;;-1:-1:-1;;33946:20:0::1;::::0;;33836:138::o;9080:436::-;9173:4;514:10;9173:4;9256:25;514:10;9273:7;9256:9;:25::i;:::-;9229:52;;9320:15;9300:16;:35;;9292:85;;;;-1:-1:-1;;;9292:85:0;;14577:2:1;9292:85:0;;;14559:21:1;14616:2;14596:18;;;14589:30;14655:34;14635:18;;;14628:62;-1:-1:-1;;;14706:18:1;;;14699:35;14751:19;;9292:85:0;14375:401:1;9292:85:0;9413:60;9422:5;9429:7;9457:15;9438:16;:34;9413:8;:60::i;6161:193::-;6240:4;514:10;6296:28;514:10;6313:2;6317:6;6296:9;:28::i;31009:319::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31107:22:0;::::1;31099:47;;;::::0;-1:-1:-1;;;31099:47:0;;14983:2:1;31099:47:0::1;::::0;::::1;14965:21:1::0;15022:2;15002:18;;;14995:30;-1:-1:-1;;;15041:18:1;;;15034:42;15093:18;;31099:47:0::1;14781:336:1::0;31099:47:0::1;31185:4;-1:-1:-1::0;;;;;31165:25:0;::::1;::::0;31157:62:::1;;;::::0;-1:-1:-1;;;31157:62:0;;15324:2:1;31157:62:0::1;::::0;::::1;15306:21:1::0;15363:2;15343:18;;;15336:30;15402:26;15382:18;;;15375:54;15446:18;;31157:62:0::1;15122:348:1::0;31157:62:0::1;-1:-1:-1::0;;;;;31230:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:36;;-1:-1:-1;;31230:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31282:38;;15643:51:1;;;15710:18;;;15703:50;31282:38:0::1;::::0;15616:18:1;31282:38:0::1;;;;;;;;31009:319:::0;;:::o;31336:352::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31436:22:0;::::1;31428:47;;;::::0;-1:-1:-1;;;31428:47:0;;14983:2:1;31428:47:0::1;::::0;::::1;14965:21:1::0;15022:2;15002:18;;;14995:30;-1:-1:-1;;;15041:18:1;;;15034:42;15093:18;;31428:47:0::1;14781:336:1::0;31428:47:0::1;31490:9;31486:90;;31535:6;::::0;-1:-1:-1;;;;;31535:6:0;;::::1;31523:18:::0;;::::1;::::0;31515:49:::1;;;::::0;-1:-1:-1;;;31515:49:0;;15966:2:1;31515:49:0::1;::::0;::::1;15948:21:1::0;16005:2;15985:18;;;15978:30;-1:-1:-1;;;16024:18:1;;;16017:48;16082:18;;31515:49:0::1;15764:342:1::0;31515:49:0::1;-1:-1:-1::0;;;;;31586:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;31586:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31640:40;;15643:51:1;;;15710:18;;;15703:50;31640:40:0::1;::::0;15616:18:1;31640:40:0::1;15475:284:1::0;6417:151:0;-1:-1:-1;;;;;6533:18:0;;;6506:7;6533:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6417:151::o;35260:169::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35346:22:0;::::1;35338:47;;;;-1:-1:-1::0;;;35338:47:0::1;;;;;;;:::i;:::-;35396:14;:25:::0;;-1:-1:-1;;;;;;35396:25:0::1;-1:-1:-1::0;;;;;35396:25:0;;;::::1;::::0;;;::::1;::::0;;35260:169::o;13600:244::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13689:22:0;::::1;13681:73;;;::::0;-1:-1:-1;;;13681:73:0;;16313:2:1;13681:73:0::1;::::0;::::1;16295:21:1::0;16352:2;16332:18;;;16325:30;16391:34;16371:18;;;16364:62;-1:-1:-1;;;16442:18:1;;;16435:36;16488:19;;13681:73:0::1;16111:402:1::0;13681:73:0::1;13791:6;::::0;13770:38:::1;::::0;-1:-1:-1;;;;;13770:38:0;;::::1;::::0;13791:6:::1;::::0;13770:38:::1;::::0;13791:6:::1;::::0;13770:38:::1;13819:6;:17:::0;;-1:-1:-1;;;;;;13819:17:0::1;-1:-1:-1::0;;;;;13819:17:0;;;::::1;::::0;;;::::1;::::0;;13600:244::o;33671:157::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;33740:20:::1;::::0;::::1;;33732:49;;;::::0;-1:-1:-1;;;33732:49:0;;14232:2:1;33732:49:0::1;::::0;::::1;14214:21:1::0;14271:2;14251:18;;;14244:30;-1:-1:-1;;;14290:18:1;;;14283:46;14346:18;;33732:49:0::1;14030:340:1::0;33732:49:0::1;33792:20;:28:::0;;-1:-1:-1;;33792:28:0::1;::::0;;33671:157::o;33179:484::-;13355:6;;-1:-1:-1;;;;;13355:6:0;514:10;13355:22;13347:67;;;;-1:-1:-1;;;13347:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;33324:34:0::1;::::0;;::::1;::::0;;33369:30;;::::1;-1:-1:-1::0;;;33369:30:0;33410:32;::::1;-1:-1:-1::0;;;33410:32:0;;;;;33470:27:::1;33369:30:::0;33324:34;33470:27:::1;:::i;:::-;:42;;;;:::i;:::-;33453:59;;:14;::::0;::::1;:59:::0;;;33550:4:::1;-1:-1:-1::0;33531:23:0::1;33523:60;;;::::0;-1:-1:-1;;;33523:60:0;;10317:2:1;33523:60:0::1;::::0;::::1;10299:21:1::0;10356:2;10336:18;;;10329:30;-1:-1:-1;;;10375:18:1;;;10368:54;10439:18;;33523:60:0::1;10115:348:1::0;33523:60:0::1;33614:14;::::0;::::1;::::0;33599:30:::1;::::0;10643:14:1;10631:27;;;10613:46;;33599:30:0::1;::::0;10601:2:1;10586:18;33599:30:0::1;;;;;;;33640:15:::0;;:7:::1;:15:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;33640:15:0::1;-1:-1:-1::0;;;;33640:15:0;;::::1;-1:-1:-1::0;;;33640:15:0::1;::::0;;;;-1:-1:-1;;;;;;;;33640:15:0;;::::1;-1:-1:-1::0;;;33640:15:0::1;-1:-1:-1::0;;;;;;33640:15:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;33179:484:0:o;11841:346::-;-1:-1:-1;;;;;11943:19:0;;11935:68;;;;-1:-1:-1;;;11935:68:0;;16720:2:1;11935:68:0;;;16702:21:1;16759:2;16739:18;;;16732:30;16798:34;16778:18;;;16771:62;-1:-1:-1;;;16849:18:1;;;16842:34;16893:19;;11935:68:0;16518:400:1;11935:68:0;-1:-1:-1;;;;;12022:21:0;;12014:68;;;;-1:-1:-1;;;12014:68:0;;17125:2:1;12014:68:0;;;17107:21:1;17164:2;17144:18;;;17137:30;17203:34;17183:18;;;17176:62;-1:-1:-1;;;17254:18:1;;;17247:32;17296:19;;12014:68:0;16923:398:1;12014:68:0;-1:-1:-1;;;;;12095:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12147:32;;1445:25:1;;;12147:32:0;;1418:18:1;12147:32:0;;;;;;;11841:346;;;:::o;9986:705::-;-1:-1:-1;;;;;10083:18:0;;10075:68;;;;-1:-1:-1;;;10075:68:0;;17528:2:1;10075:68:0;;;17510:21:1;17567:2;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;-1:-1:-1;;;17657:18:1;;;17650:35;17702:19;;10075:68:0;17326:401:1;10075:68:0;-1:-1:-1;;;;;10162:16:0;;10154:64;;;;-1:-1:-1;;;10154:64:0;;17934:2:1;10154:64:0;;;17916:21:1;17973:2;17953:18;;;17946:30;18012:34;17992:18;;;17985:62;-1:-1:-1;;;18063:18:1;;;18056:33;18106:19;;10154:64:0;17732:399:1;10154:64:0;-1:-1:-1;;;;;10253:15:0;;10231:19;10253:15;;;;;;;;;;;10287:21;;;;10279:72;;;;-1:-1:-1;;;10279:72:0;;18338:2:1;10279:72:0;;;18320:21:1;18377:2;18357:18;;;18350:30;18416:34;18396:18;;;18389:62;-1:-1:-1;;;18467:18:1;;;18460:36;18513:19;;10279:72:0;18136:402:1;10279:72:0;-1:-1:-1;;;;;10387:15:0;;;:9;:15;;;;;;;;;;;10405:20;;;10387:38;;10605:13;;;;;;;;;;:23;;;;;;10657:26;;1445:25:1;;;10605:13:0;;10657:26;;1418:18:1;10657:26:0;;;;;;;10064:627;9986:705;;;:::o;12478:419::-;12579:24;12606:25;12616:5;12623:7;12606:9;:25::i;:::-;12579:52;;-1:-1:-1;;12646:16:0;:37;12642:248;;12728:6;12708:16;:26;;12700:68;;;;-1:-1:-1;;;12700:68:0;;18745:2:1;12700:68:0;;;18727:21:1;18784:2;18764:18;;;18757:30;18823:31;18803:18;;;18796:59;18872:18;;12700:68:0;18543:353:1;12700:68:0;12812:51;12821:5;12828:7;12856:6;12837:16;:25;12812:8;:51::i;:::-;12568:329;12478:419;;;:::o;26416:453::-;-1:-1:-1;;;;;26562:20:0;;;;;;:14;:20;;;;;;;;26561:21;:44;;;;-1:-1:-1;;;;;;26587:18:0;;;;;;:14;:18;;;;;;;;26586:19;26561:44;26558:260;;;26624:7;;;;26621:134;;;26673:1;26659:11;;:15;26651:40;;;;-1:-1:-1;;;26651:40:0;;19103:2:1;26651:40:0;;;19085:21:1;19142:2;19122:18;;;19115:30;-1:-1:-1;;;19161:18:1;;;19154:42;19213:18;;26651:40:0;18901:336:1;26651:40:0;26710:29;26722:4;26728:2;26732:6;26710:11;:29::i;:::-;26779:27;26789:4;26795:2;26799:6;26779:9;:27::i;:::-;26769:37;;;;:::i;:::-;;;26558:260;26830:31;26846:4;26851:2;26854:6;26830:15;:31::i;20014:177::-;20124:58;;;-1:-1:-1;;;;;19567:32:1;;20124:58:0;;;19549:51:1;19616:18;;;;19609:34;;;20124:58:0;;;;;;;;;;19522:18:1;;;;20124:58:0;;;;;;;;-1:-1:-1;;;;;20124:58:0;-1:-1:-1;;;20124:58:0;;;20097:86;;20117:5;;20097:19;:86::i;26877:1056::-;-1:-1:-1;;;;;26982:20:0;;;26960:19;26982:20;;;:16;:20;;;;;;;;;5929:18;;;;;;;27059:36;;;;;;;27087:8;27059:36;-1:-1:-1;;;;;27059:36:0;;;;;-1:-1:-1;;;27059:36:0;;;;;;;;27126:15;;;;;:9;:15;;;;;;26982:20;;;;;5929:18;;27126:15;:34;;;;;27146:14;27145:15;27126:34;27122:498;;;27195:26;;-1:-1:-1;;;;;27185:36:0;;;;27177:56;;;;-1:-1:-1;;;27177:56:0;;19856:2:1;27177:56:0;;;19838:21:1;19895:1;19875:18;;;19868:29;-1:-1:-1;;;19913:18:1;;;19906:37;19960:18;;27177:56:0;19654:330:1;27177:56:0;27280:21;;;;-1:-1:-1;;;;;27256:45:0;:20;27265:11;27256:6;:20;:::i;:::-;:45;;27248:68;;;;-1:-1:-1;;;27248:68:0;;20191:2:1;27248:68:0;;;20173:21:1;20230:2;20210:18;;;20203:30;-1:-1:-1;;;20249:18:1;;;20242:40;20299:18;;27248:68:0;19989:334:1;27248:68:0;27122:498;;;-1:-1:-1;;;;;27365:13:0;;;;;;:9;:13;;;;;;;;:40;;;;-1:-1:-1;;;;;;27383:22:0;;;;;;:16;:22;;;;;;;;27382:23;27365:40;27361:259;;;27440:26;;-1:-1:-1;;;;;27430:36:0;;;;27422:56;;;;-1:-1:-1;;;27422:56:0;;19856:2:1;27422:56:0;;;19838:21:1;19895:1;19875:18;;;19868:29;-1:-1:-1;;;19913:18:1;;;19906:37;19960:18;;27422:56:0;19654:330:1;27361:259:0;27509:14;27505:115;;27572:21;;;;-1:-1:-1;;;;;27548:45:0;:20;27557:11;27548:6;:20;:::i;:::-;:45;;27540:68;;;;-1:-1:-1;;;27540:68:0;;20191:2:1;27540:68:0;;;20173:21:1;20230:2;20210:18;;;20203:30;-1:-1:-1;;;20249:18:1;;;20242:40;20299:18;;27540:68:0;19989:334:1;27540:68:0;27636:20;;;;27632:294;;;27690:9;;-1:-1:-1;;;;;27676:24:0;;;27690:9;;27676:24;;;;:49;;-1:-1:-1;27718:6:0;;-1:-1:-1;;;;;27704:21:0;;;27718:6;;27704:21;;27676:49;27672:243;;;27778:9;27753:35;;;;:24;:35;;;;;;27791:12;-1:-1:-1;27745:85:0;;;;-1:-1:-1;;;27745:85:0;;20530:2:1;27745:85:0;;;20512:21:1;20569:2;20549:18;;;20542:30;-1:-1:-1;;;20588:18:1;;;20581:52;20650:18;;27745:85:0;20328:346:1;27745:85:0;27874:9;27849:35;;;;:24;:35;;;;;27887:12;27849:50;;27672:243;26949:984;;;26877:1056;;;:::o;27941:1137::-;28072:15;;28062:4;28020:7;5929:18;;;;;;;;;;;28020:7;;-1:-1:-1;28044:43:0;:63;;;;-1:-1:-1;;;;;;28092:15:0;;;;;;:9;:15;;;;;;;;28091:16;28044:63;28041:109;;;28124:14;:12;:14::i;:::-;28165:12;;;;28162:61;;;28193:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28306:13:0;;;;:9;:13;;;;;;;;28302:126;;;-1:-1:-1;28335:15:0;;;;;;;;28343:7;28335:15;;;;;;;-1:-1:-1;;;28335:15:0;;;;;;;;-1:-1:-1;;;28335:15:0;;;;;;;;;;;-1:-1:-1;;;28335:15:0;;;;;;;;;28302:126;;;-1:-1:-1;;;;;28371:15:0;;;;;;:9;:15;;;;;;;;28368:60;;;-1:-1:-1;28402:14:0;;;;;;;;28410:6;28402:14;;;;;;;-1:-1:-1;;;28402:14:0;;;;;;;;-1:-1:-1;;;28402:14:0;;;;;;;;;;;-1:-1:-1;;;28402:14:0;;;;;;;;;28368:60;28443:14;;;;:18;;;28440:600;;28477:53;;;;;;;;28518:12;28477:53;-1:-1:-1;;;;;28477:53:0;;;;;-1:-1:-1;;;28477:53:0;;;;;;;;-1:-1:-1;;;28477:53:0;;;;;;;;;;-1:-1:-1;;;28477:53:0;;;;;;;;;;;;;;;28568:14;;;23393:5;;28559:23;;;;:6;:23;:::i;:::-;:37;;;;:::i;:::-;28545:52;;28704:3;28687:5;:14;;;28660:41;;28666:5;:18;;;28660:24;;:3;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:47;;;;:::i;:::-;28612:96;;:18;;:96;;;;;:::i;:::-;-1:-1:-1;;;;;28612:96:0;;;-1:-1:-1;28794:14:0;;;;28775:16;;;;28811:3;;28769:39;;;;;:22;;;:3;:22;:::i;:::-;:39;;;;:::i;:::-;:45;;;;:::i;:::-;28723:18;:35;;:92;;;;;;;:::i;:::-;-1:-1:-1;;;;;28723:92:0;;;-1:-1:-1;28903:14:0;;;;28883:17;;;;28920:3;;28877:40;;;;;:23;;;:3;:23;:::i;:::-;:40;;;;:::i;:::-;:46;;;;:::i;:::-;28830:18;:36;;:94;;;;;;;:::i;:::-;-1:-1:-1;;;;;28830:94:0;;;;;;28939:33;;:12;:33;;;;;;;;;;;;;;;;-1:-1:-1;;;28939:33:0;-1:-1:-1;;;;28939:33:0;;;-1:-1:-1;;;28939:33:0;;;;;-1:-1:-1;;;;28939:33:0;;;-1:-1:-1;;;28939:33:0;-1:-1:-1;;;;;;28939:33:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28987:41:0;29003:4;29017;-1:-1:-1;;;;;28987:41:0;;:15;:41::i;:::-;28462:578;28440:600;-1:-1:-1;;;;;;29060:10:0;;27941:1137;-1:-1:-1;;;;27941:1137:0:o;20412:333::-;20493:23;20519:69;20547:4;20519:69;;;;;;;;;;;;;;;;;20527:5;-1:-1:-1;;;;;20519:27:0;;;:69;;;;;:::i;:::-;20603:17;;20493:95;;-1:-1:-1;20603:21:0;20599:139;;20660:10;20649:30;;;;;;;;;;;;:::i;:::-;20641:85;;;;-1:-1:-1;;;20641:85:0;;21816:2:1;20641:85:0;;;21798:21:1;21855:2;21835:18;;;21828:30;21894:34;21874:18;;;21867:62;-1:-1:-1;;;21945:18:1;;;21938:40;21995:19;;20641:85:0;21614:406:1;29475:1502:0;29564:4;29520:23;5929:18;;;;;;;;;;;29581:50;;;;;;;;29619:12;29581:50;-1:-1:-1;;;;;29581:50:0;;;;;;-1:-1:-1;;;29581:50:0;;;;;;;;;;-1:-1:-1;;;29581:50:0;;;;;;;;;;;-1:-1:-1;;;29581:50:0;;;;;;;;;;;29520;;-1:-1:-1;29581:50:0;;-1:-1:-1;;29581:50:0;29670:87;;29581:50;29670:87;:::i;:::-;:132;;;;:::i;:::-;29642:160;-1:-1:-1;29826:20:0;;;:46;;-1:-1:-1;29850:22:0;;29826:46;29823:60;;;29875:7;;;29475:1502::o;29823:60::-;29916:15;;:20;;29934:2;29916:20;:::i;:::-;29898:15;:38;29895:107;;;29970:15;;:20;;29988:2;29970:20;:::i;:::-;29952:38;;29895:107;30015:19;;30012:771;;30052:33;30069:15;30052:16;:33::i;:::-;30205:32;;;;30135:21;;30114:18;;-1:-1:-1;;;;;30205:36:0;;30202:186;;30274:14;;30314:32;;;;-1:-1:-1;;;;;30274:14:0;;;;30348:17;;30301:45;;-1:-1:-1;;;;;30301:45:0;:10;:45;:::i;:::-;:64;;;;:::i;:::-;30274:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30261:109:0;;-1:-1:-1;;30202:186:0;30407:33;;;;-1:-1:-1;;;;;30407:37:0;;30404:189;;30477:15;;30518:33;;;;-1:-1:-1;;;;;30477:15:0;;;;30553:17;;30505:46;;-1:-1:-1;;;;;30505:46:0;:10;:46;:::i;:::-;:65;;;;:::i;:::-;30477:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30464:111:0;;-1:-1:-1;;30404:189:0;30622:21;;-1:-1:-1;30663:14:0;;30660:112;;30710:16;;:44;;-1:-1:-1;;;;;30710:16:0;;;;30739:10;;30710:44;;;;30739:10;30710:16;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30697:57:0;;-1:-1:-1;;30660:112:0;30035:748;;30012:771;-1:-1:-1;30832:1:0;30795:38;;;30844:32;;;:36;;;30891:33;;;:37;30939:12;:30;;;;;;;;;-1:-1:-1;;;30939:30:0;-1:-1:-1;;;;;;30939:30:0;;;;;;;;;-1:-1:-1;29475:1502:0:o;35616:1403::-;35664:31;;;;;;;;;35689:6;35664:31;;;;;;;-1:-1:-1;;;35664:31:0;;;;;;;;;;;;;-1:-1:-1;;;35664:31:0;;;;;;;;;-1:-1:-1;;;35664:31:0;;;;;;;;;;;;;;35706:33;;;;;;;35732:7;35706:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35839:11;;35664:31;;35706:33;35773:12;;35664:22;;35824:26;;35773:12;35824:26;:::i;:::-;35796:54;;35885:2;35864:17;:23;35861:937;;35903:12;:20;;-1:-1:-1;;35903:20:0;;;35994:3;35974:13;5745:12;;;5657:108;35974:13;:17;;35990:1;35974:17;:::i;:::-;:23;;;;:::i;:::-;35938:8;:60;;-1:-1:-1;;;;;;35938:60:0;-1:-1:-1;;;;;35938:60:0;;;;;;;;;;5745:12;;36064:3;;36044:17;;36060:1;36044:17;:::i;:::-;:23;;;;:::i;:::-;36013:8;:55;;-1:-1:-1;;;;;36013:55:0;;;-1:-1:-1;;;36013:55:0;;;;;;;;;36110:3;36085:28;;;36151:3;36128:20;;;;:26;;;36169:21;;;;:27;;;36232:3;36211:18;;;;:24;;;36252:29;;;36296:21;;;:27;;;36338:22;;:28;;;;36381:19;;;:25;35861:937;;;36451:2;36430:17;:23;36426:372;;36494:3;36469:28;;;:22;36512:20;;;;:24;;;36551:21;;;;:25;;;36591:18;;;;:24;;;;36658:4;36632:30;;;36677:21;;;:25;;;36717:22;;:26;;;;36758:19;;;:26;36426:372;36836:22;;36813:6;:19;:45;:19;;;:45;;;36810:94;;36874:18;;:6;:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36874:18:0;-1:-1:-1;;;;36874:18:0;;;-1:-1:-1;;;36874:18:0;;;;;-1:-1:-1;;;;;;;;36874:18:0;;;-1:-1:-1;;;36874:18:0;-1:-1:-1;;;;;;36874:18:0;;;;;;;;;;;;;;;;;;;;;;;36810:94;36941:23;;36917:7;:20;:47;:20;;;:47;;;36914:98;;36980:20;;:7;:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36980:20:0;-1:-1:-1;;;;36980:20:0;;;-1:-1:-1;;;36980:20:0;;;;;-1:-1:-1;;;;;;;;36980:20:0;;;-1:-1:-1;;;36980:20:0;-1:-1:-1;;;;;;36980:20:0;;;;;;;;;;;;;;;;;;;;;;;35653:1366;;;;35616:1403::o;14517:229::-;14654:12;14686:52;14708:6;14716:4;14722:1;14725:12;14686:21;:52::i;:::-;14679:59;14517:229;-1:-1:-1;;;;14517:229:0:o;29086:381::-;29175:16;;;29189:1;29175:16;;;;;;;;29151:21;;29175:16;;;;;;;;;;-1:-1:-1;29175:16:0;29151:40;;29220:4;29202;29207:1;29202:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;29202:23:0;;;-1:-1:-1;;;;;29202:23:0;;;;;29254:4;29236;29241:1;29236:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29236:23:0;;;:7;;;;;;;;;:23;29272:9;;:187;;-1:-1:-1;;;29272:187:0;;:9;;;:60;;:187;;29347:8;;29272:9;;29386:4;;29413;;29433:15;;29272:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15637:455;15807:12;15865:5;15840:21;:30;;15832:81;;;;-1:-1:-1;;;15832:81:0;;23554:2:1;15832:81:0;;;23536:21:1;23593:2;23573:18;;;23566:30;23632:34;23612:18;;;23605:62;-1:-1:-1;;;23683:18:1;;;23676:36;23729:19;;15832:81:0;23352:402:1;15832:81:0;15925:12;15939:23;15966:6;-1:-1:-1;;;;;15966:11:0;15985:5;15992:4;15966:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15924:73;;;;16015:69;16042:6;16050:7;16059:10;16071:12;16015:26;:69::i;:::-;16008:76;15637:455;-1:-1:-1;;;;;;;15637:455:0:o;18210:644::-;18395:12;18424:7;18420:427;;;18452:10;:17;18473:1;18452:22;18448:290;;-1:-1:-1;;;;;13958:19:0;;;18662:60;;;;-1:-1:-1;;;18662:60:0;;24253:2:1;18662:60:0;;;24235:21:1;24292:2;24272:18;;;24265:30;24331:31;24311:18;;;24304:59;24380:18;;18662:60:0;24051:353:1;18662:60:0;-1:-1:-1;18759:10:0;18752:17;;18420:427;18802:33;18810:10;18822:12;19557:17;;:21;19553:388;;19789:10;19783:17;19846:15;19833:10;19829:2;19825:19;19818:44;19553:388;19916:12;19909:20;;-1:-1:-1;;;19909:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:173::-;738:20;;-1:-1:-1;;;;;787:31:1;;777:42;;767:70;;833:1;830;823:12;767:70;670:173;;;:::o;848:254::-;916:6;924;977:2;965:9;956:7;952:23;948:32;945:52;;;993:1;990;983:12;945:52;1016:29;1035:9;1016:29;:::i;:::-;1006:39;1092:2;1077:18;;;;1064:32;;-1:-1:-1;;;848:254:1:o;1481:180::-;1540:6;1593:2;1581:9;1572:7;1568:23;1564:32;1561:52;;;1609:1;1606;1599:12;1561:52;-1:-1:-1;1632:23:1;;1481:180;-1:-1:-1;1481:180:1:o;1666:367::-;1729:8;1739:6;1793:3;1786:4;1778:6;1774:17;1770:27;1760:55;;1811:1;1808;1801:12;1760:55;-1:-1:-1;1834:20:1;;-1:-1:-1;;;;;1866:30:1;;1863:50;;;1909:1;1906;1899:12;1863:50;1946:4;1938:6;1934:17;1922:29;;2006:3;1999:4;1989:6;1986:1;1982:14;1974:6;1970:27;1966:38;1963:47;1960:67;;;2023:1;2020;2013:12;1960:67;1666:367;;;;;:::o;2038:773::-;2160:6;2168;2176;2184;2237:2;2225:9;2216:7;2212:23;2208:32;2205:52;;;2253:1;2250;2243:12;2205:52;2293:9;2280:23;-1:-1:-1;;;;;2363:2:1;2355:6;2352:14;2349:34;;;2379:1;2376;2369:12;2349:34;2418:70;2480:7;2471:6;2460:9;2456:22;2418:70;:::i;:::-;2507:8;;-1:-1:-1;2392:96:1;-1:-1:-1;2595:2:1;2580:18;;2567:32;;-1:-1:-1;2611:16:1;;;2608:36;;;2640:1;2637;2630:12;2608:36;;2679:72;2743:7;2732:8;2721:9;2717:24;2679:72;:::i;:::-;2038:773;;;;-1:-1:-1;2770:8:1;-1:-1:-1;;;;2038:773:1:o;2816:186::-;2875:6;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2967:29;2986:9;2967:29;:::i;:::-;2957:39;2816:186;-1:-1:-1;;;2816:186:1:o;3007:328::-;3084:6;3092;3100;3153:2;3141:9;3132:7;3128:23;3124:32;3121:52;;;3169:1;3166;3159:12;3121:52;3192:29;3211:9;3192:29;:::i;:::-;3182:39;;3240:38;3274:2;3263:9;3259:18;3240:38;:::i;:::-;3230:48;;3325:2;3314:9;3310:18;3297:32;3287:42;;3007:328;;;;;:::o;3340:167::-;3407:20;;3467:14;3456:26;;3446:37;;3436:65;;3497:1;3494;3487:12;3512:328;3586:6;3594;3602;3655:2;3643:9;3634:7;3630:23;3626:32;3623:52;;;3671:1;3668;3661:12;3623:52;3694:28;3712:9;3694:28;:::i;:::-;3684:38;;3741:37;3774:2;3763:9;3759:18;3741:37;:::i;:::-;3731:47;;3797:37;3830:2;3819:9;3815:18;3797:37;:::i;:::-;3787:47;;3512:328;;;;;:::o;4034:301::-;4093:6;4146:2;4134:9;4125:7;4121:23;4117:32;4114:52;;;4162:1;4159;4152:12;4114:52;4201:9;4188:23;-1:-1:-1;;;;;4244:5:1;4240:46;4233:5;4230:57;4220:85;;4301:1;4298;4291:12;5005:260;5073:6;5081;5134:2;5122:9;5113:7;5109:23;5105:32;5102:52;;;5150:1;5147;5140:12;5102:52;5173:29;5192:9;5173:29;:::i;:::-;5163:39;;5221:38;5255:2;5244:9;5240:18;5221:38;:::i;:::-;5211:48;;5005:260;;;;;:::o;5939:118::-;6025:5;6018:13;6011:21;6004:5;6001:32;5991:60;;6047:1;6044;6037:12;5991:60;5939:118;:::o;6062:315::-;6127:6;6135;6188:2;6176:9;6167:7;6163:23;6159:32;6156:52;;;6204:1;6201;6194:12;6156:52;6227:29;6246:9;6227:29;:::i;:::-;6217:39;;6306:2;6295:9;6291:18;6278:32;6319:28;6341:5;6319:28;:::i;:::-;6366:5;6356:15;;;6062:315;;;;;:::o;6706:248::-;6774:6;6782;6835:2;6823:9;6814:7;6810:23;6806:32;6803:52;;;6851:1;6848;6841:12;6803:52;-1:-1:-1;;6874:23:1;;;6944:2;6929:18;;;6916:32;;-1:-1:-1;6706:248:1:o;6959:380::-;7038:1;7034:12;;;;7081;;;7102:61;;7156:4;7148:6;7144:17;7134:27;;7102:61;7209:2;7201:6;7198:14;7178:18;7175:38;7172:161;;7255:10;7250:3;7246:20;7243:1;7236:31;7290:4;7287:1;7280:15;7318:4;7315:1;7308:15;7172:161;;6959:380;;;:::o;7344:356::-;7546:2;7528:21;;;7565:18;;;7558:30;7624:34;7619:2;7604:18;;7597:62;7691:2;7676:18;;7344:356::o;7705:127::-;7766:10;7761:3;7757:20;7754:1;7747:31;7797:4;7794:1;7787:15;7821:4;7818:1;7811:15;7837:168;7910:9;;;7941;;7958:15;;;7952:22;;7938:37;7928:71;;7979:18;;:::i;8010:127::-;8071:10;8066:3;8062:20;8059:1;8052:31;8102:4;8099:1;8092:15;8126:4;8123:1;8116:15;8142:120;8182:1;8208;8198:35;;8213:18;;:::i;:::-;-1:-1:-1;8247:9:1;;8142:120::o;9461:127::-;9522:10;9517:3;9513:20;9510:1;9503:31;9553:4;9550:1;9543:15;9577:4;9574:1;9567:15;9593:336;9795:2;9777:21;;;9834:2;9814:18;;;9807:30;-1:-1:-1;;;9868:2:1;9853:18;;9846:42;9920:2;9905:18;;9593:336::o;9934:176::-;10001:14;10035:10;;;10047;;;10031:27;;10070:11;;;10067:37;;;10084:18;;:::i;:::-;10067:37;9934:176;;;;:::o;10670:416::-;10759:1;10796:5;10759:1;10810:270;10831:7;10821:8;10818:21;10810:270;;;10890:4;10886:1;10882:6;10878:17;10872:4;10869:27;10866:53;;;10899:18;;:::i;:::-;10949:7;10939:8;10935:22;10932:55;;;10969:16;;;;10932:55;11048:22;;;;11008:15;;;;10810:270;;;10814:3;10670:416;;;;;:::o;11091:806::-;11140:5;11170:8;11160:80;;-1:-1:-1;11211:1:1;11225:5;;11160:80;11259:4;11249:76;;-1:-1:-1;11296:1:1;11310:5;;11249:76;11341:4;11359:1;11354:59;;;;11427:1;11422:130;;;;11334:218;;11354:59;11384:1;11375:10;;11398:5;;;11422:130;11459:3;11449:8;11446:17;11443:43;;;11466:18;;:::i;:::-;-1:-1:-1;;11522:1:1;11508:16;;11537:5;;11334:218;;11636:2;11626:8;11623:16;11617:3;11611:4;11608:13;11604:36;11598:2;11588:8;11585:16;11580:2;11574:4;11571:12;11567:35;11564:77;11561:159;;;-1:-1:-1;11673:19:1;;;11705:5;;11561:159;11752:34;11777:8;11771:4;11752:34;:::i;:::-;11822:6;11818:1;11814:6;11810:19;11801:7;11798:32;11795:58;;;11833:18;;:::i;:::-;11871:20;;11091:806;-1:-1:-1;;;11091:806:1:o;11902:140::-;11960:5;11989:47;12030:4;12020:8;12016:19;12010:4;11989:47;:::i;12605:125::-;12670:9;;;12691:10;;;12688:36;;;12704:18;;:::i;13496:184::-;13566:6;13619:2;13607:9;13598:7;13594:23;13590:32;13587:52;;;13635:1;13632;13625:12;13587:52;-1:-1:-1;13658:16:1;;13496:184;-1:-1:-1;13496:184:1:o;19242:128::-;19309:9;;;19330:11;;;19327:37;;;19344:18;;:::i;20679:274::-;-1:-1:-1;;;;;20817:10:1;;;20829;;;20813:27;20860:20;;;;20751:34;20899:24;;;20889:58;;20927:18;;:::i;:::-;20889:58;;20679:274;;;;:::o;20958:216::-;20998:1;-1:-1:-1;;;;;21085:2:1;21082:1;21078:10;21107:3;21097:37;;21114:18;;:::i;:::-;21152:10;;21148:20;;;;;20958:216;-1:-1:-1;;20958:216:1:o;21179:180::-;-1:-1:-1;;;;;21284:10:1;;;21296;;;21280:27;;21319:11;;;21316:37;;;21333:18;;:::i;21364:245::-;21431:6;21484:2;21472:9;21463:7;21459:23;21455:32;21452:52;;;21500:1;21497;21490:12;21452:52;21532:9;21526:16;21551:28;21573:5;21551:28;:::i;22367:980::-;22629:4;22677:3;22666:9;22662:19;22708:6;22697:9;22690:25;22734:2;22772:6;22767:2;22756:9;22752:18;22745:34;22815:3;22810:2;22799:9;22795:18;22788:31;22839:6;22874;22868:13;22905:6;22897;22890:22;22943:3;22932:9;22928:19;22921:26;;22982:2;22974:6;22970:15;22956:29;;23003:1;23013:195;23027:6;23024:1;23021:13;23013:195;;;23092:13;;-1:-1:-1;;;;;23088:39:1;23076:52;;23183:15;;;;23148:12;;;;23124:1;23042:9;23013:195;;;-1:-1:-1;;;;;;;23264:32:1;;;;23259:2;23244:18;;23237:60;-1:-1:-1;;;23328:3:1;23313:19;23306:35;23225:3;22367:980;-1:-1:-1;;;22367:980:1:o;23759:287::-;23888:3;23926:6;23920:13;23942:66;24001:6;23996:3;23989:4;23981:6;23977:17;23942:66;:::i;:::-;24024:16;;;;;23759:287;-1:-1:-1;;23759:287:1:o

Swarm Source

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