#include <bits/stdc++.h>
 
#ifdef NON_SUBMIT
#define TEST(n) (n)
#define tout cerr
#else
#define TEST(n) ((void)0)
#define tout cin
#endif
 
using namespace std;
 
const int MOD=1e9+7;
int D[1<<20], Dsum[1<<20], Dminus[1<<20], PS[500001];
 
long long mod(long long a)
{
	if(a>=0) return a%MOD;
	return ((-a/MOD+1)*MOD+a)%MOD;
}
 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	TEST(freopen("input.txt","r",stdin));
	TEST(freopen("output.txt","w",stdout));
	TEST(freopen("debug.txt","w",stderr));
	int N, PX=0, A;
	cin>>N; PS[0]=1;
	for(int i=1;i<=N;i++) {
		cin>>A;
		if(PX^=A) {
			D[PX]=mod(1+1LL*Dsum[PX]*PS[i-1]-1LL*Dminus[PX]);
			Dsum[PX]=(Dsum[PX]+D[PX])%MOD;
			Dminus[PX]=(Dminus[PX]+1LL*D[PX]*PS[i-1])%MOD;
		}
		else PS[i]=1;
		PS[i]+=PS[i-1];
	}
	if(PX) cout<<D[PX]<<'\n';
	else {
		int ans=1;
		for(int i=2;i<PS[N];i++) ans=(2*ans)%MOD;
		for(int i=(1<<20)-1;i;i--) ans=(ans+Dsum[i])%MOD;
		cout<<ans<<'\n';
	}
	return 0;
}
    /**   Created by: Marcos Portales
          Codeforces User: marcosportales
          Country: Cuba
          Copyright                    */
#include<bits/stdc++.h>
using namespace std;
/// Pragmas:
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline") //Optimization flags
#pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX
#pragma GCC target("avx2") //Enable AVX
/// Macros:
#define int long long
#define f first
#define s second
#define db(x) cerr << #x << ": " << (x) << '\n';
#define pb push_back
#define lb lower_bound
#define up upper_bound
#define all(x) x.begin() , x.end()
#define rall(x) x.rbegin() , x.rend()
#define enl '\n'
#define vi vector<int>
#define sz(a) int((a).size())
#define rep(i,n) for(int i=0;i<(n);i++)
#define repi(i,n) for(int i=(1);i<=(n);i++)
typedef pair<int,int> ii;
typedef long double ld;
typedef unsigned long long ull;
/// Constraints:
const int maxn = 200005;
const int mod = 1000000007;
const ld eps = 1e-9;
const int inf = ((1ll<<31ll)-1ll);
const int INF = 2000000000000000000ll;
const ld pi = acos(-1);
/// Prime Numbers:
// 2, 173, 179, 181, 197, 311, 331, 737, 1009, 2011, 2027, 3079, 4001, 10037, 10079, 20011, 20089;
// 100003, 100019, 100043, 200003, 200017, 1000003, 1000033, 1000037, 1000081;
// 2000003, 2000029, 2000039, 1000000007, 1000000021, 2000000099;
/// Functions:
#define lg2(x) 31 - __builtin_clz(x)
#define lgx(x,b) ( log(x) / log(b) )
/// Red-Black Tree Test.insert(x)late ---------------------------------
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//typedef tree < long long ,  null_type ,  less<long long> ,  rb_tree_tag ,  tree_order_statistics_node_update > ordered_set;
/// Quick Pow------------------------------------------------
int qpow(int b,int e){
    if( !e ) return 1;
    if( e & 1 ) return qpow(b,e-1) * b % mod;
    int pwur = qpow(b,e>>1);
    return (pwur * pwur) % mod;
}
int modinv(int x){
    return qpow(x,mod-2);
}

/// My Code -------------------------------------------------

int32_t main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cout.setf(ios::fixed); cout.precision(0);
    srand(time(NULL));
    //freopen("a.in","r",stdin);
    //freopen("a.in","w",stdout);
    int n;
    cin>>n;
    vi v(n);
    int ans=0;
    rep(i,n){
        cin>>v[i];
    }
    bool fl=1;
    while(1){
        rep(i,n){
            if(v[i]%2)fl=0;
        }
        if(!fl)break;
        rep(i,n)v[i]/=2;
        ans++;
    }
    cout<<ans<<enl;

    return 0;
}
