#include "bits/stdc++.h"
#define ll long long
using namespace std;
#define check(x) cerr << #x << ": " << x << endl;
#define print(ans) cout << ans << endl;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while(t--){
int n;
const int mod = 1e9 + 7;
cin >> n;
string s;
cin >> s;
int dp[n+2];
int last1 = -1 , last0 = -1;
memset(dp,0,sizeof dp);
dp[0] = 1;
for(int i = 1;i<=n;i++){
int x = (s[i-1] - '0');
dp[i] = (dp[i-1] * 2)%mod;
if(x){
if(last1 != -1)
dp[i] -= dp[last1 - 1];
dp[i] = (dp[i] + mod)%mod;
last1 = i;
} else {
if(last0 != -1){
dp[i] -= dp[last0 - 1];
dp[i] = (dp[i] + mod)%mod;
} else {
dp[i] -= 1;
dp[i] = (dp[i] + mod)%mod;
}
last0 = i;
}
}
if(last0==-1)
{
dp[n] -= 1;
dp[n] += mod;
dp[n] %= mod;
}
cout << dp[n]<<endl;
}
cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs" << "\n";
return 0;
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCiNkZWZpbmUgbGwgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgY2hlY2soeCkgICAgICAgICAgICAgICAgY2VyciA8PCAjeCA8PCAiOiAiIDw8IHggPDwgZW5kbDsKI2RlZmluZSBwcmludChhbnMpICAgICAgICAgICAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwppbnQgbWFpbigpewogIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogIGNpbi50aWUoTlVMTCk7CiAgaW50IHQ7CiAgY2luID4+IHQ7CiAgd2hpbGUodC0tKXsKCSAgaW50IG47CgkgIGNvbnN0IGludCBtb2QgPSAxZTkgKyA3OwoJICBjaW4gPj4gbjsKCSAgc3RyaW5nIHM7CgkgIGNpbiA+PiBzOwoJICBpbnQgZHBbbisyXTsKCSAgaW50IGxhc3QxID0gLTEgLCBsYXN0MCA9IC0xOwoJICBtZW1zZXQoZHAsMCxzaXplb2YgZHApOwoJICBkcFswXSA9IDE7CgkgIGZvcihpbnQgaSA9IDE7aTw9bjtpKyspewoJICAgIGludCB4ID0gKHNbaS0xXSAtICcwJyk7CgkgICAgZHBbaV0gPSAoZHBbaS0xXSAqIDIpJW1vZDsKCSAgICBpZih4KXsKCSAgICAgIGlmKGxhc3QxICE9IC0xKQoJICAgICAgICBkcFtpXSAtPSBkcFtsYXN0MSAtIDFdOwoJICAgICAgICBkcFtpXSA9IChkcFtpXSArIG1vZCklbW9kOwoJICAgICAgbGFzdDEgPSBpOwoJICAgIH0gZWxzZSB7CgkgICAgICBpZihsYXN0MCAhPSAtMSl7CgkgICAgICAgIGRwW2ldIC09IGRwW2xhc3QwIC0gMV07CgkgICAgICAgIGRwW2ldID0gKGRwW2ldICsgbW9kKSVtb2Q7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBkcFtpXSAtPSAxOwoJICAgICAgICBkcFtpXSA9IChkcFtpXSArIG1vZCklbW9kOwoJICAgICAgfQoJICAgICAgbGFzdDAgPSBpOwoJICAgIH0KCSAgfQoJICBpZihsYXN0MD09LTEpCgkgIHsKCSAgCWRwW25dIC09IDE7CgkgIAlkcFtuXSArPSBtb2Q7CgkgIAlkcFtuXSAlPSBtb2Q7CgkgIH0KCSAgY291dCA8PCBkcFtuXTw8ZW5kbDsKICAJCiAgfQogIGNlcnIgPDwgInRpbWUgdGFrZW4gOiAiIDw8IChmbG9hdCljbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIiBzZWNzIiA8PCAiXG4iOwogIHJldHVybiAwOwp9ICA=