#include <iostream>
#include <bits/stdc++.h>

using namespace std;

struct Tacka
{
    long long int x;
    long long int y;
};

long double Abs(long double p)
{
    if(p>0)
    {
        return p;
    }
    return -p;
}

long double PovrsinaTrougla(Tacka A, Tacka B, Tacka C)
{
    return Abs((A.x * (B.y - C.y) + B.x * (C.y - A.y) + C.x * (A.y - B.y)) / 2);
}

bool TackeJednake(Tacka A, Tacka B)
{
    return (A.x==B.x && A.y==B.y);
}

bool IzmedjuTacaka(Tacka A, Tacka B, Tacka C)
{
    if(C.x < min(A.x, B.x) || C.x > max(A.x, B.x) || C.y < min(A.y, B.y) || C.y > max(A.y, B.y))
    {
        return false;
    }
    if(A.x==B.x)
    {
        return A.x==C.x;
    }
    // jednacina prave
    long double k = (long double)(A.y - B.y) / (A.x - B.x);
    long double n = (long double)A.y - k*A.x;
    //cout << k << " " << n << endl;
    return (C.y == (k * C.x + n));
}

int main()
{
    long long int n, i, res=0;
    cin >> n;
    Tacka tacke[n];
    Tacka M; M.x = 0; M.y = 0;
    for(i=0;i<n;i++)
    {
        cin >> tacke[i].x >> tacke[i].y;
    }

    // Svaka tacka
    for(i=0;i<n;i++)
    {
        if(TackeJednake(M, tacke[i]))
        {
            res++;
        }
    }
    //cout << "Nakon tacaka " << res << endl;

    // Svake dve tacke (pojedinacne duzi)
    for(int j1 = 0; j1 < n; j1++)
    {
        for(int j2=j1+1; j2 < n; j2++)
        {
            if(IzmedjuTacaka(tacke[j1], tacke[j2], M))
            {
                res++;
            }
        }
    }
    //cout << "Nakon duzi " << res << endl;

    // Povrsine
    long double p = PovrsinaTrougla(tacke[0], tacke[1], tacke[2]);
    long double p1 = PovrsinaTrougla(tacke[0], M, tacke[2]);
    long double p2 = PovrsinaTrougla(tacke[0], tacke[1], M);
    long double p3 = PovrsinaTrougla(M, tacke[1], tacke[2]);

    if(p>0)
    {
        if(p1+p2+p3 == p)
        {
            res++;
        }
    }
    else
    {
        Tacka min1, max1;
        // krajnja leva
        if(tacke[0].x < tacke[1].x)
        {
            if(tacke[0].x < tacke[2].x)
            {
                min1 = tacke[0];
            }
            else
            {
                min1 = tacke[2];
            }
        }
        else
        {
            if(tacke[1].x < tacke[2].x)
            {
                min1 = tacke[1];
            }
            else
            {
                min1 = tacke[2];
            }
        }
        // krajnja desna
        if(tacke[0].x > tacke[1].x)
        {
            if(tacke[0].x > tacke[2].x)
            {
                max1 = tacke[0];
            }
            else
            {
                max1 = tacke[2];
            }
        }
        else
        {
            if(tacke[1].x > tacke[2].x)
            {
                max1 = tacke[1];
            }
            else
            {
                max1 = tacke[2];
            }
        }

        if(IzmedjuTacaka(min1, max1, M))
        {
            res++;
        }
    }

    //cout << "Nakon trougla " << res << endl;

    cout << res % 1000000007 << endl;
}