#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

struct Rectangle
{
	int height;
	int pos;
};

string st[501];
int w[501][501];

int getLargestRectangle(int size,int buffer[])
{
	stack<Rectangle> S;
	int maxv = 0;
	buffer[size] = 0;

	rep(i,size+1)
	{
		Rectangle rect;
		rect.height = buffer[i];
		rect.pos = i;
		if(S.empty())
		{
			S.push(rect);
		}
		else
		{
			if(S.top().height < rect.height)
			{
				S.push(rect);
			}
			else if(S.top().height > rect.height)
			{
				int target = i;
				while(!S.empty() && S.top().height >= rect.height)
				{
					Rectangle pre = S.top();
					S.pop();
					int area = pre.height * (i - pre.pos);
					maxv = max(maxv,area);
					target = pre.pos;
				}

				rect.pos = target;
				S.push(rect);

			}
		}
	}
	return maxv;
}

int getLargestRectangle(int n,int m)
{
	rep(i,n)
	{
		rep(j,m)
		{
			w[i][j] = 0;
		}
	}

	rep(j,m)
	{
		int sequence = 0;
		rep(i,n)
		{
			if(st[i][j] == '*')
			{
				sequence = w[i][j] = 0;
			}
			else
			{
				w[i][j] = ++sequence;
			}
		}
	}

	int maxv = 0;
	rep(i,n)
	{
		maxv = max(maxv,getLargestRectangle(m,w[i]));
	}
	return maxv;
}

int main()
{
	int n,m;
	while(cin >> n >> m && n && m)
	{
		memset(w,0,sizeof(w));
		rep(i,n)
		{
			cin >> st[i];
		}

		rep(i,n)
		{
			rep(j,m)
			{
				if(st[i][j] == '*') w[i][j] = 0;
				else w[i][j] = 1;
			}
		}

		cout << getLargestRectangle(n,m) << endl;
	}
	return 0;
}