/*
TASK: sym
LANG: C
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define MAXN 16384
#define SIZE 1000003
#define EPS 1e-7

typedef struct point { int x,y; } point;
typedef struct list { int x,y,id; struct list *next; } list;

int f[MAXN];
point p[MAXN];
list *H[SIZE];

int cmp(double e1,double e2)
{
	if(e1-e2<-EPS) return -1;
	if(e1-e2>EPS) return 1;
	return 0;
}

void add(list **T,int x,int y,int id)
{
	list *tmp=malloc(sizeof(list));
	tmp->x=x;
	tmp->y=y;
	tmp->id=id;
	tmp->next=*T;
	*T=tmp;
}

int get(list *T,int x,int y)
{
	while(T)
	{
		if(T->x==x&&T->y==y) return T->id;
		T=T->next;
	}
	return 0;
}

int hash(int x,int y)
{
	return ((x+MAXN)*2*MAXN+y+MAXN)%SIZE;
}

void push(int x,int y,int id)
{
	int code=hash(x,y);
	add(H+code,x,y,id);
}

int ask(int x,int y)
{
	int code=hash(x,y);
	return get(H[code],x,y);
}

int main()
{
	int n,i,j,k,cx,cy;
	double a1,b1,c1,a2,b2,c2,x,y,tx,ty,tmp;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&p[i].x,&p[i].y);
		push(p[i].x,p[i].y,i);
	}
	if(n==1) { printf("%d\n",1); return 0; }
	for(k=1;k<=2;k++)
	{
		for(i=k+1;i<=n;i++)
		{
			a1=p[k].x-p[i].x;
			b1=p[k].y-p[i].y;
			c1=-a1*(p[i].x+p[k].x)-b1*(p[i].y+p[k].y);
			c1/=2;
			a2=p[k].y-p[i].y;
			b2=p[i].x-p[k].x;
			tmp=a1*b2-a2*b1;
			for(j=1;j<=n;j++)
			{
				c2=-a2*p[j].x-b2*p[j].y;
				x=(b1*c2-b2*c1)/tmp;
				y=(a2*c1-a1*c2)/tmp;
				tx=x+(x-p[j].x);
				ty=y+(y-p[j].y);
				if(!cmp(tx,ceil(tx))) { cx=ceil(tx); }
				else if(!cmp(tx,floor(tx))) { cx=floor(tx); }
				else break;
				if(!cmp(ty,ceil(ty))) { cy=ceil(ty); }
				else if(!cmp(ty,floor(ty))) { cy=floor(ty); }
				else break;
				f[j]=ask(cx,cy);
				if(f[j]==0) break;
			}
			if(j==n+1)
			{
				for(j=1;j<n;j++) printf("%d ",f[j]);
				printf("%d\n",f[j]);
				return 0;
			}
		}
	}
	printf("%d\n",0);
	return 0;
}
