import Data.Bits
import Data.List
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Generic as G

modulo :: Int
modulo = 1000000007

(+~) :: Int -> Int -> Int
a +~ b = (a + b) `mod` modulo

(*~) :: Int -> Int -> Int
a *~ b = (a * b) `mod` modulo

powMod :: Int -> Int -> Int
powMod a b = foldl' step 1 [63, 62 .. 0]
  where step x n = let pow2 = x *~ x in
                    if b `testBit` n then pow2 *~ a else pow2

invMod :: Int -> Int
invMod a = powMod (a `mod` modulo) (modulo - 2)

facts :: U.Vector Int
facts = 1 `G.cons` G.scanl1 (*~) (G.enumFromTo 1 200001)

factMod :: Int -> Int
factMod n = facts G.! n

combMod :: Int -> Int -> Int
combMod n r = factMod n *~ invMod (factMod r *~ factMod (n - r))

patterns :: Int -> Int -> Int
patterns h w = combMod (h + w) h

main :: IO ()
main = do
  [h, w, a, b] <- mapM readIO . words =<< getLine
  print $ foldl' (+~) 0 [ patterns row (b - 1) *~ patterns (h - row - 1) (w - b - 1)
                        | row <- [0 .. h - a - 1]
                        ]
