using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
class Program
{
static long n;//nCkにおけるnの最大値
static long p = 1000000007;
static long[] factorials;//i!(mod p)を先にメモ
static long[] factorialRs;//i!^-1(mod p), pは素数

	static void Main()
	{
    string[] input = Console.ReadLine().Split(' ');
    long nn = long.Parse(input[0]);
    long m = long.Parse(input[1]);
    long k = long.Parse(input[2]);
    n = nn+m+2*k;
  
    FactorialReady();
    //ここからCombを使える

    long answer = 0;
    long answerMemo = 0;
    for(int i = 0; i <= k; i++)
    {
      answerMemo = 1;
      answerMemo *= CatalanNumber(i,m+i,p);
      answerMemo %= p;
      answerMemo *= CatalanNumber(k-i,nn+k-i,p);
      answerMemo %= p;
      answerMemo *= leftRightMove(m+2*i,2*(k-i)+nn,p);
      answerMemo %= p;

      answer += answerMemo;
      answer %= p;
    }

    Console.WriteLine(answer);
    
	}

  static long leftRightMove(long l, long r, long mod)
  {//左にl回、右にr回移動する方法の個数を返す。(mod p, pは素数)
    long answer = factorials[l+r];
    answer %= mod;
    answer *= factorialRs[l];
    answer %= mod;
    answer *= factorialRs[r];
    answer %= mod;
    return answer;
  }

  static long CatalanNumber(long l, long r, long mod)
  {//カタラン数(mod p, pは素数)を返す。すなわち、左にl回、右にr回移動するが、位置が1度も負にはならない方法の個数。
    if(l > r) return 0; 
  
    long answer = leftRightMove(l,r,mod);
    if(l == 0) return answer;

    long answerSub = leftRightMove(l-1,r+1,mod);

    answer -= answerSub;
    answer %= mod;
    if(answer < 0) answer += mod;
    return answer;
  }

  static void FactorialReady()
  {
    factorials = new long[n+1];
    factorialRs = new long[n+1];
    
    factorials[0] = 1;
    factorialRs[n] = DivideModFactorial(n,p);
    for(long i = 1; i <= n; i++)
    {
      factorials[i] = (factorials[i-1]*i)%p;//i!(mod p)
      factorialRs[n-i] = (factorialRs[n+1-i]*(n+1-i))%p;//逆元も先にメモ
    }
  }

  static long MathPow(long x, long a)//戻り値はx^a
  {
    long num = 2;
    long answer = 1;
    long check = a;
    long memo = x;
  
    while(check > 0)
    {
      if(check % num == num / 2)
      {
        check -= num / 2;
        answer *= memo;
      }
    memo *= memo;
    num *= 2;
    }
    return answer;
  }

  static long DivideMod(long x, long a, long p)//戻り値はx^a(mod p)
  {
    long num = 2;
    long answer = 1;
    long check = a;
    long memo = x%p;
    
    while(check > 0)
    {
      if(check % num == num / 2)
      {
        check -= num / 2;
        answer *= memo;
        answer %= p;
      }
    memo *= memo;
    memo %= p;
    num *= 2;
    }
    return answer;
  }

  static long DivideModReverse(long x, long p)//戻り値はx^-1(mod p), pは素数
  {
    long answer = DivideMod(x, p-2, p);
    return answer;
  }

  static long ModFactorial(long x, long p)//戻り値はx!(mod p)
  {
    long answer = 1;
    for(int i = 2; i <= x; i++)
    {
      answer *= i;
      answer %= p;
    }
    return answer;
  }

  static long DivideModFactorial(long x, long p)//戻り値はx!^-1(mod p), pは素数
  {
    long answer = 1;
    for(long i = x; i >= 2; i--)
    {
      answer *= DivideModReverse(i, p);
      answer %= p;
    }
    return answer;
  }

  static long Comb(long a, long b, long p)//戻り値は組み合わせC(a,b)のmod p
  {
    if(a-b < 0) return 0;//引数a-bが負なら0を返す
    long answer = 1;
    answer *= factorials[a];
    answer %= p;
    answer *= factorialRs[a-b];
    answer %= p;
    answer *= factorialRs[b];
    answer %= p;
    return answer;
  }
  
}



Measured memory_bytes: 19584