Problem: You are given a non-empty string s consisting of lowercase letters. Find the number of pairs of non-overlapping palindromic substrings of this string.

In a more formal way, you have to find the quantity of tuples (a, b, x, y) such that 1 ≤ a ≤ b < x ≤ y ≤ |s| and substrings s[a... b], s[x... y] are palindromes.

A palindrome is a string that can be read the same way from left to right and from right to left. For example, "abacaba", "z", "abba" are palindromes.

A substring s[i... j] (1 ≤ i ≤ j ≤ |s|) of string s = s1s2... s|s| is a string sisi + 1... sj. For example, substring s[2...4] of string s = "abacaba" equals "bac".

Input

The first line of input contains a non-empty string s which consists of lowercase letters ('a'...'z'), s contains at most 2000 characters.

Output

Output a single number — the quantity of pairs of non-overlapping palindromic substrings of s.

Please do not use the %lld format specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d format specifier.

Examples

Input

aa


Output

1


Input

aaa


Output

5


Input

abacaba


Output

36

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int64_t seed;
mt19937 rng(seed = chrono::steady_clock::now().time_since_epoch().count());
inline int64_t rnd(int64_t l = 0, int64_t r = INT_MAX) {
  return uniform_int_distribution<int64_t>(l, r)(rng);
}
template <typename T, typename G>
ostream& operator<<(ostream& out, const pair<T, G>& a) {
  return out << "(" << a.first << " , " << a.second << ")";
}
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& a) {
  out << "[";
  for (const auto& i : a) out << i << " , ";
  return out << "]";
}
template <typename T>
ostream& operator<<(ostream& out, const set<T>& a) {
  out << "{";
  for (const auto& i : a) out << i << " , ";
  return out << "}";
}
template <typename T, typename G>
ostream& operator<<(ostream& out, const map<T, G>& a) {
  out << "<";
  for (const auto& i : a) out << i << " , ";
  return out << ">";
}
template <typename T, size_t N>
typename enable_if<!is_same<typename remove_cv<T>::type, char>::value,
                   ostream&>::type
operator<<(ostream& out, T (&a)[N]) {
  out << '[';
  for (size_t i = 0; i < N; ++i) out << a[i] << " , ";
  out << ']';
  return out;
}
string s;
int64_t prf[2005] = {0}, suf[2005] = {0}, ans = 0;
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int64_t i, j, k;
  cin >> s;
  s = "@" + s + "#";
  for (i = 1; i < s.size() - 1; i++) {
    for (j = i, k = i; s[j] == s[k]; j--, k++) {
      prf[j]++;
      suf[k]++;
    }
    for (j = i, k = i + 1; s[j] == s[k]; j--, k++) {
      prf[j]++;
      suf[k]++;
    }
  }
  prf[0] = 0;
  prf[s.size() - 1] = 0;
  suf[0] = 0;
  suf[s.size() - 1] = 0;
  for (i = s.size() - 2; i > 0; i--) prf[i] += prf[i + 1];
  for (i = s.size() - 1; i >= 0; i--) {
    ans += (prf[i + 1] * suf[i]);
  }
  cout << ans;
  return 0;
}