#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")
using namespace std;
const int N = 2e3 + 19;
const int M = 3e5 + 19;
const int mod = 1e9 + 7;
const int inf = 2e9;
const long long INF = 1e18;
struct point {
  int r, c;
} a[N];
inline int modulo(int x) {
  x %= mod;
  return (x + mod) % mod;
}
inline int mult(int x, int y) {
  long long x1 = modulo(x), y1 = modulo(y);
  return (x1 * y1) % mod;
}
inline void add(int &x, int y) { x = modulo(x + y); }
int fact[M];
int pw(int x, int y) {
  int cur = 1, pwi = x;
  for (int i = 0; i < 30; i++) {
    if (y & 1) cur = mult(cur, pwi);
    pwi = mult(pwi, pwi);
    y = (y >> 1);
  }
  return cur;
}
int C(int n, int k) {
  if (k > n) return 0;
  int t1, t2, t3;
  t1 = fact[n];
  t2 = pw(fact[k], mod - 2);
  t3 = pw(fact[n - k], mod - 2);
  return mult(t1, mult(t2, t3));
}
int n, m, k, s, dp[30][N], prefsum[N], cnt[N][N], val[30];
void precalc() {
  val[0] = s;
  for (int i = 1; i < 25; i++) val[i] = (val[i - 1] + 1) / 2;
  fact[0] = 1;
  for (int i = 1; i < M; i++) fact[i] = mult(fact[i - 1], i);
  for (int i = 1; i <= k; i++)
    for (int j = i; j <= k; j++)
      if (a[j].r >= a[i].r && a[j].c >= a[i].c)
        cnt[j][i] = C(a[j].r - a[i].r + a[j].c - a[i].c, a[j].r - a[i].r);
}
bool cmp(point a, point b) {
  if (a.c != b.c) return a.c < b.c;
  return a.r < b.r;
}
int main() {
  scanf("%d %d %d %d", &n, &m, &k, &s);
  bool is11 = 0, isnm = 0;
  for (int i = 1; i <= k; i++) {
    scanf("%d %d", &a[i].r, &a[i].c);
    if (a[i].r == 1 && a[i].c == 1)
      is11 = 1;
    else if (a[i].r == n && a[i].c == m)
      isnm = 1;
  }
  if (!is11) {
    a[++k].r = 1;
    a[k].c = 1;
  }
  if (!isnm) {
    a[++k].r = n;
    a[k].c = m;
  }
  sort(a + 1, a + k + 1, cmp);
  precalc();
  for (int j = 0; j < 20; j++) {
    for (int i = 1; i <= k; i++) {
      dp[j][i] = modulo(cnt[i][1] - prefsum[i]);
      for (int l = 2; l < i; l++)
        dp[j][i] = modulo(dp[j][i] - mult(cnt[i][l], dp[j][l]));
      prefsum[i] = modulo(prefsum[i] + dp[j][i]);
    }
  }
  int ans = 0, cntmore = cnt[k][1];
  for (int j = 0; j < 20; j++) {
    ans = modulo(ans + mult(dp[j][k], val[j + is11 + isnm]));
    cntmore = modulo(cntmore - dp[j][k]);
  }
  ans = modulo(ans + cntmore);
  ans = mult(ans, pw(cnt[k][1], mod - 2));
  printf("%d", ans);
  return 0;
}
