Given a matrix (H × W) which contains only 1 and 0, find the area of the largest rectangle which only contains 0s.

Constraints

* 1 ≤ H, W ≤ 1,400

Input


H W
c1,1 c1,2 ... c1,W
c2,1 c2,2 ... c2,W
:
cH,1 cH,2 ... cH,W


In the first line, two integers H and W separated by a space character are given. In the following H lines, ci,j, elements of the H × W matrix, are given.

Output

Print the area (the number of 0s) of the largest rectangle.

Example

Input

4 5
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 1 0


Output

6
#include <bits/stdc++.h>

using namespace std;

#define rep2(x,fr,to) for(int (x)=(fr);(x)<(to);(x)++)
#define rep(x,to) for(int (x)=0;(x)<(to);(x)++)
#define repr(x,fr,to) for(int (x)=(fr);(x)>=(to);(x)--)
#define all(c) (c).begin(),(c).end()
#define sz(v) (int)(v).size()

typedef long long ll; typedef vector<int> VI; typedef pair<int,int> pii;
const ll mod = 1e9+7;

int max_rectangle(const vector<int>& vec) {
	int rtn = 0;
	stack<pii> stk;
	auto calstk = [&](int ps, int ht){
		int t = ps;
		for( ;!stk.empty() && stk.top().second >= ht; stk.pop()){
			t = stk.top().first;
			rtn = max(rtn, (ps-t) * stk.top().second);
		}
		if(ht >0) stk.push(pii(t, ht));
	};
	rep(i, sz(vec)){
		calstk(i, vec[i]);
	}
	calstk(sz(vec), 0);
	return rtn;
}


int main()
{
	int h,w;
	while(cin >>h >>w){
		if(h==0 && w==0) break;
		vector<vector<int>> fl(h+1, vector<int>(w+1));
		rep(i,h) rep(j,w){
			char ch; cin >>ch;
			if(ch =='1') fl[i][j] = 0;
			else fl[i][j] = i? fl[i-1][j] +1 : 1;
		}
		//for(auto xl: fl){for(auto x :xl) printf("%d ",x); puts("");}
		int ans =0;
		
		rep(i,h){
			ans = max(ans, max_rectangle(fl[i]));
		}
		cout << ans <<"\n";
	}
	
	return 0;
}