#include <bits/stdc++.h>
#define ll long long
#define MAXN 100010
#define MOD 1000000007
using namespace std;
ll x[MAXN],y[MAXN],st2[MAXN];
ll Area(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3)
{
    return abs((x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2)));
}
bool Line(ll i,ll j)
{
    ll x1=(ll)(x[i]),y1=(ll)(y[i]),x2=(ll)(x[j]),y2=(ll)(y[j]),k,m;
    if (Area(x1,y1,x2,y2,0,0)==0 && min(x[i],x[j])<=0 && max(x[i],x[j])>=0 && min(y[i],y[j])<=0 && max(y[i],y[j])>=0)
        return true;
    return false;
}
bool Line_2(ll x1,ll y1,ll x2,ll y2)
{
    if (Area(x1,y1,x2,y2,0,0)==0 && min(x1,x2)<=0 && max(x1,x2)>=0 && min(y1,y2)<=0 && max(y1,y2)>=0)
        return true;
    return false;
}
bool Triangle(ll x1,ll y1,ll x2,ll y2,ll x3,ll y3)
{
    ll a0=Area(x1,y1,x2,y2,x3,y3),a1=Area(x1,y1,x2,y2,0,0),a2=Area(x1,y1,0,0,x3,y3),a3=Area(0,0,x2,y2,x3,y3);
    if (a0==0)
    {
        if (Line_2(x1,y1,x2,y2) || Line_2(x1,y1,x3,y3) || Line_2(x3,y3,x2,y2))
            return true;
        return false;
    }
    return (a0==a1+a2+a3);
}
ll anssub4=0;
void Resi(ll n,string s)
{
    if (s.size()==n)
    {
        vector<ll> ind;
        for (ll i=0;i<n;i++)
        {
            if (s[i]=='1')
                ind.push_back(i+1);
        }
        if (ind.size()==0 || ind.size()==1)
            return;
        if (ind.size()==2)
        {
            if (Line(ind[0],ind[1]))
                anssub4++;
            return;
        }
        bool yes=false;
        for (ll i=0;i<ind.size();i++)
        {
            for (ll j=i+1;j<ind.size();j++)
            {
                if (Line(ind[i],ind[j]))
                    yes=true;
                for (ll p=j+1;p<ind.size();p++)
                {
                    double x1=x[ind[i]],y1=y[ind[i]],x2=x[ind[j]],y2=y[ind[j]],x3=x[ind[p]],y3=y[ind[p]];
                    if (Triangle(x1,y1,x2,y2,x3,y3))
                        yes=true;
                }
            }
        }
        anssub4+=yes;
        return;
    }
    Resi(n,s+'0');
    Resi(n,s+'1');
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n;
    cin >> n;
    for (ll i=1;i<=n;i++)
        cin >> x[i] >> y[i];
    if (n==1)
    {
        cout << 0 << "\n";
        return 0;
    }
    if (n==2)
    {
        cout << Line(1,2) << "\n";
        return 0;
    }
    if (n==3)
    {
        cout << Line(1,2)+Line(1,3)+Line(2,3)+Triangle((double)(x[1]),(double)(y[1]),(double)(x[2]),(double)(y[2]),(double)(x[3]),(double)(y[3])) << "\n";
        return 0;
    }
    bool podzad1=(y[1]==1),podzad2=abs(y[1])==1;
    for (ll i=2;i<=n;i++)
    {
        if (y[i]!=-1)
            podzad1=false;
        if (abs(y[i])!=1)
            podzad2=false;
    }
    st2[0]=1;
    for (ll i=1;i<=n;i++)
        st2[i]=(st2[i-1]*2)%MOD;
    if (podzad1)
    {
        vector<ll> x1;
        for (ll i=2;i<=n;i++)
            x1.push_back(x[i]);
        sort(x1.begin(),x1.end());
        ll pos=0;
        for (ll i=0;i<n-1;i++)
        {
            if (x1[i]+x[1]>=0)
            {
                pos=i;
                break;
            }
        }
        ll ans=0,l=pos,r=n-1-pos;
        if (x1[pos]+x[1]==0)
        {
            r--;
            ans=(st2[l]*st2[r])%MOD;
        }
        ans+=((st2[l]-1+MOD)*(st2[r]-1+MOD))%MOD;
        cout << ans << "\n";
        return 0;
    }
    if (n<=18)
    {
        Resi(n,"");
        cout << anssub4 << "\n";
    }
    return 0;
}