#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <ctime>

#include <queue>
#include <stack>
#include <map>
#include <set>

#include <cmath>
#include <algorithm>
#include <cstring>
#include <functional>
#include <cctype>
#include <numeric>

using namespace std;

template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){
    os << "{ ";
    for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it)
        os << '"' << *it << '"' << (it+1==v.end() ? "" : ", ");
    os << " }";
    return os;
}

typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vi> vvi;
typedef vector<vb> vvb;
typedef long long ll;
typedef unsigned uint;
typedef unsigned long ul;
typedef unsigned long long ull;

#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define loop(i,a,b) for(int i=(a); i<(int)(b); i++)
#define rep(i,b) loop(i,0,b)
#define repi(i,b) loop(i,1,b+1)
#define pb push_back
#define mp make_pair

pair<int,int> solve(const vvb& G){
    // 0 is free
    // 1 is obstacle
    int h = G.size(), w = G[0].size();
    vvi dp(h,vi(w));
    rep(y,h)rep(x,w){
        if(!G[y][x]) {
            if(x!=0) dp[y][x] = dp[y][x-1]+1;
            else dp[y][x] = 1;
        } else {
            dp[y][x] = 0;
        }
    }

    const int inf = 1<<30;
    int tans = 0;
    pair<int,int> ans;
    rep(x,w)rep(y,h){
        int th = 0;
        int tw = inf;
        loop(cy,y,h){
            th++;
            tw = min(tw, dp[cy][x]);
            if(th * tw > tans){
                tans = th*tw;
                ans = make_pair(tw,th);
            }
        }
    }
    return ans;
}

int main(){
    int h,w;
    while(cin>>h>>w, w||w){
        vs G(h);
        rep(i,h) cin>>G[i];
        vvb isobs(h,vb(w));
        rep(i,h)rep(j,w) isobs[i][j] = G[i][j]=='*';
        auto ans = solve(isobs);
        cout << ans.first * ans.second << endl;
    }
}