#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES

#include <iostream>
#include <algorithm>
#include <functional>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <numeric>
#include <ctime>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <stdlib.h>
#include <map>

using namespace std;
typedef long long int lint;

class Rect{
public:
	int height;
	int pos;
	Rect(int h, int p){
		height = h; pos = p;
	}
	Rect(){
		height = pos = 0;
	}
};

int area(int W, int* m)
{
	int ret = 0;
	stack<Rect> s;

	for (int i = 0; i <= W; i++){
		if (s.empty()){
			s.push(Rect(m[i], i));
		}
		else{
			if (s.top().height < m[i]){
				s.push(Rect(m[i], i));
			}
			else if (s.top().height > m[i]){
				Rect r;
				while (!s.empty() && s.top().height >= m[i]){
					r = s.top();
					s.pop();
					int buf = r.height * (i - r.pos);
					if (buf > ret) ret = buf;
				}
				r.height = m[i];
				s.push(r);
			}
		}
	}
	return ret;
}

int solve(int H, int W, int** m)
{
	int ret = 0;
	for (int j = 0; j < W; j++){
		int h = 0;
		for (int i = 0; i < H; i++){
			if (m[i][j] != 0){
				h++;
				m[i][j] = h;
			}
			else {
				h = 0;
			}
		}
	}

	for (int i = 0; i < H; i++){
		int buf = area(W, m[i]);
		if (buf > ret) ret = buf;
	}

	return ret;
}

int main()
{
	//clock_t start = clock();

	while (1)
	{
		int H, W;
		cin >> H >> W;
		if (H == 0) break;
		int** m = new int*[H];
		for (int i = 0; i < H; i++) m[i] = new int[W + 1];

		for (int i = 0; i < H; i++){
			string str;
			cin >> str;
			for (int j = 0; j < W; j++) m[i][j] = ((str[j] == '.') ? 1 : 0);
			m[i][W] = 0;
		}

		cout << solve(H, W, m) << endl;

		for (int i = 0; i < H; i++) delete[] m[i];
		delete[] m;
	}
	
	//clock_t end = clock();
	//std::cout << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n";

	return 0;
}