There are N squares arranged in a row, numbered 1, 2, ..., N from left to right. You are given a string S of length N consisting of `.` and `#`. If the i-th character of S is `#`, Square i contains a rock; if the i-th character of S is `.`, Square i is empty.

In the beginning, Snuke stands on Square A, and Fnuke stands on Square B.

You can repeat the following operation any number of times:

* Choose Snuke or Fnuke, and make him jump one or two squares to the right. The destination must be one of the squares, and it must not contain a rock or the other person.



You want to repeat this operation so that Snuke will stand on Square C and Fnuke will stand on Square D.

Determine whether this is possible.

Constraints

* 4 \leq N \leq 200\ 000
* S is a string of length N consisting of `.` and `#`.
* 1 \leq A, B, C, D \leq N
* Square A, B, C and D do not contain a rock.
* A, B, C and D are all different.
* A < B
* A < C
* B < D

Input

Input is given from Standard Input in the following format:


N A B C D
S


Output

Print `Yes` if the objective is achievable, and `No` if it is not.

Examples

Input

7 1 3 6 7
.#..#..


Output

Yes


Input

7 1 3 7 6
.#..#..


Output

No


Input

15 1 3 15 13
...#.#...#.#...


Output

Yes

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.NoSuchElementException;

public class Main {

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

	private void solve() throws IOException {
		try {
			solveA();
			//			 solveB();
			//			 solveC();
			//			 solveD();
			//			 solveE();
			//			 solveF();
		} finally {
			if (in != null) {
				in.close();
			}
			if (out != null) {
				out.flush();
				out.close();
			}
		}

	}

	private void solveA() {
		int n = nextInt();
		int a = nextInt() - 1;
		int b = nextInt() - 1;
		int c = nextInt() - 1;
		int d = nextInt() - 1;

		char[] s = next().toCharArray();

		/*
		 * たどり着くことができるかの判定
		 */
		int cnt = 0;
		/*
		 * AがCに到達可能か否か
		 */
		for (int i = a; i < c; i++) {
			if (s[i] == '#') {
				cnt++;
			} else {
				cnt = 0;
			}
			//2個連続した箇所がある場合は移動不可能
			if (cnt == 2) {
				out.println("No");
				return;
			}
		}
		/*
		 * BがDに到達可能か否か
		 */
		for (int i = b; i < d; i++) {
			if (s[i] == '#') {
				cnt++;
			} else {
				cnt = 0;
			}
			//2個連続した#がある場合は移動不可能
			if (cnt == 2) {
				out.println("No");
				return;
			}
		}
		if (c < d) {
			/*
			 * A→CとB→Dは独立で考えてよい
			 * #が2個連続で存在したら移動できないが、
			 * ここまで来ているのでたどり着けている
			 */
			out.println("Yes");
		} else {
			/*
			 * AがCにたどり着く前にBを追い越す必要がある
			 * 追い越すためには、A→Cの間に連続した3か所の空白が必要
			 */
			cnt = 0;
			for (int i = b - 1; i <= d + 1; i++) {
				if (s[i] == '.') {
					cnt++;
				} else {
					cnt = 0;
				}
				/*
				 * 3個連続した空白があればAがBを追い越せる
				 * ただし、以下のパターンにおいては追い越せない。(.d.や..d# はOK)
				 * #d..
				 *
				 *なぜなら、BはDにたどり着かないといけないかつ、戻ることができない
				 *
				 */
				if (cnt == 3) {
					out.println("Yes");
					return;
				}
			}
			/*
			 * ここまで来たということは、
			 * A→C、B→Dの移動は可能
			 * ただし、
			 * AがCまでの間にBを追い越すことは不可能
			 * ということになる。
			 */
			out.println("No");
		}

	}

	private void solveB() {
		int n = nextInt();

		out.println("");
	}

	private void solveC() {
		int n = nextInt();

		out.println("");
	}

	private void solveD() {
		int n = nextInt();

		out.println("");
	}

	private void solveE() {
		int n = nextInt();

		out.println("");
	}

	private void solveF() {
		int n = nextInt();

		out.println("");
	}

	private final PrintWriter out = new PrintWriter(System.out);
	private final InputStream in = System.in;
	private final byte[] buffer = new byte[1024];
	private int ptr = 0;
	private int buflen = 0;

	private boolean hasNextByte() {
		if (ptr < buflen) {
			return true;
		} else {
			ptr = 0;
			try {
				buflen = in.read(buffer);
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (buflen <= 0) {
				return false;
			}
		}
		return true;
	}

	private int readByte() {
		if (hasNextByte())
			return buffer[ptr++];
		else
			return -1;
	}

	private static boolean isPrintableChar(int c) {
		return 33 <= c && c <= 126;
	}

	private void skipUnprintable() {
		while (hasNextByte() && !isPrintableChar(buffer[ptr]))
			ptr++;
	}

	public boolean hasNext() {
		skipUnprintable();
		return hasNextByte();
	}

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

	public String next() {
		if (!hasNext())
			throw new NoSuchElementException();
		StringBuilder sb = new StringBuilder();
		int b = readByte();
		while (isPrintableChar(b)) {
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}

	public long nextLong() {
		if (!hasNext())
			throw new NoSuchElementException();
		long n = 0;
		boolean minus = false;
		int b = readByte();
		if (b == '-') {
			minus = true;
			b = readByte();
		}
		if (b < '0' || '9' < b) {
			throw new NumberFormatException();
		}
		while (true) {
			if ('0' <= b && b <= '9') {
				n *= 10;
				n += b - '0';
			} else if (b == -1 || !isPrintableChar(b)) {
				return minus ? -n : n;
			} else {
				throw new NumberFormatException();
			}
			b = readByte();
		}
	}
}