macro_rules! input {
  (source = $s:expr, $($r:tt)*) => {
      let mut iter = $s.split_whitespace();
      let mut next = || { iter.next().unwrap() };
      input_inner!{next, $($r)*}
  };
  ($($r:tt)*) => {
      let stdin = std::io::stdin();
      let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock()));
      let mut next = move || -> String{
          bytes
              .by_ref()
              .map(|r|r.unwrap() as char)
              .skip_while(|c|c.is_whitespace())
              .take_while(|c|!c.is_whitespace())
              .collect()
      };
      input_inner!{next, $($r)*}
  };
}

macro_rules! input_inner {
  ($next:expr) => {};
  ($next:expr, ) => {};

  ($next:expr, $var:ident : $t:tt $($r:tt)*) => {
      let $var = read_value!($next, $t);
      input_inner!{$next $($r)*}
  };
}

macro_rules! read_value {
  ($next:expr, ( $($t:tt),* )) => {
      ( $(read_value!($next, $t)),* )
  };

  ($next:expr, [ $t:tt ; $len:expr ]) => {
      (0..$len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()
  };

  ($next:expr, chars) => {
      read_value!($next, String).chars().collect::<Vec<char>>()
  };

  ($next:expr, usize1) => {
      read_value!($next, usize) - 1
  };

  // 3
  // 1 2
  // 1 3
  // 1 4
  // のようなタイプ
  ($next:expr, [ $t:tt ]) => {{
      let len = read_value!($next, usize);
      (0..len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()
  }};

  ($next:expr, $t:ty) => {
      $next().parse::<$t>().expect("Parse error")
  };
}

fn main() {
  input! {
    n: usize,
    v: [i64;n]
  }

  let mut sum: i64 = 0;
  let trait_num = (10 as i64).pow(9) + 7;

  let mut bit_array = [0; 60];

  for i in 0..n {
    for d in 0..60 {
      // d桁目をマスクした値
      bit_array[d] += (v[i] & (2 as i64).pow(d as u32)) >> d;
    }
  }

  for d in 0..60 {
    sum += (bit_array[d] * (n as i64 - bit_array[d])) * ((1 << d) % trait_num);
  }

  println!("{}", sum % trait_num);
}
