#include <bits/stdc++.h>
using namespace std;

using P = pair<long long, long long>;

int n;
vector<P> v;

long long solve();

int main() {
  cin >> n;
  v.resize(n);
  for (auto &p : v) cin >> p.first >> p.second;
  cout << solve() << endl;
  return 0;
}

long long solve() {
  vector<int> id(n), p;
  iota(id.begin(), id.end(), 0);
  sort(id.begin(), id.end(), [](int l, int r) { return v[l] < v[r]; });
  for (int i = 0; i < min(4, n); ++i) {
    p.push_back(id[i]);
    p.push_back(id[n - 1 - i]);
  }
  for (auto &p : v) swap(p.first, p.second);
  sort(id.begin(), id.end(), [](int l, int r) { return v[l] < v[r]; });
  for (int i = 0; i < min(4, n); ++i) {
    p.push_back(id[i]);
    p.push_back(id[n - 1 - i]);
  }
  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());
  n = p.size();
  vector<int> res;
  for (int i = 0; i < n; ++i)
    for (int j = i + 1; j < n; ++j)
      res.push_back(max(abs(v[p[i]].first - v[p[j]].first),
                        abs(v[p[i]].second - v[p[j]].second)));
  sort(res.begin(), res.end());
  res.pop_back();
  return res.back();
}

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#define REP(i, n) for(int i = 0; i < (int)(n); ++i)
using namespace std;
typedef long long ll;

double xs[200000+10];
double ys[200000+10];

bool g[105][105];
int visited[105];
int counter;

int main(void) {
  int n;
  scanf("%d", &n);
  REP(i, n) {
    scanf("%lf%lf", &xs[i], &ys[i]);
  }
  int start = n;
  int goal = n+1;
  double left = 0;
  double right = 100;
  REP(iTry, 100) {
    double mid = (left + right) / 2;
    REP(i, n) {
      g[i][i] = true;
      g[i][start] = g[start][i] = (ys[i] + 100) <= 2*mid;
      g[i][goal] = g[goal][i] = (100 - ys[i]) <= 2*mid;
      REP(j, i) {
        g[i][j] = g[j][i] = sqrt((xs[i]-xs[j])*(xs[i]-xs[j]) + (ys[i]-ys[j])*(ys[i]-ys[j])) <= 2*mid;
      }
    }
    ++counter;
    queue<int> q;
    q.push(start);
    visited[start] = counter;
    while(!q.empty()){
      int cur = q.front(); q.pop();
      REP(i, n+2) {
        if(g[cur][i] && visited[i] != counter) {
          q.push(i);
          visited[i] = counter;
        }
      }
    }
    if(visited[goal] == counter) {
      right = mid;
    } else {
      left = mid;
    }
  }
  printf("%.10f\n", left);
  
  return 0;
}
