#include <bits/stdc++.h>
using namespace std;
const int MAX = 100005;
const int MOD = 1000000007;
int red(int a) {
  while (a >= MOD) {
    a -= MOD;
  }
  return a;
}
int add(int a, int b) { return red(a + b); }
int sub(int a, int b) { return red(a - b + MOD); }
int mult(int a, int b) { return ((long long)a * b) % MOD; }
int sq(int a) { return mult(a, a); }
int expo(int a, int b) {
  int ret = 1;
  for (; b > 0; b /= 2) {
    if (b & 1) {
      ret = mult(ret, a);
    }
    a = mult(a, a);
  }
  return ret;
}
int first[2 * MAX];
int inv[2 * MAX];
int fi[2 * MAX];
int c(int n, int k) {
  if (n < k) {
    return 0;
  }
  return mult(first[n], mult(fi[k], fi[n - k]));
}
vector<pair<int, int> > bad;
int paths(int a, int b) {
  int u = bad[b].first - bad[a].first;
  int d = bad[b].second - bad[a].second;
  if (u >= 0 && d >= 0) {
    return c(u + d, u);
  } else {
    return 0;
  }
}
int dp[2005][25];
int pth[2005][2005];
vector<int> vals;
int main() {
  first[0] = fi[0] = 1;
  for (int i = 1; i < 2 * MAX; i++) {
    first[i] = mult(first[i - 1], i);
  }
  inv[1] = 1;
  for (int i = 2; i < 2 * MAX; i++) {
    inv[i] = sub(0, mult(MOD / i, inv[MOD % i]));
  }
  for (int i = 1; i < 2 * MAX; i++) {
    fi[i] = mult(fi[i - 1], inv[i]);
  }
  int n, m, k, ch;
  scanf("%d %d %d %d", &n, &m, &k, &ch);
  while (ch > 1) {
    vals.push_back(ch);
    ch = (ch + 1) / 2;
  }
  vals.push_back(1);
  vals.push_back(1);
  vals.push_back(1);
  vals.push_back(1);
  bool st = false;
  bool en = false;
  for (int i = 0; i < k; i++) {
    int r, c;
    scanf("%d %d", &r, &c);
    bad.push_back({r, c});
    if (r == 1 && c == 1) {
      st = true;
    }
    if (r == n && c == m) {
      en = true;
    }
  }
  if (n == 1 && m == 1) {
    if (k == 0) {
      printf("%d\n", ch);
    } else {
      printf("%d\n", (ch + 1) / 2);
    }
    return 0;
  }
  if (!st) {
    bad.push_back({1, 1});
  }
  if (!en) {
    bad.push_back({n, m});
  }
  sort(bad.begin(), bad.end());
  dp[0][1] = 1;
  int num = bad.size();
  for (int second = 1; second < num; second++) {
    for (int i = 0; i < second; i++) {
      pth[i][second] = paths(i, second);
    }
  }
  for (int second = 1; second < num; second++) {
    for (int b = 2; b < 25; b++) {
      int tot = 0;
      for (int i = 0; i < second; i++) {
        tot = add(tot, mult(pth[i][second], sub(dp[i][b - 1], dp[i][b])));
      }
      dp[second][b] = tot;
    }
  }
  int subtract = 0;
  if (!st) {
    subtract++;
  }
  if (!en) {
    subtract++;
  }
  int totpath = paths(0, num - 1);
  int denom = expo(totpath, MOD - 2);
  int ans = 0;
  for (int i = subtract; i < vals.size(); i++) {
    totpath = sub(totpath, dp[num - 1][i]);
    ans = add(ans, mult(vals[i - subtract], dp[num - 1][i]));
  }
  ans = add(totpath, ans);
  printf("%d\n", mult(ans, denom));
}
