#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#include<climits>
using namespace std;

enum{BLANK='.',WALL='*'};
struct Data{int height,pos;};

int main()
{
  int W,H,ans;
  vector<string>field;
  vector< vector<int> >dp;
  while(cin>>H>>W,H|W){
    field.resize(H);
    for(int i=0;i<H;i++)cin>>field[i];
    dp.resize(H);
    for(int i=0;i<H;i++)dp[i].resize(W+1);
    for(int j=0;j<W;j++)dp[0][j] = (field[0][j]==WALL)?0:1;
    for(int i=0;i<H;i++)dp[i][W] = INT_MIN;
    for(int i=1;i<H;i++)for(int j=0;j<W;j++)dp[i][j] = (field[i][j]==WALL)?0:dp[i-1][j]+1;

    //for(int i=0;i<H;i++,puts(""))for(int j=0;j<W+1;j++)cout<<dp[i][j]<<", ";

    ans=0;
    for(int i=0;i<H;i++){
      stack<Data>s;
      for(int j=0;j<W+1;j++){
	Data d1={dp[i][j],j},d2;
	int newPos;
	if(s.empty()){
	  s.push(d1);
	}else if(s.top().height < d1.height){
	  s.push(d1);
	}else if(s.top().height == d1.height){
	}else if(s.top().height > d1.height){
	  d2=d1;
	  while(!s.empty() && s.top().height >= d1.height){
	    d2=s.top();
	    s.pop();
	    ans = max(ans, (d1.pos-d2.pos)*d2.height);
	    newPos=d2.pos;
	  }
	  d1.pos=newPos;
	  s.push(d1);
	}
      }
    }
    cout<<ans<<endl;
  }
}