#include <bits/stdc++.h>
using namespace std;
int a[10];
vector<int> g[10];
vector<int> cur;
void check() {
  if ((a[0] + a[1] + a[2] + a[3]) != 0) {
    return;
  }
  puts("YES");
  for (int i = 0; i < (int)cur.size(); i++) {
    printf("%d", cur[i]);
    if (i == (int)cur.size() - 1) {
      printf("\n");
    } else {
      printf(" ");
    }
  }
  exit(0);
}
void goMn(int v, int can) {
  if (a[v] == 0) {
    return;
  }
  can = max(can, v - 1);
  cur.push_back(v);
  a[v]--;
  check();
  for (int to : g[v]) {
    if (a[to] == 0) {
      continue;
    }
    if (to < can) {
      continue;
    }
    int rep = min(a[v], a[to] - 1);
    for (int i = 0; i < rep; i++) {
      a[v]--;
      a[to]--;
      cur.push_back(to);
      cur.push_back(v);
    }
    goMn(to, can);
    for (int i = 0; i < rep; i++) {
      a[v]++;
      a[to]++;
      cur.pop_back();
      cur.pop_back();
    }
  }
  cur.pop_back();
  a[v]++;
}
void goMx(int v, int can) {
  if (a[v] == 0) {
    return;
  }
  can = min(can, v + 1);
  cur.push_back(v);
  a[v]--;
  check();
  for (int to : g[v]) {
    if (a[to] == 0) {
      continue;
    }
    if (to > can) {
      continue;
    }
    int rep = min(a[v], a[to] - 1);
    for (int i = 0; i < rep; i++) {
      a[v]--;
      a[to]--;
      cur.push_back(to);
      cur.push_back(v);
    }
    goMx(to, can);
    for (int i = 0; i < rep; i++) {
      a[v]++;
      a[to]++;
      cur.pop_back();
      cur.pop_back();
    }
  }
  cur.pop_back();
  a[v]++;
}
int main() {
  for (int i = 0; i < 4; i++) {
    cin >> a[i];
  }
  g[0].push_back(1);
  g[1].push_back(0);
  g[1].push_back(2);
  g[2].push_back(1);
  g[2].push_back(3);
  g[3].push_back(2);
  goMn(0, 0);
  goMn(1, 0);
  goMx(3, 3);
  goMx(2, 3);
  puts("NO");
  return 0;
}
