"""
今回の問題（AtcoderのランクDの問題）
→sum_{i=1}^{N-1} sum_{j=i+1}^{N} (A_{i} XOR A_{k}) = ? (mod 10^{9} + 7)
"""

# 方針を立てる
"""
①：まず、2つの変数で和をとるようにするので、これは配列を用意して行列を
　　作る（Numpyモジュールの利用）
②：あまりに関しては、10^{9}+7を何か変数に格納しておいて計算すれば良い。
③：排他的論理和に関しては、各和に対して2で割ったあまりの判定を行なって、
　　それを改めて格納することにする（for文での繰り返し処理で一旦補う。）

このアルゴリズムによって今回のプログラムを作成していく。
"""

import numpy as np
from tqdm import tqdm

divided_num = 10^9 + 7
nums = int(input())  # 入力される数字の個数を入力している。
input_nums = input().split(" ")  # これにて、入力された数字を格納する。
input_nums2 = input_nums  # 二つの計算をするので、もう一つコピーを作っておく。

xor_result = []  # 排他的論理和の計算を格納しておく場所

for j in tqdm(range(0, len(input_nums2)-1)):
  #print('Wait...')
  for i in tqdm(range(j, len(input_nums))):
    xor_input_nums = []
    xor_input_nums2 = []
    # ここで、対象の2つの数字を二進表記にする。
    a = int(input_nums[i])
    while a >= 2:
      xor_input_nums.append(a%2)  # 2進法の配列を作成（ただし、ここでは逆順になっている。）
      a = int(a / 2)  # 2で割った時の整数部分を格納する。
    b = int(input_nums2[j])
    while b >= 2:
      xor_input_nums2.append(b%2)
      b = int(b / 2)  # 2で割った時の整数部分を格納する。
 """
 2進法での表記を格納したので、ここからはif文
 によって排他的論理和の計算を行う。
 """
    if len(xor_input_nums) != len(xor_input_nums2):
      if len(xor_input_nums) > len(xor_input_nums2):
          for n in range(0,len(xor_input_nums)-len(xor_input_nums2)):
              xor_input_nums2.append(0)
      else:
          for n in range(0,len(xor_input_nums2)-len(xor_input_nums)):
              xor_input_nums.append(0)
        
  xor_suc_array = []
  #print('Wait...')
  for p in tqdm(range(0, len(xor_input_nums2))):
      xor_suc_array.append((int(xor_input_nums[p]) + int(xor_input_nums2[p])) % 2)  # 排他的論理和の計算の結果
  l = 0
  m = 0
  for k in xor_suc_array:
      m += k * (2^l)
      l += 1
  xor_result.append(m)

sums = np.sum(xor_result)
print(sums % divided_num)
