fun main(args: Array<String>) {
  val (n, m, aTotal, bTotal) = readLine()!!.split(" ").map(String::toInt)
  var a = aTotal
  var b = bTotal
  val board = Array(n, { CharArray(m, { '.' }) })
  if (n % 2 == 1) {
    for (x in 0 until (m / 2)) {
      if (a > 0) {
        board[n - 1][2 * x] = '<'
        board[n - 1][2 * x + 1] = '>'
        a--
      }
    }
  }
  if (m % 2 == 1) {
    for (y in 0 until (n / 2)) {
      if (b > 0) {
        board[2 * y][m - 1] = '^'
        board[2 * y + 1][m - 1] = 'v'
        b--
      }
    }
  }
  val bn = n / 2
  val bm = m / 2
  for (y in 0 until bn) {
    for (x in 0 until bm) {
      if (a >= 2) {
        board[2 * y][2 * x] = '<'
        board[2 * y][2 * x + 1] = '>'
        board[2 * y + 1][2 * x] = '<'
        board[2 * y + 1][2 * x + 1] = '>'
        a -= 2
      } else if (b >= 2) {
        board[2 * y][2 * x] = '^'
        board[2 * y + 1][2 * x] = 'v'
        board[2 * y][2 * x + 1] = '^'
        board[2 * y + 1][2 * x + 1] = 'v'
        b -= 2
      } else if (a == 1 && b == 1 && y == bn - 1 && x == bm - 1 && n % 2 == 1 && m % 2 == 1) {
        // This is the trick part.
        if (board[2 * y][2 * x + 2] == '^') {
          board[2 * y][2 * x + 2] = '.'
          board[2 * y + 1][2 * x + 2] = '^'
          board[2 * y + 2][2 * x + 2] = 'v'
        }
        board[2 * y][2 * x] = '^'
        board[2 * y + 1][2 * x] = 'v'
        board[2 * y][2 * x + 1] = '<'
        board[2 * y][2 * x + 2] = '>'
        a--
        b--

      } else if (a == 1) {
        board[2 * y][2 * x] = '<'
        board[2 * y][2 * x + 1] = '>'
        a--
      } else if (b == 1) {
        board[2 * y][2 * x] = '^'
        board[2 * y + 1][2 * x] = 'v'
        b--
      }
    }
  }

  if (a > 0 || b > 0) {
    println("NO")
    return
  }
  println("YES")
  for (y in 0 until n) {
    println(String(board[y]))
  }
}