Contract

0xF7e77E05eE3384c1bD08560565309a24B5EFe9E1

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Incubator

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 9999 runs

Other Settings:
cancun EvmVersion, MIT license
File 1 of 9 : Incubator.sol
/*

 █▀ █▀█ █▄░█ █ █▀▀ █▀▀ ▄▀█ █▀▀ ▀█▀ █▀█ █▀█ █▄█
 ▄█ █▄█ █░▀█ █ █▄▄ █▀░ █▀█ █▄▄ ░█░ █▄█ █▀▄ ░█░

  Trade on SonicFactory and have fun!
  Web:      https://sonicfactory.fun/

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

import "./interfaces/IERC20.sol";
import "./interfaces/IIncubatorToken.sol";
import "./interfaces/IIncubatorPair.sol";
import "./interfaces/IUniswapV2Router.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./Ownable.sol";
import "./Token/Token.sol";

contract Incubator is Ownable {
  uint8 private _PAUSED;
  uint8 private _initialized;
  uint8 private constant _DECIMALS = 18;
  uint24 private _SWAP_FEE;
  uint24 private _REFERRAL_FEE;
  uint24 private _ESCAPE_FEE;
  uint24 private _ESCAPE_CREATOR_FEE;
  uint24 private _TOKEN_INITIAL_PERCENT;
  uint112 private _ETH_RESERVE_VIRTUAL_INITIAL;
  uint112 private _ETH_RESERVE_ESCAPE_TARGET;
  uint256 private _CREATION_FEE;
  uint256 private constant _TOTAL_SUPPLY = 1_000_000_000 ether;

  address private _AUTHORIZED;
  address private _TREASURY;
  address private _ROUTER_INCUBATOR;
  address private _WETH_INCUBATOR;
  address[] private _tokenList;
  address[] private _unauthorizedList;

  mapping(address => TokenData) private _tokenData;
  mapping(address => RouterData) private _routerData;
  mapping(address => bool) private _creatorData;
  mapping(address => address) private _pairData;

  struct TokenData {
    bytes32 salt;
    uint24 maxBalance;
    uint24 fee;
    uint24 tax;
    uint24 ref;
    uint32 creation;
    uint32 launch;
    uint32 escaped;
    uint112 ethReserveEscapeTarget;
    uint112 ethReserveVirtualInitial;
    uint112 ethReserveEscaped;
    uint112 tokenReserveInitial;
    uint256 tokenReserveEscaped;
    uint256 initialSupply;
    uint256 creationFee;
    uint256 escapeFee;
    address creator;
    address referral;
    address routerIncubator;
    address pairIncubator;
    address routerFinal;
    bool autoEscape;
  }

  struct TokenDataView {
    string name;
    string symbol;
    uint8 decimals;
    uint24 maxBalance;
    uint24 fee;
    uint24 tax;
    uint24 ref;
    uint24 holders;
    uint32 creation;
    uint32 launch;
    uint32 escaped;
    uint112 ethReserveEscapeTarget;
    uint112 ethReserveEscaped;
    uint112 ethReserveVirtualInitial;
    uint112 ethReserve;
    uint112 tokenReserveInitial;
    uint112 tokenReserve;
    uint256 tokenReserveEscaped;
    uint256 initialSupply;
    uint256 totalSupply;
    uint256 creationFee;
    uint256 escapeFee;
    address creator;
    address referral;
    address routerIncubator;
    address pairIncubator;
    address routerFinal;
    bool autoEscape;
  }

  struct RouterData {
    bool exists;
    bool enabled;
  }

  struct TokenListView {
    address token;
    address creator;
    bytes32 salt;
  }

  struct currentStatusView {
    address routerIncubator;
    uint8 paused;
    uint8 decimals;
    uint24 swapFee;
    uint24 referralFee;
    uint24 escapeFee;
    uint24 escapeCreatorFee;
    uint24 tokenInitialPercent;
    uint112 ethReserveVirtualInitial;
    uint112 ethReserveEscapeTarget;
    uint256 creationFee;
    uint256 totalSupply;
  }

  event TokenDeployed(address indexed token, address indexed creator, bytes32 salt);
  event TokenEscaped(address indexed token, uint32 escapeTime, uint112 ethReserveEscaped, uint256 tokenReserveEscaped, uint256 escapeFee);
  event TokenTraded(address indexed token, uint32 tradeTime, address indexed user, bool buy, uint112 ethReserve, uint112 tokenReserve, uint256 ethAmount, uint256 tokenAmount, uint256 feeAmount, uint256 taxAmount, uint256 refAmount);
  event WithdrawnETH(address indexed to, uint256 value);
  event WithdrawnERC20(address token, address indexed to, uint256 value);

  error ErrorPaused();
  error ErrorReferral();
  error ErrorTransfer(address to, uint256 value);
  error ErrorRouterUnavailable(address router);
  error ErrorTokenMinimumValue(uint256 value);
  error ErrorUnknownToken(address token);
  error ErrorUnescapedToken(address token);
  error ErrorTokenMaxBalance(uint24 percent);
  error ErrorTokenTax(uint24 percent);
  error ErrorTokenLiquidity(uint256 tokenAmount, uint256 ethAmount);
  error ErrorInvalidRange();

  modifier onlyOwnerOrAuthorized() {
    if (msg.sender != _owner && msg.sender != _AUTHORIZED) { revert ErrorUnauthorized(msg.sender); }

    _;
  }

  modifier isToken(address token) {
    if (_tokenData[token].creator == address(0)) { revert ErrorUnknownToken(token); }

    _;
  }

  modifier isPairOfToken() {
    if (_pairData[msg.sender] == address(0)) { revert ErrorUnauthorized(msg.sender); }

    _;
  }

  constructor() payable {}

  function initialize() external {
    require(_initialized == 0);

    _SWAP_FEE = 1_000;               // 1%
    _REFERRAL_FEE = 20_000;          // 20% of _SWAP_FEE
    _ESCAPE_FEE = 5_000;             // 5%
    _ESCAPE_CREATOR_FEE = 50_000;    // 50% of _ESCAPE_FEE
    _TOKEN_INITIAL_PERCENT = 100_000; // 100%
    _ETH_RESERVE_VIRTUAL_INITIAL = 0.8 ether;
    _ETH_RESERVE_ESCAPE_TARGET = 3.8 ether;

    _transferOwnership(msg.sender);
    _initialized = 1;
  }

  function setPaused(bool status) external onlyOwner {
    _PAUSED = status ? 1 : 0;
  }

  function setAuthorized(address authorized) external onlyOwner {
    _AUTHORIZED = authorized;
  }

  function setFees(uint256 creationFee, uint24 swapFee, uint24 referralFee, uint24 escapeFee, uint24 escapeCreatorFee) external onlyOwner {
    require(swapFee <= 5_000);            // Max. 5%
    require(referralFee <= 50_000);       // Max. 50% of swapFee
    require(escapeFee <= 25_000);         // Max. 25%
    require(escapeCreatorFee <= 100_000); // Max. 100% of escapeFee

    _CREATION_FEE = creationFee;
    _SWAP_FEE = swapFee;
    _REFERRAL_FEE = referralFee;
    _ESCAPE_FEE = escapeFee;
    _ESCAPE_CREATOR_FEE = escapeCreatorFee;
  }

  function setTokenReserves(uint24 percent) external onlyOwner {
    require(percent >= 50_000 && percent <= 100_000); // 50% to 100%

    _TOKEN_INITIAL_PERCENT = percent;
  }

  function setEthReserves(uint112 ethReserveVirtualInitial, uint112 ethReserveEscapeTarget) external onlyOwner {
    _ETH_RESERVE_VIRTUAL_INITIAL = ethReserveVirtualInitial;
    _ETH_RESERVE_ESCAPE_TARGET = ethReserveEscapeTarget;
  }

  function setRouterIncubator(address router) external onlyOwner {
    _ROUTER_INCUBATOR = router;
    _WETH_INCUBATOR = IUniswapV2Router(router).WETH();
  }

  function setRouterFinal(address router, bool enabled, address[] calldata related) external onlyOwner {
    RouterData storage _router = _routerData[router];

    _router.enabled = enabled;

    if (!_router.exists) {
      _router.exists = true;

      _unauthorizedList.push(router);

      unchecked {
        uint256 cnt = related.length;

        for (uint256 i; i < cnt; i++) { _unauthorizedList.push(related[i]); }
      }
    }
  }

  function listTokens(uint256 offset, uint256 limit) external view returns (TokenListView[] memory) {
    uint256 cnt = _tokenList.length;
    uint256 total;

    unchecked {
      total = (offset + limit > cnt) ? (cnt - offset) : limit;

      if (total > cnt) { revert ErrorInvalidRange(); }
    }

    TokenListView[] memory data = new TokenListView[](total);

    unchecked {
      uint256 j;
      uint256 max = offset + total;

      for (uint256 i = offset; i < max; i++) {
        address token = _tokenList[i];

        TokenData storage tokenData = _tokenData[token];

        data[j++] = TokenListView(token, tokenData.creator, tokenData.salt);
      }
    }

    return data;
  }

  function getTokenData(address token) public view isToken(token) returns (TokenDataView memory data) {
    TokenData storage tokenData = _tokenData[token];

    data.name = IERC20(token).name();
    data.symbol = IERC20(token).symbol();
    data.decimals = IERC20(token).decimals();
    data.creator = tokenData.creator;
    data.referral = tokenData.referral;
    data.creation = tokenData.creation;
    data.launch = tokenData.launch;
    data.maxBalance = tokenData.maxBalance;
    data.fee = tokenData.fee;
    data.tax = tokenData.tax;
    data.ref = tokenData.ref;
    data.holders = IIncubatorToken(token).totalHolders();
    data.routerIncubator = tokenData.routerIncubator;
    data.pairIncubator = tokenData.pairIncubator;
    data.routerFinal = tokenData.routerFinal;
    data.escaped = tokenData.escaped;
    data.initialSupply = tokenData.initialSupply;
    data.totalSupply = IERC20(token).totalSupply();
    data.ethReserveEscapeTarget = tokenData.ethReserveEscapeTarget;
    data.ethReserveVirtualInitial = tokenData.ethReserveVirtualInitial;
    data.tokenReserveInitial = tokenData.tokenReserveInitial;
    data.creationFee = tokenData.creationFee;
    data.escapeFee = tokenData.escapeFee;
    data.autoEscape = tokenData.autoEscape;

    if (tokenData.escaped == 0) {
      data.ethReserve = uint112(IERC20(_WETH_INCUBATOR).balanceOf(tokenData.pairIncubator));
      data.tokenReserve = uint112(IERC20(token).balanceOf(tokenData.pairIncubator));
    } else {
      data.ethReserveEscaped = tokenData.ethReserveEscaped;
      data.tokenReserveEscaped = tokenData.tokenReserveEscaped;
    }
  }

  function deployToken(bytes32 _salt, string memory _name, string memory _symbol, uint24 _maxBalance, uint24 _tax, uint32 _launch, address _routerFinal, bool _autoEscape, address _referral) external payable returns (address token) {
    if (_PAUSED == 1) { revert ErrorPaused(); }
    if (!_routerData[_routerFinal].enabled) { revert ErrorRouterUnavailable(_routerFinal); }
    if (_referral != address(0) && (_referral == msg.sender || !_creatorData[_referral])) { revert ErrorReferral(); }

    uint256 value = msg.value;

    if (value < _CREATION_FEE) { revert ErrorTokenMinimumValue(_CREATION_FEE); }
    if (_maxBalance < 100 && _maxBalance > 100_000) { revert ErrorTokenMaxBalance(_maxBalance); } // Min. 0.1%
    if (_tax > 10_000) { revert ErrorTokenTax(_tax); } // Max. 10%

    Token _token = new Token{ salt: _salt }(address(this), msg.sender, _name, _symbol, _DECIMALS, _TOTAL_SUPPLY);

    token = address(_token);

    TokenData storage tokenData = _tokenData[token];

    tokenData.creator = msg.sender;
    tokenData.salt = _salt;
    tokenData.referral = _referral;
    tokenData.creation = _timestamp();
    tokenData.maxBalance = _maxBalance;
    tokenData.fee = _SWAP_FEE;
    tokenData.tax = _tax;
    tokenData.launch = _launch > _timestamp() ? _launch : _timestamp();
    tokenData.ref = _referral == address(0) ? uint24(0) : _REFERRAL_FEE;
    tokenData.initialSupply = _TOTAL_SUPPLY;
    tokenData.routerIncubator = _ROUTER_INCUBATOR;
    tokenData.pairIncubator = IUniswapV2Factory(IUniswapV2Router(_ROUTER_INCUBATOR).factory()).createPair(token, _WETH_INCUBATOR);
    tokenData.tokenReserveInitial = uint112(_percentage(_TOTAL_SUPPLY, uint256(_TOKEN_INITIAL_PERCENT)));
    tokenData.ethReserveVirtualInitial = _ETH_RESERVE_VIRTUAL_INITIAL;
    tokenData.ethReserveEscapeTarget = _ETH_RESERVE_ESCAPE_TARGET;
    tokenData.routerFinal = _routerFinal;
    tokenData.autoEscape = _autoEscape;

    _tokenList.push(token);
    _pairData[tokenData.pairIncubator] = token;

    if (!_creatorData[tokenData.creator]) { _creatorData[tokenData.creator] = true; }
    if (_CREATION_FEE > 0) {
      tokenData.creationFee = _CREATION_FEE;

      if (_TREASURY != address(0)) {
        (bool success,) = _TREASURY.call{ value: tokenData.creationFee }("");

        if (!success) { revert ErrorTransfer(_TREASURY, tokenData.creationFee); }
      }

      unchecked {
        value -= _CREATION_FEE;
      }
    }

    IIncubatorToken(token).initialize(tokenData.routerIncubator, tokenData.pairIncubator, tokenData.maxBalance, tokenData.tax, tokenData.launch, _unauthorizedList);
    IERC20(token).transfer(tokenData.pairIncubator, uint256(tokenData.tokenReserveInitial));

    emit TokenDeployed(token, tokenData.creator, _salt);

    IIncubatorPair(tokenData.pairIncubator).initializePair(tokenData.creator, _SWAP_FEE, _tax, tokenData.ref, tokenData.launch, tokenData.tokenReserveInitial, _ETH_RESERVE_VIRTUAL_INITIAL, _ETH_RESERVE_ESCAPE_TARGET, _WETH_INCUBATOR, tokenData.referral, tokenData.autoEscape);

    if (value > 0) {
      address[] memory path = new address[](2);
      path[0] = _WETH_INCUBATOR;
      path[1] = token;

      IUniswapV2Router(tokenData.routerIncubator).swapExactETHForTokensSupportingFeeOnTransferTokens{ value: value }(0, path, tokenData.creator, _timestamp());
    }
  }

  function pairSwap(address user, bool buy, uint112 ethReserve, uint112 tokenReserve, uint256 ethAmount, uint256 tokenAmount, uint256 feeAmount, uint256 taxAmount, uint256 refAmount) external isPairOfToken() {
    address token = _pairData[msg.sender];

    if (_TREASURY != address(0) && feeAmount > 0) {
      (bool success,) = _TREASURY.call{ value: feeAmount }("");

      if (!success) { revert ErrorTransfer(_TREASURY, feeAmount); }
    }

    emit TokenTraded(token, _timestamp(), user, buy, ethReserve, tokenReserve, ethAmount, tokenAmount, feeAmount, taxAmount, refAmount);
  }

  function tokenEscape(uint256 amount) external payable isPairOfToken() {
    address token = _pairData[msg.sender];
    uint256 value = msg.value;
    uint256 balance = IERC20(token).balanceOf(address(this));

    TokenData storage tokenData = _tokenData[token];

    tokenData.escaped = _timestamp();
    tokenData.tokenReserveEscaped = amount;
    tokenData.ethReserveEscaped = uint112(value);

    if (_ESCAPE_FEE > 0) {
      tokenData.escapeFee = _percentage(value, uint256(_ESCAPE_FEE));

      unchecked {
        value -= tokenData.escapeFee;
      }

      { // scope to avoid "stack too deep" error
        uint256 creatorFee;
        uint256 escapeFee;

        unchecked {
          creatorFee = _percentage(tokenData.escapeFee, uint256(_ESCAPE_CREATOR_FEE));
          escapeFee = tokenData.escapeFee - creatorFee;
        }

        if (_TREASURY != address(0)) {
          (bool txTreasuryFee,) = _TREASURY.call{ value: escapeFee }("");

          if (!txTreasuryFee) { revert ErrorTransfer(_TREASURY, escapeFee); }
        }

        (bool txCreatorFee,) = tokenData.creator.call{ value: creatorFee }("");

        if (!txCreatorFee) { revert ErrorTransfer(tokenData.creator, creatorFee); }
      }
    }

    IIncubatorToken(token).escape();

    if (_AUTHORIZED != address(0)) {
      IERC20(token).transfer(_AUTHORIZED, balance);

      (bool success,) = _AUTHORIZED.call{ value: value }("");

      if (!success) { revert ErrorTransfer(_AUTHORIZED, value); }
    }

    emit TokenEscaped(token, tokenData.escaped, tokenData.ethReserveEscaped, tokenData.tokenReserveEscaped, tokenData.escapeFee);
  }

  function currentStatus() external view returns (currentStatusView memory data) {
    data.paused = _PAUSED;
    data.decimals = _DECIMALS;
    data.swapFee = _SWAP_FEE;
    data.referralFee = _REFERRAL_FEE;
    data.escapeFee = _ESCAPE_FEE;
    data.escapeCreatorFee = _ESCAPE_CREATOR_FEE;
    data.tokenInitialPercent = _TOKEN_INITIAL_PERCENT;
    data.ethReserveVirtualInitial = _ETH_RESERVE_VIRTUAL_INITIAL;
    data.ethReserveEscapeTarget = _ETH_RESERVE_ESCAPE_TARGET;
    data.creationFee = _CREATION_FEE;
    data.totalSupply = _TOTAL_SUPPLY;
    data.routerIncubator = _ROUTER_INCUBATOR;
  }

  function setTreasury(address treasury) external onlyOwner {
    _TREASURY = treasury;
  }

  function withdrawETH(address to, uint256 value) external onlyOwnerOrAuthorized {
    (bool success,) = to.call{ value: value }("");

    if (!success) { revert ErrorTransfer(to, value); }

    emit WithdrawnETH(to, value);
  }

  function withdrawERC20(address token, address to, uint256 value) external onlyOwnerOrAuthorized {
    IERC20(token).transfer(to, value);

    emit WithdrawnERC20(token, to, value);
  }

  function _timestamp() private view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }

  function _percentage(uint256 value, uint256 bps) private pure returns (uint256) {
    unchecked {
      return (value * bps) / 100_000;
    }
  }

  receive() external payable {}
}

File 2 of 9 : Token.sol
/*

 █▀ █▀█ █▄░█ █ █▀▀ █▀▀ ▄▀█ █▀▀ ▀█▀ █▀█ █▀█ █▄█
 ▄█ █▄█ █░▀█ █ █▄▄ █▀░ █▀█ █▄▄ ░█░ █▄█ █▀▄ ░█░

  Trade on SonicFactory and have fun!
  Web:      https://sonicfactory.fun/

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

import "./ERC20.sol";

contract Token is ERC20 {
  address private immutable _creator;
  address private _owner;
  address private _router;
  address private _pair;

  bool private _escaped;
  bool private _initialized;
  uint24 private _maxBalance;
  uint24 private _tax;
  uint32 private _launch;

  mapping(address => bool) private _unauthorized;

  struct HolderView {
    address holder;
    uint256 balance;
  }

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

  error ErrorUnauthorized(address sender);
  error ErrorAlreadyInitialized();
  error ErrorUnapprovable();
  error ErrorMaxBalanceExceeded();
  error ErrorInvalidRecipient(address to);
  error ErrorInvalidRange();

  modifier onlyOwner() {
    if (msg.sender != _owner) { revert ErrorUnauthorized(msg.sender); }

    _;
  }

  constructor(address _owner_, address _creator_, string memory _name_, string memory _symbol_, uint8 _decimals_, uint256 _totalSupply_) ERC20(_name_, _symbol_, _decimals_) payable {
    _creator = _creator_;
    _owner = _owner_;
    _mint(_owner_, _totalSupply_);
  }

  function initialize(address _router_, address _pair_, uint24 _maxBalance_, uint24 _tax_, uint32 _launch_, address[] calldata _unauthorized_) external onlyOwner {
    if (_initialized) { revert ErrorAlreadyInitialized(); }

    unchecked {
      uint256 cnt = _unauthorized_.length;

      for (uint256 i; i < cnt; i++) { _unauthorized[_unauthorized_[i]] = true; }
    }

    _router = _router_;
    _pair = _pair_;
    _maxBalance = _maxBalance_;
    _tax = _tax_;
    _launch = _launch_;
    _initialized = true;
  }

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

  /// @notice Returns the creator address
  function creator() external view returns (address) {
    return _creator;
  }

  function approve(address spender, uint256 value) public override returns (bool) {
    if (!_escaped && spender != _router) { revert ErrorUnapprovable(); }

    return super.approve(spender, value);
  }

  function permit(address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public override {
    if (!_escaped && spender != _router) { revert ErrorUnapprovable(); }

    super.permit(owner_, spender, value, deadline, v, r, s);
  }

  function _transferCheck(address from, address to, uint256 value) private view {
    if (_escaped || ((from == _owner && to == _pair) || ((!_escaped && to == _owner) || value == 0 || to == address(0xdEaD) || to == _router || to == _pair))) { return; }

    if (!_escaped) {
      if (_unauthorized[to]) { revert ErrorInvalidRecipient(to); }

      unchecked {
        if (_maxBalance == 100_000 || _balance[to] + value <= _percentage(_totalSupply, uint256(_maxBalance))) { return; }
      }
    }

    revert ErrorMaxBalanceExceeded();
  }

  function transfer(address to, uint256 value) external virtual override returns (bool) {
    _transfer(msg.sender, to, value);

    return true;
  }

  function _transfer(address from, address to, uint256 value) internal virtual override {
    _transferCheck(from, to, value);

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

  function transferFrom(address from, address to, uint256 value) public override returns (bool) {
    if (!_escaped && msg.sender == _router && to == _pair && _allowance[from][_router] != type(uint256).max) { super._approve(from, _router, type(uint256).max, false); }

    _transferCheck(from, to, value);

    return super.transferFrom(from, to, value);
  }

  function totalHolders() external view returns (uint24 total) {
    return _totalHolders;
  }

  function holders(uint256 offset, uint256 limit) public view returns (HolderView[] memory) {
    if (offset >= _totalHolders) { revert ErrorInvalidRange(); }

    unchecked {
      if (offset + limit > _totalHolders) { limit = _totalHolders - offset; }
    }

    HolderView[] memory list = new HolderView[](limit);

    unchecked {
      uint256 j;

      for (uint256 i = offset; j < limit; i++) {
        address holder = _holders[i];

        if (holder == address(0xdEaD) || _balance[holder] == 0) { continue; }

        list[j].holder = holder;
        list[j].balance = _balance[holder];

        ++j;
      }
    }

    return list;
  }

  function maxBalance() external view returns (uint24) {
    return _maxBalance;
  }

  function tax() external view returns (uint24) {
    return _tax;
  }

  function launch() external view returns (uint32) {
    return _launch;
  }

  /// @notice Returns True if token has reached the target MC and is now tradeable on a public DEX
  function escaped() external view returns (bool) {
    return _escaped;
  }

  function escape() external onlyOwner {
    if (_escaped) { revert ErrorUnauthorized(msg.sender); }
    if (_maxBalance < 100_000) { _maxBalance = 100_000; } // 100%

    address _previousOwner = _owner;

    delete _tax;
    delete _owner;
    delete _router;
    delete _pair;

    _escaped = true;

    emit OwnershipTransferred(_previousOwner, _owner);
  }

  function _percentage(uint256 value, uint256 bps) private pure returns (uint256) {
    unchecked {
      return (value * bps) / 100_000;
    }
  }

  function _timestamp() private view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }
}

File 3 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

abstract contract Ownable {
  address internal _owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  error ErrorUnauthorized(address sender);

  modifier onlyOwner() {
    if (msg.sender != _owner) { revert ErrorUnauthorized(msg.sender); }

    _;
  }

  function renounceOwnership() external onlyOwner {
    _transferOwnership(address(0));
  }

  function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0));

    _transferOwnership(newOwner);
  }

  function _transferOwnership(address newOwner) internal {
    address oldOwner = _owner;
    _owner = newOwner;

    emit OwnershipTransferred(oldOwner, newOwner);
  }

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

File 4 of 9 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

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

File 5 of 9 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

interface IUniswapV2Router {
  function WETH() external pure returns (address);
  function factory() external pure returns (address);
  function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
  function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable;
}

File 6 of 9 : IIncubatorPair.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

interface IIncubatorPair {
  function initializePair(address creator, uint24 fee, uint24 tax, uint24 ref, uint32 launch, uint112 tokenInitialReserve, uint112 ethInitialVirtualReserve, uint112 ethReserveEscapeTarget, address WETH, address referral, bool autoEscape) external;
  function getTraderData(address user) external view returns (uint32 lastActivity, uint32 buys, uint32 sells, uint256 buy_volume, uint256 sell_volume);
}

File 7 of 9 : IIncubatorToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.24;

interface IIncubatorToken {
  function totalHolders() external view returns (uint24);
  function initialize(address router, address pair, uint24 maxBalance, uint24 tax, uint32 launch, address[] calldata unauthorized) external;
  function escape() external;
}

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

pragma solidity ^0.8.24;

interface IERC20 {
  function name() external view returns (string memory);
  function symbol() external view returns (string memory);
  function decimals() external view returns (uint8);
  function balanceOf(address account) external view returns (uint256);
  function totalSupply() external view returns (uint256);
  function transfer(address to, uint256 value) external returns (bool);
  function approve(address spender, uint256 value) external returns (bool);
  function burn(uint256 value) external returns (bool);
}

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

pragma solidity ^0.8.24;

abstract contract ERC20 {
  uint8 private immutable _decimals;
  uint24 internal _totalHolders;
  uint256 internal _totalSupply;

  string private _name;
  string private _symbol;
  bytes32 public immutable DOMAIN_SEPARATOR;
  bytes32 private constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

  address[] internal _holders;

  mapping(address => uint256) private _nonces;
  mapping(address => uint256) internal _balance;
  mapping(address => mapping(address => uint256)) internal _allowance;
  mapping(address => bool) internal _holderData;

  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);

  error ERC20InvalidApprover(address owner);
  error ERC20InvalidSpender(address spender);
  error ERC20InvalidSender(address sender);
  error ERC20InvalidReceiver(address to);
  error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 value);
  error ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);
  error ERC2612ExpiredSignature(uint256 deadline);
  error ERC2612InvalidSigner(address signer, address owner);

  constructor(string memory _name_, string memory _symbol_, uint8 _decimals_) {
    _name = _name_;
    _symbol = _symbol_;
    _decimals = _decimals_;

    DOMAIN_SEPARATOR = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this)));
  }

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

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

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

  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balance[account];
  }

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

  function approve(address spender, uint256 value) public virtual returns (bool) {
    _approve(msg.sender, spender, value, true);

    return true;
  }

  function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual {
    if (block.timestamp > deadline) { revert ERC2612ExpiredSignature(deadline); }

    unchecked {
      address signer = ecrecover(keccak256(abi.encodePacked(hex"1901", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline)))), v, r, s);

      if (signer != owner) { revert ERC2612InvalidSigner(signer, owner); }
    }

    _approve(owner, spender, value, true);
  }

  function nonces(address owner) external view returns (uint256) {
    return _nonces[owner];
  }

  function transfer(address to, uint256 value) external virtual returns (bool) {
    _transfer(msg.sender, to, value);

    return true;
  }

  function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
    if (value > 0) {
      address spender = msg.sender;
      uint256 allowed = allowance(from, spender);

      if (allowed < value) { revert ERC20InsufficientAllowance(to, allowed, value); }

      if (allowed != type(uint256).max) {
        unchecked {
          _approve(from, spender, allowed - value, false);
        }
      }
    }

    _transfer(from, to, value);

    return true;
  }

  function burn(uint256 value) external returns (bool) {
    _transfer(msg.sender, address(0xdEaD), value);

    return true;
  }

  function _approve(address owner, address spender, uint256 value, bool emitEvent) internal {
    if (owner == address(0)) { revert ERC20InvalidApprover(owner); }
    if (spender == address(0)) { revert ERC20InvalidSpender(spender); }

    _allowance[owner][spender] = value;

    if (emitEvent) { emit Approval(owner, spender, value); }
  }

  function _transfer(address from, address to, uint256 value) internal virtual {
    if (from == address(0)) { revert ERC20InvalidSender(from); }
    if (to == address(0) || to == address(this)) { revert ERC20InvalidReceiver(to); }
    if (_balance[from] < value) { revert ERC20InsufficientBalance(from, _balance[from], value); }

    if (value > 0) {
      unchecked {
        _balance[from] -= value;

        if (_balance[from] == 0) { --_totalHolders; }

        if (to == address(0xdEaD)) {
          _totalSupply -= value;
        } else {
          if (_balance[to] == 0) { ++_totalHolders; }

          _balance[to] += value;

          if (!_holderData[to]) {
            _holderData[to] = true;
            _holders.push(to);
          }
        }
      }
    }

    emit Transfer(from, to, value);
  }

  function _mint(address to, uint256 value) internal {
    if (to == address(0) || to == address(0xdEaD)) { revert ERC20InvalidReceiver(to); }

    unchecked {
      if (_balance[to] == 0) { ++_totalHolders; }

      _totalSupply += value;
      _balance[to] += value;

      if (!_holderData[to]) {
        _holderData[to] = true;
        _holders.push(to);
      }
    }

    emit Transfer(address(0), to, value);
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": [],
  "evmVersion": "cancun"
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ErrorInvalidRange","type":"error"},{"inputs":[],"name":"ErrorPaused","type":"error"},{"inputs":[],"name":"ErrorReferral","type":"error"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"ErrorRouterUnavailable","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"ErrorTokenLiquidity","type":"error"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"ErrorTokenMaxBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ErrorTokenMinimumValue","type":"error"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"ErrorTokenTax","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ErrorTransfer","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ErrorUnauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"ErrorUnescapedToken","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"ErrorUnknownToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"TokenDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint32","name":"escapeTime","type":"uint32"},{"indexed":false,"internalType":"uint112","name":"ethReserveEscaped","type":"uint112"},{"indexed":false,"internalType":"uint256","name":"tokenReserveEscaped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"escapeFee","type":"uint256"}],"name":"TokenEscaped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint32","name":"tradeTime","type":"uint32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint112","name":"ethReserve","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refAmount","type":"uint256"}],"name":"TokenTraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"WithdrawnERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"WithdrawnETH","type":"event"},{"inputs":[],"name":"currentStatus","outputs":[{"components":[{"internalType":"address","name":"routerIncubator","type":"address"},{"internalType":"uint8","name":"paused","type":"uint8"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint24","name":"swapFee","type":"uint24"},{"internalType":"uint24","name":"referralFee","type":"uint24"},{"internalType":"uint24","name":"escapeFee","type":"uint24"},{"internalType":"uint24","name":"escapeCreatorFee","type":"uint24"},{"internalType":"uint24","name":"tokenInitialPercent","type":"uint24"},{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"},{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct Incubator.currentStatusView","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_salt","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint24","name":"_maxBalance","type":"uint24"},{"internalType":"uint24","name":"_tax","type":"uint24"},{"internalType":"uint32","name":"_launch","type":"uint32"},{"internalType":"address","name":"_routerFinal","type":"address"},{"internalType":"bool","name":"_autoEscape","type":"bool"},{"internalType":"address","name":"_referral","type":"address"}],"name":"deployToken","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint24","name":"maxBalance","type":"uint24"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint24","name":"tax","type":"uint24"},{"internalType":"uint24","name":"ref","type":"uint24"},{"internalType":"uint24","name":"holders","type":"uint24"},{"internalType":"uint32","name":"creation","type":"uint32"},{"internalType":"uint32","name":"launch","type":"uint32"},{"internalType":"uint32","name":"escaped","type":"uint32"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscaped","type":"uint112"},{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserve","type":"uint112"},{"internalType":"uint112","name":"tokenReserveInitial","type":"uint112"},{"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"internalType":"uint256","name":"tokenReserveEscaped","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint256","name":"escapeFee","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"referral","type":"address"},{"internalType":"address","name":"routerIncubator","type":"address"},{"internalType":"address","name":"pairIncubator","type":"address"},{"internalType":"address","name":"routerFinal","type":"address"},{"internalType":"bool","name":"autoEscape","type":"bool"}],"internalType":"struct Incubator.TokenDataView","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"listTokens","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct Incubator.TokenListView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint112","name":"ethReserve","type":"uint112"},{"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"taxAmount","type":"uint256"},{"internalType":"uint256","name":"refAmount","type":"uint256"}],"name":"pairSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorized","type":"address"}],"name":"setAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"}],"name":"setEthReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint24","name":"swapFee","type":"uint24"},{"internalType":"uint24","name":"referralFee","type":"uint24"},{"internalType":"uint24","name":"escapeFee","type":"uint24"},{"internalType":"uint24","name":"escapeCreatorFee","type":"uint24"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address[]","name":"related","type":"address[]"}],"name":"setRouterFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouterIncubator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setTokenReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokenEscape","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526158d4806100115f395ff3fe60806040526004361061015a575f3560e01c80635beb0823116100bb578063af0d4f9511610071578063ef8a923511610057578063ef8a923514610380578063f0f44260146104ac578063f2fde38b146104cb575f5ffd5b8063af0d4f9514610335578063e30e5ae914610354575f5ffd5b80638129fc1c116100a15780638129fc1c146102e65780638da5cb5b146102fa578063a73cc35c14610316575f5ffd5b80635beb0823146102a7578063715018a6146102d2575f5ffd5b806337b3375f1161011057806344004cc1116100f657806344004cc11461024a5780634782f7791461026957806359d3515214610288575f5ffd5b806337b3375f14610218578063402c10391461022b575f5ffd5b806314fc28121161014057806314fc2812146101bb57806316c38b3c146101da5780631ca9ff1d146101f9575f5ffd5b806303a996c41461016557806313ff7e9f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004612d87565b6104ea565b005b348015610191575f5ffd5b506101a56101a0366004612e0a565b610675565b6040516101b29190612e5a565b60405180910390f35b3480156101c6575f5ffd5b506101846101d5366004612e0a565b610d2d565b3480156101e5575f5ffd5b506101846101f43660046130d6565b610d93565b348015610204575f5ffd5b506101846102133660046130f1565b610de9565b61018461022636600461310c565b610e79565b348015610236575f5ffd5b50610184610245366004613140565b61140a565b348015610255575f5ffd5b50610184610264366004613171565b6114a9565b348015610274575f5ffd5b506101846102833660046131af565b6115c4565b348015610293575f5ffd5b506101846102a23660046131d9565b6116df565b6102ba6102b5366004613354565b611879565b6040516001600160a01b0390911681526020016101b2565b3480156102dd575f5ffd5b50610184612694565b3480156102f1575f5ffd5b506101846126cb565b348015610305575f5ffd5b505f546001600160a01b03166102ba565b348015610321575f5ffd5b50610184610330366004613425565b6127ef565b348015610340575f5ffd5b5061018461034f366004612e0a565b6129aa565b34801561035f575f5ffd5b5061037361036e3660046134a5565b612abd565b6040516101b291906134c5565b34801561038b575f5ffd5b5060408051610180810182525f5460ff74010000000000000000000000000000000000000000820416602083015260128284015262ffffff7601000000000000000000000000000000000000000000008204811660608401527901000000000000000000000000000000000000000000000000008204811660808401527c0100000000000000000000000000000000000000000000000000000000909104811660a083015260015480821660c08401526301000000810490911660e08301526dffffffffffffffffffffffffffff66010000000000009091048116610100830152600254166101208201526003546101408201526b033b2e3c9fd0803ce80000006101608201526006546001600160a01b0316815290516101b29190613535565b3480156104b7575f5ffd5b506101846104c6366004612e0a565b612c43565b3480156104d6575f5ffd5b506101846104e5366004612e0a565b612ca9565b5f546001600160a01b0316331461051b5760405163a11a9a4160e01b81523360048201526024015b60405180910390fd5b6113888462ffffff16111561052e575f5ffd5b61c3508362ffffff161115610541575f5ffd5b6161a88262ffffff161115610554575f5ffd5b620186a08162ffffff161115610568575f5ffd5b6003949094555f80547fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000062ffffff958616027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff161779010000000000000000000000000000000000000000000000000093851693909302929092177fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000091841691909102179055600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001691909216179055565b60408051610380810182526060808252602082018190525f92820183905281018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081018290526103008101829052610320810182905261034081018290526103608101919091526001600160a01b038083165f908152600a60205260409020600801548391166107b5576040517f8b67f6990000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610512565b6001600160a01b0383165f818152600a602052604080822081517f06fdde0300000000000000000000000000000000000000000000000000000000815291519093926306fdde0392600480820193918290030181865afa15801561081b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610842919081019061364a565b835f0181905250836001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610884573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ab919081019061364a565b8360200181905250836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091391906136bf565b60ff1660408085019190915260088201546001600160a01b039081166102c0860152600983015481166102e0860152600183015463ffffffff6c010000000000000000000000008204811661010088015270010000000000000000000000000000000082041661012087015262ffffff8082166060880152630100000082048116608088015266010000000000008204811660a088015269010000000000000000009091041660c086015281517f53d74fdf0000000000000000000000000000000000000000000000000000000081529151908616916353d74fdf9160048083019260209291908290030181865afa158015610a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3591906136df565b62ffffff1660e0840152600a8101546001600160a01b03908116610300850152600b8201548116610320850152600c8201548116610340850152600182015474010000000000000000000000000000000000000000900463ffffffff166101408501526005820154610240850152604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918616916318160ddd916004808201926020929091908290030181865afa158015610af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1d91906136fa565b61026084015260028101546dffffffffffffffffffffffffffff8082166101608601526e0100000000000000000000000000009182900481166101a0860152600383015491909104166101e0840152600681015461028084015260078101546102a0840152600c810154740100000000000000000000000000000000000000009081900460ff16151561036085015260018201540463ffffffff165f03610cff57600754600b8201546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4791906136fa565b6dffffffffffffffffffffffffffff166101c0840152600b8101546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908516906370a0823190602401602060405180830381865afa158015610cc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce491906136fa565b6dffffffffffffffffffffffffffff16610200840152610d26565b60038101546dffffffffffffffffffffffffffff1661018084015260048101546102208401525b5050919050565b5f546001600160a01b03163314610d595760405163a11a9a4160e01b8152336004820152602401610512565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610dbf5760405163a11a9a4160e01b8152336004820152602401610512565b80610dca575f610dcd565b60015b5f60146101000a81548160ff021916908360ff16021790555050565b5f546001600160a01b03163314610e155760405163a11a9a4160e01b8152336004820152602401610512565b61c3508162ffffff1610158015610e345750620186a08162ffffff1611155b610e3c575f5ffd5b6001805462ffffff9092166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff909216919091179055565b335f908152600d60205260409020546001600160a01b0316610eb05760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0390911691349183906370a0823190602401602060405180830381865afa158015610f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4391906136fa565b6001600160a01b0384165f908152600a602052604081206001810180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff164263ffffffff167401000000000000000000000000000000000000000002179055600481018790556003810180547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff87161790559054919250907c0100000000000000000000000000000000000000000000000000000000900462ffffff16156111dc575f5461104d9084907c0100000000000000000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6007820181905560015493819003935f918291611074919062ffffff16620186a091020490565b600784015460055491935083900391506001600160a01b031615611134576005546040515f916001600160a01b03169083908381818185875af1925050503d805f81146110dc576040519150601f19603f3d011682016040523d82523d5f602084013e6110e1565b606091505b5050905080611132576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101839052604401610512565b505b60088301546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611180576040519150601f19603f3d011682016040523d82523d5f602084013e611185565b606091505b50509050806111d85760088401546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101849052604401610512565b5050505b836001600160a01b031663d180667d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611214575f5ffd5b505af1158015611226573d5f5f3e3d5ffd5b50506004546001600160a01b0316159150611372905057600480546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092526024820184905285169063a9059cbb906044016020604051808303815f875af11580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190613711565b506004546040515f916001600160a01b03169085908381818185875af1925050503d805f8114611317576040519150601f19603f3d011682016040523d82523d5f602084013e61131c565b606091505b505090508061137057600480546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169181019190915260248101859052604401610512565b505b6001810154600382015460048301546007840154604080517401000000000000000000000000000000000000000090950463ffffffff1685526dffffffffffffffffffffffffffff90931660208501529183015260608201526001600160a01b038516907fd3f4053c4681784b7bc55763984309feb3fb4aec78f26052bbfc4935740987cf9060800160405180910390a25050505050565b5f546001600160a01b031633146114365760405163a11a9a4160e01b8152336004820152602401610512565b600180547fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff1666010000000000006dffffffffffffffffffffffffffff94851602179055600280547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001691909216179055565b5f546001600160a01b031633148015906114ce57506004546001600160a01b03163314155b156114ee5760405163a11a9a4160e01b8152336004820152602401610512565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611553573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115779190613711565b50604080516001600160a01b038581168252602082018490528416917f31e3f58fbb760a4c31ae5c6416229fca813390b5fa0de533ee4cef14b2b344db91015b60405180910390a2505050565b5f546001600160a01b031633148015906115e957506004546001600160a01b03163314155b156116095760405163a11a9a4160e01b8152336004820152602401610512565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611652576040519150601f19603f3d011682016040523d82523d5f602084013e611657565b606091505b50509050806116a4576040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610512565b826001600160a01b03167f5817fe91d2748c33f168d8a78037fc073adaf6ec8e3613a758d44a2cfae4563d836040516115b791815260200190565b5f546001600160a01b0316331461170b5760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b0384165f908152600b602052604090208054841515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82168117835560ff90811691161761187257805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811782556009805491820181555f9081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881617905582905b8181101561186f57600985858381811061180b5761180b61372c565b90506020020160208101906118209190612e0a565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055016117ef565b50505b5050505050565b5f805474010000000000000000000000000000000000000000900460ff166001036118d0576040517fbc2c67a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f908152600b6020526040902054610100900460ff16611931576040517f66e3bc3b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610512565b6001600160a01b0382161580159061197357506001600160a01b03821633148061197357506001600160a01b0382165f908152600c602052604090205460ff16155b156119aa576040517f22864a4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035434908110156119ee576003546040517f9b9cbe1400000000000000000000000000000000000000000000000000000000815260040161051291815260200190565b60648862ffffff16108015611a0a5750620186a08862ffffff16115b15611a48576040517fd66f644100000000000000000000000000000000000000000000000000000000815262ffffff89166004820152602401610512565b6127108762ffffff161115611a90576040517f0b298c5e00000000000000000000000000000000000000000000000000000000815262ffffff88166004820152602401610512565b5f8b30338d8d60126b033b2e3c9fd0803ce8000000604051611ab190612d5a565b611ac096959493929190613759565b8190604051809103905ff5905080158015611add573d5f5f3e3d5ffd5b506001600160a01b038181165f908152600a60205260409020600881018054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558f825560098201805490911692881692909217909155909350839150611b4e63ffffffff421690565b60018201805462ffffff8d81167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000063ffffffff9586166c01000000000000000000000000029081167fffffffffffffffffffffffffffffffff00000000ffffffffffffffffff000000851617821785555f548f84166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff6301000000760100000000000000000000000000000000000000000000909304909516919091027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092167fffffffffffffffffffffffffffffffff00000000ffffffffffff000000000000909516949094179091171716179055421663ffffffff168863ffffffff1611611c88574263ffffffff16611c8a565b875b60018201805463ffffffff92909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556001600160a01b03851615611d0e575f54790100000000000000000000000000000000000000000000000000900462ffffff16611d10565b5f5b60018201805462ffffff929092166901000000000000000000027fffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff9092169190911790556b033b2e3c9fd0803ce8000000600582015560068054600a830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790559054604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051919092169163c45a01559160048083019260209291908290030181865afa158015611df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1c91906137b4565b6007546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216602482015291169063c9c65396906044016020604051808303815f875af1158015611e85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea991906137b4565b600b820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055600154611f0e906b033b2e3c9fd0803ce8000000906301000000900462ffffff16620186a091020490565b6003820180546dffffffffffffffffffffffffffff9283166e0100000000000000000000000000009081027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff9283161790925560018054600280870180546601000000000000909304871690950293821684178555547fffffffffffffffffffffffffffffffffffff00000000000000000000000000009093167fffffffff000000000000000000000000000000000000000000000000000000009091161791909316179055600c808301805489151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009091166001600160a01b03808d1691909117919091179091556008805493840181557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390930180548883167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600b86015483165f908152600d60209081526040808320805490941690941790925594860154909216845291905290205460ff166121075760088101546001600160a01b03165f908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600354156121d95760035460068201556005546001600160a01b0316156121d15760055460068201546040515f926001600160a01b031691908381818185875af1925050503d805f8114612176576040519150601f19603f3d011682016040523d82523d5f602084013e61217b565b606091505b50509050806121cf5760055460068301546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610512565b505b600354830392505b600a810154600b82015460018301546040517fae0ffca80000000000000000000000000000000000000000000000000000000081526001600160a01b038881169463ae0ffca894612268949183169392169162ffffff80831692660100000000000081049091169170010000000000000000000000000000000090910463ffffffff16906009906004016137cf565b5f604051808303815f87803b15801561227f575f5ffd5b505af1158015612291573d5f5f3e3d5ffd5b50505050600b81015460038201546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526e0100000000000000000000000000009091046dffffffffffffffffffffffffffff1660248201529085169063a9059cbb906044016020604051808303815f875af1158015612326573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190613711565b5060088101546040518e81526001600160a01b03918216918616907f9dfc95063374964ce3f014389cd49bd798a472043b03e52ab9942539221868bb9060200160405180910390a380600b015f9054906101000a90046001600160a01b03166001600160a01b0316635d5a1e43826008015f9054906101000a90046001600160a01b03165f60169054906101000a900462ffffff168c8560010160099054906101000a900462ffffff168660010160109054906101000a900463ffffffff1687600301600e9054906101000a90046dffffffffffffffffffffffffffff16600160069054906101000a90046dffffffffffffffffffffffffffff1660025f9054906101000a90046dffffffffffffffffffffffffffff1660075f9054906101000a90046001600160a01b03168b6009015f9054906101000a90046001600160a01b03168c600c0160149054906101000a900460ff166040518c63ffffffff1660e01b815260040161253e9b9a999897969594939291906001600160a01b039b8c16815262ffffff9a8b166020820152988a1660408a015296909816606088015263ffffffff9490941660808701526dffffffffffffffffffffffffffff92831660a087015290821660c08601521660e084015284166101008301529190921661012083015215156101408201526101600190565b5f604051808303815f87803b158015612555575f5ffd5b505af1158015612567573d5f5f3e3d5ffd5b505050505f831115612684576040805160028082526060820183525f92602083019080368337505060075482519293506001600160a01b0316918391505f906125b2576125b261372c565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106125e6576125e661372c565b6001600160a01b039283166020918202929092010152600a83015460088401546040517fb6f9de950000000000000000000000000000000000000000000000000000000081529183169263b6f9de95928892612654925f9288929091169063ffffffff421690600401613866565b5f604051808303818588803b15801561266b575f5ffd5b505af115801561267d573d5f5f3e3d5ffd5b5050505050505b5050509998505050505050505050565b5f546001600160a01b031633146126c05760405163a11a9a4160e01b8152336004820152602401610512565b6126c95f612cf3565b565b5f547501000000000000000000000000000000000000000000900460ff16156126f2575f5ffd5b5f80547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff167d1388004e200003e800000000000000000000000000000000000000000000179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166d0b1a2bc2ec5000000186a000c350179055600280546734bc4fdde27c00007fffffffffffffffffffffffffffffffffffff00000000000000000000000000009091161790556127ae33612cf3565b5f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b335f908152600d60205260409020546001600160a01b03166128265760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260409020546005546001600160a01b0391821691161580159061285257505f84115b156128f9576005546040515f916001600160a01b03169086908381818185875af1925050503d805f81146128a1576040519150601f19603f3d011682016040523d82523d5f602084013e6128a6565b606091505b50509050806128f7576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052604401610512565b505b896001600160a01b0316816001600160a01b03167f4d9f7f92f88822cab14479fe2c1b0d8e12a575302020d8b8577a22e466badae261293b63ffffffff421690565b6040805163ffffffff9290921682528d151560208301526dffffffffffffffffffffffffffff8d8116838301528c166060830152608082018b905260a082018a905260c0820189905260e08201889052610100820187905251908190036101200190a350505050505050505050565b5f546001600160a01b031633146129d65760405163a11a9a4160e01b8152336004820152602401610512565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c4648916004808201926020929091908290030181865afa158015612a5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8291906137b4565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6008546060905f8484018210612ad35783612ad7565b8482035b905081811115612b13576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8167ffffffffffffffff811115612b2d57612b2d61326a565b604051908082528060200260200182016040528015612b9557816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612b4b5790505b5090505f868301875b81811015612c36575f60088281548110612bba57612bba61372c565b5f9182526020808320909101546001600160a01b03908116808452600a8352604093849020845160608101865282815260088201549093169383019390935282549382019390935287516001880197939450919290918891908110612c2157612c2161372c565b60209081029190910101525050600101612b9e565b5091979650505050505050565b5f546001600160a01b03163314612c6f5760405163a11a9a4160e01b8152336004820152602401610512565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314612cd55760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b038116612ce7575f5ffd5b612cf081612cf3565b50565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611fc4806138db83390190565b62ffffff81168114612cf0575f5ffd5b8035612d8281612d67565b919050565b5f5f5f5f5f60a08688031215612d9b575f5ffd5b853594506020860135612dad81612d67565b93506040860135612dbd81612d67565b92506060860135612dcd81612d67565b91506080860135612ddd81612d67565b809150509295509295909350565b6001600160a01b0381168114612cf0575f5ffd5b8035612d8281612deb565b5f60208284031215612e1a575f5ffd5b8135612e2581612deb565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516103806020840152612e776103a0840182612e2c565b90506020840151601f19848303016040850152612e948282612e2c565b9150506040840151612eab606085018260ff169052565b50606084015162ffffff8116608085015250608084015162ffffff811660a08501525060a084015162ffffff811660c08501525060c084015162ffffff811660e08501525060e084015162ffffff81166101008501525061010084015163ffffffff81166101208501525061012084015163ffffffff81166101408501525061014084015163ffffffff8116610160850152506101608401516dffffffffffffffffffffffffffff8116610180850152506101808401516dffffffffffffffffffffffffffff81166101a0850152506101a08401516dffffffffffffffffffffffffffff81166101c0850152506101c08401516dffffffffffffffffffffffffffff81166101e0850152506101e08401516dffffffffffffffffffffffffffff8116610200850152506102008401516dffffffffffffffffffffffffffff8116610220850152506102208401516102408401526102408401516102608401526102608401516102808401526102808401516102a08401526102a08401516102c08401526102c084015161304a6102e08501826001600160a01b03169052565b506102e08401516001600160a01b038116610300850152506103008401516001600160a01b038116610320850152506103208401516001600160a01b038116610340850152506103408401516001600160a01b03811661036085015250610360840151801515610380850152509392505050565b8015158114612cf0575f5ffd5b8035612d82816130be565b5f602082840312156130e6575f5ffd5b8135612e25816130be565b5f60208284031215613101575f5ffd5b8135612e2581612d67565b5f6020828403121561311c575f5ffd5b5035919050565b80356dffffffffffffffffffffffffffff81168114612d82575f5ffd5b5f5f60408385031215613151575f5ffd5b61315a83613123565b915061316860208401613123565b90509250929050565b5f5f5f60608486031215613183575f5ffd5b833561318e81612deb565b9250602084013561319e81612deb565b929592945050506040919091013590565b5f5f604083850312156131c0575f5ffd5b82356131cb81612deb565b946020939093013593505050565b5f5f5f5f606085870312156131ec575f5ffd5b84356131f781612deb565b93506020850135613207816130be565b9250604085013567ffffffffffffffff811115613222575f5ffd5b8501601f81018713613232575f5ffd5b803567ffffffffffffffff811115613248575f5ffd5b8760208260051b840101111561325c575f5ffd5b949793965060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132c0576132c061326a565b604052919050565b5f67ffffffffffffffff8211156132e1576132e161326a565b50601f01601f191660200190565b5f82601f8301126132fe575f5ffd5b813561331161330c826132c8565b613297565b818152846020838601011115613325575f5ffd5b816020850160208301375f918101602001919091529392505050565b803563ffffffff81168114612d82575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c03121561336d575f5ffd5b8935985060208a013567ffffffffffffffff81111561338a575f5ffd5b6133968c828d016132ef565b98505060408a013567ffffffffffffffff8111156133b2575f5ffd5b6133be8c828d016132ef565b97505060608a01356133cf81612d67565b95506133dd60808b01612d77565b94506133eb60a08b01613341565b93506133f960c08b01612dff565b925061340760e08b016130cb565b91506134166101008b01612dff565b90509295985092959850929598565b5f5f5f5f5f5f5f5f5f6101208a8c03121561343e575f5ffd5b893561344981612deb565b985060208a0135613459816130be565b975061346760408b01613123565b965061347560608b01613123565b989b979a50959860808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b5f5f604083850312156134b6575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561352a5783516001600160a01b0381511684526001600160a01b03602082015116602085015260408101516040850152506060830192506020840193506001810190506134de565b509095945050505050565b81516001600160a01b031681526101808101602083015161355b602084018260ff169052565b506040830151613570604084018260ff169052565b506060830151613587606084018262ffffff169052565b50608083015161359e608084018262ffffff169052565b5060a08301516135b560a084018262ffffff169052565b5060c08301516135cc60c084018262ffffff169052565b5060e08301516135e360e084018262ffffff169052565b506101008301516136076101008401826dffffffffffffffffffffffffffff169052565b5061012083015161362b6101208401826dffffffffffffffffffffffffffff169052565b5061014083015161014083015261016083015161016083015292915050565b5f6020828403121561365a575f5ffd5b815167ffffffffffffffff811115613670575f5ffd5b8201601f81018413613680575f5ffd5b805161368e61330c826132c8565b8181528560208385010111156136a2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f602082840312156136cf575f5ffd5b815160ff81168114612e25575f5ffd5b5f602082840312156136ef575f5ffd5b8151612e2581612d67565b5f6020828403121561370a575f5ffd5b5051919050565b5f60208284031215613721575f5ffd5b8151612e25816130be565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b03871681526001600160a01b038616602082015260c060408201525f61378960c0830187612e2c565b828103606084015261379b8187612e2c565b60ff959095166080840152505060a00152949350505050565b5f602082840312156137c4575f5ffd5b8151612e2581612deb565b5f60c082016001600160a01b03891683526001600160a01b038816602084015262ffffff8716604084015262ffffff8616606084015263ffffffff8516608084015260c060a084015280845480835260e085019150855f5260205f2092505f5b818110156138565783546001600160a01b031683526001938401936020909301920161382f565b50909a9950505050505050505050565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b818110156138b05783516001600160a01b0316835260209384019390920191600101613889565b50506001600160a01b03959095166040840152505063ffffffff919091166060909101529291505056fe60e0604052604051611fc4380380611fc48339810160408190526100229161034e565b83838360026100318482610479565b50600361003e8382610479565b5060ff81166080526040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061007790600290610533565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f19018152919052805160209091012060a0525050506001600160a01b0385811660c052600980546001600160a01b0319169188169190911790556101268682610131565b5050505050506105a4565b6001600160a01b038216158061015157506001600160a01b03821661dead145b1561017e5760405163ec442f0560e01b81526001600160a01b038316600482015260240160405180910390fd5b6001600160a01b0382165f9081526006602052604081205490036101b6575f805462ffffff8082166001011662ffffff199091161790555b60018054820190556001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff16610252576001600160a01b0382165f818152600860205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b6040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80516001600160a01b03811681146102ac575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126102d4575f5ffd5b81516001600160401b038111156102ed576102ed6102b1565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031b5761031b6102b1565b604052818152838201602001851015610332575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f5f60c08789031215610363575f5ffd5b61036c87610296565b955061037a60208801610296565b60408801519095506001600160401b03811115610395575f5ffd5b6103a189828a016102c5565b606089015190955090506001600160401b038111156103be575f5ffd5b6103ca89828a016102c5565b935050608087015160ff811681146103e0575f5ffd5b8092505060a087015190509295509295509295565b600181811c9082168061040957607f821691505b60208210810361042757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561047457805f5260205f20601f840160051c810160208510156104525750805b601f840160051c820191505b81811015610471575f815560010161045e565b50505b505050565b81516001600160401b03811115610492576104926102b1565b6104a6816104a084546103f5565b8461042d565b6020601f8211600181146104d8575f83156104c15750848201515b5f19600385901b1c1916600184901b178455610471565b5f84815260208120601f198516915b8281101561050757878501518255602094850194600190920191016104e7565b508482101561052457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8354610540816103f5565b600182168015610557576001811461056c57610599565b60ff1983168652811515820286019350610599565b865f5260205f205f5b8381101561059157815488820152600190910190602001610575565b505081860193505b509195945050505050565b60805160a05160c0516119ef6105d55f395f6101cd01525f818161029801526111c201525f61026901526119ef5ff3fe608060405234801561000f575f5ffd5b5060043610610184575f3560e01c806370a08231116100dd578063a9059cbb11610088578063d180667d11610063578063d180667d1461040e578063d505accf14610416578063dd62ed3e14610429575f5ffd5b8063a9059cbb146103c6578063ae0ffca8146103d9578063aed6176e146103ee575f5ffd5b80638da5cb5b116100b85780638da5cb5b1461038357806395d89b411461039457806399c8d5561461039c575f5ffd5b806370a082311461030c57806373ad468a146103345780637ecebe001461035b575f5ffd5b806323b872dd1161013d57806342966c681161011857806342966c68146102ba5780634c346e72146102cd57806353d74fdf146102f0575f5ffd5b806323b872dd1461024f578063313ce567146102625780633644e51514610293575f5ffd5b806306fdde031161016d57806306fdde0314610205578063095ea7b31461021a57806318160ddd1461023d575f5ffd5b806301339c211461018857806302d05d3f146101cb575b5f5ffd5b600b547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1660405163ffffffff90911681526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101c2565b61020d610461565b6040516101c2919061161a565b61022d610228366004611688565b6104f1565b60405190151581526020016101c2565b6001545b6040519081526020016101c2565b61022d61025d3660046116b0565b610574565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c2565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b61022d6102c83660046116ea565b610635565b600b5474010000000000000000000000000000000000000000900460ff1661022d565b5f5462ffffff165b60405162ffffff90911681526020016101c2565b61024161031a366004611701565b6001600160a01b03165f9081526006602052604090205490565b600b54760100000000000000000000000000000000000000000000900462ffffff166102f8565b610241610369366004611701565b6001600160a01b03165f9081526005602052604090205490565b6009546001600160a01b03166101ed565b61020d61064b565b600b54790100000000000000000000000000000000000000000000000000900462ffffff166102f8565b61022d6103d4366004611688565b61065a565b6103ec6103e736600461172c565b61066f565b005b6104016103fc3660046117f9565b6108e7565b6040516101c29190611819565b6103ec610a87565b6103ec610424366004611870565b610c47565b6102416104373660046118dd565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6060600280546104709061190e565b80601f016020809104026020016040519081016040528092919081815260200182805461049c9061190e565b80156104e75780601f106104be576101008083540402835291602001916104e7565b820191905f5260205f20905b8154815290600101906020018083116104ca57829003601f168201915b5050505050905090565b600b545f9074010000000000000000000000000000000000000000900460ff1615801561052c5750600a546001600160a01b03848116911614155b15610563576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61056d8383610ccf565b9392505050565b600b545f9074010000000000000000000000000000000000000000900460ff161580156105ab5750600a546001600160a01b031633145b80156105c45750600b546001600160a01b038481169116145b80156105f857506001600160a01b038085165f908152600760209081526040808320600a54909416835292905220545f1914155b1561061757600a546106179085906001600160a01b03165f195f610cd9565b610622848484610df0565b61062d84848461100d565b949350505050565b5f6106433361dead846110b9565b506001919050565b6060600380546104709061190e565b5f6106663384846110b9565b50600192915050565b6009546001600160a01b031633146106ba576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600b547501000000000000000000000000000000000000000000900460ff1615610710576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5b81811015610794576001600c5f8686858181106107325761073261195f565b90506020020160208101906107479190611701565b6001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610713565b5050600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039889161790555050600b80547501000000000000000000000000000000000000000000959096167fffffffffffffff000000ffff00000000000000000000000000000000000000009096169590951776010000000000000000000000000000000000000000000062ffffff948516021778ffffffffffffffffffffffffffffffffffffffffffffffffff1679010000000000000000000000000000000000000000000000000092909316919091027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919091177c010000000000000000000000000000000000000000000000000000000063ffffffff9290921691909102177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16179055565b5f5460609062ffffff168310610929576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5462ffffff168383011115610946575f5462ffffff1683900391505b5f8267ffffffffffffffff8111156109605761096061198c565b6040519080825280602002602001820160405280156109a457816020015b604080518082019091525f808252602082015281526020019060019003908161097e5790505b5090505f845b84821015610a7d575f600482815481106109c6576109c661195f565b5f918252602090912001546001600160a01b0316905061dead811480610a0157506001600160a01b0381165f90815260066020526040902054155b15610a0c5750610a75565b80848481518110610a1f57610a1f61195f565b6020908102919091018101516001600160a01b0392831690529082165f908152600690915260409020548451859085908110610a5d57610a5d61195f565b60200260200101516020018181525050826001019250505b6001016109aa565b5090949350505050565b6009546001600160a01b03163314610acd576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b5474010000000000000000000000000000000000000000900460ff1615610b24576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b54620186a076010000000000000000000000000000000000000000000090910462ffffff161015610b9557600b80547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16780186a0000000000000000000000000000000000000000000001790555b60098054600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000808416909455600a80549094169093557fffffffff000000ffffffff00000000000000000000000000000000000000000090921674010000000000000000000000000000000000000000179091556040516001600160a01b03909116905f9082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600b5474010000000000000000000000000000000000000000900460ff16158015610c805750600a546001600160a01b03878116911614155b15610cb7576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc6878787878787876110d4565b50505050505050565b5f61066633848460015b6001600160a01b038416610d24576040517fe602df050000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016106b1565b6001600160a01b038316610d6f576040517f94280d620000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038085165f9081526007602090815260408083209387168352929052208290558015610dea57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610de191815260200190565b60405180910390a35b50505050565b600b5474010000000000000000000000000000000000000000900460ff1680610eca57506009546001600160a01b038481169116148015610e3e5750600b546001600160a01b038381169116145b80610eca5750600b5474010000000000000000000000000000000000000000900460ff16158015610e7c57506009546001600160a01b038381169116145b80610e85575080155b80610e9a57506001600160a01b03821661dead145b80610eb25750600a546001600160a01b038381169116145b80610eca5750600b546001600160a01b038381169116145b15610ed457505050565b600b5474010000000000000000000000000000000000000000900460ff16610fdb576001600160a01b0382165f908152600c602052604090205460ff1615610f53576040517f342be1ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b600b54760100000000000000000000000000000000000000000000900462ffffff16620186a01480610fd15750600154600b54610fb49190760100000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6001600160a01b0383165f90815260066020526040902054820111155b15610fdb57505050565b6040517f9bd6a5a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81156110a4576001600160a01b0384165f908152600760209081526040808320338085529252909120548381101561108b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018590526064016106b1565b5f1981146110a1576110a186838684035f610cd9565b50505b6110af8484846110b9565b5060019392505050565b6110c4838383610df0565b6110cf8383836112e4565b505050565b83421115611111576040517f62791302000000000000000000000000000000000000000000000000000000008152600481018590526024016106b1565b6001600160a01b038781165f8181526005602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e0850190915280519101207f19010000000000000000000000000000000000000000000000000000000000006101008401527f0000000000000000000000000000000000000000000000000000000000000000610102840152610122830152919061014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561126c573d5f5f3e3d5ffd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146112d6576040517f4b800e460000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152891660248201526044016106b1565b50610cc68787876001610cd9565b6001600160a01b03831661132f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038216158061134d57506001600160a01b03821630145b1561138f576040517fec442f050000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b6001600160a01b0383165f90815260066020526040902054811115611409576001600160a01b0383165f81815260066020526040908190205490517fe450d38c00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b1565b80156115c8576001600160a01b0383165f908152600660205260408120805483900390819055900361146c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000811662ffffff9182165f19019091161790555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b038316016114aa576001805482900390556115c8565b6001600160a01b0382165f9081526006602052604081205490036114fe575f805462ffffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009091161790555b6001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff166115c8576001600160a01b0382165f81815260086020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161160d91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b0381168114611683575f5ffd5b919050565b5f5f60408385031215611699575f5ffd5b6116a28361166d565b946020939093013593505050565b5f5f5f606084860312156116c2575f5ffd5b6116cb8461166d565b92506116d96020850161166d565b929592945050506040919091013590565b5f602082840312156116fa575f5ffd5b5035919050565b5f60208284031215611711575f5ffd5b61056d8261166d565b803562ffffff81168114611683575f5ffd5b5f5f5f5f5f5f5f60c0888a031215611742575f5ffd5b61174b8861166d565b96506117596020890161166d565b95506117676040890161171a565b94506117756060890161171a565b9350608088013563ffffffff8116811461178d575f5ffd5b925060a088013567ffffffffffffffff8111156117a8575f5ffd5b8801601f81018a136117b8575f5ffd5b803567ffffffffffffffff8111156117ce575f5ffd5b8a60208260051b84010111156117e2575f5ffd5b602082019350809250505092959891949750929550565b5f5f6040838503121561180a575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561186557835180516001600160a01b031684526020908101518185015290930192604090920191600101611832565b509095945050505050565b5f5f5f5f5f5f5f60e0888a031215611886575f5ffd5b61188f8861166d565b965061189d6020890161166d565b95506040880135945060608801359350608088013560ff811681146118c0575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156118ee575f5ffd5b6118f78361166d565b91506119056020840161166d565b90509250929050565b600181811c9082168061192257607f821691505b602082108103611959577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffdfea2646970667358221220688214a33c697126760eeed157514a03e7bf0b8444ccad98749000ac1be5d87764736f6c634300081c0033a2646970667358221220b75506246bc522b2e5bada14645c853931b1b21ab0a3d6aa766a27c047ed9dc464736f6c634300081c0033

Deployed Bytecode

0x60806040526004361061015a575f3560e01c80635beb0823116100bb578063af0d4f9511610071578063ef8a923511610057578063ef8a923514610380578063f0f44260146104ac578063f2fde38b146104cb575f5ffd5b8063af0d4f9514610335578063e30e5ae914610354575f5ffd5b80638129fc1c116100a15780638129fc1c146102e65780638da5cb5b146102fa578063a73cc35c14610316575f5ffd5b80635beb0823146102a7578063715018a6146102d2575f5ffd5b806337b3375f1161011057806344004cc1116100f657806344004cc11461024a5780634782f7791461026957806359d3515214610288575f5ffd5b806337b3375f14610218578063402c10391461022b575f5ffd5b806314fc28121161014057806314fc2812146101bb57806316c38b3c146101da5780631ca9ff1d146101f9575f5ffd5b806303a996c41461016557806313ff7e9f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004612d87565b6104ea565b005b348015610191575f5ffd5b506101a56101a0366004612e0a565b610675565b6040516101b29190612e5a565b60405180910390f35b3480156101c6575f5ffd5b506101846101d5366004612e0a565b610d2d565b3480156101e5575f5ffd5b506101846101f43660046130d6565b610d93565b348015610204575f5ffd5b506101846102133660046130f1565b610de9565b61018461022636600461310c565b610e79565b348015610236575f5ffd5b50610184610245366004613140565b61140a565b348015610255575f5ffd5b50610184610264366004613171565b6114a9565b348015610274575f5ffd5b506101846102833660046131af565b6115c4565b348015610293575f5ffd5b506101846102a23660046131d9565b6116df565b6102ba6102b5366004613354565b611879565b6040516001600160a01b0390911681526020016101b2565b3480156102dd575f5ffd5b50610184612694565b3480156102f1575f5ffd5b506101846126cb565b348015610305575f5ffd5b505f546001600160a01b03166102ba565b348015610321575f5ffd5b50610184610330366004613425565b6127ef565b348015610340575f5ffd5b5061018461034f366004612e0a565b6129aa565b34801561035f575f5ffd5b5061037361036e3660046134a5565b612abd565b6040516101b291906134c5565b34801561038b575f5ffd5b5060408051610180810182525f5460ff74010000000000000000000000000000000000000000820416602083015260128284015262ffffff7601000000000000000000000000000000000000000000008204811660608401527901000000000000000000000000000000000000000000000000008204811660808401527c0100000000000000000000000000000000000000000000000000000000909104811660a083015260015480821660c08401526301000000810490911660e08301526dffffffffffffffffffffffffffff66010000000000009091048116610100830152600254166101208201526003546101408201526b033b2e3c9fd0803ce80000006101608201526006546001600160a01b0316815290516101b29190613535565b3480156104b7575f5ffd5b506101846104c6366004612e0a565b612c43565b3480156104d6575f5ffd5b506101846104e5366004612e0a565b612ca9565b5f546001600160a01b0316331461051b5760405163a11a9a4160e01b81523360048201526024015b60405180910390fd5b6113888462ffffff16111561052e575f5ffd5b61c3508362ffffff161115610541575f5ffd5b6161a88262ffffff161115610554575f5ffd5b620186a08162ffffff161115610568575f5ffd5b6003949094555f80547fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000062ffffff958616027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff161779010000000000000000000000000000000000000000000000000093851693909302929092177fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000091841691909102179055600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001691909216179055565b60408051610380810182526060808252602082018190525f92820183905281018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081018290526103008101829052610320810182905261034081018290526103608101919091526001600160a01b038083165f908152600a60205260409020600801548391166107b5576040517f8b67f6990000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610512565b6001600160a01b0383165f818152600a602052604080822081517f06fdde0300000000000000000000000000000000000000000000000000000000815291519093926306fdde0392600480820193918290030181865afa15801561081b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610842919081019061364a565b835f0181905250836001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610884573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ab919081019061364a565b8360200181905250836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091391906136bf565b60ff1660408085019190915260088201546001600160a01b039081166102c0860152600983015481166102e0860152600183015463ffffffff6c010000000000000000000000008204811661010088015270010000000000000000000000000000000082041661012087015262ffffff8082166060880152630100000082048116608088015266010000000000008204811660a088015269010000000000000000009091041660c086015281517f53d74fdf0000000000000000000000000000000000000000000000000000000081529151908616916353d74fdf9160048083019260209291908290030181865afa158015610a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3591906136df565b62ffffff1660e0840152600a8101546001600160a01b03908116610300850152600b8201548116610320850152600c8201548116610340850152600182015474010000000000000000000000000000000000000000900463ffffffff166101408501526005820154610240850152604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918616916318160ddd916004808201926020929091908290030181865afa158015610af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1d91906136fa565b61026084015260028101546dffffffffffffffffffffffffffff8082166101608601526e0100000000000000000000000000009182900481166101a0860152600383015491909104166101e0840152600681015461028084015260078101546102a0840152600c810154740100000000000000000000000000000000000000009081900460ff16151561036085015260018201540463ffffffff165f03610cff57600754600b8201546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4791906136fa565b6dffffffffffffffffffffffffffff166101c0840152600b8101546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908516906370a0823190602401602060405180830381865afa158015610cc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce491906136fa565b6dffffffffffffffffffffffffffff16610200840152610d26565b60038101546dffffffffffffffffffffffffffff1661018084015260048101546102208401525b5050919050565b5f546001600160a01b03163314610d595760405163a11a9a4160e01b8152336004820152602401610512565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610dbf5760405163a11a9a4160e01b8152336004820152602401610512565b80610dca575f610dcd565b60015b5f60146101000a81548160ff021916908360ff16021790555050565b5f546001600160a01b03163314610e155760405163a11a9a4160e01b8152336004820152602401610512565b61c3508162ffffff1610158015610e345750620186a08162ffffff1611155b610e3c575f5ffd5b6001805462ffffff9092166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff909216919091179055565b335f908152600d60205260409020546001600160a01b0316610eb05760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0390911691349183906370a0823190602401602060405180830381865afa158015610f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4391906136fa565b6001600160a01b0384165f908152600a602052604081206001810180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff164263ffffffff167401000000000000000000000000000000000000000002179055600481018790556003810180547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff87161790559054919250907c0100000000000000000000000000000000000000000000000000000000900462ffffff16156111dc575f5461104d9084907c0100000000000000000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6007820181905560015493819003935f918291611074919062ffffff16620186a091020490565b600784015460055491935083900391506001600160a01b031615611134576005546040515f916001600160a01b03169083908381818185875af1925050503d805f81146110dc576040519150601f19603f3d011682016040523d82523d5f602084013e6110e1565b606091505b5050905080611132576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101839052604401610512565b505b60088301546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611180576040519150601f19603f3d011682016040523d82523d5f602084013e611185565b606091505b50509050806111d85760088401546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101849052604401610512565b5050505b836001600160a01b031663d180667d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611214575f5ffd5b505af1158015611226573d5f5f3e3d5ffd5b50506004546001600160a01b0316159150611372905057600480546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092526024820184905285169063a9059cbb906044016020604051808303815f875af11580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190613711565b506004546040515f916001600160a01b03169085908381818185875af1925050503d805f8114611317576040519150601f19603f3d011682016040523d82523d5f602084013e61131c565b606091505b505090508061137057600480546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169181019190915260248101859052604401610512565b505b6001810154600382015460048301546007840154604080517401000000000000000000000000000000000000000090950463ffffffff1685526dffffffffffffffffffffffffffff90931660208501529183015260608201526001600160a01b038516907fd3f4053c4681784b7bc55763984309feb3fb4aec78f26052bbfc4935740987cf9060800160405180910390a25050505050565b5f546001600160a01b031633146114365760405163a11a9a4160e01b8152336004820152602401610512565b600180547fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff1666010000000000006dffffffffffffffffffffffffffff94851602179055600280547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001691909216179055565b5f546001600160a01b031633148015906114ce57506004546001600160a01b03163314155b156114ee5760405163a11a9a4160e01b8152336004820152602401610512565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611553573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115779190613711565b50604080516001600160a01b038581168252602082018490528416917f31e3f58fbb760a4c31ae5c6416229fca813390b5fa0de533ee4cef14b2b344db91015b60405180910390a2505050565b5f546001600160a01b031633148015906115e957506004546001600160a01b03163314155b156116095760405163a11a9a4160e01b8152336004820152602401610512565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611652576040519150601f19603f3d011682016040523d82523d5f602084013e611657565b606091505b50509050806116a4576040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610512565b826001600160a01b03167f5817fe91d2748c33f168d8a78037fc073adaf6ec8e3613a758d44a2cfae4563d836040516115b791815260200190565b5f546001600160a01b0316331461170b5760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b0384165f908152600b602052604090208054841515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82168117835560ff90811691161761187257805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811782556009805491820181555f9081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881617905582905b8181101561186f57600985858381811061180b5761180b61372c565b90506020020160208101906118209190612e0a565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055016117ef565b50505b5050505050565b5f805474010000000000000000000000000000000000000000900460ff166001036118d0576040517fbc2c67a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f908152600b6020526040902054610100900460ff16611931576040517f66e3bc3b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610512565b6001600160a01b0382161580159061197357506001600160a01b03821633148061197357506001600160a01b0382165f908152600c602052604090205460ff16155b156119aa576040517f22864a4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035434908110156119ee576003546040517f9b9cbe1400000000000000000000000000000000000000000000000000000000815260040161051291815260200190565b60648862ffffff16108015611a0a5750620186a08862ffffff16115b15611a48576040517fd66f644100000000000000000000000000000000000000000000000000000000815262ffffff89166004820152602401610512565b6127108762ffffff161115611a90576040517f0b298c5e00000000000000000000000000000000000000000000000000000000815262ffffff88166004820152602401610512565b5f8b30338d8d60126b033b2e3c9fd0803ce8000000604051611ab190612d5a565b611ac096959493929190613759565b8190604051809103905ff5905080158015611add573d5f5f3e3d5ffd5b506001600160a01b038181165f908152600a60205260409020600881018054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558f825560098201805490911692881692909217909155909350839150611b4e63ffffffff421690565b60018201805462ffffff8d81167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000063ffffffff9586166c01000000000000000000000000029081167fffffffffffffffffffffffffffffffff00000000ffffffffffffffffff000000851617821785555f548f84166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff6301000000760100000000000000000000000000000000000000000000909304909516919091027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092167fffffffffffffffffffffffffffffffff00000000ffffffffffff000000000000909516949094179091171716179055421663ffffffff168863ffffffff1611611c88574263ffffffff16611c8a565b875b60018201805463ffffffff92909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556001600160a01b03851615611d0e575f54790100000000000000000000000000000000000000000000000000900462ffffff16611d10565b5f5b60018201805462ffffff929092166901000000000000000000027fffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff9092169190911790556b033b2e3c9fd0803ce8000000600582015560068054600a830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790559054604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051919092169163c45a01559160048083019260209291908290030181865afa158015611df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1c91906137b4565b6007546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216602482015291169063c9c65396906044016020604051808303815f875af1158015611e85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea991906137b4565b600b820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055600154611f0e906b033b2e3c9fd0803ce8000000906301000000900462ffffff16620186a091020490565b6003820180546dffffffffffffffffffffffffffff9283166e0100000000000000000000000000009081027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff9283161790925560018054600280870180546601000000000000909304871690950293821684178555547fffffffffffffffffffffffffffffffffffff00000000000000000000000000009093167fffffffff000000000000000000000000000000000000000000000000000000009091161791909316179055600c808301805489151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009091166001600160a01b03808d1691909117919091179091556008805493840181557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390930180548883167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600b86015483165f908152600d60209081526040808320805490941690941790925594860154909216845291905290205460ff166121075760088101546001600160a01b03165f908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600354156121d95760035460068201556005546001600160a01b0316156121d15760055460068201546040515f926001600160a01b031691908381818185875af1925050503d805f8114612176576040519150601f19603f3d011682016040523d82523d5f602084013e61217b565b606091505b50509050806121cf5760055460068301546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610512565b505b600354830392505b600a810154600b82015460018301546040517fae0ffca80000000000000000000000000000000000000000000000000000000081526001600160a01b038881169463ae0ffca894612268949183169392169162ffffff80831692660100000000000081049091169170010000000000000000000000000000000090910463ffffffff16906009906004016137cf565b5f604051808303815f87803b15801561227f575f5ffd5b505af1158015612291573d5f5f3e3d5ffd5b50505050600b81015460038201546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526e0100000000000000000000000000009091046dffffffffffffffffffffffffffff1660248201529085169063a9059cbb906044016020604051808303815f875af1158015612326573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190613711565b5060088101546040518e81526001600160a01b03918216918616907f9dfc95063374964ce3f014389cd49bd798a472043b03e52ab9942539221868bb9060200160405180910390a380600b015f9054906101000a90046001600160a01b03166001600160a01b0316635d5a1e43826008015f9054906101000a90046001600160a01b03165f60169054906101000a900462ffffff168c8560010160099054906101000a900462ffffff168660010160109054906101000a900463ffffffff1687600301600e9054906101000a90046dffffffffffffffffffffffffffff16600160069054906101000a90046dffffffffffffffffffffffffffff1660025f9054906101000a90046dffffffffffffffffffffffffffff1660075f9054906101000a90046001600160a01b03168b6009015f9054906101000a90046001600160a01b03168c600c0160149054906101000a900460ff166040518c63ffffffff1660e01b815260040161253e9b9a999897969594939291906001600160a01b039b8c16815262ffffff9a8b166020820152988a1660408a015296909816606088015263ffffffff9490941660808701526dffffffffffffffffffffffffffff92831660a087015290821660c08601521660e084015284166101008301529190921661012083015215156101408201526101600190565b5f604051808303815f87803b158015612555575f5ffd5b505af1158015612567573d5f5f3e3d5ffd5b505050505f831115612684576040805160028082526060820183525f92602083019080368337505060075482519293506001600160a01b0316918391505f906125b2576125b261372c565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106125e6576125e661372c565b6001600160a01b039283166020918202929092010152600a83015460088401546040517fb6f9de950000000000000000000000000000000000000000000000000000000081529183169263b6f9de95928892612654925f9288929091169063ffffffff421690600401613866565b5f604051808303818588803b15801561266b575f5ffd5b505af115801561267d573d5f5f3e3d5ffd5b5050505050505b5050509998505050505050505050565b5f546001600160a01b031633146126c05760405163a11a9a4160e01b8152336004820152602401610512565b6126c95f612cf3565b565b5f547501000000000000000000000000000000000000000000900460ff16156126f2575f5ffd5b5f80547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff167d1388004e200003e800000000000000000000000000000000000000000000179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166d0b1a2bc2ec5000000186a000c350179055600280546734bc4fdde27c00007fffffffffffffffffffffffffffffffffffff00000000000000000000000000009091161790556127ae33612cf3565b5f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b335f908152600d60205260409020546001600160a01b03166128265760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260409020546005546001600160a01b0391821691161580159061285257505f84115b156128f9576005546040515f916001600160a01b03169086908381818185875af1925050503d805f81146128a1576040519150601f19603f3d011682016040523d82523d5f602084013e6128a6565b606091505b50509050806128f7576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052604401610512565b505b896001600160a01b0316816001600160a01b03167f4d9f7f92f88822cab14479fe2c1b0d8e12a575302020d8b8577a22e466badae261293b63ffffffff421690565b6040805163ffffffff9290921682528d151560208301526dffffffffffffffffffffffffffff8d8116838301528c166060830152608082018b905260a082018a905260c0820189905260e08201889052610100820187905251908190036101200190a350505050505050505050565b5f546001600160a01b031633146129d65760405163a11a9a4160e01b8152336004820152602401610512565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c4648916004808201926020929091908290030181865afa158015612a5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8291906137b4565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6008546060905f8484018210612ad35783612ad7565b8482035b905081811115612b13576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8167ffffffffffffffff811115612b2d57612b2d61326a565b604051908082528060200260200182016040528015612b9557816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612b4b5790505b5090505f868301875b81811015612c36575f60088281548110612bba57612bba61372c565b5f9182526020808320909101546001600160a01b03908116808452600a8352604093849020845160608101865282815260088201549093169383019390935282549382019390935287516001880197939450919290918891908110612c2157612c2161372c565b60209081029190910101525050600101612b9e565b5091979650505050505050565b5f546001600160a01b03163314612c6f5760405163a11a9a4160e01b8152336004820152602401610512565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314612cd55760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b038116612ce7575f5ffd5b612cf081612cf3565b50565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611fc4806138db83390190565b62ffffff81168114612cf0575f5ffd5b8035612d8281612d67565b919050565b5f5f5f5f5f60a08688031215612d9b575f5ffd5b853594506020860135612dad81612d67565b93506040860135612dbd81612d67565b92506060860135612dcd81612d67565b91506080860135612ddd81612d67565b809150509295509295909350565b6001600160a01b0381168114612cf0575f5ffd5b8035612d8281612deb565b5f60208284031215612e1a575f5ffd5b8135612e2581612deb565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516103806020840152612e776103a0840182612e2c565b90506020840151601f19848303016040850152612e948282612e2c565b9150506040840151612eab606085018260ff169052565b50606084015162ffffff8116608085015250608084015162ffffff811660a08501525060a084015162ffffff811660c08501525060c084015162ffffff811660e08501525060e084015162ffffff81166101008501525061010084015163ffffffff81166101208501525061012084015163ffffffff81166101408501525061014084015163ffffffff8116610160850152506101608401516dffffffffffffffffffffffffffff8116610180850152506101808401516dffffffffffffffffffffffffffff81166101a0850152506101a08401516dffffffffffffffffffffffffffff81166101c0850152506101c08401516dffffffffffffffffffffffffffff81166101e0850152506101e08401516dffffffffffffffffffffffffffff8116610200850152506102008401516dffffffffffffffffffffffffffff8116610220850152506102208401516102408401526102408401516102608401526102608401516102808401526102808401516102a08401526102a08401516102c08401526102c084015161304a6102e08501826001600160a01b03169052565b506102e08401516001600160a01b038116610300850152506103008401516001600160a01b038116610320850152506103208401516001600160a01b038116610340850152506103408401516001600160a01b03811661036085015250610360840151801515610380850152509392505050565b8015158114612cf0575f5ffd5b8035612d82816130be565b5f602082840312156130e6575f5ffd5b8135612e25816130be565b5f60208284031215613101575f5ffd5b8135612e2581612d67565b5f6020828403121561311c575f5ffd5b5035919050565b80356dffffffffffffffffffffffffffff81168114612d82575f5ffd5b5f5f60408385031215613151575f5ffd5b61315a83613123565b915061316860208401613123565b90509250929050565b5f5f5f60608486031215613183575f5ffd5b833561318e81612deb565b9250602084013561319e81612deb565b929592945050506040919091013590565b5f5f604083850312156131c0575f5ffd5b82356131cb81612deb565b946020939093013593505050565b5f5f5f5f606085870312156131ec575f5ffd5b84356131f781612deb565b93506020850135613207816130be565b9250604085013567ffffffffffffffff811115613222575f5ffd5b8501601f81018713613232575f5ffd5b803567ffffffffffffffff811115613248575f5ffd5b8760208260051b840101111561325c575f5ffd5b949793965060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132c0576132c061326a565b604052919050565b5f67ffffffffffffffff8211156132e1576132e161326a565b50601f01601f191660200190565b5f82601f8301126132fe575f5ffd5b813561331161330c826132c8565b613297565b818152846020838601011115613325575f5ffd5b816020850160208301375f918101602001919091529392505050565b803563ffffffff81168114612d82575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c03121561336d575f5ffd5b8935985060208a013567ffffffffffffffff81111561338a575f5ffd5b6133968c828d016132ef565b98505060408a013567ffffffffffffffff8111156133b2575f5ffd5b6133be8c828d016132ef565b97505060608a01356133cf81612d67565b95506133dd60808b01612d77565b94506133eb60a08b01613341565b93506133f960c08b01612dff565b925061340760e08b016130cb565b91506134166101008b01612dff565b90509295985092959850929598565b5f5f5f5f5f5f5f5f5f6101208a8c03121561343e575f5ffd5b893561344981612deb565b985060208a0135613459816130be565b975061346760408b01613123565b965061347560608b01613123565b989b979a50959860808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b5f5f604083850312156134b6575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561352a5783516001600160a01b0381511684526001600160a01b03602082015116602085015260408101516040850152506060830192506020840193506001810190506134de565b509095945050505050565b81516001600160a01b031681526101808101602083015161355b602084018260ff169052565b506040830151613570604084018260ff169052565b506060830151613587606084018262ffffff169052565b50608083015161359e608084018262ffffff169052565b5060a08301516135b560a084018262ffffff169052565b5060c08301516135cc60c084018262ffffff169052565b5060e08301516135e360e084018262ffffff169052565b506101008301516136076101008401826dffffffffffffffffffffffffffff169052565b5061012083015161362b6101208401826dffffffffffffffffffffffffffff169052565b5061014083015161014083015261016083015161016083015292915050565b5f6020828403121561365a575f5ffd5b815167ffffffffffffffff811115613670575f5ffd5b8201601f81018413613680575f5ffd5b805161368e61330c826132c8565b8181528560208385010111156136a2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f602082840312156136cf575f5ffd5b815160ff81168114612e25575f5ffd5b5f602082840312156136ef575f5ffd5b8151612e2581612d67565b5f6020828403121561370a575f5ffd5b5051919050565b5f60208284031215613721575f5ffd5b8151612e25816130be565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b03871681526001600160a01b038616602082015260c060408201525f61378960c0830187612e2c565b828103606084015261379b8187612e2c565b60ff959095166080840152505060a00152949350505050565b5f602082840312156137c4575f5ffd5b8151612e2581612deb565b5f60c082016001600160a01b03891683526001600160a01b038816602084015262ffffff8716604084015262ffffff8616606084015263ffffffff8516608084015260c060a084015280845480835260e085019150855f5260205f2092505f5b818110156138565783546001600160a01b031683526001938401936020909301920161382f565b50909a9950505050505050505050565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b818110156138b05783516001600160a01b0316835260209384019390920191600101613889565b50506001600160a01b03959095166040840152505063ffffffff919091166060909101529291505056fe60e0604052604051611fc4380380611fc48339810160408190526100229161034e565b83838360026100318482610479565b50600361003e8382610479565b5060ff81166080526040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061007790600290610533565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f19018152919052805160209091012060a0525050506001600160a01b0385811660c052600980546001600160a01b0319169188169190911790556101268682610131565b5050505050506105a4565b6001600160a01b038216158061015157506001600160a01b03821661dead145b1561017e5760405163ec442f0560e01b81526001600160a01b038316600482015260240160405180910390fd5b6001600160a01b0382165f9081526006602052604081205490036101b6575f805462ffffff8082166001011662ffffff199091161790555b60018054820190556001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff16610252576001600160a01b0382165f818152600860205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b6040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80516001600160a01b03811681146102ac575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126102d4575f5ffd5b81516001600160401b038111156102ed576102ed6102b1565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031b5761031b6102b1565b604052818152838201602001851015610332575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f5f60c08789031215610363575f5ffd5b61036c87610296565b955061037a60208801610296565b60408801519095506001600160401b03811115610395575f5ffd5b6103a189828a016102c5565b606089015190955090506001600160401b038111156103be575f5ffd5b6103ca89828a016102c5565b935050608087015160ff811681146103e0575f5ffd5b8092505060a087015190509295509295509295565b600181811c9082168061040957607f821691505b60208210810361042757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561047457805f5260205f20601f840160051c810160208510156104525750805b601f840160051c820191505b81811015610471575f815560010161045e565b50505b505050565b81516001600160401b03811115610492576104926102b1565b6104a6816104a084546103f5565b8461042d565b6020601f8211600181146104d8575f83156104c15750848201515b5f19600385901b1c1916600184901b178455610471565b5f84815260208120601f198516915b8281101561050757878501518255602094850194600190920191016104e7565b508482101561052457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8354610540816103f5565b600182168015610557576001811461056c57610599565b60ff1983168652811515820286019350610599565b865f5260205f205f5b8381101561059157815488820152600190910190602001610575565b505081860193505b509195945050505050565b60805160a05160c0516119ef6105d55f395f6101cd01525f818161029801526111c201525f61026901526119ef5ff3fe608060405234801561000f575f5ffd5b5060043610610184575f3560e01c806370a08231116100dd578063a9059cbb11610088578063d180667d11610063578063d180667d1461040e578063d505accf14610416578063dd62ed3e14610429575f5ffd5b8063a9059cbb146103c6578063ae0ffca8146103d9578063aed6176e146103ee575f5ffd5b80638da5cb5b116100b85780638da5cb5b1461038357806395d89b411461039457806399c8d5561461039c575f5ffd5b806370a082311461030c57806373ad468a146103345780637ecebe001461035b575f5ffd5b806323b872dd1161013d57806342966c681161011857806342966c68146102ba5780634c346e72146102cd57806353d74fdf146102f0575f5ffd5b806323b872dd1461024f578063313ce567146102625780633644e51514610293575f5ffd5b806306fdde031161016d57806306fdde0314610205578063095ea7b31461021a57806318160ddd1461023d575f5ffd5b806301339c211461018857806302d05d3f146101cb575b5f5ffd5b600b547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1660405163ffffffff90911681526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101c2565b61020d610461565b6040516101c2919061161a565b61022d610228366004611688565b6104f1565b60405190151581526020016101c2565b6001545b6040519081526020016101c2565b61022d61025d3660046116b0565b610574565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c2565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b61022d6102c83660046116ea565b610635565b600b5474010000000000000000000000000000000000000000900460ff1661022d565b5f5462ffffff165b60405162ffffff90911681526020016101c2565b61024161031a366004611701565b6001600160a01b03165f9081526006602052604090205490565b600b54760100000000000000000000000000000000000000000000900462ffffff166102f8565b610241610369366004611701565b6001600160a01b03165f9081526005602052604090205490565b6009546001600160a01b03166101ed565b61020d61064b565b600b54790100000000000000000000000000000000000000000000000000900462ffffff166102f8565b61022d6103d4366004611688565b61065a565b6103ec6103e736600461172c565b61066f565b005b6104016103fc3660046117f9565b6108e7565b6040516101c29190611819565b6103ec610a87565b6103ec610424366004611870565b610c47565b6102416104373660046118dd565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6060600280546104709061190e565b80601f016020809104026020016040519081016040528092919081815260200182805461049c9061190e565b80156104e75780601f106104be576101008083540402835291602001916104e7565b820191905f5260205f20905b8154815290600101906020018083116104ca57829003601f168201915b5050505050905090565b600b545f9074010000000000000000000000000000000000000000900460ff1615801561052c5750600a546001600160a01b03848116911614155b15610563576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61056d8383610ccf565b9392505050565b600b545f9074010000000000000000000000000000000000000000900460ff161580156105ab5750600a546001600160a01b031633145b80156105c45750600b546001600160a01b038481169116145b80156105f857506001600160a01b038085165f908152600760209081526040808320600a54909416835292905220545f1914155b1561061757600a546106179085906001600160a01b03165f195f610cd9565b610622848484610df0565b61062d84848461100d565b949350505050565b5f6106433361dead846110b9565b506001919050565b6060600380546104709061190e565b5f6106663384846110b9565b50600192915050565b6009546001600160a01b031633146106ba576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600b547501000000000000000000000000000000000000000000900460ff1615610710576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5b81811015610794576001600c5f8686858181106107325761073261195f565b90506020020160208101906107479190611701565b6001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610713565b5050600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039889161790555050600b80547501000000000000000000000000000000000000000000959096167fffffffffffffff000000ffff00000000000000000000000000000000000000009096169590951776010000000000000000000000000000000000000000000062ffffff948516021778ffffffffffffffffffffffffffffffffffffffffffffffffff1679010000000000000000000000000000000000000000000000000092909316919091027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919091177c010000000000000000000000000000000000000000000000000000000063ffffffff9290921691909102177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16179055565b5f5460609062ffffff168310610929576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5462ffffff168383011115610946575f5462ffffff1683900391505b5f8267ffffffffffffffff8111156109605761096061198c565b6040519080825280602002602001820160405280156109a457816020015b604080518082019091525f808252602082015281526020019060019003908161097e5790505b5090505f845b84821015610a7d575f600482815481106109c6576109c661195f565b5f918252602090912001546001600160a01b0316905061dead811480610a0157506001600160a01b0381165f90815260066020526040902054155b15610a0c5750610a75565b80848481518110610a1f57610a1f61195f565b6020908102919091018101516001600160a01b0392831690529082165f908152600690915260409020548451859085908110610a5d57610a5d61195f565b60200260200101516020018181525050826001019250505b6001016109aa565b5090949350505050565b6009546001600160a01b03163314610acd576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b5474010000000000000000000000000000000000000000900460ff1615610b24576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b54620186a076010000000000000000000000000000000000000000000090910462ffffff161015610b9557600b80547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16780186a0000000000000000000000000000000000000000000001790555b60098054600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000808416909455600a80549094169093557fffffffff000000ffffffff00000000000000000000000000000000000000000090921674010000000000000000000000000000000000000000179091556040516001600160a01b03909116905f9082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600b5474010000000000000000000000000000000000000000900460ff16158015610c805750600a546001600160a01b03878116911614155b15610cb7576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc6878787878787876110d4565b50505050505050565b5f61066633848460015b6001600160a01b038416610d24576040517fe602df050000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016106b1565b6001600160a01b038316610d6f576040517f94280d620000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038085165f9081526007602090815260408083209387168352929052208290558015610dea57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610de191815260200190565b60405180910390a35b50505050565b600b5474010000000000000000000000000000000000000000900460ff1680610eca57506009546001600160a01b038481169116148015610e3e5750600b546001600160a01b038381169116145b80610eca5750600b5474010000000000000000000000000000000000000000900460ff16158015610e7c57506009546001600160a01b038381169116145b80610e85575080155b80610e9a57506001600160a01b03821661dead145b80610eb25750600a546001600160a01b038381169116145b80610eca5750600b546001600160a01b038381169116145b15610ed457505050565b600b5474010000000000000000000000000000000000000000900460ff16610fdb576001600160a01b0382165f908152600c602052604090205460ff1615610f53576040517f342be1ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b600b54760100000000000000000000000000000000000000000000900462ffffff16620186a01480610fd15750600154600b54610fb49190760100000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6001600160a01b0383165f90815260066020526040902054820111155b15610fdb57505050565b6040517f9bd6a5a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81156110a4576001600160a01b0384165f908152600760209081526040808320338085529252909120548381101561108b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018590526064016106b1565b5f1981146110a1576110a186838684035f610cd9565b50505b6110af8484846110b9565b5060019392505050565b6110c4838383610df0565b6110cf8383836112e4565b505050565b83421115611111576040517f62791302000000000000000000000000000000000000000000000000000000008152600481018590526024016106b1565b6001600160a01b038781165f8181526005602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e0850190915280519101207f19010000000000000000000000000000000000000000000000000000000000006101008401527f0000000000000000000000000000000000000000000000000000000000000000610102840152610122830152919061014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561126c573d5f5f3e3d5ffd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146112d6576040517f4b800e460000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152891660248201526044016106b1565b50610cc68787876001610cd9565b6001600160a01b03831661132f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038216158061134d57506001600160a01b03821630145b1561138f576040517fec442f050000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b6001600160a01b0383165f90815260066020526040902054811115611409576001600160a01b0383165f81815260066020526040908190205490517fe450d38c00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b1565b80156115c8576001600160a01b0383165f908152600660205260408120805483900390819055900361146c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000811662ffffff9182165f19019091161790555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b038316016114aa576001805482900390556115c8565b6001600160a01b0382165f9081526006602052604081205490036114fe575f805462ffffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009091161790555b6001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff166115c8576001600160a01b0382165f81815260086020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161160d91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b0381168114611683575f5ffd5b919050565b5f5f60408385031215611699575f5ffd5b6116a28361166d565b946020939093013593505050565b5f5f5f606084860312156116c2575f5ffd5b6116cb8461166d565b92506116d96020850161166d565b929592945050506040919091013590565b5f602082840312156116fa575f5ffd5b5035919050565b5f60208284031215611711575f5ffd5b61056d8261166d565b803562ffffff81168114611683575f5ffd5b5f5f5f5f5f5f5f60c0888a031215611742575f5ffd5b61174b8861166d565b96506117596020890161166d565b95506117676040890161171a565b94506117756060890161171a565b9350608088013563ffffffff8116811461178d575f5ffd5b925060a088013567ffffffffffffffff8111156117a8575f5ffd5b8801601f81018a136117b8575f5ffd5b803567ffffffffffffffff8111156117ce575f5ffd5b8a60208260051b84010111156117e2575f5ffd5b602082019350809250505092959891949750929550565b5f5f6040838503121561180a575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561186557835180516001600160a01b031684526020908101518185015290930192604090920191600101611832565b509095945050505050565b5f5f5f5f5f5f5f60e0888a031215611886575f5ffd5b61188f8861166d565b965061189d6020890161166d565b95506040880135945060608801359350608088013560ff811681146118c0575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156118ee575f5ffd5b6118f78361166d565b91506119056020840161166d565b90509250929050565b600181811c9082168061192257607f821691505b602082108103611959577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffdfea2646970667358221220688214a33c697126760eeed157514a03e7bf0b8444ccad98749000ac1be5d87764736f6c634300081c0033a2646970667358221220b75506246bc522b2e5bada14645c853931b1b21ab0a3d6aa766a27c047ed9dc464736f6c634300081c0033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.