contract Steel is StandardToken, Ownable {

    using SafeMath for uint256;
    string public constant ContractName = "TokenSteel";
    string public constant name = "Steel";
    string public constant symbol = "STL";
    uint8 public constant decimals = 18;
    uint256 public constant INITIAL_SUPPLY = 35000000000 * (10 ** uint256(decimals));
    mapping(address => uint256) freezeOf;
    event Burn(address indexed burner, uint256 value);
    event Freeze(address freeze, uint256 value);
    event Unfreeze(address unfreeze, uint256 value);

   /**
   * @dev Constructor that gives msg.sender all of existing tokens.
   */
    function Steel() public {
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
        Transfer(0x0, msg.sender, INITIAL_SUPPLY);
    }

    function burn(uint256 _value) public onlyOwner {
        require(_value <= balances[msg.sender]);
        // 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
        address burner = msg.sender;
        balances[burner] = balances[burner].sub(_value);
        totalSupply_ = totalSupply_.sub(_value);
        Burn(burner, _value);
    }

    function freeze(uint256 _value) public onlyOwner returns (bool success) {
        require(_value > 0);
        require(_value <= balances[msg.sender]);
        balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value);// Subtract from the sender
        freezeOf[msg.sender] = SafeMath.add(freezeOf[msg.sender], _value);       
        Freeze(msg.sender, _value);
        return true;
    }

    function unfreeze(uint256 _value) public onlyOwner returns (bool success) {
        require(_value > 0);
        require(_value <= freezeOf[msg.sender]);
        freezeOf[msg.sender] = SafeMath.sub(freezeOf[msg.sender], _value);// Subtract from the sender
        balances[msg.sender] = SafeMath.add(balances[msg.sender], _value);
        Unfreeze(msg.sender, _value);
        return true;
    }
}
function Steel() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    Transfer(0x0, msg.sender, INITIAL_SUPPLY);
}

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