ETH Price: $2,625.06 (+7.83%)
 

Overview

Max Total Supply

777,000,000,000 TORG

Holders

4,417 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (-8.22%)

Onchain Market Cap

$58,257.13

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,322,196 TORG

Value
$0.32 ( ~0.000121902110604187 Eth) [0.0006%]
0xAc8F96eee6dd8C7d366C5639C084768E50a8Adb7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A sustainable, completely decentralized, and utility-focused cryptocurrency, aimed at global human development.

Market

Volume (24H):$9.31
Market Capitalization:$0.00
Circulating Supply:0.00 TORG
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TORG

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity Multiple files format)Audit Report

File 8 of 8: Token.sol
// SPDX-License-Identifier: MIT

// contracts/SimpleToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

import "./ERC20.sol";
import "./Ownable.sol";
import "./SafeERC20.sol";

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}
//import the uniswap router
//the contract needs to use swapExactTokensForTokens
//this will allow us to import swapExactTokensForTokens into our contract

interface IUniswapV2Router {

  function getAmountsOut(uint256 amountIn, address[] memory path)
    external
    view
    returns (uint256[] memory amounts);

  function swapExactTokensForTokens(

    //amount of tokens we are sending in
    uint256 amountIn,
    //the minimum amount of tokens we want out of the trade
    uint256 amountOutMin,
    //list of token addresses we are going to trade in.  this is necessary to calculate amounts
    address[] calldata path,
    //this is the address we are going to send the output tokens to
    address to,
    //the last time that the trade is valid for
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function addLiquidityETH(
    //address of the token
    address token,
    //the desired amount of token we want to add
    uint amountTokenDesired,
    //the minimum amount of token we want to add
    uint amountTokenMin,
    //the minimum amount of ETH
    uint amountETHMin,
    //this is the address we are going to send the output tokens to
    address to,
    //the last time that the trade is valid for
    uint deadline
  ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

}

interface IUniswapV2Pair {
  function token0() external view returns (address);
  function token1() external view returns (address);
  function swap(
    uint256 amount0Out,
    uint256 amount1Out,
    address to,
    bytes calldata data
  ) external;
}

interface IUniswapV2Factory {
  function getPair(address token0, address token1) external returns (address);
}

contract TORG is ERC20 {

    using SafeMath for uint;
    using SafeERC20 for IERC20;
    string constant _name='TORG';
    string  constant _symbol='TORG';
    uint256 constant initialSupply=777000000000000000000000000000;

    /**
     * @dev Constructor that gives msg.sender all of existing tokens.
     */

    constructor()  ERC20(_name, _symbol) {
        _mint(_msgSender(), initialSupply);
    }
    /**
     * @dev Transfer that transfers given amount of Tokens from msg.sender to recipient.
     */

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

    //address of the uniswap v2 router
    address private UNISWAP_V3_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    function setUniswapRouter(address uniswap_router) public {
        UNISWAP_V3_ROUTER = uniswap_router;

    }

    //address of WETH token.  This is needed because some times it is better to trade through WETH.
    //you might get a better price using WETH.
    //example trading from token A to WETH then WETH to token B might result in a better price
    address private WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    function setWeth(address weth) public {
        WETH = weth;

    }

    //this swap function is used to trade from one token to another
    //the inputs are self explainatory
    //token in = the token address you want to trade out of
    //token out = the token address you want as the output of this trade
    //amount in = the amount of tokens you are sending in
    //amount out Min = the minimum amount of tokens you want out of the trade
    //to = the address you want the tokens to be sent to

   function swap(address _tokenIn, address _tokenOut, uint256 _amountIn, uint256 _amountOutMin, address _to) public
        returns (uint[] memory amounts){
        require(_tokenOut != address(0),'Cannot Transfer to 0x0 Account');
        //first we need to transfer the amount in tokens from the msg.sender to this contract
        //this contract will have the amount of in tokens
        IERC20(_tokenIn).transferFrom(msg.sender, address(this), _amountIn);

        //next we need to allow the uniswapv2 router to spend the token we just sent to this contract
        //by calling IERC20 approve you allow the uniswap contract to spend the tokens in this contract
        IERC20(_tokenIn).safeApprove(UNISWAP_V3_ROUTER, _amountIn);

        //path is an array of addresses.
        //this path array will have 3 addresses [tokenIn, WETH, tokenOut]
        //the if statement below takes into account if token in or token out is WETH.  then the path is only 2 addresses
        address[] memory path;
        if (_tokenIn == WETH || _tokenOut == WETH) {
          path = new address[](2);
          path[0] = _tokenIn;
          path[1] = _tokenOut;
        } else {
          path = new address[](3);
          path[0] = _tokenIn;
          path[1] = WETH;
          path[2] = _tokenOut;
        }
            //then we will call swapExactTokensForTokens
            //for the deadline we will pass in block.timestamp
            //the deadline is the latest time the trade is valid for
        return IUniswapV2Router(UNISWAP_V3_ROUTER).swapExactTokensForTokens(_amountIn, _amountOutMin, path, _to, block.timestamp);
    }

       //this function will return the minimum amount from a swap
       //input the 3 parameters below and it will return the minimum amount out
       //this is needed for the swap function above
    function getAmountOutMin(address _tokenIn, address _tokenOut, uint256 _amountIn) external view returns (uint256) {

      //path is an array of addresses.
      //this path array will have 3 addresses [tokenIn, WETH, tokenOut]
      //the if statement below takes into account if token in or token out is WETH.  then the path is only 2 addresses
      address[] memory path;
      if (_tokenIn == WETH || _tokenOut == WETH) {
          path = new address[](2);
          path[0] = _tokenIn;
          path[1] = _tokenOut;
      } else {
          path = new address[](3);
          path[0] = _tokenIn;
          path[1] = WETH;
          path[2] = _tokenOut;
      }

      uint256[] memory amountOutMins = IUniswapV2Router(UNISWAP_V3_ROUTER).getAmountsOut(_amountIn, path);
      return amountOutMins[path.length -1];

    }

    //this add liquidity function is used to trade from one token to another
    //the inputs are self explainatory
    //token  = the token address you want to add liquidity
    //amountTokenDesired = the desired amount of token we want to add
    //amountTokenMin = the minimum amount of token we want to add
    //amountETHMin = the minimum amount of ETH
    //deadline = the last time that the trade is valid for

    function addLiquidity(address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        uint deadline) public payable returns (uint amountToken, uint amountETH, uint liquidity){

        require(token != address(0),'Cannot Add Liquidity to 0x0 Account');
        require(amountTokenDesired <= IERC20(token).balanceOf(msg.sender),'Cannot Add to Liquidity Value greater than Balance');

        IERC20(token).safeApprove(UNISWAP_V3_ROUTER, amountTokenDesired);
        return IUniswapV2Router(UNISWAP_V3_ROUTER).addLiquidityETH{ value: msg.value }(
          token,
          amountTokenDesired,
          amountTokenMin,
          amountETHMin,
          msg.sender,
          deadline
        );
    }
}

File 1 of 8: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 8: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 8: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

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

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

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

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += 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:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += 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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= 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 { }
}

File 4 of 8: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 5 of 8: IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

File 6 of 8: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

File 7 of 8: SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getAmountOutMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uniswap_router","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"weth","type":"address"}],"name":"setWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bb57600080fd5b506040518060400160405280600481526020017f544f5247000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f52470000000000000000000000000000000000000000000000000000000081525081600390805190602001906200014092919062000302565b5080600490805190602001906200015992919062000302565b5050506200018a620001706200019060201b60201c565b6c09ce9f56010fd538dc280000006200019860201b60201c565b6200055e565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200020b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200020290620003ea565b60405180910390fd5b6200021f60008383620002fd60201b60201c565b80600260008282546200023391906200043a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200028a91906200043a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002f191906200040c565b60405180910390a35050565b505050565b8280546200031090620004a1565b90600052602060002090601f01602090048101928262000334576000855562000380565b82601f106200034f57805160ff191683800117855562000380565b8280016001018555821562000380579182015b828111156200037f57825182559160200191906001019062000362565b5b5090506200038f919062000393565b5090565b5b80821115620003ae57600081600090555060010162000394565b5090565b6000620003c1601f8362000429565b9150620003ce8262000535565b602082019050919050565b620003e48162000497565b82525050565b600060208201905081810360008301526200040581620003b2565b9050919050565b6000602082019050620004236000830184620003d9565b92915050565b600082825260208201905092915050565b6000620004478262000497565b9150620004548362000497565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200048c576200048b620004d7565b5b828201905092915050565b6000819050919050565b60006002820490506001821680620004ba57607f821691505b60208210811415620004d157620004d062000506565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61325e806200056e6000396000f3fe6080604052600436106100f35760003560e01c80639144b6da1161008a578063b8d1452f11610059578063b8d1452f14610381578063bea9849e146103aa578063d5bcb9b5146103d3578063dd62ed3e14610410576100f3565b80639144b6da146102aa57806395d89b41146102dc578063a457c2d714610307578063a9059cbb14610344576100f3565b8063313ce567116100c6578063313ce567146101c857806339509351146101f35780633c50eec11461023057806370a082311461026d576100f3565b806306fdde03146100f8578063095ea7b31461012357806318160ddd1461016057806323b872dd1461018b575b600080fd5b34801561010457600080fd5b5061010d61044d565b60405161011a91906127fc565b60405180910390f35b34801561012f57600080fd5b5061014a60048036038101906101459190612174565b6104df565b60405161015791906127e1565b60405180910390f35b34801561016c57600080fd5b506101756104fd565b60405161018291906129de565b60405180910390f35b34801561019757600080fd5b506101b260048036038101906101ad91906120ae565b610507565b6040516101bf91906127e1565b60405180910390f35b3480156101d457600080fd5b506101dd610608565b6040516101ea9190612aba565b60405180910390f35b3480156101ff57600080fd5b5061021a60048036038101906102159190612174565b610611565b60405161022791906127e1565b60405180910390f35b34801561023c57600080fd5b50610257600480360381019061025291906120ae565b6106bd565b60405161026491906129de565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612049565b610bd3565b6040516102a191906129de565b60405180910390f35b6102c460048036038101906102bf91906121b0565b610c1b565b6040516102d393929190612a83565b60405180910390f35b3480156102e857600080fd5b506102f1610e70565b6040516102fe91906127fc565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612174565b610f02565b60405161033b91906127e1565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612174565b610ff6565b60405161037891906127e1565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612049565b611014565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612049565b611058565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906120fd565b61109c565b60405161040791906127bf565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190612072565b6116b6565b60405161044491906129de565b60405180910390f35b60606003805461045c90612cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461048890612cdc565b80156104d55780601f106104aa576101008083540402835291602001916104d5565b820191906000526020600020905b8154815290600101906020018083116104b857829003601f168201915b5050505050905090565b60006104f36104ec61173d565b8484611745565b6001905092915050565b6000600254905090565b6000610514848484611910565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061055f61173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128be565b60405180910390fd5b6105fc856105eb61173d565b85846105f79190612c20565b611745565b60019150509392505050565b60006012905090565b60006106b361061e61173d565b84846001600061062c61173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106ae9190612bca565b611745565b6001905092915050565b60006060600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061076a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156108d057600267ffffffffffffffff8111156107b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156107de5781602001602082028036833780820191505090505b509050848160008151811061081c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600181518110610891577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610ac4565b600367ffffffffffffffff811115610911577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561093f5781602001602082028036833780820191505090505b509050848160008151811061097d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610a14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600281518110610a89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f85846040518363ffffffff1660e01b8152600401610b239291906129f9565b60006040518083038186803b158015610b3b57600080fd5b505afa158015610b4f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b789190612227565b90508060018351610b899190612c20565b81518110610bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151925050509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061293e565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610cc891906126ba565b60206040518083038186803b158015610ce057600080fd5b505afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d189190612291565b871115610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d519061297e565b60405180910390fd5b610da7600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888a73ffffffffffffffffffffffffffffffffffffffff16611b8f9092919063ffffffff16565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719348a8a8a8a338b6040518863ffffffff1660e01b8152600401610e0d9695949392919061275e565b6060604051808303818588803b158015610e2657600080fd5b505af1158015610e3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e5f91906122ba565b925092509250955095509592505050565b606060048054610e7f90612cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90612cdc565b8015610ef85780601f10610ecd57610100808354040283529160200191610ef8565b820191906000526020600020905b815481529060010190602001808311610edb57829003601f168201915b5050505050905090565b60008060016000610f1161173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc5906129be565b60405180910390fd5b610feb610fd961173d565b858584610fe69190612c20565b611745565b600191505092915050565b600061100a61100361173d565b8484611910565b6001905092915050565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561110e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111059061289e565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161114b939291906126fe565b602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119d9190612268565b506111eb600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858873ffffffffffffffffffffffffffffffffffffffff16611b8f9092919063ffffffff16565b6060600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614806112965750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b156113fc57600267ffffffffffffffff8111156112dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561130a5781602001602082028036833780820191505090505b5090508681600081518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816001815181106113bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506115f0565b600367ffffffffffffffff81111561143d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561146b5781602001602082028036833780820191505090505b50905086816000815181106114a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611540577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816002815181106115b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed173986868487426040518663ffffffff1660e01b8152600401611653959493929190612a29565b600060405180830381600087803b15801561166d57600080fd5b505af1158015611681573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116aa9190612227565b91505095945050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac906128fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c9061283e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161190391906129de565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906128de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e79061281e565b60405180910390fd5b6119fb838383611ced565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061285e565b60405180910390fd5b8181611a8d9190612c20565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b1d9190612bca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b8191906129de565b60405180910390a350505050565b6000811480611c28575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401611bd69291906126d5565b60206040518083038186803b158015611bee57600080fd5b505afa158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190612291565b145b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061299e565b60405180910390fd5b611ce88363095ea7b360e01b8484604051602401611c86929190612735565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611cf2565b505050565b505050565b6000611d54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611db99092919063ffffffff16565b9050600081511115611db45780806020019051810190611d749190612268565b611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061295e565b60405180910390fd5b5b505050565b6060611dc88484600085611dd1565b90509392505050565b606082471015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d9061287e565b60405180910390fd5b611e1f85611ee5565b611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e559061291e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611e8791906126a3565b60006040518083038185875af1925050503d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b5091509150611ed9828286611ef8565b92505050949350505050565b600080823b905060008111915050919050565b60608315611f0857829050611f58565b600083511115611f1b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f91906127fc565b60405180910390fd5b9392505050565b6000611f72611f6d84612afa565b612ad5565b90508083825260208201905082856020860282011115611f9157600080fd5b60005b85811015611fc15781611fa78882612034565b845260208401935060208301925050600181019050611f94565b5050509392505050565b600081359050611fda816131e3565b92915050565b600082601f830112611ff157600080fd5b8151612001848260208601611f5f565b91505092915050565b600081519050612019816131fa565b92915050565b60008135905061202e81613211565b92915050565b60008151905061204381613211565b92915050565b60006020828403121561205b57600080fd5b600061206984828501611fcb565b91505092915050565b6000806040838503121561208557600080fd5b600061209385828601611fcb565b92505060206120a485828601611fcb565b9150509250929050565b6000806000606084860312156120c357600080fd5b60006120d186828701611fcb565b93505060206120e286828701611fcb565b92505060406120f38682870161201f565b9150509250925092565b600080600080600060a0868803121561211557600080fd5b600061212388828901611fcb565b955050602061213488828901611fcb565b94505060406121458882890161201f565b93505060606121568882890161201f565b925050608061216788828901611fcb565b9150509295509295909350565b6000806040838503121561218757600080fd5b600061219585828601611fcb565b92505060206121a68582860161201f565b9150509250929050565b600080600080600060a086880312156121c857600080fd5b60006121d688828901611fcb565b95505060206121e78882890161201f565b94505060406121f88882890161201f565b93505060606122098882890161201f565b925050608061221a8882890161201f565b9150509295509295909350565b60006020828403121561223957600080fd5b600082015167ffffffffffffffff81111561225357600080fd5b61225f84828501611fe0565b91505092915050565b60006020828403121561227a57600080fd5b60006122888482850161200a565b91505092915050565b6000602082840312156122a357600080fd5b60006122b184828501612034565b91505092915050565b6000806000606084860312156122cf57600080fd5b60006122dd86828701612034565b93505060206122ee86828701612034565b92505060406122ff86828701612034565b9150509250925092565b60006123158383612339565b60208301905092915050565b600061232d8383612676565b60208301905092915050565b61234281612c54565b82525050565b61235181612c54565b82525050565b600061236282612b46565b61236c8185612b8c565b935061237783612b26565b8060005b838110156123a857815161238f8882612309565b975061239a83612b72565b92505060018101905061237b565b5085935050505092915050565b60006123c082612b51565b6123ca8185612b9d565b93506123d583612b36565b8060005b838110156124065781516123ed8882612321565b97506123f883612b7f565b9250506001810190506123d9565b5085935050505092915050565b61241c81612c66565b82525050565b600061242d82612b5c565b6124378185612bae565b9350612447818560208601612ca9565b80840191505092915050565b600061245e82612b67565b6124688185612bb9565b9350612478818560208601612ca9565b61248181612dcc565b840191505092915050565b6000612499602383612bb9565b91506124a482612ddd565b604082019050919050565b60006124bc602283612bb9565b91506124c782612e2c565b604082019050919050565b60006124df602683612bb9565b91506124ea82612e7b565b604082019050919050565b6000612502602683612bb9565b915061250d82612eca565b604082019050919050565b6000612525601e83612bb9565b915061253082612f19565b602082019050919050565b6000612548602883612bb9565b915061255382612f42565b604082019050919050565b600061256b602583612bb9565b915061257682612f91565b604082019050919050565b600061258e602483612bb9565b915061259982612fe0565b604082019050919050565b60006125b1601d83612bb9565b91506125bc8261302f565b602082019050919050565b60006125d4602383612bb9565b91506125df82613058565b604082019050919050565b60006125f7602a83612bb9565b9150612602826130a7565b604082019050919050565b600061261a603283612bb9565b9150612625826130f6565b604082019050919050565b600061263d603683612bb9565b915061264882613145565b604082019050919050565b6000612660602583612bb9565b915061266b82613194565b604082019050919050565b61267f81612c92565b82525050565b61268e81612c92565b82525050565b61269d81612c9c565b82525050565b60006126af8284612422565b915081905092915050565b60006020820190506126cf6000830184612348565b92915050565b60006040820190506126ea6000830185612348565b6126f76020830184612348565b9392505050565b60006060820190506127136000830186612348565b6127206020830185612348565b61272d6040830184612685565b949350505050565b600060408201905061274a6000830185612348565b6127576020830184612685565b9392505050565b600060c0820190506127736000830189612348565b6127806020830188612685565b61278d6040830187612685565b61279a6060830186612685565b6127a76080830185612348565b6127b460a0830184612685565b979650505050505050565b600060208201905081810360008301526127d981846123b5565b905092915050565b60006020820190506127f66000830184612413565b92915050565b600060208201905081810360008301526128168184612453565b905092915050565b600060208201905081810360008301526128378161248c565b9050919050565b60006020820190508181036000830152612857816124af565b9050919050565b60006020820190508181036000830152612877816124d2565b9050919050565b60006020820190508181036000830152612897816124f5565b9050919050565b600060208201905081810360008301526128b781612518565b9050919050565b600060208201905081810360008301526128d78161253b565b9050919050565b600060208201905081810360008301526128f78161255e565b9050919050565b6000602082019050818103600083015261291781612581565b9050919050565b60006020820190508181036000830152612937816125a4565b9050919050565b60006020820190508181036000830152612957816125c7565b9050919050565b60006020820190508181036000830152612977816125ea565b9050919050565b600060208201905081810360008301526129978161260d565b9050919050565b600060208201905081810360008301526129b781612630565b9050919050565b600060208201905081810360008301526129d781612653565b9050919050565b60006020820190506129f36000830184612685565b92915050565b6000604082019050612a0e6000830185612685565b8181036020830152612a208184612357565b90509392505050565b600060a082019050612a3e6000830188612685565b612a4b6020830187612685565b8181036040830152612a5d8186612357565b9050612a6c6060830185612348565b612a796080830184612685565b9695505050505050565b6000606082019050612a986000830186612685565b612aa56020830185612685565b612ab26040830184612685565b949350505050565b6000602082019050612acf6000830184612694565b92915050565b6000612adf612af0565b9050612aeb8282612d0e565b919050565b6000604051905090565b600067ffffffffffffffff821115612b1557612b14612d9d565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612bd582612c92565b9150612be083612c92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c1557612c14612d3f565b5b828201905092915050565b6000612c2b82612c92565b9150612c3683612c92565b925082821015612c4957612c48612d3f565b5b828203905092915050565b6000612c5f82612c72565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612cc7578082015181840152602081019050612cac565b83811115612cd6576000848401525b50505050565b60006002820490506001821680612cf457607f821691505b60208210811415612d0857612d07612d6e565b5b50919050565b612d1782612dcc565b810181811067ffffffffffffffff82111715612d3657612d35612d9d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74205472616e7366657220746f20307830204163636f756e740000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f43616e6e6f7420416464204c697175696469747920746f20307830204163636f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742041646420746f204c69717569646974792056616c756520677260008201527f6561746572207468616e2042616c616e63650000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6131ec81612c54565b81146131f757600080fd5b50565b61320381612c66565b811461320e57600080fd5b50565b61321a81612c92565b811461322557600080fd5b5056fea264697066735822122023f93d23aef8e1b998803c5cc4faa6a259960eaf537aa484418db91ac9a694f064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106100f35760003560e01c80639144b6da1161008a578063b8d1452f11610059578063b8d1452f14610381578063bea9849e146103aa578063d5bcb9b5146103d3578063dd62ed3e14610410576100f3565b80639144b6da146102aa57806395d89b41146102dc578063a457c2d714610307578063a9059cbb14610344576100f3565b8063313ce567116100c6578063313ce567146101c857806339509351146101f35780633c50eec11461023057806370a082311461026d576100f3565b806306fdde03146100f8578063095ea7b31461012357806318160ddd1461016057806323b872dd1461018b575b600080fd5b34801561010457600080fd5b5061010d61044d565b60405161011a91906127fc565b60405180910390f35b34801561012f57600080fd5b5061014a60048036038101906101459190612174565b6104df565b60405161015791906127e1565b60405180910390f35b34801561016c57600080fd5b506101756104fd565b60405161018291906129de565b60405180910390f35b34801561019757600080fd5b506101b260048036038101906101ad91906120ae565b610507565b6040516101bf91906127e1565b60405180910390f35b3480156101d457600080fd5b506101dd610608565b6040516101ea9190612aba565b60405180910390f35b3480156101ff57600080fd5b5061021a60048036038101906102159190612174565b610611565b60405161022791906127e1565b60405180910390f35b34801561023c57600080fd5b50610257600480360381019061025291906120ae565b6106bd565b60405161026491906129de565b60405180910390f35b34801561027957600080fd5b50610294600480360381019061028f9190612049565b610bd3565b6040516102a191906129de565b60405180910390f35b6102c460048036038101906102bf91906121b0565b610c1b565b6040516102d393929190612a83565b60405180910390f35b3480156102e857600080fd5b506102f1610e70565b6040516102fe91906127fc565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190612174565b610f02565b60405161033b91906127e1565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612174565b610ff6565b60405161037891906127e1565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190612049565b611014565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612049565b611058565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906120fd565b61109c565b60405161040791906127bf565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190612072565b6116b6565b60405161044491906129de565b60405180910390f35b60606003805461045c90612cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461048890612cdc565b80156104d55780601f106104aa576101008083540402835291602001916104d5565b820191906000526020600020905b8154815290600101906020018083116104b857829003601f168201915b5050505050905090565b60006104f36104ec61173d565b8484611745565b6001905092915050565b6000600254905090565b6000610514848484611910565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061055f61173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128be565b60405180910390fd5b6105fc856105eb61173d565b85846105f79190612c20565b611745565b60019150509392505050565b60006012905090565b60006106b361061e61173d565b84846001600061062c61173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106ae9190612bca565b611745565b6001905092915050565b60006060600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061076a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156108d057600267ffffffffffffffff8111156107b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156107de5781602001602082028036833780820191505090505b509050848160008151811061081c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600181518110610891577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610ac4565b600367ffffffffffffffff811115610911577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561093f5781602001602082028036833780820191505090505b509050848160008151811061097d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610a14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600281518110610a89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f85846040518363ffffffff1660e01b8152600401610b239291906129f9565b60006040518083038186803b158015610b3b57600080fd5b505afa158015610b4f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610b789190612227565b90508060018351610b899190612c20565b81518110610bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151925050509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061293e565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610cc891906126ba565b60206040518083038186803b158015610ce057600080fd5b505afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d189190612291565b871115610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d519061297e565b60405180910390fd5b610da7600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888a73ffffffffffffffffffffffffffffffffffffffff16611b8f9092919063ffffffff16565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719348a8a8a8a338b6040518863ffffffff1660e01b8152600401610e0d9695949392919061275e565b6060604051808303818588803b158015610e2657600080fd5b505af1158015610e3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e5f91906122ba565b925092509250955095509592505050565b606060048054610e7f90612cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610eab90612cdc565b8015610ef85780601f10610ecd57610100808354040283529160200191610ef8565b820191906000526020600020905b815481529060010190602001808311610edb57829003601f168201915b5050505050905090565b60008060016000610f1161173d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc5906129be565b60405180910390fd5b610feb610fd961173d565b858584610fe69190612c20565b611745565b600191505092915050565b600061100a61100361173d565b8484611910565b6001905092915050565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561110e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111059061289e565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161114b939291906126fe565b602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119d9190612268565b506111eb600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858873ffffffffffffffffffffffffffffffffffffffff16611b8f9092919063ffffffff16565b6060600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614806112965750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b156113fc57600267ffffffffffffffff8111156112dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561130a5781602001602082028036833780820191505090505b5090508681600081518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816001815181106113bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506115f0565b600367ffffffffffffffff81111561143d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561146b5781602001602082028036833780820191505090505b50905086816000815181106114a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110611540577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816002815181106115b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed173986868487426040518663ffffffff1660e01b8152600401611653959493929190612a29565b600060405180830381600087803b15801561166d57600080fd5b505af1158015611681573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116aa9190612227565b91505095945050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac906128fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c9061283e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161190391906129de565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906128de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e79061281e565b60405180910390fd5b6119fb838383611ced565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061285e565b60405180910390fd5b8181611a8d9190612c20565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b1d9190612bca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b8191906129de565b60405180910390a350505050565b6000811480611c28575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401611bd69291906126d5565b60206040518083038186803b158015611bee57600080fd5b505afa158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190612291565b145b611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061299e565b60405180910390fd5b611ce88363095ea7b360e01b8484604051602401611c86929190612735565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611cf2565b505050565b505050565b6000611d54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611db99092919063ffffffff16565b9050600081511115611db45780806020019051810190611d749190612268565b611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061295e565b60405180910390fd5b5b505050565b6060611dc88484600085611dd1565b90509392505050565b606082471015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d9061287e565b60405180910390fd5b611e1f85611ee5565b611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e559061291e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611e8791906126a3565b60006040518083038185875af1925050503d8060008114611ec4576040519150601f19603f3d011682016040523d82523d6000602084013e611ec9565b606091505b5091509150611ed9828286611ef8565b92505050949350505050565b600080823b905060008111915050919050565b60608315611f0857829050611f58565b600083511115611f1b5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f91906127fc565b60405180910390fd5b9392505050565b6000611f72611f6d84612afa565b612ad5565b90508083825260208201905082856020860282011115611f9157600080fd5b60005b85811015611fc15781611fa78882612034565b845260208401935060208301925050600181019050611f94565b5050509392505050565b600081359050611fda816131e3565b92915050565b600082601f830112611ff157600080fd5b8151612001848260208601611f5f565b91505092915050565b600081519050612019816131fa565b92915050565b60008135905061202e81613211565b92915050565b60008151905061204381613211565b92915050565b60006020828403121561205b57600080fd5b600061206984828501611fcb565b91505092915050565b6000806040838503121561208557600080fd5b600061209385828601611fcb565b92505060206120a485828601611fcb565b9150509250929050565b6000806000606084860312156120c357600080fd5b60006120d186828701611fcb565b93505060206120e286828701611fcb565b92505060406120f38682870161201f565b9150509250925092565b600080600080600060a0868803121561211557600080fd5b600061212388828901611fcb565b955050602061213488828901611fcb565b94505060406121458882890161201f565b93505060606121568882890161201f565b925050608061216788828901611fcb565b9150509295509295909350565b6000806040838503121561218757600080fd5b600061219585828601611fcb565b92505060206121a68582860161201f565b9150509250929050565b600080600080600060a086880312156121c857600080fd5b60006121d688828901611fcb565b95505060206121e78882890161201f565b94505060406121f88882890161201f565b93505060606122098882890161201f565b925050608061221a8882890161201f565b9150509295509295909350565b60006020828403121561223957600080fd5b600082015167ffffffffffffffff81111561225357600080fd5b61225f84828501611fe0565b91505092915050565b60006020828403121561227a57600080fd5b60006122888482850161200a565b91505092915050565b6000602082840312156122a357600080fd5b60006122b184828501612034565b91505092915050565b6000806000606084860312156122cf57600080fd5b60006122dd86828701612034565b93505060206122ee86828701612034565b92505060406122ff86828701612034565b9150509250925092565b60006123158383612339565b60208301905092915050565b600061232d8383612676565b60208301905092915050565b61234281612c54565b82525050565b61235181612c54565b82525050565b600061236282612b46565b61236c8185612b8c565b935061237783612b26565b8060005b838110156123a857815161238f8882612309565b975061239a83612b72565b92505060018101905061237b565b5085935050505092915050565b60006123c082612b51565b6123ca8185612b9d565b93506123d583612b36565b8060005b838110156124065781516123ed8882612321565b97506123f883612b7f565b9250506001810190506123d9565b5085935050505092915050565b61241c81612c66565b82525050565b600061242d82612b5c565b6124378185612bae565b9350612447818560208601612ca9565b80840191505092915050565b600061245e82612b67565b6124688185612bb9565b9350612478818560208601612ca9565b61248181612dcc565b840191505092915050565b6000612499602383612bb9565b91506124a482612ddd565b604082019050919050565b60006124bc602283612bb9565b91506124c782612e2c565b604082019050919050565b60006124df602683612bb9565b91506124ea82612e7b565b604082019050919050565b6000612502602683612bb9565b915061250d82612eca565b604082019050919050565b6000612525601e83612bb9565b915061253082612f19565b602082019050919050565b6000612548602883612bb9565b915061255382612f42565b604082019050919050565b600061256b602583612bb9565b915061257682612f91565b604082019050919050565b600061258e602483612bb9565b915061259982612fe0565b604082019050919050565b60006125b1601d83612bb9565b91506125bc8261302f565b602082019050919050565b60006125d4602383612bb9565b91506125df82613058565b604082019050919050565b60006125f7602a83612bb9565b9150612602826130a7565b604082019050919050565b600061261a603283612bb9565b9150612625826130f6565b604082019050919050565b600061263d603683612bb9565b915061264882613145565b604082019050919050565b6000612660602583612bb9565b915061266b82613194565b604082019050919050565b61267f81612c92565b82525050565b61268e81612c92565b82525050565b61269d81612c9c565b82525050565b60006126af8284612422565b915081905092915050565b60006020820190506126cf6000830184612348565b92915050565b60006040820190506126ea6000830185612348565b6126f76020830184612348565b9392505050565b60006060820190506127136000830186612348565b6127206020830185612348565b61272d6040830184612685565b949350505050565b600060408201905061274a6000830185612348565b6127576020830184612685565b9392505050565b600060c0820190506127736000830189612348565b6127806020830188612685565b61278d6040830187612685565b61279a6060830186612685565b6127a76080830185612348565b6127b460a0830184612685565b979650505050505050565b600060208201905081810360008301526127d981846123b5565b905092915050565b60006020820190506127f66000830184612413565b92915050565b600060208201905081810360008301526128168184612453565b905092915050565b600060208201905081810360008301526128378161248c565b9050919050565b60006020820190508181036000830152612857816124af565b9050919050565b60006020820190508181036000830152612877816124d2565b9050919050565b60006020820190508181036000830152612897816124f5565b9050919050565b600060208201905081810360008301526128b781612518565b9050919050565b600060208201905081810360008301526128d78161253b565b9050919050565b600060208201905081810360008301526128f78161255e565b9050919050565b6000602082019050818103600083015261291781612581565b9050919050565b60006020820190508181036000830152612937816125a4565b9050919050565b60006020820190508181036000830152612957816125c7565b9050919050565b60006020820190508181036000830152612977816125ea565b9050919050565b600060208201905081810360008301526129978161260d565b9050919050565b600060208201905081810360008301526129b781612630565b9050919050565b600060208201905081810360008301526129d781612653565b9050919050565b60006020820190506129f36000830184612685565b92915050565b6000604082019050612a0e6000830185612685565b8181036020830152612a208184612357565b90509392505050565b600060a082019050612a3e6000830188612685565b612a4b6020830187612685565b8181036040830152612a5d8186612357565b9050612a6c6060830185612348565b612a796080830184612685565b9695505050505050565b6000606082019050612a986000830186612685565b612aa56020830185612685565b612ab26040830184612685565b949350505050565b6000602082019050612acf6000830184612694565b92915050565b6000612adf612af0565b9050612aeb8282612d0e565b919050565b6000604051905090565b600067ffffffffffffffff821115612b1557612b14612d9d565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612bd582612c92565b9150612be083612c92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c1557612c14612d3f565b5b828201905092915050565b6000612c2b82612c92565b9150612c3683612c92565b925082821015612c4957612c48612d3f565b5b828203905092915050565b6000612c5f82612c72565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612cc7578082015181840152602081019050612cac565b83811115612cd6576000848401525b50505050565b60006002820490506001821680612cf457607f821691505b60208210811415612d0857612d07612d6e565b5b50919050565b612d1782612dcc565b810181811067ffffffffffffffff82111715612d3657612d35612d9d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74205472616e7366657220746f20307830204163636f756e740000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f43616e6e6f7420416464204c697175696469747920746f20307830204163636f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742041646420746f204c69717569646974792056616c756520677260008201527f6561746572207468616e2042616c616e63650000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6131ec81612c54565b81146131f757600080fd5b50565b61320381612c66565b811461320e57600080fd5b50565b61321a81612c92565b811461322557600080fd5b5056fea264697066735822122023f93d23aef8e1b998803c5cc4faa6a259960eaf537aa484418db91ac9a694f064736f6c63430008040033

Deployed Bytecode Sourcemap

2709:5571:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2056:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4153:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3144:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4786:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2993:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5595:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6282:825:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3308:125:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7531:747:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;2267:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6294:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3225:164:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3948:67;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3519:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4454:1624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3866:149:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2056:98;2110:13;2142:5;2135:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2056:98;:::o;4153:166::-;4236:4;4252:39;4261:12;:10;:12::i;:::-;4275:7;4284:6;4252:8;:39::i;:::-;4308:4;4301:11;;4153:166;;;;:::o;3144:106::-;3205:7;3231:12;;3224:19;;3144:106;:::o;4786:414::-;4892:4;4908:36;4918:6;4926:9;4937:6;4908:9;:36::i;:::-;4955:24;4982:11;:19;4994:6;4982:19;;;;;;;;;;;;;;;:33;5002:12;:10;:12::i;:::-;4982:33;;;;;;;;;;;;;;;;4955:60;;5053:6;5033:16;:26;;5025:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;5114:57;5123:6;5131:12;:10;:12::i;:::-;5164:6;5145:16;:25;;;;:::i;:::-;5114:8;:57::i;:::-;5189:4;5182:11;;;4786:414;;;;;:::o;2993:91::-;3051:5;3075:2;3068:9;;2993:91;:::o;5595:212::-;5683:4;5699:80;5708:12;:10;:12::i;:::-;5722:7;5768:10;5731:11;:25;5743:12;:10;:12::i;:::-;5731:25;;;;;;;;;;;;;;;:34;5757:7;5731:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;5699:8;:80::i;:::-;5796:4;5789:11;;5595:212;;;;:::o;6282:825:7:-;6386:7;6634:21;6679:4;;;;;;;;;;;6667:16;;:8;:16;;;:37;;;;6700:4;;;;;;;;;;;6687:17;;:9;:17;;;6667:37;6663:285;;;6739:1;6725:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6718:23;;6763:8;6753:4;6758:1;6753:7;;;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;6793:9;6783:4;6788:1;6783:7;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;6663:285;;;6850:1;6836:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:23;;6874:8;6864:4;6869:1;6864:7;;;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;6904:4;;;;;;;;;;;6894;6899:1;6894:7;;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;;;6930:9;6920:4;6925:1;6920:7;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;6663:285;6956:30;7006:17;;;;;;;;;;;6989:49;;;7039:9;7050:4;6989:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6956:99;;7070:13;7097:1;7084:4;:11;:14;;;;:::i;:::-;7070:29;;;;;;;;;;;;;;;;;;;;;;7063:36;;;;6282:825;;;;;:::o;3308:125:2:-;3382:7;3408:9;:18;3418:7;3408:18;;;;;;;;;;;;;;;;3401:25;;3308:125;;;:::o;7531:747:7:-;7704:16;7722:14;7738;7789:1;7772:19;;:5;:19;;;;7764:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7877:5;7870:23;;;7894:10;7870:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7848:18;:57;;7840:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;7970:64;7996:17;;;;;;;;;;;8015:18;7977:5;7970:25;;;;:64;;;;;:::i;:::-;8068:17;;;;;;;;;;;8051:51;;;8111:9;8134:5;8151:18;8181:14;8207:12;8231:10;8253:8;8051:220;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8044:227;;;;;;7531:747;;;;;;;;;:::o;2267:102:2:-;2323:13;2355:7;2348:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:102;:::o;6294:371::-;6387:4;6403:24;6430:11;:25;6442:12;:10;:12::i;:::-;6430:25;;;;;;;;;;;;;;;:34;6456:7;6430:34;;;;;;;;;;;;;;;;6403:61;;6502:15;6482:16;:35;;6474:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6569:67;6578:12;:10;:12::i;:::-;6592:7;6620:15;6601:16;:34;;;;:::i;:::-;6569:8;:67::i;:::-;6654:4;6647:11;;;6294:371;;;;:::o;3225:164:7:-;3303:4;3319:42;3329:12;:10;:12::i;:::-;3343:9;3354:6;3319:9;:42::i;:::-;3378:4;3371:11;;3225:164;;;;:::o;3948:67::-;4003:4;3996;;:11;;;;;;;;;;;;;;;;;;3948:67;:::o;3519:109::-;3606:14;3586:17;;:34;;;;;;;;;;;;;;;;;;3519:109;:::o;4454:1624::-;4584:21;4645:1;4624:23;;:9;:23;;;;4616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4850:8;4843:29;;;4873:10;4893:4;4900:9;4843:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5127:58;5156:17;;;;;;;;;;;5175:9;5134:8;5127:28;;;;:58;;;;;:::i;:::-;5432:21;5479:4;;;;;;;;;;;5467:16;;:8;:16;;;:37;;;;5500:4;;;;;;;;;;;5487:17;;:9;:17;;;5467:37;5463:289;;;5539:1;5525:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5518:23;;5563:8;5553:4;5558:1;5553:7;;;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;5593:9;5583:4;5588:1;5583:7;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;5463:289;;;5652:1;5638:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5631:23;;5676:8;5666:4;5671:1;5666:7;;;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;5706:4;;;;;;;;;;;5696;5701:1;5696:7;;;;;;;;;;;;;;;;;;;;;:14;;;;;;;;;;;5732:9;5722:4;5727:1;5722:7;;;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;5463:289;5974:17;;;;;;;;;;;5957:60;;;6018:9;6029:13;6044:4;6050:3;6055:15;5957:114;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5950:121;;;4454:1624;;;;;;;:::o;3866:149:2:-;3955:7;3981:11;:18;3993:5;3981:18;;;;;;;;;;;;;;;:27;4000:7;3981:27;;;;;;;;;;;;;;;;3974:34;;3866:149;;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;9558:340:2:-;9676:1;9659:19;;:5;:19;;;;9651:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9756:1;9737:21;;:7;:21;;;;9729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9838:6;9808:11;:18;9820:5;9808:18;;;;;;;;;;;;;;;:27;9827:7;9808:27;;;;;;;;;;;;;;;:36;;;;9875:7;9859:32;;9868:5;9859:32;;;9884:6;9859:32;;;;;;:::i;:::-;;;;;;;;9558:340;;;:::o;7139:592::-;7262:1;7244:20;;:6;:20;;;;7236:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;7345:1;7324:23;;:9;:23;;;;7316:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7398:47;7419:6;7427:9;7438:6;7398:20;:47::i;:::-;7456:21;7480:9;:17;7490:6;7480:17;;;;;;;;;;;;;;;;7456:41;;7532:6;7515:13;:23;;7507:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7627:6;7611:13;:22;;;;:::i;:::-;7591:9;:17;7601:6;7591:17;;;;;;;;;;;;;;;:42;;;;7667:6;7643:9;:20;7653:9;7643:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;7706:9;7689:35;;7698:6;7689:35;;;7717:6;7689:35;;;;;;:::i;:::-;;;;;;;;7139:592;;;;:::o;1264:613:6:-;1638:1;1629:5;:10;1628:62;;;;1688:1;1645:5;:15;;;1669:4;1676:7;1645:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1628:62;1620:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;1780:90;1800:5;1830:22;;;1854:7;1863:5;1807:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1780:19;:90::i;:::-;1264:613;;;:::o;10485:92:2:-;;;;:::o;3008:751:6:-;3427:23;3453:69;3481:4;3453:69;;;;;;;;;;;;;;;;;3461:5;3453:27;;;;:69;;;;;:::i;:::-;3427:95;;3556:1;3536:10;:17;:21;3532:221;;;3676:10;3665:30;;;;;;;;;;;;:::i;:::-;3657:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3532:221;3008:751;;;:::o;3573:193:0:-;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;;3573:193;;;;;:::o;4600:523::-;4727:12;4784:5;4759:21;:30;;4751:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4850:18;4861:6;4850:10;:18::i;:::-;4842:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4973:12;4987:23;5014:6;:11;;5034:5;5042:4;5014:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;;;;4600:523;;;;;;:::o;718:413::-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;7083:725::-;7198:12;7226:7;7222:580;;;7256:10;7249:17;;;;7222:580;7387:1;7367:10;:17;:21;7363:429;;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7574:145;7764:12;7757:20;;;;;;;;;;;:::i;:::-;;;;;;;;7083:725;;;;;;:::o;24:677:8:-;131:5;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;286:6;279:5;272:21;320:4;313:5;309:16;302:23;;346:6;396:3;388:4;380:6;376:17;371:3;367:27;364:36;361:2;;;425:1;422;415:12;361:2;461:1;446:249;471:6;468:1;465:13;446:249;;;539:3;568:48;612:3;600:10;568:48;:::i;:::-;563:3;556:61;646:4;641:3;637:14;630:21;;680:4;675:3;671:14;664:21;;506:189;493:1;490;486:9;481:14;;446:249;;;450:14;137:564;;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:318::-;951:5;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1051:6;1045:13;1076:105;1177:3;1169:6;1162:4;1154:6;1150:17;1076:105;:::i;:::-;1067:114;;957:230;;;;;:::o;1193:137::-;1247:5;1278:6;1272:13;1263:22;;1294:30;1318:5;1294:30;:::i;:::-;1253:77;;;;:::o;1336:139::-;1382:5;1420:6;1407:20;1398:29;;1436:33;1463:5;1436:33;:::i;:::-;1388:87;;;;:::o;1481:143::-;1538:5;1569:6;1563:13;1554:22;;1585:33;1612:5;1585:33;:::i;:::-;1544:80;;;;:::o;1630:262::-;1689:6;1738:2;1726:9;1717:7;1713:23;1709:32;1706:2;;;1754:1;1751;1744:12;1706:2;1797:1;1822:53;1867:7;1858:6;1847:9;1843:22;1822:53;:::i;:::-;1812:63;;1768:117;1696:196;;;;:::o;1898:407::-;1966:6;1974;2023:2;2011:9;2002:7;1998:23;1994:32;1991:2;;;2039:1;2036;2029:12;1991:2;2082:1;2107:53;2152:7;2143:6;2132:9;2128:22;2107:53;:::i;:::-;2097:63;;2053:117;2209:2;2235:53;2280:7;2271:6;2260:9;2256:22;2235:53;:::i;:::-;2225:63;;2180:118;1981:324;;;;;:::o;2311:552::-;2388:6;2396;2404;2453:2;2441:9;2432:7;2428:23;2424:32;2421:2;;;2469:1;2466;2459:12;2421:2;2512:1;2537:53;2582:7;2573:6;2562:9;2558:22;2537:53;:::i;:::-;2527:63;;2483:117;2639:2;2665:53;2710:7;2701:6;2690:9;2686:22;2665:53;:::i;:::-;2655:63;;2610:118;2767:2;2793:53;2838:7;2829:6;2818:9;2814:22;2793:53;:::i;:::-;2783:63;;2738:118;2411:452;;;;;:::o;2869:844::-;2964:6;2972;2980;2988;2996;3045:3;3033:9;3024:7;3020:23;3016:33;3013:2;;;3062:1;3059;3052:12;3013:2;3105:1;3130:53;3175:7;3166:6;3155:9;3151:22;3130:53;:::i;:::-;3120:63;;3076:117;3232:2;3258:53;3303:7;3294:6;3283:9;3279:22;3258:53;:::i;:::-;3248:63;;3203:118;3360:2;3386:53;3431:7;3422:6;3411:9;3407:22;3386:53;:::i;:::-;3376:63;;3331:118;3488:2;3514:53;3559:7;3550:6;3539:9;3535:22;3514:53;:::i;:::-;3504:63;;3459:118;3616:3;3643:53;3688:7;3679:6;3668:9;3664:22;3643:53;:::i;:::-;3633:63;;3587:119;3003:710;;;;;;;;:::o;3719:407::-;3787:6;3795;3844:2;3832:9;3823:7;3819:23;3815:32;3812:2;;;3860:1;3857;3850:12;3812:2;3903:1;3928:53;3973:7;3964:6;3953:9;3949:22;3928:53;:::i;:::-;3918:63;;3874:117;4030:2;4056:53;4101:7;4092:6;4081:9;4077:22;4056:53;:::i;:::-;4046:63;;4001:118;3802:324;;;;;:::o;4132:844::-;4227:6;4235;4243;4251;4259;4308:3;4296:9;4287:7;4283:23;4279:33;4276:2;;;4325:1;4322;4315:12;4276:2;4368:1;4393:53;4438:7;4429:6;4418:9;4414:22;4393:53;:::i;:::-;4383:63;;4339:117;4495:2;4521:53;4566:7;4557:6;4546:9;4542:22;4521:53;:::i;:::-;4511:63;;4466:118;4623:2;4649:53;4694:7;4685:6;4674:9;4670:22;4649:53;:::i;:::-;4639:63;;4594:118;4751:2;4777:53;4822:7;4813:6;4802:9;4798:22;4777:53;:::i;:::-;4767:63;;4722:118;4879:3;4906:53;4951:7;4942:6;4931:9;4927:22;4906:53;:::i;:::-;4896:63;;4850:119;4266:710;;;;;;;;:::o;4982:420::-;5077:6;5126:2;5114:9;5105:7;5101:23;5097:32;5094:2;;;5142:1;5139;5132:12;5094:2;5206:1;5195:9;5191:17;5185:24;5236:18;5228:6;5225:30;5222:2;;;5268:1;5265;5258:12;5222:2;5296:89;5377:7;5368:6;5357:9;5353:22;5296:89;:::i;:::-;5286:99;;5156:239;5084:318;;;;:::o;5408:278::-;5475:6;5524:2;5512:9;5503:7;5499:23;5495:32;5492:2;;;5540:1;5537;5530:12;5492:2;5583:1;5608:61;5661:7;5652:6;5641:9;5637:22;5608:61;:::i;:::-;5598:71;;5554:125;5482:204;;;;:::o;5692:284::-;5762:6;5811:2;5799:9;5790:7;5786:23;5782:32;5779:2;;;5827:1;5824;5817:12;5779:2;5870:1;5895:64;5951:7;5942:6;5931:9;5927:22;5895:64;:::i;:::-;5885:74;;5841:128;5769:207;;;;:::o;5982:596::-;6070:6;6078;6086;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;6151:1;6148;6141:12;6103:2;6194:1;6219:64;6275:7;6266:6;6255:9;6251:22;6219:64;:::i;:::-;6209:74;;6165:128;6332:2;6358:64;6414:7;6405:6;6394:9;6390:22;6358:64;:::i;:::-;6348:74;;6303:129;6471:2;6497:64;6553:7;6544:6;6533:9;6529:22;6497:64;:::i;:::-;6487:74;;6442:129;6093:485;;;;;:::o;6584:179::-;6653:10;6674:46;6716:3;6708:6;6674:46;:::i;:::-;6752:4;6747:3;6743:14;6729:28;;6664:99;;;;:::o;6769:179::-;6838:10;6859:46;6901:3;6893:6;6859:46;:::i;:::-;6937:4;6932:3;6928:14;6914:28;;6849:99;;;;:::o;6954:108::-;7031:24;7049:5;7031:24;:::i;:::-;7026:3;7019:37;7009:53;;:::o;7068:118::-;7155:24;7173:5;7155:24;:::i;:::-;7150:3;7143:37;7133:53;;:::o;7222:732::-;7341:3;7370:54;7418:5;7370:54;:::i;:::-;7440:86;7519:6;7514:3;7440:86;:::i;:::-;7433:93;;7550:56;7600:5;7550:56;:::i;:::-;7629:7;7660:1;7645:284;7670:6;7667:1;7664:13;7645:284;;;7746:6;7740:13;7773:63;7832:3;7817:13;7773:63;:::i;:::-;7766:70;;7859:60;7912:6;7859:60;:::i;:::-;7849:70;;7705:224;7692:1;7689;7685:9;7680:14;;7645:284;;;7649:14;7945:3;7938:10;;7346:608;;;;;;;:::o;7990:732::-;8109:3;8138:54;8186:5;8138:54;:::i;:::-;8208:86;8287:6;8282:3;8208:86;:::i;:::-;8201:93;;8318:56;8368:5;8318:56;:::i;:::-;8397:7;8428:1;8413:284;8438:6;8435:1;8432:13;8413:284;;;8514:6;8508:13;8541:63;8600:3;8585:13;8541:63;:::i;:::-;8534:70;;8627:60;8680:6;8627:60;:::i;:::-;8617:70;;8473:224;8460:1;8457;8453:9;8448:14;;8413:284;;;8417:14;8713:3;8706:10;;8114:608;;;;;;;:::o;8728:109::-;8809:21;8824:5;8809:21;:::i;:::-;8804:3;8797:34;8787:50;;:::o;8843:373::-;8947:3;8975:38;9007:5;8975:38;:::i;:::-;9029:88;9110:6;9105:3;9029:88;:::i;:::-;9022:95;;9126:52;9171:6;9166:3;9159:4;9152:5;9148:16;9126:52;:::i;:::-;9203:6;9198:3;9194:16;9187:23;;8951:265;;;;;:::o;9222:364::-;9310:3;9338:39;9371:5;9338:39;:::i;:::-;9393:71;9457:6;9452:3;9393:71;:::i;:::-;9386:78;;9473:52;9518:6;9513:3;9506:4;9499:5;9495:16;9473:52;:::i;:::-;9550:29;9572:6;9550:29;:::i;:::-;9545:3;9541:39;9534:46;;9314:272;;;;;:::o;9592:366::-;9734:3;9755:67;9819:2;9814:3;9755:67;:::i;:::-;9748:74;;9831:93;9920:3;9831:93;:::i;:::-;9949:2;9944:3;9940:12;9933:19;;9738:220;;;:::o;9964:366::-;10106:3;10127:67;10191:2;10186:3;10127:67;:::i;:::-;10120:74;;10203:93;10292:3;10203:93;:::i;:::-;10321:2;10316:3;10312:12;10305:19;;10110:220;;;:::o;10336:366::-;10478:3;10499:67;10563:2;10558:3;10499:67;:::i;:::-;10492:74;;10575:93;10664:3;10575:93;:::i;:::-;10693:2;10688:3;10684:12;10677:19;;10482:220;;;:::o;10708:366::-;10850:3;10871:67;10935:2;10930:3;10871:67;:::i;:::-;10864:74;;10947:93;11036:3;10947:93;:::i;:::-;11065:2;11060:3;11056:12;11049:19;;10854:220;;;:::o;11080:366::-;11222:3;11243:67;11307:2;11302:3;11243:67;:::i;:::-;11236:74;;11319:93;11408:3;11319:93;:::i;:::-;11437:2;11432:3;11428:12;11421:19;;11226:220;;;:::o;11452:366::-;11594:3;11615:67;11679:2;11674:3;11615:67;:::i;:::-;11608:74;;11691:93;11780:3;11691:93;:::i;:::-;11809:2;11804:3;11800:12;11793:19;;11598:220;;;:::o;11824:366::-;11966:3;11987:67;12051:2;12046:3;11987:67;:::i;:::-;11980:74;;12063:93;12152:3;12063:93;:::i;:::-;12181:2;12176:3;12172:12;12165:19;;11970:220;;;:::o;12196:366::-;12338:3;12359:67;12423:2;12418:3;12359:67;:::i;:::-;12352:74;;12435:93;12524:3;12435:93;:::i;:::-;12553:2;12548:3;12544:12;12537:19;;12342:220;;;:::o;12568:366::-;12710:3;12731:67;12795:2;12790:3;12731:67;:::i;:::-;12724:74;;12807:93;12896:3;12807:93;:::i;:::-;12925:2;12920:3;12916:12;12909:19;;12714:220;;;:::o;12940:366::-;13082:3;13103:67;13167:2;13162:3;13103:67;:::i;:::-;13096:74;;13179:93;13268:3;13179:93;:::i;:::-;13297:2;13292:3;13288:12;13281:19;;13086:220;;;:::o;13312:366::-;13454:3;13475:67;13539:2;13534:3;13475:67;:::i;:::-;13468:74;;13551:93;13640:3;13551:93;:::i;:::-;13669:2;13664:3;13660:12;13653:19;;13458:220;;;:::o;13684:366::-;13826:3;13847:67;13911:2;13906:3;13847:67;:::i;:::-;13840:74;;13923:93;14012:3;13923:93;:::i;:::-;14041:2;14036:3;14032:12;14025:19;;13830:220;;;:::o;14056:366::-;14198:3;14219:67;14283:2;14278:3;14219:67;:::i;:::-;14212:74;;14295:93;14384:3;14295:93;:::i;:::-;14413:2;14408:3;14404:12;14397:19;;14202:220;;;:::o;14428:366::-;14570:3;14591:67;14655:2;14650:3;14591:67;:::i;:::-;14584:74;;14667:93;14756:3;14667:93;:::i;:::-;14785:2;14780:3;14776:12;14769:19;;14574:220;;;:::o;14800:108::-;14877:24;14895:5;14877:24;:::i;:::-;14872:3;14865:37;14855:53;;:::o;14914:118::-;15001:24;15019:5;15001:24;:::i;:::-;14996:3;14989:37;14979:53;;:::o;15038:112::-;15121:22;15137:5;15121:22;:::i;:::-;15116:3;15109:35;15099:51;;:::o;15156:271::-;15286:3;15308:93;15397:3;15388:6;15308:93;:::i;:::-;15301:100;;15418:3;15411:10;;15290:137;;;;:::o;15433:222::-;15526:4;15564:2;15553:9;15549:18;15541:26;;15577:71;15645:1;15634:9;15630:17;15621:6;15577:71;:::i;:::-;15531:124;;;;:::o;15661:332::-;15782:4;15820:2;15809:9;15805:18;15797:26;;15833:71;15901:1;15890:9;15886:17;15877:6;15833:71;:::i;:::-;15914:72;15982:2;15971:9;15967:18;15958:6;15914:72;:::i;:::-;15787:206;;;;;:::o;15999:442::-;16148:4;16186:2;16175:9;16171:18;16163:26;;16199:71;16267:1;16256:9;16252:17;16243:6;16199:71;:::i;:::-;16280:72;16348:2;16337:9;16333:18;16324:6;16280:72;:::i;:::-;16362;16430:2;16419:9;16415:18;16406:6;16362:72;:::i;:::-;16153:288;;;;;;:::o;16447:332::-;16568:4;16606:2;16595:9;16591:18;16583:26;;16619:71;16687:1;16676:9;16672:17;16663:6;16619:71;:::i;:::-;16700:72;16768:2;16757:9;16753:18;16744:6;16700:72;:::i;:::-;16573:206;;;;;:::o;16785:775::-;17018:4;17056:3;17045:9;17041:19;17033:27;;17070:71;17138:1;17127:9;17123:17;17114:6;17070:71;:::i;:::-;17151:72;17219:2;17208:9;17204:18;17195:6;17151:72;:::i;:::-;17233;17301:2;17290:9;17286:18;17277:6;17233:72;:::i;:::-;17315;17383:2;17372:9;17368:18;17359:6;17315:72;:::i;:::-;17397:73;17465:3;17454:9;17450:19;17441:6;17397:73;:::i;:::-;17480;17548:3;17537:9;17533:19;17524:6;17480:73;:::i;:::-;17023:537;;;;;;;;;:::o;17566:373::-;17709:4;17747:2;17736:9;17732:18;17724:26;;17796:9;17790:4;17786:20;17782:1;17771:9;17767:17;17760:47;17824:108;17927:4;17918:6;17824:108;:::i;:::-;17816:116;;17714:225;;;;:::o;17945:210::-;18032:4;18070:2;18059:9;18055:18;18047:26;;18083:65;18145:1;18134:9;18130:17;18121:6;18083:65;:::i;:::-;18037:118;;;;:::o;18161:313::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:78;18462:4;18453:6;18389:78;:::i;:::-;18381:86;;18279:195;;;;:::o;18480:419::-;18646:4;18684:2;18673:9;18669:18;18661:26;;18733:9;18727:4;18723:20;18719:1;18708:9;18704:17;18697:47;18761:131;18887:4;18761:131;:::i;:::-;18753:139;;18651:248;;;:::o;18905:419::-;19071:4;19109:2;19098:9;19094:18;19086:26;;19158:9;19152:4;19148:20;19144:1;19133:9;19129:17;19122:47;19186:131;19312:4;19186:131;:::i;:::-;19178:139;;19076:248;;;:::o;19330:419::-;19496:4;19534:2;19523:9;19519:18;19511:26;;19583:9;19577:4;19573:20;19569:1;19558:9;19554:17;19547:47;19611:131;19737:4;19611:131;:::i;:::-;19603:139;;19501:248;;;:::o;19755:419::-;19921:4;19959:2;19948:9;19944:18;19936:26;;20008:9;20002:4;19998:20;19994:1;19983:9;19979:17;19972:47;20036:131;20162:4;20036:131;:::i;:::-;20028:139;;19926:248;;;:::o;20180:419::-;20346:4;20384:2;20373:9;20369:18;20361:26;;20433:9;20427:4;20423:20;20419:1;20408:9;20404:17;20397:47;20461:131;20587:4;20461:131;:::i;:::-;20453:139;;20351:248;;;:::o;20605:419::-;20771:4;20809:2;20798:9;20794:18;20786:26;;20858:9;20852:4;20848:20;20844:1;20833:9;20829:17;20822:47;20886:131;21012:4;20886:131;:::i;:::-;20878:139;;20776:248;;;:::o;21030:419::-;21196:4;21234:2;21223:9;21219:18;21211:26;;21283:9;21277:4;21273:20;21269:1;21258:9;21254:17;21247:47;21311:131;21437:4;21311:131;:::i;:::-;21303:139;;21201:248;;;:::o;21455:419::-;21621:4;21659:2;21648:9;21644:18;21636:26;;21708:9;21702:4;21698:20;21694:1;21683:9;21679:17;21672:47;21736:131;21862:4;21736:131;:::i;:::-;21728:139;;21626:248;;;:::o;21880:419::-;22046:4;22084:2;22073:9;22069:18;22061:26;;22133:9;22127:4;22123:20;22119:1;22108:9;22104:17;22097:47;22161:131;22287:4;22161:131;:::i;:::-;22153:139;;22051:248;;;:::o;22305:419::-;22471:4;22509:2;22498:9;22494:18;22486:26;;22558:9;22552:4;22548:20;22544:1;22533:9;22529:17;22522:47;22586:131;22712:4;22586:131;:::i;:::-;22578:139;;22476:248;;;:::o;22730:419::-;22896:4;22934:2;22923:9;22919:18;22911:26;;22983:9;22977:4;22973:20;22969:1;22958:9;22954:17;22947:47;23011:131;23137:4;23011:131;:::i;:::-;23003:139;;22901:248;;;:::o;23155:419::-;23321:4;23359:2;23348:9;23344:18;23336:26;;23408:9;23402:4;23398:20;23394:1;23383:9;23379:17;23372:47;23436:131;23562:4;23436:131;:::i;:::-;23428:139;;23326:248;;;:::o;23580:419::-;23746:4;23784:2;23773:9;23769:18;23761:26;;23833:9;23827:4;23823:20;23819:1;23808:9;23804:17;23797:47;23861:131;23987:4;23861:131;:::i;:::-;23853:139;;23751:248;;;:::o;24005:419::-;24171:4;24209:2;24198:9;24194:18;24186:26;;24258:9;24252:4;24248:20;24244:1;24233:9;24229:17;24222:47;24286:131;24412:4;24286:131;:::i;:::-;24278:139;;24176:248;;;:::o;24430:222::-;24523:4;24561:2;24550:9;24546:18;24538:26;;24574:71;24642:1;24631:9;24627:17;24618:6;24574:71;:::i;:::-;24528:124;;;;:::o;24658:483::-;24829:4;24867:2;24856:9;24852:18;24844:26;;24880:71;24948:1;24937:9;24933:17;24924:6;24880:71;:::i;:::-;24998:9;24992:4;24988:20;24983:2;24972:9;24968:18;24961:48;25026:108;25129:4;25120:6;25026:108;:::i;:::-;25018:116;;24834:307;;;;;:::o;25147:815::-;25402:4;25440:3;25429:9;25425:19;25417:27;;25454:71;25522:1;25511:9;25507:17;25498:6;25454:71;:::i;:::-;25535:72;25603:2;25592:9;25588:18;25579:6;25535:72;:::i;:::-;25654:9;25648:4;25644:20;25639:2;25628:9;25624:18;25617:48;25682:108;25785:4;25776:6;25682:108;:::i;:::-;25674:116;;25800:72;25868:2;25857:9;25853:18;25844:6;25800:72;:::i;:::-;25882:73;25950:3;25939:9;25935:19;25926:6;25882:73;:::i;:::-;25407:555;;;;;;;;:::o;25968:442::-;26117:4;26155:2;26144:9;26140:18;26132:26;;26168:71;26236:1;26225:9;26221:17;26212:6;26168:71;:::i;:::-;26249:72;26317:2;26306:9;26302:18;26293:6;26249:72;:::i;:::-;26331;26399:2;26388:9;26384:18;26375:6;26331:72;:::i;:::-;26122:288;;;;;;:::o;26416:214::-;26505:4;26543:2;26532:9;26528:18;26520:26;;26556:67;26620:1;26609:9;26605:17;26596:6;26556:67;:::i;:::-;26510:120;;;;:::o;26636:129::-;26670:6;26697:20;;:::i;:::-;26687:30;;26726:33;26754:4;26746:6;26726:33;:::i;:::-;26677:88;;;:::o;26771:75::-;26804:6;26837:2;26831:9;26821:19;;26811:35;:::o;26852:311::-;26929:4;27019:18;27011:6;27008:30;27005:2;;;27041:18;;:::i;:::-;27005:2;27091:4;27083:6;27079:17;27071:25;;27151:4;27145;27141:15;27133:23;;26934:229;;;:::o;27169:132::-;27236:4;27259:3;27251:11;;27289:4;27284:3;27280:14;27272:22;;27241:60;;;:::o;27307:132::-;27374:4;27397:3;27389:11;;27427:4;27422:3;27418:14;27410:22;;27379:60;;;:::o;27445:114::-;27512:6;27546:5;27540:12;27530:22;;27519:40;;;:::o;27565:114::-;27632:6;27666:5;27660:12;27650:22;;27639:40;;;:::o;27685:98::-;27736:6;27770:5;27764:12;27754:22;;27743:40;;;:::o;27789:99::-;27841:6;27875:5;27869:12;27859:22;;27848:40;;;:::o;27894:113::-;27964:4;27996;27991:3;27987:14;27979:22;;27969:38;;;:::o;28013:113::-;28083:4;28115;28110:3;28106:14;28098:22;;28088:38;;;:::o;28132:184::-;28231:11;28265:6;28260:3;28253:19;28305:4;28300:3;28296:14;28281:29;;28243:73;;;;:::o;28322:184::-;28421:11;28455:6;28450:3;28443:19;28495:4;28490:3;28486:14;28471:29;;28433:73;;;;:::o;28512:147::-;28613:11;28650:3;28635:18;;28625:34;;;;:::o;28665:169::-;28749:11;28783:6;28778:3;28771:19;28823:4;28818:3;28814:14;28799:29;;28761:73;;;;:::o;28840:305::-;28880:3;28899:20;28917:1;28899:20;:::i;:::-;28894:25;;28933:20;28951:1;28933:20;:::i;:::-;28928:25;;29087:1;29019:66;29015:74;29012:1;29009:81;29006:2;;;29093:18;;:::i;:::-;29006:2;29137:1;29134;29130:9;29123:16;;28884:261;;;;:::o;29151:191::-;29191:4;29211:20;29229:1;29211:20;:::i;:::-;29206:25;;29245:20;29263:1;29245:20;:::i;:::-;29240:25;;29284:1;29281;29278:8;29275:2;;;29289:18;;:::i;:::-;29275:2;29334:1;29331;29327:9;29319:17;;29196:146;;;;:::o;29348:96::-;29385:7;29414:24;29432:5;29414:24;:::i;:::-;29403:35;;29393:51;;;:::o;29450:90::-;29484:7;29527:5;29520:13;29513:21;29502:32;;29492:48;;;:::o;29546:126::-;29583:7;29623:42;29616:5;29612:54;29601:65;;29591:81;;;:::o;29678:77::-;29715:7;29744:5;29733:16;;29723:32;;;:::o;29761:86::-;29796:7;29836:4;29829:5;29825:16;29814:27;;29804:43;;;:::o;29853:307::-;29921:1;29931:113;29945:6;29942:1;29939:13;29931:113;;;30030:1;30025:3;30021:11;30015:18;30011:1;30006:3;30002:11;29995:39;29967:2;29964:1;29960:10;29955:15;;29931:113;;;30062:6;30059:1;30056:13;30053:2;;;30142:1;30133:6;30128:3;30124:16;30117:27;30053:2;29902:258;;;;:::o;30166:320::-;30210:6;30247:1;30241:4;30237:12;30227:22;;30294:1;30288:4;30284:12;30315:18;30305:2;;30371:4;30363:6;30359:17;30349:27;;30305:2;30433;30425:6;30422:14;30402:18;30399:38;30396:2;;;30452:18;;:::i;:::-;30396:2;30217:269;;;;:::o;30492:281::-;30575:27;30597:4;30575:27;:::i;:::-;30567:6;30563:40;30705:6;30693:10;30690:22;30669:18;30657:10;30654:34;30651:62;30648:2;;;30716:18;;:::i;:::-;30648:2;30756:10;30752:2;30745:22;30535:238;;;:::o;30779:180::-;30827:77;30824:1;30817:88;30924:4;30921:1;30914:15;30948:4;30945:1;30938:15;30965:180;31013:77;31010:1;31003:88;31110:4;31107:1;31100:15;31134:4;31131:1;31124:15;31151:180;31199:77;31196:1;31189:88;31296:4;31293:1;31286:15;31320:4;31317:1;31310:15;31337:102;31378:6;31429:2;31425:7;31420:2;31413:5;31409:14;31405:28;31395:38;;31385:54;;;:::o;31445:222::-;31585:34;31581:1;31573:6;31569:14;31562:58;31654:5;31649:2;31641:6;31637:15;31630:30;31551:116;:::o;31673:221::-;31813:34;31809:1;31801:6;31797:14;31790:58;31882:4;31877:2;31869:6;31865:15;31858:29;31779:115;:::o;31900:225::-;32040:34;32036:1;32028:6;32024:14;32017:58;32109:8;32104:2;32096:6;32092:15;32085:33;32006:119;:::o;32131:225::-;32271:34;32267:1;32259:6;32255:14;32248:58;32340:8;32335:2;32327:6;32323:15;32316:33;32237:119;:::o;32362:180::-;32502:32;32498:1;32490:6;32486:14;32479:56;32468:74;:::o;32548:227::-;32688:34;32684:1;32676:6;32672:14;32665:58;32757:10;32752:2;32744:6;32740:15;32733:35;32654:121;:::o;32781:224::-;32921:34;32917:1;32909:6;32905:14;32898:58;32990:7;32985:2;32977:6;32973:15;32966:32;32887:118;:::o;33011:223::-;33151:34;33147:1;33139:6;33135:14;33128:58;33220:6;33215:2;33207:6;33203:15;33196:31;33117:117;:::o;33240:179::-;33380:31;33376:1;33368:6;33364:14;33357:55;33346:73;:::o;33425:222::-;33565:34;33561:1;33553:6;33549:14;33542:58;33634:5;33629:2;33621:6;33617:15;33610:30;33531:116;:::o;33653:229::-;33793:34;33789:1;33781:6;33777:14;33770:58;33862:12;33857:2;33849:6;33845:15;33838:37;33759:123;:::o;33888:237::-;34028:34;34024:1;34016:6;34012:14;34005:58;34097:20;34092:2;34084:6;34080:15;34073:45;33994:131;:::o;34131:241::-;34271:34;34267:1;34259:6;34255:14;34248:58;34340:24;34335:2;34327:6;34323:15;34316:49;34237:135;:::o;34378:224::-;34518:34;34514:1;34506:6;34502:14;34495:58;34587:7;34582:2;34574:6;34570:15;34563:32;34484:118;:::o;34608:122::-;34681:24;34699:5;34681:24;:::i;:::-;34674:5;34671:35;34661:2;;34720:1;34717;34710:12;34661:2;34651:79;:::o;34736:116::-;34806:21;34821:5;34806:21;:::i;:::-;34799:5;34796:32;34786:2;;34842:1;34839;34832:12;34786:2;34776:76;:::o;34858:122::-;34931:24;34949:5;34931:24;:::i;:::-;34924:5;34921:35;34911:2;;34970:1;34967;34960:12;34911:2;34901:79;:::o

Swarm Source

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