ETH Price: $2,875.91 (-9.55%)
Gas: 17 Gwei

Token

HODL Together (HODL)
 

Overview

Max Total Supply

690,000,000,000,000 HODL

Holders

309

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,564,271,922,809.406150167089849619 HODL

Value
$0.00
0xc637eba7842cea32aa9ddf04ef43cdd846db6fd1
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:
HODLTogether

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-17
*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity 0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

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

contract HODLTogether is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public communityWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyCommunityMarketingFee;
    
    uint256 public sellTotalFees;
    uint256 public sellCommunityMarketingFee;
    
    uint256 public tokensForCommunityMarketing;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event communityWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("HODL Together", "HODL") {
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyCommunityMarketingFee = 25;
        uint256 _sellCommunityMarketingFee = 40;
       
        uint256 totalSupply = 690 * 1e12 * 1e18;
        
        maxTransactionAmount = totalSupply * 25 / 1000; // 0.25% maxTransactionAmountTxn
        maxWallet = totalSupply * 200 / 1000; // 2% maxWallet
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet

        buyCommunityMarketingFee = _buyCommunityMarketingFee;
        buyTotalFees = buyCommunityMarketingFee;
        
        sellCommunityMarketingFee = _sellCommunityMarketingFee;
        sellTotalFees = sellCommunityMarketingFee;
        
        communityWallet = address(owner()); // set as marketing wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**18);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _communityMarketingFee) external onlyOwner {
        buyCommunityMarketingFee = _communityMarketingFee;
        buyTotalFees = buyCommunityMarketingFee;
    }
    
    function updateSellFees(uint256 _communityMarketingFee) external onlyOwner {
        sellCommunityMarketingFee = _communityMarketingFee;
        sellTotalFees = sellCommunityMarketingFee;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateCommunityMarketingWallet(address newCommunityMarketingWallet) external onlyOwner {
        emit communityWalletUpdated(newCommunityMarketingWallet, communityWallet);
        communityWallet = newCommunityMarketingWallet;
    }
    
    
    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_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));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForCommunityMarketing += fees * sellCommunityMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
                tokensForCommunityMarketing += fees * buyCommunityMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

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

    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),
            block.timestamp
        );
        
    }
    
    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
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForCommunityMarketing;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 amountToSwapForETH = contractBalance;
        swapTokensForEth(amountToSwapForETH); 
        tokensForCommunityMarketing = 0;
        (success,) = address(communityWallet).call{value: 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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"communityWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyCommunityMarketingFee","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":"communityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","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":"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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"sellCommunityMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForCommunityMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"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":"_communityMarketingFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCommunityMarketingWallet","type":"address"}],"name":"updateCommunityMarketingWallet","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":"_communityMarketingFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600a5f6101000a81548160ff0219169083151502179055505f600a60016101000a81548160ff0219169083151502179055505f600a60026101000a81548160ff0219169083151502179055506001600c5f6101000a81548160ff02191690831515021790555034801562000078575f80fd5b506040518060400160405280600d81526020017f484f444c20546f676574686572000000000000000000000000000000000000008152506040518060400160405280600481526020017f484f444c000000000000000000000000000000000000000000000000000000008152508160039081620000f6919062000cf1565b50806004908162000108919062000cf1565b5050505f6200011c6200057a60201b60201c565b90508060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505f737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001e48160016200058160201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000262573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000288919062000e3a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000314919062000e3a565b6040518363ffffffff1660e01b81526004016200033392919062000e7b565b6020604051808303815f875af115801562000350573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000376919062000e3a565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620003be60a05160016200058160201b60201c565b620003d360a05160016200067a60201b60201c565b5f601990505f602890505f6d2205063ea95de72941608000000090506103e860198262000401919062000ed3565b6200040d919062000f4a565b6007819055506103e860c88262000425919062000ed3565b62000431919062000f4a565b60098190555061271060058262000449919062000ed3565b62000455919062000f4a565b60088190555082600e81905550600e54600d8190555081601081905550601054600f819055506200048b6200071860201b60201c565b60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004ec620004de6200071860201b60201c565b60016200074060201b60201c565b620004ff3060016200074060201b60201c565b6200051461dead60016200074060201b60201c565b62000536620005286200071860201b60201c565b60016200058160201b60201c565b620005493060016200058160201b60201c565b6200055e61dead60016200058160201b60201c565b6200057033826200088960201b60201c565b5050505062001178565b5f33905090565b620005916200057a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006199062000fdf565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007506200057a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620007e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d89062000fdf565b60405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516200087d91906200101b565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f19062001084565b60405180910390fd5b6200090d5f838362000a2660201b60201c565b620009248160025462000a2b60201b90919060201c565b6002819055506200097b815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205462000a2b60201b90919060201c565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a1a9190620010b5565b60405180910390a35050565b505050565b5f80828462000a3b9190620010d0565b90508381101562000a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a7a9062001158565b60405180910390fd5b8091505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000b0957607f821691505b60208210810362000b1f5762000b1e62000ac4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b46565b62000b8f868362000b46565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000bd962000bd362000bcd8462000ba7565b62000bb0565b62000ba7565b9050919050565b5f819050919050565b62000bf48362000bb9565b62000c0c62000c038262000be0565b84845462000b52565b825550505050565b5f90565b62000c2262000c14565b62000c2f81848462000be9565b505050565b5b8181101562000c565762000c4a5f8262000c18565b60018101905062000c35565b5050565b601f82111562000ca55762000c6f8162000b25565b62000c7a8462000b37565b8101602085101562000c8a578190505b62000ca262000c998562000b37565b83018262000c34565b50505b505050565b5f82821c905092915050565b5f62000cc75f198460080262000caa565b1980831691505092915050565b5f62000ce1838362000cb6565b9150826002028217905092915050565b62000cfc8262000a8d565b67ffffffffffffffff81111562000d185762000d1762000a97565b5b62000d24825462000af1565b62000d3182828562000c5a565b5f60209050601f83116001811462000d67575f841562000d52578287015190505b62000d5e858262000cd4565b86555062000dcd565b601f19841662000d778662000b25565b5f5b8281101562000da05784890151825560018201915060208501945060208101905062000d79565b8683101562000dc0578489015162000dbc601f89168262000cb6565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000e048262000dd9565b9050919050565b62000e168162000df8565b811462000e21575f80fd5b50565b5f8151905062000e348162000e0b565b92915050565b5f6020828403121562000e525762000e5162000dd5565b5b5f62000e618482850162000e24565b91505092915050565b62000e758162000df8565b82525050565b5f60408201905062000e905f83018562000e6a565b62000e9f602083018462000e6a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000edf8262000ba7565b915062000eec8362000ba7565b925082820262000efc8162000ba7565b9150828204841483151762000f165762000f1562000ea6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000f568262000ba7565b915062000f638362000ba7565b92508262000f765762000f7562000f1d565b5b828204905092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f62000fc760208362000f81565b915062000fd48262000f91565b602082019050919050565b5f6020820190508181035f83015262000ff88162000fb9565b9050919050565b5f8115159050919050565b620010158162000fff565b82525050565b5f602082019050620010305f8301846200100a565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6200106c601f8362000f81565b9150620010798262001036565b602082019050919050565b5f6020820190508181035f8301526200109d816200105e565b9050919050565b620010af8162000ba7565b82525050565b5f602082019050620010ca5f830184620010a4565b92915050565b5f620010dc8262000ba7565b9150620010e98362000ba7565b925082820190508082111562001104576200110362000ea6565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f62001140601b8362000f81565b91506200114d826200110a565b602082019050919050565b5f6020820190508181035f830152620011718162001132565b9050919050565b60805160a051614810620011c45f395f8181610fa70152818161170301526125f601525f8181610b6d0152818161259e0152818161341b015281816134fa015261352101526148105ff3fe608060405260043610610280575f3560e01c80638da5cb5b1161014e578063c18bc195116100c0578063dd62ed3e11610079578063dd62ed3e14610997578063e2f45605146109d3578063e884f260146109fd578063eba4c33314610a27578063f2fde38b14610a4f578063f8b45b0514610a7757610287565b8063c18bc1951461088b578063c7574839146108b3578063c876d0b9146108dd578063c8c8ebe414610907578063d257b34f14610931578063d85ba0631461096d57610287565b8063a9059cbb11610112578063a9059cbb1461076d578063ae984d3f146107a9578063b0a548d1146107d3578063b62496f5146107fd578063bbc0c74214610839578063c02466681461086357610287565b80638da5cb5b1461068d578063924de9b7146106b757806395d89b41146106df5780639a7a23d614610709578063a457c2d71461073157610287565b806349bd5a5e116101f257806370a08231116101ab57806370a08231146105ab578063715018a6146105e757806371fc4688146105fd578063751039fc146106255780637571336a1461064f5780638a8c523c1461067757610287565b806349bd5a5e1461049d5780634a62bb65146104c75780634fbee193146104f15780636a486a8e1461052d5780636afda7e1146105575780636ddd17131461058157610287565b8063203e727e11610244578063203e727e1461038157806323b872dd146103a957806327c8f835146103e5578063313ce5671461040f578063395093511461043957806343828f081461047557610287565b806306fdde031461028b578063095ea7b3146102b557806310d5de53146102f15780631694505e1461032d57806318160ddd1461035757610287565b3661028757005b5f80fd5b348015610296575f80fd5b5061029f610aa1565b6040516102ac919061369c565b60405180910390f35b3480156102c0575f80fd5b506102db60048036038101906102d6919061374d565b610b31565b6040516102e891906137a5565b60405180910390f35b3480156102fc575f80fd5b50610317600480360381019061031291906137be565b610b4e565b60405161032491906137a5565b60405180910390f35b348015610338575f80fd5b50610341610b6b565b60405161034e9190613844565b60405180910390f35b348015610362575f80fd5b5061036b610b8f565b604051610378919061386c565b60405180910390f35b34801561038c575f80fd5b506103a760048036038101906103a29190613885565b610b98565b005b3480156103b4575f80fd5b506103cf60048036038101906103ca91906138b0565b610cc1565b6040516103dc91906137a5565b60405180910390f35b3480156103f0575f80fd5b506103f9610d95565b604051610406919061390f565b60405180910390f35b34801561041a575f80fd5b50610423610d9b565b6040516104309190613943565b60405180910390f35b348015610444575f80fd5b5061045f600480360381019061045a919061374d565b610da3565b60405161046c91906137a5565b60405180910390f35b348015610480575f80fd5b5061049b600480360381019061049691906137be565b610e51565b005b3480156104a8575f80fd5b506104b1610fa5565b6040516104be919061390f565b60405180910390f35b3480156104d2575f80fd5b506104db610fc9565b6040516104e891906137a5565b60405180910390f35b3480156104fc575f80fd5b50610517600480360381019061051291906137be565b610fdb565b60405161052491906137a5565b60405180910390f35b348015610538575f80fd5b5061054161102d565b60405161054e919061386c565b60405180910390f35b348015610562575f80fd5b5061056b611033565b604051610578919061386c565b60405180910390f35b34801561058c575f80fd5b50610595611039565b6040516105a291906137a5565b60405180910390f35b3480156105b6575f80fd5b506105d160048036038101906105cc91906137be565b61104c565b6040516105de919061386c565b60405180910390f35b3480156105f2575f80fd5b506105fb611091565b005b348015610608575f80fd5b50610623600480360381019061061e9190613885565b6111e4565b005b348015610630575f80fd5b5061063961128d565b60405161064691906137a5565b60405180910390f35b34801561065a575f80fd5b5061067560048036038101906106709190613986565b611344565b005b348015610682575f80fd5b5061068b611432565b005b348015610698575f80fd5b506106a1611500565b6040516106ae919061390f565b60405180910390f35b3480156106c2575f80fd5b506106dd60048036038101906106d891906139c4565b611528565b005b3480156106ea575f80fd5b506106f36115db565b604051610700919061369c565b60405180910390f35b348015610714575f80fd5b5061072f600480360381019061072a9190613986565b61166b565b005b34801561073c575f80fd5b506107576004803603810190610752919061374d565b61179d565b60405161076491906137a5565b60405180910390f35b348015610778575f80fd5b50610793600480360381019061078e919061374d565b611865565b6040516107a091906137a5565b60405180910390f35b3480156107b4575f80fd5b506107bd611882565b6040516107ca919061386c565b60405180910390f35b3480156107de575f80fd5b506107e7611888565b6040516107f4919061386c565b60405180910390f35b348015610808575f80fd5b50610823600480360381019061081e91906137be565b61188e565b60405161083091906137a5565b60405180910390f35b348015610844575f80fd5b5061084d6118ab565b60405161085a91906137a5565b60405180910390f35b34801561086e575f80fd5b5061088960048036038101906108849190613986565b6118be565b005b348015610896575f80fd5b506108b160048036038101906108ac9190613885565b6119fa565b005b3480156108be575f80fd5b506108c7611b23565b6040516108d4919061390f565b60405180910390f35b3480156108e8575f80fd5b506108f1611b48565b6040516108fe91906137a5565b60405180910390f35b348015610912575f80fd5b5061091b611b5a565b604051610928919061386c565b60405180910390f35b34801561093c575f80fd5b5061095760048036038101906109529190613885565b611b60565b60405161096491906137a5565b60405180910390f35b348015610978575f80fd5b50610981611cce565b60405161098e919061386c565b60405180910390f35b3480156109a2575f80fd5b506109bd60048036038101906109b891906139ef565b611cd4565b6040516109ca919061386c565b60405180910390f35b3480156109de575f80fd5b506109e7611d56565b6040516109f4919061386c565b60405180910390f35b348015610a08575f80fd5b50610a11611d5c565b604051610a1e91906137a5565b60405180910390f35b348015610a32575f80fd5b50610a4d6004803603810190610a489190613885565b611e13565b005b348015610a5a575f80fd5b50610a756004803603810190610a7091906137be565b611ebc565b005b348015610a82575f80fd5b50610a8b61207e565b604051610a98919061386c565b60405180910390f35b606060038054610ab090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610adc90613a5a565b8015610b275780601f10610afe57610100808354040283529160200191610b27565b820191905f5260205f20905b815481529060010190602001808311610b0a57829003601f168201915b5050505050905090565b5f610b44610b3d612084565b848461208b565b6001905092915050565b6013602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b610ba0612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590613ad4565b60405180910390fd5b670de0b6b3a76400006103e86001610c44610b8f565b610c4e9190613b1f565b610c589190613b8d565b610c629190613b8d565b811015610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613c2d565b60405180910390fd5b670de0b6b3a764000081610cb89190613b1f565b60078190555050565b5f610ccd84848461224e565b610d8a84610cd9612084565b610d858560405180606001604052806028815260200161478e6028913960015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610d3c612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b61208b565b600190509392505050565b61dead81565b5f6012905090565b5f610e47610daf612084565b84610e428560015f610dbf612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e3b90919063ffffffff16565b61208b565b6001905092915050565b610e59612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613ad4565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e93f456cc9a7cd16cdd07852911879883f53eb9b4643c9df90615542d46e95d60405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5f9054906101000a900460ff1681565b5f60125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600f5481565b600e5481565b600a60029054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611099612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613ad4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6111ec612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613ad4565b60405180910390fd5b80600e81905550600e54600d8190555050565b5f611296612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613ad4565b60405180910390fd5b5f600a5f6101000a81548160ff0219169083151502179055506001905090565b61134c612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613ad4565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61143a612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ad4565b60405180910390fd5b6001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611530612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613ad4565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6060600480546115ea90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461161690613a5a565b80156116615780601f1061163857610100808354040283529160200191611661565b820191905f5260205f20905b81548152906001019060200180831161164457829003601f168201915b5050505050905090565b611673612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613ad4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690613cbb565b60405180910390fd5b6117998282612e98565b5050565b5f61185b6117a9612084565b84611856856040518060600160405280602581526020016147b66025913960015f6117d2612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b61208b565b6001905092915050565b5f611878611871612084565b848461224e565b6001905092915050565b60115481565b60105481565b6014602052805f5260405f205f915054906101000a900460ff1681565b600a60019054906101000a900460ff1681565b6118c6612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613ad4565b60405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516119ee91906137a5565b60405180910390a25050565b611a02612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790613ad4565b60405180910390fd5b670de0b6b3a76400006103e86005611aa6610b8f565b611ab09190613b1f565b611aba9190613b8d565b611ac49190613b8d565b811015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613d49565b60405180910390fd5b670de0b6b3a764000081611b1a9190613b1f565b60098190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5f9054906101000a900460ff1681565b60075481565b5f611b69612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613ad4565b60405180910390fd5b620186a06001611c05610b8f565b611c0f9190613b1f565b611c199190613b8d565b821015611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613dd7565b60405180910390fd5b6103e86005611c68610b8f565b611c729190613b1f565b611c7c9190613b8d565b821115611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590613e65565b60405180910390fd5b8160088190555060019050919050565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b5f611d65612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613ad4565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055506001905090565b611e1b612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090613ad4565b60405180910390fd5b80601081905550601054600f8190555050565b611ec4612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990613ad4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613ef3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f090613f81565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e9061400f565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612241919061386c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b39061409d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123219061412b565b60405180910390fd5b5f81036123415761233c83835f612f36565b612dd4565b600a5f9054906101000a900460ff16156129e85761235d611500565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123cb575061239b611500565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561240357505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561243d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156124565750600560149054906101000a900460ff16155b156129e757600a60019054906101000a900460ff1661254a5760125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061250a575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090614193565b60405180910390fd5b5b600c5f9054906101000a900460ff161561270d57612566611500565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125ed57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561264557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561270c5743600b5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614247565b60405180910390fd5b43600b5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156127aa575060135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612851576007548111156127f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127eb906142d5565b60405180910390fd5b6009546128008361104c565b8261280b91906142f3565b111561284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614370565b60405180910390fd5b6129e6565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128ee575060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561293d57600754811115612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f906143fe565b60405180910390fd5b6129e5565b60135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166129e4576009546129978361104c565b826129a291906142f3565b11156129e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129da90614370565b60405180910390fd5b5b5b5b5b5b5f6129f23061104c565b90505f6008548210159050808015612a165750600a60029054906101000a900460ff165b8015612a2f5750600560149054906101000a900460ff16155b8015612a82575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612ad5575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612b28575060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612b6b576001600560146101000a81548160ff021916908315150217905550612b506131bf565b5f600560146101000a81548160ff0219169083151502179055505b5f600560149054906101000a900460ff1615905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612c1a575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612c23575f90505b5f8115612dc45760145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c8157505f600f54115b15612ce757612cae6064612ca0600f54886132b990919063ffffffff16565b61333090919063ffffffff16565b9050600f5460105482612cc19190613b1f565b612ccb9190613b8d565b60115f828254612cdb91906142f3565b92505081905550612da1565b60145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612d3e57505f600d54115b15612da057612d6b6064612d5d600d54886132b990919063ffffffff16565b61333090919063ffffffff16565b9050600d54600e5482612d7e9190613b1f565b612d889190613b8d565b60115f828254612d9891906142f3565b925050819055505b5b5f811115612db557612db4873083612f36565b5b8085612dc1919061441c565b94505b612dcf878787612f36565b505050505b505050565b5f838311158290612e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e17919061369c565b60405180910390fd5b505f8385612e2e919061441c565b9050809150509392505050565b5f808284612e4991906142f3565b905083811015612e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8590614499565b60405180910390fd5b8091505092915050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9b9061409d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613012576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130099061412b565b60405180910390fd5b61301d838383613379565b61308681604051806060016040528060268152602001614768602691395f808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613115815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e3b90919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131b2919061386c565b60405180910390a3505050565b5f6131c93061104c565b90505f60115490505f808314806131df57505f82145b156131ec575050506132b7565b60146008546131fb9190613b1f565b8311156132145760146008546132119190613b1f565b92505b5f8390506132218161337e565b5f60118190555060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161326d906144e4565b5f6040518083038185875af1925050503d805f81146132a7576040519150601f19603f3d011682016040523d82523d5f602084013e6132ac565b606091505b505080925050505050505b565b5f8083036132c9575f905061332a565b5f82846132d69190613b1f565b90508284826132e59190613b8d565b14613325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331c90614568565b60405180910390fd5b809150505b92915050565b5f61337183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135b1565b905092915050565b505050565b5f600267ffffffffffffffff81111561339a57613399614586565b5b6040519080825280602002602001820160405280156133c85781602001602082028036833780820191505090505b50905030815f815181106133df576133de6145b3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a691906145f4565b816001815181106134ba576134b96145b3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061351f307f00000000000000000000000000000000000000000000000000000000000000008461208b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040161358095949392919061470f565b5f604051808303815f87803b158015613597575f80fd5b505af11580156135a9573d5f803e3d5ffd5b505050505050565b5f80831182906135f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ee919061369c565b60405180910390fd5b505f83856136059190613b8d565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561364957808201518184015260208101905061362e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61366e82613612565b613678818561361c565b935061368881856020860161362c565b61369181613654565b840191505092915050565b5f6020820190508181035f8301526136b48184613664565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6136e9826136c0565b9050919050565b6136f9816136df565b8114613703575f80fd5b50565b5f81359050613714816136f0565b92915050565b5f819050919050565b61372c8161371a565b8114613736575f80fd5b50565b5f8135905061374781613723565b92915050565b5f8060408385031215613763576137626136bc565b5b5f61377085828601613706565b925050602061378185828601613739565b9150509250929050565b5f8115159050919050565b61379f8161378b565b82525050565b5f6020820190506137b85f830184613796565b92915050565b5f602082840312156137d3576137d26136bc565b5b5f6137e084828501613706565b91505092915050565b5f819050919050565b5f61380c613807613802846136c0565b6137e9565b6136c0565b9050919050565b5f61381d826137f2565b9050919050565b5f61382e82613813565b9050919050565b61383e81613824565b82525050565b5f6020820190506138575f830184613835565b92915050565b6138668161371a565b82525050565b5f60208201905061387f5f83018461385d565b92915050565b5f6020828403121561389a576138996136bc565b5b5f6138a784828501613739565b91505092915050565b5f805f606084860312156138c7576138c66136bc565b5b5f6138d486828701613706565b93505060206138e586828701613706565b92505060406138f686828701613739565b9150509250925092565b613909816136df565b82525050565b5f6020820190506139225f830184613900565b92915050565b5f60ff82169050919050565b61393d81613928565b82525050565b5f6020820190506139565f830184613934565b92915050565b6139658161378b565b811461396f575f80fd5b50565b5f813590506139808161395c565b92915050565b5f806040838503121561399c5761399b6136bc565b5b5f6139a985828601613706565b92505060206139ba85828601613972565b9150509250929050565b5f602082840312156139d9576139d86136bc565b5b5f6139e684828501613972565b91505092915050565b5f8060408385031215613a0557613a046136bc565b5b5f613a1285828601613706565b9250506020613a2385828601613706565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613a7157607f821691505b602082108103613a8457613a83613a2d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613abe60208361361c565b9150613ac982613a8a565b602082019050919050565b5f6020820190508181035f830152613aeb81613ab2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613b298261371a565b9150613b348361371a565b9250828202613b428161371a565b91508282048414831517613b5957613b58613af2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613b978261371a565b9150613ba28361371a565b925082613bb257613bb1613b60565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b5f613c17602f8361361c565b9150613c2282613bbd565b604082019050919050565b5f6020820190508181035f830152613c4481613c0b565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f613ca560398361361c565b9150613cb082613c4b565b604082019050919050565b5f6020820190508181035f830152613cd281613c99565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f613d3360248361361c565b9150613d3e82613cd9565b604082019050919050565b5f6020820190508181035f830152613d6081613d27565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f613dc160358361361c565b9150613dcc82613d67565b604082019050919050565b5f6020820190508181035f830152613dee81613db5565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f613e4f60348361361c565b9150613e5a82613df5565b604082019050919050565b5f6020820190508181035f830152613e7c81613e43565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613edd60268361361c565b9150613ee882613e83565b604082019050919050565b5f6020820190508181035f830152613f0a81613ed1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613f6b60248361361c565b9150613f7682613f11565b604082019050919050565b5f6020820190508181035f830152613f9881613f5f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ff960228361361c565b915061400482613f9f565b604082019050919050565b5f6020820190508181035f83015261402681613fed565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61408760258361361c565b91506140928261402d565b604082019050919050565b5f6020820190508181035f8301526140b48161407b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61411560238361361c565b9150614120826140bb565b604082019050919050565b5f6020820190508181035f83015261414281614109565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f61417d60168361361c565b915061418882614149565b602082019050919050565b5f6020820190508181035f8301526141aa81614171565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c5f8201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b5f61423160498361361c565b915061423c826141b1565b606082019050919050565b5f6020820190508181035f83015261425e81614225565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f6142bf60358361361c565b91506142ca82614265565b604082019050919050565b5f6020820190508181035f8301526142ec816142b3565b9050919050565b5f6142fd8261371a565b91506143088361371a565b92508282019050808211156143205761431f613af2565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f61435a60138361361c565b915061436582614326565b602082019050919050565b5f6020820190508181035f8301526143878161434e565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6143e860368361361c565b91506143f38261438e565b604082019050919050565b5f6020820190508181035f830152614415816143dc565b9050919050565b5f6144268261371a565b91506144318361371a565b925082820390508181111561444957614448613af2565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f614483601b8361361c565b915061448e8261444f565b602082019050919050565b5f6020820190508181035f8301526144b081614477565b9050919050565b5f81905092915050565b50565b5f6144cf5f836144b7565b91506144da826144c1565b5f82019050919050565b5f6144ee826144c4565b9150819050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61455260218361361c565b915061455d826144f8565b604082019050919050565b5f6020820190508181035f83015261457f81614546565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506145ee816136f0565b92915050565b5f60208284031215614609576146086136bc565b5b5f614616848285016145e0565b91505092915050565b5f819050919050565b5f61464261463d6146388461461f565b6137e9565b61371a565b9050919050565b61465281614628565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61468a816136df565b82525050565b5f61469b8383614681565b60208301905092915050565b5f602082019050919050565b5f6146bd82614658565b6146c78185614662565b93506146d283614672565b805f5b838110156147025781516146e98882614690565b97506146f4836146a7565b9250506001810190506146d5565b5085935050505092915050565b5f60a0820190506147225f83018861385d565b61472f6020830187614649565b818103604083015261474181866146b3565b90506147506060830185613900565b61475d608083018461385d565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fab7b0cd85334cca1cd6fa7bae4af58c01644382c76d0292832b6a21d488bac364736f6c63430008140033

Deployed Bytecode

0x608060405260043610610280575f3560e01c80638da5cb5b1161014e578063c18bc195116100c0578063dd62ed3e11610079578063dd62ed3e14610997578063e2f45605146109d3578063e884f260146109fd578063eba4c33314610a27578063f2fde38b14610a4f578063f8b45b0514610a7757610287565b8063c18bc1951461088b578063c7574839146108b3578063c876d0b9146108dd578063c8c8ebe414610907578063d257b34f14610931578063d85ba0631461096d57610287565b8063a9059cbb11610112578063a9059cbb1461076d578063ae984d3f146107a9578063b0a548d1146107d3578063b62496f5146107fd578063bbc0c74214610839578063c02466681461086357610287565b80638da5cb5b1461068d578063924de9b7146106b757806395d89b41146106df5780639a7a23d614610709578063a457c2d71461073157610287565b806349bd5a5e116101f257806370a08231116101ab57806370a08231146105ab578063715018a6146105e757806371fc4688146105fd578063751039fc146106255780637571336a1461064f5780638a8c523c1461067757610287565b806349bd5a5e1461049d5780634a62bb65146104c75780634fbee193146104f15780636a486a8e1461052d5780636afda7e1146105575780636ddd17131461058157610287565b8063203e727e11610244578063203e727e1461038157806323b872dd146103a957806327c8f835146103e5578063313ce5671461040f578063395093511461043957806343828f081461047557610287565b806306fdde031461028b578063095ea7b3146102b557806310d5de53146102f15780631694505e1461032d57806318160ddd1461035757610287565b3661028757005b5f80fd5b348015610296575f80fd5b5061029f610aa1565b6040516102ac919061369c565b60405180910390f35b3480156102c0575f80fd5b506102db60048036038101906102d6919061374d565b610b31565b6040516102e891906137a5565b60405180910390f35b3480156102fc575f80fd5b50610317600480360381019061031291906137be565b610b4e565b60405161032491906137a5565b60405180910390f35b348015610338575f80fd5b50610341610b6b565b60405161034e9190613844565b60405180910390f35b348015610362575f80fd5b5061036b610b8f565b604051610378919061386c565b60405180910390f35b34801561038c575f80fd5b506103a760048036038101906103a29190613885565b610b98565b005b3480156103b4575f80fd5b506103cf60048036038101906103ca91906138b0565b610cc1565b6040516103dc91906137a5565b60405180910390f35b3480156103f0575f80fd5b506103f9610d95565b604051610406919061390f565b60405180910390f35b34801561041a575f80fd5b50610423610d9b565b6040516104309190613943565b60405180910390f35b348015610444575f80fd5b5061045f600480360381019061045a919061374d565b610da3565b60405161046c91906137a5565b60405180910390f35b348015610480575f80fd5b5061049b600480360381019061049691906137be565b610e51565b005b3480156104a8575f80fd5b506104b1610fa5565b6040516104be919061390f565b60405180910390f35b3480156104d2575f80fd5b506104db610fc9565b6040516104e891906137a5565b60405180910390f35b3480156104fc575f80fd5b50610517600480360381019061051291906137be565b610fdb565b60405161052491906137a5565b60405180910390f35b348015610538575f80fd5b5061054161102d565b60405161054e919061386c565b60405180910390f35b348015610562575f80fd5b5061056b611033565b604051610578919061386c565b60405180910390f35b34801561058c575f80fd5b50610595611039565b6040516105a291906137a5565b60405180910390f35b3480156105b6575f80fd5b506105d160048036038101906105cc91906137be565b61104c565b6040516105de919061386c565b60405180910390f35b3480156105f2575f80fd5b506105fb611091565b005b348015610608575f80fd5b50610623600480360381019061061e9190613885565b6111e4565b005b348015610630575f80fd5b5061063961128d565b60405161064691906137a5565b60405180910390f35b34801561065a575f80fd5b5061067560048036038101906106709190613986565b611344565b005b348015610682575f80fd5b5061068b611432565b005b348015610698575f80fd5b506106a1611500565b6040516106ae919061390f565b60405180910390f35b3480156106c2575f80fd5b506106dd60048036038101906106d891906139c4565b611528565b005b3480156106ea575f80fd5b506106f36115db565b604051610700919061369c565b60405180910390f35b348015610714575f80fd5b5061072f600480360381019061072a9190613986565b61166b565b005b34801561073c575f80fd5b506107576004803603810190610752919061374d565b61179d565b60405161076491906137a5565b60405180910390f35b348015610778575f80fd5b50610793600480360381019061078e919061374d565b611865565b6040516107a091906137a5565b60405180910390f35b3480156107b4575f80fd5b506107bd611882565b6040516107ca919061386c565b60405180910390f35b3480156107de575f80fd5b506107e7611888565b6040516107f4919061386c565b60405180910390f35b348015610808575f80fd5b50610823600480360381019061081e91906137be565b61188e565b60405161083091906137a5565b60405180910390f35b348015610844575f80fd5b5061084d6118ab565b60405161085a91906137a5565b60405180910390f35b34801561086e575f80fd5b5061088960048036038101906108849190613986565b6118be565b005b348015610896575f80fd5b506108b160048036038101906108ac9190613885565b6119fa565b005b3480156108be575f80fd5b506108c7611b23565b6040516108d4919061390f565b60405180910390f35b3480156108e8575f80fd5b506108f1611b48565b6040516108fe91906137a5565b60405180910390f35b348015610912575f80fd5b5061091b611b5a565b604051610928919061386c565b60405180910390f35b34801561093c575f80fd5b5061095760048036038101906109529190613885565b611b60565b60405161096491906137a5565b60405180910390f35b348015610978575f80fd5b50610981611cce565b60405161098e919061386c565b60405180910390f35b3480156109a2575f80fd5b506109bd60048036038101906109b891906139ef565b611cd4565b6040516109ca919061386c565b60405180910390f35b3480156109de575f80fd5b506109e7611d56565b6040516109f4919061386c565b60405180910390f35b348015610a08575f80fd5b50610a11611d5c565b604051610a1e91906137a5565b60405180910390f35b348015610a32575f80fd5b50610a4d6004803603810190610a489190613885565b611e13565b005b348015610a5a575f80fd5b50610a756004803603810190610a7091906137be565b611ebc565b005b348015610a82575f80fd5b50610a8b61207e565b604051610a98919061386c565b60405180910390f35b606060038054610ab090613a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610adc90613a5a565b8015610b275780601f10610afe57610100808354040283529160200191610b27565b820191905f5260205f20905b815481529060010190602001808311610b0a57829003601f168201915b5050505050905090565b5f610b44610b3d612084565b848461208b565b6001905092915050565b6013602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b610ba0612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590613ad4565b60405180910390fd5b670de0b6b3a76400006103e86001610c44610b8f565b610c4e9190613b1f565b610c589190613b8d565b610c629190613b8d565b811015610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613c2d565b60405180910390fd5b670de0b6b3a764000081610cb89190613b1f565b60078190555050565b5f610ccd84848461224e565b610d8a84610cd9612084565b610d858560405180606001604052806028815260200161478e6028913960015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610d3c612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b61208b565b600190509392505050565b61dead81565b5f6012905090565b5f610e47610daf612084565b84610e428560015f610dbf612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e3b90919063ffffffff16565b61208b565b6001905092915050565b610e59612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede90613ad4565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e93f456cc9a7cd16cdd07852911879883f53eb9b4643c9df90615542d46e95d60405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000ccb077434e16c92f9a79eeafce9414003f4bf22181565b600a5f9054906101000a900460ff1681565b5f60125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600f5481565b600e5481565b600a60029054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611099612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613ad4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6111ec612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613ad4565b60405180910390fd5b80600e81905550600e54600d8190555050565b5f611296612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613ad4565b60405180910390fd5b5f600a5f6101000a81548160ff0219169083151502179055506001905090565b61134c612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613ad4565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61143a612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf90613ad4565b60405180910390fd5b6001600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611530612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613ad4565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6060600480546115ea90613a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461161690613a5a565b80156116615780601f1061163857610100808354040283529160200191611661565b820191905f5260205f20905b81548152906001019060200180831161164457829003601f168201915b5050505050905090565b611673612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613ad4565b60405180910390fd5b7f000000000000000000000000ccb077434e16c92f9a79eeafce9414003f4bf22173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690613cbb565b60405180910390fd5b6117998282612e98565b5050565b5f61185b6117a9612084565b84611856856040518060600160405280602581526020016147b66025913960015f6117d2612084565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b61208b565b6001905092915050565b5f611878611871612084565b848461224e565b6001905092915050565b60115481565b60105481565b6014602052805f5260405f205f915054906101000a900460ff1681565b600a60019054906101000a900460ff1681565b6118c6612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613ad4565b60405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516119ee91906137a5565b60405180910390a25050565b611a02612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790613ad4565b60405180910390fd5b670de0b6b3a76400006103e86005611aa6610b8f565b611ab09190613b1f565b611aba9190613b8d565b611ac49190613b8d565b811015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90613d49565b60405180910390fd5b670de0b6b3a764000081611b1a9190613b1f565b60098190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5f9054906101000a900460ff1681565b60075481565b5f611b69612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613ad4565b60405180910390fd5b620186a06001611c05610b8f565b611c0f9190613b1f565b611c199190613b8d565b821015611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290613dd7565b60405180910390fd5b6103e86005611c68610b8f565b611c729190613b1f565b611c7c9190613b8d565b821115611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590613e65565b60405180910390fd5b8160088190555060019050919050565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b5f611d65612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90613ad4565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055506001905090565b611e1b612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090613ad4565b60405180910390fd5b80601081905550601054600f8190555050565b611ec4612084565b73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4990613ad4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613ef3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f090613f81565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e9061400f565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612241919061386c565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b39061409d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123219061412b565b60405180910390fd5b5f81036123415761233c83835f612f36565b612dd4565b600a5f9054906101000a900460ff16156129e85761235d611500565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123cb575061239b611500565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561240357505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561243d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156124565750600560149054906101000a900460ff16155b156129e757600a60019054906101000a900460ff1661254a5760125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061250a575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090614193565b60405180910390fd5b5b600c5f9054906101000a900460ff161561270d57612566611500565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125ed57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561264557507f000000000000000000000000ccb077434e16c92f9a79eeafce9414003f4bf22173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561270c5743600b5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614247565b60405180910390fd5b43600b5f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156127aa575060135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612851576007548111156127f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127eb906142d5565b60405180910390fd5b6009546128008361104c565b8261280b91906142f3565b111561284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614370565b60405180910390fd5b6129e6565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156128ee575060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561293d57600754811115612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f906143fe565b60405180910390fd5b6129e5565b60135f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166129e4576009546129978361104c565b826129a291906142f3565b11156129e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129da90614370565b60405180910390fd5b5b5b5b5b5b5f6129f23061104c565b90505f6008548210159050808015612a165750600a60029054906101000a900460ff165b8015612a2f5750600560149054906101000a900460ff16155b8015612a82575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612ad5575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612b28575060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612b6b576001600560146101000a81548160ff021916908315150217905550612b506131bf565b5f600560146101000a81548160ff0219169083151502179055505b5f600560149054906101000a900460ff1615905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612c1a575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612c23575f90505b5f8115612dc45760145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c8157505f600f54115b15612ce757612cae6064612ca0600f54886132b990919063ffffffff16565b61333090919063ffffffff16565b9050600f5460105482612cc19190613b1f565b612ccb9190613b8d565b60115f828254612cdb91906142f3565b92505081905550612da1565b60145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612d3e57505f600d54115b15612da057612d6b6064612d5d600d54886132b990919063ffffffff16565b61333090919063ffffffff16565b9050600d54600e5482612d7e9190613b1f565b612d889190613b8d565b60115f828254612d9891906142f3565b925050819055505b5b5f811115612db557612db4873083612f36565b5b8085612dc1919061441c565b94505b612dcf878787612f36565b505050505b505050565b5f838311158290612e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e17919061369c565b60405180910390fd5b505f8385612e2e919061441c565b9050809150509392505050565b5f808284612e4991906142f3565b905083811015612e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8590614499565b60405180910390fd5b8091505092915050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9b9061409d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613012576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130099061412b565b60405180910390fd5b61301d838383613379565b61308681604051806060016040528060268152602001614768602691395f808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612dd99092919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550613115815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e3b90919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131b2919061386c565b60405180910390a3505050565b5f6131c93061104c565b90505f60115490505f808314806131df57505f82145b156131ec575050506132b7565b60146008546131fb9190613b1f565b8311156132145760146008546132119190613b1f565b92505b5f8390506132218161337e565b5f60118190555060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161326d906144e4565b5f6040518083038185875af1925050503d805f81146132a7576040519150601f19603f3d011682016040523d82523d5f602084013e6132ac565b606091505b505080925050505050505b565b5f8083036132c9575f905061332a565b5f82846132d69190613b1f565b90508284826132e59190613b8d565b14613325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331c90614568565b60405180910390fd5b809150505b92915050565b5f61337183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135b1565b905092915050565b505050565b5f600267ffffffffffffffff81111561339a57613399614586565b5b6040519080825280602002602001820160405280156133c85781602001602082028036833780820191505090505b50905030815f815181106133df576133de6145b3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134a691906145f4565b816001815181106134ba576134b96145b3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061351f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461208b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040161358095949392919061470f565b5f604051808303815f87803b158015613597575f80fd5b505af11580156135a9573d5f803e3d5ffd5b505050505050565b5f80831182906135f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ee919061369c565b60405180910390fd5b505f83856136059190613b8d565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561364957808201518184015260208101905061362e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61366e82613612565b613678818561361c565b935061368881856020860161362c565b61369181613654565b840191505092915050565b5f6020820190508181035f8301526136b48184613664565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6136e9826136c0565b9050919050565b6136f9816136df565b8114613703575f80fd5b50565b5f81359050613714816136f0565b92915050565b5f819050919050565b61372c8161371a565b8114613736575f80fd5b50565b5f8135905061374781613723565b92915050565b5f8060408385031215613763576137626136bc565b5b5f61377085828601613706565b925050602061378185828601613739565b9150509250929050565b5f8115159050919050565b61379f8161378b565b82525050565b5f6020820190506137b85f830184613796565b92915050565b5f602082840312156137d3576137d26136bc565b5b5f6137e084828501613706565b91505092915050565b5f819050919050565b5f61380c613807613802846136c0565b6137e9565b6136c0565b9050919050565b5f61381d826137f2565b9050919050565b5f61382e82613813565b9050919050565b61383e81613824565b82525050565b5f6020820190506138575f830184613835565b92915050565b6138668161371a565b82525050565b5f60208201905061387f5f83018461385d565b92915050565b5f6020828403121561389a576138996136bc565b5b5f6138a784828501613739565b91505092915050565b5f805f606084860312156138c7576138c66136bc565b5b5f6138d486828701613706565b93505060206138e586828701613706565b92505060406138f686828701613739565b9150509250925092565b613909816136df565b82525050565b5f6020820190506139225f830184613900565b92915050565b5f60ff82169050919050565b61393d81613928565b82525050565b5f6020820190506139565f830184613934565b92915050565b6139658161378b565b811461396f575f80fd5b50565b5f813590506139808161395c565b92915050565b5f806040838503121561399c5761399b6136bc565b5b5f6139a985828601613706565b92505060206139ba85828601613972565b9150509250929050565b5f602082840312156139d9576139d86136bc565b5b5f6139e684828501613972565b91505092915050565b5f8060408385031215613a0557613a046136bc565b5b5f613a1285828601613706565b9250506020613a2385828601613706565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613a7157607f821691505b602082108103613a8457613a83613a2d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613abe60208361361c565b9150613ac982613a8a565b602082019050919050565b5f6020820190508181035f830152613aeb81613ab2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613b298261371a565b9150613b348361371a565b9250828202613b428161371a565b91508282048414831517613b5957613b58613af2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613b978261371a565b9150613ba28361371a565b925082613bb257613bb1613b60565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e74205f8201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b5f613c17602f8361361c565b9150613c2282613bbd565b604082019050919050565b5f6020820190508181035f830152613c4481613c0b565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f613ca560398361361c565b9150613cb082613c4b565b604082019050919050565b5f6020820190508181035f830152613cd281613c99565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b5f613d3360248361361c565b9150613d3e82613cd9565b604082019050919050565b5f6020820190508181035f830152613d6081613d27565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f613dc160358361361c565b9150613dcc82613d67565b604082019050919050565b5f6020820190508181035f830152613dee81613db5565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f613e4f60348361361c565b9150613e5a82613df5565b604082019050919050565b5f6020820190508181035f830152613e7c81613e43565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613edd60268361361c565b9150613ee882613e83565b604082019050919050565b5f6020820190508181035f830152613f0a81613ed1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613f6b60248361361c565b9150613f7682613f11565b604082019050919050565b5f6020820190508181035f830152613f9881613f5f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613ff960228361361c565b915061400482613f9f565b604082019050919050565b5f6020820190508181035f83015261402681613fed565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61408760258361361c565b91506140928261402d565b604082019050919050565b5f6020820190508181035f8301526140b48161407b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61411560238361361c565b9150614120826140bb565b604082019050919050565b5f6020820190508181035f83015261414281614109565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f61417d60168361361c565b915061418882614149565b602082019050919050565b5f6020820190508181035f8301526141aa81614171565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c5f8201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b5f61423160498361361c565b915061423c826141b1565b606082019050919050565b5f6020820190508181035f83015261425e81614225565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f6142bf60358361361c565b91506142ca82614265565b604082019050919050565b5f6020820190508181035f8301526142ec816142b3565b9050919050565b5f6142fd8261371a565b91506143088361371a565b92508282019050808211156143205761431f613af2565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f61435a60138361361c565b915061436582614326565b602082019050919050565b5f6020820190508181035f8301526143878161434e565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6143e860368361361c565b91506143f38261438e565b604082019050919050565b5f6020820190508181035f830152614415816143dc565b9050919050565b5f6144268261371a565b91506144318361371a565b925082820390508181111561444957614448613af2565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f614483601b8361361c565b915061448e8261444f565b602082019050919050565b5f6020820190508181035f8301526144b081614477565b9050919050565b5f81905092915050565b50565b5f6144cf5f836144b7565b91506144da826144c1565b5f82019050919050565b5f6144ee826144c4565b9150819050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61455260218361361c565b915061455d826144f8565b604082019050919050565b5f6020820190508181035f83015261457f81614546565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506145ee816136f0565b92915050565b5f60208284031215614609576146086136bc565b5b5f614616848285016145e0565b91505092915050565b5f819050919050565b5f61464261463d6146388461461f565b6137e9565b61371a565b9050919050565b61465281614628565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61468a816136df565b82525050565b5f61469b8383614681565b60208301905092915050565b5f602082019050919050565b5f6146bd82614658565b6146c78185614662565b93506146d283614672565b805f5b838110156147025781516146e98882614690565b97506146f4836146a7565b9250506001810190506146d5565b5085935050505092915050565b5f60a0820190506147225f83018861385d565b61472f6020830187614649565b818103604083015261474181866146b3565b90506147506060830185613900565b61475d608083018461385d565b969550505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fab7b0cd85334cca1cd6fa7bae4af58c01644382c76d0292832b6a21d488bac364736f6c63430008140033

Deployed Bytecode Sourcemap

29434:12853:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7590:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9757:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30590:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29516:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8710:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34292:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10408:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29619:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11172:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36164:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29574:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29869:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36426:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30306:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30254:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29949:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8881:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:148;;;;;;;;;;;;;:::i;:::-;;35118:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33505:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34761:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33337:112;;;;;;;;;;;;;:::i;:::-;;21413:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35005:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7809:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35716:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11893:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9221:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30394:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30341:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30812:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29909:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35526:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34534:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29711:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30172:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29754:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33899:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30220:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9459:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29796:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33690:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35322:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22358:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29836:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7590:100;7644:13;7677:5;7670:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7590:100;:::o;9757:169::-;9840:4;9857:39;9866:12;:10;:12::i;:::-;9880:7;9889:6;9857:8;:39::i;:::-;9914:4;9907:11;;9757:169;;;;:::o;30590:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;29516:51::-;;;:::o;8710:108::-;8771:7;8798:12;;8791:19;;8710:108;:::o;34292:234::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34411:4:::1;34405;34401:1;34385:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;34384:31;;;;:::i;:::-;34374:6;:41;;34366:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;34511:6;34501;:17;;;;:::i;:::-;34478:20;:40;;;;34292:234:::0;:::o;10408:355::-;10548:4;10565:36;10575:6;10583:9;10594:6;10565:9;:36::i;:::-;10612:121;10621:6;10629:12;:10;:12::i;:::-;10643:89;10681:6;10643:89;;;;;;;;;;;;;;;;;:11;:19;10655:6;10643:19;;;;;;;;;;;;;;;:33;10663:12;:10;:12::i;:::-;10643:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;10612:8;:121::i;:::-;10751:4;10744:11;;10408:355;;;;;:::o;29619:53::-;29665:6;29619:53;:::o;8552:93::-;8610:5;8635:2;8628:9;;8552:93;:::o;11172:218::-;11260:4;11277:83;11286:12;:10;:12::i;:::-;11300:7;11309:50;11348:10;11309:11;:25;11321:12;:10;:12::i;:::-;11309:25;;;;;;;;;;;;;;;:34;11335:7;11309:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;11277:8;:83::i;:::-;11378:4;11371:11;;11172:218;;;;:::o;36164:244::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36328:15:::1;;;;;;;;;;;36276:68;;36299:27;36276:68;;;;;;;;;;;;36373:27;36355:15;;:45;;;;;;;;;;;;;;;;;;36164:244:::0;:::o;29574:38::-;;;:::o;29869:33::-;;;;;;;;;;;;;:::o;36426:125::-;36491:4;36515:19;:28;36535:7;36515:28;;;;;;;;;;;;;;;;;;;;;;;;;36508:35;;36426:125;;;:::o;30306:28::-;;;;:::o;30254:39::-;;;;:::o;29949:31::-;;;;;;;;;;;;;:::o;8881:127::-;8955:7;8982:9;:18;8992:7;8982:18;;;;;;;;;;;;;;;;8975:25;;8881:127;;;:::o;22055:148::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22162:1:::1;22125:40;;22146:6;;;;;;;;;;;22125:40;;;;;;;;;;;;22193:1;22176:6;;:19;;;;;;;;;;;;;;;;;;22055:148::o:0;35118:192::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35230:22:::1;35203:24;:49;;;;35278:24;;35263:12;:39;;;;35118:192:::0;:::o;33505:120::-;33557:4;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33590:5:::1;33573:14;;:22;;;;;;;;;;;;;;;;;;33613:4;33606:11;;33505:120:::0;:::o;34761:144::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34893:4:::1;34851:31;:39;34883:6;34851:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34761:144:::0;;:::o;33337:112::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33408:4:::1;33392:13;;:20;;;;;;;;;;;;;;;;;;33437:4;33423:11;;:18;;;;;;;;;;;;;;;;;;33337:112::o:0;21413:79::-;21451:7;21478:6;;;;;;;;;;;21471:13;;21413:79;:::o;35005:101::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35091:7:::1;35077:11;;:21;;;;;;;;;;;;;;;;;;35005:101:::0;:::o;7809:104::-;7865:13;7898:7;7891:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7809:104;:::o;35716:244::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35823:13:::1;35815:21;;:4;:21;;::::0;35807:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35911:41;35940:4;35946:5;35911:28;:41::i;:::-;35716:244:::0;;:::o;11893:269::-;11986:4;12003:129;12012:12;:10;:12::i;:::-;12026:7;12035:96;12074:15;12035:96;;;;;;;;;;;;;;;;;:11;:25;12047:12;:10;:12::i;:::-;12035:25;;;;;;;;;;;;;;;:34;12061:7;12035:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;12003:8;:129::i;:::-;12150:4;12143:11;;11893:269;;;;:::o;9221:175::-;9307:4;9324:42;9334:12;:10;:12::i;:::-;9348:9;9359:6;9324:9;:42::i;:::-;9384:4;9377:11;;9221:175;;;;:::o;30394:42::-;;;;:::o;30341:40::-;;;;:::o;30812:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;29909:33::-;;;;;;;;;;;;;:::o;35526:182::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35642:8:::1;35611:19;:28;35631:7;35611:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35682:7;35666:34;;;35691:8;35666:34;;;;;;:::i;:::-;;;;;;;;35526:182:::0;;:::o;34534:215::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34656:4:::1;34650;34646:1;34630:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;34629:31;;;;:::i;:::-;34619:6;:41;;34611:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;34734:6;34724;:17;;;;:::i;:::-;34712:9;:29;;;;34534:215:::0;:::o;29711:30::-;;;;;;;;;;;;;:::o;30172:39::-;;;;;;;;;;;;;:::o;29754:35::-;;;;:::o;33899:381::-;33980:4;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34036:6:::1;34032:1;34016:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;34003:9;:39;;33995:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;34151:4;34147:1;34131:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;34118:9;:37;;34110:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;34243:9;34222:18;:30;;;;34269:4;34262:11;;33899:381:::0;;;:::o;30220:27::-;;;;:::o;9459:151::-;9548:7;9575:11;:18;9587:5;9575:18;;;;;;;;;;;;;;;:27;9594:7;9575:27;;;;;;;;;;;;;;;;9568:34;;9459:151;;;;:::o;29796:33::-;;;;:::o;33690:134::-;33750:4;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33789:5:::1;33766:20;;:28;;;;;;;;;;;;;;;;;;33812:4;33805:11;;33690:134:::0;:::o;35322:196::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35436:22:::1;35408:25;:50;;;;35485:25;;35469:13;:41;;;;35322:196:::0;:::o;22358:244::-;21635:12;:10;:12::i;:::-;21625:22;;:6;;;;;;;;;;;:22;;;21617:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22467:1:::1;22447:22;;:8;:22;;::::0;22439:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22557:8;22528:38;;22549:6;;;;;;;;;;;22528:38;;;;;;;;;;;;22586:8;22577:6;;:17;;;;;;;;;;;;;;;;;;22358:244:::0;:::o;29836:24::-;;;;:::o;226:98::-;279:7;306:10;299:17;;226:98;:::o;15079:380::-;15232:1;15215:19;;:5;:19;;;15207:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15313:1;15294:21;;:7;:21;;;15286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15397:6;15367:11;:18;15379:5;15367:18;;;;;;;;;;;;;;;:27;15386:7;15367:27;;;;;;;;;;;;;;;:36;;;;15435:7;15419:32;;15428:5;15419:32;;;15444:6;15419:32;;;;;;:::i;:::-;;;;;;;;15079:380;;;:::o;36563:3891::-;36711:1;36695:18;;:4;:18;;;36687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36788:1;36774:16;;:2;:16;;;36766:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36865:1;36855:6;:11;36852:92;;36883:28;36899:4;36905:2;36909:1;36883:15;:28::i;:::-;36926:7;;36852:92;36967:14;;;;;;;;;;;36964:1841;;;37027:7;:5;:7::i;:::-;37019:15;;:4;:15;;;;:49;;;;;37061:7;:5;:7::i;:::-;37055:13;;:2;:13;;;;37019:49;:86;;;;;37103:1;37089:16;;:2;:16;;;;37019:86;:128;;;;;37140:6;37126:21;;:2;:21;;;;37019:128;:158;;;;;37169:8;;;;;;;;;;;37168:9;37019:158;36997:1797;;;37215:13;;;;;;;;;;;37211:148;;37260:19;:25;37280:4;37260:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;37289:19;:23;37309:2;37289:23;;;;;;;;;;;;;;;;;;;;;;;;;37260:52;37252:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37211:148;37517:20;;;;;;;;;;;37513:423;;;37571:7;:5;:7::i;:::-;37565:13;;:2;:13;;;;:47;;;;;37596:15;37582:30;;:2;:30;;;;37565:47;:79;;;;;37630:13;37616:28;;:2;:28;;;;37565:79;37561:356;;;37722:12;37680:28;:39;37709:9;37680:39;;;;;;;;;;;;;;;;:54;37672:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;37881:12;37839:28;:39;37868:9;37839:39;;;;;;;;;;;;;;;:54;;;;37561:356;37513:423;38005:25;:31;38031:4;38005:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;38041:31;:35;38073:2;38041:35;;;;;;;;;;;;;;;;;;;;;;;;;38040:36;38005:71;38001:778;;;38123:20;;38113:6;:30;;38105:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;38262:9;;38245:13;38255:2;38245:9;:13::i;:::-;38236:6;:22;;;;:::i;:::-;:35;;38228:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38001:778;;;38389:25;:29;38415:2;38389:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;38423:31;:37;38455:4;38423:37;;;;;;;;;;;;;;;;;;;;;;;;;38422:38;38389:71;38385:394;;;38507:20;;38497:6;:30;;38489:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;38385:394;;;38633:31;:35;38665:2;38633:35;;;;;;;;;;;;;;;;;;;;;;;;;38629:150;;38726:9;;38709:13;38719:2;38709:9;:13::i;:::-;38700:6;:22;;;;:::i;:::-;:35;;38692:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38629:150;38385:394;38001:778;36997:1797;36964:1841;38839:28;38870:24;38888:4;38870:9;:24::i;:::-;38839:55;;38915:12;38954:18;;38930:20;:42;;38915:57;;39003:7;:35;;;;;39027:11;;;;;;;;;;;39003:35;:61;;;;;39056:8;;;;;;;;;;;39055:9;39003:61;:110;;;;;39082:25;:31;39108:4;39082:31;;;;;;;;;;;;;;;;;;;;;;;;;39081:32;39003:110;:153;;;;;39131:19;:25;39151:4;39131:25;;;;;;;;;;;;;;;;;;;;;;;;;39130:26;39003:153;:194;;;;;39174:19;:23;39194:2;39174:23;;;;;;;;;;;;;;;;;;;;;;;;;39173:24;39003:194;38985:338;;;39235:4;39224:8;;:15;;;;;;;;;;;;;;;;;;39268:10;:8;:10::i;:::-;39306:5;39295:8;;:16;;;;;;;;;;;;;;;;;;38985:338;39345:12;39361:8;;;;;;;;;;;39360:9;39345:24;;39470:19;:25;39490:4;39470:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;39499:19;:23;39519:2;39499:23;;;;;;;;;;;;;;;;;;;;;;;;;39470:52;39467:99;;;39549:5;39539:15;;39467:99;39586:12;39690:7;39687:714;;;39741:25;:29;39767:2;39741:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;39790:1;39774:13;;:17;39741:50;39737:495;;;39818:34;39848:3;39818:25;39829:13;;39818:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;39811:41;;39937:13;;39909:25;;39902:4;:32;;;;:::i;:::-;:48;;;;:::i;:::-;39871:27;;:79;;;;;;;:::i;:::-;;;;;;;;39737:495;;;40011:25;:31;40037:4;40011:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;40061:1;40046:12;;:16;40011:51;40008:224;;;40087:33;40116:3;40087:24;40098:12;;40087:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;40080:40;;40204:12;;40177:24;;40170:4;:31;;;;:::i;:::-;:46;;;;:::i;:::-;40139:27;;:77;;;;;;;:::i;:::-;;;;;;;;40008:224;39737:495;40270:1;40263:4;:8;40260:93;;;40295:42;40311:4;40325;40332;40295:15;:42::i;:::-;40260:93;40385:4;40375:14;;;;;:::i;:::-;;;39687:714;40413:33;40429:4;40435:2;40439:6;40413:15;:33::i;:::-;36676:3778;;;;36563:3891;;;;:::o;17360:192::-;17446:7;17479:1;17474;:6;;17482:12;17466:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17506:9;17522:1;17518;:5;;;;:::i;:::-;17506:17;;17543:1;17536:8;;;17360:192;;;;;:::o;16457:181::-;16515:7;16535:9;16551:1;16547;:5;;;;:::i;:::-;16535:17;;16576:1;16571;:6;;16563:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;16629:1;16622:8;;;16457:181;;;;:::o;35968:188::-;36085:5;36051:25;:31;36077:4;36051:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36142:5;36108:40;;36136:4;36108:40;;;;;;;;;;;;35968:188;;:::o;12652:573::-;12810:1;12792:20;;:6;:20;;;12784:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12894:1;12873:23;;:9;:23;;;12865:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12949:47;12970:6;12978:9;12989:6;12949:20;:47::i;:::-;13029:71;13051:6;13029:71;;;;;;;;;;;;;;;;;:9;:17;13039:6;13029:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;13009:9;:17;13019:6;13009:17;;;;;;;;;;;;;;;:91;;;;13134:32;13159:6;13134:9;:20;13144:9;13134:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;13111:9;:20;13121:9;13111:20;;;;;;;;;;;;;;;:55;;;;13199:9;13182:35;;13191:6;13182:35;;;13210:6;13182:35;;;;;;:::i;:::-;;;;;;;;12652:573;;;:::o;41600:678::-;41639:23;41665:24;41683:4;41665:9;:24::i;:::-;41639:50;;41700:25;41728:27;;41700:55;;41766:12;41821:1;41802:15;:20;:46;;;;41847:1;41826:17;:22;41802:46;41799:60;;;41851:7;;;;;41799:60;41911:2;41890:18;;:23;;;;:::i;:::-;41872:15;:41;41869:111;;;41966:2;41945:18;;:23;;;;:::i;:::-;41927:41;;41869:111;42049:26;42078:15;42049:44;;42104:36;42121:18;42104:16;:36::i;:::-;42182:1;42152:27;:31;;;;42215:15;;;;;;;;;;;42207:29;;42244:21;42207:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42194:76;;;;;41628:650;;;;41600:678;:::o;17811:471::-;17869:7;18119:1;18114;:6;18110:47;;18144:1;18137:8;;;;18110:47;18169:9;18185:1;18181;:5;;;;:::i;:::-;18169:17;;18214:1;18209;18205;:5;;;;:::i;:::-;:10;18197:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;18273:1;18266:8;;;17811:471;;;;;:::o;18758:132::-;18816:7;18843:39;18847:1;18850;18843:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;18836:46;;18758:132;;;;:::o;16062:125::-;;;;:::o;40462:601::-;40590:21;40628:1;40614:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40590:40;;40659:4;40641;40646:1;40641:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;40685:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40675:4;40680:1;40675:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;40720:62;40737:4;40752:15;40770:11;40720:8;:62::i;:::-;40821:15;:66;;;40902:11;40928:1;40972:4;40999;41019:15;40821:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40517:546;40462:601;:::o;19386:278::-;19472:7;19504:1;19500;:5;19507:12;19492:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19531:9;19547:1;19543;:5;;;;:::i;:::-;19531:17;;19655:1;19648:8;;;19386:278;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:60::-;3809:3;3830:5;3823:12;;3781:60;;;:::o;3847:142::-;3897:9;3930:53;3948:34;3957:24;3975:5;3957:24;:::i;:::-;3948:34;:::i;:::-;3930:53;:::i;:::-;3917:66;;3847:142;;;:::o;3995:126::-;4045:9;4078:37;4109:5;4078:37;:::i;:::-;4065:50;;3995:126;;;:::o;4127:153::-;4204:9;4237:37;4268:5;4237:37;:::i;:::-;4224:50;;4127:153;;;:::o;4286:185::-;4400:64;4458:5;4400:64;:::i;:::-;4395:3;4388:77;4286:185;;:::o;4477:276::-;4597:4;4635:2;4624:9;4620:18;4612:26;;4648:98;4743:1;4732:9;4728:17;4719:6;4648:98;:::i;:::-;4477:276;;;;:::o;4759:118::-;4846:24;4864:5;4846:24;:::i;:::-;4841:3;4834:37;4759:118;;:::o;4883:222::-;4976:4;5014:2;5003:9;4999:18;4991:26;;5027:71;5095:1;5084:9;5080:17;5071:6;5027:71;:::i;:::-;4883:222;;;;:::o;5111:329::-;5170:6;5219:2;5207:9;5198:7;5194:23;5190:32;5187:119;;;5225:79;;:::i;:::-;5187:119;5345:1;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5316:117;5111:329;;;;:::o;5446:619::-;5523:6;5531;5539;5588:2;5576:9;5567:7;5563:23;5559:32;5556:119;;;5594:79;;:::i;:::-;5556:119;5714:1;5739:53;5784:7;5775:6;5764:9;5760:22;5739:53;:::i;:::-;5729:63;;5685:117;5841:2;5867:53;5912:7;5903:6;5892:9;5888:22;5867:53;:::i;:::-;5857:63;;5812:118;5969:2;5995:53;6040:7;6031:6;6020:9;6016:22;5995:53;:::i;:::-;5985:63;;5940:118;5446:619;;;;;:::o;6071:118::-;6158:24;6176:5;6158:24;:::i;:::-;6153:3;6146:37;6071:118;;:::o;6195:222::-;6288:4;6326:2;6315:9;6311:18;6303:26;;6339:71;6407:1;6396:9;6392:17;6383:6;6339:71;:::i;:::-;6195:222;;;;:::o;6423:86::-;6458:7;6498:4;6491:5;6487:16;6476:27;;6423:86;;;:::o;6515:112::-;6598:22;6614:5;6598:22;:::i;:::-;6593:3;6586:35;6515:112;;:::o;6633:214::-;6722:4;6760:2;6749:9;6745:18;6737:26;;6773:67;6837:1;6826:9;6822:17;6813:6;6773:67;:::i;:::-;6633:214;;;;:::o;6853:116::-;6923:21;6938:5;6923:21;:::i;:::-;6916:5;6913:32;6903:60;;6959:1;6956;6949:12;6903:60;6853:116;:::o;6975:133::-;7018:5;7056:6;7043:20;7034:29;;7072:30;7096:5;7072:30;:::i;:::-;6975:133;;;;:::o;7114:468::-;7179:6;7187;7236:2;7224:9;7215:7;7211:23;7207:32;7204:119;;;7242:79;;:::i;:::-;7204:119;7362:1;7387:53;7432:7;7423:6;7412:9;7408:22;7387:53;:::i;:::-;7377:63;;7333:117;7489:2;7515:50;7557:7;7548:6;7537:9;7533:22;7515:50;:::i;:::-;7505:60;;7460:115;7114:468;;;;;:::o;7588:323::-;7644:6;7693:2;7681:9;7672:7;7668:23;7664:32;7661:119;;;7699:79;;:::i;:::-;7661:119;7819:1;7844:50;7886:7;7877:6;7866:9;7862:22;7844:50;:::i;:::-;7834:60;;7790:114;7588:323;;;;:::o;7917:474::-;7985:6;7993;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;8295:2;8321:53;8366:7;8357:6;8346:9;8342:22;8321:53;:::i;:::-;8311:63;;8266:118;7917:474;;;;;:::o;8397:180::-;8445:77;8442:1;8435:88;8542:4;8539:1;8532:15;8566:4;8563:1;8556:15;8583:320;8627:6;8664:1;8658:4;8654:12;8644:22;;8711:1;8705:4;8701:12;8732:18;8722:81;;8788:4;8780:6;8776:17;8766:27;;8722:81;8850:2;8842:6;8839:14;8819:18;8816:38;8813:84;;8869:18;;:::i;:::-;8813:84;8634:269;8583:320;;;:::o;8909:182::-;9049:34;9045:1;9037:6;9033:14;9026:58;8909:182;:::o;9097:366::-;9239:3;9260:67;9324:2;9319:3;9260:67;:::i;:::-;9253:74;;9336:93;9425:3;9336:93;:::i;:::-;9454:2;9449:3;9445:12;9438:19;;9097:366;;;:::o;9469:419::-;9635:4;9673:2;9662:9;9658:18;9650:26;;9722:9;9716:4;9712:20;9708:1;9697:9;9693:17;9686:47;9750:131;9876:4;9750:131;:::i;:::-;9742:139;;9469:419;;;:::o;9894:180::-;9942:77;9939:1;9932:88;10039:4;10036:1;10029:15;10063:4;10060:1;10053:15;10080:410;10120:7;10143:20;10161:1;10143:20;:::i;:::-;10138:25;;10177:20;10195:1;10177:20;:::i;:::-;10172:25;;10232:1;10229;10225:9;10254:30;10272:11;10254:30;:::i;:::-;10243:41;;10433:1;10424:7;10420:15;10417:1;10414:22;10394:1;10387:9;10367:83;10344:139;;10463:18;;:::i;:::-;10344:139;10128:362;10080:410;;;;:::o;10496:180::-;10544:77;10541:1;10534:88;10641:4;10638:1;10631:15;10665:4;10662:1;10655:15;10682:185;10722:1;10739:20;10757:1;10739:20;:::i;:::-;10734:25;;10773:20;10791:1;10773:20;:::i;:::-;10768:25;;10812:1;10802:35;;10817:18;;:::i;:::-;10802:35;10859:1;10856;10852:9;10847:14;;10682:185;;;;:::o;10873:234::-;11013:34;11009:1;11001:6;10997:14;10990:58;11082:17;11077:2;11069:6;11065:15;11058:42;10873:234;:::o;11113:366::-;11255:3;11276:67;11340:2;11335:3;11276:67;:::i;:::-;11269:74;;11352:93;11441:3;11352:93;:::i;:::-;11470:2;11465:3;11461:12;11454:19;;11113:366;;;:::o;11485:419::-;11651:4;11689:2;11678:9;11674:18;11666:26;;11738:9;11732:4;11728:20;11724:1;11713:9;11709:17;11702:47;11766:131;11892:4;11766:131;:::i;:::-;11758:139;;11485:419;;;:::o;11910:244::-;12050:34;12046:1;12038:6;12034:14;12027:58;12119:27;12114:2;12106:6;12102:15;12095:52;11910:244;:::o;12160:366::-;12302:3;12323:67;12387:2;12382:3;12323:67;:::i;:::-;12316:74;;12399:93;12488:3;12399:93;:::i;:::-;12517:2;12512:3;12508:12;12501:19;;12160:366;;;:::o;12532:419::-;12698:4;12736:2;12725:9;12721:18;12713:26;;12785:9;12779:4;12775:20;12771:1;12760:9;12756:17;12749:47;12813:131;12939:4;12813:131;:::i;:::-;12805:139;;12532:419;;;:::o;12957:223::-;13097:34;13093:1;13085:6;13081:14;13074:58;13166:6;13161:2;13153:6;13149:15;13142:31;12957:223;:::o;13186:366::-;13328:3;13349:67;13413:2;13408:3;13349:67;:::i;:::-;13342:74;;13425:93;13514:3;13425:93;:::i;:::-;13543:2;13538:3;13534:12;13527:19;;13186:366;;;:::o;13558:419::-;13724:4;13762:2;13751:9;13747:18;13739:26;;13811:9;13805:4;13801:20;13797:1;13786:9;13782:17;13775:47;13839:131;13965:4;13839:131;:::i;:::-;13831:139;;13558:419;;;:::o;13983:240::-;14123:34;14119:1;14111:6;14107:14;14100:58;14192:23;14187:2;14179:6;14175:15;14168:48;13983:240;:::o;14229:366::-;14371:3;14392:67;14456:2;14451:3;14392:67;:::i;:::-;14385:74;;14468:93;14557:3;14468:93;:::i;:::-;14586:2;14581:3;14577:12;14570:19;;14229:366;;;:::o;14601:419::-;14767:4;14805:2;14794:9;14790:18;14782:26;;14854:9;14848:4;14844:20;14840:1;14829:9;14825:17;14818:47;14882:131;15008:4;14882:131;:::i;:::-;14874:139;;14601:419;;;:::o;15026:239::-;15166:34;15162:1;15154:6;15150:14;15143:58;15235:22;15230:2;15222:6;15218:15;15211:47;15026:239;:::o;15271:366::-;15413:3;15434:67;15498:2;15493:3;15434:67;:::i;:::-;15427:74;;15510:93;15599:3;15510:93;:::i;:::-;15628:2;15623:3;15619:12;15612:19;;15271:366;;;:::o;15643:419::-;15809:4;15847:2;15836:9;15832:18;15824:26;;15896:9;15890:4;15886:20;15882:1;15871:9;15867:17;15860:47;15924:131;16050:4;15924:131;:::i;:::-;15916:139;;15643:419;;;:::o;16068:225::-;16208:34;16204:1;16196:6;16192:14;16185:58;16277:8;16272:2;16264:6;16260:15;16253:33;16068:225;:::o;16299:366::-;16441:3;16462:67;16526:2;16521:3;16462:67;:::i;:::-;16455:74;;16538:93;16627:3;16538:93;:::i;:::-;16656:2;16651:3;16647:12;16640:19;;16299:366;;;:::o;16671:419::-;16837:4;16875:2;16864:9;16860:18;16852:26;;16924:9;16918:4;16914:20;16910:1;16899:9;16895:17;16888:47;16952:131;17078:4;16952:131;:::i;:::-;16944:139;;16671:419;;;:::o;17096:223::-;17236:34;17232:1;17224:6;17220:14;17213:58;17305:6;17300:2;17292:6;17288:15;17281:31;17096:223;:::o;17325:366::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:419::-;17863:4;17901:2;17890:9;17886:18;17878:26;;17950:9;17944:4;17940:20;17936:1;17925:9;17921:17;17914:47;17978:131;18104:4;17978:131;:::i;:::-;17970:139;;17697:419;;;:::o;18122:221::-;18262:34;18258:1;18250:6;18246:14;18239:58;18331:4;18326:2;18318:6;18314:15;18307:29;18122:221;:::o;18349:366::-;18491:3;18512:67;18576:2;18571:3;18512:67;:::i;:::-;18505:74;;18588:93;18677:3;18588:93;:::i;:::-;18706:2;18701:3;18697:12;18690:19;;18349:366;;;:::o;18721:419::-;18887:4;18925:2;18914:9;18910:18;18902:26;;18974:9;18968:4;18964:20;18960:1;18949:9;18945:17;18938:47;19002:131;19128:4;19002:131;:::i;:::-;18994:139;;18721:419;;;:::o;19146:224::-;19286:34;19282:1;19274:6;19270:14;19263:58;19355:7;19350:2;19342:6;19338:15;19331:32;19146:224;:::o;19376:366::-;19518:3;19539:67;19603:2;19598:3;19539:67;:::i;:::-;19532:74;;19615:93;19704:3;19615:93;:::i;:::-;19733:2;19728:3;19724:12;19717:19;;19376:366;;;:::o;19748:419::-;19914:4;19952:2;19941:9;19937:18;19929:26;;20001:9;19995:4;19991:20;19987:1;19976:9;19972:17;19965:47;20029:131;20155:4;20029:131;:::i;:::-;20021:139;;19748:419;;;:::o;20173:222::-;20313:34;20309:1;20301:6;20297:14;20290:58;20382:5;20377:2;20369:6;20365:15;20358:30;20173:222;:::o;20401:366::-;20543:3;20564:67;20628:2;20623:3;20564:67;:::i;:::-;20557:74;;20640:93;20729:3;20640:93;:::i;:::-;20758:2;20753:3;20749:12;20742:19;;20401:366;;;:::o;20773:419::-;20939:4;20977:2;20966:9;20962:18;20954:26;;21026:9;21020:4;21016:20;21012:1;21001:9;20997:17;20990:47;21054:131;21180:4;21054:131;:::i;:::-;21046:139;;20773:419;;;:::o;21198:172::-;21338:24;21334:1;21326:6;21322:14;21315:48;21198:172;:::o;21376:366::-;21518:3;21539:67;21603:2;21598:3;21539:67;:::i;:::-;21532:74;;21615:93;21704:3;21615:93;:::i;:::-;21733:2;21728:3;21724:12;21717:19;;21376:366;;;:::o;21748:419::-;21914:4;21952:2;21941:9;21937:18;21929:26;;22001:9;21995:4;21991:20;21987:1;21976:9;21972:17;21965:47;22029:131;22155:4;22029:131;:::i;:::-;22021:139;;21748:419;;;:::o;22173:297::-;22313:34;22309:1;22301:6;22297:14;22290:58;22382:34;22377:2;22369:6;22365:15;22358:59;22451:11;22446:2;22438:6;22434:15;22427:36;22173:297;:::o;22476:366::-;22618:3;22639:67;22703:2;22698:3;22639:67;:::i;:::-;22632:74;;22715:93;22804:3;22715:93;:::i;:::-;22833:2;22828:3;22824:12;22817:19;;22476:366;;;:::o;22848:419::-;23014:4;23052:2;23041:9;23037:18;23029:26;;23101:9;23095:4;23091:20;23087:1;23076:9;23072:17;23065:47;23129:131;23255:4;23129:131;:::i;:::-;23121:139;;22848:419;;;:::o;23273:240::-;23413:34;23409:1;23401:6;23397:14;23390:58;23482:23;23477:2;23469:6;23465:15;23458:48;23273:240;:::o;23519:366::-;23661:3;23682:67;23746:2;23741:3;23682:67;:::i;:::-;23675:74;;23758:93;23847:3;23758:93;:::i;:::-;23876:2;23871:3;23867:12;23860:19;;23519:366;;;:::o;23891:419::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:191::-;24356:3;24375:20;24393:1;24375:20;:::i;:::-;24370:25;;24409:20;24427:1;24409:20;:::i;:::-;24404:25;;24452:1;24449;24445:9;24438:16;;24473:3;24470:1;24467:10;24464:36;;;24480:18;;:::i;:::-;24464:36;24316:191;;;;:::o;24513:169::-;24653:21;24649:1;24641:6;24637:14;24630:45;24513:169;:::o;24688:366::-;24830:3;24851:67;24915:2;24910:3;24851:67;:::i;:::-;24844:74;;24927:93;25016:3;24927:93;:::i;:::-;25045:2;25040:3;25036:12;25029:19;;24688:366;;;:::o;25060:419::-;25226:4;25264:2;25253:9;25249:18;25241:26;;25313:9;25307:4;25303:20;25299:1;25288:9;25284:17;25277:47;25341:131;25467:4;25341:131;:::i;:::-;25333:139;;25060:419;;;:::o;25485:241::-;25625:34;25621:1;25613:6;25609:14;25602:58;25694:24;25689:2;25681:6;25677:15;25670:49;25485:241;:::o;25732:366::-;25874:3;25895:67;25959:2;25954:3;25895:67;:::i;:::-;25888:74;;25971:93;26060:3;25971:93;:::i;:::-;26089:2;26084:3;26080:12;26073:19;;25732:366;;;:::o;26104:419::-;26270:4;26308:2;26297:9;26293:18;26285:26;;26357:9;26351:4;26347:20;26343:1;26332:9;26328:17;26321:47;26385:131;26511:4;26385:131;:::i;:::-;26377:139;;26104:419;;;:::o;26529:194::-;26569:4;26589:20;26607:1;26589:20;:::i;:::-;26584:25;;26623:20;26641:1;26623:20;:::i;:::-;26618:25;;26667:1;26664;26660:9;26652:17;;26691:1;26685:4;26682:11;26679:37;;;26696:18;;:::i;:::-;26679:37;26529:194;;;;:::o;26729:177::-;26869:29;26865:1;26857:6;26853:14;26846:53;26729:177;:::o;26912:366::-;27054:3;27075:67;27139:2;27134:3;27075:67;:::i;:::-;27068:74;;27151:93;27240:3;27151:93;:::i;:::-;27269:2;27264:3;27260:12;27253:19;;26912:366;;;:::o;27284:419::-;27450:4;27488:2;27477:9;27473:18;27465:26;;27537:9;27531:4;27527:20;27523:1;27512:9;27508:17;27501:47;27565:131;27691:4;27565:131;:::i;:::-;27557:139;;27284:419;;;:::o;27709:147::-;27810:11;27847:3;27832:18;;27709:147;;;;:::o;27862:114::-;;:::o;27982:398::-;28141:3;28162:83;28243:1;28238:3;28162:83;:::i;:::-;28155:90;;28254:93;28343:3;28254:93;:::i;:::-;28372:1;28367:3;28363:11;28356:18;;27982:398;;;:::o;28386:379::-;28570:3;28592:147;28735:3;28592:147;:::i;:::-;28585:154;;28756:3;28749:10;;28386:379;;;:::o;28771:220::-;28911:34;28907:1;28899:6;28895:14;28888:58;28980:3;28975:2;28967:6;28963:15;28956:28;28771:220;:::o;28997:366::-;29139:3;29160:67;29224:2;29219:3;29160:67;:::i;:::-;29153:74;;29236:93;29325:3;29236:93;:::i;:::-;29354:2;29349:3;29345:12;29338:19;;28997:366;;;:::o;29369:419::-;29535:4;29573:2;29562:9;29558:18;29550:26;;29622:9;29616:4;29612:20;29608:1;29597:9;29593:17;29586:47;29650:131;29776:4;29650:131;:::i;:::-;29642:139;;29369:419;;;:::o;29794:180::-;29842:77;29839:1;29832:88;29939:4;29936:1;29929:15;29963:4;29960:1;29953:15;29980:180;30028:77;30025:1;30018:88;30125:4;30122:1;30115:15;30149:4;30146:1;30139:15;30166:143;30223:5;30254:6;30248:13;30239:22;;30270:33;30297:5;30270:33;:::i;:::-;30166:143;;;;:::o;30315:351::-;30385:6;30434:2;30422:9;30413:7;30409:23;30405:32;30402:119;;;30440:79;;:::i;:::-;30402:119;30560:1;30585:64;30641:7;30632:6;30621:9;30617:22;30585:64;:::i;:::-;30575:74;;30531:128;30315:351;;;;:::o;30672:85::-;30717:7;30746:5;30735:16;;30672:85;;;:::o;30763:158::-;30821:9;30854:61;30872:42;30881:32;30907:5;30881:32;:::i;:::-;30872:42;:::i;:::-;30854:61;:::i;:::-;30841:74;;30763:158;;;:::o;30927:147::-;31022:45;31061:5;31022:45;:::i;:::-;31017:3;31010:58;30927:147;;:::o;31080:114::-;31147:6;31181:5;31175:12;31165:22;;31080:114;;;:::o;31200:184::-;31299:11;31333:6;31328:3;31321:19;31373:4;31368:3;31364:14;31349:29;;31200:184;;;;:::o;31390:132::-;31457:4;31480:3;31472:11;;31510:4;31505:3;31501:14;31493:22;;31390:132;;;:::o;31528:108::-;31605:24;31623:5;31605:24;:::i;:::-;31600:3;31593:37;31528:108;;:::o;31642:179::-;31711:10;31732:46;31774:3;31766:6;31732:46;:::i;:::-;31810:4;31805:3;31801:14;31787:28;;31642:179;;;;:::o;31827:113::-;31897:4;31929;31924:3;31920:14;31912:22;;31827:113;;;:::o;31976:732::-;32095:3;32124:54;32172:5;32124:54;:::i;:::-;32194:86;32273:6;32268:3;32194:86;:::i;:::-;32187:93;;32304:56;32354:5;32304:56;:::i;:::-;32383:7;32414:1;32399:284;32424:6;32421:1;32418:13;32399:284;;;32500:6;32494:13;32527:63;32586:3;32571:13;32527:63;:::i;:::-;32520:70;;32613:60;32666:6;32613:60;:::i;:::-;32603:70;;32459:224;32446:1;32443;32439:9;32434:14;;32399:284;;;32403:14;32699:3;32692:10;;32100:608;;;31976:732;;;;:::o;32714:831::-;32977:4;33015:3;33004:9;33000:19;32992:27;;33029:71;33097:1;33086:9;33082:17;33073:6;33029:71;:::i;:::-;33110:80;33186:2;33175:9;33171:18;33162:6;33110:80;:::i;:::-;33237:9;33231:4;33227:20;33222:2;33211:9;33207:18;33200:48;33265:108;33368:4;33359:6;33265:108;:::i;:::-;33257:116;;33383:72;33451:2;33440:9;33436:18;33427:6;33383:72;:::i;:::-;33465:73;33533:3;33522:9;33518:19;33509:6;33465:73;:::i;:::-;32714:831;;;;;;;;:::o

Swarm Source

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