#include <bits/stdc++.h>
#define inp_out_work ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define testCase    int T; cin>>T; while(T--)
#define endl '\n'
#define debug(P) cout<<#P<<" = "<<P<<endl;
#define FILE freopen("input.txt", "r", stdin)

using namespace std;

const int MAXN = 600001;
const int mod = 1000000007;

typedef long long ll;

ll fac[MAXN], inv[MAXN];

ll modPower(ll x, ll y){
	ll res = 1;
	while(y){
		if(y&1)res = (res * x)%mod;
		x = (x*x)%mod;
		y >>= 1;
	}
	return res;
}

void pre(){
	fac[0] = 1;
	for(int i = 1; i < MAXN; ++i){
		fac[i] = fac[i-1] * i %mod;
	}
	inv[MAXN-1] = modPower(fac[MAXN-1], mod-2);

	for(int i = MAXN-2; i >= 0; --i){
		inv[i] = (inv[i+1]*(i+1))%mod;
	}
}

ll C(ll n, ll r){
	if(r > n)return 0;
	return (fac[n] * inv[r] % mod) * inv[n-r] %mod;
}

typedef long long ll;

int main(){ 
	pre();
	int h, w, n;
	cin>>h>>w>>n;

	pair<int,int> p[n+1];
	for(int i = 0; i < n; ++i)cin>>p[i].first>>p[i].second;
	sort(p, p+n);
	p[n].first = h, p[n].second = w;

	ll dp[n+1]; // no. of ways to come to this node without visiting any previous blocked node

	for(int i = 0; i <= n; ++i){
		dp[i] = C(p[i].first+p[i].second-2, p[i].first-1);

		for(int j = 0; j < i; ++j){
			if(p[j].second > p[i].second)continue;
			dp[i] = (dp[i] + mod - (dp[j] * 
						C(p[i].first-p[j].first+p[i].second-p[j].second, 
							p[i].first-p[j].first)) %mod) %mod;
		}
	}

	cout<< dp[n] << endl;


}