/*
求出所有可能的向量V(x,y)使一个点集通过V移动后和新的点集合并,得到给定的点集
直接枚举1和其他点组成的向量即可
因为不管怎么平移,1肯定要有个对应的点,所以合法向量就从这里找即可
注意:得到的向量统一转换成x>0的向量,然后再*2就是答案
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 2005
struct point {
int x,y;
}p[N];
int n,ans;
point V;
map<pair<int,int> ,int>mp;
set<pair<int,int> >s;
int check(){
for(int i=1;i<=n;i++){
if(mp[make_pair(p[i].x+V.x,p[i].y+V.y)]==0 &&
mp[make_pair(p[i].x-V.x,p[i].y-V.y)]==0)
return 0;
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
mp[make_pair(p[i].x,p[i].y)]=1;
}
for(int i=2;i<=n;i++){
V.x=p[i].x-p[1].x;
V.y=p[i].y-p[1].y;
if(V.x<0)V.x*=-1,V.y*=-1;
if(V.x==0)V.y=abs(V.y);
if(check()){
s.insert(make_pair(V.x,V.y));
}
}
cout<<s.size()*2<<'\n';
}