ETH Price: $2,816.11 (+4.51%)

Token

EB (EB)
 

Overview

Max Total Supply

1,000,000,000 EB

Holders

45

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
zemm.eth
Balance
221.620570397459209154 EB

Value
$0.00
0xc61288821b4722ce29249f0ba03b633f0be46a5a
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EB

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-22
*/

pragma solidity ^0.4.24;

// File: contracts\openzeppelin-solidity\contracts\ownership\Ownable.sol

/**
 * @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.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  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;
  }
}

// File: contracts\openzeppelin-solidity\contracts\lifecycle\Pausable.sol

/**
 * @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() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

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

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public 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);
}

// File: contracts\openzeppelin-solidity\contracts\math\SafeMath.sol

/**
 * @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;
  }
}

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\BasicToken.sol

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

  mapping(address => uint256) internal balances;

  uint256 internal 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) {
    require(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit 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];
  }

}

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\ERC20.sol

/**
 * @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
  );
}

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\StandardToken.sol

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * 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(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    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,
    uint256 _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,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 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;
  }

}

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\MintableToken.sol

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * 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
  )
    public
    hasMintPermission
    canMint
    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() public onlyOwner canMint returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

// File: contracts\openzeppelin-solidity\contracts\token\ERC20\BurnableToken.sol

/**
 * @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);
  }
}

// File: contracts\AccountLockableToken.sol

/**
 * @title Account Lockable Token
 */
contract AccountLockableToken is Ownable {
    mapping(address => bool) public lockStates;

    event LockAccount(address indexed lockAccount);
    event UnlockAccount(address indexed unlockAccount);

    /**
     * @dev Throws if called by locked account
     */
    modifier whenNotLocked() {
        require(!lockStates[msg.sender]);
        _;
    }

    /**
     * @dev Lock target account
     * @param _target Target account to lock
     */
    function lockAccount(address _target) public
        onlyOwner
        returns (bool)
    {
        require(_target != owner);
        require(!lockStates[_target]);

        lockStates[_target] = true;

        emit LockAccount(_target);

        return true;
    }

    /**
     * @dev Unlock target account
     * @param _target Target account to unlock
     */
    function unlockAccount(address _target) public
        onlyOwner
        returns (bool)
    {
        require(_target != owner);
        require(lockStates[_target]);

        lockStates[_target] = false;

        emit UnlockAccount(_target);

        return true;
    }
}

// File: contracts\WithdrawableToken.sol

/**
 * @title Withdrawable token
 * @dev Token that can be the withdrawal.
 */
contract WithdrawableToken is BasicToken, Ownable {
    using SafeMath for uint256;

    bool public withdrawingFinished = false;

    event Withdraw(address _from, address _to, uint256 _value);
    event WithdrawFinished();

    modifier canWithdraw() {
        require(!withdrawingFinished);
        _;
    }

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

    /**
     * @dev Withdraw the amount of tokens to onwer.
     * @param _from address The address which owner want to withdraw tokens form.
     * @param _value uint256 the amount of tokens to be transferred.
     */
    function withdraw(address _from, uint256 _value) public
        hasWithdrawPermission
        canWithdraw
        returns (bool)
    {
        require(_value <= balances[_from]);

        balances[_from] = balances[_from].sub(_value);
        balances[owner] = balances[owner].add(_value);

        emit Transfer(_from, owner, _value);
        emit Withdraw(_from, owner, _value);

        return true;
    }

    /**
     * @dev Withdraw the amount of tokens to another.
     * @param _from address The address which owner want to withdraw tokens from.
     * @param _to address The address which owner want to transfer to.
     * @param _value uint256 the amount of tokens to be transferred.
     */
    function withdrawFrom(address _from, address _to, uint256 _value) public
        hasWithdrawPermission
        canWithdraw
        returns (bool)
    {
        require(_value <= balances[_from]);
        require(_to != address(0));

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(_from, _to, _value);
        emit Withdraw(_from, _to, _value);

        return true;
    }

    /**
     * @dev Function to stop withdrawing new tokens.
     * @return True if the operation was successful.
     */
    function finishingWithdrawing() public
        onlyOwner
        canWithdraw
        returns (bool)
    {
        withdrawingFinished = true;

        emit WithdrawFinished();

        return true;
    }
}

// File: contracts\MilestoneLockToken.sol

/**
 * @title Milestone Lock Token
 * @dev Token lock that can be the milestone policy applied.
 */
contract MilestoneLockToken is StandardToken, Ownable {
    using SafeMath for uint256;

    struct Policy {
        uint256 kickOff;
        uint256[] periods;
        uint8[] percentages;
    }

    struct MilestoneLock {
        uint8[] policies;
        uint256[] standardBalances;
    }

    uint8 constant MAX_POLICY = 100;
    uint256 constant MAX_PERCENTAGE = 100;

    mapping(uint8 => Policy) internal policies;
    mapping(address => MilestoneLock) internal milestoneLocks;

    event SetPolicyKickOff(uint8 policy, uint256 kickOff);
    event PolicyAdded(uint8 policy);
    event PolicyRemoved(uint8 policy);
    event PolicyAttributeAdded(uint8 policy, uint256 period, uint8 percentage);
    event PolicyAttributeRemoved(uint8 policy, uint256 period);
    event PolicyAttributeModified(uint8 policy, uint256 period, uint8 percentage);

    /**
     * @dev Transfer token for a specified address when enough available unlock balance.
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) public
        returns (bool)
    {
        require(getAvailableBalance(msg.sender) >= _value);

        return super.transfer(_to, _value);
    }

    /**
     * @dev Transfer tokens from one address to another when enough available unlock balance.
     * @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(getAvailableBalance(_from) >= _value);

        return super.transferFrom(_from, _to, _value);
    }

    /**
     * @dev Distribute the amounts of tokens to from owner's balance with the milestone policy to a policy-free user.
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     * @param _policy index of milestone policy to apply.
     */
    function distributeWithPolicy(address _to, uint256 _value, uint8 _policy) public
        onlyOwner
        returns (bool)
    {
        require(_to != address(0));
        require(_value <= balances[owner]);
        require(_policy < MAX_POLICY);
        require(_checkPolicyEnabled(_policy));

        balances[owner] = balances[owner].sub(_value);
        balances[_to] = balances[_to].add(_value);

        _setMilestoneTo(_to, _value, _policy);

        emit Transfer(owner, _to, _value);

        return true;
    }

    /**
     * @dev add milestone policy.
     * @param _policy index of the milestone policy you want to add.
     * @param _periods periods of the milestone you want to add.
     * @param _percentages unlock percentages of the milestone you want to add.
     */
    function addPolicy(uint8 _policy, uint256[] _periods, uint8[] _percentages) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);
        require(!_checkPolicyEnabled(_policy));
        require(_periods.length > 0);
        require(_percentages.length > 0);
        require(_periods.length == _percentages.length);

        policies[_policy].periods = _periods;
        policies[_policy].percentages = _percentages;

        emit PolicyAdded(_policy);

        return true;
    }

    /**
     * @dev remove milestone policy.
     * @param _policy index of the milestone policy you want to remove.
     */
    function removePolicy(uint8 _policy) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);

        delete policies[_policy];

        emit PolicyRemoved(_policy);

        return true;
    }

    /**
     * @dev get milestone policy information.
     * @param _policy index of milestone policy.
     */
    function getPolicy(uint8 _policy) public
        view
        returns (uint256 kickOff, uint256[] periods, uint8[] percentages)
    {
        require(_policy < MAX_POLICY);

        return (
            policies[_policy].kickOff,
            policies[_policy].periods,
            policies[_policy].percentages
        );
    }

    /**
     * @dev set milestone policy's kickoff time.
     * @param _policy index of milestone poicy.
     * @param _time kickoff time of policy.
     */
    function setKickOff(uint8 _policy, uint256 _time) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);
        require(_checkPolicyEnabled(_policy));

        policies[_policy].kickOff = _time;

        return true;
    }

    /**
     * @dev add attribute to milestone policy.
     * @param _policy index of milestone policy.
     * @param _period period of policy attribute.
     * @param _percentage percentage of unlocking when reaching policy.
     */
    function addPolicyAttribute(uint8 _policy, uint256 _period, uint8 _percentage) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);
        require(_checkPolicyEnabled(_policy));

        Policy storage policy = policies[_policy];

        for (uint256 i = 0; i < policy.periods.length; i++) {
            if (policy.periods[i] == _period) {
                revert();
                return false;
            }
        }

        policy.periods.push(_period);
        policy.percentages.push(_percentage);

        emit PolicyAttributeAdded(_policy, _period, _percentage);

        return true;
    }

    /**
     * @dev remove attribute from milestone policy.
     * @param _policy index of milestone policy attribute.
     * @param _period period of target policy.
     */
    function removePolicyAttribute(uint8 _policy, uint256 _period) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);

        Policy storage policy = policies[_policy];
        
        for (uint256 i = 0; i < policy.periods.length; i++) {
            if (policy.periods[i] == _period) {
                _removeElementAt256(policy.periods, i);
                _removeElementAt8(policy.percentages, i);

                emit PolicyAttributeRemoved(_policy, _period);

                return true;
            }
        }

        revert();

        return false;
    }

    /**
     * @dev modify attribute from milestone policy.
     * @param _policy index of milestone policy.
     * @param _period period of target policy attribute.
     * @param _percentage percentage to modified.
     */
    function modifyPolicyAttribute(uint8 _policy, uint256 _period, uint8 _percentage) public
        onlyOwner
        returns (bool)
    {
        require(_policy < MAX_POLICY);

        Policy storage policy = policies[_policy];
        for (uint256 i = 0; i < policy.periods.length; i++) {
            if (policy.periods[i] == _period) {
                policy.percentages[i] = _percentage;

                emit PolicyAttributeModified(_policy, _period, _percentage);

                return true;
            }
        }

        revert();

        return false;
    }

    /**
     * @dev get policy's locked percentage of milestone policy from now.
     * @param _policy index of milestone policy for calculate locked percentage.
     */
    function getPolicyLockedPercentage(uint8 _policy) public view
        returns (uint256)
    {
        require(_policy < MAX_POLICY);

        Policy storage policy = policies[_policy];

        if (policy.periods.length == 0) {
            return 0;
        }
        
        if (policy.kickOff == 0 ||
            policy.kickOff > now) {
            return MAX_PERCENTAGE;
        }

        uint256 unlockedPercentage = 0;
        for (uint256 i = 0; i < policy.periods.length; i++) {
            if (policy.kickOff.add(policy.periods[i]) <= now) {
                unlockedPercentage =
                    unlockedPercentage.add(policy.percentages[i]);
            }
        }

        if (unlockedPercentage > MAX_PERCENTAGE) {
            return 0;
        }

        return MAX_PERCENTAGE.sub(unlockedPercentage);
    }

    /**
     * @dev change account's milestone policy.
     * @param _from address for milestone policy applyed from.
     * @param _prevPolicy index of original milestone policy.
     * @param _newPolicy index of milestone policy to be changed.
     */
    function modifyMilestoneFrom(address _from, uint8 _prevPolicy, uint8 _newPolicy) public
        onlyOwner
        returns (bool)
    {
        require(_from != address(0));
        require(_prevPolicy != _newPolicy);
        require(_prevPolicy < MAX_POLICY);
        require(_checkPolicyEnabled(_prevPolicy));
        require(_newPolicy < MAX_POLICY);
        require(_checkPolicyEnabled(_newPolicy));

        uint256 prevPolicyIndex = _getAppliedPolicyIndex(_from, _prevPolicy);
        require(prevPolicyIndex < MAX_POLICY);

        _setMilestoneTo(_from, milestoneLocks[_from].standardBalances[prevPolicyIndex], _newPolicy);

        milestoneLocks[_from].standardBalances[prevPolicyIndex] = 0;

        return true;
    }

    /**
     * @dev remove milestone policy from account.
     * @param _from address for applied milestone policy removes from.
     * @param _policy index of milestone policy remove. 
     */
    function removeMilestoneFrom(address _from, uint8 _policy) public
        onlyOwner
        returns (bool)
    {
        require(_from != address(0));
        require(_policy < MAX_POLICY);

        uint256 policyIndex = _getAppliedPolicyIndex(_from, _policy);
        require(policyIndex < MAX_POLICY);

        milestoneLocks[_from].standardBalances[policyIndex] = 0;

        return true;
    }

    /**
     * @dev get accounts milestone policy state information.
     * @param _account address for milestone policy applied.
     */
    function getUserMilestone(address _account) public
        view
        returns (uint8[] accountPolicies, uint256[] standardBalances)
    {
        return (
            milestoneLocks[_account].policies,
            milestoneLocks[_account].standardBalances
        );
    }

    /**
     * @dev available unlock balance.
     * @param _account address for available unlock balance.
     */
    function getAvailableBalance(address _account) public
        view
        returns (uint256)
    {
        return balances[_account].sub(getTotalLockedBalance(_account));
    }

    /**
     * @dev calcuate locked balance of milestone policy from now.
     * @param _account address for lock balance.
     * @param _policy index of applied milestone policy.
     */
    function getLockedBalance(address _account, uint8 _policy) public
        view
        returns (uint256)
    {
        require(_policy < MAX_POLICY);

        uint256 policyIndex = _getAppliedPolicyIndex(_account, _policy);
        if (policyIndex >= MAX_POLICY) {
            return 0;
        }

        MilestoneLock storage milestoneLock = milestoneLocks[_account];
        if (milestoneLock.standardBalances[policyIndex] == 0) {
            return 0;
        }

        uint256 lockedPercentage =
            getPolicyLockedPercentage(milestoneLock.policies[policyIndex]);
        return milestoneLock.standardBalances[policyIndex].div(MAX_PERCENTAGE).mul(lockedPercentage);
    }

    /**
     * @dev calcuate locked balance of milestone policy from now.
     * @param _account address for lock balance.
     */
    function getTotalLockedBalance(address _account) public
        view
        returns (uint256)
    {
        MilestoneLock storage milestoneLock = milestoneLocks[_account];

        uint256 totalLockedBalance = 0;
        for (uint256 i = 0; i < milestoneLock.policies.length; i++) {
            totalLockedBalance = totalLockedBalance.add(
                getLockedBalance(_account, milestoneLock.policies[i])
            );
        }

        return totalLockedBalance;
    }

    /**
     * @dev check for policy is enabled
     * @param _policy index of milestone policy.
     */
    function _checkPolicyEnabled(uint8 _policy) internal
        view
        returns (bool)
    {
        return (policies[_policy].periods.length > 0);
    }

    /**
     * @dev get milestone policy index applied to a user.
     * @param _to address The address which you want get to.
     * @param _policy index of milestone policy applied.
     */
    function _getAppliedPolicyIndex(address _to, uint8 _policy) internal
        view
        returns (uint8)
    {
        require(_policy < MAX_POLICY);

        MilestoneLock storage milestoneLock = milestoneLocks[_to];
        for (uint8 i = 0; i < milestoneLock.policies.length; i++) {
            if (milestoneLock.policies[i] == _policy) {
                return i;
            }
        }

        return MAX_POLICY;
    }

    /**
     * @dev set milestone policy applies to a user.
     * @param _to address The address which 
     * @param _value The amount to apply
     * @param _policy index of milestone policy to apply.
     */
    function _setMilestoneTo(address _to, uint256 _value, uint8 _policy) internal
    {
        uint8 policyIndex = _getAppliedPolicyIndex(_to, _policy);
        if (policyIndex < MAX_POLICY) {
            milestoneLocks[_to].standardBalances[policyIndex] = 
                milestoneLocks[_to].standardBalances[policyIndex].add(_value);
        } else {
            milestoneLocks[_to].policies.push(_policy);
            milestoneLocks[_to].standardBalances.push(_value);
        }
    }

    /**
     * @dev utility for uint256 array
     * @param _array target array
     * @param _index array index to remove
     */
    function _removeElementAt256(uint256[] storage _array, uint256 _index) internal
        returns (bool)
    {
        if (_array.length <= _index) {
            return false;
        }

        for (uint256 i = _index; i < _array.length - 1; i++) {
            _array[i] = _array[i + 1];
        }

        delete _array[_array.length - 1];
        _array.length--;

        return true;
    }

    /**
     * @dev utility for uint8 array
     * @param _array target array
     * @param _index array index to remove
     */
    function _removeElementAt8(uint8[] storage _array, uint256 _index) internal
        returns (bool)
    {
        if (_array.length <= _index) {
            return false;
        }

        for (uint256 i = _index; i < _array.length - 1; i++) {
            _array[i] = _array[i + 1];
        }

        delete _array[_array.length - 1];
        _array.length--;

        return true;
    }
}

// File: contracts\EB.sol

/**
 * @title EB token
 */
contract EB is
    Pausable,
    MintableToken,
    BurnableToken,
    AccountLockableToken,
    WithdrawableToken,
    MilestoneLockToken
{
    uint256 constant MAX_SUFFLY = 1000000000;

    string public name;
    string public symbol;
    uint8 public decimals;

    constructor() public
    {
        name = "EB";
        symbol = "EB";
        decimals = 18;
        totalSupply_ = MAX_SUFFLY * (10 ** uint(decimals));

        balances[owner] = totalSupply_;

        emit Transfer(address(0), owner, totalSupply_);
    }

    function() public
    {
        revert();
    }

    /**
     * @dev Transfer token for a specified address when if not paused and not locked account
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) public
        whenNotPaused
        whenNotLocked
        returns (bool)
    {
        return super.transfer(_to, _value);
    }

    /**
     * @dev Transfer tokens from one address to anther when if not paused and not locked account
     * @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
        whenNotPaused
        whenNotLocked
        returns (bool)
    {
        require(!lockStates[_from]);

        return super.transferFrom(_from, _to, _value);
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender
       when if not paused and not locked account
     * @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
        whenNotPaused
        whenNotLocked
        returns (bool)
    {
        return super.approve(_spender, _value);
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender when if not paused and not locked account
     * @param _spender address which will spend the funds.
     * @param _addedValue amount of tokens to increase the allowance by.
     */
    function increaseApproval(address _spender, uint256 _addedValue) public
        whenNotPaused
        whenNotLocked
        returns (bool)
    {
        return super.increaseApproval(_spender, _addedValue);
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * @param _spender address which will spend the funds.
     * @param _subtractedValue amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(address _spender, uint256 _subtractedValue) public
        whenNotPaused
        whenNotLocked
        returns (bool)
    {
        return super.decreaseApproval(_spender, _subtractedValue);
    }

    /**
     * @dev Distribute the amount of tokens to owner's balance.
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function distribute(address _to, uint256 _value) public
        onlyOwner
        returns (bool)
    {
        require(_to != address(0));
        require(_value <= balances[owner]);

        balances[owner] = balances[owner].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(owner, _to, _value);

        return true;
    }

    /**
     * @dev Burns a specific amount of tokens by owner.
     * @param _value The amount of token to be burned.
     */
    function burn(uint256 _value) public
        onlyOwner
    {
        super.burn(_value);
    }

    /**
     * @dev batch to the policy to account's available balance.
     * @param _policy index of milestone policy to apply.
     * @param _addresses The addresses to apply.
     */
    function batchToApplyMilestone(uint8 _policy, address[] _addresses) public
        onlyOwner
        returns (bool[])
    {
        require(_policy < MAX_POLICY);
        require(_checkPolicyEnabled(_policy));
        require(_addresses.length > 0);

        bool[] memory results = new bool[](_addresses.length);
        for (uint256 i = 0; i < _addresses.length; i++) {
            results[i] = false;
            if (_addresses[i] != address(0)) {
                uint256 availableBalance = getAvailableBalance(_addresses[i]);
                results[i] = (availableBalance > 0);
                if (results[i]) {
                    _setMilestoneTo(_addresses[i], availableBalance, _policy);
                }
            }
        }

        return results;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_period","type":"uint256"},{"name":"_percentage","type":"uint8"}],"name":"addPolicyAttribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_policy","type":"uint8"}],"name":"getPolicy","outputs":[{"name":"kickOff","type":"uint256"},{"name":"periods","type":"uint256[]"},{"name":"percentages","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_policy","type":"uint8"}],"name":"removeMilestoneFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getUserMilestone","outputs":[{"name":"accountPolicies","type":"uint8[]"},{"name":"standardBalances","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_policy","type":"uint8"}],"name":"getPolicyLockedPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lockStates","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"}],"name":"lockAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishingWithdrawing","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_periods","type":"uint256[]"},{"name":"_percentages","type":"uint8[]"}],"name":"addPolicy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getAvailableBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_addresses","type":"address[]"}],"name":"batchToApplyMilestone","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_policy","type":"uint8"}],"name":"distributeWithPolicy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_time","type":"uint256"}],"name":"setKickOff","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"}],"name":"removePolicy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"}],"name":"unlockAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_prevPolicy","type":"uint8"},{"name":"_newPolicy","type":"uint8"}],"name":"modifyMilestoneFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_period","type":"uint256"}],"name":"removePolicyAttribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_policy","type":"uint8"}],"name":"getLockedBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getTotalLockedBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_policy","type":"uint8"},{"name":"_period","type":"uint256"},{"name":"_percentage","type":"uint8"}],"name":"modifyPolicyAttribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"distribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"},{"indexed":false,"name":"kickOff","type":"uint256"}],"name":"SetPolicyKickOff","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"}],"name":"PolicyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"}],"name":"PolicyRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"},{"indexed":false,"name":"period","type":"uint256"},{"indexed":false,"name":"percentage","type":"uint8"}],"name":"PolicyAttributeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"},{"indexed":false,"name":"period","type":"uint256"}],"name":"PolicyAttributeRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"policy","type":"uint8"},{"indexed":false,"name":"period","type":"uint256"},{"indexed":false,"name":"percentage","type":"uint8"}],"name":"PolicyAttributeModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"WithdrawFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lockAccount","type":"address"}],"name":"LockAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"unlockAccount","type":"address"}],"name":"UnlockAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526000600360146101000a81548160ff0219169083151502179055506000600360156101000a81548160ff0219169083151502179055506000600560006101000a81548160ff0219169083151502179055503480156200006257600080fd5b5033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040805190810160405280600281526020017f454200000000000000000000000000000000000000000000000000000000000081525060089080519060200190620000f192919062000275565b506040805190810160405280600281526020017f4542000000000000000000000000000000000000000000000000000000000000815250600990805190602001906200013f92919062000275565b506012600a60006101000a81548160ff021916908360ff160217905550600a60009054906101000a900460ff1660ff16600a0a633b9aca0002600181905550600154600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6001546040518082815260200191505060405180910390a362000324565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b857805160ff1916838001178555620002e9565b82800160010185558215620002e9579182015b82811115620002e8578251825591602001919060010190620002cb565b5b509050620002f89190620002fc565b5090565b6200032191905b808211156200031d57600081600090555060010162000303565b5090565b90565b61588580620003346000396000f300608060405260043610610225576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630220f6621461023757806304f08b551461029657806305d2035b1461036a57806306fdde0314610399578063095ea7b3146104295780630a7fb7461461048e5780630bf7fb57146104f657806318160ddd146105d65780631cc7093414610601578063215a58c21461064557806323b872dd14610674578063313ce567146106f957806337580f901461072a5780633f4ba83a1461078557806340c10f191461079c57806342966c681461080157806347a64f441461082e578063576709a2146108895780635c975abb146108b857806366188463146108e75780636781cc041461094c5780636c24a76f14610a1a57806370a0823114610a715780637139863714610ac8578063715018a614610b905780637c75c1b414610ba75780637d64bcb414610c195780637f0ed03714610c485780638456cb5914610c9a5780638da5cb5b14610cb15780638db9c13c14610d08578063905295e314610d505780639555a94214610dab57806395d89b4114610e30578063a9059cbb14610ec0578063b422375714610f25578063b4ed8bf814610f9a578063d105350b14610fec578063d73dd62314611050578063dd62ed3e146110b5578063f1001f8c1461112c578063f2fde38b14611183578063f3fef3a3146111c6578063f85ef43b1461122b578063fb9321081461128a575b34801561023157600080fd5b50600080fd5b34801561024357600080fd5b5061027c600480360381019080803560ff16906020019092919080359060200190929190803560ff1690602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b3480156102a257600080fd5b506102c4600480360381019080803560ff1690602001909291905050506114b5565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103115780820151818401526020810190506102f6565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610353578082015181840152602081019050610338565b505050509050019550505050505060405180910390f35b34801561037657600080fd5b5061037f6115fb565b604051808215151515815260200191505060405180910390f35b3480156103a557600080fd5b506103ae61160e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ee5780820151818401526020810190506103d3565b50505050905090810190601f16801561041b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043557600080fd5b50610474600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116ac565b604051808215151515815260200191505060405180910390f35b34801561049a57600080fd5b506104dc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611735565b604051808215151515815260200191505060405180910390f35b34801561050257600080fd5b50610537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611870565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561057e578082015181840152602081019050610563565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105c05780820151818401526020810190506105a5565b5050505090500194505050505060405180910390f35b3480156105e257600080fd5b506105eb6119ca565b6040518082815260200191505060405180910390f35b34801561060d57600080fd5b5061062f600480360381019080803560ff1690602001909291905050506119d4565b6040518082815260200191505060405180910390f35b34801561065157600080fd5b5061065a611b20565b604051808215151515815260200191505060405180910390f35b34801561068057600080fd5b506106df600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b33565b604051808215151515815260200191505060405180910390f35b34801561070557600080fd5b5061070e611c17565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073657600080fd5b5061076b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c2a565b604051808215151515815260200191505060405180910390f35b34801561079157600080fd5b5061079a611c4a565b005b3480156107a857600080fd5b506107e7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d0a565b604051808215151515815260200191505060405180910390f35b34801561080d57600080fd5b5061082c60048036038101908080359060200190929190505050611ef0565b005b34801561083a57600080fd5b5061086f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f58565b604051808215151515815260200191505060405180910390f35b34801561089557600080fd5b5061089e612110565b604051808215151515815260200191505060405180910390f35b3480156108c457600080fd5b506108cd6121d8565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b50610932600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121eb565b604051808215151515815260200191505060405180910390f35b34801561095857600080fd5b50610a00600480360381019080803560ff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050612274565b604051808215151515815260200191505060405180910390f35b348015610a2657600080fd5b50610a5b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d6565b6040518082815260200191505060405180910390f35b348015610a7d57600080fd5b50610ab2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612438565b6040518082815260200191505060405180910390f35b348015610ad457600080fd5b50610b39600480360381019080803560ff16906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050612480565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b7c578082015181840152602081019050610b61565b505050509050019250505060405180910390f35b348015610b9c57600080fd5b50610ba561266f565b005b348015610bb357600080fd5b50610bff600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190505050612774565b604051808215151515815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e612aad565b604051808215151515815260200191505060405180910390f35b348015610c5457600080fd5b50610c80600480360381019080803560ff16906020019092919080359060200190929190505050612b75565b604051808215151515815260200191505060405180910390f35b348015610ca657600080fd5b50610caf612c27565b005b348015610cbd57600080fd5b50610cc6612ce8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1457600080fd5b50610d36600480360381019080803560ff169060200190929190505050612d0e565b604051808215151515815260200191505060405180910390f35b348015610d5c57600080fd5b50610d91600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e0b565b604051808215151515815260200191505060405180910390f35b348015610db757600080fd5b50610e16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fc2565b604051808215151515815260200191505060405180910390f35b348015610e3c57600080fd5b50610e456132fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e85578082015181840152602081019050610e6a565b50505050905090810190601f168015610eb25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ecc57600080fd5b50610f0b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613398565b604051808215151515815260200191505060405180910390f35b348015610f3157600080fd5b50610f80600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613421565b604051808215151515815260200191505060405180910390f35b348015610fa657600080fd5b50610fd2600480360381019080803560ff16906020019092919080359060200190929190505050613613565b604051808215151515815260200191505060405180910390f35b348015610ff857600080fd5b5061103a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061375f565b6040518082815260200191505060405180910390f35b34801561105c57600080fd5b5061109b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613895565b604051808215151515815260200191505060405180910390f35b3480156110c157600080fd5b50611116600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061391e565b6040518082815260200191505060405180910390f35b34801561113857600080fd5b5061116d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139a5565b6040518082815260200191505060405180910390f35b34801561118f57600080fd5b506111c4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a6a565b005b3480156111d257600080fd5b50611211600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ad2565b604051808215151515815260200191505060405180910390f35b34801561123757600080fd5b50611270600480360381019080803560ff16906020019092919080359060200190929190803560ff169060200190929190505050613e55565b604051808215151515815260200191505060405180910390f35b34801561129657600080fd5b506112d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613fd0565b604051808215151515815260200191505060405180910390f35b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561135057600080fd5b606460ff168660ff1610151561136557600080fd5b61136e866142d4565b151561137957600080fd5b600660008760ff1660ff1681526020019081526020016000209150600090505b81600101805490508110156113dd578482600101828154811015156113ba57fe5b906000526020600020015414156113d057600080fd5b8080600101915050611399565b816001018590806001815401808255809150509060018203906000526020600020016000909192909190915055508160020184908060018154018082558091505090600182039060005260206000209060209182820401919006909192909190916101000a81548160ff021916908360ff160217905550507fa3ded8e76aad13e8fa47bdc55ef6792b175d7c2fd1965fd73a268c54a2742a11868686604051808460ff1660ff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a16001925050509392505050565b6000606080606460ff168460ff161015156114cf57600080fd5b600660008560ff1660ff16815260200190815260200160002060000154600660008660ff1660ff168152602001908152602001600020600101600660008760ff1660ff1681526020019081526020016000206002018180548060200260200160405190810160405280929190818152602001828054801561156f57602002820191906000526020600020905b81548152602001906001019080831161155b575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156115e757602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116115b05790505b505050505090509250925092509193909250565b600360159054906101000a900460ff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b505050505081565b6000600360149054906101000a900460ff161515156116ca57600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561172357600080fd5b61172d83836142ff565b905092915050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561179457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156117d057600080fd5b606460ff168360ff161015156117e557600080fd5b6117ef84846143f1565b60ff169050606460ff168110151561180657600080fd5b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110151561185757fe5b9060005260206000200181905550600191505092915050565b606080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018180548060200260200160405190810160405280929190818152602001828054801561196857602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116119315790505b50505050509150808054806020026020016040519081016040528092919081815260200182805480156119ba57602002820191906000526020600020905b8154815260200190600101908083116119a6575b5050505050905091509150915091565b6000600154905090565b600080600080606460ff168560ff161015156119ef57600080fd5b600660008660ff1660ff1681526020019081526020016000209250600083600101805490501415611a235760009350611b18565b600083600001541480611a395750428360000154115b15611a475760649350611b18565b60009150600090505b8260010180549050811015611aef5742611a928460010183815481101515611a7457fe5b906000526020600020015485600001546144c690919063ffffffff16565b111515611ae257611adf8360020182815481101515611aad57fe5b90600052602060002090602091828204019190069054906101000a900460ff1660ff16836144c690919063ffffffff16565b91505b8080600101915050611a50565b6064821115611b015760009350611b18565b611b158260646144e290919063ffffffff16565b93505b505050919050565b600560009054906101000a900460ff1681565b6000600360149054906101000a900460ff16151515611b5157600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611baa57600080fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c0357600080fd5b611c0e8484846144fb565b90509392505050565b600a60009054906101000a900460ff1681565b60046020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca657600080fd5b600360149054906101000a900460ff161515611cc157600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d6857600080fd5b600360159054906101000a900460ff16151515611d8457600080fd5b611d99826001546144c690919063ffffffff16565b600181905550611df0826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f4c57600080fd5b611f5581614528565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fb657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561201357600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561206c57600080fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2e42b012fe114d62bddb874b8e25a0e9053bdc64cd62e48ba623efe99742817e60405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561216e57600080fd5b600560009054906101000a900460ff1615151561218a57600080fd5b6001600560006101000a81548160ff0219169083151502179055507fa3296d3334f8dcdd01c32caa6b1a7edf455364495877a7afb6b2f4a7a58d397960405160405180910390a16001905090565b600360149054906101000a900460ff1681565b6000600360149054906101000a900460ff1615151561220957600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561226257600080fd5b61226c8383614535565b905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d257600080fd5b606460ff168460ff161015156122e757600080fd5b6122f0846142d4565b1515156122fc57600080fd5b6000835111151561230c57600080fd5b6000825111151561231c57600080fd5b8151835114151561232c57600080fd5b82600660008660ff1660ff168152602001908152602001600020600101908051906020019061235c929190615661565b5081600660008660ff1660ff168152602001908152602001600020600201908051906020019061238d9291906156ae565b507f1eb3c3c18a0f398cdba1d709f9a2a462af8f63b7c00c90cb2d5d996e60b5acab84604051808260ff1660ff16815260200191505060405180910390a1600190509392505050565b60006124316123e4836139a5565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606080600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124e257600080fd5b606460ff168660ff161015156124f757600080fd5b612500866142d4565b151561250b57600080fd5b6000855111151561251b57600080fd5b845160405190808252806020026020018201604052801561254b5781602001602082028038833980820191505090505b509250600091505b8451821015612663576000838381518110151561256c57fe5b9060200190602002019015159081151581525050600073ffffffffffffffffffffffffffffffffffffffff1685838151811015156125a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515612656576125ed85838151811015156125de57fe5b906020019060200201516123d6565b905060008111838381518110151561260157fe5b9060200190602002019015159081151581525050828281518110151561262357fe5b906020019060200201511561265557612654858381518110151561264357fe5b9060200190602002015182886147c7565b5b5b8180600101925050612553565b82935050505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126cb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127d257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561280e57600080fd5b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115151561287d57600080fd5b606460ff168260ff1610151561289257600080fd5b61289b826142d4565b15156128a657600080fd5b61291983600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129ce836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a1b8484846147c7565b8373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600190509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b0b57600080fd5b600360159054906101000a900460ff16151515612b2757600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612bd357600080fd5b606460ff168360ff16101515612be857600080fd5b612bf1836142d4565b1515612bfc57600080fd5b81600660008560ff1660ff168152602001908152602001600020600001819055506001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c8357600080fd5b600360149054906101000a900460ff16151515612c9f57600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d6c57600080fd5b606460ff168260ff16101515612d8157600080fd5b600660008360ff1660ff168152602001908152602001600020600080820160009055600182016000612db39190615755565b600282016000612dc39190615776565b50507f23c2d4a49f5ea8d4ecf0d7d74a9c20cfd7b90c2d620cebb61f44fe20548f9e3882604051808260ff1660ff16815260200191505060405180910390a160019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612e6957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ec657600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612f1e57600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fb9c97a444794ab1ae6b17546c4103860c32e39862de6be9887a683bd1c897c9460405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561302057600080fd5b600560009054906101000a900460ff1615151561303c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561308957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156130c557600080fd5b613116826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131a9826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a37f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1600190509392505050565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133905780601f1061336557610100808354040283529160200191613390565b820191906000526020600020905b81548152906001019060200180831161337357829003601f168201915b505050505081565b6000600360149054906101000a900460ff161515156133b657600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561340f57600080fd5b61341983836149b3565b905092915050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561348057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156134bc57600080fd5b8260ff168460ff16141515156134d157600080fd5b606460ff168460ff161015156134e657600080fd5b6134ef846142d4565b15156134fa57600080fd5b606460ff168360ff1610151561350f57600080fd5b613518836142d4565b151561352357600080fd5b61352d85856143f1565b60ff169050606460ff168110151561354457600080fd5b6135a885600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018381548110151561359757fe5b9060005260206000200154856147c7565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811015156135f957fe5b906000526020600020018190555060019150509392505050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561367457600080fd5b606460ff168560ff1610151561368957600080fd5b600660008660ff1660ff1681526020019081526020016000209150600090505b8160010180549050811015613752578382600101828154811015156136ca57fe5b90600052602060002001541415613745576136e882600101826149de565b506136f68260020182614a93565b507fbc3aedc2473e29de7e195dedc40afb7b2e49384c657be863787a7fbcdb9d02518585604051808360ff1660ff1681526020018281526020019250505060405180910390a160019250613757565b80806001019150506136a9565b600080fd5b505092915050565b600080600080606460ff168560ff1610151561377a57600080fd5b61378486866143f1565b60ff169250606460ff168310151561379f576000935061388c565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209150600082600101848154811015156137f357fe5b9060005260206000200154141561380d576000935061388c565b613846826000018481548110151561382157fe5b90600052602060002090602091828204019190069054906101000a900460ff166119d4565b90506138898161387b6064856001018781548110151561386257fe5b9060005260206000200154614b8d90919063ffffffff16565b614ba390919063ffffffff16565b93505b50505092915050565b6000600360149054906101000a900460ff161515156138b357600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561390c57600080fd5b6139168383614bdb565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925060009150600090505b8260000180549050811015613a5f57613a50613a41868560000184815481101515613a1c57fe5b90600052602060002090602091828204019190069054906101000a900460ff1661375f565b836144c690919063ffffffff16565b915080806001019150506139f5565b819350505050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ac657600080fd5b613acf81614dd7565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b3057600080fd5b600560009054906101000a900460ff16151515613b4c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613b9957600080fd5b613bea826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9f82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a37f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613eb657600080fd5b606460ff168660ff16101515613ecb57600080fd5b600660008760ff1660ff1681526020019081526020016000209150600090505b8160010180549050811015613fc257848260010182815481101515613f0c57fe5b90600052602060002001541415613fb557838260020182815481101515613f2f57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055507f5205cac358b9652030706465e9d31ba7211ad4c5cc089dfea3c7b3d90eb7418c868686604051808460ff1660ff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a160019250613fc7565b8080600101915050613eeb565b600080fd5b50509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561402e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561406a57600080fd5b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156140d957600080fd5b61414c82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614201826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600660008460ff1660ff16815260200190815260200160002060010180549050119050919050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000806000606460ff168460ff1610151561440b57600080fd5b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209150600090505b81600001805490508160ff1610156144b9578360ff16826000018260ff1681548110151561447b57fe5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1614156144ac578092506144be565b8080600101915050614451565b606492505b505092915050565b600081830190508281101515156144d957fe5b80905092915050565b60008282111515156144f057fe5b818303905092915050565b600081614507856123d6565b1015151561451457600080fd5b61451f848484614ed3565b90509392505050565b614532338261528e565b50565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515614647576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506146db565b61465a83826144e290919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60006147d384836143f1565b9050606460ff168160ff1610156148b85761485383600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018360ff1681548110151561483a57fe5b90600052602060002001546144c690919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018260ff168154811015156148a557fe5b90600052602060002001819055506149ad565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182908060018154018082558091505090600182039060005260206000209060209182820401919006909192909190916101000a81548160ff021916908360ff16021790555050600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190915055505b50505050565b6000816149bf336123d6565b101515156149cc57600080fd5b6149d68383615441565b905092915050565b6000808284805490501115156149f75760009150614a8c565b8290505b6001848054905003811015614a4f578360018201815481101515614a1b57fe5b90600052602060002001548482815481101515614a3457fe5b906000526020600020018190555080806001019150506149fb565b836001858054905003815481101515614a6457fe5b906000526020600020016000905583805480919060019003614a86919061579e565b50600191505b5092915050565b600080828480549050111515614aac5760009150614b86565b8290505b6001848054905003811015614b35578360018201815481101515614ad057fe5b90600052602060002090602091828204019190069054906101000a900460ff168482815481101515614afe57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055508080600101915050614ab0565b836001858054905003815481101515614b4a57fe5b90600052602060002090602091828204019190066101000a81549060ff021916905583805480919060019003614b8091906157ca565b50600191505b5092915050565b60008183811515614b9a57fe5b04905092915050565b600080831415614bb65760009050614bd5565b8183029050818382811515614bc757fe5b04141515614bd157fe5b8090505b92915050565b6000614c6c82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e1357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614f2257600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fe957600080fd5b61503a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150cd826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061519e82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156152db57600080fd5b61532c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615383816001546144e290919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561549057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156154cc57600080fd5b61551d826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506155b0826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b82805482825590600052602060002090810192821561569d579160200282015b8281111561569c578251825591602001919060010190615681565b5b5090506156aa9190615804565b5090565b82805482825590600052602060002090601f016020900481019282156157445791602002820160005b8382111561571557835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026156d7565b80156157425782816101000a81549060ff0219169055600101602081600001049283019260010302615715565b505b5090506157519190615829565b5090565b50805460008255906000526020600020908101906157739190615804565b50565b50805460008255601f01602090049060005260206000209081019061579b9190615804565b50565b8154818355818111156157c5578183600052602060002091820191016157c49190615804565b5b505050565b8154818355818111156157ff57601f016020900481601f016020900483600052602060002091820191016157fe9190615804565b5b505050565b61582691905b8082111561582257600081600090555060010161580a565b5090565b90565b61585691905b8082111561585257600081816101000a81549060ff02191690555060010161582f565b5090565b905600a165627a7a72305820288a8b449a776ed6bc35da051efb14f4b1d2161d1a17a2bf46eda7f527a9c91a0029

Deployed Bytecode

0x608060405260043610610225576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630220f6621461023757806304f08b551461029657806305d2035b1461036a57806306fdde0314610399578063095ea7b3146104295780630a7fb7461461048e5780630bf7fb57146104f657806318160ddd146105d65780631cc7093414610601578063215a58c21461064557806323b872dd14610674578063313ce567146106f957806337580f901461072a5780633f4ba83a1461078557806340c10f191461079c57806342966c681461080157806347a64f441461082e578063576709a2146108895780635c975abb146108b857806366188463146108e75780636781cc041461094c5780636c24a76f14610a1a57806370a0823114610a715780637139863714610ac8578063715018a614610b905780637c75c1b414610ba75780637d64bcb414610c195780637f0ed03714610c485780638456cb5914610c9a5780638da5cb5b14610cb15780638db9c13c14610d08578063905295e314610d505780639555a94214610dab57806395d89b4114610e30578063a9059cbb14610ec0578063b422375714610f25578063b4ed8bf814610f9a578063d105350b14610fec578063d73dd62314611050578063dd62ed3e146110b5578063f1001f8c1461112c578063f2fde38b14611183578063f3fef3a3146111c6578063f85ef43b1461122b578063fb9321081461128a575b34801561023157600080fd5b50600080fd5b34801561024357600080fd5b5061027c600480360381019080803560ff16906020019092919080359060200190929190803560ff1690602001909291905050506112ef565b604051808215151515815260200191505060405180910390f35b3480156102a257600080fd5b506102c4600480360381019080803560ff1690602001909291905050506114b5565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103115780820151818401526020810190506102f6565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610353578082015181840152602081019050610338565b505050509050019550505050505060405180910390f35b34801561037657600080fd5b5061037f6115fb565b604051808215151515815260200191505060405180910390f35b3480156103a557600080fd5b506103ae61160e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ee5780820151818401526020810190506103d3565b50505050905090810190601f16801561041b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043557600080fd5b50610474600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116ac565b604051808215151515815260200191505060405180910390f35b34801561049a57600080fd5b506104dc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611735565b604051808215151515815260200191505060405180910390f35b34801561050257600080fd5b50610537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611870565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561057e578082015181840152602081019050610563565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105c05780820151818401526020810190506105a5565b5050505090500194505050505060405180910390f35b3480156105e257600080fd5b506105eb6119ca565b6040518082815260200191505060405180910390f35b34801561060d57600080fd5b5061062f600480360381019080803560ff1690602001909291905050506119d4565b6040518082815260200191505060405180910390f35b34801561065157600080fd5b5061065a611b20565b604051808215151515815260200191505060405180910390f35b34801561068057600080fd5b506106df600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b33565b604051808215151515815260200191505060405180910390f35b34801561070557600080fd5b5061070e611c17565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073657600080fd5b5061076b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c2a565b604051808215151515815260200191505060405180910390f35b34801561079157600080fd5b5061079a611c4a565b005b3480156107a857600080fd5b506107e7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d0a565b604051808215151515815260200191505060405180910390f35b34801561080d57600080fd5b5061082c60048036038101908080359060200190929190505050611ef0565b005b34801561083a57600080fd5b5061086f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f58565b604051808215151515815260200191505060405180910390f35b34801561089557600080fd5b5061089e612110565b604051808215151515815260200191505060405180910390f35b3480156108c457600080fd5b506108cd6121d8565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b50610932600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121eb565b604051808215151515815260200191505060405180910390f35b34801561095857600080fd5b50610a00600480360381019080803560ff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050612274565b604051808215151515815260200191505060405180910390f35b348015610a2657600080fd5b50610a5b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d6565b6040518082815260200191505060405180910390f35b348015610a7d57600080fd5b50610ab2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612438565b6040518082815260200191505060405180910390f35b348015610ad457600080fd5b50610b39600480360381019080803560ff16906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050612480565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b7c578082015181840152602081019050610b61565b505050509050019250505060405180910390f35b348015610b9c57600080fd5b50610ba561266f565b005b348015610bb357600080fd5b50610bff600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190505050612774565b604051808215151515815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e612aad565b604051808215151515815260200191505060405180910390f35b348015610c5457600080fd5b50610c80600480360381019080803560ff16906020019092919080359060200190929190505050612b75565b604051808215151515815260200191505060405180910390f35b348015610ca657600080fd5b50610caf612c27565b005b348015610cbd57600080fd5b50610cc6612ce8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1457600080fd5b50610d36600480360381019080803560ff169060200190929190505050612d0e565b604051808215151515815260200191505060405180910390f35b348015610d5c57600080fd5b50610d91600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e0b565b604051808215151515815260200191505060405180910390f35b348015610db757600080fd5b50610e16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fc2565b604051808215151515815260200191505060405180910390f35b348015610e3c57600080fd5b50610e456132fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e85578082015181840152602081019050610e6a565b50505050905090810190601f168015610eb25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ecc57600080fd5b50610f0b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613398565b604051808215151515815260200191505060405180910390f35b348015610f3157600080fd5b50610f80600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190803560ff169060200190929190505050613421565b604051808215151515815260200191505060405180910390f35b348015610fa657600080fd5b50610fd2600480360381019080803560ff16906020019092919080359060200190929190505050613613565b604051808215151515815260200191505060405180910390f35b348015610ff857600080fd5b5061103a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061375f565b6040518082815260200191505060405180910390f35b34801561105c57600080fd5b5061109b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613895565b604051808215151515815260200191505060405180910390f35b3480156110c157600080fd5b50611116600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061391e565b6040518082815260200191505060405180910390f35b34801561113857600080fd5b5061116d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139a5565b6040518082815260200191505060405180910390f35b34801561118f57600080fd5b506111c4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a6a565b005b3480156111d257600080fd5b50611211600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613ad2565b604051808215151515815260200191505060405180910390f35b34801561123757600080fd5b50611270600480360381019080803560ff16906020019092919080359060200190929190803560ff169060200190929190505050613e55565b604051808215151515815260200191505060405180910390f35b34801561129657600080fd5b506112d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613fd0565b604051808215151515815260200191505060405180910390f35b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561135057600080fd5b606460ff168660ff1610151561136557600080fd5b61136e866142d4565b151561137957600080fd5b600660008760ff1660ff1681526020019081526020016000209150600090505b81600101805490508110156113dd578482600101828154811015156113ba57fe5b906000526020600020015414156113d057600080fd5b8080600101915050611399565b816001018590806001815401808255809150509060018203906000526020600020016000909192909190915055508160020184908060018154018082558091505090600182039060005260206000209060209182820401919006909192909190916101000a81548160ff021916908360ff160217905550507fa3ded8e76aad13e8fa47bdc55ef6792b175d7c2fd1965fd73a268c54a2742a11868686604051808460ff1660ff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a16001925050509392505050565b6000606080606460ff168460ff161015156114cf57600080fd5b600660008560ff1660ff16815260200190815260200160002060000154600660008660ff1660ff168152602001908152602001600020600101600660008760ff1660ff1681526020019081526020016000206002018180548060200260200160405190810160405280929190818152602001828054801561156f57602002820191906000526020600020905b81548152602001906001019080831161155b575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156115e757602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116115b05790505b505050505090509250925092509193909250565b600360159054906101000a900460ff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b505050505081565b6000600360149054906101000a900460ff161515156116ca57600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561172357600080fd5b61172d83836142ff565b905092915050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561179457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156117d057600080fd5b606460ff168360ff161015156117e557600080fd5b6117ef84846143f1565b60ff169050606460ff168110151561180657600080fd5b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018281548110151561185757fe5b9060005260206000200181905550600191505092915050565b606080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018180548060200260200160405190810160405280929190818152602001828054801561196857602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116119315790505b50505050509150808054806020026020016040519081016040528092919081815260200182805480156119ba57602002820191906000526020600020905b8154815260200190600101908083116119a6575b5050505050905091509150915091565b6000600154905090565b600080600080606460ff168560ff161015156119ef57600080fd5b600660008660ff1660ff1681526020019081526020016000209250600083600101805490501415611a235760009350611b18565b600083600001541480611a395750428360000154115b15611a475760649350611b18565b60009150600090505b8260010180549050811015611aef5742611a928460010183815481101515611a7457fe5b906000526020600020015485600001546144c690919063ffffffff16565b111515611ae257611adf8360020182815481101515611aad57fe5b90600052602060002090602091828204019190069054906101000a900460ff1660ff16836144c690919063ffffffff16565b91505b8080600101915050611a50565b6064821115611b015760009350611b18565b611b158260646144e290919063ffffffff16565b93505b505050919050565b600560009054906101000a900460ff1681565b6000600360149054906101000a900460ff16151515611b5157600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611baa57600080fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c0357600080fd5b611c0e8484846144fb565b90509392505050565b600a60009054906101000a900460ff1681565b60046020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca657600080fd5b600360149054906101000a900460ff161515611cc157600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d6857600080fd5b600360159054906101000a900460ff16151515611d8457600080fd5b611d99826001546144c690919063ffffffff16565b600181905550611df0826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f4c57600080fd5b611f5581614528565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fb657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561201357600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561206c57600080fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2e42b012fe114d62bddb874b8e25a0e9053bdc64cd62e48ba623efe99742817e60405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561216e57600080fd5b600560009054906101000a900460ff1615151561218a57600080fd5b6001600560006101000a81548160ff0219169083151502179055507fa3296d3334f8dcdd01c32caa6b1a7edf455364495877a7afb6b2f4a7a58d397960405160405180910390a16001905090565b600360149054906101000a900460ff1681565b6000600360149054906101000a900460ff1615151561220957600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561226257600080fd5b61226c8383614535565b905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d257600080fd5b606460ff168460ff161015156122e757600080fd5b6122f0846142d4565b1515156122fc57600080fd5b6000835111151561230c57600080fd5b6000825111151561231c57600080fd5b8151835114151561232c57600080fd5b82600660008660ff1660ff168152602001908152602001600020600101908051906020019061235c929190615661565b5081600660008660ff1660ff168152602001908152602001600020600201908051906020019061238d9291906156ae565b507f1eb3c3c18a0f398cdba1d709f9a2a462af8f63b7c00c90cb2d5d996e60b5acab84604051808260ff1660ff16815260200191505060405180910390a1600190509392505050565b60006124316123e4836139a5565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606080600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124e257600080fd5b606460ff168660ff161015156124f757600080fd5b612500866142d4565b151561250b57600080fd5b6000855111151561251b57600080fd5b845160405190808252806020026020018201604052801561254b5781602001602082028038833980820191505090505b509250600091505b8451821015612663576000838381518110151561256c57fe5b9060200190602002019015159081151581525050600073ffffffffffffffffffffffffffffffffffffffff1685838151811015156125a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515612656576125ed85838151811015156125de57fe5b906020019060200201516123d6565b905060008111838381518110151561260157fe5b9060200190602002019015159081151581525050828281518110151561262357fe5b906020019060200201511561265557612654858381518110151561264357fe5b9060200190602002015182886147c7565b5b5b8180600101925050612553565b82935050505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126cb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127d257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561280e57600080fd5b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115151561287d57600080fd5b606460ff168260ff1610151561289257600080fd5b61289b826142d4565b15156128a657600080fd5b61291983600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129ce836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a1b8484846147c7565b8373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600190509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b0b57600080fd5b600360159054906101000a900460ff16151515612b2757600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612bd357600080fd5b606460ff168360ff16101515612be857600080fd5b612bf1836142d4565b1515612bfc57600080fd5b81600660008560ff1660ff168152602001908152602001600020600001819055506001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c8357600080fd5b600360149054906101000a900460ff16151515612c9f57600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d6c57600080fd5b606460ff168260ff16101515612d8157600080fd5b600660008360ff1660ff168152602001908152602001600020600080820160009055600182016000612db39190615755565b600282016000612dc39190615776565b50507f23c2d4a49f5ea8d4ecf0d7d74a9c20cfd7b90c2d620cebb61f44fe20548f9e3882604051808260ff1660ff16815260200191505060405180910390a160019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612e6957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ec657600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612f1e57600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fb9c97a444794ab1ae6b17546c4103860c32e39862de6be9887a683bd1c897c9460405160405180910390a260019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561302057600080fd5b600560009054906101000a900460ff1615151561303c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561308957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156130c557600080fd5b613116826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131a9826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a37f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1600190509392505050565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133905780601f1061336557610100808354040283529160200191613390565b820191906000526020600020905b81548152906001019060200180831161337357829003601f168201915b505050505081565b6000600360149054906101000a900460ff161515156133b657600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561340f57600080fd5b61341983836149b3565b905092915050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561348057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156134bc57600080fd5b8260ff168460ff16141515156134d157600080fd5b606460ff168460ff161015156134e657600080fd5b6134ef846142d4565b15156134fa57600080fd5b606460ff168360ff1610151561350f57600080fd5b613518836142d4565b151561352357600080fd5b61352d85856143f1565b60ff169050606460ff168110151561354457600080fd5b6135a885600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018381548110151561359757fe5b9060005260206000200154856147c7565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101828154811015156135f957fe5b906000526020600020018190555060019150509392505050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561367457600080fd5b606460ff168560ff1610151561368957600080fd5b600660008660ff1660ff1681526020019081526020016000209150600090505b8160010180549050811015613752578382600101828154811015156136ca57fe5b90600052602060002001541415613745576136e882600101826149de565b506136f68260020182614a93565b507fbc3aedc2473e29de7e195dedc40afb7b2e49384c657be863787a7fbcdb9d02518585604051808360ff1660ff1681526020018281526020019250505060405180910390a160019250613757565b80806001019150506136a9565b600080fd5b505092915050565b600080600080606460ff168560ff1610151561377a57600080fd5b61378486866143f1565b60ff169250606460ff168310151561379f576000935061388c565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209150600082600101848154811015156137f357fe5b9060005260206000200154141561380d576000935061388c565b613846826000018481548110151561382157fe5b90600052602060002090602091828204019190069054906101000a900460ff166119d4565b90506138898161387b6064856001018781548110151561386257fe5b9060005260206000200154614b8d90919063ffffffff16565b614ba390919063ffffffff16565b93505b50505092915050565b6000600360149054906101000a900460ff161515156138b357600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561390c57600080fd5b6139168383614bdb565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020925060009150600090505b8260000180549050811015613a5f57613a50613a41868560000184815481101515613a1c57fe5b90600052602060002090602091828204019190069054906101000a900460ff1661375f565b836144c690919063ffffffff16565b915080806001019150506139f5565b819350505050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ac657600080fd5b613acf81614dd7565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b3057600080fd5b600560009054906101000a900460ff16151515613b4c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613b9957600080fd5b613bea826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9f82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a37f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613eb657600080fd5b606460ff168660ff16101515613ecb57600080fd5b600660008760ff1660ff1681526020019081526020016000209150600090505b8160010180549050811015613fc257848260010182815481101515613f0c57fe5b90600052602060002001541415613fb557838260020182815481101515613f2f57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055507f5205cac358b9652030706465e9d31ba7211ad4c5cc089dfea3c7b3d90eb7418c868686604051808460ff1660ff1681526020018381526020018260ff1660ff168152602001935050505060405180910390a160019250613fc7565b8080600101915050613eeb565b600080fd5b50509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561402e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561406a57600080fd5b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156140d957600080fd5b61414c82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614201826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600660008460ff1660ff16815260200190815260200160002060010180549050119050919050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000806000606460ff168460ff1610151561440b57600080fd5b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209150600090505b81600001805490508160ff1610156144b9578360ff16826000018260ff1681548110151561447b57fe5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1614156144ac578092506144be565b8080600101915050614451565b606492505b505092915050565b600081830190508281101515156144d957fe5b80905092915050565b60008282111515156144f057fe5b818303905092915050565b600081614507856123d6565b1015151561451457600080fd5b61451f848484614ed3565b90509392505050565b614532338261528e565b50565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515614647576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506146db565b61465a83826144e290919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60006147d384836143f1565b9050606460ff168160ff1610156148b85761485383600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018360ff1681548110151561483a57fe5b90600052602060002001546144c690919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018260ff168154811015156148a557fe5b90600052602060002001819055506149ad565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182908060018154018082558091505090600182039060005260206000209060209182820401919006909192909190916101000a81548160ff021916908360ff16021790555050600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190915055505b50505050565b6000816149bf336123d6565b101515156149cc57600080fd5b6149d68383615441565b905092915050565b6000808284805490501115156149f75760009150614a8c565b8290505b6001848054905003811015614a4f578360018201815481101515614a1b57fe5b90600052602060002001548482815481101515614a3457fe5b906000526020600020018190555080806001019150506149fb565b836001858054905003815481101515614a6457fe5b906000526020600020016000905583805480919060019003614a86919061579e565b50600191505b5092915050565b600080828480549050111515614aac5760009150614b86565b8290505b6001848054905003811015614b35578360018201815481101515614ad057fe5b90600052602060002090602091828204019190069054906101000a900460ff168482815481101515614afe57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff1602179055508080600101915050614ab0565b836001858054905003815481101515614b4a57fe5b90600052602060002090602091828204019190066101000a81549060ff021916905583805480919060019003614b8091906157ca565b50600191505b5092915050565b60008183811515614b9a57fe5b04905092915050565b600080831415614bb65760009050614bd5565b8183029050818382811515614bc757fe5b04141515614bd157fe5b8090505b92915050565b6000614c6c82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e1357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614f2257600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fe957600080fd5b61503a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150cd826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061519e82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156152db57600080fd5b61532c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550615383816001546144e290919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561549057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156154cc57600080fd5b61551d826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144e290919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506155b0826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144c690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b82805482825590600052602060002090810192821561569d579160200282015b8281111561569c578251825591602001919060010190615681565b5b5090506156aa9190615804565b5090565b82805482825590600052602060002090601f016020900481019282156157445791602002820160005b8382111561571557835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026156d7565b80156157425782816101000a81549060ff0219169055600101602081600001049283019260010302615715565b505b5090506157519190615829565b5090565b50805460008255906000526020600020908101906157739190615804565b50565b50805460008255601f01602090049060005260206000209081019061579b9190615804565b50565b8154818355818111156157c5578183600052602060002091820191016157c49190615804565b5b505050565b8154818355818111156157ff57601f016020900481601f016020900483600052602060002091820191016157fe9190615804565b5b505050565b61582691905b8082111561582257600081600090555060010161580a565b5090565b90565b61585691905b8082111561585257600081816101000a81549060ff02191690555060010161582f565b5090565b905600a165627a7a72305820288a8b449a776ed6bc35da051efb14f4b1d2161d1a17a2bf46eda7f527a9c91a0029

Deployed Bytecode Sourcemap

32097:4856:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32097:4856:0;32690:8;;;22040:663;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22040:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21013:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;21013:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;21013:338:0;;;;;;;;;;;;;;;;;;;;11333:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11333:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32299:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32299:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;32299:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34000:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34000:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26603:410;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26603:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27163:282;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27163:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27163:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27163:282:0;;;;;;;;;;;;;;;;;;;5186:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5186:85:0;;;;;;;;;;;;;;;;;;;;;;;24527:854;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24527:854:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14752:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14752:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33448:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33448:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32351:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32351:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13435:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13435:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2715:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2715:95:0;;;;;;11770:326;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11770:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35863:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35863:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;13857:278;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13857:278:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16643:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16643:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2094:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2094:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34932:228;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34932:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19978:534;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19978:534:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27572:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27572:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5970:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5970:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36161:789;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36161:789:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;36161:789:0;;;;;;;;;;;;;;;;;1116:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1116:114:0;;;;;;19163:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19163:537:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12216:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12216:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21521:271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21521:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2535:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2535:93:0;;;;;;321:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;321:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20649:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20649:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14244:282;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14244:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16041:468;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16041:468:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32324:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32324:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;32324:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32925:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32925:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25649:747;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25649:747:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22890:628;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22890:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27954:704;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27954:704:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34470:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34470:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9044:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9044:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28801:491;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28801:491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1398:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15313:422;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15313:422:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23756:589;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23756:589:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35350:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35350:374:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22040:663;22163:4;22275:21;22334:9;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;22193:20;;:7;:20;;;22185:29;;;;;;;;22233:28;22253:7;22233:19;:28::i;:::-;22225:37;;;;;;;;22299:8;:17;22308:7;22299:17;;;;;;;;;;;;;;;22275:41;;22346:1;22334:13;;22329:186;22353:6;:14;;:21;;;;22349:1;:25;22329:186;;;22421:7;22400:6;:14;;22415:1;22400:17;;;;;;;;;;;;;;;;;;:28;22396:108;;;22449:8;;;22396:108;22376:3;;;;;;;22329:186;;;22527:6;:14;;22547:7;22527:28;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;22527:28:0;;;;;;;;;;;;;;;;;;;;;;22566:6;:18;;22590:11;22566:36;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;22566:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22620:51;22641:7;22650;22659:11;22620:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22691:4;22684:11;;22040:663;;;;;;;:::o;21013:338::-;21086:15;21103:17;21122:19;17351:3;21167:20;;:7;:20;;;21159:29;;;;;;;;21223:8;:17;21232:7;21223:17;;;;;;;;;;;;;;;:25;;;21263:8;:17;21272:7;21263:17;;;;;;;;;;;;;;;:25;;21303:8;:17;21312:7;21303:17;;;;;;;;;;;;;;;:29;;21201:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:338;;;;;:::o;11333:35::-;;;;;;;;;;;;;:::o;32299:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34000:190::-;34122:4;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;13709:10;:22;13720:10;13709:22;;;;;;;;;;;;;;;;;;;;;;;;;13708:23;13700:32;;;;;;;;34151:31;34165:8;34175:6;34151:13;:31::i;:::-;34144:38;;34000:190;;;;:::o;26603:410::-;26706:4;26809:19;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;26753:1;26736:19;;:5;:19;;;;26728:28;;;;;;;;17351:3;26775:20;;:7;:20;;;26767:29;;;;;;;;26831:38;26854:5;26861:7;26831:22;:38::i;:::-;26809:60;;;;17351:3;26888:24;;:11;:24;26880:33;;;;;;;;26980:1;26926:14;:21;26941:5;26926:21;;;;;;;;;;;;;;;:38;;26965:11;26926:51;;;;;;;;;;;;;;;;;:55;;;;27001:4;26994:11;;26603:410;;;;;:::o;27163:282::-;27246:23;27271:26;27337:14;:24;27352:8;27337:24;;;;;;;;;;;;;;;:33;;27385:14;:24;27400:8;27385:24;;;;;;;;;;;;;;;:41;;27315:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27163:282;;;:::o;5186:85::-;5230:7;5253:12;;5246:19;;5186:85;:::o;24527:854::-;24607:7;24674:21;24937:26;24983:9;17351:3;24640:20;;:7;:20;;;24632:29;;;;;;;;24698:8;:17;24707:7;24698:17;;;;;;;;;;;;;;;24674:41;;24757:1;24732:6;:14;;:21;;;;:26;24728:67;;;24782:1;24775:8;;;;24728:67;24837:1;24819:6;:14;;;:19;:56;;;;24872:3;24855:6;:14;;;:20;24819:56;24815:110;;;17395:3;24892:21;;;;24815:110;24966:1;24937:30;;24995:1;24983:13;;24978:250;25002:6;:14;;:21;;;;24998:1;:25;24978:250;;;25090:3;25049:37;25068:6;:14;;25083:1;25068:17;;;;;;;;;;;;;;;;;;25049:6;:14;;;:18;;:37;;;;:::i;:::-;:44;;25045:172;;;25156:45;25179:6;:18;;25198:1;25179:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25156:45;;:18;:22;;:45;;;;:::i;:::-;25114:87;;25045:172;25025:3;;;;;;;24978:250;;;17395:3;25244:18;:35;25240:76;;;25303:1;25296:8;;;;25240:76;25335:38;25354:18;17395:3;25335:18;;:38;;;;:::i;:::-;25328:45;;24527:854;;;;;;;:::o;14752:39::-;;;;;;;;;;;;;:::o;33448:252::-;33585:4;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;13709:10;:22;13720:10;13709:22;;;;;;;;;;;;;;;;;;;;;;;;;13708:23;13700:32;;;;;;;;33616:10;:17;33627:5;33616:17;;;;;;;;;;;;;;;;;;;;;;;;;33615:18;33607:27;;;;;;;;33654:38;33673:5;33680:3;33685:6;33654:18;:38::i;:::-;33647:45;;33448:252;;;;;:::o;32351:21::-;;;;;;;;;;;;;:::o;13435:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;2715:95::-;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;2430:6;;;;;;;;;;;2422:15;;;;;;;;2778:5;2769:6;;:14;;;;;;;;;;;;;;;;;;2795:9;;;;;;;;;;2715:95::o;11770:326::-;11891:4;11506:5;;;;;;;;;;;11492:19;;:10;:19;;;11484:28;;;;;;;;11412:15;;;;;;;;;;;11411:16;11403:25;;;;;;;;11922;11939:7;11922:12;;:16;;:25;;;;:::i;:::-;11907:12;:40;;;;11970:26;11988:7;11970:8;:13;11979:3;11970:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;11954:8;:13;11963:3;11954:13;;;;;;;;;;;;;;;:42;;;;12013:3;12008:18;;;12018:7;12008:18;;;;;;;;;;;;;;;;;;12059:3;12038:34;;12055:1;12038:34;;;12064:7;12038:34;;;;;;;;;;;;;;;;;;12086:4;12079:11;;11770:326;;;;:::o;35863:98::-;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;35935:18;35946:6;35935:10;:18::i;:::-;35863:98;:::o;13857:278::-;13939:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;13980:5;;;;;;;;;;;13969:16;;:7;:16;;;;13961:25;;;;;;;;14006:10;:19;14017:7;14006:19;;;;;;;;;;;;;;;;;;;;;;;;;14005:20;13997:29;;;;;;;;14061:4;14039:10;:19;14050:7;14039:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;14095:7;14083:20;;;;;;;;;;;;14123:4;14116:11;;13857:278;;;:::o;16643:213::-;16740:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;14941:19;;;;;;;;;;;14940:20;14932:29;;;;;;;;16784:4;16762:19;;:26;;;;;;;;;;;;;;;;;;16806:18;;;;;;;;;;16844:4;16837:11;;16643:213;:::o;2094:26::-;;;;;;;;;;;;;:::o;34932:228::-;35073:4;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;13709:10;:22;13720:10;13709:22;;;;;;;;;;;;;;;;;;;;;;;;;13708:23;13700:32;;;;;;;;35102:50;35125:8;35135:16;35102:22;:50::i;:::-;35095:57;;34932:228;;;;:::o;19978:534::-;20098:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;20128:20;;:7;:20;;;20120:29;;;;;;;;20169:28;20189:7;20169:19;:28::i;:::-;20168:29;20160:38;;;;;;;;20235:1;20217:8;:15;:19;20209:28;;;;;;;;20278:1;20256:12;:19;:23;20248:32;;;;;;;;20318:12;:19;20299:8;:15;:38;20291:47;;;;;;;;20379:8;20351;:17;20360:7;20351:17;;;;;;;;;;;;;;;:25;;:36;;;;;;;;;;;;:::i;:::-;;20430:12;20398:8;:17;20407:7;20398:17;;;;;;;;;;;;;;;:29;;:44;;;;;;;;;;;;:::i;:::-;;20460:20;20472:7;20460:20;;;;;;;;;;;;;;;;;;;;;;20500:4;20493:11;;19978:534;;;;;:::o;27572:181::-;27658:7;27690:55;27713:31;27735:8;27713:21;:31::i;:::-;27690:8;:18;27699:8;27690:18;;;;;;;;;;;;;;;;:22;;:55;;;;:::i;:::-;27683:62;;27572:181;;;:::o;5970:101::-;6026:7;6049:8;:16;6058:6;6049:16;;;;;;;;;;;;;;;;6042:23;;5970:101;;;:::o;36161:789::-;36273:6;36428:21;36497:9;36640:24;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;36305:20;;:7;:20;;;36297:29;;;;;;;;36345:28;36365:7;36345:19;:28::i;:::-;36337:37;;;;;;;;36413:1;36393:10;:17;:21;36385:30;;;;;;;;36463:10;:17;36452:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36452:29:0;;;;36428:53;;36509:1;36497:13;;36492:424;36516:10;:17;36512:1;:21;36492:424;;;36568:5;36555:7;36563:1;36555:10;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;36617:1;36592:27;;:10;36603:1;36592:13;;;;;;;;;;;;;;;;;;:27;;;;36588:317;;;36667:34;36687:10;36698:1;36687:13;;;;;;;;;;;;;;;;;;36667:19;:34::i;:::-;36640:61;;36753:1;36734:16;:20;36720:7;36728:1;36720:10;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;36778:7;36786:1;36778:10;;;;;;;;;;;;;;;;;;36774:116;;;36813:57;36829:10;36840:1;36829:13;;;;;;;;;;;;;;;;;;36844:16;36862:7;36813:15;:57::i;:::-;36774:116;36588:317;36535:3;;;;;;;36492:424;;;36935:7;36928:14;;36161:789;;;;;;;:::o;1116:114::-;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;1193:5;;;;;;;;;;;1174:25;;;;;;;;;;;;1222:1;1206:5;;:18;;;;;;;;;;;;;;;;;;1116:114::o;19163:537::-;19281:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;19326:1;19311:17;;:3;:17;;;;19303:26;;;;;;;;19358:8;:15;19367:5;;;;;;;;;;;19358:15;;;;;;;;;;;;;;;;19348:6;:25;;19340:34;;;;;;;;17351:3;19393:20;;:7;:20;;;19385:29;;;;;;;;19433:28;19453:7;19433:19;:28::i;:::-;19425:37;;;;;;;;19493:27;19513:6;19493:8;:15;19502:5;;;;;;;;;;;19493:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;19475:8;:15;19484:5;;;;;;;;;;;19475:15;;;;;;;;;;;;;;;:45;;;;19547:25;19565:6;19547:8;:13;19556:3;19547:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;19531:8;:13;19540:3;19531:13;;;;;;;;;;;;;;;:41;;;;19585:37;19601:3;19606:6;19614:7;19585:15;:37::i;:::-;19656:3;19640:28;;19649:5;;;;;;;;;;;19640:28;;;19661:6;19640:28;;;;;;;;;;;;;;;;;;19688:4;19681:11;;19163:537;;;;;:::o;12216:144::-;12275:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;11412:15;;;;;;;;;;;11411:16;11403:25;;;;;;;;12306:4;12288:15;;:22;;;;;;;;;;;;;;;;;;12322:14;;;;;;;;;;12350:4;12343:11;;12216:144;:::o;21521:271::-;21615:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;21645:20;;:7;:20;;;21637:29;;;;;;;;21685:28;21705:7;21685:19;:28::i;:::-;21677:37;;;;;;;;21755:5;21727:8;:17;21736:7;21727:17;;;;;;;;;;;;;;;:25;;:33;;;;21780:4;21773:11;;21521:271;;;;:::o;2535:93::-;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;2599:4;2590:6;;:13;;;;;;;;;;;;;;;;;;2615:7;;;;;;;;;;2535:93::o;321:20::-;;;;;;;;;;;;;:::o;20649:241::-;20730:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;20760:20;;:7;:20;;;20752:29;;;;;;;;20801:8;:17;20810:7;20801:17;;;;;;;;;;;;;;;;20794:24;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;20836:22;20850:7;20836:22;;;;;;;;;;;;;;;;;;;;;;20878:4;20871:11;;20649:241;;;:::o;14244:282::-;14328:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;14369:5;;;;;;;;;;;14358:16;;:7;:16;;;;14350:25;;;;;;;;14394:10;:19;14405:7;14394:19;;;;;;;;;;;;;;;;;;;;;;;;;14386:28;;;;;;;;14449:5;14427:10;:19;14438:7;14427:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;14486:7;14472:22;;;;;;;;;;;;14514:4;14507:11;;14244:282;;;:::o;16041:468::-;16184:4;15055:5;;;;;;;;;;;15041:19;;:10;:19;;;15033:28;;;;;;;;14941:19;;;;;;;;;;;14940:20;14932:29;;;;;;;;16224:8;:15;16233:5;16224:15;;;;;;;;;;;;;;;;16214:6;:25;;16206:34;;;;;;;;16274:1;16259:17;;:3;:17;;;;16251:26;;;;;;;;16308:27;16328:6;16308:8;:15;16317:5;16308:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;16290:8;:15;16299:5;16290:15;;;;;;;;;;;;;;;:45;;;;16362:25;16380:6;16362:8;:13;16371:3;16362:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;16346:8;:13;16355:3;16346:13;;;;;;;;;;;;;;;:41;;;;16421:3;16405:28;;16414:5;16405:28;;;16426:6;16405:28;;;;;;;;;;;;;;;;;;16449;16458:5;16465:3;16470:6;16449:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16497:4;16490:11;;16041:468;;;;;:::o;32324:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32925:182::-;33043:4;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;13709:10;:22;13720:10;13709:22;;;;;;;;;;;;;;;;;;;;;;;;;13708:23;13700:32;;;;;;;;33072:27;33087:3;33092:6;33072:14;:27::i;:::-;33065:34;;32925:182;;;;:::o;25649:747::-;25774:4;26072:23;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;25821:1;25804:19;;:5;:19;;;;25796:28;;;;;;;;25858:10;25843:25;;:11;:25;;;;25835:34;;;;;;;;17351:3;25888:24;;:11;:24;;;25880:33;;;;;;;;25932:32;25952:11;25932:19;:32::i;:::-;25924:41;;;;;;;;17351:3;25984:23;;:10;:23;;;25976:32;;;;;;;;26027:31;26047:10;26027:19;:31::i;:::-;26019:40;;;;;;;;26098:42;26121:5;26128:11;26098:22;:42::i;:::-;26072:68;;;;17351:3;26159:28;;:15;:28;26151:37;;;;;;;;26201:91;26217:5;26224:14;:21;26239:5;26224:21;;;;;;;;;;;;;;;:38;;26263:15;26224:55;;;;;;;;;;;;;;;;;;26281:10;26201:15;:91::i;:::-;26363:1;26305:14;:21;26320:5;26305:21;;;;;;;;;;;;;;;:38;;26344:15;26305:55;;;;;;;;;;;;;;;;;:59;;;;26384:4;26377:11;;25649:747;;;;;;:::o;22890:628::-;22997:4;23061:21;23128:9;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;23027:20;;:7;:20;;;23019:29;;;;;;;;23085:8;:17;23094:7;23085:17;;;;;;;;;;;;;;;23061:41;;23140:1;23128:13;;23123:342;23147:6;:14;;:21;;;;23143:1;:25;23123:342;;;23215:7;23194:6;:14;;23209:1;23194:17;;;;;;;;;;;;;;;;;;:28;23190:264;;;23243:38;23263:6;:14;;23279:1;23243:19;:38::i;:::-;;23300:40;23318:6;:18;;23338:1;23300:17;:40::i;:::-;;23366;23389:7;23398;23366:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;23434:4;23427:11;;;;23190:264;23170:3;;;;;;;23123:342;;;23477:8;;;837:1;22890:628;;;;;;:::o;27954:704::-;28052:7;28119:19;28271:35;28445:24;17351:3;28085:20;;:7;:20;;;28077:29;;;;;;;;28141:41;28164:8;28174:7;28141:22;:41::i;:::-;28119:63;;;;17351:3;28197:25;;:11;:25;;28193:66;;;28246:1;28239:8;;;;28193:66;28309:14;:24;28324:8;28309:24;;;;;;;;;;;;;;;28271:62;;28395:1;28348:13;:30;;28379:11;28348:43;;;;;;;;;;;;;;;;;;:48;28344:89;;;28420:1;28413:8;;;;28344:89;28485:62;28511:13;:22;;28534:11;28511:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28485:25;:62::i;:::-;28445:102;;28565:85;28633:16;28565:63;17395:3;28565:13;:30;;28596:11;28565:43;;;;;;;;;;;;;;;;;;:47;;:63;;;;:::i;:::-;:67;;:85;;;;:::i;:::-;28558:92;;27954:704;;;;;;;;:::o;34470:218::-;34606:4;2270:6;;;;;;;;;;;2269:7;2261:16;;;;;;;;13709:10;:22;13720:10;13709:22;;;;;;;;;;;;;;;;;;;;;;;;;13708:23;13700:32;;;;;;;;34635:45;34658:8;34668:11;34635:22;:45::i;:::-;34628:52;;34470:218;;;;:::o;9044:162::-;9149:7;9175;:15;9183:6;9175:15;;;;;;;;;;;;;;;:25;9191:8;9175:25;;;;;;;;;;;;;;;;9168:32;;9044:162;;;;:::o;28801:491::-;28889:7;28914:35;28989:26;29035:9;28952:14;:24;28967:8;28952:24;;;;;;;;;;;;;;;28914:62;;29018:1;28989:30;;29047:1;29035:13;;29030:217;29054:13;:22;;:29;;;;29050:1;:33;29030:217;;;29126:109;29167:53;29184:8;29194:13;:22;;29217:1;29194:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29167:16;:53::i;:::-;29126:18;:22;;:109;;;;:::i;:::-;29105:130;;29085:3;;;;;;;29030:217;;;29266:18;29259:25;;28801:491;;;;;;:::o;1398:105::-;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;1468:29;1487:9;1468:18;:29::i;:::-;1398:105;:::o;15313:422::-;15439:4;15055:5;;;;;;;;;;;15041:19;;:10;:19;;;15033:28;;;;;;;;14941:19;;;;;;;;;;;14940:20;14932:29;;;;;;;;15479:8;:15;15488:5;15479:15;;;;;;;;;;;;;;;;15469:6;:25;;15461:34;;;;;;;;15526:27;15546:6;15526:8;:15;15535:5;15526:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;15508:8;:15;15517:5;15508:15;;;;;;;;;;;;;;;:45;;;;15582:27;15602:6;15582:8;:15;15591:5;;;;;;;;;;;15582:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;15564:8;:15;15573:5;;;;;;;;;;;15564:15;;;;;;;;;;;;;;;:45;;;;15643:5;;;;;;;;;;;15627:30;;15636:5;15627:30;;;15650:6;15627:30;;;;;;;;;;;;;;;;;;15673;15682:5;15689;;;;;;;;;;;15696:6;15673:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15723:4;15716:11;;15313:422;;;;:::o;23756:589::-;23882:4;23946:21;24003:9;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;17351:3;23912:20;;:7;:20;;;23904:29;;;;;;;;23970:8;:17;23979:7;23970:17;;;;;;;;;;;;;;;23946:41;;24015:1;24003:13;;23998:294;24022:6;:14;;:21;;;;24018:1;:25;23998:294;;;24090:7;24069:6;:14;;24084:1;24069:17;;;;;;;;;;;;;;;;;;:28;24065:216;;;24142:11;24118:6;:18;;24137:1;24118:21;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;24179:54;24203:7;24212;24221:11;24179:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24261:4;24254:11;;;;24065:216;24045:3;;;;;;;23998:294;;;24304:8;;;837:1;23756:589;;;;;;;:::o;35350:374::-;35443:4;824:5;;;;;;;;;;;810:19;;:10;:19;;;802:28;;;;;;;;35488:1;35473:17;;:3;:17;;;;35465:26;;;;;;;;35520:8;:15;35529:5;;;;;;;;;;;35520:15;;;;;;;;;;;;;;;;35510:6;:25;;35502:34;;;;;;;;35567:27;35587:6;35567:8;:15;35576:5;;;;;;;;;;;35567:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;35549:8;:15;35558:5;;;;;;;;;;;35549:15;;;;;;;;;;;;;;;:45;;;;35621:25;35639:6;35621:8;:13;35630:3;35621:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;35605:8;:13;35614:3;35605:13;;;;;;;;;;;;;;;:41;;;;35680:3;35664:28;;35673:5;;;;;;;;;;;35664:28;;;35685:6;35664:28;;;;;;;;;;;;;;;;;;35712:4;35705:11;;35350:374;;;;:::o;29409:160::-;29494:4;29559:1;29524:8;:17;29533:7;29524:17;;;;;;;;;;;;;;;:25;;:32;;;;:36;29516:45;;29409:160;;;:::o;8525:192::-;8592:4;8637:6;8605:7;:19;8613:10;8605:19;;;;;;;;;;;;;;;:29;8625:8;8605:29;;;;;;;;;;;;;;;:38;;;;8676:8;8655:38;;8664:10;8655:38;;;8686:6;8655:38;;;;;;;;;;;;;;;;;;8707:4;8700:11;;8525:192;;;;:::o;29774:440::-;29875:5;29940:35;30013:7;17351:3;29906:20;;:7;:20;;;29898:29;;;;;;;;29978:14;:19;29993:3;29978:19;;;;;;;;;;;;;;;29940:57;;30023:1;30013:11;;30008:169;30030:13;:22;;:29;;;;30026:1;:33;;;30008:169;;;30114:7;30085:36;;:13;:22;;30108:1;30085:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;30081:85;;;30149:1;30142:8;;;;30081:85;30061:3;;;;;;;30008:169;;;17351:3;30189:17;;29774:440;;;;;;;:::o;4653:132::-;4713:9;4740:2;4735;:7;4731:11;;4761:2;4756:1;:7;;4749:15;;;;;;4778:1;4771:8;;4653:132;;;;:::o;4467:119::-;4527:7;4556:2;4550;:8;;4543:16;;;;;;4578:2;4573;:7;4566:14;;4467:119;;;;:::o;18636:224::-;18727:4;18787:6;18757:26;18777:5;18757:19;:26::i;:::-;:36;;18749:45;;;;;;;;18814:38;18833:5;18840:3;18845:6;18814:18;:38::i;:::-;18807:45;;18636:224;;;;;:::o;12761:75::-;12805:25;12811:10;12823:6;12805:5;:25::i;:::-;12761:75;:::o;10444:447::-;10555:4;10571:16;10590:7;:19;10598:10;10590:19;;;;;;;;;;;;;;;:29;10610:8;10590:29;;;;;;;;;;;;;;;;10571:48;;10650:8;10630:16;:28;;10626:169;;;10701:1;10669:7;:19;10677:10;10669:19;;;;;;;;;;;;;;;:29;10689:8;10669:29;;;;;;;;;;;;;;;:33;;;;10626:169;;;10757:30;10770:16;10757:8;:12;;:30;;;;:::i;:::-;10725:7;:19;10733:10;10725:19;;;;;;;;;;;;;;;:29;10745:8;10725:29;;;;;;;;;;;;;;;:62;;;;10626:169;10827:8;10806:61;;10815:10;10806:61;;;10837:7;:19;10845:10;10837:19;;;;;;;;;;;;;;;:29;10857:8;10837:29;;;;;;;;;;;;;;;;10806:61;;;;;;;;;;;;;;;;;;10881:4;10874:11;;10444:447;;;;;:::o;30440:495::-;30534:17;30554:36;30577:3;30582:7;30554:22;:36::i;:::-;30534:56;;17351:3;30605:24;;:11;:24;;;30601:327;;;30716:61;30770:6;30716:14;:19;30731:3;30716:19;;;;;;;;;;;;;;;:36;;30753:11;30716:49;;;;;;;;;;;;;;;;;;;;:53;;:61;;;;:::i;:::-;30646:14;:19;30661:3;30646:19;;;;;;;;;;;;;;;:36;;30683:11;30646:49;;;;;;;;;;;;;;;;;;;:131;;;;30601:327;;;30810:14;:19;30825:3;30810:19;;;;;;;;;;;;;;;:28;;30844:7;30810:42;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;30810:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30867:14;:19;30882:3;30867:19;;;;;;;;;;;;;;;:36;;30909:6;30867:49;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;30867:49:0;;;;;;;;;;;;;;;;;;;;;;30601:327;30440:495;;;;:::o;18099:199::-;18171:4;18236:6;18201:31;18221:10;18201:19;:31::i;:::-;:41;;18193:50;;;;;;;;18263:27;18278:3;18283:6;18263:14;:27::i;:::-;18256:34;;18099:199;;;;:::o;31079:407::-;31177:4;31284:9;31220:6;31203;:13;;;;:23;;31199:68;;;31250:5;31243:12;;;;31199:68;31296:6;31284:18;;31279:105;31324:1;31308:6;:13;;;;:17;31304:1;:21;31279:105;;;31359:6;31370:1;31366;:5;31359:13;;;;;;;;;;;;;;;;;;31347:6;31354:1;31347:9;;;;;;;;;;;;;;;;;:25;;;;31327:3;;;;;;;31279:105;;;31403:6;31426:1;31410:6;:13;;;;:17;31403:25;;;;;;;;;;;;;;;;;31396:32;;;31439:6;:15;;;;;;;;;;;;:::i;:::-;;31474:4;31467:11;;31079:407;;;;;;:::o;31628:403::-;31722:4;31829:9;31765:6;31748;:13;;;;:23;;31744:68;;;31795:5;31788:12;;;;31744:68;31841:6;31829:18;;31824:105;31869:1;31853:6;:13;;;;:17;31849:1;:21;31824:105;;;31904:6;31915:1;31911;:5;31904:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:6;31899:1;31892:9;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;31872:3;;;;;;;31824:105;;;31948:6;31971:1;31955:6;:13;;;;:17;31948:25;;;;;;;;;;;;;;;;;;;;;;;;;;31941:32;;;;;;;;;;;31984:6;:15;;;;;;;;;;;;:::i;:::-;;32019:4;32012:11;;31628:403;;;;;;:::o;4062:288::-;4122:7;4342:2;4337;:7;;;;;;;;4330:14;;4062:288;;;;:::o;3584:391::-;3644:9;3880:1;3874:2;:7;3870:38;;;3899:1;3892:8;;;;3870:38;3925:2;3920;:7;3916:11;;3951:2;3945;3941:1;:6;;;;;;;;:12;3934:20;;;;;;3968:1;3961:8;;3584:391;;;;;:::o;9669:307::-;9775:4;9832:46;9866:11;9832:7;:19;9840:10;9832:19;;;;;;;;;;;;;;;:29;9852:8;9832:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;9791:7;:19;9799:10;9791:19;;;;;;;;;;;;;;;:29;9811:8;9791:29;;;;;;;;;;;;;;;:88;;;;9912:8;9891:61;;9900:10;9891:61;;;9922:7;:19;9930:10;9922:19;;;;;;;;;;;;;;;:29;9942:8;9922:29;;;;;;;;;;;;;;;;9891:61;;;;;;;;;;;;;;;;;;9966:4;9959:11;;9669:307;;;;:::o;1644:175::-;1736:1;1715:23;;:9;:23;;;;1707:32;;;;;;;;1779:9;1751:38;;1772:5;;;;;;;;;;;1751:38;;;;;;;;;;;;1804:9;1796:5;;:17;;;;;;;;;;;;;;;;;;1644:175;:::o;7409:487::-;7521:4;7555:8;:15;7564:5;7555:15;;;;;;;;;;;;;;;;7545:6;:25;;7537:34;;;;;;;;7596:7;:14;7604:5;7596:14;;;;;;;;;;;;;;;:26;7611:10;7596:26;;;;;;;;;;;;;;;;7586:6;:36;;7578:45;;;;;;;;7653:1;7638:17;;:3;:17;;;;7630:26;;;;;;;;7683:27;7703:6;7683:8;:15;7692:5;7683:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;7665:8;:15;7674:5;7665:15;;;;;;;;;;;;;;;:45;;;;7733:25;7751:6;7733:8;:13;7742:3;7733:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;7717:8;:13;7726:3;7717:13;;;;;;;;;;;;;;;:41;;;;7794:38;7825:6;7794:7;:14;7802:5;7794:14;;;;;;;;;;;;;;;:26;7809:10;7794:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;7765:7;:14;7773:5;7765:14;;;;;;;;;;;;;;;:26;7780:10;7765:26;;;;;;;;;;;;;;;:67;;;;7860:3;7844:28;;7853:5;7844:28;;;7865:6;7844:28;;;;;;;;;;;;;;;;;;7886:4;7879:11;;7409:487;;;;;:::o;12842:447::-;12921:8;:14;12930:4;12921:14;;;;;;;;;;;;;;;;12911:6;:24;;12903:33;;;;;;;;13135:26;13154:6;13135:8;:14;13144:4;13135:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;13118:8;:14;13127:4;13118:14;;;;;;;;;;;;;;;:43;;;;13183:24;13200:6;13183:12;;:16;;:24;;;;:::i;:::-;13168:12;:39;;;;13224:4;13219:18;;;13230:6;13219:18;;;;;;;;;;;;;;;;;;13272:1;13249:34;;13258:4;13249:34;;;13276:6;13249:34;;;;;;;;;;;;;;;;;;12842:447;;:::o;5432:329::-;5495:4;5526:8;:20;5535:10;5526:20;;;;;;;;;;;;;;;;5516:6;:30;;5508:39;;;;;;;;5577:1;5562:17;;:3;:17;;;;5554:26;;;;;;;;5612:32;5637:6;5612:8;:20;5621:10;5612:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;5589:8;:20;5598:10;5589:20;;;;;;;;;;;;;;;:55;;;;5667:25;5685:6;5667:8;:13;5676:3;5667:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;5651:8;:13;5660:3;5651:13;;;;;;;;;;;;;;;:41;;;;5725:3;5704:33;;5713:10;5704:33;;;5730:6;5704:33;;;;;;;;;;;;;;;;;;5751:4;5744:11;;5432:329;;;;:::o;32097:4856::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://288a8b449a776ed6bc35da051efb14f4b1d2161d1a17a2bf46eda7f527a9c91a
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.