#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
const int MOD = 1e9 + 7;
ll dp[511][511];
//solve for [l, r]
string s;
ll g(char a, char b)
{
int cnt = 0;
if((a == '(' || a == '?') && (b == ')' || b == '?')) cnt++;
if((a == '[' || a == '?') && (b == ']' || b == '?')) cnt++;
return cnt;
}
ll f(int l, int r) //solves for [l, r)
{
if(l>r) return 0;
if(l == r) return 1;
if(dp[l][r] != -1) return dp[l][r];
ll ans = 0;
for(int i = l + 1; i < r; i += 2)
{
ans = (ans + (g(s[l],s[i])*(f(l+1,i)*f(i+1,r))%MOD)%MOD)%MOD;
}
dp[l][r] = ans;
dp[l][r]%=MOD;
if(dp[l][r]<0) dp[l][r]+=MOD;
return ans;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>s;
int n = int(s.length());
memset(dp, -1, sizeof(dp));
cout<<f(0,n)<<'\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZibyBmaW5kX2J5X29yZGVyCiNkZWZpbmUgb29rIG9yZGVyX29mX2tleQogCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gaWk7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7IAp0eXBlZGVmIHRyZWU8aW50LCBudWxsX3R5cGUsIGxlc3M8aW50PiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gcGJkczsKdHlwZWRlZiBzZXQ8aW50Pjo6aXRlcmF0b3Igc2l0Owp0eXBlZGVmIG1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgbWl0Owp0eXBlZGVmIHZlY3RvcjxpbnQ+OjppdGVyYXRvciB2aXQ7Cgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKCmxsIGRwWzUxMV1bNTExXTsKLy9zb2x2ZSBmb3IgW2wsIHJdCnN0cmluZyBzOwoKbGwgZyhjaGFyIGEsIGNoYXIgYikKewoJaW50IGNudCA9IDA7CglpZigoYSA9PSAnKCcgfHwgYSA9PSAnPycpICYmIChiID09ICcpJyB8fCBiID09ICc/JykpIGNudCsrOwoJaWYoKGEgPT0gJ1snIHx8IGEgPT0gJz8nKSAmJiAoYiA9PSAnXScgfHwgYiA9PSAnPycpKSBjbnQrKzsKCXJldHVybiBjbnQ7Cn0KCmxsIGYoaW50IGwsIGludCByKSAvL3NvbHZlcyBmb3IgW2wsIHIpCnsKCWlmKGw+cikgcmV0dXJuIDA7CglpZihsID09IHIpIHJldHVybiAxOwoJaWYoZHBbbF1bcl0gIT0gLTEpIHJldHVybiBkcFtsXVtyXTsKCWxsIGFucyA9IDA7Cglmb3IoaW50IGkgPSBsICsgMTsgaSA8IHI7IGkgKz0gMikKCXsKCQlhbnMgPSAoYW5zICsgKGcoc1tsXSxzW2ldKSooZihsKzEsaSkqZihpKzEscikpJU1PRCklTU9EKSVNT0Q7Cgl9CglkcFtsXVtyXSA9IGFuczsKCWRwW2xdW3JdJT1NT0Q7CglpZihkcFtsXVtyXTwwKSBkcFtsXVtyXSs9TU9EOwoJcmV0dXJuIGFuczsKfQoKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwoJY2luPj5zOwoJaW50IG4gPSBpbnQocy5sZW5ndGgoKSk7CgltZW1zZXQoZHAsIC0xLCBzaXplb2YoZHApKTsKCWNvdXQ8PGYoMCxuKTw8J1xuJzsKfQo=