ETH Price: $2,369.20 (-3.79%)

Token

PubeCoin (PUBE)
 

Overview

Max Total Supply

1,000,000,000 PUBE

Holders

344

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
21,000 PUBE

Value
$0.00
0x9462881d61b9379ee4fff783c2bd8ac80d945aaf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PubeCoin is a decentralized, blockchain-powered universal digital currency that aims to usher in the era of using “pubes” in financial transactions.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PubeCoin

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-25
*/

pragma solidity >=0.5.12;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() external view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}



/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    _transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

  /**
  * @dev Transfer token for a specified addresses
  * @param _from The address to transfer from.
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function _transfer(address _from, address _to, uint256 _value) internal {
      require(_to != address(0));
      require(_value <= balances[_from]);
  
      balances[_from] = balances[_from].sub(_value);
      balances[_to] = balances[_to].add(_value);
      emit Transfer(_from, _to, _value);
  }
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool)
  {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}



/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}


/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/openzeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  modifier hasMintPermission() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    hasMintPermission
    canMint
    internal
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() onlyOwner canMint internal returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}


contract FreezableToken is StandardToken, Ownable {
    // freezing chains
    mapping (bytes32 => uint64) internal chains;
    // freezing amounts for each chain
    mapping (bytes32 => uint) internal freezings;
    // total freezing balance per address
    mapping (address => uint) internal freezingBalance;

    // reducible freezing chains
    mapping (bytes32 => uint64) internal reducibleChains;
    // reducible freezing amounts for each chain
    mapping (bytes32 => uint) internal reducibleFreezings;
    // total reducible freezing balance per address
    mapping (address => uint) internal reducibleFreezingBalance;

    event Freezed(address indexed to, uint64 release, uint amount);
    event Released(address indexed owner, uint amount);
    event FreezeReduced(address indexed owner, uint64 release, uint amount);

    modifier hasReleasePermission() {
        require(msg.sender == owner, "Access denied");
        _;
    }

    /**
     * @dev Gets the balance of the specified address include freezing tokens.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return super.balanceOf(_owner) + freezingBalance[_owner] + reducibleFreezingBalance[_owner];
    }

    /**
     * @dev Gets the balance of the specified address without freezing tokens.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function actualBalanceOf(address _owner) public view returns (uint256 balance) {
        return super.balanceOf(_owner);
    }

    /**
     * @dev Gets the freezed balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function freezingBalanceOf(address _owner) public view returns (uint256 balance) {
        return freezingBalance[_owner];
    }

    /**
     * @dev Gets the reducible freezed balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function reducibleFreezingBalanceOf(address _owner) public view returns (uint256 balance) {
        return reducibleFreezingBalance[_owner];
    }

    /**
     * @dev gets freezing count
     * @param _addr Address of freeze tokens owner.
     */
    function freezingCount(address _addr) public view returns (uint count) {
        uint64 release = chains[toKey(_addr, 0)];
        while (release != 0) {
            count++;
            release = chains[toKey(_addr, release)];
        }
    }

    /**
     * @dev gets reducible freezing count
     * @param _addr Address of freeze tokens owner.
     * @param _sender Address of frozen tokens sender.
     */
    function reducibleFreezingCount(address _addr, address _sender) public view returns (uint count) {
        uint64 release = reducibleChains[toKey2(_addr, _sender, 0)];
        while (release != 0) {
            count++;
            release = reducibleChains[toKey2(_addr, _sender, release)];
        }
    }

    /**
     * @dev gets freezing end date and freezing balance for the freezing portion specified by index.
     * @param _addr Address of freeze tokens owner.
     * @param _index Freezing portion index. It ordered by release date descending.
     */
    function getFreezing(address _addr, uint _index) public view returns (uint64 _release, uint _balance) {
        for (uint i = 0; i < _index + 1; i++) {
            _release = chains[toKey(_addr, _release)];
            if (_release == 0) {
                return (0, 0);
            }
        }
        _balance = freezings[toKey(_addr, _release)];
    }

    /**
     * @dev gets reducible freezing end date and reducible freezing balance for the freezing portion specified by index.
     * @param _addr Address of freeze tokens owner.
     * @param _sender Address of frozen tokens sender.
     * @param _index Freezing portion index. It ordered by release date descending.
     */
    function getReducibleFreezing(address _addr, address _sender, uint _index) public view returns (uint64 _release, uint _balance) {
        for (uint i = 0; i < _index + 1; i++) {
            _release = reducibleChains[toKey2(_addr, _sender, _release)];
            if (_release == 0) {
                return (0, 0);
            }
        }
        _balance = reducibleFreezings[toKey2(_addr, _sender, _release)];
    }

    /**
     * @dev freeze your tokens to the specified address.
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to freeze.
     * @param _until Release date, must be in future.
     */
    function freezeTo(address _to, uint _amount, uint64 _until) public {
        _freezeTo(msg.sender, _to, _amount, _until);
    }

    /**
     * @dev freeze your tokens to the specified address.
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to freeze.
     * @param _until Release date, must be in future.
     */
    function _freezeTo(address _from, address _to, uint _amount, uint64 _until) internal {
        require(_to != address(0));
        require(_amount <= balances[_from]);

        balances[_from] = balances[_from].sub(_amount);

        bytes32 currentKey = toKey(_to, _until);
        freezings[currentKey] = freezings[currentKey].add(_amount);
        freezingBalance[_to] = freezingBalance[_to].add(_amount);

        freeze(_to, _until);
        emit Transfer(_from, _to, _amount);
        emit Freezed(_to, _until, _amount);
    }

    /**
     * @dev freeze your tokens to the specified address with posibility to reduce freezing.
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to freeze.
     * @param _until Release date, must be in future.
     */
    function reducibleFreezeTo(address _to, uint _amount, uint64 _until) public {
        require(_to != address(0));
        require(_amount <= balances[msg.sender]);
        require(_until > block.timestamp);

        balances[msg.sender] = balances[msg.sender].sub(_amount);

        bytes32 currentKey = toKey2(_to, msg.sender, _until);
        reducibleFreezings[currentKey] = reducibleFreezings[currentKey].add(_amount);
        reducibleFreezingBalance[_to] = reducibleFreezingBalance[_to].add(_amount);

        reducibleFreeze(_to, _until);
        emit Transfer(msg.sender, _to, _amount);
        emit Freezed(_to, _until, _amount);
    }

    /**
     * @dev reduce freeze time for _amount of tokens for reducible freezing of address _to by frozen tokens sender.
     *      Removes reducible freezing for _amount of tokens if _newUntil in the past
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to freeze.
     * @param _until Release date, must be in future.
     */
    function reduceFreezingTo(address _to, uint _amount, uint64 _until, uint64 _newUntil) public {
        require(_to != address(0));

        // Don't allow to move reducible freezing to the future
        require(_newUntil < _until, "Attempt to move the freezing into the future");

        bytes32 currentKey = toKey2(_to, msg.sender, _until);
        uint amount = reducibleFreezings[currentKey];
        require(amount > 0, "Freezing not found");

        if (_amount >= amount) {
            delete reducibleFreezings[currentKey];

            uint64 next = reducibleChains[currentKey];
            bytes32 parent = toKey2(_to, msg.sender, uint64(0));
            while (reducibleChains[parent] != _until) {
                parent = toKey2(_to, msg.sender, reducibleChains[parent]);
            }

            if (next == 0) {
                delete reducibleChains[parent];
            }
            else {
                reducibleChains[parent] = next;
            }

            if (_newUntil <= block.timestamp) {
                balances[_to] = balances[_to].add(amount);
                reducibleFreezingBalance[_to] = reducibleFreezingBalance[_to].sub(amount);

                emit Released(_to, amount);
            }
            else {
                bytes32 newKey = toKey2(_to, msg.sender, _newUntil);
                reducibleFreezings[newKey] = reducibleFreezings[newKey].add(amount);

                reducibleFreeze(_to, _newUntil);

                emit FreezeReduced(_to, _newUntil, amount);
            }
        }
        else {
            reducibleFreezings[currentKey] = reducibleFreezings[currentKey].sub(_amount);
            if (_newUntil <= block.timestamp) {
                balances[_to] = balances[_to].add(_amount);
                reducibleFreezingBalance[_to] = reducibleFreezingBalance[_to].sub(_amount);

                emit Released(_to, _amount);
            }
            else {
                bytes32 newKey = toKey2(_to, msg.sender, _newUntil);
                reducibleFreezings[newKey] = reducibleFreezings[newKey].add(_amount);

                reducibleFreeze(_to, _newUntil);

                emit FreezeReduced(_to, _newUntil, _amount);
            }
        }
    }

    /**
     * @dev release first available freezing tokens.
     */
    function releaseOnce() public {
        _releaseOnce(msg.sender);
    }

    /**
     * @dev release first available freezing tokens (support).
     * @param _addr Address of frozen tokens owner.
     */
    function releaseOnceFor(address _addr) hasReleasePermission public {
        _releaseOnce(_addr);
    }

    /**
     * @dev release first available freezing tokens.
     * @param _addr Address of frozen tokens owner.
     */
    function _releaseOnce(address _addr) internal {
        bytes32 headKey = toKey(_addr, 0);
        uint64 head = chains[headKey];
        require(head != 0, "Freezing not found");
        require(uint64(block.timestamp) > head, "Premature release attempt");
        bytes32 currentKey = toKey(_addr, head);

        uint64 next = chains[currentKey];

        uint amount = freezings[currentKey];
        delete freezings[currentKey];

        balances[_addr] = balances[_addr].add(amount);
        freezingBalance[_addr] = freezingBalance[_addr].sub(amount);

        if (next == 0) {
            delete chains[headKey];
        } else {
            chains[headKey] = next;
            delete chains[currentKey];
        }
        emit Released(_addr, amount);
    }

    /**
     * @dev release first available reducible freezing tokens.
     * @param _sender Address of frozen tokens sender.
     */
    function releaseReducibleFreezingOnce(address _sender) public {
        _releaseReducibleFreezingOnce(msg.sender, _sender);
    }

    /**
     * @dev release first available reducible freezing tokens for _addr.
     * @param _addr Address of frozen tokens owner.
     * @param _sender Address of frozen tokens sender.
     */
    function releaseReducibleFreezingOnceFor(address _addr, address _sender) hasReleasePermission public {
        _releaseReducibleFreezingOnce(_addr, _sender);
    }

    /**
     * @dev release first available reducible freezing tokens.
     * @param _addr Address of frozen tokens owner.
     * @param _sender Address of frozen tokens sender.
     */
    function _releaseReducibleFreezingOnce(address _addr, address _sender) internal {
        bytes32 headKey = toKey2(_addr, _sender, 0);
        uint64 head = reducibleChains[headKey];
        require(head != 0, "Freezing not found");
        require(uint64(block.timestamp) > head, "Premature release attempt");
        bytes32 currentKey = toKey2(_addr, _sender, head);

        uint64 next = reducibleChains[currentKey];

        uint amount = reducibleFreezings[currentKey];
        delete reducibleFreezings[currentKey];

        balances[_addr] = balances[_addr].add(amount);
        reducibleFreezingBalance[_addr] = reducibleFreezingBalance[_addr].sub(amount);

        if (next == 0) {
            delete reducibleChains[headKey];
        } else {
            reducibleChains[headKey] = next;
            delete reducibleChains[currentKey];
        }
        emit Released(_addr, amount);
    }

    /**
     * @dev release all available for release freezing tokens. Gas usage is not deterministic!
     * @return how many tokens was released
     */
    function releaseAll() public returns (uint tokens) {
        tokens = _releaseAll(msg.sender);
    }

    /**
     * @dev release all available for release freezing tokens for address _addr. Gas usage is not deterministic!
     * @param _addr Address of frozen tokens owner.
     * @return how many tokens was released
     */
    function releaseAllFor(address _addr) hasReleasePermission public returns (uint tokens) {
        tokens = _releaseAll(_addr);
    }

    /**
     * @dev release all available for release freezing tokens.
     * @param _addr Address of frozen tokens owner.
     * @return how many tokens was released
     */
    function _releaseAll(address _addr) internal returns (uint tokens) {
        uint release;
        uint balance;
        (release, balance) = getFreezing(_addr, 0);
        while (release != 0 && block.timestamp > release) {
            _releaseOnce(_addr);
            tokens += balance;
            (release, balance) = getFreezing(_addr, 0);
        }
    }

    /**
     * @dev release all available for release reducible freezing tokens sent by _sender. Gas usage is not deterministic!
     * @param _sender Address of frozen tokens sender.
     * @return how many tokens was released
     */
    function reducibleReleaseAll(address _sender) public returns (uint tokens) {
        tokens = _reducibleReleaseAll(msg.sender, _sender);
    }

    /**
     * @dev release all available for release reducible freezing tokens sent by _sender to _addr. Gas usage is not deterministic!
     * @param _addr Address of frozen tokens owner.
     * @param _sender Address of frozen tokens sender.
     * @return how many tokens was released
     */
    function reducibleReleaseAllFor(address _addr, address _sender) hasReleasePermission public returns (uint tokens) {
        tokens = _reducibleReleaseAll(_addr, _sender);
    }


    /**
     * @dev release all available for release reducible freezing tokens sent by _sender to _addr.
     * @param _addr Address of frozen tokens owner.
     * @param _sender Address of frozen tokens sender.
     * @return how many tokens was released
     */
    function _reducibleReleaseAll(address _addr, address _sender) internal returns (uint tokens) {
        uint release;
        uint balance;
        (release, balance) = getReducibleFreezing(_addr, _sender, 0);
        while (release != 0 && block.timestamp > release) {
            releaseReducibleFreezingOnce(_sender);
            tokens += balance;
            (release, balance) = getReducibleFreezing(_addr, _sender, 0);
        }
    }

    function toKey(address _addr, uint _release) internal pure returns (bytes32 result) {
        result = 0x1852251212091514201510158141318000000000000000000000000000000000;
        assembly {
            result := or(result, mul(_addr, 0x10000000000000000))
            result := or(result, _release)
        }
    }

    function toKey2(address _addr1, address _addr2, uint _release) internal pure returns (bytes32 result) {
        bytes32 key1 = 0x1852251212091514201510158141318000000000000000000000000000000000;
        bytes32 key2 = 0x9117776660000000000000000000000000000000000000000000000000000000;
        assembly {
            key1 := or(key1, mul(_addr1, 0x10000000000000000))
            key1 := or(key1, _release)
            key2 := or(key2, _addr2)
        }
        result = keccak256(abi.encodePacked(key1, key2));
    }

    function freeze(address _to, uint64 _until) internal {
        require(_until > block.timestamp);
        bytes32 key = toKey(_to, _until);
        bytes32 parentKey = toKey(_to, uint64(0));
        uint64 next = chains[parentKey];

        if (next == 0) {
            chains[parentKey] = _until;
            return;
        }

        bytes32 nextKey = toKey(_to, next);
        uint parent;

        while (next != 0 && _until > next) {
            parent = next;
            parentKey = nextKey;

            next = chains[nextKey];
            nextKey = toKey(_to, next);
        }

        if (_until == next) {
            return;
        }

        if (next != 0) {
            chains[key] = next;
        }

        chains[parentKey] = _until;
    }

    function reducibleFreeze(address _to, uint64 _until) internal {
        require(_until > block.timestamp);
        bytes32 key = toKey2(_to, msg.sender, _until);
        bytes32 parentKey = toKey2(_to, msg.sender, uint64(0));
        uint64 next = reducibleChains[parentKey];

        if (next == 0) {
            reducibleChains[parentKey] = _until;
            return;
        }

        bytes32 nextKey = toKey2(_to, msg.sender, next);
        uint parent;

        while (next != 0 && _until > next) {
            parent = next;
            parentKey = nextKey;

            next = reducibleChains[nextKey];
            nextKey = toKey2(_to, msg.sender, next);
        }

        if (_until == next) {
            return;
        }

        if (next != 0) {
            reducibleChains[key] = next;
        }

        reducibleChains[parentKey] = _until;
    }
}


/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is BasicToken {

  event Burn(address indexed burner, uint256 value);

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value) public {
    _burn(msg.sender, _value);
  }

  function _burn(address _who, uint256 _value) internal {
    require(_value <= balances[_who]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_who] = balances[_who].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    emit Burn(_who, _value);
    emit Transfer(_who, address(0), _value);
  }
}



/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}


contract Consts {
    uint public constant token_decimals = 8;
    uint8 public constant token_decimals_uint8 = 8;
    uint public constant token_decimal_multiplier = 10 ** token_decimals;
    string public constant token_name = "PubeCoin";
    string public constant token_symbol = "PUBE";
    uint public constant initial_supply = 1000000000 * token_decimal_multiplier;
}


contract PubeCoin is Consts, BurnableToken, Pausable, MintableToken, FreezableToken
{
    uint256 startdate;

    address beneficiary1;
    address beneficiary2;
    address beneficiary3;
    address beneficiary4;

    event Initialized();
    bool public initialized = false;

    constructor() public {
        init();
    }

    function name() public pure returns (string memory) {
        return token_name;
    }

    function symbol() public pure returns (string memory) {
        return token_symbol;
    }

    function decimals() public pure returns (uint8) {
        return token_decimals_uint8;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool _success) {
        require(!paused);
        return super.transferFrom(_from, _to, _value);
    }

    function transfer(address _to, uint256 _value) public returns (bool _success) {
        require(!paused);
        return super.transfer(_to, _value);
    }

    function init() private {
        require(!initialized);
        initialized = true;


        // Total Supply
        uint256 amount = initial_supply;

        // Mint all tokens
        mint(address(this), amount);
        finishMinting();

        // Start date is January 01, 2022
        startdate = 1640966400;


        beneficiary1 = 0xA2f1319a4c6Aac59FDaf198f76176d0F91Ae6A93; // Public sale
        beneficiary2 = 0xaAa4Abf21816f8Ca7eDF343e33a7179f4539252D; // Team 
        beneficiary3 = 0x1D5b0f58C4D3fa38B2EB99e256B57dED31948adc; // Bounty
        beneficiary4 = 0xd7aF22B6a8B5F430C0306B22949738ED6a7d1C12; // Foundation

        // Public sale (80%)
        _transfer(address(this), beneficiary1, totalSupply().mul(80).div(100));

        // Team tokens (10%) are frozen will be released every six months after 1 year.
        _freezeTo(address(this), beneficiary2, totalSupply().mul(10).div(100).div(4), uint64(startdate + 366 days));
        _freezeTo(address(this), beneficiary2, totalSupply().mul(10).div(100).div(4), uint64(startdate + 548 days));
        _freezeTo(address(this), beneficiary2, totalSupply().mul(10).div(100).div(4), uint64(startdate + 731 days));
        _freezeTo(address(this), beneficiary2, totalSupply().mul(10).div(100).div(4), uint64(startdate + 913 days));

        // Bounty tokens (3%) will be distributed to the bounty campaign participants during the token sale.
        _transfer(address(this), beneficiary3, totalSupply().mul(3).div(100));
		
		// Foundation tokens (7%) will be frozen on PubeCoin Foundation smart-contract for 2 years.
		_freezeTo(address(this), beneficiary4, totalSupply().mul(7).div(100), uint64(startdate + 731 days));


        emit Initialized();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint64","name":"release","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FreezeReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint64","name":"release","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"actualBalanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_until","type":"uint64"}],"name":"freezeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"freezingBalanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"freezingCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getFreezing","outputs":[{"internalType":"uint64","name":"_release","type":"uint64"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getReducibleFreezing","outputs":[{"internalType":"uint64","name":"_release","type":"uint64"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initial_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_until","type":"uint64"},{"internalType":"uint64","name":"_newUntil","type":"uint64"}],"name":"reduceFreezingTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_until","type":"uint64"}],"name":"reducibleFreezeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"reducibleFreezingBalanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"reducibleFreezingCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"reducibleReleaseAll","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"reducibleReleaseAllFor","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseAll","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"releaseAllFor","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseOnce","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"releaseOnceFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"releaseReducibleFreezingOnce","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_sender","type":"address"}],"name":"releaseReducibleFreezingOnceFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"token_decimal_multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token_decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token_decimals_uint8","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token_name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600360146101000a81548160ff0219169083151502179055506000600360156101000a81548160ff0219169083151502179055506000600e60146101000a81548160ff0219169083151502179055503480156200006257600080fd5b5033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620000b4620000ba60201b60201c565b6200118c565b600e60149054906101000a900460ff1615620000d557600080fd5b6001600e60146101000a81548160ff02191690831515021790555060006008600a0a633b9aca000290506200011130826200068e60201b60201c565b50620001226200088060201b60201c565b506361cf2900600a8190555073a2f1319a4c6aac59fdaf198f76176d0f91ae6a93600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073aaa4abf21816f8ca7edf343e33a7179f4539252d600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731d5b0f58c4d3fa38b2eb99e256b57ded31948adc600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d7af22b6a8b5f430c0306b22949738ed6a7d1c12600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002fa30600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620002ee6064620002da6050620002c66200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200099d60201b60201c565b6200039530600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200038060046200036c606462000358600a620003446200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200098860201b620046bf1790919060201c565b6301e28500600a540162000bc260201b60201c565b6200043030600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200041b6004620004076064620003f3600a620003df6200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200098860201b620046bf1790919060201c565b6302d27600600a540162000bc260201b60201c565b620004cb30600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620004b66004620004a260646200048e600a6200047a6200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200098860201b620046bf1790919060201c565b6303c3b880600a540162000bc260201b60201c565b6200056630600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200055160046200053d606462000529600a620005156200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200098860201b620046bf1790919060201c565b6304b3a980600a540162000bc260201b60201c565b620005de30600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16620005d26064620005be6003620005aa6200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6200099d60201b60201c565b6200065f30600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200064a6064620006366007620006226200094660201b60201c565b6200095060201b6200468b1790919060201c565b6200098860201b620046bf1790919060201c565b6303c3b880600a540162000bc260201b60201c565b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a150565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620006eb57600080fd5b600360159054906101000a900460ff16156200070657600080fd5b620007228260015462000ecb60201b62002db31790919060201c565b60018190555062000780826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ecb60201b62002db31790919060201c565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620008dd57600080fd5b600360159054906101000a900460ff1615620008f857600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b6000600154905090565b60008083141562000965576000905062000982565b8183029050818382816200097557fe5b04146200097e57fe5b8090505b92915050565b60008183816200099457fe5b04905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009d857600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111562000a2457600080fd5b62000a7c816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ee660201b62002dcd1790919060201c565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000b16816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ecb60201b62002db31790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000bfd57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111562000c4957600080fd5b62000ca1826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ee660201b62002dcd1790919060201c565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600062000d01848367ffffffffffffffff1662000efe60201b60201c565b905062000d3083600560008481526020019081526020016000205462000ecb60201b62002db31790919060201c565b600560008381526020019081526020016000208190555062000da083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000ecb60201b62002db31790919060201c565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000df5848362000f4160201b60201c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a25050505050565b600081830190508281101562000edd57fe5b80905092915050565b60008282111562000ef357fe5b818303905092915050565b60007f185225121209151420151015814131800000000000000000000000000000000060001b905068010000000000000000830281179050818117905092915050565b428167ffffffffffffffff161162000f5857600080fd5b600062000f76838367ffffffffffffffff1662000efe60201b60201c565b9050600062000f9784600067ffffffffffffffff1662000efe60201b60201c565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156200101c57836004600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505062001188565b60006200103a868367ffffffffffffffff1662000efe60201b60201c565b905060005b60008367ffffffffffffffff16141580156200106e57508267ffffffffffffffff168667ffffffffffffffff16115b15620010d2578267ffffffffffffffff1690508193506004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff169250620010ca878467ffffffffffffffff1662000efe60201b60201c565b91506200103f565b8267ffffffffffffffff168667ffffffffffffffff161415620010fa57505050505062001188565b60008367ffffffffffffffff16146200114857826004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856004600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b614734806200119c6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80634be2c7ba1161015157806395d89b41116100c3578063d73dd62311610087578063d73dd62314610da5578063d783a2b514610e0b578063d8aeedf514610e83578063dd62ed3e14610edb578063f2fde38b14610f53578063fec0ef6014610f9757610274565b806395d89b4114610baa5780639e9470db14610c2d578063a9059cbb14610c85578063ca63b5b814610ceb578063d60fcb8914610d4357610274565b806370a082311161011557806370a0823114610a2d578063715018a614610a855780638456cb5914610a8f57806386036bb414610a995780638da5cb5b14610add578063947a316814610b2757610274565b80634be2c7ba146108e05780635be7fde81461097d5780635c975abb1461099b57806366188463146109bd57806366a92cda14610a2357610274565b8063236e02e0116101ea5780633c4b303d116101ae5780633c4b303d146107e45780633d7e82c9146108025780633f4ba83a1461082057806342966c681461082a57806342a7508314610858578063462a520f146108bc57610274565b8063236e02e01461064257806323b872dd146106ba5780632405e3c614610740578063313ce5671461075e5780633be1e9521461078257610274565b8063158ef93e1161023c578063158ef93e146104775780631673836a1461049957806317a950ac146104f157806318160ddd146105495780631e658e36146105675780631f772a34146105bf57610274565b806302d6f7301461027957806305d2035b146102f657806306fdde0314610318578063095ea7b31461039b5780630b67f7f114610401575b600080fd5b6102c56004803603604081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fdb565b604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390f35b6102fe611091565b604051808215151515815260200191505060405180910390f35b6103206110a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610360578082015181840152602081019050610345565b50505050905090810190601f16801561038d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e7600480360360408110156103b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110e1565b604051808215151515815260200191505060405180910390f35b6104756004803603608081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190803567ffffffffffffffff1690602001909291905050506111d3565b005b61047f611984565b604051808215151515815260200191505060405180910390f35b6104db600480360360208110156104af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611997565b6040518082815260200191505060405180910390f35b6105336004803603602081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e0565b6040518082815260200191505060405180910390f35b6105516119f2565b6040518082815260200191505060405180910390f35b6105a96004803603602081101561057d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119fc565b6040518082815260200191505060405180910390f35b6105c7611a0f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106075780820151818401526020810190506105ec565b50505050905090810190601f1680156106345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106a46004803603604081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a48565b6040518082815260200191505060405180910390f35b610726600480360360608110156106d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1f565b604051808215151515815260200191505060405180910390f35b610748611b4f565b6040518082815260200191505060405180910390f35b610766611b5d565b604051808260ff1660ff16815260200191505060405180910390f35b6107e26004803603606081101561079857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190505050611b66565b005b6107ec611b77565b6040518082815260200191505060405180910390f35b61080a611b7c565b6040518082815260200191505060405180910390f35b610828611b84565b005b6108566004803603602081101561084057600080fd5b8101908080359060200190929190505050611c40565b005b6108ba6004803603604081101561086e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c4d565b005b6108c4611d1e565b604051808260ff1660ff16815260200191505060405180910390f35b61094c600480360360608110156108f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d23565b604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390f35b610985611ddc565b6040518082815260200191505060405180910390f35b6109a3611dec565b604051808215151515815260200191505060405180910390f35b610a09600480360360408110156109d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dff565b604051808215151515815260200191505060405180910390f35b610a2b612090565b005b610a6f60048036036020811015610a4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061209b565b6040518082815260200191505060405180910390f35b610a8d61212f565b005b610a97612232565b005b610adb60048036036020811015610aaf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122ef565b005b610ae56122fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2f612322565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b6f578082015181840152602081019050610b54565b50505050905090810190601f168015610b9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610bb261235b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bf2578082015181840152602081019050610bd7565b50505050905090810190601f168015610c1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c6f60048036036020811015610c4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612398565b6040518082815260200191505060405180910390f35b610cd160048036036040811015610c9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061246d565b604051808215151515815260200191505060405180910390f35b610d2d60048036036020811015610d0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061249b565b6040518082815260200191505060405180910390f35b610da360048036036060811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190505050612535565b005b610df160048036036040811015610dbb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061282d565b604051808215151515815260200191505060405180910390f35b610e6d60048036036040811015610e2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a29565b6040518082815260200191505060405180910390f35b610ec560048036036020811015610e9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ac6565b6040518082815260200191505060405180910390f35b610f3d60048036036040811015610ef157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b0f565b6040518082815260200191505060405180910390f35b610f9560048036036020811015610f6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b96565b005b610fd960048036036020811015610fad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bfc565b005b60008060008090505b6001840181101561105f5760046000611007878667ffffffffffffffff16612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff16141561105257600080819150809050925092505061108a565b8080600101915050610fe4565b5060056000611078868567ffffffffffffffff16612ccb565b81526020019081526020016000205490505b9250929050565b600360159054906101000a900460ff1681565b60606040518060400160405280600881526020017f50756265436f696e000000000000000000000000000000000000000000000000815250905090565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561120d57600080fd5b8167ffffffffffffffff168167ffffffffffffffff1610611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806146d4602c913960400191505060405180910390fd5b600061129085338567ffffffffffffffff16612d0e565b905060006008600083815260200190815260200160002054905060008111611320576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8085106116e657600860008381526020019081526020016000206000905560006007600084815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060006113828833600067ffffffffffffffff16612d0e565b90505b8567ffffffffffffffff166007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461140a5761140388336007600085815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16612d0e565b9050611385565b60008267ffffffffffffffff16141561144c576007600082815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055611487565b816007600083815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b428567ffffffffffffffff1611611613576114e9836000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061157d83600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e846040518082815260200191505060405180910390a26116df565b600061162a89338867ffffffffffffffff16612d0e565b9050611652846008600084815260200190815260200160002054612db390919063ffffffff16565b60086000838152602001908152602001600020819055506116738987612de4565b8873ffffffffffffffffffffffffffffffffffffffff167fa3a64ccd852668b52d8ce6fee989c8992dfdb762e92f0fa33557497afae8a3578786604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a2505b505061197c565b61170c856008600085815260200190815260200160002054612dcd90919063ffffffff16565b6008600084815260200190815260200160002081905550428367ffffffffffffffff16116118af57611785856000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061181985600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e866040518082815260200191505060405180910390a261197b565b60006118c687338667ffffffffffffffff16612d0e565b90506118ee866008600084815260200190815260200160002054612db390919063ffffffff16565b600860008381526020019081526020016000208190555061190f8785612de4565b8673ffffffffffffffffffffffffffffffffffffffff167fa3a64ccd852668b52d8ce6fee989c8992dfdb762e92f0fa33557497afae8a3578588604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a2505b5b505050505050565b600e60149054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006119eb8261300a565b9050919050565b6000600154905090565b6000611a083383613052565b9050919050565b6040518060400160405280600481526020017f505542450000000000000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b611b178383613052565b905092915050565b6000600360149054906101000a900460ff1615611b3b57600080fd5b611b468484846130ca565b90509392505050565b6008600a0a633b9aca000281565b60006008905090565b611b723384848461347e565b505050565b600881565b6008600a0a81565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bde57600080fd5b600360149054906101000a900460ff16611bf757600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b611c4a3382613760565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b611d1a8282613911565b5050565b600881565b60008060008090505b60018401811015611da85760076000611d5088888767ffffffffffffffff16612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff161415611d9b576000808191508090509250925050611dd4565b8080600101915050611d2c565b5060086000611dc287878667ffffffffffffffff16612d0e565b81526020019081526020016000205490505b935093915050565b6000611de733613cf1565b905090565b600360149054906101000a900460ff1681565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115611f10576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fa4565b611f238382612dcd90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b61209933613d66565b565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121268461300a565b01019050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461228c57600080fd5b600360149054906101000a900460ff16156122a657600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6122f93382613911565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600881526020017f50756265436f696e00000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600481526020017f5055424500000000000000000000000000000000000000000000000000000000815250905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b61246682613cf1565b9050919050565b6000600360149054906101000a900460ff161561248957600080fd5b6124938383614143565b905092915050565b600080600460006124ad856000612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff161461252f57818060010192505060046000612505858467ffffffffffffffff16612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506124d3565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156125ba57600080fd5b428167ffffffffffffffff16116125d057600080fd5b612621826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061267a84338467ffffffffffffffff16612d0e565b90506126a2836008600084815260200190815260200160002054612db390919063ffffffff16565b600860008381526020019081526020016000208190555061270b83600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127588483612de4565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a250505050565b60006128be82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060076000612a3c86866000612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff1614612abf57818060010192505060076000612a9586868567ffffffffffffffff16612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050612a62565b5092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf057600080fd5b612bf98161415a565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b612cc881613d66565b50565b60007f185225121209151420151015814131800000000000000000000000000000000060001b905068010000000000000000830281179050818117905092915050565b6000807f185225121209151420151015814131800000000000000000000000000000000060001b905060007f911777666000000000000000000000000000000000000000000000000000000060001b905068010000000000000000860282179150838217915084811790508181604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925050509392505050565b6000818301905082811015612dc457fe5b80905092915050565b600082821115612dd957fe5b818303905092915050565b428167ffffffffffffffff1611612dfa57600080fd5b6000612e1183338467ffffffffffffffff16612d0e565b90506000612e2b8433600067ffffffffffffffff16612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff161415612eae57836007600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050613006565b6000612ec586338467ffffffffffffffff16612d0e565b905060005b60008367ffffffffffffffff1614158015612ef857508267ffffffffffffffff168667ffffffffffffffff16115b15612f53578267ffffffffffffffff1690508193506007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff169250612f4c87338567ffffffffffffffff16612d0e565b9150612eca565b8267ffffffffffffffff168667ffffffffffffffff161415612f79575050505050613006565b60008367ffffffffffffffff1614612fc657826007600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856007600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600061306385856000611d23565b8167ffffffffffffffff16915080925081935050505b6000821415801561308957508142115b156130c257613097846122ef565b80830192506130a885856000611d23565b8167ffffffffffffffff1691508092508193505050613079565b505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310557600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561315057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156131d957600080fd5b61322a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132bd826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061338e82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b857600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561350357600080fd5b613554826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006135ac848367ffffffffffffffff16612ccb565b90506135d4836005600084815260200190815260200160002054612db390919063ffffffff16565b600560008381526020019081526020016000208190555061363d83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368a8483614254565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a25050505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156137ab57600080fd5b6137fc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061385381600154612dcd90919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600061391f83836000612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff164267ffffffffffffffff1611613a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5072656d61747572652072656c6561736520617474656d70740000000000000081525060200191505060405180910390fd5b6000613a6e85858467ffffffffffffffff16612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600860008481526020019081526020016000205490506008600084815260200190815260200160002060009055613b1c816000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb081600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff161415613c35576007600086815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055613c9a565b816007600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506007600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b8673ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040518082815260200191505060405180910390a250505050505050565b6000806000613d01846000610fdb565b8167ffffffffffffffff16915080925081935050505b60008214158015613d2757508142115b15613d5f57613d3584613d66565b8083019250613d45846000610fdb565b8167ffffffffffffffff1691508092508193505050613d17565b5050919050565b6000613d73826000612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff161415613e22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff164267ffffffffffffffff1611613eab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5072656d61747572652072656c6561736520617474656d70740000000000000081525060200191505060405180910390fd5b6000613ec1848367ffffffffffffffff16612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600560008481526020019081526020016000205490506005600084815260200190815260200160002060009055613f6f816000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061400381600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff161415614088576004600086815260200190815260200160002060006101000a81549067ffffffffffffffff02191690556140ed565b816004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506004600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b8573ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040518082815260200191505060405180910390a2505050505050565b6000614150338484614476565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561419457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b428167ffffffffffffffff161161426a57600080fd5b6000614280838367ffffffffffffffff16612ccb565b9050600061429984600067ffffffffffffffff16612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff16141561431c57836004600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050614472565b6000614332868367ffffffffffffffff16612ccb565b905060005b60008367ffffffffffffffff161415801561436557508267ffffffffffffffff168667ffffffffffffffff16115b156143bf578267ffffffffffffffff1690508193506004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1692506143b8878467ffffffffffffffff16612ccb565b9150614337565b8267ffffffffffffffff168667ffffffffffffffff1614156143e5575050505050614472565b60008367ffffffffffffffff161461443257826004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856004600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156144b057600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156144fb57600080fd5b61454c816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145df816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008083141561469e57600090506146b9565b8183029050818382816146ad57fe5b04146146b557fe5b8090505b92915050565b60008183816146ca57fe5b0490509291505056fe417474656d707420746f206d6f76652074686520667265657a696e6720696e746f2074686520667574757265a265627a7a723158208c77b6415fe78770ebbc54e1b5ea0259c5263928a1418c8cba7696f9c81bafa464736f6c634300050c0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c80634be2c7ba1161015157806395d89b41116100c3578063d73dd62311610087578063d73dd62314610da5578063d783a2b514610e0b578063d8aeedf514610e83578063dd62ed3e14610edb578063f2fde38b14610f53578063fec0ef6014610f9757610274565b806395d89b4114610baa5780639e9470db14610c2d578063a9059cbb14610c85578063ca63b5b814610ceb578063d60fcb8914610d4357610274565b806370a082311161011557806370a0823114610a2d578063715018a614610a855780638456cb5914610a8f57806386036bb414610a995780638da5cb5b14610add578063947a316814610b2757610274565b80634be2c7ba146108e05780635be7fde81461097d5780635c975abb1461099b57806366188463146109bd57806366a92cda14610a2357610274565b8063236e02e0116101ea5780633c4b303d116101ae5780633c4b303d146107e45780633d7e82c9146108025780633f4ba83a1461082057806342966c681461082a57806342a7508314610858578063462a520f146108bc57610274565b8063236e02e01461064257806323b872dd146106ba5780632405e3c614610740578063313ce5671461075e5780633be1e9521461078257610274565b8063158ef93e1161023c578063158ef93e146104775780631673836a1461049957806317a950ac146104f157806318160ddd146105495780631e658e36146105675780631f772a34146105bf57610274565b806302d6f7301461027957806305d2035b146102f657806306fdde0314610318578063095ea7b31461039b5780630b67f7f114610401575b600080fd5b6102c56004803603604081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fdb565b604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390f35b6102fe611091565b604051808215151515815260200191505060405180910390f35b6103206110a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610360578082015181840152602081019050610345565b50505050905090810190601f16801561038d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e7600480360360408110156103b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110e1565b604051808215151515815260200191505060405180910390f35b6104756004803603608081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190803567ffffffffffffffff1690602001909291905050506111d3565b005b61047f611984565b604051808215151515815260200191505060405180910390f35b6104db600480360360208110156104af57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611997565b6040518082815260200191505060405180910390f35b6105336004803603602081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e0565b6040518082815260200191505060405180910390f35b6105516119f2565b6040518082815260200191505060405180910390f35b6105a96004803603602081101561057d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119fc565b6040518082815260200191505060405180910390f35b6105c7611a0f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106075780820151818401526020810190506105ec565b50505050905090810190601f1680156106345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106a46004803603604081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a48565b6040518082815260200191505060405180910390f35b610726600480360360608110156106d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b1f565b604051808215151515815260200191505060405180910390f35b610748611b4f565b6040518082815260200191505060405180910390f35b610766611b5d565b604051808260ff1660ff16815260200191505060405180910390f35b6107e26004803603606081101561079857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190505050611b66565b005b6107ec611b77565b6040518082815260200191505060405180910390f35b61080a611b7c565b6040518082815260200191505060405180910390f35b610828611b84565b005b6108566004803603602081101561084057600080fd5b8101908080359060200190929190505050611c40565b005b6108ba6004803603604081101561086e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c4d565b005b6108c4611d1e565b604051808260ff1660ff16815260200191505060405180910390f35b61094c600480360360608110156108f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d23565b604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390f35b610985611ddc565b6040518082815260200191505060405180910390f35b6109a3611dec565b604051808215151515815260200191505060405180910390f35b610a09600480360360408110156109d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dff565b604051808215151515815260200191505060405180910390f35b610a2b612090565b005b610a6f60048036036020811015610a4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061209b565b6040518082815260200191505060405180910390f35b610a8d61212f565b005b610a97612232565b005b610adb60048036036020811015610aaf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122ef565b005b610ae56122fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2f612322565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b6f578082015181840152602081019050610b54565b50505050905090810190601f168015610b9c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610bb261235b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bf2578082015181840152602081019050610bd7565b50505050905090810190601f168015610c1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c6f60048036036020811015610c4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612398565b6040518082815260200191505060405180910390f35b610cd160048036036040811015610c9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061246d565b604051808215151515815260200191505060405180910390f35b610d2d60048036036020811015610d0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061249b565b6040518082815260200191505060405180910390f35b610da360048036036060811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803567ffffffffffffffff169060200190929190505050612535565b005b610df160048036036040811015610dbb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061282d565b604051808215151515815260200191505060405180910390f35b610e6d60048036036040811015610e2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a29565b6040518082815260200191505060405180910390f35b610ec560048036036020811015610e9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ac6565b6040518082815260200191505060405180910390f35b610f3d60048036036040811015610ef157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b0f565b6040518082815260200191505060405180910390f35b610f9560048036036020811015610f6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b96565b005b610fd960048036036020811015610fad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bfc565b005b60008060008090505b6001840181101561105f5760046000611007878667ffffffffffffffff16612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff16141561105257600080819150809050925092505061108a565b8080600101915050610fe4565b5060056000611078868567ffffffffffffffff16612ccb565b81526020019081526020016000205490505b9250929050565b600360159054906101000a900460ff1681565b60606040518060400160405280600881526020017f50756265436f696e000000000000000000000000000000000000000000000000815250905090565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561120d57600080fd5b8167ffffffffffffffff168167ffffffffffffffff1610611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806146d4602c913960400191505060405180910390fd5b600061129085338567ffffffffffffffff16612d0e565b905060006008600083815260200190815260200160002054905060008111611320576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8085106116e657600860008381526020019081526020016000206000905560006007600084815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060006113828833600067ffffffffffffffff16612d0e565b90505b8567ffffffffffffffff166007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461140a5761140388336007600085815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16612d0e565b9050611385565b60008267ffffffffffffffff16141561144c576007600082815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055611487565b816007600083815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b428567ffffffffffffffff1611611613576114e9836000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061157d83600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e846040518082815260200191505060405180910390a26116df565b600061162a89338867ffffffffffffffff16612d0e565b9050611652846008600084815260200190815260200160002054612db390919063ffffffff16565b60086000838152602001908152602001600020819055506116738987612de4565b8873ffffffffffffffffffffffffffffffffffffffff167fa3a64ccd852668b52d8ce6fee989c8992dfdb762e92f0fa33557497afae8a3578786604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a2505b505061197c565b61170c856008600085815260200190815260200160002054612dcd90919063ffffffff16565b6008600084815260200190815260200160002081905550428367ffffffffffffffff16116118af57611785856000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061181985600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e866040518082815260200191505060405180910390a261197b565b60006118c687338667ffffffffffffffff16612d0e565b90506118ee866008600084815260200190815260200160002054612db390919063ffffffff16565b600860008381526020019081526020016000208190555061190f8785612de4565b8673ffffffffffffffffffffffffffffffffffffffff167fa3a64ccd852668b52d8ce6fee989c8992dfdb762e92f0fa33557497afae8a3578588604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a2505b5b505050505050565b600e60149054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006119eb8261300a565b9050919050565b6000600154905090565b6000611a083383613052565b9050919050565b6040518060400160405280600481526020017f505542450000000000000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b611b178383613052565b905092915050565b6000600360149054906101000a900460ff1615611b3b57600080fd5b611b468484846130ca565b90509392505050565b6008600a0a633b9aca000281565b60006008905090565b611b723384848461347e565b505050565b600881565b6008600a0a81565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bde57600080fd5b600360149054906101000a900460ff16611bf757600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b611c4a3382613760565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b611d1a8282613911565b5050565b600881565b60008060008090505b60018401811015611da85760076000611d5088888767ffffffffffffffff16612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff161415611d9b576000808191508090509250925050611dd4565b8080600101915050611d2c565b5060086000611dc287878667ffffffffffffffff16612d0e565b81526020019081526020016000205490505b935093915050565b6000611de733613cf1565b905090565b600360149054906101000a900460ff1681565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115611f10576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fa4565b611f238382612dcd90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b61209933613d66565b565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121268461300a565b01019050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461228c57600080fd5b600360149054906101000a900460ff16156122a657600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6122f93382613911565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600881526020017f50756265436f696e00000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600481526020017f5055424500000000000000000000000000000000000000000000000000000000815250905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b61246682613cf1565b9050919050565b6000600360149054906101000a900460ff161561248957600080fd5b6124938383614143565b905092915050565b600080600460006124ad856000612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff161461252f57818060010192505060046000612505858467ffffffffffffffff16612ccb565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506124d3565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156125ba57600080fd5b428167ffffffffffffffff16116125d057600080fd5b612621826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061267a84338467ffffffffffffffff16612d0e565b90506126a2836008600084815260200190815260200160002054612db390919063ffffffff16565b600860008381526020019081526020016000208190555061270b83600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127588483612de4565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a250505050565b60006128be82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060076000612a3c86866000612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff1614612abf57818060010192505060076000612a9586868567ffffffffffffffff16612d0e565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050612a62565b5092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf057600080fd5b612bf98161415a565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b612cc881613d66565b50565b60007f185225121209151420151015814131800000000000000000000000000000000060001b905068010000000000000000830281179050818117905092915050565b6000807f185225121209151420151015814131800000000000000000000000000000000060001b905060007f911777666000000000000000000000000000000000000000000000000000000060001b905068010000000000000000860282179150838217915084811790508181604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120925050509392505050565b6000818301905082811015612dc457fe5b80905092915050565b600082821115612dd957fe5b818303905092915050565b428167ffffffffffffffff1611612dfa57600080fd5b6000612e1183338467ffffffffffffffff16612d0e565b90506000612e2b8433600067ffffffffffffffff16612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff161415612eae57836007600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050613006565b6000612ec586338467ffffffffffffffff16612d0e565b905060005b60008367ffffffffffffffff1614158015612ef857508267ffffffffffffffff168667ffffffffffffffff16115b15612f53578267ffffffffffffffff1690508193506007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff169250612f4c87338567ffffffffffffffff16612d0e565b9150612eca565b8267ffffffffffffffff168667ffffffffffffffff161415612f79575050505050613006565b60008367ffffffffffffffff1614612fc657826007600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856007600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600061306385856000611d23565b8167ffffffffffffffff16915080925081935050505b6000821415801561308957508142115b156130c257613097846122ef565b80830192506130a885856000611d23565b8167ffffffffffffffff1691508092508193505050613079565b505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310557600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561315057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156131d957600080fd5b61322a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132bd826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061338e82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b857600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561350357600080fd5b613554826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006135ac848367ffffffffffffffff16612ccb565b90506135d4836005600084815260200190815260200160002054612db390919063ffffffff16565b600560008381526020019081526020016000208190555061363d83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368a8483614254565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051808367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019250505060405180910390a25050505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156137ab57600080fd5b6137fc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061385381600154612dcd90919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600061391f83836000612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff164267ffffffffffffffff1611613a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5072656d61747572652072656c6561736520617474656d70740000000000000081525060200191505060405180910390fd5b6000613a6e85858467ffffffffffffffff16612d0e565b905060006007600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600860008481526020019081526020016000205490506008600084815260200190815260200160002060009055613b1c816000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb081600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff161415613c35576007600086815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055613c9a565b816007600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506007600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b8673ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040518082815260200191505060405180910390a250505050505050565b6000806000613d01846000610fdb565b8167ffffffffffffffff16915080925081935050505b60008214158015613d2757508142115b15613d5f57613d3584613d66565b8083019250613d45846000610fdb565b8167ffffffffffffffff1691508092508193505050613d17565b5050919050565b6000613d73826000612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff161415613e22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f467265657a696e67206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff164267ffffffffffffffff1611613eab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5072656d61747572652072656c6561736520617474656d70740000000000000081525060200191505060405180910390fd5b6000613ec1848367ffffffffffffffff16612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600560008481526020019081526020016000205490506005600084815260200190815260200160002060009055613f6f816000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061400381600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff161415614088576004600086815260200190815260200160002060006101000a81549067ffffffffffffffff02191690556140ed565b816004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506004600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b8573ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040518082815260200191505060405180910390a2505050505050565b6000614150338484614476565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561419457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b428167ffffffffffffffff161161426a57600080fd5b6000614280838367ffffffffffffffff16612ccb565b9050600061429984600067ffffffffffffffff16612ccb565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff16141561431c57836004600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050614472565b6000614332868367ffffffffffffffff16612ccb565b905060005b60008367ffffffffffffffff161415801561436557508267ffffffffffffffff168667ffffffffffffffff16115b156143bf578267ffffffffffffffff1690508193506004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff1692506143b8878467ffffffffffffffff16612ccb565b9150614337565b8267ffffffffffffffff168667ffffffffffffffff1614156143e5575050505050614472565b60008367ffffffffffffffff161461443257826004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856004600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156144b057600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156144fb57600080fd5b61454c816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dcd90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145df816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008083141561469e57600090506146b9565b8183029050818382816146ad57fe5b04146146b557fe5b8090505b92915050565b60008183816146ca57fe5b0490509291505056fe417474656d707420746f206d6f76652074686520667265657a696e6720696e746f2074686520667574757265a265627a7a723158208c77b6415fe78770ebbc54e1b5ea0259c5263928a1418c8cba7696f9c81bafa464736f6c634300050c0032

Deployed Bytecode Sourcemap

31727:2775:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31727:2775:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14684:362;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14684:362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10001:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32075:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;32075:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5641:192;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5641:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18823:2277;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;18823:2277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31981:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13418:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13418:148:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12684:128;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12684:128:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2129:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25642:144;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25642:144:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31591:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31591:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26097:178;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26097:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32373:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32373:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31642:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32271:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16188:129;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16188:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31364:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31463:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31237:95;;;:::i;:::-;;29886:75;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29886:75:0;;;;;;;;;;;;;;;;;:::i;:::-;;22908:165;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22908:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31410:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15388:426;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15388:426:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24362:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30616:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7569:440;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7569:440:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21180:73;;;:::i;:::-;;12252:183;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12252:183:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8857:114;;;:::i;:::-;;31057:93;;;:::i;:::-;;22568:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22568:131:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;8239:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31538:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31538:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32171:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;32171:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24702:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24702:134:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32569:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32569:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13678:249;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13678:249:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17645:658;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17645:658:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6791:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6791:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14105:313;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14105:313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13045:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13045:130:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6160:162;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6160:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9139:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9139:105:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21396;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21396:105:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14684:362;14754:15;14771:13;14802:6;14811:1;14802:10;;14797:187;14827:1;14818:6;:10;14814:1;:14;14797:187;;;14861:6;:30;14868:22;14874:5;14881:8;14868:22;;:5;:22::i;:::-;14861:30;;;;;;;;;;;;;;;;;;;;;14850:41;;14922:1;14910:8;:13;;;14906:67;;;14952:1;14955;14944:13;;;;;;;;;;;;;14906:67;14830:3;;;;;;;14797:187;;;;15005:9;:33;15015:22;15021:5;15028:8;15015:22;;:5;:22::i;:::-;15005:33;;;;;;;;;;;;14994:44;;14684:362;;;;;;:::o;10001:35::-;;;;;;;;;;;;;:::o;32075:88::-;32112:13;32145:10;;;;;;;;;;;;;;;;;32138:17;;32075:88;:::o;5641:192::-;5708:4;5753:6;5721:7;:19;5729:10;5721:19;;;;;;;;;;;;;;;:29;5741:8;5721:29;;;;;;;;;;;;;;;:38;;;;5792:8;5771:38;;5780:10;5771:38;;;5802:6;5771:38;;;;;;;;;;;;;;;;;;5823:4;5816:11;;5641:192;;;;:::o;18823:2277::-;18950:1;18935:17;;:3;:17;;;;18927:26;;;;;;19051:6;19039:18;;:9;:18;;;19031:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19119:18;19140:31;19147:3;19152:10;19164:6;19140:31;;:6;:31::i;:::-;19119:52;;19182:11;19196:18;:30;19215:10;19196:30;;;;;;;;;;;;19182:44;;19254:1;19245:6;:10;19237:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19306:6;19295:7;:17;19291:1802;;19336:18;:30;19355:10;19336:30;;;;;;;;;;;19329:37;;;19383:11;19397:15;:27;19413:10;19397:27;;;;;;;;;;;;;;;;;;;;;19383:41;;19439:14;19456:34;19463:3;19468:10;19487:1;19456:34;;:6;:34::i;:::-;19439:51;;19505:134;19539:6;19512:33;;:15;:23;19528:6;19512:23;;;;;;;;;;;;;;;;;;;;;:33;;;19505:134;;19575:48;19582:3;19587:10;19599:15;:23;19615:6;19599:23;;;;;;;;;;;;;;;;;;;;;19575:48;;:6;:48::i;:::-;19566:57;;19505:134;;;19667:1;19659:4;:9;;;19655:164;;;19696:15;:23;19712:6;19696:23;;;;;;;;;;;;19689:30;;;;;;;;;;;19655:164;;;19799:4;19773:15;:23;19789:6;19773:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;19655:164;19852:15;19839:9;:28;;;19835:555;;19904:25;19922:6;19904:8;:13;19913:3;19904:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;19888:8;:13;19897:3;19888:13;;;;;;;;;;;;;;;:41;;;;19980;20014:6;19980:24;:29;20005:3;19980:29;;;;;;;;;;;;;;;;:33;;:41;;;;:::i;:::-;19948:24;:29;19973:3;19948:29;;;;;;;;;;;;;;;:73;;;;20056:3;20047:21;;;20061:6;20047:21;;;;;;;;;;;;;;;;;;19835:555;;;20122:14;20139:34;20146:3;20151:10;20163:9;20139:34;;:6;:34::i;:::-;20122:51;;20221:38;20252:6;20221:18;:26;20240:6;20221:26;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;20192:18;:26;20211:6;20192:26;;;;;;;;;;;:67;;;;20280:31;20296:3;20301:9;20280:15;:31::i;:::-;20351:3;20337:37;;;20356:9;20367:6;20337:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;19835:555;;19291:1802;;;;;20464:43;20499:7;20464:18;:30;20483:10;20464:30;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;20431:18;:30;20450:10;20431:30;;;;;;;;;;;:76;;;;20539:15;20526:9;:28;;;20522:560;;20591:26;20609:7;20591:8;:13;20600:3;20591:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;20575:8;:13;20584:3;20575:13;;;;;;;;;;;;;;;:42;;;;20668;20702:7;20668:24;:29;20693:3;20668:29;;;;;;;;;;;;;;;;:33;;:42;;;;:::i;:::-;20636:24;:29;20661:3;20636:29;;;;;;;;;;;;;;;:74;;;;20745:3;20736:22;;;20750:7;20736:22;;;;;;;;;;;;;;;;;;20522:560;;;20812:14;20829:34;20836:3;20841:10;20853:9;20829:34;;:6;:34::i;:::-;20812:51;;20911:39;20942:7;20911:18;:26;20930:6;20911:26;;;;;;;;;;;;:30;;:39;;;;:::i;:::-;20882:18;:26;20901:6;20882:26;;;;;;;;;;;:68;;;;20971:31;20987:3;20992:9;20971:15;:31::i;:::-;21042:3;21028:38;;;21047:9;21058:7;21028:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;20522:560;;19291:1802;18823:2277;;;;;;:::o;31981:31::-;;;;;;;;;;;;;:::o;13418:148::-;13491:15;13526:24;:32;13551:6;13526:32;;;;;;;;;;;;;;;;13519:39;;13418:148;;;:::o;12684:128::-;12746:15;12781:23;12797:6;12781:15;:23::i;:::-;12774:30;;12684:128;;;:::o;2129:85::-;2173:7;2196:12;;2189:19;;2129:85;:::o;25642:144::-;25704:11;25737:41;25758:10;25770:7;25737:20;:41::i;:::-;25728:50;;25642:144;;;:::o;31591:44::-;;;;;;;;;;;;;;;;;;;:::o;26097:178::-;26198:11;11960:5;;;;;;;;;;;11946:19;;:10;:19;;;11938:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26231:36;26252:5;26259:7;26231:20;:36::i;:::-;26222:45;;26097:178;;;;:::o;32373:188::-;32455:13;32490:6;;;;;;;;;;;32489:7;32481:16;;;;;;32515:38;32534:5;32541:3;32546:6;32515:18;:38::i;:::-;32508:45;;32373:188;;;;;:::o;31642:75::-;31402:1;31511:2;:20;31680:10;:37;31642:75;:::o;32271:94::-;32312:5;31455:1;32330:27;;32271:94;:::o;16188:129::-;16266:43;16276:10;16288:3;16293:7;16302:6;16266:9;:43::i;:::-;16188:129;;;:::o;31364:39::-;31402:1;31364:39;:::o;31463:68::-;31402:1;31511:2;:20;31463:68;:::o;31237:95::-;8742:5;;;;;;;;;;;8728:19;;:10;:19;;;8720:28;;;;;;30952:6;;;;;;;;;;;30944:15;;;;;;31300:5;31291:6;;:14;;;;;;;;;;;;;;;;;;31317:9;;;;;;;;;;31237:95::o;29886:75::-;29930:25;29936:10;29948:6;29930:5;:25::i;:::-;29886:75;:::o;22908:165::-;11960:5;;;;;;;;;;;11946:19;;:10;:19;;;11938:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23020;23050:5;23057:7;23020:29;:45::i;:::-;22908:165;;:::o;31410:46::-;31455:1;31410:46;:::o;15388:426::-;15484:15;15501:13;15532:6;15541:1;15532:10;;15527:206;15557:1;15548:6;:10;15544:1;:14;15527:206;;;15591:15;:49;15607:32;15614:5;15621:7;15630:8;15607:32;;:6;:32::i;:::-;15591:49;;;;;;;;;;;;;;;;;;;;;15580:60;;15671:1;15659:8;:13;;;15655:67;;;15701:1;15704;15693:13;;;;;;;;;;;;;15655:67;15560:3;;;;;;;15527:206;;;;15754:18;:52;15773:32;15780:5;15787:7;15796:8;15773:32;;:6;:32::i;:::-;15754:52;;;;;;;;;;;;15743:63;;15388:426;;;;;;;:::o;24362:102::-;24400:11;24433:23;24445:10;24433:11;:23::i;:::-;24424:32;;24362:102;:::o;30616:26::-;;;;;;;;;;;;;:::o;7569:440::-;7677:4;7693:13;7709:7;:19;7717:10;7709:19;;;;;;;;;;;;;;;:29;7729:8;7709:29;;;;;;;;;;;;;;;;7693:45;;7768:8;7749:16;:27;7745:168;;;7819:1;7787:7;:19;7795:10;7787:19;;;;;;;;;;;;;;;:29;7807:8;7787:29;;;;;;;;;;;;;;;:33;;;;7745:168;;;7875:30;7888:16;7875:8;:12;;:30;;;;:::i;:::-;7843:7;:19;7851:10;7843:19;;;;;;;;;;;;;;;:29;7863:8;7843:29;;;;;;;;;;;;;;;:62;;;;7745:168;7945:8;7924:61;;7933:10;7924:61;;;7955:7;:19;7963:10;7955:19;;;;;;;;;;;;;;;:29;7975:8;7955:29;;;;;;;;;;;;;;;;7924:61;;;;;;;;;;;;;;;;;;7999:4;7992:11;;;7569:440;;;;:::o;21180:73::-;21221:24;21234:10;21221:12;:24::i;:::-;21180:73::o;12252:183::-;12308:15;12395:24;:32;12420:6;12395:32;;;;;;;;;;;;;;;;12369:15;:23;12385:6;12369:23;;;;;;;;;;;;;;;;12343;12359:6;12343:15;:23::i;:::-;:49;:84;12336:91;;12252:183;;;:::o;8857:114::-;8742:5;;;;;;;;;;;8728:19;;:10;:19;;;8720:28;;;;;;8934:5;;;;;;;;;;;8915:25;;;;;;;;;;;;8963:1;8947:5;;:18;;;;;;;;;;;;;;;;;;8857:114::o;31057:93::-;8742:5;;;;;;;;;;;8728:19;;:10;:19;;;8720:28;;;;;;30792:6;;;;;;;;;;;30791:7;30783:16;;;;;;31121:4;31112:6;;:13;;;;;;;;;;;;;;;;;;31137:7;;;;;;;;;;31057:93::o;22568:131::-;22641:50;22671:10;22683:7;22641:29;:50::i;:::-;22568:131;:::o;8239:20::-;;;;;;;;;;;;;:::o;31538:46::-;;;;;;;;;;;;;;;;;;;:::o;32171:92::-;32210:13;32243:12;;;;;;;;;;;;;;;;;32236:19;;32171:92;:::o;24702:134::-;24777:11;11960:5;;;;;;;;;;;11946:19;;:10;:19;;;11938:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24810:18;24822:5;24810:11;:18::i;:::-;24801:27;;24702:134;;;:::o;32569:158::-;32632:13;32667:6;;;;;;;;;;;32666:7;32658:16;;;;;;32692:27;32707:3;32712:6;32692:14;:27::i;:::-;32685:34;;32569:158;;;;:::o;13678:249::-;13737:10;13760:14;13777:6;:23;13784:15;13790:5;13797:1;13784:5;:15::i;:::-;13777:23;;;;;;;;;;;;;;;;;;;;;13760:40;;13811:109;13829:1;13818:7;:12;;;13811:109;;13847:7;;;;;;;13879:6;:29;13886:21;13892:5;13899:7;13886:21;;:5;:21::i;:::-;13879:29;;;;;;;;;;;;;;;;;;;;;13869:39;;13811:109;;;13678:249;;;;:::o;17645:658::-;17755:1;17740:17;;:3;:17;;;;17732:26;;;;;;17788:8;:20;17797:10;17788:20;;;;;;;;;;;;;;;;17777:7;:31;;17769:40;;;;;;17837:15;17828:6;:24;;;17820:33;;;;;;17889;17914:7;17889:8;:20;17898:10;17889:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;17866:8;:20;17875:10;17866:20;;;;;;;;;;;;;;;:56;;;;17935:18;17956:31;17963:3;17968:10;17980:6;17956:31;;:6;:31::i;:::-;17935:52;;18031:43;18066:7;18031:18;:30;18050:10;18031:30;;;;;;;;;;;;:34;;:43;;;;:::i;:::-;17998:18;:30;18017:10;17998:30;;;;;;;;;;;:76;;;;18117:42;18151:7;18117:24;:29;18142:3;18117:29;;;;;;;;;;;;;;;;:33;;:42;;;;:::i;:::-;18085:24;:29;18110:3;18085:29;;;;;;;;;;;;;;;:74;;;;18172:28;18188:3;18193:6;18172:15;:28::i;:::-;18237:3;18216:34;;18225:10;18216:34;;;18242:7;18216:34;;;;;;;;;;;;;;;;;;18274:3;18266:29;;;18279:6;18287:7;18266:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;17645:658;;;;:::o;6791:304::-;6894:4;6951:46;6985:11;6951:7;:19;6959:10;6951:19;;;;;;;;;;;;;;;:29;6971:8;6951:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;6910:7;:19;6918:10;6910:19;;;;;;;;;;;;;;;:29;6930:8;6910:29;;;;;;;;;;;;;;;:88;;;;7031:8;7010:61;;7019:10;7010:61;;;7041:7;:19;7049:10;7041:19;;;;;;;;;;;;;;;:29;7061:8;7041:29;;;;;;;;;;;;;;;;7010:61;;;;;;;;;;;;;;;;;;7085:4;7078:11;;6791:304;;;;:::o;14105:313::-;14190:10;14213:14;14230:15;:42;14246:25;14253:5;14260:7;14269:1;14246:6;:25::i;:::-;14230:42;;;;;;;;;;;;;;;;;;;;;14213:59;;14283:128;14301:1;14290:7;:12;;;14283:128;;14319:7;;;;;;;14351:15;:48;14367:31;14374:5;14381:7;14390;14367:31;;:6;:31::i;:::-;14351:48;;;;;;;;;;;;;;;;;;;;;14341:58;;14283:128;;;14105:313;;;;;:::o;13045:130::-;13109:15;13144;:23;13160:6;13144:23;;;;;;;;;;;;;;;;13137:30;;13045:130;;;:::o;6160:162::-;6265:7;6291;:15;6299:6;6291:15;;;;;;;;;;;;;;;:25;6307:8;6291:25;;;;;;;;;;;;;;;;6284:32;;6160:162;;;;:::o;9139:105::-;8742:5;;;;;;;;;;;8728:19;;:10;:19;;;8720:28;;;;;;9209:29;9228:9;9209:18;:29::i;:::-;9139:105;:::o;21396:::-;11960:5;;;;;;;;;;;11946:19;;:10;:19;;;11938:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21474:19;21487:5;21474:12;:19::i;:::-;21396:105;:::o;27013:320::-;27081:14;27117:66;27108:75;;;;27250:19;27243:5;27239:31;27231:6;27228:43;27218:53;;27306:8;27298:6;27295:20;27285:30;;27203:123;;;;:::o;27341:526::-;27427:14;27454:12;27469:66;27454:81;;;;27546:12;27561:66;27546:81;;;;27691:19;27683:6;27679:32;27673:4;27670:42;27662:50;;27743:8;27737:4;27734:18;27726:26;;27783:6;27777:4;27774:16;27766:24;;27847:4;27853;27830:28;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;27830:28:0;;;27820:39;;;;;;27811:48;;27341:526;;;;;;;:::o;1696:127::-;1754:9;1780:1;1776;:5;1772:9;;1800:1;1795;:6;;1788:14;;;;1816:1;1809:8;;1696:127;;;;:::o;1516:113::-;1574:7;1602:1;1597;:6;;1590:14;;;;1622:1;1618;:5;1611:12;;1516:113;;;;:::o;28672:895::-;28762:15;28753:6;:24;;;28745:33;;;;;;28789:11;28803:31;28810:3;28815:10;28827:6;28803:31;;:6;:31::i;:::-;28789:45;;28845:17;28865:34;28872:3;28877:10;28896:1;28865:34;;:6;:34::i;:::-;28845:54;;28910:11;28924:15;:26;28940:9;28924:26;;;;;;;;;;;;;;;;;;;;;28910:40;;28975:1;28967:4;:9;;;28963:98;;;29022:6;28993:15;:26;29009:9;28993:26;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;29043:7;;;;;28963:98;29073:15;29091:29;29098:3;29103:10;29115:4;29091:29;;:6;:29::i;:::-;29073:47;;29131:11;29155:211;29170:1;29162:4;:9;;;;:26;;;;;29184:4;29175:13;;:6;:13;;;29162:26;29155:211;;;29214:4;29205:13;;;;29245:7;29233:19;;29276:15;:24;29292:7;29276:24;;;;;;;;;;;;;;;;;;;;;29269:31;;29325:29;29332:3;29337:10;29349:4;29325:29;;:6;:29::i;:::-;29315:39;;29155:211;;;29392:4;29382:14;;:6;:14;;;29378:53;;;29413:7;;;;;;;29378:53;29455:1;29447:4;:9;;;29443:69;;29496:4;29473:15;:20;29489:3;29473:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;29443:69;29553:6;29524:15;:26;29540:9;29524:26;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;28672:895;;;;;;;;:::o;2718:101::-;2774:7;2797:8;:16;2806:6;2797:16;;;;;;;;;;;;;;;;2790:23;;2718:101;;;:::o;26556:449::-;26636:11;26660:12;26683;26727:39;26748:5;26755:7;26764:1;26727:20;:39::i;:::-;26706:60;;;;;;;;;;;;;26777:221;26795:1;26784:7;:12;;:41;;;;;26818:7;26800:15;:25;26784:41;26777:221;;;26842:37;26871:7;26842:28;:37::i;:::-;26904:7;26894:17;;;;26947:39;26968:5;26975:7;26984:1;26947:20;:39::i;:::-;26926:60;;;;;;;;;;;;;26777:221;;;26556:449;;;;;;:::o;4519:487::-;4631:4;4670:1;4655:17;;:3;:17;;;;4647:26;;;;;;4698:8;:15;4707:5;4698:15;;;;;;;;;;;;;;;;4688:6;:25;;4680:34;;;;;;4739:7;:14;4747:5;4739:14;;;;;;;;;;;;;;;:26;4754:10;4739:26;;;;;;;;;;;;;;;;4729:6;:36;;4721:45;;;;;;4793:27;4813:6;4793:8;:15;4802:5;4793:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;4775:8;:15;4784:5;4775:15;;;;;;;;;;;;;;;:45;;;;4843:25;4861:6;4843:8;:13;4852:3;4843:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;4827:8;:13;4836:3;4827:13;;;;;;;;;;;;;;;:41;;;;4904:38;4935:6;4904:7;:14;4912:5;4904:14;;;;;;;;;;;;;;;:26;4919:10;4904:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;4875:7;:14;4883:5;4875:14;;;;;;;;;;;;;;;:26;4890:10;4875:26;;;;;;;;;;;;;;;:67;;;;4970:3;4954:28;;4963:5;4954:28;;;4975:6;4954:28;;;;;;;;;;;;;;;;;;4996:4;4989:11;;4519:487;;;;;:::o;16691:545::-;16810:1;16795:17;;:3;:17;;;;16787:26;;;;;;16843:8;:15;16852:5;16843:15;;;;;;;;;;;;;;;;16832:7;:26;;16824:35;;;;;;16890:28;16910:7;16890:8;:15;16899:5;16890:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;16872:8;:15;16881:5;16872:15;;;;;;;;;;;;;;;:46;;;;16931:18;16952;16958:3;16963:6;16952:18;;:5;:18::i;:::-;16931:39;;17005:34;17031:7;17005:9;:21;17015:10;17005:21;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;16981:9;:21;16991:10;16981:21;;;;;;;;;;;:58;;;;17073:33;17098:7;17073:15;:20;17089:3;17073:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;17050:15;:20;17066:3;17050:20;;;;;;;;;;;;;;;:56;;;;17119:19;17126:3;17131:6;17119;:19::i;:::-;17170:3;17154:29;;17163:5;17154:29;;;17175:7;17154:29;;;;;;;;;;;;;;;;;;17207:3;17199:29;;;17212:6;17220:7;17199:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;16691:545;;;;;:::o;29967:447::-;30046:8;:14;30055:4;30046:14;;;;;;;;;;;;;;;;30036:6;:24;;30028:33;;;;;;30260:26;30279:6;30260:8;:14;30269:4;30260:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;30243:8;:14;30252:4;30243:14;;;;;;;;;;;;;;;:43;;;;30308:24;30325:6;30308:12;;:16;;:24;;;;:::i;:::-;30293:12;:39;;;;30349:4;30344:18;;;30355:6;30344:18;;;;;;;;;;;;;;;;;;30397:1;30374:34;;30383:4;30374:34;;;30401:6;30374:34;;;;;;;;;;;;;;;;;;29967:447;;:::o;23272:923::-;23363:15;23381:25;23388:5;23395:7;23404:1;23381:6;:25::i;:::-;23363:43;;23417:11;23431:15;:24;23447:7;23431:24;;;;;;;;;;;;;;;;;;;;;23417:38;;23482:1;23474:4;:9;;;;23466:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23551:4;23525:30;;23532:15;23525:30;;;23517:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23596:18;23617:28;23624:5;23631:7;23640:4;23617:28;;:6;:28::i;:::-;23596:49;;23658:11;23672:15;:27;23688:10;23672:27;;;;;;;;;;;;;;;;;;;;;23658:41;;23712:11;23726:18;:30;23745:10;23726:30;;;;;;;;;;;;23712:44;;23774:18;:30;23793:10;23774:30;;;;;;;;;;;23767:37;;;23835:27;23855:6;23835:8;:15;23844:5;23835:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;23817:8;:15;23826:5;23817:15;;;;;;;;;;;;;;;:45;;;;23907:43;23943:6;23907:24;:31;23932:5;23907:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;23873:24;:31;23898:5;23873:31;;;;;;;;;;;;;;;:77;;;;23975:1;23967:4;:9;;;23963:186;;;24000:15;:24;24016:7;24000:24;;;;;;;;;;;;23993:31;;;;;;;;;;;23963:186;;;24084:4;24057:15;:24;24073:7;24057:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;24110:15;:27;24126:10;24110:27;;;;;;;;;;;;24103:34;;;;;;;;;;;23963:186;24173:5;24164:23;;;24180:6;24164:23;;;;;;;;;;;;;;;;;;23272:923;;;;;;;:::o;25024:369::-;25078:11;25102:12;25125;25169:21;25181:5;25188:1;25169:11;:21::i;:::-;25148:42;;;;;;;;;;;;;25201:185;25219:1;25208:7;:12;;:41;;;;;25242:7;25224:15;:25;25208:41;25201:185;;;25266:19;25279:5;25266:12;:19::i;:::-;25310:7;25300:17;;;;25353:21;25365:5;25372:1;25353:11;:21::i;:::-;25332:42;;;;;;;;;;;;;25201:185;;;25024:369;;;;;:::o;21634:788::-;21691:15;21709;21715:5;21722:1;21709:5;:15::i;:::-;21691:33;;21735:11;21749:6;:15;21756:7;21749:15;;;;;;;;;;;;;;;;;;;;;21735:29;;21791:1;21783:4;:9;;;;21775:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21860:4;21834:30;;21841:15;21834:30;;;21826:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21905:18;21926;21932:5;21939:4;21926:18;;:5;:18::i;:::-;21905:39;;21957:11;21971:6;:18;21978:10;21971:18;;;;;;;;;;;;;;;;;;;;;21957:32;;22002:11;22016:9;:21;22026:10;22016:21;;;;;;;;;;;;22002:35;;22055:9;:21;22065:10;22055:21;;;;;;;;;;;22048:28;;;22107:27;22127:6;22107:8;:15;22116:5;22107:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;22089:8;:15;22098:5;22089:15;;;;;;;;;;;;;;;:45;;;;22170:34;22197:6;22170:15;:22;22186:5;22170:22;;;;;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;22145:15;:22;22161:5;22145:22;;;;;;;;;;;;;;;:59;;;;22229:1;22221:4;:9;;;22217:159;;;22254:6;:15;22261:7;22254:15;;;;;;;;;;;;22247:22;;;;;;;;;;;22217:159;;;22320:4;22302:6;:15;22309:7;22302:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;22346:6;:18;22353:10;22346:18;;;;;;;;;;;;22339:25;;;;;;;;;;;22217:159;22400:5;22391:23;;;22407:6;22391:23;;;;;;;;;;;;;;;;;;21634:788;;;;;;:::o;2375:134::-;2438:4;2451:34;2461:10;2473:3;2478:6;2451:9;:34::i;:::-;2499:4;2492:11;;2375:134;;;;:::o;9385:175::-;9477:1;9456:23;;:9;:23;;;;9448:32;;;;;;9520:9;9492:38;;9513:5;;;;;;;;;;;9492:38;;;;;;;;;;;;9545:9;9537:5;;:17;;;;;;;;;;;;;;;;;;9385:175;:::o;27875:789::-;27956:15;27947:6;:24;;;27939:33;;;;;;27983:11;27997:18;28003:3;28008:6;27997:18;;:5;:18::i;:::-;27983:32;;28026:17;28046:21;28052:3;28064:1;28046:21;;:5;:21::i;:::-;28026:41;;28078:11;28092:6;:17;28099:9;28092:17;;;;;;;;;;;;;;;;;;;;;28078:31;;28134:1;28126:4;:9;;;28122:89;;;28172:6;28152;:17;28159:9;28152:17;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;28193:7;;;;;28122:89;28223:15;28241:16;28247:3;28252:4;28241:16;;:5;:16::i;:::-;28223:34;;28268:11;28292:189;28307:1;28299:4;:9;;;;:26;;;;;28321:4;28312:13;;:6;:13;;;28299:26;28292:189;;;28351:4;28342:13;;;;28382:7;28370:19;;28413:6;:15;28420:7;28413:15;;;;;;;;;;;;;;;;;;;;;28406:22;;28453:16;28459:3;28464:4;28453:16;;:5;:16::i;:::-;28443:26;;28292:189;;;28507:4;28497:14;;:6;:14;;;28493:53;;;28528:7;;;;;;;28493:53;28570:1;28562:4;:9;;;28558:60;;28602:4;28588:6;:11;28595:3;28588:11;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;28558:60;28650:6;28630;:17;28637:9;28630:17;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;27875:789;;;;;;;;:::o;3030:306::-;3134:1;3119:17;;:3;:17;;;;3111:26;;;;;;3164:8;:15;3173:5;3164:15;;;;;;;;;;;;;;;;3154:6;:25;;3146:34;;;;;;3211:27;3231:6;3211:8;:15;3220:5;3211:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;3193:8;:15;3202:5;3193:15;;;;;;;;;;;;;;;:45;;;;3263:25;3281:6;3263:8;:13;3272:3;3263:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;3247:8;:13;3256:3;3247:13;;;;;;;;;;;;;;;:41;;;;3318:3;3302:28;;3311:5;3302:28;;;3323:6;3302:28;;;;;;;;;;;;;;;;;;3030:306;;;:::o;651:384::-;709:9;944:1;939;:6;935:37;;;963:1;956:8;;;;935:37;988:1;984;:5;980:9;;1012:1;1007;1003;:5;;;;;;:10;996:18;;;;1028:1;1021:8;;651:384;;;;;:::o;1122:277::-;1180:7;1392:1;1388;:5;;;;;;1381:12;;1122:277;;;;:::o

Swarm Source

bzzr://8c77b6415fe78770ebbc54e1b5ea0259c5263928a1418c8cba7696f9c81bafa4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.