#include <cstdio>
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int MAX_N = 505;
const int BLOCK = 1;

struct Rect{
	int h, pos;
	Rect(int h_, int pos_){
		h = h_; pos = pos_;
	}
	Rect(){}
};

int getLargestRectangle(vector<int> buffer){
	int size = buffer.size();
	stack<Rect> S;
	int maxv = 0;
	buffer.push_back( 0 );
	
	for(int i = 0 ; i <= size ; i++ ){
		Rect rect( buffer[i] , i );
		if ( S.empty() ){
			S.push( rect );
		}else{
			if( S.top().h < rect.h ){
				S.push( rect );
			}else if( S.top().h > rect.h ){
				int target = i;
				while ( !S.empty() && S.top().h >= rect.h ){
					Rect prev = S.top(); S.pop();
					int area = prev.h * (i - prev.pos);
					maxv = max( maxv , area );
					target = prev.pos;
				}
				rect.pos = target;
				S.push(rect);
			}
		}
	}
	return maxv;
}
 
int N;
int buffer[MAX_N][MAX_N];
 
int getLargestRectangle(){
	vector<int> T[MAX_N];
	for(int i=0 ; i < N ; i++ ){
		T[i] = vector<int>(N);
	} 
	
	for(int j = 0 ; j < N ; j++ ){
		int sequence = 0;
		for(int i = 0 ; i < N ; i++ ){
			if( buffer[i][j] == BLOCK ){
				sequence = T[i][j] = 0;
			}else{
				T[i][j] = ++sequence;
			}
		}
	}
	    
	int maxv = 0;
	for(int i = 0 ; i < N ; i++ ){
		maxv = max( maxv, getLargestRectangle( T[i] ) );
	}
    
	return maxv;
}
 
int main(){
	int w, h;
	while( cin >> h >> w , w || h ){
		N = max(w,h);
		vector<string> s(h);
		for(int y=0 ; y < h ; y++ ){
			cin >> s[y];
		}
		
		for(int y = 0 ; y < h ; y++ ){
			for(int x = 0; x < w ; x++ ){
				buffer[y][x] = 1;
			}
		}
		for(int y = 0 ; y < h ; y++ ){
			for(int x = 0; x < w ; x++ ){
				buffer[y][x] = (s[y][x] == '.')? 0 : 1 ;
			}
		}
		// 0 or 1 の値の二次元配列 bufferで1のみで構成される最大の長方形の面積を出力
		cout << getLargestRectangle() << endl;
	}
}