/*
TASK: sym
LANG: C++
*/
#include <stdio.h>
#include <math.h>
#include <queue>
#include <map>
#define MAXN 10005
#define EPS 1e-9
#define Z 10000
using namespace std;

 typedef
  struct
   {
    double x,y,dist,ang;
   } point;

 int n;
 point a[MAXN];
 point b[MAXN];
 point convex[MAXN];
 int res[MAXN]; 

 struct cmp
  {
   bool operator() (const point a,const point b) const
    {
     if (fabs(a.ang-b.ang)>EPS)
      return a.ang>b.ang;
     return a.dist<b.dist;
    }
  };

 int orient (point a,point b,point c)
  {
   double pom;
   pom=a.x*(b.y-c.y)+a.y*(c.x-b.x)+b.x*c.y-b.y*c.x;
   if (pom<-EPS) return -1;
   if (pom>EPS) return 1;
   return 0;
  }  

 priority_queue< point,vector<point>,cmp > g;
 map <int,int> h;

 void solve (double A,double B,double C)
  {
   int i,X,Y,pom;
   double D,px,py,x,y;
   char s[128];
   for (i=1;i<=n;i++)
    {
     if (fabs(A*b[i].x+B*b[i].y+C)<EPS)
      {
       res[i]=i;
       continue;
      }
     D=B*b[i].x-A*b[i].y;
     py=-(B*C+A*D)/(A*A+B*B);
     px=(B*D-A*C)/(A*A+B*B);
     x=b[i].x+(px-b[i].x)*2;
     y=b[i].y+(py-b[i].y)*2;
     if (x<-Z-EPS || x>Z+EPS || y<-Z-EPS || y>Z+EPS) return;
     sprintf(s,"%.0lf",x);sscanf(s,"%d",&X);
     sprintf(s,"%.0lf",y);sscanf(s,"%d",&Y);
     if (fabs(x-X)>EPS || fabs(y-Y)>EPS) return;
     pom=(X+Z)*(2*Z+1)+(Y+Z);
     if (h.find(pom)==h.end())
      return;
     res[i]=h[pom];
    }    
   for (i=1;i<=n;i++)
    {
     printf("%d",res[i]);
     if (i!=n) printf(" ");
      else printf("\n");
    }
   exit (0);
  }  

 int main ()
  {
   int i,j,k;
   point tmp;
   double last,x,y,A,B,C;
   scanf("%d",&n);
   for (i=1;i<=n;i++)
    {
     scanf("%d%d",&j,&k);
     h[(j+Z)*(2*Z+1)+(k+Z)]=i;     
     b[i].x=a[i].x=(double)j;
     b[i].y=a[i].y=(double)k;
    }
// one line
   for (i=3;i<=n;i++)
    if (orient(a[i],a[1],a[2])!=0) break;
   if (i>n)
    {
     for (i=1;i<=n;i++)
      {
       printf("%d",i);
       if (i!=n) printf(" ");
        else printf("\n");
      }
     exit (0);
    }
//
   j=1;
   for (i=2;i<=n;i++)
    if (a[j].y>a[i].y || (a[i].y==a[j].y && a[i].x<a[j].y))
     j=i;
   tmp=a[1];a[1]=a[j];a[j]=tmp;
   for (i=2;i<=n;i++)
    {
     a[i].ang=atan2(a[i].y-a[1].y,a[i].x-a[1].x);
     a[i].dist=(a[i].x-a[1].x)*(a[i].x-a[1].x)+(a[i].y-a[1].y)*(a[i].y-a[1].y);
     g.push(a[i]);
    }    
   for (i=2;i<=n;i++)
    {
     a[i]=g.top();
     g.pop();
    }
   k=1;
   convex[1]=a[1];
   last=-1;
   for (i=2;i<=n;i++)
    if (fabs(last-a[i].ang)>EPS)
     {
      convex[++k]=a[i];
      while (k>2 && orient(convex[k],convex[k-1],convex[k-2])>0)
       convex[--k]=convex[k+1];       
      last=a[i].ang;
     }
   convex[k+1]=convex[1];
   convex[0]=convex[k];
   for (i=1;i<=k;i++)
    {
     x=(convex[i].x+convex[i+1].x)/2.0;
     y=(convex[i].y+convex[i+1].y)/2.0;
     A=convex[i].y-convex[i+1].y;
     B=convex[i+1].x-convex[i].x;
//?     C=convex[i].x*convex[i+1].y-convex[i].y*convex[i+1].x;
     solve(B,-A,A*y-B*x);
    }
   for (i=1;i<=k;i++)
    {
     x=(convex[i-1].x+convex[i+1].x)/2.0;
     y=(convex[i-1].y+convex[i+1].y)/2.0;
     solve(convex[i].y-y,x-convex[i].x,convex[i].x*y-x*convex[i].y);
    }
   printf("0\n");
   return 0;
  }
  
