#include <bits/stdc++.h>
using namespace std;
long long n, m, k, s, sz;
long long fact[500005], invfact[500005];
long long dp[100005][25];
long long dp2[100005];
vector<pair<long long, long long> > block;
bool st = false, ed = false;
long long val[25], limit = 0;
long long bigMod(long long a, long long p) {
  if (p == 0) return 1LL;
  if (p == 1) return a % 1000000007;
  long long ret = bigMod(a, p / 2);
  ret = (ret * ret) % 1000000007;
  if (p & 1) ret = (ret * a) % 1000000007;
  return ret;
}
void gen() {
  fact[0] = 1;
  for (long long i = 1; i < 500005; i++) {
    fact[i] = (fact[i - 1] * i) % 1000000007;
  }
  invfact[500005 - 1] = bigMod(fact[500005 - 1], 1000000007 - 2);
  for (long long i = 500005 - 2; i >= 0; i--) {
    invfact[i] = (invfact[i + 1] * (i + 1)) % 1000000007;
  }
}
long long ways(long long x1, long long y1, long long x2, long long y2) {
  if (x2 < x1 || y2 < y1) return 0LL;
  long long a = x2 - x1;
  long long b = y2 - y1;
  long long p = fact[a + b];
  long long q = invfact[a];
  long long r = invfact[b];
  long long ret = (p * q) % 1000000007;
  ret = (ret * r) % 1000000007;
  return ret;
}
void pre() {
  for (long long i = 0; i < sz; i++) {
    dp2[i] = ways(block[i].first, block[i].second, n, m);
  }
  for (long long i = sz - 2; i >= 0; i--) {
    for (long long j = i + 1; j < sz - 1; j++) {
      long long temp = (dp2[j] * ways(block[i].first, block[i].second,
                                      block[j].first, block[j].second)) %
                       1000000007;
      dp2[i] = (dp2[i] - temp) % 1000000007;
      if (dp2[i] < 0) dp2[i] += 1000000007;
    }
  }
}
long long f(long long pos, long long v) {
  if (v == 0) return dp2[pos];
  if (pos == sz - 1 && v != 0) return 0LL;
  if (dp[pos][v] != -1) return dp[pos][v];
  long long ans = ways(block[pos].first, block[pos].second, n, m);
  long long temp = 0;
  for (long long i = 0; i < v; i++) {
    temp += f(pos, i);
    temp = temp % 1000000007;
  }
  ans = (ans - temp) % 1000000007;
  if (ans < 0) ans += 1000000007;
  long long temp2 = 0;
  for (long long i = pos + 1; i < sz; i++) {
    long long x1 = block[pos].first, y1 = block[pos].second;
    long long x2 = block[i].first, y2 = block[i].second;
    temp2 += (ways(x1, y1, x2, y2) * f(i, v)) % 1000000007;
    temp2 = temp2 % 1000000007;
  }
  ans = (ans - temp2) % 1000000007;
  if (ans < 0) ans += 1000000007;
  return dp[pos][v] = ans;
}
int main() {
  memset(dp, -1, sizeof dp);
  gen();
  scanf("%lld %lld %lld %lld", &n, &m, &k, &s);
  for (long long i = 0; i < k; i++) {
    long long x, y;
    scanf("%lld %lld", &x, &y);
    if (x == 1 && y == 1) st = true;
    if (x == n && y == m) ed = true;
    block.push_back(make_pair(x, y));
  }
  if (!st) block.push_back(make_pair(1, 1));
  if (!ed) block.push_back(make_pair(n, m));
  sort(block.begin(), block.end());
  sz = block.size();
  pre();
  val[0] = s, limit = 0;
  for (long long i = 1; i < 20; i++) {
    val[i] = (val[i - 1] + 1) / 2;
    if (val[i] == 1)
      break;
    else
      limit = i;
  }
  long long lob = 0;
  long long totPath = ways(1, 1, n, m);
  long long sum = 0;
  for (long long i = 0; i <= limit; i++) {
    long long tot = i;
    if (st) tot--;
    if (ed) tot--;
    if (tot < 0) continue;
    sum += f(0, tot);
    sum = sum % 1000000007;
    lob += (f(0, tot) * val[i]) % 1000000007;
    lob = lob % 1000000007;
  }
  long long justOne = (totPath - sum) % 1000000007;
  if (justOne < 0) justOne += 1000000007;
  lob += justOne;
  long long hor = bigMod(totPath, 1000000007 - 2);
  long long ans = (lob * hor) % 1000000007;
  cout << ans;
}
