A tourist wants to visit country Zeydabad for Zbazi (a local game in Zeydabad).

The country Zeydabad is a rectangular table consisting of n rows and m columns. Each cell on the country is either 'z' or '.'.

The tourist knows this country is named Zeydabad because there are lots of ''Z-pattern"s in the country. A ''Z-pattern" is a square which anti-diagonal is completely filled with 'z' and its upper and lower rows are also completely filled with 'z'. All other cells of a square can be arbitrary.

<image>

Note that a ''Z-pattern" can consist of only one cell (see the examples).

So he wants to count the number of ''Z-pattern"s in the country (a necessary skill for Zbazi).

Now your task is to help tourist with counting number of ''Z-pattern"s.

As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use gets/scanf/printf instead of getline/cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

Input

The first line contains two integers n, m (1 ≤ n, m ≤ 3000) — the number of rows and columns respectively.

Each of the next n lines contains m characters 'z' or '.' — the description of Zeydabad.

Output

Print the only integer a — the number of ''Z-pattern"s in Zeydabad.

Examples

Input

4 4
zzzz
zzz.
.z..
zzzz


Output

16


Input

1 4
z.z.


Output

2


Input

2 2
zz
zz


Output

5
#include <bits/stdc++.h>
using namespace std;
const int INF = 2 * int(1e9);
const long long INFll = 1ll * INF * INF;
const int MOD = 1000000007;
template <class T>
istream& operator>>(istream& in, vector<T>& a) {
  for (int i = 0; i < a.size(); ++i) in >> a[i];
  return in;
}
template <class T>
ostream& operator<<(ostream& out, vector<T>& a) {
  for (int i = 0; i < a.size(); ++i) out << a[i] << " ";
  return out;
}
int t[6005];
int t_n = 3000;
void t_modify(int x, int y) {
  for (t[x += t_n] += y; x > 1; x >>= 1) t[x >> 1] = t[x] + t[x ^ 1];
}
int t_query(int l, int r) {
  int res = 0;
  for (l += t_n, r += t_n; l < r; l >>= 1, r >>= 1) {
    if (l & 1) res += t[l++];
    if (r & 1) res += t[--r];
  }
  return res;
}
int solve(vector<int>& a, vector<int>& b) {
  reverse(a.begin(), a.end());
  reverse(b.begin(), b.end());
  vector<pair<int, int> > tmp;
  for (int i = 0; i < b.size(); ++i) b[i] -= i;
  for (int i = 0; i < b.size(); ++i) tmp.push_back(make_pair(b[i], i));
  sort(tmp.rbegin(), tmp.rend());
  int j = 0;
  int res = 0;
  for (int i = 0; i < a.size(); ++i) {
    while (j < b.size() && tmp[j].first >= -i + 1) {
      t_modify(tmp[j].second, 1);
      j++;
    }
    res += t_query(i, min(3000, i + a[i]));
  }
  for (int i = j - 1; i >= 0; --i) t_modify(tmp[i].second, -1);
  return res;
}
short l[3000][3000];
short r[3000][3000];
bool used[3000][3000];
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int n, m;
  scanf("%d %d\n", &n, &m);
  vector<string> a(n);
  for (int i = 0; i < n; ++i) {
    char c;
    for (int j = 0; j < m; ++j) {
      c = getchar();
      a[i] += c;
    }
    getchar();
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j)
      if (a[i][j] == 'z') l[i][j] = l[i][max(0, j - 1)] + 1;
    for (int j = m - 1; j >= 0; --j)
      if (a[i][j] == 'z') r[i][j] = r[i][min(m - 1, j + 1)] + 1;
  }
  long long ans = 0;
  vector<int> t1, t2;
  for (int j = 0; j < m; ++j)
    for (int i = 0; i < n; ++i)
      if (!used[i][j] && a[i][j] == 'z') {
        int cx = i, cy = j;
        t1.resize(0);
        t2.resize(0);
        while (cx >= 0 && cy < m && a[cx][cy] == 'z') {
          used[cx][cy] = 1;
          t1.push_back(l[cx][cy]);
          t2.push_back(r[cx][cy]);
          cx--;
          cy++;
        }
        ans += solve(t1, t2);
      }
  cout << ans << endl;
  if (0)
    cerr << fixed << setprecision(0)
         << "\nTIME = " << clock() / (long double)CLOCKS_PER_SEC * 1000 << "\n";
  return 0;
}
