{-# LANGUAGE BangPatterns #-}
import Control.Arrow
import Control.Monad.Fix
import Data.Int
import Data.Foldable
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.ByteString.Char8 as B
import Debug.Trace

iscanl :: (Int -> a -> b -> a) -> a -> V.Vector b -> V.Vector a
iscanl !k !a !v = V.scanl' (\(!x) (!i, !v) -> k i x v) a (V.indexed v)

iscanlU
  :: (VU.Unbox a, VU.Unbox b)
  => (Int -> a -> b -> a)
  -> a
  -> VU.Vector b
  -> VU.Vector a
iscanlU !k !a !v = VU.scanl' (\(!x) (!i, !v) -> k i x v) a (VU.indexed v)

solve :: Int -> Int -> V.Vector (VU.Vector Bool) -> Int
solve !h !w !ahw = dp V.! h VU.! (w - 1)
 where
  add !x !y = (x + y) `mod` (10 ^ 9 + 7)

  dp :: V.Vector (VU.Vector Int)
  dp = iscanl
    ( \(!i) (!acc) (!row) -> VU.tail $ iscanlU
      (\(!j) (!prev) (!ch) -> if ch then 0 else acc VU.! j `add` prev)
      0
      row
    )
    (VU.generate w (\(!i) -> if i == 0 then 1 else 0))
    ahw

main = do
  let readInt :: Integral a => B.ByteString -> Maybe (a, B.ByteString)
      readInt = fmap (first fromIntegral . second B.tail) . B.readInt

  (h, w) <-
    (\vec -> (vec VU.! 0, vec VU.! 1)) . VU.unfoldrN 2 readInt <$> B.getLine
  ahw <-
    V.replicateM h
    $   VU.unfoldrN w (\bs -> Just (B.head bs == '#', B.tail bs))
    <$> B.getLine
  print $ solve h w ahw
