import java.io.*;
import java.util.*;
import java.math.*;
import java.lang.*;

import static java.lang.Math.*;

public class Solution implements Runnable
{
	static class InputReader
	{
		private InputStream stream;private byte[] buf = new byte[1024];
		private int curChar;
		private int numChars;
		private SpaceCharFilter filter;
		private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        public InputReader(InputStream stream){this.stream = stream;}
		public int read(){if (numChars==-1) throw new InputMismatchException();if (curChar >= numChars){curChar = 0;try{numChars = stream.read(buf);}catch (IOException e){throw new InputMismatchException();	}if(numChars <= 0)return -1;}return buf[curChar++];}
     	public String nextLine(){String str = "";try{str = br.readLine();}catch (IOException e){e.printStackTrace();}return str;}
		public int nextInt(){int c = read();	while(isSpaceChar(c))c = read();	int sgn = 1; if (c == '-'){sgn = -1;c = read();	}int res = 0;do{if(c<'0'||c>'9') throw new InputMismatchException();res *= 10;res += c - '0';c = read();}while (!isSpaceChar(c));return res * sgn;}
        public long nextLong(){int c = read();while (isSpaceChar(c))c = read();int sgn = 1;if (c == '-'){sgn = -1;c = read();}long res = 0;do{if (c < '0' || c > '9')throw new InputMismatchException();res *= 10;res += c - '0';c = read();}while (!isSpaceChar(c));return res * sgn;}
		public double nextDouble(){int c = read();while (isSpaceChar(c))c = read();int sgn = 1;if (c == '-'){sgn = -1;c = read();}double res = 0;while (!isSpaceChar(c) && c != '.'){if (c == 'e' || c == 'E')return res * Math.pow(10, nextInt());if (c < '0' || c > '9')
		throw new InputMismatchException();res *= 10;res += c - '0';c = read();}if (c == '.'){c = read();double m = 1;while (!isSpaceChar(c)){if (c == 'e' || c == 'E')return res * Math.pow(10, nextInt());if (c < '0' || c > '9')throw new InputMismatchException();m /= 10;res += (c - '0') * m;c = read();}}return res * sgn;}
        public String readString(){int c = read();while (isSpaceChar(c))c = read();StringBuilder res = new StringBuilder();do{res.appendCodePoint(c);c = read();}while (!isSpaceChar(c));return res.toString();}
		public boolean isSpaceChar(int c){if (filter != null)return filter.isSpaceChar(c);return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;}
		public String next(){return readString();}
        public interface SpaceCharFilter{public boolean isSpaceChar(int ch);}
	}

	public static void main(String args[]) throws Exception{new Thread(null, new Solution(),"Main",1<<27).start();}

	public static long gcd(long a, long b) { 	if (a == 0) return b; return gcd(b % a, a);}

	public static long findGCD(long arr[], int n) { 	long result = arr[0]; for (int i = 1; i < n; i++) result = gcd(arr[i], result);return result; }

	static void sortbycolomn(long arr[][], int col)
    {
        Arrays.sort(arr, new Comparator<long[]>() {
        @Override
        public int compare(final long[] entry1,final long[] entry2) {
            if (entry1[col] > entry2[col])return 1;
            else return -1;
        }
        });
    }

	public void run()
    {
        InputReader in = new InputReader(System.in);
        PrintWriter w = new PrintWriter(System.out);

		int a=in.nextInt();
		int b=in.nextInt();
		int c=in.nextInt();
		int d=in.nextInt();

		if(b==a-1){
		    if(c!=0 || d!=0)
		        w.println("NO");
		    else{
		        w.println("YES");
		        int[] arr=new int[a+b];
		        for(int i=0;i<a+b;i+=2)
		            arr[i]=0;
		        for(int i=1;i<b+a;i+=2)
		            arr[i]=1;
		        for(int i=0;i<a+b;i++)
		            w.print(arr[i]+" ");
		            w.println();
		    }
		}
		else if(b<a-1)
		    w.println("NO");
		else if(d==c+1){
		    if(a!=0 || b!=0)
		        w.println("NO");
		    else{
		        w.println("YES");
		        int[] arr=new int[c+d];
		        for(int i=0;i<c+d;i+=2)
		            arr[i]=3;
		        for(int i=1;i<d+c;i+=2)
		            arr[i]=2;
		        for(int i=0;i<c+d;i++)
		            w.print(arr[i]+" ");
		            w.println();
		    }
		}
		else if(d>c+1)
		    w.println("NO");
		else{
		    int restab=b-a;
		    int restcd=c-d;
		    if(restcd==restab){
		        w.println("YES");
		        int[] arr=new int[a+b+c+d];
		        Arrays.fill(arr,-1);
		        int temp=a;
		        for(int i=0;temp>0;i+=2,temp--)
		            arr[i]=0;
		        temp=b;
		        for(int i=1;temp>0;i+=2,temp--)
		            arr[i]=1;
		        temp=c;
		        for(int i=a*2;temp>0;i+=2,temp--)
		            arr[i]=2;
		        for(int i=0;i<(a+b+c+d);i++){
		            if(arr[i]==-1)
		                w.print("3 ");
		            else
		                w.print(arr[i]+" ");
		        }
		        w.println();
		    }
		    else if(restab!=0 && restcd==restab-1){
		        w.println("YES");
		        int[] arr=new int[a+b+c+d];
		        Arrays.fill(arr,-1);
		        int temp=b;
		        for(int i=0;temp>0;i+=2,temp--)
		            arr[i]=1;
		        temp=a;
		        for(int i=1;temp>0;i+=2,temp--)
		            arr[i]=0;
		        temp=c;
		        for(int i=(a*2+1);temp>0;i+=2,temp--)
		            arr[i]=2;
		        for(int i=0;i<(a+b+c+d);i++){
		            if(arr[i]==-1)
		                w.print("3 ");
		            else
		                w.print(arr[i]+" ");
		        }
		        w.println();
		    }
		    else if(restcd==restab+1){
		        w.println("YES");
		        int[] arr=new int[a+b+c+d-1];
		        Arrays.fill(arr,-1);
		        int temp=a;
		        for(int i=0;temp>0;i+=2,temp--)
		            arr[i]=0;
		        temp=b;
		        for(int i=1;temp>0;i+=2,temp--)
		            arr[i]=1;
		        temp=c-1;
		        for(int i=a*2;temp>0;i+=2,temp--)
		            arr[i]=2;
		        for(int i=0;i<(a+b+c+d-1);i++){
		            if(arr[i]==-1)
		                w.print("3 ");
		            else
		                w.print(arr[i]+" ");
		        }
		        w.println("2 ");
		    }
		    else
		        w.println("NO");
		}

	    w.flush();
        w.close();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = 0;
            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }
            int k = 1;
            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = a>=b?0:1;
            int k = a>=b?1:0;
            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }

            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = a>=b?0:1;
            int k = a>=b?1:0;

            if(a+c>=b+d){
                j = 0;
                k = 1;
            }else{
                j = 1;
                k = 0;
            }

            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }

            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = 0;
            int k = 0;

            if(a+c>=b+d){
                j = 0;
                k = 1;
            }else{
                j = 1;
                k = 0;
            }

            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }

            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            if(a!=0||b!=0||c!=0||d!=0){
                println("NO"); continue ot;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = a>=b?0:1;
            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }
            int k = a>=b?1:0;
            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

// written by luchy0120

public class Main {
    public static void main(String[] args) throws Exception {
       // System.setProperty("java.util.Arrays.useLegacyMergeSort","true");
        new Main().run();
    }

//    int get_room(int i,int j){
//        return i/3*3 + j/3;
//    }

//    int a[][] = new int[9][9];
//    int space = 0;
//
//    boolean vis_row[][] = new boolean[9][10];
//    boolean vis_col[][] = new boolean[9][10];
//    boolean vis_room[][] = new boolean[9][10];
//    int val[][][] =new int[9][9][];
//    int prepare[][];
//
//    void dfs(int rt){
//
//    }

    int n;
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    void solve(){

//        int t =ni();
//        int qx[] = new int[100001];
//        int qy[] = new int[100001];
//
//        for(int p=0;p<t;++p) {
//            n = ni();
//            int m = ni();
//            int x1  = ni();
//            int y1  = ni();
//            int x2 = ni();
//            int y2 = ni();
//            if(x1>x2){
//                int u = x1;
//                x1 = x2;
//                x2 = u;
//            }
//
//            int d[] = new int[n];
//            Arrays.fill(d,n);
//
//            for (int i = 0; i < m-2; ++i) {
//                int x = ni();
//                int y = ni();
//                d[x] = Math.min(d[x],Math.abs(y-y1));
//            }
//
//            d[x1] = 0;
//            for(int i=x1+1;i<x2;++i){
//                d[i] = Math.min(d[i],d[i-1]+1);
//            }
//            d[x2] = 0;
//            for(int i=x2-1;i>x1;--i){
//                d[i] = Math.min(d[i],d[i+1]+1);
//            }
//
//            int ans = 0;
//            for(int i=x1+1;i<x2;++i){
//                if(d[i]>=1){
//                    ans += Math.min(d[i],n-y1);
//                    ans += Math.min(d[i],y1+1);
//                    ans--;
//                }
//            }
//            println(ans);
//
//
//        }

        int t = 1;
        ot:for(int i=0;i<t;++i){
            int a = ni();
            int b = ni();
            int c = ni();
            int d = ni();
            int s = a+b+c+d;

            int x[] = new int[s];
            int j = a>=b?0:1;
            int k = a>=b?1:0;

            if(a>b){
                j = 0;
                k = 1;
            }else if(a<b){
                j = 1;
                k = 0;
            }else if(c<d){
                j = 1;
                k = 0;
            }else{
                j = 0;
                k = 1;
            }

            for(;j<s&&a>0;j+=2){
                x[j] = 0;a--;
            }

            for(;k<s&&b>0;k+=2){
                x[k] = 1;b--;
            }
            for(;j<s&&c>0;j+=2){
                x[j] = 2;c--;
            }
            for(;k<s&&d>0;k+=2){
                x[k] = 3;d--;
            }

            for(int jj=1;jj<s;++jj){
                if(Math.abs(x[jj]-x[jj-1])!=1){
                    println("NO"); continue ot;
                }
            }
            println("YES");
            for(int jj=0;jj<s;++jj){
                print(x[jj]);
                if(jj!=s-1){
                    print(" ");
                }
            }

        }

    }

//    void solve() {
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                int v = ni();
//                a[i][j] = v;
//                if(v>0) {
//                    vis_row[i][v] = true;
//                    vis_col[j][v] = true;
//                    vis_room[get_room(i, j)][v] = true;
//                }else{
//                    space++;
//                }
//            }
//        }
//
//
//        prepare = new int[space][2];
//
//        int p = 0;
//
//        for(int i=0;i<9;++i) {
//            for (int j = 0; j < 9; ++j) {
//                if(a[i][j]==0){
//                    prepare[p][0] = i;
//                    prepare[p][1]= j;p++;
//                    List<Integer> temp =new ArrayList<>();
//                    for(int k=1;k<=9;++k){
//                        if(!vis_col[j][k]&&!vis_row[i][k]&&!vis_room[get_room(i,j)][k]){
//                            temp.add(k);
//                        }
//                    }
//                    int sz = temp.size();
//                    val[i][j] = new int[sz];
//                    for(int k=0;k<sz;++k){
//                        val[i][j][k] = temp.get(k);
//                    }
//                }
//            }
//        }
//        Arrays.sort(prepare,(x,y)->{
//           return Integer.compare(val[x[0]][x[1]].length,val[y[0]][y[1]].length);
//        });
//        dfs(0);
//
//
//
//
//
//
//
//
//
//
//    }

    InputStream is;
    PrintWriter out;

    void run() throws Exception {
        is = System.in;
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte() {
        if (lenbuf == -1) throw new InputMismatchException();
        if (ptrbuf >= lenbuf) {
            ptrbuf = 0;
            try {
                lenbuf = is.read(inbuf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (lenbuf <= 0) return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) {
        return !(c >= 33 && c <= 126);
    }

    private int skip() {
        int b;
        while ((b = readByte()) != -1 && isSpaceChar(b)) ;
        return b;
    }

    private double nd() {
        return Double.parseDouble(ns());
    }

    private char nc() {
        return (char) skip();
    }

    private char ncc() {
        int b = readByte();
        return (char) b;
    }

    private String ns() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!(isSpaceChar(b))) { // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n) {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while (p < n && !(isSpaceChar(b))) {
            buf[p++] = (char) b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private String nline() {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while (!isSpaceChar(b) || b == ' ') {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[][] nm(int n, int m) {
        char[][] a = new char[n][];
        for (int i = 0; i < n; i++) a[i] = ns(m);
        return a;
    }

    private int[] na(int n) {
        int[] a = new int[n];
        for (int i = 0; i < n; i++) a[i] = ni();
        return a;
    }

    private long[] nal(int n) {
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = nl();
        return a;
    }

    private int ni() {
        int num = 0, b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = (num << 3) + (num << 1) + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    private long nl() {
        long num = 0;
        int b;
        boolean minus = false;
        while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) {
        }
        ;
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        while (true) {
            if (b >= '0' && b <= '9') num = num * 10 + (b - '0');
            else return minus ? -num : num;
            b = readByte();
        }
    }

    void print(Object obj) {
        out.print(obj);
    }

    void println(Object obj) {
        out.println(obj);
    }

    void println() {
        out.println();
    }
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		if(freq[0]>freq[1] || freq[2]<freq[3]) {
			System.out.println("NO");
			return;
		}

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		if(freq[1]>1 || freq[2]>1) {
			System.out.println("NO");
			return;
		}

		out=new StringBuilder();

		if(freq[1]==0 && freq[2]==0)
			out.append(s01+s12+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		for(int i=0; i<4; i++)
			if(freq[i]>1) {
				System.out.println("NO");
				return;
			}

		out=new StringBuilder();

		if(freq[0]==1) {
			if(freq[1]==0 && freq[2]==0 && freq[3]==0 && s12.length()==0 && s23.length()==0)
				out.append("1"+s01);
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[3]==1) {
			if(freq[0]==0 && freq[1]==0 && freq[2]==0 && s01.length()==0 && s12.length()==0)
				out.append("3"+s23);
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[1]==0 && freq[2]==0)
			out.append(s01+reverse(s12)+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		for(int i=0; i<3; i++)
			if(freq[i]>1) {
				System.out.println("NO");
				return;
			}

		out=new StringBuilder();

		if(freq[0]==1) {
			if(freq[1]==0 && freq[2]==0 && freq[3]==0 && s12.length()==0 && s23.length()==0)
				out.append("1"+s01);
			else {
				System.out.println(-1);
				return;
			}
		}
		else if(freq[3]==1) {
			if(freq[0]==0 && freq[1]==0 && freq[2]==0 && s01.length()==0 && s12.length()==0)
				out.append("3"+s23);
			else {
				System.out.println(-1);
				return;
			}
		}
		else if(freq[1]==0 && freq[2]==0)
			out.append(s01+reverse(s12)+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		if(freq[0]>freq[1] || freq[2]<freq[3]) {
			System.out.println("NO");
			return;
		}

		while(freq[0]--!=0 && freq[1]--!=0)
			out.append("01");
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]--!=0 && freq[3]--!=0)
			out.append("23");
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]--!=0 && freq[2]--!=0)
			out.append("12");
		String s12=out.toString();

		if(freq[1]>1 || freq[2]>1) {
			System.out.println("NO");
			return;
		}

		out=new StringBuilder();

		if(freq[1]==0 && freq[2]==0)
			out.append(s01+s12+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		for(int i=0; i<3; i++)
			if(freq[i]>1) {
				System.out.println("NO");
				return;
			}

		out=new StringBuilder();

		if(freq[0]==1) {
			if(freq[1]==0 && freq[2]==0 && freq[3]==0 && s12.length()==0 && s23.length()==0)
				out.append("1"+s01);
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[3]==1) {
			if(freq[0]==0 && freq[1]==0 && freq[2]==0 && s01.length()==0 && s12.length()==0)
				out.append("3"+s23);
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[1]==0 && freq[2]==0)
			out.append(s01+reverse(s12)+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		for(int i=0; i<4; i++)
			if(freq[i]>1) {
				System.out.println("NO");
				return;
			}

		out=new StringBuilder();

		if(freq[0]==1) {
			if(freq[1]==0 && freq[2]==0 && freq[3]==0 && s12.length()==0 && s23.length()==0)
				out.append(s01+"0");
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[3]==1) {
			if(freq[0]==0 && freq[1]==0 && freq[2]==0 && s01.length()==0 && s12.length()==0)
				out.append("3"+s23);
			else {
				System.out.println("NO");
				return;
			}
		}
		else if(freq[1]==0 && freq[2]==0)
			out.append(s01+reverse(s12)+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.util.*;
import java.io.*;

public class Solution{

	public static Integer INT(String s) {
		return Integer.parseInt(s);
	}
	public static Long LONG(String s) {
		return Long.parseLong(s);
	}

	static int mod=1_000_000_007, oo=Integer.MAX_VALUE, _oo=Integer.MIN_VALUE;
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static Scanner in=new Scanner(System.in);
	static StringBuilder out=new StringBuilder();

	//==================================================================================================================================================

	public static void main(String args[]) throws IOException {

		int freq[]=new int[4];
		for(int i=0; i<4; i++)
			freq[i]=in.nextInt();

		if(freq[0]>freq[1] || freq[2]<freq[3]) {
			System.out.println("NO");
			return;
		}

		while(freq[0]!=0 && freq[1]!=0) {
			out.append("01");
			freq[0]-=1;
			freq[1]-=1;
		}
		String s01=out.toString();

		out=new StringBuilder();

		while(freq[2]!=0 && freq[3]!=0) {
			out.append("23");
			freq[2]-=1;
			freq[3]-=1;
		}
		String s23=out.toString();

		out=new StringBuilder();

		while(freq[1]!=0 && freq[2]!=0) {
			out.append("12");
			freq[1]-=1;
			freq[2]-=1;
		}
		String s12=out.toString();

		// System.out.println(s01+" "+s12+" "+s23);

		if(freq[1]>1 || freq[2]>1) {
			System.out.println("NO");
			return;
		}

		out=new StringBuilder();

		if(freq[1]==0 && freq[2]==0)
			out.append(s01+reverse(s12)+s23);
		else {
			if(freq[1]==1)
				out.append(reverse(s01)+s12+"1"+s23);
			else
				out.append(s01+"2"+s12+reverse(s23));
		}

		char ans[]=out.toString().toCharArray();
		out=new StringBuilder();

		out.append("YES\n");
		for(char item: ans)
			out.append(item+" ");
		System.out.print(out);
	}

	public static String reverse(String s) {
		return new StringBuilder(s).reverse().toString();
	}
}


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Solve6 {

    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter(System.out);
        new Solve6().solve(pw);
        pw.flush();
        pw.close();
    }

    public void solve(PrintWriter pw) throws IOException {
        FastReader sc = new FastReader();
        this.pw = pw;
        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
        dp = new int[a + 1][b + 1][c + 1][d + 1][4];
        s = a + b + c + d;
        int y = dp(0, a, b, c, d, new ArrayList());
        if (y == -1) {
            pw.println("NO");
        }
    }
    int[][][][][] dp;
    PrintWriter pw;
    int s;

    public int dp(int i, int a, int b, int c, int d, ArrayList<Integer> t) {
        if (i == s) {
            pw.println("YES");
            pw.print(t.get(0));
            for (int j = 1; j < t.size(); j++) {
                pw.print(" " + t.get(j));
            }
            pw.println();
            return 1;
        }
        int p;
        if (i == 0) {
            p = -1;
        } else {
            p = t.get(i - 1);
            if (dp[a][b][c][d][p] != 0) {
                return -1;
            }
        }
        if (a > 0 && (p == 1 || p == -1)) {
            t.add(0);
            if (dp(i + 1, a - 1, b, c, d, t) == 1) {
                return 1;
            }
            t.remove(i);
        }
        if (b > 0 && (p == 0 || p == 2 || p == -1)) {
            t.add(1);
            if (dp(i + 1, a, b - 1, c, d, t) == 1) {
                return 1;
            }
            t.remove(i);
        }
        if (c > 0 && (p == 1 || p == 3 || p == -1)) {
            t.add(2);
            if (dp(i + 1, a, b, c - 1, d, t) == 1) {
                return 1;
            }
            t.remove(i);
        }
        if (d > 0 && (p == 2 || p == -1)) {
            t.add(3);
            if (dp(i + 1, a, b, c, d - 1, t) == 1) {
                return 1;
            }
            t.remove(i);
        }
        if (i == 0) {
            return -1;
        }
        return dp[a][b][c][d][p] = -1;
    }

    static class FastReader {

        StringTokenizer st;
        BufferedReader br;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) {
            try {
                br = new BufferedReader(new FileReader(s));
            } catch (Exception e) {
            }
        }

        public String next() {
            if (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception e) {
                }
            }
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public boolean hasNext() throws IOException {
            if (st != null && st.hasMoreTokens()) {
                return true;
            }
            String s = br.readLine();
            if (s == null || s.isEmpty()) {
                return false;
            }
            st = new StringTokenizer(s);
            return true;
        }
    }
}


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Solve7 {

    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter(System.out);
        new Solve7().solve(pw);
        pw.flush();
        pw.close();
    }

    public void solve(PrintWriter pw) throws IOException {
        FastReader sc = new FastReader();
        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
        if (a == b + 1 && c == 0 && d == 0) {
            pw.println("YES");
            for (int i = 0; i < b; i++) {
                pw.print("0 1 ");
            }
            pw.println("0");
            return;
        }
        if (d == c + 1 && a == 0 && b == 0) {
            pw.println("YES");
            for (int i = 0; i < c; i++) {
                pw.print("3 2 ");
            }
            pw.println("3");
            return;
        }
        if (a > b || d > c) {
            pw.println("NO");
            return;
        }
        b -= a;
        c -= d;
        if (Math.abs(b - c) > 1) {
            pw.println("NO");
            return;
        }
        StringBuilder sb = new StringBuilder();
        if (b > c) {
            for (int i = 0; i < c; i++) {
                sb.append("1 2 ");
            }
            sb.append("1 ");
        }
        for (int i = 0; i < a; i++) {
            sb.append("0 1 ");
        }
        for (int i = 0; i < d; i++) {
            sb.append("2 3 ");
        }
        if (c >= b) {
            for (int i = 0; i < b; i++) {
                sb.append("2 1 ");
            }
            if (c != b) {
                sb.append("2");
            }
        }
        pw.println("YES");
        pw.println(sb.toString().trim());
    }

    static class FastReader {

        StringTokenizer st;
        BufferedReader br;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) {
            try {
                br = new BufferedReader(new FileReader(s));
            } catch (Exception e) {
            }
        }

        public String next() {
            if (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception e) {
                }
            }
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public boolean hasNext() throws IOException {
            if (st != null && st.hasMoreTokens()) {
                return true;
            }
            String s = br.readLine();
            if (s == null || s.isEmpty()) {
                return false;
            }
            st = new StringTokenizer(s);
            return true;
        }
    }
}


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Solve7 {

    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter(System.out);
        new Solve7().solve(pw);
        pw.flush();
        pw.close();
    }

    public void solve(PrintWriter pw) throws IOException {
        FastReader sc = new FastReader();
        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
        int s = a + b + c + d;
        int[] ans = new int[s];
        int i = 0;
        if (a > 0) {
            ++i;
            --a;
        }
        while (a > 0) {
            if (b == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 1;
            --a;
            --b;
            i += 2;
        }
        if (b > 0) {
            ans[i++] = 1;
            --b;
        }
        if (i > 0 && ans[i - 1] == 0 && (c > 0 || d > 0)) {
            pw.println("NO");
            return;
        }
        if (i == 0 && d > 0) {
            ans[i++] = 3;
            --d;
        }
        while (d > 0) {
            if (c == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 2;
            ans[i + 1] = 3;
            --c;
            --d;
            i += 2;
        }
        if (c > 0) {
            ans[i++] = 2;
            --c;
        }
        while (c > 0) {
            if (b == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 1;
            ans[i + 1] = 2;
            --c;
            --b;
            i += 2;
        }
        if (i > 0 && ans[i - 1] != 1 && ans[i - 1] != 3 && b > 0) {
            ans[i++] = 1;
            --b;
        }
        if (b == 0) {
            pw.println("YES");
            pw.print(ans[0]);
            for (int j = 1; j < s; j++) {
                pw.print(" " + ans[j]);
            }
            pw.println();
        } else if (b == 1) {
            pw.println("YES");
            pw.print(1);
            for (int j = 0; j < s - 1; j++) {
                pw.print(" " + ans[j]);
            }
            pw.println();
        } else {
            pw.println("NO");
        }
    }

    static class FastReader {

        StringTokenizer st;
        BufferedReader br;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) {
            try {
                br = new BufferedReader(new FileReader(s));
            } catch (Exception e) {
            }
        }

        public String next() {
            if (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception e) {
                }
            }
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public boolean hasNext() throws IOException {
            if (st != null && st.hasMoreTokens()) {
                return true;
            }
            String s = br.readLine();
            if (s == null || s.isEmpty()) {
                return false;
            }
            st = new StringTokenizer(s);
            return true;
        }
    }
}


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Solve7 {

    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter(System.out);
        new Solve7().solve(pw);
        pw.flush();
        pw.close();
    }

    public void solve(PrintWriter pw) throws IOException {
        FastReader sc = new FastReader();
        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
        int s = a + b + c + d;
        int[] ans = new int[s];
        int i = 0;
        if (a > 0) {
            ++i;
            --a;
        }
        while (a > 0) {
            if (b == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 1;
            --a;
            --b;
            i += 2;
        }
        if (b > 0) {
            ans[i++] = 1;
            --b;
        }
        if (i > 0 && ans[i - 1] == 0 && (c > 0 || d > 0)) {
            pw.println("NO");
            return;
        }
        if (i == 0 && d > 0) {
            ans[i++] = 3;
            --d;
        }
        while (d > 0) {
            if (c == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 2;
            ans[i + 1] = 3;
            --c;
            --d;
            i += 2;
        }
        if (c > 0) {
            ans[i++] = 2;
            --c;
        }
        while (c > 0) {
            if (b == 0) {
                pw.println("NO");
                return;
            }
            ans[i] = 1;
            ans[i + 1] = 2;
            --c;
            --b;
            i += 2;
        }
        if (i > 0 && ans[i - 1] != 1 && b > 0) {
            ans[i++] = 1;
            --b;
        }
        if (b == 0) {
            pw.println("YES");
            pw.print(ans[0]);
            for (int j = 1; j < s; j++) {
                pw.print(" " + ans[j]);
            }
            pw.println();
        } else if (b == 1) {
            pw.println("YES");
            pw.print(1);
            for (int j = 0; j < s - 1; j++) {
                pw.print(" " + ans[j]);
            }
            pw.println();
        } else {
            pw.println("NO");
        }
    }

    static class FastReader {

        StringTokenizer st;
        BufferedReader br;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) {
            try {
                br = new BufferedReader(new FileReader(s));
            } catch (Exception e) {
            }
        }

        public String next() {
            if (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception e) {
                }
            }
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public boolean hasNext() throws IOException {
            if (st != null && st.hasMoreTokens()) {
                return true;
            }
            String s = br.readLine();
            if (s == null || s.isEmpty()) {
                return false;
            }
            st = new StringTokenizer(s);
            return true;
        }
    }
}


//package cf1;

import java.io.*;
import java.util.*;

public class utkarsh {

    BufferedReader br;
    PrintWriter out;

    long mod = (long) (1e9 + 7), inf = (long) (3e18);

    void solve() {
        int a[] = new int[4];
        for(int i = 0; i < 4; i++)  a[i] = ni();
        if(a[0] > a[1]) {
            if(a[0] > a[1] + 1) out.println("NO");
            else if(a[2] > 0 || a[3] > 0)   out.println("NO");
            else {
                out.println("YES");
                for(int i = 0; i < (a[0] + a[1]); i++)  out.print((i&1) +" ");
                out.println();
            }
            return;
        }
        if(a[3] > a[2]) {
            if(a[3] > a[2] + 1) out.println("NO");
            else if(a[0] > 0 || a[1] > 0)   out.println("NO");
            else {
                out.println("YES");
                for(int i = 1; i <= (a[2] + a[3]); i++)  out.print((2 + (i&1)) +" ");
                out.println();
            }
            return;
        }
        int n = a[0] + a[1] + a[2] + a[3];
        int zo = a[0];
        int tt = a[3];
        a[1] -= a[0];
        a[2] -= a[3];
        if(a[1] == a[2]) {
            out.println("YES");
            while(zo-- > 0) out.print("0 1 ");
            while(a[1]-- > 0)   out.print("2 1 ");
            while(tt-- > 0) out.print("2 3 ");
            out.println();
        } else if(a[1] > a[2]) {
            if(a[1] > a[2] + 1) out.println("NO");
            else {
                out.println("YES");
                out.print("1 ");
                while(zo-- > 0) out.print("0 1 ");
                while(a[2]-- > 0)   out.print("2 1 ");
                while(tt-- > 0) out.print("2 3 ");
                out.println();
            }
        } else {
            if(a[2] > a[1] + 1) out.println("NO");
            else {
                out.println("YES");
                while(zo-- > 0) out.print("0 1 ");
                while(a[1]-- > 0)   out.print("2 1 ");
                while(tt-- > 0) out.print("2 3 ");
                out.print("2");
                out.println();
            }
        }
    }

    long mp(long b, long e) {
        long r = 1;
        while(e > 0) {
            if( (e&1) == 1 )    r = (r * b) % mod;
            b = (b * b) % mod;
            e >>= 1;
        }
        return r;
    }

    // -------- I/O Template -------------

    char nc() {
        return ns().charAt(0);
    }

    String nLine() {
        try {
            return br.readLine();
        } catch(IOException e) {
            return "-1";
        }
    }

    double nd() {
        return Double.parseDouble(ns());
    }

    long nl() {
        return Long.parseLong(ns());
    }

    int ni() {
        return Integer.parseInt(ns());
    }

    StringTokenizer ip;

    String ns() {
        if(ip == null || !ip.hasMoreTokens()) {
            try {
                ip = new StringTokenizer(br.readLine());
            } catch(IOException e) {
                throw new InputMismatchException();
            }
        }
        return ip.nextToken();
    }

    void run() {
        br = new BufferedReader(new InputStreamReader(System.in));
        out = new PrintWriter(System.out);
        solve();
        out.flush();
    }

    public static void main(String[] args) {
        new utkarsh().run();
    }
}


import java.io.*;
import java.util.*;

public class Main {

    void run(FastIO io) {
        int a = io.nextInt(), b = io.nextInt(), c = io.nextInt(), d = io.nextInt(), min;
        StringBuilder sb = new StringBuilder();
        //boolean end = false;

        if (a + b + c + d == 1) {
            io.print("YES\r\n" + (a == b ? c == 1 ? 2 : 3 : a == 1 ? 0 : 1));
        } else {
            int a1 = a, b1 = b, c1 = c, d1 = d;
            min = Math.min(a, b);
            a1 -= min;
            b1 -= min;
            min = Math.min(c, d);
            c1 -= min;
            d1 -= min;
            min = Math.min(c1, b1);
            c1 -= min;
            b1 -= min;

            if (a1 > 0 || b1 > 1 || c1 > 1 || d1 > 0 || (a1 + c1) > 1 || (a1 + d1) > 1 || (b1 + d1) > 1) io.print("NO");
            else {
                if (b1 == 1) {
                    sb.append("1 ");
                    b--;
                }
                while (a > 0) {
                    sb.append("0 ");
                    a--;
                    if (b > 0) {
                        sb.append("1 ");
                        b--;
                    }
                }
                if (c > 0) {
                    sb.append("2 ");
                    c--;
                }
                while (b > 0) {
                    sb.append("1 ");
                    b--;
                    if (c > 0) {
                        sb.append("2 ");
                        c--;
                    }
                }
                if (d > 0) {
                    sb.append("3 ");
                    d--;
                }
                while (c > 0) {
                    sb.append("2 ");
                    c--;
                    if (d > 0) {
                        sb.append("3 ");
                        d--;
                    }
                }

                io.print("YES\r\n" + sb.toString());
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        try (FastIO io = new FastIO(System.in, System.out)) {
            Thread t = new Thread(null, () -> new Main().run(io), "", (long) 3e7);
            t.start();
            t.join();
        }
    }

    static class FastIO extends PrintWriter {
        BufferedReader br;
        StringTokenizer stok;

        FastIO(InputStream is, OutputStream os) {
            super(os, false);
            br = new BufferedReader(new InputStreamReader(is));
            stok = new StringTokenizer("");
        }

        String nextToken() {
            while (!stok.hasMoreTokens()) {
                String s;
                try {
                    s = br.readLine();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                if (s == null) {
                    return null;
                }
                stok = new StringTokenizer(s);
            }
            return stok.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(nextToken());
        }

        double nextDouble() {
            return Double.parseDouble(nextToken());
        }

        long nextLong() {
            return Long.parseLong(nextToken());
        }
    }
}


import java.io.*;
import java.util.*;

public class Main {

    public void run(FastIO io) {
        int a = io.nextInt(), b = io.nextInt(), c = io.nextInt(), d = io.nextInt(), min;
        StringBuilder sb = new StringBuilder();
        //boolean end = false;

        if (a + b + c + d == 1) {
            io.print("YES\r\n" + (a == b ? c == 1 ? 2 : 3 : a == 1 ? 0 : 1));
        } else {
            int a1 = a, b1 = b, c1 = c, d1 = d;
            min = Math.min(a, b);
            a1 -= min;
            b1 -= min;
            min = Math.min(c, d);
            c1 -= min;
            d1 -= min;
            min = Math.min(c1, b1);
            c1 -= min;
            b1 -= min;

            if (a1 > 1 || b1 > 1 || c1 > 1 || d1 > 1 || (a1 + c1) > 1 || (a1 + d1) > 1 || (b1 + d1) > 1 || d > c && a + b > 0 || a > b && c + d > 0) io.print("NO");
            else {
                if (b1 == 1) {
                    sb.append("1 ");
                    b--;
                }
                while (a > 0) {
                    sb.append("0 ");
                    a--;
                    if (b > 0) {
                        sb.append("1 ");
                        b--;
                    }
                }
                if (a + b == 0 && d > c) {
                    sb.append("3 ");
                    d--;
                }
                if (c > 0) {
                    sb.append("2 ");
                    c--;
                }
                while (b > 0) {
                    sb.append("1 ");
                    b--;
                    if (c > 0) {
                        sb.append("2 ");
                        c--;
                    }
                }
                if (d > 0) {
                    sb.append("3 ");
                    d--;
                }
                while (c > 0) {
                    sb.append("2 ");
                    c--;
                    if (d > 0) {
                        sb.append("3 ");
                        d--;
                    }
                }

                io.print("YES\r\n" + sb.toString());
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        try (FastIO io = new FastIO(System.in, System.out)) {
            Thread t = new Thread(null, () -> new Main().run(io), "", (long) 3e7);
            t.start();
            t.join();
        }
    }

    static class FastIO extends PrintWriter {
        BufferedReader br;
        StringTokenizer stok;

        FastIO(InputStream is, OutputStream os) {
            super(os, false);
            br = new BufferedReader(new InputStreamReader(is));
            stok = new StringTokenizer("");
        }

        String nextToken() {
            while (!stok.hasMoreTokens()) {
                String s;
                try {
                    s = br.readLine();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                if (s == null) {
                    return null;
                }
                stok = new StringTokenizer(s);
            }
            return stok.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(nextToken());
        }

        double nextDouble() {
            return Double.parseDouble(nextToken());
        }

        long nextLong() {
            return Long.parseLong(nextToken());
        }
    }
}


import java.io.*;
import java.util.*;

public class Main {

    void run(FastIO io) {
        int a = io.nextInt(), b = io.nextInt(), c = io.nextInt(), d = io.nextInt();
        StringBuilder sb = new StringBuilder();
        boolean end = false;

        if (a > b && (c > 0 || d > 0) || d > c && (a > 0 || b > 0)) end = true;
        else {

            while (a > 0) {
                sb.append("0 ");
//                if (b > 0)
                sb.append("1 ");
                a--;
                b--;
            }
            while (b > 0) {
                if (c > 0)
                {
                    sb.append("2 ");
                    c--;
                }
                else {
                    end = true;
                    break;
                }
                sb.append("1 ");
                b--;
            }
            while (c > 0 && !end) {
                sb.append("2 ");
                if (d > 0) {
                    sb.append("3 ");
                    d--;
                }
                c--;
            }
        }
        io.print(end ? "NO" : "YES\r\n" + sb.toString());
    }

    public static void main(String[] args) throws InterruptedException {
        try (FastIO io = new FastIO(System.in, System.out)) {
            Thread t = new Thread(null, () -> new Main().run(io), "", (long) 3e7);
            t.start();
            t.join();
        }
    }

    static class FastIO extends PrintWriter {
        BufferedReader br;
        StringTokenizer stok;

        FastIO(InputStream is, OutputStream os) {
            super(os, false);
            br = new BufferedReader(new InputStreamReader(is));
            stok = new StringTokenizer("");
        }

        String nextToken() {
            while (!stok.hasMoreTokens()) {
                String s;
                try {
                    s = br.readLine();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                if (s == null) {
                    return null;
                }
                stok = new StringTokenizer(s);
            }
            return stok.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(nextToken());
        }

        double nextDouble() {
            return Double.parseDouble(nextToken());
        }

        long nextLong() {
            return Long.parseLong(nextToken());
        }
    }
}


import java.io.*;
import java.util.*;

public class Main {

    public void run(FastIO io) {
        int a = io.nextInt(), b = io.nextInt(), c = io.nextInt(), d = io.nextInt(), min;
        StringBuilder sb = new StringBuilder();
        //boolean end = false;

        if (a + b + c + d == 1) {
            io.print("YES\r\n" + (a == b ? c == 1 ? 2 : 3 : a == 1 ? 0 : 1));
        } else {
            int a1 = a, b1 = b, c1 = c, d1 = d;
            min = Math.min(a, b);
            a1 -= min;
            b1 -= min;
            min = Math.min(c, d);
            c1 -= min;
            d1 -= min;
            min = Math.min(c1, b1);
            c1 -= min;
            b1 -= min;

            if (a1 > 1 || b1 > 1 || c1 > 1 || d1 > 1 || (a1 + c1) > 1 || (a1 + d1) > 1 || (b1 + d1) > 1 || d > c && a + b > 0 || a > b && c + d > 0) io.print("NO");
            else {
                if (b1 == 1) {
                    sb.append("1 ");
                    b--;
                }
                while (a > 0) {
                    sb.append("0 ");
                    a--;
                    if (b > 0) {
                        sb.append("1 ");
                        b--;
                    }
                }
                if (c > 0) {
                    sb.append("2 ");
                    c--;
                }
                while (b > 0) {
                    sb.append("1 ");
                    b--;
                    if (c > 0) {
                        sb.append("2 ");
                        c--;
                    }
                }
                if (d > 0) {
                    sb.append("3 ");
                    d--;
                }
                while (c > 0) {
                    sb.append("2 ");
                    c--;
                    if (d > 0) {
                        sb.append("3 ");
                        d--;
                    }
                }

                io.print("YES\r\n" + sb.toString());
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        try (FastIO io = new FastIO(System.in, System.out)) {
            Thread t = new Thread(null, () -> new Main().run(io), "", (long) 3e7);
            t.start();
            t.join();
        }
    }

    static class FastIO extends PrintWriter {
        BufferedReader br;
        StringTokenizer stok;

        FastIO(InputStream is, OutputStream os) {
            super(os, false);
            br = new BufferedReader(new InputStreamReader(is));
            stok = new StringTokenizer("");
        }

        String nextToken() {
            while (!stok.hasMoreTokens()) {
                String s;
                try {
                    s = br.readLine();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                if (s == null) {
                    return null;
                }
                stok = new StringTokenizer(s);
            }
            return stok.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(nextToken());
        }

        double nextDouble() {
            return Double.parseDouble(nextToken());
        }

        long nextLong() {
            return Long.parseLong(nextToken());
        }
    }
}