rt,AT 上 WA 了 9 个点
#include<bits/stdc++.h>
#define up(i,l,r) for(int i=l,END##i=r;i<=END##i;i++)
#define dn(i,l,r) for(int i=l,END##i=r;i>=END##i;i--)
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
using namespace std;
const int INF=0x3f3f3f3f,N=2e5+7,p=1e9+7,nn=2000;
ll a[N],b[N],ans,n;
ll f[4007][4007];
ll fac[N],facinv[N];
namespace sol{
ll read(){
ll f=0,x=0;
char c=getchar();
while(c<'0'||c>'9') f|=c=='-',c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
void write(ll x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
ll qpow(ll base,ll k){
ll f=1;
while(k){
if(k&1) (f*=base)%=p;
(base*=base)%=p,k>>=1;
}
return f;
}
ll c(ll n,ll m){
return (fac[n]*facinv[m]%p*facinv[n-m])%p;
}
void solve(){
n=read();
up(i,1,n) a[i]=read(),b[i]=read(),f[nn-a[i]][nn-b[i]]++;
fac[0]=1,facinv[0]=qpow(fac[0],p-2)%p;
up(i,1,8000) fac[i]=(fac[i-1]*i)%p,facinv[i]=qpow(fac[i],p-2)%p;
up(i,1,nn<<1) up(j,1,nn<<1) (f[i][j]+=f[i-1][j]+f[i][j-1])%=p;
up(i,1,n) {
(ans+=f[a[i]+nn][b[i]+nn])%=p;
ll k=c(2*a[i]+2*b[i],2*a[i])%p;
(ans-=k)%=p;
(ans+=p)%=p;
}
(ans*=qpow(2,p-2))%=p;
write(ans);
}
}
using namespace sol;
signed main(){
solve();
return 0;
}