// Slower C++ solution:
#include<bits/stdc++.h>



using namespace std;

#define REPP(i,a,b,c) for(int i=a; i<=b; i+=c)

#define REP(i,a,b) REPP(i,a,b,1)

#define REVV(i,a,b,c) for(int i=a; i>=b; i-=c)

#define REV(i,a,b) REVV(i,a,b,1)

#define FOR(i,a) REP(i,0,(int)a-1)

#define FORD(i,a) REV(i,(int)a-1,0)

#define MP make_pair

#define PB push_back

#define POB pop_back

#define FI first

#define SE second

typedef long long ll;

typedef unsigned long long ull;

typedef pair < int , int > pii;

typedef vector < int > vi;

typedef vector < pii > vii;

typedef vector < ll > vl;



const double PI = acos(-1);

const double EPS = 1e-9;

const int INF = 1e9;

const ll MOD = 1e9 + 7;



///////////////////////////////////////////////////////



const int N = 1e5;



ll h,w,a,b;

ll fact[2*N + 5];

ll addMod(ll a, ll b){

	return (a +b ) % MOD;

}



ll mulMod(ll a, ll b){

	return (a*b) % MOD;

}



ll fast(ll a, ll b){

	if(b == 0) return 1;

	ll tmp = fast(a,b/2);

	tmp = mulMod(tmp,tmp);

	if(b % 2 == 1) tmp = mulMod(tmp,a);

	return tmp;

}



ll combin(int n, int k){

	return mulMod(fact[n], fast(mulMod(fact[n-k], fact[k]), MOD-2));

}



ll solve(){

	ll ret = 0;

	REP(i,1,h-a){

		int y = i;

		int x = b;

		ll val = combin(y+x-2,y-1);

		x++;

		val = mulMod(val, combin(h+w-y-x, h-y));

		ret = addMod(ret, val);

	}

	return ret;

}



int main(){

	ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

	fact[0] = 1;

	REP(i,1,2*N) fact[i] = mulMod(fact[i-1], i);

	cin >> h >> w >> a >> b;

	cout << solve() << endl;

	return 0;

} 

// Faster C++ solution for the same problem (measured speedup: 2.047830878480777x):
#include <bits/stdc++.h>



using namespace std;



long long options1[100010];

long long options2[100010];

long long moduo = 1e9 + 7;



long long fast_pow(long long n,long long k)

{

    if(k == 0) return 1;

    else

    {

        long long a = fast_pow(n,k/2)%moduo;

        if(k%2 == 0) return (a*a)%moduo;

        else return (((n*a)%moduo)*a)%moduo;

    }

}



void generate_opt1(int n,int m,int h,int w)

{

    options1[1] = 1;

    long long k = 2; /// bilo je ranije 1

    while(k <= n-h)

    {

        long long inverz = fast_pow(k-1,moduo-2)%moduo;

        /*if(options1[k] < 0)

        {

            cout<<options2[k]<<" "<<k<<" "<<inverz<<" __1"<<endl;

            system("PAUSE");

        }*/

        inverz%=moduo;

        options1[k] = (((options1[k-1]*(w+ k-1 +1-2))%moduo)*inverz)%moduo;

        options1[k] %= moduo;

        k++;

    }



    /*for(int i = 1; i <= n-h; i++)

    {

        cout<<"options1["<<i<<"]: "<<options1[i]<<endl;

    }*/

}



long long factoriel(long long a) /// treba da mod

{

    long long ret = 1;

    for(long long i = 1; i <= a; i++)

    {

        ret*=i;

        ret%=moduo;

    }



    return ret%moduo;

}



long long calculate_A_nad_B(long long a, long long b)

{

    if(a == b) return 1;

    long long ret = 0;

    long long pom1,pom2,pom3;

    //cout<<"a b "<<a<<" "<<b<<endl;

    pom1 = factoriel(a)%moduo; pom2 = factoriel(b)%moduo; pom3 = factoriel(a-b)%moduo; /// svuda si dodao %moduo

    //cout<<pom1<<" "<<pom2<<" "<<pom3<<endl;

    //cout<<"long_long_max"<<LONG_LONG_MAX<<endl;

    //ret = (pom1%moduo)*(fast_pow(pom2,moduo-2)%moduo)*(fast_pow(pom3,moduo-2)%moduo)%moduo; ///mnozenje inverzima zbog modula

    long long x = fast_pow(pom2,moduo-2)%moduo;

    long long y = fast_pow(pom3,moduo-2)%moduo;

    ret = (((pom1*x)%moduo)*y)%moduo;

    //cout<<ret<<endl;



    return ret%moduo;

}



void generate_opt2(int n,int m,int h,int w)

{

    long long d = m-w;

    long long k = h+1;

    long long br = k - 1;

    options2[k-br] = calculate_A_nad_B(k+d-2,k-1)%moduo; /// promenios sa opt od 1 na opt od k

    //cout<<"options2[1]: "<<options2[1]<<endl;



    k++; /// ovo si dodao

    while(k <= n)

    {

        //cout<<"k: "<<k<<endl;

        long long inverz = fast_pow(k-1,moduo-2)%moduo; ///umesto ka promenio si na k -1

        inverz%=moduo;

        //cout<<"k inverz1: "<<k<<" "<<inverz<<endl;

        options2[k -br] = (((options2[k-1 -br]*(d+ k-1 +1-2))%moduo)*inverz)%moduo; /// dodo si -br da bih ubacivao u niz pocevsi od indexa 1 , a ne od indexa k sto moze biti veliki br

        options2[k -br]%=moduo;

        /*if(options2[k - br] < 0)

        {

            cout<<options2[k - br]<<" "<<k<<" "<<inverz<<" __2"<<endl;

            system("PAUSE");

        }*/

        k++;

        //cout << "uso2"<<endl;

    }



    //for(int i = n-h; i>= 1; i--)

        //cout<<"options2["<<i<<"]: "<<options2[i]<<endl;

}



int main()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);



    int n,m,h,w;

    cin>> n >> m >>h >> w;

    //cout<<fast_pow(n,m);



    generate_opt1(n,m,h,w);

    generate_opt2(n,m,h,w);



    long long res = 0;

    long long d = n-h;



    for(int i = 1; i <= d; i++)

    {

        long long pom1 = options1[i] % moduo;

        long long pom2 = options2[d-i+1] % moduo;

        long long pom3 = (pom1 * pom2) % moduo;

        res+= pom3;

        res%=moduo;

    }



    cout<< res;



    return 0;

}