#include "bits/stdc++.h"
#include<unordered_map>
#include<unordered_set>
#pragma warning(disable:4996)
using namespace std;
using ld = long double;
template<class T>
using Table = vector<vector<T>>;
const ld eps=1e-9;

//// < "D:\D_Download\Visual Studio 2015\Projects\programing_contest_c++\Debug\a.txt" > "D:\D_Download\Visual Studio 2015\Projects\programing_contest_c++\Debug\b.answer"

int getmax( const vector<int>&field) {
	int ans = 0;

	//l,h
	stack<pair<int, int>>que;
	que.emplace(0, 0);
	for (int x = 0; x < field.size(); ++x) {
		const int nowh = field[x];
		while (!que.empty()) {
			const int prevh = que.top().second;
			if (nowh > prevh) {
				que.emplace(x, nowh);
				break;
			}
			else if (nowh == prevh) {
				break;
			}
			else {
				auto p(que.top());
				que.pop();
				ans = max(ans, p.second*(x - p.first));
				if (!que.empty() && que.top().second < nowh) {
					que.emplace(p.first, nowh);
					break;
				}
			}
		}
	}
	{
		int x = field.size();
		const int nowh = 0;
		while (!que.empty()) {
			const int prevh = que.top().second;
			if (nowh > prevh) {
				que.emplace(x, nowh);
				break;
			}
			else if (nowh == prevh) {
				break;
			}
			else {
				auto p(que.top());
				que.pop();
				ans = max(ans, int(p.second*(x- p.first)));
				if (!que.empty() && que.top().second < nowh) {
					que.emplace(p.first, nowh);
					break;
				}
			}
		}
	}
	return ans;
}

int main() {
	while (1) {
		int H, W; cin >> H >> W;
		if (!H)break;
		vector<vector<int>>field(H, vector<int>(W));
		for (int i = 0; i < H; ++i) {
			string st; cin >> st;
			for (int j = 0; j < W; ++j) {
				field[i][j] = st[j] == '.';
			}
		}
		for (int x = 0; x < W; ++x) {
			for (int y = 1; y < H; ++y) {
				if (field[y][x]) {
					field[y][x] += field[y - 1][x];
				}
			}
		}
		int ans = 0;
		for (int d = 0; d < H; ++d) {
			ans = max(ans, getmax(field[d]));
		}
		cout << ans << endl;
	}
	return 0;
}