#include <bits/stdc++.h>
using namespace std;
pair<int, int> coor[8];
vector<int> jav1, jav2;
vector<pair<int, int> > A;
long long dis(pair<int, int> x, pair<int, int> y) {
  return (x.first - y.first) * (x.first - y.first) +
         (x.second - y.second) * (x.second - y.second);
}
bool check(int x) {
  int counter = 0;
  for (int i = 0; i < 8; i++)
    if (x & (1 << i)) counter++;
  if (counter == 4) return true;
  return false;
}
bool check1(int x) {
  A.clear();
  for (int i = 0; i < 8; i++)
    if (x & (1 << i)) A.push_back(pair<int, int>(coor[i]));
  vector<int> B[4], C;
  for (int i = 0; i < 4; i++) {
    C.clear();
    for (int j = 0; j < 4; j++)
      if (i != j) C.push_back(j);
    if ((A[C[0]].second - A[i].second) * (A[C[1]].second - A[i].second) ==
        -1 * (A[C[0]].first - A[i].first) * (A[C[1]].first - A[i].first)) {
      B[i].push_back(C[0]);
      B[i].push_back(C[1]);
      continue;
    }
    if ((A[C[0]].second - A[i].second) * (A[C[2]].second - A[i].second) ==
        -1 * (A[C[0]].first - A[i].first) * (A[C[2]].first - A[i].first)) {
      B[i].push_back(C[0]);
      B[i].push_back(C[2]);
      continue;
    }
    if ((A[C[2]].second - A[i].second) * (A[C[1]].second - A[i].second) ==
        -1 * (A[C[2]].first - A[i].first) * (A[C[1]].first - A[i].first)) {
      B[i].push_back(C[2]);
      B[i].push_back(C[1]);
      continue;
    }
    return false;
  }
  long long distan = dis(A[0], A[B[0][0]]);
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 2; j++)
      if (dis(A[i], A[B[i][j]]) != distan) return false;
  return true;
}
bool check2(int x) {
  A.clear();
  for (int i = 0; i < 8; i++)
    if (!(x & (1 << i))) A.push_back(pair<int, int>(coor[i]));
  vector<int> B[4], C;
  for (int i = 0; i < 4; i++) {
    C.clear();
    for (int j = 0; j < 4; j++)
      if (i != j) C.push_back(j);
    if ((A[C[0]].second - A[i].second) * (A[C[1]].second - A[i].second) ==
        -1 * (A[C[0]].first - A[i].first) * (A[C[1]].first - A[i].first)) {
      B[i].push_back(C[0]);
      B[i].push_back(C[1]);
      continue;
    }
    if ((A[C[0]].second - A[i].second) * (A[C[2]].second - A[i].second) ==
        -1 * (A[C[0]].first - A[i].first) * (A[C[2]].first - A[i].first)) {
      B[i].push_back(C[0]);
      B[i].push_back(C[2]);
      continue;
    }
    if ((A[C[2]].second - A[i].second) * (A[C[1]].second - A[i].second) ==
        -1 * (A[C[2]].first - A[i].first) * (A[C[1]].first - A[i].first)) {
      B[i].push_back(C[2]);
      B[i].push_back(C[1]);
      continue;
    }
    return false;
  }
  int q = B[0][0], w = B[0][1];
  for (int i = 1; i < 4; i++)
    if (q != i && w != i) {
      if (dis(A[0], A[q]) != dis(A[i], A[w])) return false;
      if (dis(A[0], A[w]) != dis(A[i], A[q])) return false;
    }
  return true;
}
int main() {
  for (int i = 0; i < 8; i++) cin >> coor[i].first >> coor[i].second;
  int temp = (1 << 8);
  bool flag = false;
  for (int i = 0; i < temp && !flag; i++)
    if (check(i)) {
      if (check1(i) && check2(i)) {
        for (int j = 0; j < 8; j++) {
          if (i & (1 << j))
            jav1.push_back(j);
          else
            jav2.push_back(j);
        }
        flag = true;
      }
    }
  if (!flag) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  for (int i = 0; i < jav1.size(); i++) cout << jav1[i] + 1 << " ";
  cout << endl;
  for (int i = 0; i < jav2.size(); i++) cout << jav2[i] + 1 << " ";
  return 0;
}
