In this problem you will write a simple code generator for a 2D programming language derived from [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck).

The code in this language is a rectangular grid of characters '.' and 'X'. The code is converted to a Brainfuck program as follows: the characters are read in the usual order (top to bottom, left to right), and each 'X' character is converted a Brainfuck instruction to be executed. The instruction is defined by the left, top and right neighbors of the 'X' character using the following conversion table:

<image>

You are given a string. Output a program in the described language which prints this string.

You can download the language interpreter used for judging here: <https://assets.codeforces.com/rounds/952/puzzling-interpreter.cpp> (use C++11 to compile the code). Note several implementation details:

  * The first step of the language interpretation is conversion to a Brainfuck program, which is then executed.
  * The code must be rectangular, with all lines of the same length. It can have at most 10,000 lines and 10,000 columns, and can have at most 500,000 'X' characters.
  * The code has toroidal topology, i.e. the 'X' on the first line will have top neighbor in the last line.
  * Brainfuck interpreter has 30000 memory cells which store integers from 0 to 255 with increment/decrement done modulo 256.
  * Console input (, command) is allowed in Brainfuck code but has no effect when executed.

Input

The input consists of a single string of characters with ASCII codes between 33 ('!') and 122 ('z'), inclusive. The length of the string is between 1 and 10 characters, inclusive.

Output

Output a program in the described language which, when executed, will print the given message.

Example

Input

$$$

Output

.......X.......
......XXX......
.....XXXXX.....
....XXXXXXX....
...XXXXXXXXX...
..XXXXXXXXXXX..
.XXXXXXXXXXXXX.
...............
X.............X
X..............
X..............
X..............

Note

The example corresponds to the following Brainfuck program:
    
    
           -  
          >+<  
         >+++<  
        >+++++<  
       >+++++++<  
      >+++++++++<  
     >+++++++++++<  
      
    <             >  
    .  
    .  
    .  
    

The triangular block decrements the first memory cell and sets the value of the second memory cell to 36 - the ASCII code of '$' character. The next line after the triangular block moves the memory pointer to the second memory cell, and the next three lines print the '$' character three times.
#include <bits/stdc++.h>
template <typename T>
bool uax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool uin(T& a, T b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
using namespace std;
namespace BF {
string errorMessage = "";
string interpretBF(const string& commands) {
  vector<unsigned char> data(1, 0);
  vector<unsigned char>::iterator dataPtr = data.begin();
  string::const_iterator instructionPtr = commands.begin();
  stack<string::const_iterator> instructionStack;
  int iterationCount = 0;
  string result;
  while (instructionPtr != commands.end()) {
    iterationCount++;
    if (iterationCount > 50000000) {
      errorMessage = "Too many instructions";
      return "";
    }
    switch (*instructionPtr) {
      case '<': {
        if (dataPtr != data.begin()) dataPtr--;
        break;
      }
      case '>': {
        dataPtr++;
        if (dataPtr == data.end()) {
          if (data.size() < 30000) data.push_back(0);
          dataPtr = data.end() - 1;
        }
        break;
      }
      case '+': {
        (*dataPtr)++;
        break;
      }
      case '-': {
        (*dataPtr)--;
        break;
      }
      case '.': {
        result += (unsigned char)(*dataPtr);
        break;
      }
      case ',': {
        break;
      }
      case '[': {
        instructionStack.push(instructionPtr);
        if (*dataPtr == 0) {
          string::const_iterator startInstructionPtr = instructionPtr;
          while (++instructionPtr != commands.end()) {
            iterationCount++;
            if (iterationCount > 50000000) {
              errorMessage = "Too many instructions";
              return "";
            }
            if (*instructionPtr == '[')
              instructionStack.push(instructionPtr);
            else if (*instructionPtr == ']') {
              if (instructionStack.empty()) {
                errorMessage = "Found a ']' that did not have a matching '['!";
                return "";
              }
              string::const_iterator tempInstructionPtr =
                  instructionStack.top();
              instructionStack.pop();
              if (startInstructionPtr == tempInstructionPtr) break;
            }
          }
        }
        break;
      }
      case ']': {
        if (instructionStack.empty()) {
          errorMessage = "Found a ']' that did not have a matching '['!";
          return "";
        }
        if (*dataPtr != 0)
          instructionPtr = instructionStack.top();
        else
          instructionStack.pop();
        break;
      }
      default:
        errorMessage = "Invalid character " + (*instructionPtr);
        return "";
    }
    if (instructionPtr == commands.end()) {
      errorMessage = "Invalid program";
      return "";
    }
    instructionPtr++;
  }
  if (!instructionStack.empty()) {
    errorMessage = "Found a '[' that did not have a matching ']'!";
    return "";
  }
  errorMessage = "";
  return result;
}
string convertToBF(const vector<string>& program) {
  string bfcode = "";
  int R = program.size();
  int C = program[0].size();
  for (int r = 0; r < R; ++r) {
    if ((int)program[r].size() != C) {
      errorMessage = "Each line of your code must have the same length";
      return "";
    }
    for (int c = 0; c < C; ++c) {
      if (program[r][c] != 'X' && program[r][c] != '.') {
        errorMessage = "Each character of your code must be either 'X' or '.'";
        return "";
      }
    }
  }
  cerr << R << " " << C << endl;
  for (int r = 0; r < R; ++r)
    for (int c = 0; c < C; ++c) {
      if (program[r][c] != 'X') continue;
      string mask = "";
      mask += program[r][(c - 1 + C) % C];
      mask += program[(r - 1 + R) % R][c];
      mask += program[r][(c + 1) % C];
      if (mask == "..X")
        bfcode += '>';
      else if (mask == "X..")
        bfcode += '<';
      else if (mask == "XXX")
        bfcode += '+';
      else if (mask == "...")
        bfcode += '-';
      else if (mask == ".X.")
        bfcode += '.';
      else if (mask == "X.X")
        bfcode += ',';
      else if (mask == "XX.")
        bfcode += '[';
      else if (mask == ".XX")
        bfcode += ']';
      else {
        errorMessage = "Unknown neighborhood " + mask;
        return "";
      }
    }
  errorMessage = "";
  return bfcode;
}
int main(vector<string> raw) {
  for (auto& t : raw) {
    if (raw.size() > 10000) {
      cerr << "Raw program has too many lines" << endl;
      return -1;
    }
  }
  if (raw[0].size() > 10000) {
    cerr << "Raw program has too many columns" << endl;
    return -1;
  }
  errorMessage = "";
  string bf = convertToBF(raw);
  if (errorMessage != "") {
    cerr << "BF conversion error: " << errorMessage << endl;
    return -1;
  }
  if (bf.length() > 500000) {
    cerr << "BF program too long" << endl;
    return -1;
  }
  cerr << bf << endl;
  string answer = interpretBF(bf);
  if (errorMessage != "") {
    cerr << "BF interpretation error: " << errorMessage << endl;
    return -1;
  }
  cout << answer << endl;
  return 0;
}
}  // namespace BF
constexpr int power(int x, int n) { return n > 0 ? power(x, n - 1) * x : 1; }
void solve_a() {
  int x;
  cin >> x;
  cout << !(x < 128 && isdigit(x)) << endl;
}
void solve_b() {
  bool ok = true;
  for (int i = (int)(0); i < (int)(10); ++i) {
    cout << i << endl << flush;
    string s;
    getline(cin, s);
    if (s == "terrible") ok = false;
  }
  cout << (ok ? "normal" : "grummy") << endl;
}
void solve_c() {
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = (int)(0); i < (int)(n); ++i) cin >> a[i];
  while (n > 1) {
    for (int i = (int)(0); i < (int)(n - 1); ++i)
      if (abs(a[i] - a[i + 1]) > 1) {
        cout << "NO" << endl;
        return;
      }
    a.erase(max_element((a).begin(), (a).end()));
    n -= 1;
  }
  cout << "YES" << endl;
}
void solve_g() {
  string s;
  getline(cin, s);
  int n = s.length();
  int m = 600;
  vector<string> a(5 * n, string(m, '.'));
  int z = 0;
  for (int i = (int)(0); i < (int)(n); ++i) {
    int x = (int)(s[i]);
    x &= 255;
    a[i * 5 + 1][0] = 'X';
    int j = 1;
    while (x != z) {
      if (i == 0) {
        z = (z + 1) % 256;
      } else {
        z = (z + 255) % 256;
      }
      a[i * 5 + 0][j] = 'X';
      a[i * 5 + 1][j] = 'X';
      ++j;
      a[i * 5 + 1][j] = 'X';
      ++j;
    }
    assert(j < m);
    a[i * 5 + 1][j] = 'X';
    a[i * 5 + 3][0] = 'X';
    a[i * 5 + 3][m - 1] = 'X';
    a[i * 5 + 4][0] = 'X';
  }
  for (int i = (int)(0); i < (int)(a.size()); ++i) cout << a[i] << endl;
}
int main() {
  solve_g();
  return 0;
}
