#include <bits/stdc++.h>
using namespace std;
struct Point {
  long long x, y;
  int id;
  Point(long long xx = 0, long long yy = 0) { x = xx, y = yy; }
  bool operator<(const Point a) const { return id < a.id; }
  friend ostream& operator<<(ostream& out, Point a) {
    out << "(" << a.x << " " << a.y << ")";
    return out;
  }
};
const int N = 8;
Point p[N];
long long sq(long long x) { return x * x; }
int dist(Point a, Point b) { return sq(a.x - b.x) + sq(a.y - b.y); }
bool isSquare(Point* p) {
  if (dist(p[0], p[2]) == 0 || dist(p[1], p[3]) == 0) return false;
  if (dist(p[0], p[1]) != dist(p[1], p[2])) return false;
  if (dist(p[0], p[1]) != dist(p[2], p[3])) return false;
  if (dist(p[0], p[1]) != dist(p[3], p[0])) return false;
  if (dist(p[0], p[2]) != dist(p[1], p[3])) return false;
  return true;
}
bool isRec(Point* p) {
  if (dist(p[0], p[2]) == 0 || dist(p[1], p[3]) == 0) return false;
  if (dist(p[0], p[1]) != dist(p[2], p[3])) return false;
  if (dist(p[1], p[2]) != dist(p[0], p[3])) return false;
  if (dist(p[0], p[2]) != dist(p[1], p[3])) return false;
  return true;
}
int main() {
  for (int i = 0; i < int(N); ++i) {
    cin >> p[i].x >> p[i].y;
    p[i].id = i;
  }
  sort(p, p + N);
  do {
    if (isSquare(p) && isRec(p + 4)) {
      printf("YES\n");
      printf("%d %d %d %d\n", p[0].id + 1, p[1].id + 1, p[2].id + 1,
             p[3].id + 1);
      printf("%d %d %d %d\n", p[4].id + 1, p[5].id + 1, p[6].id + 1,
             p[7].id + 1);
      return 0;
    }
  } while (next_permutation(p, p + N));
  printf("NO\n");
  return 0;
}
