#include <bits/stdc++.h>
using namespace std;
long long read() {
  char c;
  long long num, f = 1;
  while (c = getchar(), !isdigit(c))
    if (c == '-') f = -1;
  num = c - '0';
  while (c = getchar(), isdigit(c)) num = num * 10 + c - '0';
  return f * num;
}
inline void write(long long x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x > 9) write(x / 10);
  putchar(x % 10 + 48);
}
const long long mod = 1000000007;
bool visit[5001][5001], cantvisit[5001][5001];
long long k, n, sum;
long long dx[8] = {1, -1, 1, -1, 2, -2, 2, -2},
          dy[8] = {2, 2, -2, -2, 1, -1, -1, 1};
struct dd {
  long long x, y, t;
};
long long ans[10001];
void bfs() {
  queue<dd> q;
  ans[0] = 1;
  q.push((dd){2000, 2000, 0});
  while (!q.empty() && q.front().t < min(k, (long long)100)) {
    for (long long i = 0; i < 8; ++i) {
      long long ddx = q.front().x + dx[i];
      long long ddy = q.front().y + dy[i];
      if (!visit[ddx][ddy]) {
        q.push((dd){ddx, ddy, q.front().t + 1});
        visit[ddx][ddy] = 1;
        ans[q.front().t + 1]++;
      }
    }
    q.pop();
  }
}
signed main() {
  memset(visit, false, sizeof(visit));
  k = read();
  n = read();
  visit[2000][2000] = 1;
  for (register long long i = 1; i <= n; ++i) {
    long long x, y;
    x = read();
    y = read();
    visit[x + 2000][y + 2000] = 1;
  }
  bfs();
  long long kk = 0;
  if (k <= 100) {
    for (register long long i = 1; i <= k; ++i) {
      kk += ans[i];
    }
    kk++;
  } else {
    long long cha = ans[100] - ans[99];
    for (register long long i = 1; i <= 99; ++i) {
      kk += ans[i];
    }
    kk++;
    k -= 99;
    k %= mod;
    kk = (kk + ans[100] * k + (k - 1) * k / 2 % mod * cha) % mod;
  }
  write(kk);
  return 0;
}
