Problem: You are given four integers: H, W, h and w (1 ≤ h ≤ H, 1 ≤ w ≤ W). Determine whether there exists a matrix such that all of the following conditions are held, and construct one such matrix if the answer is positive:

* The matrix has H rows and W columns.
* Each element of the matrix is an integer between -10^9 and 10^9 (inclusive).
* The sum of all the elements of the matrix is positive.
* The sum of all the elements within every subrectangle with h rows and w columns in the matrix is negative.

Constraints

* 1 ≤ h ≤ H ≤ 500
* 1 ≤ w ≤ W ≤ 500

Input

Input is given from Standard Input in the following format:


H W h w


Output

If there does not exist a matrix that satisfies all of the conditions, print `No`.

Otherwise, print `Yes` in the first line, and print a matrix in the subsequent lines in the following format:


a_{11} ... a_{1W}
:
a_{H1} ... a_{HW}


Here, a_{ij} represents the (i,\ j) element of the matrix.

Examples

Input

3 3 2 2


Output

Yes
1 1 1
1 -4 1
1 1 1


Input

2 4 1 2


Output

No


Input

3 4 2 3


Output

Yes
2 -5 8 7
3 -5 -4 -5
2 1 -1 7

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;

public class Main {

	void go(int R, int C, int r, int c) {
		int cx = 0;
		int cy = R * C;
		for (int i = r - 1; i < R; i += r) {
			for (int j = c - 1; j < C; j += c) {
				cx++;
				cy--;
			}
		}
		
		// x > (rc - 1) y
		// cx * x < cy * y
		
		if ((r * c - 1) * cx >= cy) {
			throw new AssertionError();
		}
		
		int x = 2 * cx * (r * c - 1) + 1;
		int y = 2 * cx;
		
		out.println("Yes");
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (i % r == r - 1 && j % c == c - 1) {
					out.print((-x) + " ");
				} else {
					out.print(y + " ");
				}
			}
			out.println();
		}
	}
	
	void submit() {
		int R = nextInt();
		int C = nextInt();
		int r = nextInt();
		int c = nextInt();
		if (R % r == 0 && C % c == 0) {
			out.println("No");
			return;
		}
		
		go(R, C, r, c);
	}

	void preCalc() {

	}

	void stress() {
		for (int tst = 0;; tst++) {
			int R = rand(1, 500);
			int C = rand(1, 500);
			int r = rand(1, R);
			int c = rand(1, C);
			if (R % r == 0 && C % c == 0) {
				continue;
			}
			go(R, C, r, c);
			System.err.println(tst);
		}
	}

	void test() {
		int R = 500;
		int C = 500;
		int r = 500;
		int c = 499;
		go(R, C, r, c);
	}

	Main() throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		out = new PrintWriter(System.out);
		preCalc();
		submit();
//		stress();
//		test();
		out.close();
	}

	static final Random rng = new Random();

	static int rand(int l, int r) {
		return l + rng.nextInt(r - l + 1);
	}

	public static void main(String[] args) throws IOException {
		new Main();
	}

	BufferedReader br;
	PrintWriter out;
	StringTokenizer st;

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

	String nextString() {
		try {
			return br.readLine();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

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

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

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