#include<bits/stdc++.h>
#define f first
#define int long long
#define s second
using namespace std;
const int N=45,mod=1e9+7;
int t,x[N],y[N],n,dp[N][N][N][N],fact[N],
ans,ifact[N],A[N][N];
string s;
vector<int>inside[N][N][N];
vector<pair<int,pair<int,pair<int,int> > > > triangles;
int find_area(int X1,int Y1,int X2,int Y2){
return abs(X1*Y2-Y1*X2);
}
bool is_inside(int i,int j,int k,int p){
int X1=x[i],Y1=y[i],X2=x[j],Y2=y[j],X3=x[k],Y3=y[k],X4=x[p],Y4=y[p];
if(find_area(X2-X1,Y2-Y1,X3-X1,Y3-Y1) == find_area(X2-X1,Y2-Y1,X4-X1,Y4-Y1)
+ find_area(X3-X1,Y3-Y1,X4-X1,Y4-Y1)
+ find_area(X3-X2,Y3-Y2,X4-X2,Y4-Y2) ) return 1;
return 0;
}
void update(int a1,int a2,int a3,int c) {
int all=inside[a1][a2][a3].size();
int A1=min(a1,min(a2,a3)),A3=max(a1,max(a2,a3)),A2=a1+a2+a3-A1-A3;
int B1=min(a1,min(a2,c)),B3=max(a1,max(a2,c)),B2=a1+a2+c-B1-B3;
for(int i=0;i<=inside[B1][B2][B3].size();i++){
dp[A1][A2][A3][i+1]+=dp[B1][B2][B3][i];
dp[A1][A2][A3][i+1]%=mod;
}
}
int pwr(int u,int v){
if(v==0) return 1;
if(v==1) return u;
if(v%2) return u*pwr(u,v-1)%mod;
int p=pwr(u,v/2);
return p*p%mod;
}
main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
fact[0]=ifact[0]=1;
for(int i=1;i<=n;i++){
fact[i] = fact[i-1] * i%mod;
ifact[i] = ifact[i-1]*pwr(i,mod-2)%mod;
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
A[i][j] = fact[j]*ifact[j-i]%mod;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
for(int p=1;p<=n;p++){
if(is_inside(i,j,k,p)) inside[i][j][k].push_back(p);
}
if(i<j && j<k)triangles.push_back({inside[i][j][k].size(),{i,{j,k}}});
}
}
}
sort(triangles.begin(),triangles.end());
for(int k=0;k<triangles.size();k++) {
int a1=triangles[k].s.f,a2=triangles[k].s.s.f,a3=triangles[k].s.s.s;
dp[a1][a2][a3][3]=1;
for(int j=0;j<inside[a1][a2][a3].size();j++){
int p = inside[a1][a2][a3][j];
if(a1==p || a2==p || a3==p) continue;
update(a1,a2,a3,p);
update(a1,a3,a2,p);
update(a2,a3,a1,p);
}
int all=inside[a1][a2][a3].size();
vector<int> new_dp(n+5);
for(int i=3;i<=all;i++){
new_dp[i]+=dp[a1][a2][a3][i]; new_dp[i]%=mod;
for(int j=i+1;j<=all;j++){
// # of ways of choosing j-i from all-i A(j-i,all-i)
new_dp[j]+=dp[a1][a2][a3][i]*A[j-i][all-i]%mod;
new_dp[j]%=mod;
}
}
for(int i=0;i<=all;i++){
dp[a1][a2][a3][i] = new_dp[i];
}
ans+=dp[a1][a2][a3][n]*6%mod;
ans%=mod;
}
cout<<ans;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIHMgc2Vjb25kCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBOPTQ1LG1vZD0xZTkrNzsKaW50IHQseFtOXSx5W05dLG4sZHBbTl1bTl1bTl1bTl0sZmFjdFtOXSwKYW5zLGlmYWN0W05dLEFbTl1bTl07CnN0cmluZyBzOwp2ZWN0b3I8aW50Pmluc2lkZVtOXVtOXVtOXTsKdmVjdG9yPHBhaXI8aW50LHBhaXI8aW50LHBhaXI8aW50LGludD4gPiA+ID4gdHJpYW5nbGVzOwppbnQgZmluZF9hcmVhKGludCBYMSxpbnQgWTEsaW50IFgyLGludCBZMil7CglyZXR1cm4gYWJzKFgxKlkyLVkxKlgyKTsKfQpib29sIGlzX2luc2lkZShpbnQgaSxpbnQgaixpbnQgayxpbnQgcCl7CglpbnQgWDE9eFtpXSxZMT15W2ldLFgyPXhbal0sWTI9eVtqXSxYMz14W2tdLFkzPXlba10sWDQ9eFtwXSxZND15W3BdOwoJIGlmKGZpbmRfYXJlYShYMi1YMSxZMi1ZMSxYMy1YMSxZMy1ZMSkgPT0gZmluZF9hcmVhKFgyLVgxLFkyLVkxLFg0LVgxLFk0LVkxKSAKCSAJCQkJCQkJCQkJKyBmaW5kX2FyZWEoWDMtWDEsWTMtWTEsWDQtWDEsWTQtWTEpCgkJCQkJCQkJCQkJKyAgZmluZF9hcmVhKFgzLVgyLFkzLVkyLFg0LVgyLFk0LVkyKSApIHJldHVybiAxOwoJcmV0dXJuIDA7Cn0Kdm9pZCB1cGRhdGUoaW50IGExLGludCBhMixpbnQgYTMsaW50IGMpIHsKCWludCBhbGw9aW5zaWRlW2ExXVthMl1bYTNdLnNpemUoKTsKCWludCBBMT1taW4oYTEsbWluKGEyLGEzKSksQTM9bWF4KGExLG1heChhMixhMykpLEEyPWExK2EyK2EzLUExLUEzOwoJaW50IEIxPW1pbihhMSxtaW4oYTIsYykpLEIzPW1heChhMSxtYXgoYTIsYykpLEIyPWExK2EyK2MtQjEtQjM7Cglmb3IoaW50IGk9MDtpPD1pbnNpZGVbQjFdW0IyXVtCM10uc2l6ZSgpO2krKyl7CgkJZHBbQTFdW0EyXVtBM11baSsxXSs9ZHBbQjFdW0IyXVtCM11baV07CgkJZHBbQTFdW0EyXVtBM11baSsxXSU9bW9kOwoJfQp9IAppbnQgcHdyKGludCB1LGludCB2KXsKCWlmKHY9PTApIHJldHVybiAxOwoJaWYodj09MSkgcmV0dXJuIHU7CglpZih2JTIpIHJldHVybiB1KnB3cih1LHYtMSklbW9kOwoJaW50IHA9cHdyKHUsdi8yKTsKCXJldHVybiBwKnAlbW9kOwp9CiBtYWluKCl7CgljaW4+Pm47Cglmb3IoaW50IGk9MTtpPD1uO2krKyl7CgkJY2luPj54W2ldPj55W2ldOwoJfQoJZmFjdFswXT1pZmFjdFswXT0xOwoJZm9yKGludCBpPTE7aTw9bjtpKyspewoJCWZhY3RbaV0gPSBmYWN0W2ktMV0gKiBpJW1vZDsKCQlpZmFjdFtpXSA9IGlmYWN0W2ktMV0qcHdyKGksbW9kLTIpJW1vZDsKCX0KCWZvcihpbnQgaT0xO2k8PW47aSsrKXsKCQlmb3IoaW50IGo9aTtqPD1uO2orKyl7CgkJCUFbaV1bal0gPSBmYWN0W2pdKmlmYWN0W2otaV0lbW9kOwoJCX0KCX0KCWZvcihpbnQgaT0xO2k8PW47aSsrKXsKCQlmb3IoaW50IGo9MTtqPD1uO2orKyl7CgkJCWZvcihpbnQgaz0xO2s8PW47aysrKXsKCQkJCWZvcihpbnQgcD0xO3A8PW47cCsrKXsKCQkJCQlpZihpc19pbnNpZGUoaSxqLGsscCkpIGluc2lkZVtpXVtqXVtrXS5wdXNoX2JhY2socCk7CgkJCQl9CgkJCQlpZihpPGogJiYgajxrKXRyaWFuZ2xlcy5wdXNoX2JhY2soe2luc2lkZVtpXVtqXVtrXS5zaXplKCkse2kse2osa319fSk7CgkJCX0KCQl9Cgl9Cglzb3J0KHRyaWFuZ2xlcy5iZWdpbigpLHRyaWFuZ2xlcy5lbmQoKSk7Cglmb3IoaW50IGs9MDtrPHRyaWFuZ2xlcy5zaXplKCk7aysrKSB7IAoJCWludCBhMT10cmlhbmdsZXNba10ucy5mLGEyPXRyaWFuZ2xlc1trXS5zLnMuZixhMz10cmlhbmdsZXNba10ucy5zLnM7CgkJZHBbYTFdW2EyXVthM11bM109MTsKCQlmb3IoaW50IGo9MDtqPGluc2lkZVthMV1bYTJdW2EzXS5zaXplKCk7aisrKXsKCQkJaW50IHAgPSBpbnNpZGVbYTFdW2EyXVthM11bal07IAoJCQlpZihhMT09cCB8fCBhMj09cCB8fCBhMz09cCkgY29udGludWU7IAoJCQl1cGRhdGUoYTEsYTIsYTMscCk7CgkJCXVwZGF0ZShhMSxhMyxhMixwKTsKCQkJdXBkYXRlKGEyLGEzLGExLHApOwoJCX0KCQlpbnQgYWxsPWluc2lkZVthMV1bYTJdW2EzXS5zaXplKCk7CgkJdmVjdG9yPGludD4gbmV3X2RwKG4rNSk7CQoJCWZvcihpbnQgaT0zO2k8PWFsbDtpKyspewoJCQluZXdfZHBbaV0rPWRwW2ExXVthMl1bYTNdW2ldOwluZXdfZHBbaV0lPW1vZDsKCQkJZm9yKGludCBqPWkrMTtqPD1hbGw7aisrKXsKCQkJCS8vICMgb2Ygd2F5cyBvZiBjaG9vc2luZyBqLWkgZnJvbSBhbGwtaSBBKGotaSxhbGwtaSkKCQkJCW5ld19kcFtqXSs9ZHBbYTFdW2EyXVthM11baV0qQVtqLWldW2FsbC1pXSVtb2Q7CgkJCQluZXdfZHBbal0lPW1vZDsKCQkJfSAKCQl9CgkJZm9yKGludCBpPTA7aTw9YWxsO2krKyl7CgkJCWRwW2ExXVthMl1bYTNdW2ldID0gbmV3X2RwW2ldOwoJCX0KCQlhbnMrPWRwW2ExXVthMl1bYTNdW25dKjYlbW9kOwoJCWFucyU9bW9kOwoJfSAKCWNvdXQ8PGFuczsKfQo=