ETH Price: $3,672.94 (+2.43%)

Token

ERC-20: Gotham (Gotham)
 

Overview

Max Total Supply

1,000,000,000 Gotham

Holders

339

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
98,567.382120015 Gotham

Value
$0.00
0x71c803e1fe36155e3a00fa3b9a8e825808396e39
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Gotham

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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



pragma solidity >=0.6.2;

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

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




pragma solidity ^0.8.4;

contract Gotham is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public marketingAddress =
    payable(0x8bA347Fdec5dd67e4Ae8D17267E50483a3355f94); // Marketing Address
    address payable public treasuryAddress =
    payable(0x449c5516Cbc556071dA417f072cC58D3D0f4651A); // Marketing Address
    
    address public immutable deadAddress =
    0x000000000000000000000000000000000000dEaD;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isSniper;
    address[] private _confirmedSnipers;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = 'Gotham';
    string private _symbol = 'Gotham';
    uint8 private _decimals = 9;
    
    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyTreasuryFee;
    uint256 private _previousbuyTotalFees;
    uint256 private _previousbuyMarketingFee;
    uint256 private _previousbuyLiquidityFee;
    uint256 private _previousbuyTreasuryFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTreasuryFee;
    uint256 private _previoussellTotalFees;
    uint256 private _previoussellMarketingFee;
    uint256 private _previoussellLiquidityFee;
    uint256 private _previoussellTreasuryFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForTreasury;

    uint256 public _taxFee = 5;
    uint256 private _previousTaxFee = _taxFee;

    uint256 launchTime;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    bool public limitsInEffect = true;
  
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
  

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;

    bool tradingOpen = false;

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _rOwned[_msgSender()] = _rTotal;
        maxTransactionAmount = _tTotal * 5 / 1000; // 0.5% maxTransactionAmountTxn
        maxWallet = _tTotal * 10 / 1000; // 1% maxWallet

        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 4;
        uint256 _buyTreasuryFee = 1;

        uint256 _sellMarketingFee = 5;
        uint256 _sellLiquidityFee = 4;
        uint256 _sellTreasuryFee = 1;

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTreasuryFee = _buyTreasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyTreasuryFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTreasuryFee = _sellTreasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellTreasuryFee;


        emit Transfer(address(0), _msgSender(), _tTotal);
    }


    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e9, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**9);
    }

    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFees, uint256 _treasuryFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFees;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyTreasuryFee;
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFees, uint256 _treasuryFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFees;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellTreasuryFee;
    }


    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**9);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }


    function initContract() external onlyOwner {
        // PancakeSwap: 0x10ED43C718714eb63d5aA57B78B54704E256024E
        // Uniswap V2: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
    }

    function openTrading() external onlyOwner {
        _taxFee = _previousTaxFee;
        tradingOpen = true;
        launchTime = block.timestamp;
    }

    function pauseTrading() external onlyOwner {
        tradingOpen = false;
    }

    function resumeTrading() external onlyOwner {
        tradingOpen = true;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    )
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    )
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public
        override
        returns (bool)
    {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                'ERC20: transfer amount exceeds allowance'
            )
        );
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    )
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                'ERC20: decreased allowance below zero'
            )
        );
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
        require(rAmount <= _rTotal, 'Amount must be less than total reflections');
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], 'Account is already excluded');
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], 'Account is already excluded');
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), 'ERC20: transfer from the zero address');
        require(to != address(0), 'ERC20: transfer to the zero address');
        require(amount > 0, 'Transfer amount must be greater than zero');
        require(!_isSniper[to], 'You have no power here!');
        require(!_isSniper[msg.sender], 'You have no power here!');


        // buy
        if (
            from == uniswapV2Pair &&
            to != address(uniswapV2Router) &&
            !_isExcludedFromFee[to]
        ) {
            require(tradingOpen, 'Trading not yet enabled.');

            //antibot
            if (block.timestamp == launchTime) {
                _isSniper[to] = true;
                _confirmedSnipers.push(to);
            }
        }

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead)
            ){
                if(!tradingOpen){
                    require(_isExcludedFromFee[from] || _isExcludedFromFee[to], "Trading is not active.");
                }

                //when buy
                if (from == uniswapV2Pair && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }

                //when sell
                else if (to == uniswapV2Pair && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }

                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        //sell

        if (!inSwapAndLiquify && tradingOpen && to == uniswapV2Pair) {
            if (contractTokenBalance > 0) {       
                swapTokens(contractTokenBalance);
            }
        }

        bool takeFee = false;

        //take fee only on swaps
        if (
            (from == uniswapV2Pair || to == uniswapV2Pair) &&
            !(_isExcludedFromFee[from] || _isExcludedFromFee[to])
        ) {
            takeFee = true;
        }

        //sell
        uint256 fees = 0;
        if (to == uniswapV2Pair){
            if (takeFee && tradingOpen){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;

            }
            
            _tokenTransfer(from, to, amount, takeFee, true);
        }
        else{
            if (takeFee && tradingOpen){
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
    
            }
            
            _tokenTransfer(from, to, amount, takeFee, false);
        }
    }

    function swapTokens(uint256 contractBalance) private lockTheSwap{
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForTreasury;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        if(contractBalance > totalSupply() * 5 / 10000 * 20){
          contractBalance = totalSupply() * 5 / 10000 * 20;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForTreasury = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap);
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForTreasury;

        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForTreasury = 0;
        
        (success,) = address(treasuryAddress).call{value: ethForTreasury}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }
        
        
        (success,) = address(marketingAddress).call{value: address(this).balance}("");
    }


    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee,
        bool isSell
    ) private {
        if (!takeFee) removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount, isSell);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount, isSell);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, isSell);
        } else {
            _transferStandard(sender, recipient, amount, isSell);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isSell
    ) private {
        (
        uint256 rAmount,
        uint256 rTransferAmount,
        uint256 rFee,
        uint256 tTransferAmount,
        uint256 tFee,
        uint256 tLiquidity
        ) = _getValues(tAmount, isSell);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isSell
    ) private {
        (
        uint256 rAmount,
        uint256 rTransferAmount,
        uint256 rFee,
        uint256 tTransferAmount,
        uint256 tFee,
        uint256 tLiquidity
        ) = _getValues(tAmount, isSell);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isSell
    ) private {
        (
        uint256 rAmount,
        uint256 rTransferAmount,
        uint256 rFee,
        uint256 tTransferAmount,
        uint256 tFee,
        uint256 tLiquidity
        ) = _getValues(tAmount, isSell);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isSell
    ) private {
        (
        uint256 rAmount,
        uint256 rTransferAmount,
        uint256 rFee,
        uint256 tTransferAmount,
        uint256 tFee,
        uint256 tLiquidity
        ) = _getValues(tAmount, isSell);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount, bool isSell)
    private
    view
    returns (
        uint256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256
    )
    {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(
            tAmount, isSell
        );
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount, bool isSell)
    private
    view
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateFee(tAmount, isSell);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
    private
    pure
    returns (
        uint256,
        uint256,
        uint256
    )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply)
                return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateFee(uint256 _amount, bool isSell)
    private
    view
    returns (uint256)
    {
        if (isSell){
                return _amount.mul(sellTotalFees).div(100);
        }
        else{
                return _amount.mul(buyTotalFees).div(100);
        }
    }

    function removeAllFee() private {

        _previousbuyTotalFees = buyTotalFees;
        _previoussellTotalFees = sellTotalFees;
        _previousbuyLiquidityFee = buyLiquidityFee;
        _previoussellLiquidityFee = sellLiquidityFee;
        _previousbuyTreasuryFee = buyTreasuryFee;
        _previoussellTreasuryFee = sellTreasuryFee;
        _previousbuyMarketingFee = buyMarketingFee;
        _previoussellMarketingFee = sellMarketingFee;

        _previousTaxFee = _taxFee;

        _taxFee = 0;
        buyTotalFees = 0;
        sellTotalFees = 0;
        buyLiquidityFee = 0;
        sellLiquidityFee = 0;
        buyTreasuryFee = 0;
        sellTreasuryFee = 0;
        buyMarketingFee = 0;
        sellMarketingFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        
        buyTotalFees = _previousbuyTotalFees;
        sellTotalFees = _previoussellTotalFees;
        buyLiquidityFee = _previousbuyLiquidityFee;
        sellLiquidityFee = _previoussellLiquidityFee;
        buyTreasuryFee = _previousbuyTreasuryFee;
        sellTreasuryFee = _previoussellTreasuryFee;
        buyMarketingFee = _previousbuyMarketingFee;
        sellMarketingFee = _previoussellMarketingFee;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setTaxFeePercent(uint256 taxFee) external onlyOwner {
        _taxFee = taxFee;
    }


    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        marketingAddress = payable(_marketingAddress);
    }

    function setTreasuryAddress(address _treasuryAddress) external onlyOwner {
        treasuryAddress = payable(_treasuryAddress);
    }


    function isRemovedSniper(address account) public view returns (bool) {
        return _isSniper[account];
    }

    function _removeSniper(address account) external onlyOwner {
        require(
            account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,
            'We can not blacklist Uniswap'
        );
        require(!_isSniper[account], 'Account is already blacklisted');
        _isSniper[account] = true;
        _confirmedSnipers.push(account);
    }

    function _amnestySniper(address account) external onlyOwner {
        require(_isSniper[account], 'Account is not blacklisted');
        for (uint256 i = 0; i < _confirmedSnipers.length; i++) {
            if (_confirmedSnipers[i] == account) {
                _confirmedSnipers[i] = _confirmedSnipers[_confirmedSnipers.length - 1];
                _isSniper[account] = false;
                _confirmedSnipers.pop();
                break;
            }
        }
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    // Withdraw ETH that gets stuck in contract by accident
    function emergencyWithdraw() external onlyOwner {
        payable(owner()).send(address(this).balance);
    }
}

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":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_amnestySniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","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":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRemovedSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFees","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFees","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600180546001600160a01b0319908116738ba347fdec5dd67e4ae8d17267e50483a3355f94179091556002805490911673449c5516cbc556071da417f072cc58d3d0f4651a1790556ddead000000000000000000000000608052670de0b6b3a7640000600b8190556200007a90600019620003d8565b620000889060001962000381565b600c5560408051808201909152600680825265476f7468616d60d01b6020909201918252620000ba91600e9162000287565b5060408051808201909152600680825265476f7468616d60d01b6020909201918252620000ea91600f9162000287565b506010805460ff1990811660091790915560056024819055602555602880549091166001179055602c805460ff60a81b191690553480156200012b57600080fd5b50620001373362000237565b600c5433600090815260036020526040902055600b546103e8906200015e9060056200035f565b6200016a919062000348565b602955600b546103e8906200018190600a6200035f565b6200018d919062000348565b602a556002601281905560046013819055600160148190556005828280620001b683886200032d565b620001c291906200032d565b601155601a839055601b829055601c81905580620001e183856200032d565b620001ed91906200032d565b601955600b5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050506200041b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000295906200039b565b90600052602060002090601f016020900481019282620002b9576000855562000304565b82601f10620002d457805160ff191683800117855562000304565b8280016001018555821562000304579182015b8281111562000304578251825591602001919060010190620002e7565b506200031292915062000316565b5090565b5b8082111562000312576000815560010162000317565b60008219821115620003435762000343620003ef565b500190565b6000826200035a576200035a62000405565b500490565b60008160001904831182151516156200037c576200037c620003ef565b500290565b600082821015620003965762000396620003ef565b500390565b600181811c90821680620003b057607f821691505b60208210811415620003d257634e487b7160e01b600052602260045260246000fd5b50919050565b600082620003ea57620003ea62000405565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c61383b6200043a6000396000610568015261383b6000f3fe60806040526004361061039b5760003560e01c806370a08231116101dc578063c17b5b8c11610102578063db2e21bc116100a0578063f2fde38b1161006f578063f2fde38b14610a8f578063f375b25314610aaf578063f637434214610acf578063f8b45b0514610ae557600080fd5b8063db2e21bc146109fe578063dd62ed3e14610a13578063ea2f0b3714610a59578063f11a24d314610a7957600080fd5b8063c8c8ebe4116100dc578063c8c8ebe4146109a7578063c9567bf9146109bd578063cc2ffe7c146109d2578063d85ba063146109e857600080fd5b8063c17b5b8c14610947578063c18bc19514610967578063c5f956af1461098757600080fd5b806388f820201161017a57806395d89b411161014957806395d89b41146108d2578063a457c2d7146108e7578063a5ece94114610907578063a9059cbb1461092757600080fd5b806388f82020146108455780638da5cb5b1461087e578063906e9dd01461089c57806392136913146108bc57600080fd5b80637571336a116101b65780637571336a146107da5780637bce5a04146107fa5780638095d564146108105780638203f5fe1461083057600080fd5b806370a0823114610790578063715018a6146107b0578063751039fc146107c557600080fd5b8063313ce567116102c15780634a62bb651161025f578063610d5b191161022e578063610d5b191461070b5780636605bfda146107445780636a486a8e146107645780636b2fb1241461077a57600080fd5b80634a62bb651461068257806352390c021461069c5780635342acb4146106bc5780635c068a8c146106f557600080fd5b8063395093511161029b578063395093511461060c5780633b124fe71461062c578063437823ec1461064257806349bd5a5e1461066257600080fd5b8063313ce567146105aa578063362a3c5d146105cc5780633685d419146105ec57600080fd5b80631694505e11610339578063203e727e11610308578063203e727e1461051657806323b872dd1461053657806327c8f835146105565780632d8381191461058a57600080fd5b80631694505e1461049d57806318160ddd146104d55780631a8145bb146104ea5780631f3fed8f1461050057600080fd5b8063095ea7b311610375578063095ea7b3146104095780631031e36e1461043957806310d5de531461044e57806313114a9d1461047e57600080fd5b8063061c82d0146103a75780630694db1e146103c957806306fdde03146103de57600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103c76103c2366004613531565b610afb565b005b3480156103d557600080fd5b506103c7610b33565b3480156103ea57600080fd5b506103f3610b72565b60405161040091906135e4565b60405180910390f35b34801561041557600080fd5b50610429610424366004613506565b610c04565b6040519015158152602001610400565b34801561044557600080fd5b506103c7610c1b565b34801561045a57600080fd5b50610429610469366004613425565b60276020526000908152604090205460ff1681565b34801561048a57600080fd5b50600d545b604051908152602001610400565b3480156104a957600080fd5b50602b546104bd906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156104e157600080fd5b50600b5461048f565b3480156104f657600080fd5b5061048f60225481565b34801561050c57600080fd5b5061048f60215481565b34801561052257600080fd5b506103c7610531366004613531565b610c54565b34801561054257600080fd5b50610429610551366004613495565b610d29565b34801561056257600080fd5b506104bd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059657600080fd5b5061048f6105a5366004613531565b610d92565b3480156105b657600080fd5b5060105460405160ff9091168152602001610400565b3480156105d857600080fd5b506103c76105e7366004613425565b610e16565b3480156105f857600080fd5b506103c7610607366004613425565b610ffc565b34801561061857600080fd5b50610429610627366004613506565b6111c1565b34801561063857600080fd5b5061048f60245481565b34801561064e57600080fd5b506103c761065d366004613425565b6111f7565b34801561066e57600080fd5b50602c546104bd906001600160a01b031681565b34801561068e57600080fd5b506028546104299060ff1681565b3480156106a857600080fd5b506103c76106b7366004613425565b611245565b3480156106c857600080fd5b506104296106d7366004613425565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561070157600080fd5b5061048f60145481565b34801561071757600080fd5b50610429610726366004613425565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561075057600080fd5b506103c761075f366004613425565b611398565b34801561077057600080fd5b5061048f60195481565b34801561078657600080fd5b5061048f601c5481565b34801561079c57600080fd5b5061048f6107ab366004613425565b6113e4565b3480156107bc57600080fd5b506103c7611443565b3480156107d157600080fd5b50610429611479565b3480156107e657600080fd5b506103c76107f53660046134d5565b6114b4565b34801561080657600080fd5b5061048f60125481565b34801561081c57600080fd5b506103c761082b366004613549565b611509565b34801561083c57600080fd5b506103c761155f565b34801561085157600080fd5b50610429610860366004613425565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561088a57600080fd5b506000546001600160a01b03166104bd565b3480156108a857600080fd5b506103c76108b7366004613425565b611779565b3480156108c857600080fd5b5061048f601a5481565b3480156108de57600080fd5b506103f36117c5565b3480156108f357600080fd5b50610429610902366004613506565b6117d4565b34801561091357600080fd5b506001546104bd906001600160a01b031681565b34801561093357600080fd5b50610429610942366004613506565b611823565b34801561095357600080fd5b506103c7610962366004613549565b611830565b34801561097357600080fd5b506103c7610982366004613531565b611886565b34801561099357600080fd5b506002546104bd906001600160a01b031681565b3480156109b357600080fd5b5061048f60295481565b3480156109c957600080fd5b506103c761194f565b3480156109de57600080fd5b5061048f60235481565b3480156109f457600080fd5b5061048f60115481565b348015610a0a57600080fd5b506103c7611998565b348015610a1f57600080fd5b5061048f610a2e36600461345d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a6557600080fd5b506103c7610a74366004613425565b6119ed565b348015610a8557600080fd5b5061048f60135481565b348015610a9b57600080fd5b506103c7610aaa366004613425565b611a38565b348015610abb57600080fd5b506103c7610aca366004613425565b611ad3565b348015610adb57600080fd5b5061048f601b5481565b348015610af157600080fd5b5061048f602a5481565b6000546001600160a01b03163314610b2e5760405162461bcd60e51b8152600401610b2590613637565b60405180910390fd5b602455565b6000546001600160a01b03163314610b5d5760405162461bcd60e51b8152600401610b2590613637565b602c805460ff60a81b1916600160a81b179055565b6060600e8054610b8190613737565b80601f0160208091040260200160405190810160405280929190818152602001828054610bad90613737565b8015610bfa5780601f10610bcf57610100808354040283529160200191610bfa565b820191906000526020600020905b815481529060010190602001808311610bdd57829003601f168201915b5050505050905090565b6000610c11338484611c39565b5060015b92915050565b6000546001600160a01b03163314610c455760405162461bcd60e51b8152600401610b2590613637565b602c805460ff60a81b19169055565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b8152600401610b2590613637565b633b9aca006103e8610c8f600b5490565b610c9a906001613701565b610ca491906136e1565b610cae91906136e1565b811015610d155760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b25565b610d2381633b9aca00613701565b60295550565b6000610d36848484611d5d565b610d888433610d83856040518060600160405280602881526020016137b9602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612641565b611c39565b5060019392505050565b6000600c54821115610df95760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b25565b6000610e0361266d565b9050610e0f8382612690565b9392505050565b6000546001600160a01b03163314610e405760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526006602052604090205460ff16610ea85760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610b25565b60005b600754811015610ff857816001600160a01b031660078281548110610ee057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610fe65760078054610f0b90600190613720565b81548110610f2957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600780546001600160a01b039092169183908110610f6357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600690915260409020805460ff191690556007805480610fc057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ff081613772565b915050610eab565b5050565b6000546001600160a01b031633146110265760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526009602052604090205460ff1661108e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b25565b60005b600a54811015610ff857816001600160a01b0316600a82815481106110c657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156111af57600a80546110f190600190613720565b8154811061110f57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600a80546001600160a01b03909216918390811061114957634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600990925220805460ff19169055600a805480610fc057634e487b7160e01b600052603160045260246000fd5b806111b981613772565b915050611091565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c11918590610d83908661269c565b6000546001600160a01b031633146112215760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526009602052604090205460ff16156112d85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b25565b6001600160a01b03811660009081526003602052604090205415611332576001600160a01b03811660009081526003602052604090205461131890610d92565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000546001600160a01b031633146113c25760405162461bcd60e51b8152600401610b2590613637565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205460ff161561142157506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c1590610d92565b6000546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610b2590613637565b61147760006126a8565b565b600080546001600160a01b031633146114a45760405162461bcd60e51b8152600401610b2590613637565b506028805460ff19169055600190565b6000546001600160a01b031633146114de5760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115335760405162461bcd60e51b8152600401610b2590613637565b6012839055601382905560148190558061154d83856136c9565b61155791906136c9565b601155505050565b6000546001600160a01b031633146115895760405162461bcd60e51b8152600401610b2590613637565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156115db57600080fd5b505afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116139190613441565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561165b57600080fd5b505afa15801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190613441565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190613441565b602c80546001600160a01b03199081166001600160a01b0393841617909155602b80549091169282169290921790915560008054909116815260086020526040808220805460ff1990811660019081179092553084529190922080549091169091179055565b6000546001600160a01b031633146117a35760405162461bcd60e51b8152600401610b2590613637565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600f8054610b8190613737565b6000610c113384610d83856040518060600160405280602581526020016137e1602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190612641565b6000610c11338484611d5d565b6000546001600160a01b0316331461185a5760405162461bcd60e51b8152600401610b2590613637565b601a839055601b829055601c8190558061187483856136c9565b61187e91906136c9565b601955505050565b6000546001600160a01b031633146118b05760405162461bcd60e51b8152600401610b2590613637565b633b9aca006103e86118c1600b5490565b6118cc906005613701565b6118d691906136e1565b6118e091906136e1565b81101561193b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b25565b61194981633b9aca00613701565b602a5550565b6000546001600160a01b031633146119795760405162461bcd60e51b8152600401610b2590613637565b602554602455602c805460ff60a81b1916600160a81b17905542602655565b6000546001600160a01b031633146119c25760405162461bcd60e51b8152600401610b2590613637565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f15050505050565b6000546001600160a01b03163314611a175760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b03163314611a625760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b25565b611ad0816126a8565b50565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610b2590613637565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415611b6a5760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610b25565b6001600160a01b03811660009081526006602052604090205460ff1615611bd35760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610b25565b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6001600160a01b038316611c9b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b25565b6001600160a01b038216611cfc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b25565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611dc15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b25565b6001600160a01b038216611e235760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b25565b60008111611e855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b25565b6001600160a01b03821660009081526006602052604090205460ff1615611ee85760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401610b25565b3360009081526006602052604090205460ff1615611f425760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401610b25565b602c546001600160a01b038481169116148015611f6d5750602b546001600160a01b03838116911614155b8015611f9257506001600160a01b03821660009081526008602052604090205460ff16155b1561206057602c54600160a81b900460ff16611ff05760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610b25565b602654421415612060576001600160a01b0382166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b60285460ff161561238c576000546001600160a01b0384811691161480159061209757506000546001600160a01b03838116911614155b80156120ab57506001600160a01b03821615155b80156120c257506001600160a01b03821661dead14155b1561238c57602c54600160a81b900460ff1661215c576001600160a01b03831660009081526008602052604090205460ff168061211757506001600160a01b03821660009081526008602052604090205460ff165b61215c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b25565b602c546001600160a01b03848116911614801561219257506001600160a01b03821660009081526027602052604090205460ff16155b15612266576029548111156122075760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b25565b602a54612213836113e4565b61221d90836136c9565b11156122615760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b25565b61238c565b602c546001600160a01b03838116911614801561229c57506001600160a01b03831660009081526027602052604090205460ff16155b15612312576029548111156122615760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b25565b6001600160a01b03821660009081526027602052604090205460ff1661238c57602a5461233e836113e4565b61234890836136c9565b111561238c5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b25565b6000612397306113e4565b602c54909150600160a01b900460ff161580156123bd5750602c54600160a81b900460ff165b80156123d65750602c546001600160a01b038481169116145b156123ea5780156123ea576123ea816126f8565b602c546000906001600160a01b03868116911614806124165750602c546001600160a01b038581169116145b801561245e57506001600160a01b03851660009081526008602052604090205460ff168061245c57506001600160a01b03841660009081526008602052604090205460ff165b155b15612467575060015b602c546000906001600160a01b0386811691161415612562578180156124965750602c54600160a81b900460ff165b1561254f576124bb60646124b56019548761293c90919063ffffffff16565b90612690565b9050601954601b54826124ce9190613701565b6124d891906136e1565b602260008282546124e991906136c9565b9091555050601954601c546124fe9083613701565b61250891906136e1565b6023600082825461251991906136c9565b9091555050601954601a5461252e9083613701565b61253891906136e1565b6021600082825461254991906136c9565b90915550505b61255d868686856001612948565b612639565b8180156125785750602c54600160a81b900460ff165b1561262b5761259760646124b56011548761293c90919063ffffffff16565b9050601154601354826125aa9190613701565b6125b491906136e1565b602260008282546125c591906136c9565b90915550506011546014546125da9083613701565b6125e491906136e1565b602360008282546125f591906136c9565b909155505060115460125461260a9083613701565b61261491906136e1565b6021600082825461262591906136c9565b90915550505b612639868686856000612948565b505050505050565b600081848411156126655760405162461bcd60e51b8152600401610b2591906135e4565b505050900390565b600080600061267a612afe565b90925090506126898282612690565b9250505090565b6000610e0f82846136e1565b6000610e0f82846136c9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602c805460ff60a01b1916600160a01b17905560235460215460225460009291612721916136c9565b61272b91906136c9565b9050600082158061273a575081155b1561274657505061292c565b612710612752600b5490565b61275d906005613701565b61276791906136e1565b612772906014613701565b8311156127a857612710612785600b5490565b612790906005613701565b61279a91906136e1565b6127a5906014613701565b92505b6000600283602254866127bb9190613701565b6127c591906136e1565b6127cf91906136e1565b905060006127dd8583612cb8565b9050476127e982612cc4565b60006127f54783612cb8565b90506000612812876124b56021548561293c90919063ffffffff16565b9050600061282f886124b56023548661293c90919063ffffffff16565b905060008161283e8486613720565b6128489190613720565b60006022819055602181905560238190556002546040519293506001600160a01b031691849181818185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b509098505086158015906128be5750600081115b156128cd576128cd8782612e82565b6001546040516001600160a01b03909116904790600081818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050505050505050505050505b50602c805460ff60a01b19169055565b6000610e0f8284613701565b816129b1576129b16011805460155560198054601d5560138054601755601b8054601f5560148054601855601c805460205560128054601655601a8054601e55602480546025556000908190559788905595879055938690559185905584905583905582905555565b6001600160a01b03851660009081526009602052604090205460ff1680156129f257506001600160a01b03841660009081526009602052604090205460ff16155b15612a0857612a0385858584612f5f565b612ab7565b6001600160a01b03851660009081526009602052604090205460ff16158015612a4957506001600160a01b03841660009081526009602052604090205460ff165b15612a5a57612a0385858584613099565b6001600160a01b03851660009081526009602052604090205460ff168015612a9a57506001600160a01b03841660009081526009602052604090205460ff165b15612aab57612a0385858584613155565b612ab7858585846131db565b81612af757612af7602554602455601554601155601d54601955601754601355601f54601b55601854601455602054601c55601654601255601e54601a55565b5050505050565b600c54600b546000918291825b600a54811015612c88578260036000600a8481548110612b3b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612bb457508160046000600a8481548110612b8d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612bca57600c54600b54945094505050509091565b612c1e60036000600a8481548110612bf257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612cb8565b9250612c7460046000600a8481548110612c4857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612cb8565b915080612c8081613772565b915050612b0b565b50600b54600c54612c9891612690565b821015612caf57600c54600b549350935050509091565b90939092509050565b6000610e0f8284613720565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d0757634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612d5b57600080fd5b505afa158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190613441565b81600181518110612db457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602b54612dda9130911684611c39565b602b5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e1390859060009086903090429060040161368d565b600060405180830381600087803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612e7692919061366c565b60405180910390a15050565b602b54612e9a9030906001600160a01b031684611c39565b602b546001600160a01b031663f305d719823085600080612ec36000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612af79190613574565b600080600080600080612f728888613232565b955095509550955095509550612fb688600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b038b16600090815260046020908152604080832093909355600390522054612fe59087612cb8565b6001600160a01b03808c1660009081526003602052604080822093909355908b1681522054613014908661269c565b6001600160a01b038a1660009081526003602052604090205561303681613285565b613040848361330e565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161308591815260200190565b60405180910390a350505050505050505050565b6000806000806000806130ac8888613232565b9550955095509550955095506130f086600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c16815260049091522054613126908461269c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613014908661269c565b6000806000806000806131688888613232565b9550955095509550955095506131ac88600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546130f09087612cb8565b6000806000806000806131ee8888613232565b955095509550955095509550612fe586600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b600080600080600080600080600061324a8b8b613332565b92509250925060008060006132688e868661326361266d565b613376565b919d509b5099509497509295509093505050509295509295509295565b600061328f61266d565b9050600061329d838361293c565b306000908152600360205260409020549091506132ba908261269c565b3060009081526003602090815260408083209390935560099052205460ff161561330957306000908152600460205260409020546132f8908461269c565b306000908152600460205260409020555b505050565b600c5461331b9083612cb8565b600c55600d5461332b908261269c565b600d555050565b600080600080613341866133c6565b9050600061334f87876133e2565b90506000613367826133618a86612cb8565b90612cb8565b95509193509150509250925092565b6000808080613385888661293c565b90506000613393888761293c565b905060006133a1888861293c565b905060006133b3826133618686612cb8565b939b939a50919850919650505050505050565b6000610c1560646124b56024548561293c90919063ffffffff16565b6000811561340b5761340460646124b56019548661293c90919063ffffffff16565b9050610c15565b61340460646124b56011548661293c90919063ffffffff16565b600060208284031215613436578081fd5b8135610e0f816137a3565b600060208284031215613452578081fd5b8151610e0f816137a3565b6000806040838503121561346f578081fd5b823561347a816137a3565b9150602083013561348a816137a3565b809150509250929050565b6000806000606084860312156134a9578081fd5b83356134b4816137a3565b925060208401356134c4816137a3565b929592945050506040919091013590565b600080604083850312156134e7578182fd5b82356134f2816137a3565b91506020830135801515811461348a578182fd5b60008060408385031215613518578182fd5b8235613523816137a3565b946020939093013593505050565b600060208284031215613542578081fd5b5035919050565b60008060006060848603121561355d578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215613588578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156135d95781516001600160a01b0316875295820195908201906001016135b4565b509495945050505050565b6000602080835283518082850152825b81811015613610578581018301518582016040015282016135f4565b818111156136215783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061368560408301846135a1565b949350505050565b85815284602082015260a0604082015260006136ac60a08301866135a1565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156136dc576136dc61378d565b500190565b6000826136fc57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561371b5761371b61378d565b500290565b6000828210156137325761373261378d565b500390565b600181811c9082168061374b57607f821691505b6020821081141561376c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137865761378661378d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611ad057600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c5d4426cecd083155325f9d5dbd60eb9dc23fd3f421b83c5b189efc7d3a5e28164736f6c63430008040033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806370a08231116101dc578063c17b5b8c11610102578063db2e21bc116100a0578063f2fde38b1161006f578063f2fde38b14610a8f578063f375b25314610aaf578063f637434214610acf578063f8b45b0514610ae557600080fd5b8063db2e21bc146109fe578063dd62ed3e14610a13578063ea2f0b3714610a59578063f11a24d314610a7957600080fd5b8063c8c8ebe4116100dc578063c8c8ebe4146109a7578063c9567bf9146109bd578063cc2ffe7c146109d2578063d85ba063146109e857600080fd5b8063c17b5b8c14610947578063c18bc19514610967578063c5f956af1461098757600080fd5b806388f820201161017a57806395d89b411161014957806395d89b41146108d2578063a457c2d7146108e7578063a5ece94114610907578063a9059cbb1461092757600080fd5b806388f82020146108455780638da5cb5b1461087e578063906e9dd01461089c57806392136913146108bc57600080fd5b80637571336a116101b65780637571336a146107da5780637bce5a04146107fa5780638095d564146108105780638203f5fe1461083057600080fd5b806370a0823114610790578063715018a6146107b0578063751039fc146107c557600080fd5b8063313ce567116102c15780634a62bb651161025f578063610d5b191161022e578063610d5b191461070b5780636605bfda146107445780636a486a8e146107645780636b2fb1241461077a57600080fd5b80634a62bb651461068257806352390c021461069c5780635342acb4146106bc5780635c068a8c146106f557600080fd5b8063395093511161029b578063395093511461060c5780633b124fe71461062c578063437823ec1461064257806349bd5a5e1461066257600080fd5b8063313ce567146105aa578063362a3c5d146105cc5780633685d419146105ec57600080fd5b80631694505e11610339578063203e727e11610308578063203e727e1461051657806323b872dd1461053657806327c8f835146105565780632d8381191461058a57600080fd5b80631694505e1461049d57806318160ddd146104d55780631a8145bb146104ea5780631f3fed8f1461050057600080fd5b8063095ea7b311610375578063095ea7b3146104095780631031e36e1461043957806310d5de531461044e57806313114a9d1461047e57600080fd5b8063061c82d0146103a75780630694db1e146103c957806306fdde03146103de57600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103c76103c2366004613531565b610afb565b005b3480156103d557600080fd5b506103c7610b33565b3480156103ea57600080fd5b506103f3610b72565b60405161040091906135e4565b60405180910390f35b34801561041557600080fd5b50610429610424366004613506565b610c04565b6040519015158152602001610400565b34801561044557600080fd5b506103c7610c1b565b34801561045a57600080fd5b50610429610469366004613425565b60276020526000908152604090205460ff1681565b34801561048a57600080fd5b50600d545b604051908152602001610400565b3480156104a957600080fd5b50602b546104bd906001600160a01b031681565b6040516001600160a01b039091168152602001610400565b3480156104e157600080fd5b50600b5461048f565b3480156104f657600080fd5b5061048f60225481565b34801561050c57600080fd5b5061048f60215481565b34801561052257600080fd5b506103c7610531366004613531565b610c54565b34801561054257600080fd5b50610429610551366004613495565b610d29565b34801561056257600080fd5b506104bd7f000000000000000000000000000000000000000000000000000000000000dead81565b34801561059657600080fd5b5061048f6105a5366004613531565b610d92565b3480156105b657600080fd5b5060105460405160ff9091168152602001610400565b3480156105d857600080fd5b506103c76105e7366004613425565b610e16565b3480156105f857600080fd5b506103c7610607366004613425565b610ffc565b34801561061857600080fd5b50610429610627366004613506565b6111c1565b34801561063857600080fd5b5061048f60245481565b34801561064e57600080fd5b506103c761065d366004613425565b6111f7565b34801561066e57600080fd5b50602c546104bd906001600160a01b031681565b34801561068e57600080fd5b506028546104299060ff1681565b3480156106a857600080fd5b506103c76106b7366004613425565b611245565b3480156106c857600080fd5b506104296106d7366004613425565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561070157600080fd5b5061048f60145481565b34801561071757600080fd5b50610429610726366004613425565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561075057600080fd5b506103c761075f366004613425565b611398565b34801561077057600080fd5b5061048f60195481565b34801561078657600080fd5b5061048f601c5481565b34801561079c57600080fd5b5061048f6107ab366004613425565b6113e4565b3480156107bc57600080fd5b506103c7611443565b3480156107d157600080fd5b50610429611479565b3480156107e657600080fd5b506103c76107f53660046134d5565b6114b4565b34801561080657600080fd5b5061048f60125481565b34801561081c57600080fd5b506103c761082b366004613549565b611509565b34801561083c57600080fd5b506103c761155f565b34801561085157600080fd5b50610429610860366004613425565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561088a57600080fd5b506000546001600160a01b03166104bd565b3480156108a857600080fd5b506103c76108b7366004613425565b611779565b3480156108c857600080fd5b5061048f601a5481565b3480156108de57600080fd5b506103f36117c5565b3480156108f357600080fd5b50610429610902366004613506565b6117d4565b34801561091357600080fd5b506001546104bd906001600160a01b031681565b34801561093357600080fd5b50610429610942366004613506565b611823565b34801561095357600080fd5b506103c7610962366004613549565b611830565b34801561097357600080fd5b506103c7610982366004613531565b611886565b34801561099357600080fd5b506002546104bd906001600160a01b031681565b3480156109b357600080fd5b5061048f60295481565b3480156109c957600080fd5b506103c761194f565b3480156109de57600080fd5b5061048f60235481565b3480156109f457600080fd5b5061048f60115481565b348015610a0a57600080fd5b506103c7611998565b348015610a1f57600080fd5b5061048f610a2e36600461345d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a6557600080fd5b506103c7610a74366004613425565b6119ed565b348015610a8557600080fd5b5061048f60135481565b348015610a9b57600080fd5b506103c7610aaa366004613425565b611a38565b348015610abb57600080fd5b506103c7610aca366004613425565b611ad3565b348015610adb57600080fd5b5061048f601b5481565b348015610af157600080fd5b5061048f602a5481565b6000546001600160a01b03163314610b2e5760405162461bcd60e51b8152600401610b2590613637565b60405180910390fd5b602455565b6000546001600160a01b03163314610b5d5760405162461bcd60e51b8152600401610b2590613637565b602c805460ff60a81b1916600160a81b179055565b6060600e8054610b8190613737565b80601f0160208091040260200160405190810160405280929190818152602001828054610bad90613737565b8015610bfa5780601f10610bcf57610100808354040283529160200191610bfa565b820191906000526020600020905b815481529060010190602001808311610bdd57829003601f168201915b5050505050905090565b6000610c11338484611c39565b5060015b92915050565b6000546001600160a01b03163314610c455760405162461bcd60e51b8152600401610b2590613637565b602c805460ff60a81b19169055565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b8152600401610b2590613637565b633b9aca006103e8610c8f600b5490565b610c9a906001613701565b610ca491906136e1565b610cae91906136e1565b811015610d155760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b25565b610d2381633b9aca00613701565b60295550565b6000610d36848484611d5d565b610d888433610d83856040518060600160405280602881526020016137b9602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612641565b611c39565b5060019392505050565b6000600c54821115610df95760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b25565b6000610e0361266d565b9050610e0f8382612690565b9392505050565b6000546001600160a01b03163314610e405760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526006602052604090205460ff16610ea85760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c69737465640000000000006044820152606401610b25565b60005b600754811015610ff857816001600160a01b031660078281548110610ee057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610fe65760078054610f0b90600190613720565b81548110610f2957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600780546001600160a01b039092169183908110610f6357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600690915260409020805460ff191690556007805480610fc057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610ff081613772565b915050610eab565b5050565b6000546001600160a01b031633146110265760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526009602052604090205460ff1661108e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b25565b60005b600a54811015610ff857816001600160a01b0316600a82815481106110c657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156111af57600a80546110f190600190613720565b8154811061110f57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600a80546001600160a01b03909216918390811061114957634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600990925220805460ff19169055600a805480610fc057634e487b7160e01b600052603160045260246000fd5b806111b981613772565b915050611091565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c11918590610d83908661269c565b6000546001600160a01b031633146112215760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03811660009081526009602052604090205460ff16156112d85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b25565b6001600160a01b03811660009081526003602052604090205415611332576001600160a01b03811660009081526003602052604090205461131890610d92565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000546001600160a01b031633146113c25760405162461bcd60e51b8152600401610b2590613637565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526009602052604081205460ff161561142157506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c1590610d92565b6000546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610b2590613637565b61147760006126a8565b565b600080546001600160a01b031633146114a45760405162461bcd60e51b8152600401610b2590613637565b506028805460ff19169055600190565b6000546001600160a01b031633146114de5760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115335760405162461bcd60e51b8152600401610b2590613637565b6012839055601382905560148190558061154d83856136c9565b61155791906136c9565b601155505050565b6000546001600160a01b031633146115895760405162461bcd60e51b8152600401610b2590613637565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156115db57600080fd5b505afa1580156115ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116139190613441565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561165b57600080fd5b505afa15801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190613441565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190613441565b602c80546001600160a01b03199081166001600160a01b0393841617909155602b80549091169282169290921790915560008054909116815260086020526040808220805460ff1990811660019081179092553084529190922080549091169091179055565b6000546001600160a01b031633146117a35760405162461bcd60e51b8152600401610b2590613637565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600f8054610b8190613737565b6000610c113384610d83856040518060600160405280602581526020016137e1602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190612641565b6000610c11338484611d5d565b6000546001600160a01b0316331461185a5760405162461bcd60e51b8152600401610b2590613637565b601a839055601b829055601c8190558061187483856136c9565b61187e91906136c9565b601955505050565b6000546001600160a01b031633146118b05760405162461bcd60e51b8152600401610b2590613637565b633b9aca006103e86118c1600b5490565b6118cc906005613701565b6118d691906136e1565b6118e091906136e1565b81101561193b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b25565b61194981633b9aca00613701565b602a5550565b6000546001600160a01b031633146119795760405162461bcd60e51b8152600401610b2590613637565b602554602455602c805460ff60a81b1916600160a81b17905542602655565b6000546001600160a01b031633146119c25760405162461bcd60e51b8152600401610b2590613637565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f15050505050565b6000546001600160a01b03163314611a175760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b03163314611a625760405162461bcd60e51b8152600401610b2590613637565b6001600160a01b038116611ac75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b25565b611ad0816126a8565b50565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610b2590613637565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415611b6a5760405162461bcd60e51b815260206004820152601c60248201527f57652063616e206e6f7420626c61636b6c69737420556e6973776170000000006044820152606401610b25565b6001600160a01b03811660009081526006602052604090205460ff1615611bd35760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c697374656400006044820152606401610b25565b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6001600160a01b038316611c9b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b25565b6001600160a01b038216611cfc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b25565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611dc15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b25565b6001600160a01b038216611e235760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b25565b60008111611e855760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b25565b6001600160a01b03821660009081526006602052604090205460ff1615611ee85760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401610b25565b3360009081526006602052604090205460ff1615611f425760405162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b6044820152606401610b25565b602c546001600160a01b038481169116148015611f6d5750602b546001600160a01b03838116911614155b8015611f9257506001600160a01b03821660009081526008602052604090205460ff16155b1561206057602c54600160a81b900460ff16611ff05760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610b25565b602654421415612060576001600160a01b0382166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b60285460ff161561238c576000546001600160a01b0384811691161480159061209757506000546001600160a01b03838116911614155b80156120ab57506001600160a01b03821615155b80156120c257506001600160a01b03821661dead14155b1561238c57602c54600160a81b900460ff1661215c576001600160a01b03831660009081526008602052604090205460ff168061211757506001600160a01b03821660009081526008602052604090205460ff165b61215c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b25565b602c546001600160a01b03848116911614801561219257506001600160a01b03821660009081526027602052604090205460ff16155b15612266576029548111156122075760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b25565b602a54612213836113e4565b61221d90836136c9565b11156122615760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b25565b61238c565b602c546001600160a01b03838116911614801561229c57506001600160a01b03831660009081526027602052604090205460ff16155b15612312576029548111156122615760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b25565b6001600160a01b03821660009081526027602052604090205460ff1661238c57602a5461233e836113e4565b61234890836136c9565b111561238c5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b25565b6000612397306113e4565b602c54909150600160a01b900460ff161580156123bd5750602c54600160a81b900460ff165b80156123d65750602c546001600160a01b038481169116145b156123ea5780156123ea576123ea816126f8565b602c546000906001600160a01b03868116911614806124165750602c546001600160a01b038581169116145b801561245e57506001600160a01b03851660009081526008602052604090205460ff168061245c57506001600160a01b03841660009081526008602052604090205460ff165b155b15612467575060015b602c546000906001600160a01b0386811691161415612562578180156124965750602c54600160a81b900460ff165b1561254f576124bb60646124b56019548761293c90919063ffffffff16565b90612690565b9050601954601b54826124ce9190613701565b6124d891906136e1565b602260008282546124e991906136c9565b9091555050601954601c546124fe9083613701565b61250891906136e1565b6023600082825461251991906136c9565b9091555050601954601a5461252e9083613701565b61253891906136e1565b6021600082825461254991906136c9565b90915550505b61255d868686856001612948565b612639565b8180156125785750602c54600160a81b900460ff165b1561262b5761259760646124b56011548761293c90919063ffffffff16565b9050601154601354826125aa9190613701565b6125b491906136e1565b602260008282546125c591906136c9565b90915550506011546014546125da9083613701565b6125e491906136e1565b602360008282546125f591906136c9565b909155505060115460125461260a9083613701565b61261491906136e1565b6021600082825461262591906136c9565b90915550505b612639868686856000612948565b505050505050565b600081848411156126655760405162461bcd60e51b8152600401610b2591906135e4565b505050900390565b600080600061267a612afe565b90925090506126898282612690565b9250505090565b6000610e0f82846136e1565b6000610e0f82846136c9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602c805460ff60a01b1916600160a01b17905560235460215460225460009291612721916136c9565b61272b91906136c9565b9050600082158061273a575081155b1561274657505061292c565b612710612752600b5490565b61275d906005613701565b61276791906136e1565b612772906014613701565b8311156127a857612710612785600b5490565b612790906005613701565b61279a91906136e1565b6127a5906014613701565b92505b6000600283602254866127bb9190613701565b6127c591906136e1565b6127cf91906136e1565b905060006127dd8583612cb8565b9050476127e982612cc4565b60006127f54783612cb8565b90506000612812876124b56021548561293c90919063ffffffff16565b9050600061282f886124b56023548661293c90919063ffffffff16565b905060008161283e8486613720565b6128489190613720565b60006022819055602181905560238190556002546040519293506001600160a01b031691849181818185875af1925050503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b509098505086158015906128be5750600081115b156128cd576128cd8782612e82565b6001546040516001600160a01b03909116904790600081818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050505050505050505050505b50602c805460ff60a01b19169055565b6000610e0f8284613701565b816129b1576129b16011805460155560198054601d5560138054601755601b8054601f5560148054601855601c805460205560128054601655601a8054601e55602480546025556000908190559788905595879055938690559185905584905583905582905555565b6001600160a01b03851660009081526009602052604090205460ff1680156129f257506001600160a01b03841660009081526009602052604090205460ff16155b15612a0857612a0385858584612f5f565b612ab7565b6001600160a01b03851660009081526009602052604090205460ff16158015612a4957506001600160a01b03841660009081526009602052604090205460ff165b15612a5a57612a0385858584613099565b6001600160a01b03851660009081526009602052604090205460ff168015612a9a57506001600160a01b03841660009081526009602052604090205460ff165b15612aab57612a0385858584613155565b612ab7858585846131db565b81612af757612af7602554602455601554601155601d54601955601754601355601f54601b55601854601455602054601c55601654601255601e54601a55565b5050505050565b600c54600b546000918291825b600a54811015612c88578260036000600a8481548110612b3b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612bb457508160046000600a8481548110612b8d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612bca57600c54600b54945094505050509091565b612c1e60036000600a8481548110612bf257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612cb8565b9250612c7460046000600a8481548110612c4857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612cb8565b915080612c8081613772565b915050612b0b565b50600b54600c54612c9891612690565b821015612caf57600c54600b549350935050509091565b90939092509050565b6000610e0f8284613720565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d0757634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612d5b57600080fd5b505afa158015612d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d939190613441565b81600181518110612db457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602b54612dda9130911684611c39565b602b5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e1390859060009086903090429060040161368d565b600060405180830381600087803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612e7692919061366c565b60405180910390a15050565b602b54612e9a9030906001600160a01b031684611c39565b602b546001600160a01b031663f305d719823085600080612ec36000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612af79190613574565b600080600080600080612f728888613232565b955095509550955095509550612fb688600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b038b16600090815260046020908152604080832093909355600390522054612fe59087612cb8565b6001600160a01b03808c1660009081526003602052604080822093909355908b1681522054613014908661269c565b6001600160a01b038a1660009081526003602052604090205561303681613285565b613040848361330e565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161308591815260200190565b60405180910390a350505050505050505050565b6000806000806000806130ac8888613232565b9550955095509550955095506130f086600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b03808c16600090815260036020908152604080832094909455918c16815260049091522054613126908461269c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613014908661269c565b6000806000806000806131688888613232565b9550955095509550955095506131ac88600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b6001600160a01b038b166000908152600460209081526040808320939093556003905220546130f09087612cb8565b6000806000806000806131ee8888613232565b955095509550955095509550612fe586600360008d6001600160a01b03166001600160a01b0316815260200190815260200160002054612cb890919063ffffffff16565b600080600080600080600080600061324a8b8b613332565b92509250925060008060006132688e868661326361266d565b613376565b919d509b5099509497509295509093505050509295509295509295565b600061328f61266d565b9050600061329d838361293c565b306000908152600360205260409020549091506132ba908261269c565b3060009081526003602090815260408083209390935560099052205460ff161561330957306000908152600460205260409020546132f8908461269c565b306000908152600460205260409020555b505050565b600c5461331b9083612cb8565b600c55600d5461332b908261269c565b600d555050565b600080600080613341866133c6565b9050600061334f87876133e2565b90506000613367826133618a86612cb8565b90612cb8565b95509193509150509250925092565b6000808080613385888661293c565b90506000613393888761293c565b905060006133a1888861293c565b905060006133b3826133618686612cb8565b939b939a50919850919650505050505050565b6000610c1560646124b56024548561293c90919063ffffffff16565b6000811561340b5761340460646124b56019548661293c90919063ffffffff16565b9050610c15565b61340460646124b56011548661293c90919063ffffffff16565b600060208284031215613436578081fd5b8135610e0f816137a3565b600060208284031215613452578081fd5b8151610e0f816137a3565b6000806040838503121561346f578081fd5b823561347a816137a3565b9150602083013561348a816137a3565b809150509250929050565b6000806000606084860312156134a9578081fd5b83356134b4816137a3565b925060208401356134c4816137a3565b929592945050506040919091013590565b600080604083850312156134e7578182fd5b82356134f2816137a3565b91506020830135801515811461348a578182fd5b60008060408385031215613518578182fd5b8235613523816137a3565b946020939093013593505050565b600060208284031215613542578081fd5b5035919050565b60008060006060848603121561355d578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215613588578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156135d95781516001600160a01b0316875295820195908201906001016135b4565b509495945050505050565b6000602080835283518082850152825b81811015613610578581018301518582016040015282016135f4565b818111156136215783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061368560408301846135a1565b949350505050565b85815284602082015260a0604082015260006136ac60a08301866135a1565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156136dc576136dc61378d565b500190565b6000826136fc57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561371b5761371b61378d565b500290565b6000828210156137325761373261378d565b500390565b600181811c9082168061374b57607f821691505b6020821081141561376c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137865761378661378d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611ad057600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c5d4426cecd083155325f9d5dbd60eb9dc23fd3f421b83c5b189efc7d3a5e28164736f6c63430008040033

Deployed Bytecode Sourcemap

28633:26745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53735:96;;;;;;;;;;-1:-1:-1;53735:96:0;;;;;:::i;:::-;;:::i;:::-;;34603:81;;;;;;;;;;;;;:::i;34692:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35702:218;;;;;;;;;;-1:-1:-1;35702:218:0;;;;;:::i;:::-;;:::i;:::-;;;5230:14:1;;5223:22;5205:41;;5193:2;5178:18;35702:218:0;5160:92:1;34514:81:0;;;;;;;;;;;;;:::i;30719:64::-;;;;;;;;;;-1:-1:-1;30719:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37271:87;;;;;;;;;;-1:-1:-1;37340:10:0;;37271:87;;;13950:25:1;;;13938:2;13923:18;37271:87:0;13905:76:1;30913:41:0;;;;;;;;;;-1:-1:-1;30913:41:0;;;;-1:-1:-1;;;;;30913:41:0;;;;;;-1:-1:-1;;;;;3876:32:1;;;3858:51;;3846:2;3831:18;30913:41:0;3813:102:1;34969:95:0;;;;;;;;;;-1:-1:-1;35049:7:0;;34969:95;;30530:33;;;;;;;;;;;;;;;;30490;;;;;;;;;;;;;;;;32433:232;;;;;;;;;;-1:-1:-1;32433:232:0;;;;;:::i;:::-;;:::i;35928:478::-;;;;;;;;;;-1:-1:-1;35928:478:0;;;;;:::i;:::-;;:::i;29008:86::-;;;;;;;;;;;;;;;37366:253;;;;;;;;;;-1:-1:-1;37366:253:0;;;;;:::i;:::-;;:::i;34878:83::-;;;;;;;;;;-1:-1:-1;34944:9:0;;34878:83;;34944:9;;;;15052:36:1;;15040:2;15025:18;34878:83:0;15007:87:1;54622:480:0;;;;;;;;;;-1:-1:-1;54622:480:0;;;;;:::i;:::-;;:::i;37967:477::-;;;;;;;;;;-1:-1:-1;37967:477:0;;;;;:::i;:::-;;:::i;36414:325::-;;;;;;;;;;-1:-1:-1;36414:325:0;;;;;:::i;:::-;;:::i;30611:26::-;;;;;;;;;;;;;;;;53498:111;;;;;;;;;;-1:-1:-1;53498:111:0;;;;;:::i;:::-;;:::i;30961:28::-;;;;;;;;;;-1:-1:-1;30961:28:0;;;;-1:-1:-1;;;;;30961:28:0;;;30790:33;;;;;;;;;;-1:-1:-1;30790:33:0;;;;;;;;37627:332;;;;;;;;;;-1:-1:-1;37627:332:0;;;;;:::i;:::-;;:::i;53366:124::-;;;;;;;;;;-1:-1:-1;53366:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;53455:27:0;53431:4;53455:27;;;:18;:27;;;;;;;;;53366:124;29930:29;;;;;;;;;;;;;;;;54133:113;;;;;;;;;;-1:-1:-1;54133:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;54220:18:0;54196:4;54220:18;;;:9;:18;;;;;;;;;54133:113;53988:135;;;;;;;;;;-1:-1:-1;53988:135:0;;;;;:::i;:::-;;:::i;30152:28::-;;;;;;;;;;;;;;;;30263:30;;;;;;;;;;;;;;;;35072:198;;;;;;;;;;-1:-1:-1;35072:198:0;;;;;:::i;:::-;;:::i;12070:94::-;;;;;;;;;;;;;:::i;32305:120::-;;;;;;;;;;;;;:::i;33564:144::-;;;;;;;;;;-1:-1:-1;33564:144:0;;;;;:::i;:::-;;:::i;29856:30::-;;;;;;;;;;;;;;;;32673:320;;;;;;;;;;-1:-1:-1;32673:320:0;;;;;:::i;:::-;;:::i;33718:626::-;;;;;;;;;;;;;:::i;37143:120::-;;;;;;;;;;-1:-1:-1;37143:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;37235:20:0;37211:4;37235:20;;;:11;:20;;;;;;;;;37143:120;11419:87;;;;;;;;;;-1:-1:-1;11465:7:0;11492:6;-1:-1:-1;;;;;11492:6:0;11419:87;;53841:139;;;;;;;;;;-1:-1:-1;53841:139:0;;;;;:::i;:::-;;:::i;30187:31::-;;;;;;;;;;;;;;;;34783:87;;;;;;;;;;;;;:::i;36747:388::-;;;;;;;;;;-1:-1:-1;36747:388:0;;;;;:::i;:::-;;:::i;28751:98::-;;;;;;;;;;-1:-1:-1;28751:98:0;;;;-1:-1:-1;;;;;28751:98:0;;;35278:199;;;;;;;;;;-1:-1:-1;35278:199:0;;;;;:::i;:::-;;:::i;33005:328::-;;;;;;;;;;-1:-1:-1;33005:328:0;;;;;:::i;:::-;;:::i;33343:213::-;;;;;;;;;;-1:-1:-1;33343:213:0;;;;;:::i;:::-;;:::i;28877:97::-;;;;;;;;;;-1:-1:-1;28877:97:0;;;;-1:-1:-1;;;;;28877:97:0;;;30834:35;;;;;;;;;;;;;;;;34352:154;;;;;;;;;;;;;:::i;30570:32::-;;;;;;;;;;;;;;;;29822:27;;;;;;;;;;;;;;;;55264:111;;;;;;;;;;;;;:::i;35485:209::-;;;;;;;;;;-1:-1:-1;35485:209:0;;;;;:::i;:::-;-1:-1:-1;;;;;35659:18:0;;;35627:7;35659:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35485:209;53617:110;;;;;;;;;;-1:-1:-1;53617:110:0;;;;;:::i;:::-;;:::i;29893:30::-;;;;;;;;;;;;;;;;12319:192;;;;;;;;;;-1:-1:-1;12319:192:0;;;;;:::i;:::-;;:::i;54254:360::-;;;;;;;;;;-1:-1:-1;54254:360:0;;;;;:::i;:::-;;:::i;30225:31::-;;;;;;;;;;;;;;;;30876:24;;;;;;;;;;;;;;;;53735:96;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;;;;;;;;;53807:7:::1;:16:::0;53735:96::o;34603:81::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;34658:11:::1;:18:::0;;-1:-1:-1;;;;34658:18:0::1;-1:-1:-1::0;;;34658:18:0::1;::::0;;34603:81::o;34692:83::-;34729:13;34762:5;34755:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34692:83;:::o;35702:218::-;35829:4;35851:39;10348:10;35874:7;35883:6;35851:8;:39::i;:::-;-1:-1:-1;35908:4:0;35702:218;;;;;:::o;34514:81::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;34568:11:::1;:19:::0;;-1:-1:-1;;;;34568:19:0::1;::::0;;34514:81::o;32433:232::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;32552:3:::1;32546:4;32526:13;35049:7:::0;;;34969:95;32526:13:::1;:17;::::0;32542:1:::1;32526:17;:::i;:::-;:24;;;;:::i;:::-;32525:30;;;;:::i;:::-;32515:6;:40;;32507:100;;;::::0;-1:-1:-1;;;32507:100:0;;13590:2:1;32507:100:0::1;::::0;::::1;13572:21:1::0;13629:2;13609:18;;;13602:30;13668:34;13648:18;;;13641:62;-1:-1:-1;;;13719:18:1;;;13712:45;13774:19;;32507:100:0::1;13562:237:1::0;32507:100:0::1;32641:16;:6:::0;32651:5:::1;32641:16;:::i;:::-;32618:20;:39:::0;-1:-1:-1;32433:232:0:o;35928:478::-;36087:4;36109:36;36119:6;36127:9;36138:6;36109:9;:36::i;:::-;36156:220;36179:6;10348:10;36227:138;36283:6;36227:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36227:19:0;;;;;;:11;:19;;;;;;;;10348:10;36227:33;;;;;;;;;;:37;:138::i;:::-;36156:8;:220::i;:::-;-1:-1:-1;36394:4:0;35928:478;;;;;:::o;37366:253::-;37433:7;37472;;37461;:18;;37453:73;;;;-1:-1:-1;;;37453:73:0;;6706:2:1;37453:73:0;;;6688:21:1;6745:2;6725:18;;;6718:30;6784:34;6764:18;;;6757:62;-1:-1:-1;;;6835:18:1;;;6828:40;6885:19;;37453:73:0;6678:232:1;37453:73:0;37537:19;37559:10;:8;:10::i;:::-;37537:32;-1:-1:-1;37587:24:0;:7;37537:32;37587:11;:24::i;:::-;37580:31;37366:253;-1:-1:-1;;;37366:253:0:o;54622:480::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54701:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;54693:57;;;::::0;-1:-1:-1;;;54693:57:0;;11014:2:1;54693:57:0::1;::::0;::::1;10996:21:1::0;11053:2;11033:18;;;11026:30;11092:28;11072:18;;;11065:56;11138:18;;54693:57:0::1;10986:176:1::0;54693:57:0::1;54766:9;54761:334;54785:17;:24:::0;54781:28;::::1;54761:334;;;54859:7;-1:-1:-1::0;;;;;54835:31:0::1;:17;54853:1;54835:20;;;;;;-1:-1:-1::0;;;54835:20:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;54835:20:0::1;:31;54831:253;;;54910:17;54928:24:::0;;:28:::1;::::0;54955:1:::1;::::0;54928:28:::1;:::i;:::-;54910:47;;;;;;-1:-1:-1::0;;;54910:47:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;54887:17:::1;:20:::0;;-1:-1:-1;;;;;54910:47:0;;::::1;::::0;54905:1;;54887:20;::::1;;;-1:-1:-1::0;;;54887:20:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:70:::0;;-1:-1:-1;;;;;;54887:70:0::1;-1:-1:-1::0;;;;;54887:70:0;;::::1;;::::0;;54976:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:26;;-1:-1:-1;;54976:26:0::1;::::0;;55021:17:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;55021:23:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;55021:23:0;;;;;-1:-1:-1;;;;;;55021:23:0::1;::::0;;;;;54761:334:::1;54622:480:::0;:::o;54831:253::-:1;54811:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54761:334;;;;54622:480:::0;:::o;37967:477::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38047:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;38039:60;;;::::0;-1:-1:-1;;;38039:60:0;;8683:2:1;38039:60:0::1;::::0;::::1;8665:21:1::0;8722:2;8702:18;;;8695:30;8761:29;8741:18;;;8734:57;8808:18;;38039:60:0::1;8655:177:1::0;38039:60:0::1;38115:9;38110:327;38134:9;:16:::0;38130:20;::::1;38110:327;;;38192:7;-1:-1:-1::0;;;;;38176:23:0::1;:9;38186:1;38176:12;;;;;;-1:-1:-1::0;;;38176:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38176:12:0::1;:23;38172:254;;;38235:9;38245:16:::0;;:20:::1;::::0;38264:1:::1;::::0;38245:20:::1;:::i;:::-;38235:31;;;;;;-1:-1:-1::0;;;38235:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;38220:9:::1;:12:::0;;-1:-1:-1;;;;;38235:31:0;;::::1;::::0;38230:1;;38220:12;::::1;;;-1:-1:-1::0;;;38220:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;38220:46:0::1;-1:-1:-1::0;;;;;38220:46:0;;::::1;;::::0;;38285:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;38324:11:::1;:20:::0;;;;:28;;-1:-1:-1;;38324:28:0::1;::::0;;38371:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;38371:15:0::1;;;;;;;;38172:254;38152:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38110:327;;36414:325:::0;10348:10;36554:4;36648:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36648:34:0;;;;;;;;;;36554:4;;36576:133;;36626:7;;36648:50;;36687:10;36648:38;:50::i;53498:111::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53567:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;53567:34:0::1;53597:4;53567:34;::::0;;53498:111::o;37627:332::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37708:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37707:21;37699:61;;;::::0;-1:-1:-1;;;37699:61:0;;8683:2:1;37699:61:0::1;::::0;::::1;8665:21:1::0;8722:2;8702:18;;;8695:30;8761:29;8741:18;;;8734:57;8808:18;;37699:61:0::1;8655:177:1::0;37699:61:0::1;-1:-1:-1::0;;;;;37775:16:0;::::1;37794:1;37775:16:::0;;;:7:::1;:16;::::0;;;;;:20;37771:109:::1;;-1:-1:-1::0;;;;;37851:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;37831:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;37812:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;37771:109:::1;-1:-1:-1::0;;;;;37890:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;37890:27:0::1;37913:4;37890:27:::0;;::::1;::::0;;;37928:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37928:23:0::1;::::0;;::::1;::::0;;37627:332::o;53988:135::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;54072:15:::1;:43:::0;;-1:-1:-1;;;;;;54072:43:0::1;-1:-1:-1::0;;;;;54072:43:0;;;::::1;::::0;;;::::1;::::0;;53988:135::o;35072:198::-;-1:-1:-1;;;;;35162:20:0;;35138:7;35162:20;;;:11;:20;;;;;;;;35158:49;;;-1:-1:-1;;;;;;35191:16:0;;;;;:7;:16;;;;;;;35072:198::o;35158:49::-;-1:-1:-1;;;;;35245:16:0;;;;;;:7;:16;;;;;;35225:37;;:19;:37::i;12070:94::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;12135:21:::1;12153:1;12135:9;:21::i;:::-;12070:94::o:0;32305:120::-;32357:4;11492:6;;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;32373:14:0::1;:22:::0;;-1:-1:-1;;32373:22:0::1;::::0;;;32305:120;:::o;33564:144::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33654:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;33654:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33564:144::o;32673:320::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;32795:15:::1;:31:::0;;;32837:15:::1;:32:::0;;;32880:14:::1;:29:::0;;;32897:12;32935:33:::1;32855:14:::0;32813:13;32935:33:::1;:::i;:::-;:50;;;;:::i;:::-;32920:12;:65:::0;-1:-1:-1;;;32673:320:0:o;33718:626::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;33907:35:::1;33978:42;33907:124;;34076:16;-1:-1:-1::0;;;;;34076:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34058:56:0::1;;34137:4;34157:16;-1:-1:-1::0;;;;;34157:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34058:133;::::0;-1:-1:-1;;;;;;34058:133:0::1;::::0;;;;;;-1:-1:-1;;;;;4374:15:1;;;34058:133:0::1;::::0;::::1;4356:34:1::0;4426:15;;4406:18;;;4399:43;4291:18;;34058:133:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34042:13;:149:::0;;-1:-1:-1;;;;;;34042:149:0;;::::1;-1:-1:-1::0;;;;;34042:149:0;;::::1;;::::0;;;34204:15:::1;:34:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;11492:6:0;;;;;34251:27;;:18:::1;:27;::::0;;;;;:34;;-1:-1:-1;;34251:34:0;;::::1;-1:-1:-1::0;34251:34:0;;::::1;::::0;;;34323:4:::1;34296:33:::0;;;;;;:40;;;;::::1;::::0;;::::1;::::0;;33718:626::o;53841:139::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;53927:16:::1;:45:::0;;-1:-1:-1;;;;;;53927:45:0::1;-1:-1:-1::0;;;;;53927:45:0;;;::::1;::::0;;;::::1;::::0;;53841:139::o;34783:87::-;34822:13;34855:7;34848:14;;;;;:::i;36747:388::-;36855:4;36877:228;10348:10;36927:7;36949:145;37006:15;36949:145;;;;;;;;;;;;;;;;;10348:10;36949:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36949:34:0;;;;;;;;;;;;:38;:145::i;35278:199::-;35383:4;35405:42;10348:10;35429:9;35440:6;35405:9;:42::i;33005:328::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;33128:16:::1;:32:::0;;;33171:16:::1;:33:::0;;;33215:15:::1;:30:::0;;;33233:12;33272:35:::1;33190:14:::0;33147:13;33272:35:::1;:::i;:::-;:53;;;;:::i;:::-;33256:13;:69:::0;-1:-1:-1;;;33005:328:0:o;33343:213::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;33465:3:::1;33459:4;33439:13;35049:7:::0;;;34969:95;33439:13:::1;:17;::::0;33455:1:::1;33439:17;:::i;:::-;:24;;;;:::i;:::-;33438:30;;;;:::i;:::-;33428:6;:40;;33420:89;;;::::0;-1:-1:-1;;;33420:89:0;;8278:2:1;33420:89:0::1;::::0;::::1;8260:21:1::0;8317:2;8297:18;;;8290:30;8356:34;8336:18;;;8329:62;-1:-1:-1;;;8407:18:1;;;8400:34;8451:19;;33420:89:0::1;8250:226:1::0;33420:89:0::1;33532:16;:6:::0;33542:5:::1;33532:16;:::i;:::-;33520:9;:28:::0;-1:-1:-1;33343:213:0:o;34352:154::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;34415:15:::1;::::0;34405:7:::1;:25:::0;34441:11:::1;:18:::0;;-1:-1:-1;;;;34441:18:0::1;-1:-1:-1::0;;;34441:18:0::1;::::0;;34483:15:::1;34470:10;:28:::0;34352:154::o;55264:111::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;11465:7;11492:6;;55323:44:::1;::::0;-1:-1:-1;;;;;11492:6:0;;;;55345:21:::1;55323:44:::0;::::1;;;::::0;55345:21;;55323:44;11465:7;55323:44;55345:21;11492:6;55323:44;::::1;-1:-1:-1::0;;;;;55264:111:0:o;53617:110::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53684:27:0::1;53714:5;53684:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;53684:35:0::1;::::0;;53617:110::o;12319:192::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12408:22:0;::::1;12400:73;;;::::0;-1:-1:-1;;;12400:73:0;;7468:2:1;12400:73:0::1;::::0;::::1;7450:21:1::0;7507:2;7487:18;;;7480:30;7546:34;7526:18;;;7519:62;-1:-1:-1;;;7597:18:1;;;7590:36;7643:19;;12400:73:0::1;7440:228:1::0;12400:73:0::1;12484:19;12494:8;12484:9;:19::i;:::-;12319:192:::0;:::o;54254:360::-;11465:7;11492:6;-1:-1:-1;;;;;11492:6:0;10348:10;11639:23;11631:68;;;;-1:-1:-1;;;11631:68:0;;;;;;;:::i;:::-;54357:42:::1;-1:-1:-1::0;;;;;54346:53:0;::::1;;;54324:131;;;::::0;-1:-1:-1;;;54324:131:0;;11369:2:1;54324:131:0::1;::::0;::::1;11351:21:1::0;11408:2;11388:18;;;11381:30;11447;11427:18;;;11420:58;11495:18;;54324:131:0::1;11341:178:1::0;54324:131:0::1;-1:-1:-1::0;;;;;54475:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;54474:19;54466:62;;;::::0;-1:-1:-1;;;54466:62:0;;9462:2:1;54466:62:0::1;::::0;::::1;9444:21:1::0;9501:2;9481:18;;;9474:30;9540:32;9520:18;;;9513:60;9590:18;;54466:62:0::1;9434:180:1::0;54466:62:0::1;-1:-1:-1::0;;;;;54539:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;54539:25:0::1;54560:4;54539:25:::0;;::::1;::::0;;;54575:17:::1;:31:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;54575:31:0::1;::::0;;::::1;::::0;;54254:360::o;38452:371::-;-1:-1:-1;;;;;38579:19:0;;38571:68;;;;-1:-1:-1;;;38571:68:0;;12132:2:1;38571:68:0;;;12114:21:1;12171:2;12151:18;;;12144:30;12210:34;12190:18;;;12183:62;-1:-1:-1;;;12261:18:1;;;12254:34;12305:19;;38571:68:0;12104:226:1;38571:68:0;-1:-1:-1;;;;;38658:21:0;;38650:68;;;;-1:-1:-1;;;38650:68:0;;7875:2:1;38650:68:0;;;7857:21:1;7914:2;7894:18;;;7887:30;7953:34;7933:18;;;7926:62;-1:-1:-1;;;8004:18:1;;;7997:32;8046:19;;38650:68:0;7847:224:1;38650:68:0;-1:-1:-1;;;;;38731:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38783:32;;13950:25:1;;;38783:32:0;;13923:18:1;38783:32:0;;;;;;;38452:371;;;:::o;38831:3614::-;-1:-1:-1;;;;;38953:18:0;;38945:68;;;;-1:-1:-1;;;38945:68:0;;11726:2:1;38945:68:0;;;11708:21:1;11765:2;11745:18;;;11738:30;11804:34;11784:18;;;11777:62;-1:-1:-1;;;11855:18:1;;;11848:35;11900:19;;38945:68:0;11698:227:1;38945:68:0;-1:-1:-1;;;;;39032:16:0;;39024:64;;;;-1:-1:-1;;;39024:64:0;;6302:2:1;39024:64:0;;;6284:21:1;6341:2;6321:18;;;6314:30;6380:34;6360:18;;;6353:62;-1:-1:-1;;;6431:18:1;;;6424:33;6474:19;;39024:64:0;6274:225:1;39024:64:0;39116:1;39107:6;:10;39099:64;;;;-1:-1:-1;;;39099:64:0;;10604:2:1;39099:64:0;;;10586:21:1;10643:2;10623:18;;;10616:30;10682:34;10662:18;;;10655:62;-1:-1:-1;;;10733:18:1;;;10726:39;10782:19;;39099:64:0;10576:231:1;39099:64:0;-1:-1:-1;;;;;39183:13:0;;;;;;:9;:13;;;;;;;;39182:14;39174:50;;;;-1:-1:-1;;;39174:50:0;;13238:2:1;39174:50:0;;;13220:21:1;13277:2;13257:18;;;13250:30;-1:-1:-1;;;13296:18:1;;;13289:53;13359:18;;39174:50:0;13210:173:1;39174:50:0;39254:10;39244:21;;;;:9;:21;;;;;;;;39243:22;39235:58;;;;-1:-1:-1;;;39235:58:0;;13238:2:1;39235:58:0;;;13220:21:1;13277:2;13257:18;;;13250:30;-1:-1:-1;;;13296:18:1;;;13289:53;13359:18;;39235:58:0;13210:173:1;39235:58:0;39350:13;;-1:-1:-1;;;;;39342:21:0;;;39350:13;;39342:21;:68;;;;-1:-1:-1;39394:15:0;;-1:-1:-1;;;;;39380:30:0;;;39394:15;;39380:30;;39342:68;:108;;;;-1:-1:-1;;;;;;39428:22:0;;;;;;:18;:22;;;;;;;;39427:23;39342:108;39324:387;;;39485:11;;-1:-1:-1;;;39485:11:0;;;;39477:48;;;;-1:-1:-1;;;39477:48:0;;12885:2:1;39477:48:0;;;12867:21:1;12924:2;12904:18;;;12897:30;12963:26;12943:18;;;12936:54;13007:18;;39477:48:0;12857:174:1;39477:48:0;39588:10;;39569:15;:29;39565:135;;;-1:-1:-1;;;;;39619:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;39619:20:0;39635:4;39619:20;;;;;;39658:17;:26;;;;;;;;;;;;;;-1:-1:-1;;;;;;39658:26:0;;;;;;39565:135;39726:14;;;;39723:1179;;;11465:7;11492:6;-1:-1:-1;;;;;39778:15:0;;;11492:6;;39778:15;;;;:49;;-1:-1:-1;11465:7:0;11492:6;-1:-1:-1;;;;;39814:13:0;;;11492:6;;39814:13;;39778:49;:86;;;;-1:-1:-1;;;;;;39848:16:0;;;;39778:86;:128;;;;-1:-1:-1;;;;;;39885:21:0;;39899:6;39885:21;;39778:128;39756:1135;;;39944:11;;-1:-1:-1;;;39944:11:0;;;;39940:144;;-1:-1:-1;;;;;39987:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;40015:22:0;;;;;;:18;:22;;;;;;;;39987:50;39979:85;;;;-1:-1:-1;;;39979:85:0;;7117:2:1;39979:85:0;;;7099:21:1;7156:2;7136:18;;;7129:30;-1:-1:-1;;;7175:18:1;;;7168:52;7237:18;;39979:85:0;7089:172:1;39979:85:0;40144:13;;-1:-1:-1;;;;;40136:21:0;;;40144:13;;40136:21;:61;;;;-1:-1:-1;;;;;;40162:35:0;;;;;;:31;:35;;;;;;;;40161:36;40136:61;40132:744;;;40244:20;;40234:6;:30;;40226:96;;;;-1:-1:-1;;;40226:96:0;;9821:2:1;40226:96:0;;;9803:21:1;9860:2;9840:18;;;9833:30;9899:34;9879:18;;;9872:62;-1:-1:-1;;;9950:18:1;;;9943:51;10011:19;;40226:96:0;9793:243:1;40226:96:0;40383:9;;40366:13;40376:2;40366:9;:13::i;:::-;40357:22;;:6;:22;:::i;:::-;:35;;40349:67;;;;-1:-1:-1;;;40349:67:0;;12537:2:1;40349:67:0;;;12519:21:1;12576:2;12556:18;;;12549:30;-1:-1:-1;;;12595:18:1;;;12588:49;12654:18;;40349:67:0;12509:169:1;40349:67:0;40132:744;;;40500:13;;-1:-1:-1;;;;;40494:19:0;;;40500:13;;40494:19;:61;;;;-1:-1:-1;;;;;;40518:37:0;;;;;;:31;:37;;;;;;;;40517:38;40494:61;40490:386;;;40602:20;;40592:6;:30;;40584:97;;;;-1:-1:-1;;;40584:97:0;;9039:2:1;40584:97:0;;;9021:21:1;9078:2;9058:18;;;9051:30;9117:34;9097:18;;;9090:62;-1:-1:-1;;;9168:18:1;;;9161:52;9230:19;;40584:97:0;9011:244:1;40490:386:0;-1:-1:-1;;;;;40730:35:0;;;;;;:31;:35;;;;;;;;40726:150;;40823:9;;40806:13;40816:2;40806:9;:13::i;:::-;40797:22;;:6;:22;:::i;:::-;:35;;40789:67;;;;-1:-1:-1;;;40789:67:0;;12537:2:1;40789:67:0;;;12519:21:1;12576:2;12556:18;;;12549:30;-1:-1:-1;;;12595:18:1;;;12588:49;12654:18;;40789:67:0;12509:169:1;40789:67:0;40914:28;40945:24;40963:4;40945:9;:24::i;:::-;41005:16;;40914:55;;-1:-1:-1;;;;41005:16:0;;;;41004:17;:32;;;;-1:-1:-1;41025:11:0;;-1:-1:-1;;;41025:11:0;;;;41004:32;:55;;;;-1:-1:-1;41046:13:0;;-1:-1:-1;;;;;41040:19:0;;;41046:13;;41040:19;41004:55;41000:191;;;41080:24;;41076:104;;41132:32;41143:20;41132:10;:32::i;:::-;41297:13;;41203:12;;-1:-1:-1;;;;;41289:21:0;;;41297:13;;41289:21;;:44;;-1:-1:-1;41320:13:0;;-1:-1:-1;;;;;41314:19:0;;;41320:13;;41314:19;41289:44;41288:116;;;;-1:-1:-1;;;;;;41353:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;41381:22:0;;;;;;:18;:22;;;;;;;;41353:50;41351:53;41288:116;41270:187;;;-1:-1:-1;41441:4:0;41270:187;41522:13;;41485:12;;-1:-1:-1;;;;;41516:19:0;;;41522:13;;41516:19;41512:926;;;41555:7;:22;;;;-1:-1:-1;41566:11:0;;-1:-1:-1;;;41566:11:0;;;;41555:22;41551:343;;;41604:34;41634:3;41604:25;41615:13;;41604:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;41597:41;;41705:13;;41686:16;;41679:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;41657:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;41783:13:0;;41765:15;;41758:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;41737:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;41863:13:0;;41844:16;;41837:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;41815:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;41551:343:0;41922:47;41937:4;41943:2;41947:6;41955:7;41964:4;41922:14;:47::i;:::-;41512:926;;;42014:7;:22;;;;-1:-1:-1;42025:11:0;;-1:-1:-1;;;42025:11:0;;;;42014:22;42010:340;;;42063:33;42092:3;42063:24;42074:12;;42063:6;:10;;:24;;;;:::i;:33::-;42056:40;;42162:12;;42144:15;;42137:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;42115:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;42238:12:0;;42221:14;;42214:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;42193:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;42316:12:0;;42298:15;;42291:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;42269:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;42010:340:0;42378:48;42393:4;42399:2;42403:6;42411:7;42420:5;42378:14;:48::i;:::-;38831:3614;;;;;;:::o;7816:240::-;7936:7;7997:12;7989:6;;;;7981:29;;;;-1:-1:-1;;;7981:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8032:5:0;;;7816:240::o;50538:164::-;50580:7;50601:15;50618;50637:19;:17;:19::i;:::-;50600:56;;-1:-1:-1;50600:56:0;-1:-1:-1;50674:20:0;50600:56;;50674:11;:20::i;:::-;50667:27;;;;50538:164;:::o;6674:98::-;6732:7;6759:5;6763:1;6759;:5;:::i;5537:98::-;5595:7;5622:5;5626:1;5622;:5;:::i;12519:173::-;12575:16;12594:6;;-1:-1:-1;;;;;12611:17:0;;;-1:-1:-1;;;;;;12611:17:0;;;;;;12644:40;;12594:6;;;;;;;12644:40;;12575:16;12644:40;12519:173;;:::o;42453:1585::-;31225:16;:23;;-1:-1:-1;;;;31225:23:0;-1:-1:-1;;;31225:23:0;;;42598:17:::1;::::0;42577:18:::1;::::0;42556::::1;::::0;31225:23;;42598:17;42556:39:::1;::::0;::::1;:::i;:::-;:59;;;;:::i;:::-;42528:87:::0;-1:-1:-1;42626:12:0::1;42662:20:::0;;;:46:::1;;-1:-1:-1::0;42686:22:0;;42662:46:::1;42659:60;;;42711:7;;;;42659:60;42780:5;42760:13;35049:7:::0;;;34969:95;42760:13:::1;:17;::::0;42776:1:::1;42760:17;:::i;:::-;:25;;;;:::i;:::-;:30;::::0;42788:2:::1;42760:30;:::i;:::-;42742:15;:48;42739:125;;;42842:5;42822:13;35049:7:::0;;;34969:95;42822:13:::1;:17;::::0;42838:1:::1;42822:17;:::i;:::-;:25;;;;:::i;:::-;:30;::::0;42850:2:::1;42822:30;:::i;:::-;42804:48;;42739:125;42923:23;43008:1;42988:17;42967:18;;42949:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;42923:86:::0;-1:-1:-1;43020:26:0::1;43049:36;:15:::0;42923:86;43049:19:::1;:36::i;:::-;43020:65:::0;-1:-1:-1;43134:21:0::1;43168:36;43020:65:::0;43168:16:::1;:36::i;:::-;43228:18;43249:44;:21;43275:17:::0;43249:25:::1;:44::i;:::-;43228:65;;43316:23;43342:57;43381:17;43342:34;43357:18;;43342:10;:14;;:34;;;;:::i;:57::-;43316:83;;43410:22;43435:56;43473:17;43435:33;43450:17;;43435:10;:14;;:33;;;;:::i;:56::-;43410:81:::0;-1:-1:-1;43512:23:0::1;43410:81:::0;43538:28:::1;43551:15:::0;43538:10;:28:::1;:::i;:::-;:45;;;;:::i;:::-;43627:1;43606:18;:22:::0;;;43639:18:::1;:22:::0;;;43672:17:::1;:21:::0;;;43735:15:::1;::::0;43727:56:::1;::::0;43512:71;;-1:-1:-1;;;;;;43735:15:0::1;::::0;43764:14;;43727:56;43627:1;43727:56;43764:14;43735:15;43727:56:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;43714:69:0;;-1:-1:-1;;43807:19:0;;;;;:42:::1;;;43848:1;43830:15;:19;43807:42;43804:119;;;43865:46;43878:15;43895;43865:12;:46::i;:::-;43974:16;::::0;43966:64:::1;::::0;-1:-1:-1;;;;;43974:16:0;;::::1;::::0;44004:21:::1;::::0;43966:64:::1;::::0;;;44004:21;43974:16;43966:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;31259:1:0::1;-1:-1:-1::0;31271:16:0;:24;;-1:-1:-1;;;;31271:24:0;;;42453:1585::o;6275:98::-;6333:7;6360:5;6364:1;6360;:5;:::i;45237:762::-;45415:7;45410:28;;45424:14;52160:12;;;52136:21;:36;52208:13;;;52183:22;:38;52259:15;;;52232:24;:42;52313:16;;;52285:25;:44;52366:14;;;52340:23;:40;52418:15;;;52391:24;:42;52471:15;;;52444:24;:42;52525:16;;;52497:25;:44;52572:7;;;52554:15;:25;-1:-1:-1;52592:11:0;;;;52614:16;;;;52641:17;;;;52669:19;;;;52699:20;;;;52730:18;;;52759:19;;;52789;;;52819:20;52091:756;45424:14;-1:-1:-1;;;;;45455:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;45479:22:0;;;;;;:11;:22;;;;;;;;45478:23;45455:46;45451:499;;;45518:56;45540:6;45548:9;45559:6;45567;45518:21;:56::i;:::-;45451:499;;;-1:-1:-1;;;;;45597:19:0;;;;;;:11;:19;;;;;;;;45596:20;:46;;;;-1:-1:-1;;;;;;45620:22:0;;;;;;:11;:22;;;;;;;;45596:46;45592:358;;;45659:54;45679:6;45687:9;45698:6;45706;45659:19;:54::i;45592:358::-;-1:-1:-1;;;;;45735:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;45758:22:0;;;;;;:11;:22;;;;;;;;45735:45;45731:219;;;45797:56;45819:6;45827:9;45838:6;45846;45797:21;:56::i;45731:219::-;45886:52;45904:6;45912:9;45923:6;45931;45886:17;:52::i;:::-;45967:7;45962:29;;45976:15;52909;;52899:7;:25;52960:21;;52945:12;:36;53008:22;;52992:13;:38;53059:24;;-1:-1:-1;53041:42:0;53113:25;;53094:16;:44;53166:23;;-1:-1:-1;53149:40:0;53218:24;;53200:15;:42;53271:24;;-1:-1:-1;53253:42:0;53325:25;;53306:16;:44;52855:503;45976:15;45237:762;;;;;:::o;50710:573::-;50808:7;;50844;;50761;;;;;50862:306;50886:9;:16;50882:20;;50862:306;;;50952:7;50928;:21;50936:9;50946:1;50936:12;;;;;;-1:-1:-1;;;50936:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50936:12:0;50928:21;;;;;;;;;;;;;:31;;:66;;;50987:7;50963;:21;50971:9;50981:1;50971:12;;;;;;-1:-1:-1;;;50971:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50971:12:0;50963:21;;;;;;;;;;;;;:31;50928:66;50924:114;;;51021:7;;51030;;51013:25;;;;;;;50710:573;;:::o;50924:114::-;51063:34;51075:7;:21;51083:9;51093:1;51083:12;;;;;;-1:-1:-1;;;51083:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51083:12:0;51075:21;;;;;;;;;;;;;51063:7;;:11;:34::i;:::-;51053:44;;51122:34;51134:7;:21;51142:9;51152:1;51142:12;;;;;;-1:-1:-1;;;51142:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51142:12:0;51134:21;;;;;;;;;;;;;51122:7;;:11;:34::i;:::-;51112:44;-1:-1:-1;50904:3:0;;;;:::i;:::-;;;;50862:306;;;-1:-1:-1;51204:7:0;;51192;;:20;;:11;:20::i;:::-;51182:7;:30;51178:61;;;51222:7;;51231;;51214:25;;;;;;50710:573;;:::o;51178:61::-;51258:7;;51267;;-1:-1:-1;50710:573:0;-1:-1:-1;50710:573:0:o;5918:98::-;5976:7;6003:5;6007:1;6003;:5;:::i;44048:658::-;44198:16;;;44212:1;44198:16;;;;;;;;44174:21;;44198:16;;;;;;;;;;-1:-1:-1;44198:16:0;44174:40;;44243:4;44225;44230:1;44225:7;;;;;;-1:-1:-1;;;44225:7:0;;;;;;;;;-1:-1:-1;;;;;44225:23:0;;;:7;;;;;;;;;;:23;;;;44269:15;;:22;;;-1:-1:-1;;;44269:22:0;;;;:15;;;;;:20;;:22;;;;;44225:7;;44269:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44259:4;44264:1;44259:7;;;;;;-1:-1:-1;;;44259:7:0;;;;;;;;;-1:-1:-1;;;;;44259:32:0;;;:7;;;;;;;;;:32;44336:15;;44304:62;;44321:4;;44336:15;44354:11;44304:8;:62::i;:::-;44405:15;;:240;;-1:-1:-1;;;44405:240:0;;-1:-1:-1;;;;;44405:15:0;;;;:66;;:240;;44486:11;;44405:15;;44556:4;;44583;;44619:15;;44405:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44663:35;44680:11;44693:4;44663:35;;;;;;;:::i;:::-;;;;;;;;44048:658;;:::o;44714:515::-;44894:15;;44862:62;;44879:4;;-1:-1:-1;;;;;44894:15:0;44912:11;44862:8;:62::i;:::-;44967:15;;-1:-1:-1;;;;;44967:15:0;:31;45007:9;45041:4;45061:11;44967:15;;45173:7;11465;11492:6;-1:-1:-1;;;;;11492:6:0;;11419:87;45173:7;44967:254;;;;;;-1:-1:-1;;;;;;44967:254:0;;;-1:-1:-1;;;;;4812:15:1;;;44967:254:0;;;4794:34:1;4844:18;;;4837:34;;;;4887:18;;;4880:34;;;;4930:18;;;4923:34;4994:15;;;4973:19;;;4966:44;45195:15:0;5026:19:1;;;5019:35;4728:19;;44967:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47358:692::-;47527:15;47553:23;47587:12;47610:23;47644:12;47667:18;47699:27;47710:7;47719:6;47699:10;:27::i;:::-;47516:210;;;;;;;;;;;;47755:28;47775:7;47755;:15;47763:6;-1:-1:-1;;;;;47755:15:0;-1:-1:-1;;;;;47755:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;47737:15:0;;;;;;:7;:15;;;;;;;;:46;;;;47812:7;:15;;;;:28;;47832:7;47812:19;:28::i;:::-;-1:-1:-1;;;;;47794:15:0;;;;;;;:7;:15;;;;;;:46;;;;47872:18;;;;;;;:39;;47895:15;47872:22;:39::i;:::-;-1:-1:-1;;;;;47851:18:0;;;;;;:7;:18;;;;;:60;47922:26;47937:10;47922:14;:26::i;:::-;47959:23;47971:4;47977;47959:11;:23::i;:::-;48015:9;-1:-1:-1;;;;;47998:44:0;48007:6;-1:-1:-1;;;;;47998:44:0;;48026:15;47998:44;;;;13950:25:1;;13938:2;13923:18;;13905:76;47998:44:0;;;;;;;;47358:692;;;;;;;;;;:::o;46646:704::-;46813:15;46839:23;46873:12;46896:23;46930:12;46953:18;46985:27;46996:7;47005:6;46985:10;:27::i;:::-;46802:210;;;;;;;;;;;;47041:28;47061:7;47041;:15;47049:6;-1:-1:-1;;;;;47041:15:0;-1:-1:-1;;;;;47041:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;47023:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;47101:18;;;;;:7;:18;;;;;:39;;47124:15;47101:22;:39::i;:::-;-1:-1:-1;;;;;47080:18:0;;;;;;:7;:18;;;;;;;;:60;;;;47172:7;:18;;;;:39;;47195:15;47172:22;:39::i;48058:763::-;48227:15;48253:23;48287:12;48310:23;48344:12;48367:18;48399:27;48410:7;48419:6;48399:10;:27::i;:::-;48216:210;;;;;;;;;;;;48455:28;48475:7;48455;:15;48463:6;-1:-1:-1;;;;;48455:15:0;-1:-1:-1;;;;;48455:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;48437:15:0;;;;;;:7;:15;;;;;;;;:46;;;;48512:7;:15;;;;:28;;48532:7;48512:19;:28::i;46007:631::-;46172:15;46198:23;46232:12;46255:23;46289:12;46312:18;46344:27;46355:7;46364:6;46344:10;:27::i;:::-;46161:210;;;;;;;;;;;;46400:28;46420:7;46400;:15;46408:6;-1:-1:-1;;;;;46400:15:0;-1:-1:-1;;;;;46400:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;48984:608::-;49081:7;49099;49117;49135;49153;49171;49203:23;49228:12;49242:18;49264:52;49290:7;49299:6;49264:11;:52::i;:::-;49202:114;;;;;;49328:15;49345:23;49370:12;49386:113;49412:7;49434:4;49453:10;49478;:8;:10::i;:::-;49386:11;:113::i;:::-;49327:172;;-1:-1:-1;49327:172:0;-1:-1:-1;49327:172:0;-1:-1:-1;49550:15:0;;-1:-1:-1;49567:4:0;;-1:-1:-1;49573:10:0;;-1:-1:-1;;;;48984:608:0;;;;;;;;:::o;51291:355::-;51354:19;51376:10;:8;:10::i;:::-;51354:32;-1:-1:-1;51397:18:0;51418:27;:10;51354:32;51418:14;:27::i;:::-;51497:4;51481:22;;;;:7;:22;;;;;;51397:48;;-1:-1:-1;51481:38:0;;51397:48;51481:26;:38::i;:::-;51472:4;51456:22;;;;:7;:22;;;;;;;;:63;;;;51534:11;:26;;;;;;51530:108;;;51616:4;51600:22;;;;:7;:22;;;;;;:38;;51627:10;51600:26;:38::i;:::-;51591:4;51575:22;;;;:7;:22;;;;;:63;51530:108;51291:355;;;:::o;48829:147::-;48907:7;;:17;;48919:4;48907:11;:17::i;:::-;48897:7;:27;48948:10;;:20;;48963:4;48948:14;:20::i;:::-;48935:10;:33;-1:-1:-1;;48829:147:0:o;49600:396::-;49698:7;49716;49734;49765:12;49780:24;49796:7;49780:15;:24::i;:::-;49765:39;;49815:18;49836:29;49849:7;49858:6;49836:12;:29::i;:::-;49815:50;-1:-1:-1;49876:23:0;49902:33;49815:50;49902:17;:7;49914:4;49902:11;:17::i;:::-;:21;;:33::i;:::-;49876:59;-1:-1:-1;49971:4:0;;-1:-1:-1;49977:10:0;-1:-1:-1;;49600:396:0;;;;;:::o;50004:526::-;50187:7;;;;50272:24;:7;50284:11;50272;:24::i;:::-;50254:42;-1:-1:-1;50307:12:0;50322:21;:4;50331:11;50322:8;:21::i;:::-;50307:36;-1:-1:-1;50354:18:0;50375:27;:10;50390:11;50375:14;:27::i;:::-;50354:48;-1:-1:-1;50413:23:0;50439:33;50354:48;50439:17;:7;50451:4;50439:11;:17::i;:33::-;50491:7;;;;-1:-1:-1;50517:4:0;;-1:-1:-1;50004:526:0;;-1:-1:-1;;;;;;;50004:526:0:o;51654:130::-;51718:7;51745:31;51770:5;51745:20;51757:7;;51745;:11;;:20;;;;:::i;51792:291::-;51881:7;51910:6;51906:170;;;51943:35;51974:3;51943:26;51955:13;;51943:7;:11;;:26;;;;:::i;:35::-;51936:42;;;;51906:170;52030:34;52060:3;52030:25;52042:12;;52030:7;:11;;:25;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;1022:6;1030;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:436::-;1481:6;1489;1542:2;1530:9;1521:7;1517:23;1513:32;1510:2;;;1563:6;1555;1548:22;1510:2;1607:9;1594:23;1626:31;1651:5;1626:31;:::i;:::-;1676:5;-1:-1:-1;1733:2:1;1718:18;;1705:32;1775:15;;1768:23;1756:36;;1746:2;;1811:6;1803;1796:22;1857:325;1925:6;1933;1986:2;1974:9;1965:7;1961:23;1957:32;1954:2;;;2007:6;1999;1992:22;1954:2;2051:9;2038:23;2070:31;2095:5;2070:31;:::i;:::-;2120:5;2172:2;2157:18;;;;2144:32;;-1:-1:-1;;;1944:238:1:o;2187:190::-;2246:6;2299:2;2287:9;2278:7;2274:23;2270:32;2267:2;;;2320:6;2312;2305:22;2267:2;-1:-1:-1;2348:23:1;;2257:120;-1:-1:-1;2257:120:1:o;2382:326::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:2;;;2549:6;2541;2534:22;2496:2;-1:-1:-1;;2577:23:1;;;2647:2;2632:18;;2619:32;;-1:-1:-1;2698:2:1;2683:18;;;2670:32;;2486:222;-1:-1:-1;2486:222:1:o;2713:316::-;2801:6;2809;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:2;;;2891:6;2883;2876:22;2838:2;2925:9;2919:16;2909:26;;2975:2;2964:9;2960:18;2954:25;2944:35;;3019:2;3008:9;3004:18;2998:25;2988:35;;2828:201;;;;;:::o;3034:463::-;3087:3;3125:5;3119:12;3152:6;3147:3;3140:19;3178:4;3207:2;3202:3;3198:12;3191:19;;3244:2;3237:5;3233:14;3265:3;3277:195;3291:6;3288:1;3285:13;3277:195;;;3356:13;;-1:-1:-1;;;;;3352:39:1;3340:52;;3412:12;;;;3447:15;;;;3388:1;3306:9;3277:195;;;-1:-1:-1;3488:3:1;;3095:402;-1:-1:-1;;;;;3095:402:1:o;5492:603::-;5604:4;5633:2;5662;5651:9;5644:21;5694:6;5688:13;5737:6;5732:2;5721:9;5717:18;5710:34;5762:4;5775:140;5789:6;5786:1;5783:13;5775:140;;;5884:14;;;5880:23;;5874:30;5850:17;;;5869:2;5846:26;5839:66;5804:10;;5775:140;;;5933:6;5930:1;5927:13;5924:2;;;6003:4;5998:2;5989:6;5978:9;5974:22;5970:31;5963:45;5924:2;-1:-1:-1;6079:2:1;6058:15;-1:-1:-1;;6054:29:1;6039:45;;;;6086:2;6035:54;;5613:482;-1:-1:-1;;;5613:482:1:o;10041:356::-;10243:2;10225:21;;;10262:18;;;10255:30;10321:34;10316:2;10301:18;;10294:62;10388:2;10373:18;;10215:182::o;13986:332::-;14193:6;14182:9;14175:25;14236:2;14231;14220:9;14216:18;14209:30;14156:4;14256:56;14308:2;14297:9;14293:18;14285:6;14256:56;:::i;:::-;14248:64;14165:153;-1:-1:-1;;;;14165:153:1:o;14323:582::-;14622:6;14611:9;14604:25;14665:6;14660:2;14649:9;14645:18;14638:34;14708:3;14703:2;14692:9;14688:18;14681:31;14585:4;14729:57;14781:3;14770:9;14766:19;14758:6;14729:57;:::i;:::-;-1:-1:-1;;;;;14822:32:1;;;;14817:2;14802:18;;14795:60;-1:-1:-1;14886:3:1;14871:19;14864:35;14721:65;14594:311;-1:-1:-1;;;14594:311:1:o;15099:128::-;15139:3;15170:1;15166:6;15163:1;15160:13;15157:2;;;15176:18;;:::i;:::-;-1:-1:-1;15212:9:1;;15147:80::o;15232:217::-;15272:1;15298;15288:2;;-1:-1:-1;;;15323:31:1;;15377:4;15374:1;15367:15;15405:4;15330:1;15395:15;15288:2;-1:-1:-1;15434:9:1;;15278:171::o;15454:168::-;15494:7;15560:1;15556;15552:6;15548:14;15545:1;15542:21;15537:1;15530:9;15523:17;15519:45;15516:2;;;15567:18;;:::i;:::-;-1:-1:-1;15607:9:1;;15506:116::o;15627:125::-;15667:4;15695:1;15692;15689:8;15686:2;;;15700:18;;:::i;:::-;-1:-1:-1;15737:9:1;;15676:76::o;15757:380::-;15836:1;15832:12;;;;15879;;;15900:2;;15954:4;15946:6;15942:17;15932:27;;15900:2;16007;15999:6;15996:14;15976:18;15973:38;15970:2;;;16053:10;16048:3;16044:20;16041:1;16034:31;16088:4;16085:1;16078:15;16116:4;16113:1;16106:15;15970:2;;15812:325;;;:::o;16142:135::-;16181:3;-1:-1:-1;;16202:17:1;;16199:2;;;16222:18;;:::i;:::-;-1:-1:-1;16269:1:1;16258:13;;16189:88::o;16282:127::-;16343:10;16338:3;16334:20;16331:1;16324:31;16374:4;16371:1;16364:15;16398:4;16395:1;16388:15;16414:131;-1:-1:-1;;;;;16489:31:1;;16479:42;;16469:2;;16535:1;16532;16525:12

Swarm Source

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