#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
long long mul_inv(long long a, long long b = 1000000007) {
  long long b0 = b, t, q;
  long long x0 = 0, x1 = 1;
  if (b == 1) return 1;
  while (a > 1) {
    q = a / b;
    t = b, b = a % b, a = t;
    t = x0, x0 = x1 - q * x0, x1 = t;
  }
  if (x1 < 0) x1 += b0;
  return x1;
}
int n, m, p, s;
long long d[2005][22];
long long e[2005][22];
long long fac[300000], ifac[300000];
vector<pair<int, int> > a;
long long ncr(long long n, long long r) {
  return fac[n] * ifac[r] % 1000000007 * ifac[n - r] % 1000000007;
}
int main() {
  int i, j, k, l;
  fac[0] = 1;
  for (i = 1; i < 300000; i++) fac[i] = fac[i - 1] * i, fac[i] %= 1000000007;
  for (i = 0; i < 300000; i++) ifac[i] = mul_inv(fac[i]);
  cin >> n >> m >> p >> s;
  for (i = 0; i < p; i++) {
    int x, y;
    scanf("%d%d", &x, &y), x--, y--;
    if (x == 0 && y == 0)
      s = (s + 1) / 2;
    else if (x == n - 1 && y == n - 1)
      s = (s + 1) / 2;
    else
      a.emplace_back(x, y);
  }
  a.emplace_back(0, 0);
  a.emplace_back(n - 1, m - 1);
  sort((a).begin(), (a).end());
  d[0][0] = e[0][0] = 1;
  for (i = 1; i < a.size(); i++) {
    d[i][0] = ncr(a[i].first + a[i].second, a[i].first);
    for (j = 1; j < 22; j++) {
      for (k = 0; k < i; k++) {
        if (a[k].first <= a[i].first && a[k].second <= a[i].second) {
          d[i][j] += e[k][j - (i == a.size() - 1 ? 0 : 1)] *
                     ncr(a[i].first + a[i].second - a[k].first - a[k].second,
                         a[i].first - a[k].first);
          d[i][j] %= 1000000007;
        }
      }
    }
    for (k = 0; k < 21; k++)
      e[i][k] = (d[i][k] - d[i][k + 1] + 1000000007) % 1000000007;
    e[i][21] = d[i][21];
  }
  long long ans = 0;
  for (i = 0; i < 22; i++) {
    ans += e[a.size() - 1][i] * s;
    ans %= 1000000007;
    s = (s + 1) / 2;
  }
  ans *= mul_inv(ncr(n - 1 + m - 1, m - 1));
  ans %= 1000000007;
  cout << ans;
  return 0;
}
