#include <bits/stdc++.h>
using namespace std;
inline void qread(int &x) {
  x = 0;
  int sign = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') sign = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  x = x * sign;
}
int n, m, k, s;
int log2s;
struct point {
  int x;
  int y;
  point() {}
  point(int _x, int _y) {
    x = _x;
    y = _y;
  }
  friend bool operator<(point p, point q) {
    if (p.x == q.x)
      return p.y < q.y;
    else
      return p.x < q.x;
  }
} a[3000 + 5];
inline long long fast_pow(long long x, long long k) {
  long long ans = 1;
  while (k) {
    if (k & 1) ans = ans * x % 1000000007;
    x = x * x % 1000000007;
    k >>= 1;
  }
  return ans;
}
inline long long inv(long long x) { return fast_pow(x, 1000000007 - 2); }
long long fact[100000 * 2 + 5], invfact[100000 * 2 + 5];
inline long long C(int n, int m) {
  return fact[n] * invfact[n - m] % 1000000007 * invfact[m] % 1000000007;
}
void ini_fact(int n) {
  fact[0] = 1;
  for (int i = 1; i <= n; i++) fact[i] = fact[i - 1] * i % 1000000007;
  invfact[n] = inv(fact[n]);
  for (int i = n - 1; i >= 0; i--)
    invfact[i] = invfact[i + 1] * (i + 1) % 1000000007;
}
inline long long calc(point p, point q) {
  return C(q.x - p.x + q.y - p.y, q.x - p.x);
}
long long dp[3000 + 5][32 + 5];
int main() {
  qread(n);
  qread(m);
  qread(k);
  qread(s);
  ini_fact(n + m);
  for (int i = 1; i <= k; i++) {
    qread(a[i].x);
    qread(a[i].y);
  }
  sort(a + 1, a + 1 + k);
  if (a[1].x != 1 || a[1].y != 1) {
    s *= 2;
    a[++k] = point(1, 1);
  }
  if (a[k].x != n || a[k].y != m)
    a[++k] = point(n, m);
  else
    s -= s / 2;
  log2s = log2(s) + 1;
  sort(a + 1, a + 1 + k);
  dp[1][0] = 1;
  for (int i = 2; i <= k; i++) {
    dp[i][1] = calc(a[1], a[i]);
    for (int j = 2; j <= log2s; j++) {
      for (int u = 1; u < i; u++) {
        if (a[u].y <= a[i].y && a[u].x <= a[i].x) {
          dp[i][j] += dp[u][j - 1] * calc(a[u], a[i]) % 1000000007;
          dp[i][j] = (dp[i][j] + 1000000007) % 1000000007;
          dp[i][j] -= dp[u][j] * calc(a[u], a[i]) % 1000000007;
          dp[i][j] = (dp[i][j] + 1000000007) % 1000000007;
        }
      }
    }
  }
  long long ans = 0;
  for (int i = 1; i <= log2s; i++) {
    s -= s / 2;
    ans = (ans + (dp[k][i] - dp[k][i + 1] + 1000000007) * s % 1000000007) %
          1000000007;
  }
  ans = ans * inv(calc(a[1], a[k])) % 1000000007;
  printf("%I64d\n", ans);
}
