function buyTokens( address _beneficiary ) 
    public 
    payable 
    returns (bool)
    {
        require(direct_drop_switch);
        require(_beneficiary != address(0));

        
        if( direct_drop_range )
        {
            
            
            require(block.timestamp >= direct_drop_range_start && block.timestamp <= direct_drop_range_end);

        }
        
        
        
        
        uint256 tokenAmount = div(mul(msg.value,direct_drop_rate ), 10**18); 
        uint256 decimalsAmount = mul( 10**uint256(decimals), tokenAmount);
        
        
        require
        (
            balances[direct_drop_address] >= decimalsAmount
        );

        assert
        (
            decimalsAmount > 0
        );

        
        
        uint256 all = add(balances[direct_drop_address], balances[_beneficiary]);

        balances[direct_drop_address] = sub(balances[direct_drop_address], decimalsAmount);

            

        balances[_beneficiary] = add(balances[_beneficiary], decimalsAmount);
        
        assert
        (
            all == add(balances[direct_drop_address], balances[_beneficiary])
        );

        
        emit TokenPurchase
        (
            msg.sender,
            _beneficiary,
            msg.value,
            tokenAmount
        );

        return true;

    }