/*
Author-KUSHAGRA SINGH
Birla Institute of Technology Mesra
CS K18
*/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 

using namespace __gnu_pbds;
using namespace std;

typedef long long int ll;
typedef long double ld;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; 

//#define mp make_pair
#define pb emplace_back
#define vll vector<ll>
#define vpll vector< pair <ll,ll> >
#define pll pair <ll,ll>
#define pq priority_queue< int >
#define khtm "\n"
#define F first
#define S second
#define fr(i,a,n) for(i=a;i<n;i++)
#define mem(arr,l) memset(arr,l,sizeof arr)
#define ALL(x) x.begin(), x.end()
#define frr(i,a,n) for(i=n-1;i>=a;i--)
#define mod 1000000007
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define testcase ll T; cin>>T; while(T--)
const int MAX = 1e6 +2;

/*
important builtin functions
__gcd(value1, value2)
__builtin_ffs(x)
  Number of leading zeroes: __builtin_clz(x)
  Number of trailing zeroes : __builtin_ctz(x)
  Number of set bits: __builtin_popcount(x)
*/

ll i,j,k,l,r,n,m;


//ll a[MAX];

ll a[MAX];

// ll add (ll x, ll y){
// 	x+=y;
// 	if(x>=mod)
// 		x-=mod;
// 	return x;
// }

// ll mul(ll x, ll y){
// 	return 1LL * x * y % mod;
// }

inline int add(int x, int y) {
    x += y;
    if(x >= mod) x -= mod;
    return x;
}
 
inline int sub(int x, int y) {
    x -= y;
    if(x < 0) x += mod;
    return x;
}
 
inline int mul(int x, int y) { return 1ll * x * y % mod; }

int main()
{

  #ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output_3.txt", "w", stdout);
#endif

fast

cin>>n;
fr(i,0,n)
	cin>>a[i];
ll ans= 0;

for(register int bit = 0; bit < 60; bit++) {
        int cnt = 0;
        for(register int i = 1; i <= n; i++) cnt += ((a[i] >> bit) & 1);
        ans = add(ans, mul((1ll << bit) % mod, mul(cnt, n - cnt)));
    }

cout<<ans;

#ifndef ONLINE_JUDGE
    	cout<<"\nTime Elapsed : " << 1.0*clock() / CLOCKS_PER_SEC << " s\n";
    #endif

   return 0;

}