#include<bits/stdc++.h>usingnamespacestd;// Template starts
#include<codeforces/modint.hpp>// Template ends
constexprintmd=(int)10007;usingmint=Modular<std::integral_constant<decay<decltype(md)>::type,md>>;voidsolve(string&str){intn=str.length();vector<vector<mint>>dp(n,vector<mint>(n,0));// dp[i][j] is the number of non-empty palindromic subsequence of [i...j].
// Fill all length 1 manually.
for(inti=0;i<n;i++){dp[i][i]=1;}for(inti=n-2;i>=0;i--){for(intj=i+1;j<n;j++){// You can always choose to delete one of the endpoints.
// The case when both endpoints are eventually deleted are double
// counted, hence we subtract it once.
dp[i][j]+=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];// You can choose to keep both the endpoints only it they
// are identical.
if(str[i]==str[j]){// You can either stop the process right here and walk away
// with 2 elements str[i] and str[j], or you can ask for the
// inner subsequence to be a non-empty palindrome.
dp[i][j]+=1+dp[i+1][j-1];}}}cout<<dp[0][n-1]<<endl;}intmain(){stringstr;cin>>str;solve(str);return0;}// Why is dp[i][i] = 1 instead of 2?
//
// If we are not allowing empty subsequences for intermediate values,
// how do account we for the subsequence `aa` created by `aba`, i.e, by
// deleting inner b and keeping the terminal a?
// Answer lies in the fact that we add `1` to dp[i][j] if the terminal
// elements are equal. The 1 indicates a way of stopping right there and
// taking the inner subsequence, making it empty.
//
// If you keep dp[i][i] = 2, a lot of things would be double counted,
// difficult to maintain.