#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define MAX_LENGTH 256
void read_input(char *input, size_t size) {
if (fgets(input
, size
, stdin
) == NULL
) { fprintf(stderr
, "Error reading input.\n"); }
input
[strcspn(input
, "\n")] = '\0'; }
void invertSymmetry(char *result) {
while (*result) {
*result = (*result == '1') ? 'i' : (*result == 'i' ? '1' : *result);
++result;
}
}
// Функция для создания фиксированной матрицы 2 на 256
char* thirdFunction(char matrix[2][MAX_LENGTH], int rows) {
static char result[MAX_LENGTH]; // Статический массив для возвращаемой строки
memset(result
, '0', MAX_LENGTH
); // Инициализация нулями
int columns
= strlen(matrix
[0]); printf("Длина: %d\n", columns
);
printf("\nПолученная матрица:\n"); for (int i = 0; i < rows; i++) {
}
int x, z, r, y = 0, g;
char current_result[columns + 1];
current_result[0] = '\0';
int j = columns - 1;
while (j >= 0 || y != 0) {
x = 0; g = 0; r = 0;
int skip = 0;
for (int i = 0; i < rows; i++) {
char n = (j >= 0) ? matrix[i][j] : '0';
if (n == '1') {
x += 1;
} else if (n == 'i') {
x -= 1;
} else if (n == ',' || n == '.') {
memmove(current_result
+ 1, current_result
, strlen(current_result
) + 1); current_result[0] = ',';
skip = 1;
break;
}
}
if (skip) {
j--;
continue;
}
x += y;
r = (x < 0) ? -1 : 1;
if (z == 2) {
z = -1;
g = 1;
}
z *= r;
g *= r;
memmove(current_result
+ 1, current_result
, strlen(current_result
) + 1);
if (z == -1) {
current_result[0] = 'i';
} else if (z == 1) {
current_result[0] = '1';
} else if (z == 0) {
current_result[0] = '0';
}
y = x / 3;
y = y * r;
y += g;
if (j >= 0) {
j--;
}
}
// Удаление ведущих '0' с изменением самого массива
/*char *first_nonzero = current_result;
while (*first_nonzero == '0') {
first_nonzero++;
}*/
// Если вся строка была из '0', оставляем один '0'
/*if (*first_nonzero == '\0') {
first_nonzero--; // Вернемся на последний '0'
}*/
// Перезаписываем массив с найденного элемента
/*size_t new_length = strlen(first_nonzero) + 1; // +1 для '\0'
memmove(current_result, first_nonzero, new_length);*/
//printf("Resulting string: %s\n", current_result);
// Копируем результат в result, чтобы передать его в основную функцию
strncpy(result
, current_result
, MAX_LENGTH
- 1); result[MAX_LENGTH - 1] = '\0'; // Обеспечиваем завершающий ноль
return result;
}
// Функция для выполнения основной логики
void newFunction(char input1[], char input2[]) {
// Найти позиции запятой или точки
char* comma1_pos
= strpbrk(input1
, ",."); char* comma2_pos
= strpbrk(input2
, ",.");
if (comma1_pos) {
n1 = comma1_pos - input1; // Индекс до запятой
}
if (comma2_pos) {
n2 = comma2_pos - input2; // Индекс до запятой
}
// Добавляем разницу в длине до запятой
if (n1 < n2) {
a1 += (n2 - n1);
}
if (n2 < n1) {
a2 += (n1 - n2);
}
// Берем максимальную длину строк
int max_a = (a1 > a2) ? a1 : a2;
int n = 2;
char matrix[2][MAX_LENGTH];
memset(matrix
, '0', sizeof(matrix
)); // Заполняем нулями matrix[0][max_a] = '\0'; // Добавляем нуль-терминатор
matrix[1][max_a] = '\0';
int start_idx1 = (n1 < n2) ? n2 - n1 : 0;
int start_idx2 = (n2 < n1) ? n1 - n2 : 0;
// Получаем результат из thirdFunction
char* result = thirdFunction(matrix, n);
printf("\nРезультат третьей функции: %s\n", result
); }
void newAdd(char input1[], char input2[]) {
char temp[MAX_LENGTH];
// Найти позиции запятых или точек
char* comma1_pos
= strpbrk(input1
, ",."); char* comma2_pos
= strpbrk(input2
, ",.");
int index1 = comma1_pos ? (int)(comma1_pos - input1) + 1 : len1;
int index2 = comma2_pos ? (int)(comma2_pos - input2) + 1 : len2;
int n = (len1 - index1) + (len2 - index2);
// Функция для удаления первого вхождения '.' или ','
void removeChar(char* str) {
if (pos) {
}
}
removeChar(input1);
removeChar(input2);
// Сохраняем длины строк после удаления
// Проверяем длины и меняем местами, если вторая строка длиннее
if (len2 > len1) {
int templen = len2;
len2 = len1;
len1 = templen;
} else {
}
// Инвертируем строку temp (предположим, что invertSymmetry это функция инверсии)
invertSymmetry(temp);
// Вычисляем len как разницу длин строк
char matrix[len2][MAX_LENGTH];
memset(matrix
, '0', sizeof(matrix
)); // Инициализируем весь массив нулями (пустыми символами)
int len=len1-len2;
int s = len2 - 1; // Начнем с нижней строки и будем уменьшать s
for (int i = 0; i < len2; i++) {
if (input2[i] == '1') {
// Копируем строку input1 в matrix[s], с учетом уменьшения отступа
memcpy(matrix
[s
] + (len2
- 1 - s
), input1
, MAX_LENGTH
- (len2
- 1 - s
)); }
else if (input2[i] == 'i') {
// Копируем строку temp в matrix[s], с учетом уменьшения отступа
memcpy(matrix
[s
] + (len2
- 1 - s
), temp
, MAX_LENGTH
- (len2
- 1 - s
)); }
else if (input2[i] == '0') { matrix[s][len1+len2-1] = '\0';}
// Уменьшаем s, двигаясь вверх по матрице
s--;
}
/*
// Выводим результат
for (int i = 0; i < len2; i++) {
// Добавляем символы '/' для пустых мест
for (int j = 0; j < len; j++) {
if (matrix[i][j] == '\0') {
//matrix[i][j] = ' '; // Заполняем пустые места
}
}
printf("matrix[%d]: %s\n", i, matrix[i]);
}
// Вывод результатов
/*printf("Значение n: %d\n", n);
printf("Первая строка после удаления: %s\n", input1);
printf("Вторая строка после удаления: %s\n", input2);
printf("Первая строка после инверсии: %s\n", temp);
printf("Длина первой строки после удаления: %d\n", len1);
printf("Длина второй строки после удаления: %d\n", len2);*/
char* result = thirdFunction(matrix, len2);
if (n>0 && n!=(len1+len2)){
result[n] = ',';}
printf("\nРезультат третьей функции: %s\n", result
);
}
/*
void binary_and() {
char input1[100];
char input2[100];
int matrix[2][MAX_LENGTH];
printf("\nEnter the first ternary symmetric number: ");
read_input(input1, MAX_LENGTH);
printf("Enter the second ternary symmetric number: ");
read_input(input2, MAX_LENGTH);
ArrayResult result = CreateAnArray(input1, input2, matrix);
int columns = result.column;
int wq = result.row;
char final_result[MAX_LENGTH] = {0};
int result_index = 0;
printf("\nColumns: %d\n", columns);
printf("wq: %d\n", wq);
for (int j = 0; j < columns; j++) {
if (matrix[0][j] == 'i' || matrix[1][j] == 'i') {
final_result[result_index++] = 'i';
} else if (matrix[0][j] == '0' || matrix[1][j] == '0') {
final_result[result_index++] = '0';
} else if (matrix[0][j] == '1' && matrix[1][j] == '1') {
final_result[result_index++] = '1';
} else if (matrix[0][j] == ',' || matrix[0][j] == '.' || matrix[1][j] == ',' || matrix[1][j] == '.') {
final_result[result_index++] = ',';
} else {
final_result[result_index++] = '0';
}
}
final_result[result_index] = '\0';
printf("\nResulting string: %s\n", final_result);
}
void binary_or() {
char input1[100];
char input2[100];
int matrix[2][MAX_LENGTH];
printf("\nEnter the first ternary symmetric number: ");
read_input(input1, MAX_LENGTH);
printf("Enter the second ternary symmetric number: ");
read_input(input2, MAX_LENGTH);
ArrayResult result = CreateAnArray(input1, input2, matrix);
int columns = result.column;
int wq = result.row;
char final_result[MAX_LENGTH] = {0};
int result_index = 0;
printf("\nColumns: %d\n", columns);
printf("wq: %d\n", wq);
printf("\nResulting matrix:\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < columns; j++) {
printf("%c ", matrix[i][j]);
}
printf("\n");
}
for (int j = 0; j < columns; j++) {
if (matrix[0][j] == '1' || matrix[1][j] == '1') {
final_result[result_index++] = '1';
} else if (matrix[0][j] == '0' || matrix[1][j] == '0') {
final_result[result_index++] = '0';
} else if (matrix[0][j] == 'i' && matrix[1][j] == 'i') {
final_result[result_index++] = 'i';
} else if (matrix[0][j] == ',' || matrix[0][j] == '.' || matrix[1][j] == ',' || matrix[1][j] == '.') {
final_result[result_index++] = ',';
} else {
final_result[result_index++] = '0';
}
}
final_result[result_index] = '\0';
printf("\nResulting string: %s\n", final_result);
}
*/
void threeToTen() {
char input[256];
read_input(input, MAX_LENGTH);
char *delimiter
= strpbrk(input
, ".,"); int n
= (delimiter
) ? (delimiter
- input
- 1) : (strlen(input
) - 1);
double result = 0;
for (int i = 0; input[i] != '\0'; i++) {
if (input[i] == '.' || input[i] == ',') {
continue;
} else if (input[i] == 'i') {
result
+= -1 * pow(3, n
); result
+= (input
[i
] - '0') * pow(3, n
); }
n--;
}
printf("Decimal value: %.10f\n", result
); }
void symmetry(const char *input, int isNegative) {
printf("Non-symmetrical result: %s\n", input
); char result[MAX_LENGTH] = "";
int x = 0, y = 0, z = 0;
for (int i = len - 1; i >= 0; i--) {
if (input[i] == ',') {
result[0] = ',';
continue;
}
x = input[i] - '0';
z = y + x;
if (z <= 1) {
result[0] = z + '0';
y = 0;
} else if (z == 2) {
result[0] = 'i';
y = 1;
} else if (z == 3) {
result[0] = '0';
y = 1;
}
}
if (y != 0) {
result[0] = y + '0';
}
if (isNegative) {
invertSymmetry(result);
}
printf("Symmetrical result: %s\n", result
); }
void whole_part(char *part) {
long long number = strtoll(part, NULL, 10);
if (number == 0) {
part[0] = '0';
part[1] = '\0';
} else {
char buffer[2];
part[0] = '\0';
while (number > 0) {
part[0] = buffer[0];
number /= 3;
}
}
}
void fraction_part(char *part) {
char buffer[2];
part[0] = '\0';
for (int i = 0; i < 15; i++) {
fractionalValue *= 3;
int digit = (int)fractionalValue;
fractionalValue -= digit;
}
}
void translation() {
char input[256];
char firstPart[128] = "";
char secondPart[128] = "";
int isNegative = 0;
read_input(input, MAX_LENGTH);
if (strchr(input
, '-') != NULL
) { isNegative = 1;
}
char *delimiter
= strpbrk(input
, ".,");
if (delimiter) {
size_t firstLen = delimiter - input;
strncpy(firstPart
, input
, firstLen
); firstPart[firstLen] = '\0';
strcpy(secondPart
, delimiter
+ 1); } else {
}
whole_part(firstPart);
fraction_part(secondPart);
} else {
}
char combined[MAX_LENGTH] = "";
snprintf(combined
, sizeof(combined
), "%s,%s", firstPart
, secondPart
);
symmetry(combined, isNegative);
}
int main() {
int choice;
char input1[MAX_LENGTH], input2[MAX_LENGTH];
int n; // Размер матрицы
int matrix[MAX_LENGTH][MAX_LENGTH]; // Матрица произвольного размера
do {
printf("Введите ваш выбор: ");
if (scanf("%d", &choice
) != 1) { fprintf(stderr
, "Неверный ввод. Выход.\n"); break;
}
while (getchar() != '\n'); // Ожидаем ввода
switch (choice) {
case 1:
translation();
break;
case 2:
threeToTen();
break;
case 3:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
newFunction(input1, input2);
break;
case 4:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
invertSymmetry(input2);
newFunction(input1, input2);
break;
case 5:
printf("Введите первую строку: "); read_input(input1, MAX_LENGTH);
printf("Введите вторую строку: "); read_input(input2, MAX_LENGTH);
newAdd(input1, input2);
break;
case 0:
printf("Выход из программы.\n"); break;
default:
printf("Неверный выбор. Попробуйте снова.\n"); }
} while (choice != 0);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2RlZmluZSBNQVhfTEVOR1RIIDI1NgoKdm9pZCByZWFkX2lucHV0KGNoYXIgKmlucHV0LCBzaXplX3Qgc2l6ZSkgewogICAgaWYgKGZnZXRzKGlucHV0LCBzaXplLCBzdGRpbikgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBpbnB1dC5cbiIpOwogICAgICAgIGV4aXQoMSk7IAogICAgfQogICAgaW5wdXRbc3RyY3NwbihpbnB1dCwgIlxuIildID0gJ1wwJzsgIAp9Cgp2b2lkIGludmVydFN5bW1ldHJ5KGNoYXIgKnJlc3VsdCkgewogICAgd2hpbGUgKCpyZXN1bHQpIHsKICAgICAgICAqcmVzdWx0ID0gKCpyZXN1bHQgPT0gJzEnKSA/ICdpJyA6ICgqcmVzdWx0ID09ICdpJyA/ICcxJyA6ICpyZXN1bHQpOwogICAgICAgICsrcmVzdWx0OwogICAgfQp9CgovLyDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDRhNC40LrRgdC40YDQvtCy0LDQvdC90L7QuSDQvNCw0YLRgNC40YbRiyAyINC90LAgMjU2CmNoYXIqIHRoaXJkRnVuY3Rpb24oY2hhciBtYXRyaXhbMl1bTUFYX0xFTkdUSF0sIGludCByb3dzKSB7CiAgICBzdGF0aWMgY2hhciByZXN1bHRbTUFYX0xFTkdUSF07ICAvLyDQodGC0LDRgtC40YfQtdGB0LrQuNC5INC80LDRgdGB0LjQsiDQtNC70Y8g0LLQvtC30LLRgNCw0YnQsNC10LzQvtC5INGB0YLRgNC+0LrQuAogICAgbWVtc2V0KHJlc3VsdCwgJzAnLCBNQVhfTEVOR1RIKTsgLy8g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0L3Rg9C70Y/QvNC4CgogICAgcHJpbnRmKCLQktGL0YHQvtGC0LA6ICVkXG4iLCByb3dzKTsKICAgIGludCBjb2x1bW5zID0gc3RybGVuKG1hdHJpeFswXSk7CiAgICBwcmludGYoItCU0LvQuNC90LA6ICVkXG4iLCBjb2x1bW5zKTsKCiAgICBwcmludGYoIlxu0J/QvtC70YPRh9C10L3QvdCw0Y8g0LzQsNGC0YDQuNGG0LA6XG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlc1xuIiwgbWF0cml4W2ldKTsKICAgIH0KCiAgICBpbnQgeCwgeiwgciwgeSA9IDAsIGc7CiAgICBjaGFyIGN1cnJlbnRfcmVzdWx0W2NvbHVtbnMgKyAxXTsgIAogICAgY3VycmVudF9yZXN1bHRbMF0gPSAnXDAnOyAgICAgICAgICAgCgogICAgaW50IGogPSBjb2x1bW5zIC0gMTsgIAogICAgd2hpbGUgKGogPj0gMCB8fCB5ICE9IDApIHsKICAgICAgICB4ID0gMDsgZyA9IDA7IHIgPSAwOyAgCgogICAgICAgIGludCBza2lwID0gMDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICAgICAgY2hhciBuID0gKGogPj0gMCkgPyBtYXRyaXhbaV1bal0gOiAnMCc7ICAgIAogICAgICAgICAgICBpZiAobiA9PSAnMScpIHsKICAgICAgICAgICAgICAgIHggKz0gMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChuID09ICdpJykgewogICAgICAgICAgICAgICAgeCAtPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gJywnIHx8IG4gPT0gJy4nKSB7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKGN1cnJlbnRfcmVzdWx0ICsgMSwgY3VycmVudF9yZXN1bHQsIHN0cmxlbihjdXJyZW50X3Jlc3VsdCkgKyAxKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJywnOyAgCiAgICAgICAgICAgICAgICBza2lwID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChza2lwKSB7CiAgICAgICAgICAgIGotLTsgIAogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgeCArPSB5OyAgCiAgICAgICAgciA9ICh4IDwgMCkgPyAtMSA6IDE7CiAgICAgICAgeiA9IGFicyh4KSAlIDM7ICAKICAgICAgICBpZiAoeiA9PSAyKSB7CiAgICAgICAgICAgIHogPSAtMTsKICAgICAgICAgICAgZyA9IDE7CiAgICAgICAgfQogICAgICAgIHogKj0gcjsKICAgICAgICBnICo9IHI7CiAgICAgICAgbWVtbW92ZShjdXJyZW50X3Jlc3VsdCArIDEsIGN1cnJlbnRfcmVzdWx0LCBzdHJsZW4oY3VycmVudF9yZXN1bHQpICsgMSk7CgogICAgICAgIGlmICh6ID09IC0xKSB7CiAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJ2knOwogICAgICAgIH0gZWxzZSBpZiAoeiA9PSAxKSB7CiAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJzEnOwogICAgICAgIH0gZWxzZSBpZiAoeiA9PSAwKSB7CiAgICAgICAgICAgIGN1cnJlbnRfcmVzdWx0WzBdID0gJzAnOwogICAgICAgIH0KICAgICAgICB5ID0geCAvIDM7CiAgICAgICAgeSA9IHkgKiByOwogICAgICAgIHkgKz0gZzsKCiAgICAgICAgaWYgKGogPj0gMCkgewogICAgICAgICAgICBqLS07CiAgICAgICAgfQogICAgfQoKICAgIC8vINCj0LTQsNC70LXQvdC40LUg0LLQtdC00YPRidC40YUgJzAnINGBINC40LfQvNC10L3QtdC90LjQtdC8INGB0LDQvNC+0LPQviDQvNCw0YHRgdC40LLQsAogICAgLypjaGFyICpmaXJzdF9ub256ZXJvID0gY3VycmVudF9yZXN1bHQ7CiAgICB3aGlsZSAoKmZpcnN0X25vbnplcm8gPT0gJzAnKSB7CiAgICAgICAgZmlyc3Rfbm9uemVybysrOwogICAgfSovCgogICAgLy8g0JXRgdC70Lgg0LLRgdGPINGB0YLRgNC+0LrQsCDQsdGL0LvQsCDQuNC3ICcwJywg0L7RgdGC0LDQstC70Y/QtdC8INC+0LTQuNC9ICcwJwogICAgLyppZiAoKmZpcnN0X25vbnplcm8gPT0gJ1wwJykgewogICAgICAgIGZpcnN0X25vbnplcm8tLTsgIC8vINCS0LXRgNC90LXQvNGB0Y8g0L3QsCDQv9C+0YHQu9C10LTQvdC40LkgJzAnCiAgICB9Ki8KCiAgICAvLyDQn9C10YDQtdC30LDQv9C40YHRi9Cy0LDQtdC8INC80LDRgdGB0LjQsiDRgSDQvdCw0LnQtNC10L3QvdC+0LPQviDRjdC70LXQvNC10L3RgtCwCiAgICAvKnNpemVfdCBuZXdfbGVuZ3RoID0gc3RybGVuKGZpcnN0X25vbnplcm8pICsgMTsgLy8gKzEg0LTQu9GPICdcMCcKICAgIG1lbW1vdmUoY3VycmVudF9yZXN1bHQsIGZpcnN0X25vbnplcm8sIG5ld19sZW5ndGgpOyovCgogICAgLy9wcmludGYoIlJlc3VsdGluZyBzdHJpbmc6ICVzXG4iLCBjdXJyZW50X3Jlc3VsdCk7CiAgICAKICAgIC8vINCa0L7Qv9C40YDRg9C10Lwg0YDQtdC30YPQu9GM0YLQsNGCINCyIHJlc3VsdCwg0YfRgtC+0LHRiyDQv9C10YDQtdC00LDRgtGMINC10LPQviDQsiDQvtGB0L3QvtCy0L3Rg9GOINGE0YPQvdC60YbQuNGOCiAgICBzdHJuY3B5KHJlc3VsdCwgY3VycmVudF9yZXN1bHQsIE1BWF9MRU5HVEggLSAxKTsKICAgIHJlc3VsdFtNQVhfTEVOR1RIIC0gMV0gPSAnXDAnOyAgLy8g0J7QsdC10YHQv9C10YfQuNCy0LDQtdC8INC30LDQstC10YDRiNCw0Y7RidC40Lkg0L3QvtC70YwKCiAgICByZXR1cm4gcmVzdWx0Owp9CgoKCi8vINCk0YPQvdC60YbQuNGPINC00LvRjyDQstGL0L/QvtC70L3QtdC90LjRjyDQvtGB0L3QvtCy0L3QvtC5INC70L7Qs9C40LrQuAp2b2lkIG5ld0Z1bmN0aW9uKGNoYXIgaW5wdXQxW10sIGNoYXIgaW5wdXQyW10pIHsKICAgIGludCBuMSA9IHN0cmxlbihpbnB1dDEpOwogICAgaW50IG4yID0gc3RybGVuKGlucHV0Mik7CgogICAgLy8g0J3QsNC50YLQuCDQv9C+0LfQuNGG0LjQuCDQt9Cw0L/Rj9GC0L7QuSDQuNC70Lgg0YLQvtGH0LrQuAogICAgY2hhciogY29tbWExX3BvcyA9IHN0cnBicmsoaW5wdXQxLCAiLC4iKTsKICAgIGNoYXIqIGNvbW1hMl9wb3MgPSBzdHJwYnJrKGlucHV0MiwgIiwuIik7CgogICAgaWYgKGNvbW1hMV9wb3MpIHsKICAgICAgICBuMSA9IGNvbW1hMV9wb3MgLSBpbnB1dDE7ICAvLyDQmNC90LTQtdC60YEg0LTQviDQt9Cw0L/Rj9GC0L7QuQogICAgfQoKICAgIGlmIChjb21tYTJfcG9zKSB7CiAgICAgICAgbjIgPSBjb21tYTJfcG9zIC0gaW5wdXQyOyAgLy8g0JjQvdC00LXQutGBINC00L4g0LfQsNC/0Y/RgtC+0LkKICAgIH0KCiAgICBpbnQgYTEgPSBzdHJsZW4oaW5wdXQxKTsKICAgIGludCBhMiA9IHN0cmxlbihpbnB1dDIpOwoKICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDRgNCw0LfQvdC40YbRgyDQsiDQtNC70LjQvdC1INC00L4g0LfQsNC/0Y/RgtC+0LkKICAgIGlmIChuMSA8IG4yKSB7CiAgICAgICAgYTEgKz0gKG4yIC0gbjEpOwogICAgfQoKICAgIGlmIChuMiA8IG4xKSB7CiAgICAgICAgYTIgKz0gKG4xIC0gbjIpOwogICAgfQoKICAgIC8vINCR0LXRgNC10Lwg0LzQsNC60YHQuNC80LDQu9GM0L3Rg9GOINC00LvQuNC90YMg0YHRgtGA0L7QugogICAgaW50IG1heF9hID0gKGExID4gYTIpID8gYTEgOiBhMjsKICAgIGludCBuID0gMjsgIAoKICAgIGNoYXIgbWF0cml4WzJdW01BWF9MRU5HVEhdOwogICAgbWVtc2V0KG1hdHJpeCwgJzAnLCBzaXplb2YobWF0cml4KSk7ICAvLyDQl9Cw0L/QvtC70L3Rj9C10Lwg0L3Rg9C70Y/QvNC4CiAgICBtYXRyaXhbMF1bbWF4X2FdID0gJ1wwJzsgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDQvdGD0LvRjC3RgtC10YDQvNC40L3QsNGC0L7RgAogICAgbWF0cml4WzFdW21heF9hXSA9ICdcMCc7CgogICAgaW50IHN0YXJ0X2lkeDEgPSAobjEgPCBuMikgPyBuMiAtIG4xIDogMDsKICAgIG1lbWNweShtYXRyaXhbMF0gKyBzdGFydF9pZHgxLCBpbnB1dDEsIHN0cmxlbihpbnB1dDEpKTsgCgogICAgaW50IHN0YXJ0X2lkeDIgPSAobjIgPCBuMSkgPyBuMSAtIG4yIDogMDsKICAgIG1lbWNweShtYXRyaXhbMV0gKyBzdGFydF9pZHgyLCBpbnB1dDIsIHN0cmxlbihpbnB1dDIpKTsKCiAgICAvLyDQn9C+0LvRg9GH0LDQtdC8INGA0LXQt9GD0LvRjNGC0LDRgiDQuNC3IHRoaXJkRnVuY3Rpb24KICAgIGNoYXIqIHJlc3VsdCA9IHRoaXJkRnVuY3Rpb24obWF0cml4LCBuKTsKICAgIHByaW50ZigiXG7QoNC10LfRg9C70YzRgtCw0YIg0YLRgNC10YLRjNC10Lkg0YTRg9C90LrRhtC40Lg6ICVzXG4iLCByZXN1bHQpOwp9CgoKCnZvaWQgbmV3QWRkKGNoYXIgaW5wdXQxW10sIGNoYXIgaW5wdXQyW10pIHsKICAgIGNoYXIgdGVtcFtNQVhfTEVOR1RIXTsKICAgIC8vINCd0LDQudGC0Lgg0L/QvtC30LjRhtC40Lgg0LfQsNC/0Y/RgtGL0YUg0LjQu9C4INGC0L7Rh9C10LoKICAgIGNoYXIqIGNvbW1hMV9wb3MgPSBzdHJwYnJrKGlucHV0MSwgIiwuIik7CiAgICBjaGFyKiBjb21tYTJfcG9zID0gc3RycGJyayhpbnB1dDIsICIsLiIpOwoKICAgIGludCBsZW4xID0gc3RybGVuKGlucHV0MSk7CiAgICBpbnQgbGVuMiA9IHN0cmxlbihpbnB1dDIpOwogICAgCiAgICBpbnQgaW5kZXgxID0gY29tbWExX3BvcyA/IChpbnQpKGNvbW1hMV9wb3MgLSBpbnB1dDEpICsgMSA6IGxlbjE7CiAgICBpbnQgaW5kZXgyID0gY29tbWEyX3BvcyA/IChpbnQpKGNvbW1hMl9wb3MgLSBpbnB1dDIpICsgMSA6IGxlbjI7CiAgICAKICAgIGludCBuID0gKGxlbjEgLSBpbmRleDEpICsgKGxlbjIgLSBpbmRleDIpOwogICAgCiAgICAvLyDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0YPQtNCw0LvQtdC90LjRjyDQv9C10YDQstC+0LPQviDQstGF0L7QttC00LXQvdC40Y8gJy4nINC40LvQuCAnLCcKICAgIHZvaWQgcmVtb3ZlQ2hhcihjaGFyKiBzdHIpIHsKICAgICAgICBjaGFyKiBwb3MgPSBzdHJwYnJrKHN0ciwgIiwuIik7CiAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICBtZW1tb3ZlKHBvcywgcG9zICsgMSwgc3RybGVuKHBvcykpOyAvLyDQodC00LLQuNCzINCy0LvQtdCy0L4KICAgICAgICB9CiAgICB9CiAgICAKICAgIHJlbW92ZUNoYXIoaW5wdXQxKTsKICAgIHJlbW92ZUNoYXIoaW5wdXQyKTsKICAgIAogICAgLy8g0KHQvtGF0YDQsNC90Y/QtdC8INC00LvQuNC90Ysg0YHRgtGA0L7QuiDQv9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y8KICAgIGxlbjEgPSBzdHJsZW4oaW5wdXQxKTsKICAgIGxlbjIgPSBzdHJsZW4oaW5wdXQyKTsKICAgIAogICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8INC00LvQuNC90Ysg0Lgg0LzQtdC90Y/QtdC8INC80LXRgdGC0LDQvNC4LCDQtdGB0LvQuCDQstGC0L7RgNCw0Y8g0YHRgtGA0L7QutCwINC00LvQuNC90L3QtdC1CiAgICBpZiAobGVuMiA+IGxlbjEpIHsKICAgICAgICBzdHJjcHkodGVtcCwgaW5wdXQyKTsKICAgICAgICBzdHJjcHkoaW5wdXQyLCBpbnB1dDEpOwogICAgICAgIHN0cmNweShpbnB1dDEsIHRlbXApOwogICAgICAgIGludCB0ZW1wbGVuID0gbGVuMjsKICAgICAgICBsZW4yID0gbGVuMTsKICAgICAgICBsZW4xID0gdGVtcGxlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RyY3B5KHRlbXAsIGlucHV0MSk7CiAgICB9CiAgICAvLyDQmNC90LLQtdGA0YLQuNGA0YPQtdC8INGB0YLRgNC+0LrRgyB0ZW1wICjQv9GA0LXQtNC/0L7Qu9C+0LbQuNC8LCDRh9GC0L4gaW52ZXJ0U3ltbWV0cnkg0Y3RgtC+INGE0YPQvdC60YbQuNGPINC40L3QstC10YDRgdC40LgpCiAgICBpbnZlcnRTeW1tZXRyeSh0ZW1wKTsKICAgIAogICAgLy8g0JLRi9GH0LjRgdC70Y/QtdC8IGxlbiDQutCw0Log0YDQsNC30L3QuNGG0YMg0LTQu9C40L0g0YHRgtGA0L7QugogICAgY2hhciBtYXRyaXhbbGVuMl1bTUFYX0xFTkdUSF07CiAgICBtZW1zZXQobWF0cml4LCAnMCcsIHNpemVvZihtYXRyaXgpKTsgIC8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0LLQtdGB0Ywg0LzQsNGB0YHQuNCyINC90YPQu9GP0LzQuCAo0L/Rg9GB0YLRi9C80Lgg0YHQuNC80LLQvtC70LDQvNC4KQoKCiAgICBpbnQgbGVuPWxlbjEtbGVuMjsKaW50IHMgPSBsZW4yIC0gMTsgLy8g0J3QsNGH0L3QtdC8INGBINC90LjQttC90LXQuSDRgdGC0YDQvtC60Lgg0Lgg0LHRg9C00LXQvCDRg9C80LXQvdGM0YjQsNGC0Ywgcwpmb3IgKGludCBpID0gMDsgaSA8IGxlbjI7IGkrKykgewogICAgaWYgKGlucHV0MltpXSA9PSAnMScpIHsKICAgICAgICAvLyDQmtC+0L/QuNGA0YPQtdC8INGB0YLRgNC+0LrRgyBpbnB1dDEg0LIgbWF0cml4W3NdLCDRgSDRg9GH0LXRgtC+0Lwg0YPQvNC10L3RjNGI0LXQvdC40Y8g0L7RgtGB0YLRg9C/0LAKICAgICAgICBtZW1jcHkobWF0cml4W3NdICsgKGxlbjIgLSAxIC0gcyksIGlucHV0MSwgTUFYX0xFTkdUSCAtIChsZW4yIC0gMSAtIHMpKTsKICAgIH0KICAgIGVsc2UgaWYgKGlucHV0MltpXSA9PSAnaScpIHsKICAgICAgICAvLyDQmtC+0L/QuNGA0YPQtdC8INGB0YLRgNC+0LrRgyB0ZW1wINCyIG1hdHJpeFtzXSwg0YEg0YPRh9C10YLQvtC8INGD0LzQtdC90YzRiNC10L3QuNGPINC+0YLRgdGC0YPQv9CwCiAgICAgICAgbWVtY3B5KG1hdHJpeFtzXSArIChsZW4yIC0gMSAtIHMpLCB0ZW1wLCBNQVhfTEVOR1RIIC0gKGxlbjIgLSAxIC0gcykpOwogICAgfQogICAgZWxzZSBpZiAoaW5wdXQyW2ldID09ICcwJykgeyBtYXRyaXhbc11bbGVuMStsZW4yLTFdID0gJ1wwJzt9CiAgICAvLyDQo9C80LXQvdGM0YjQsNC10Lwgcywg0LTQstC40LPQsNGP0YHRjCDQstCy0LXRgNGFINC/0L4g0LzQsNGC0YDQuNGG0LUKICAgIHMtLTsKfQovKgogICAgLy8g0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjI7IGkrKykgewogICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDRgdC40LzQstC+0LvRiyAnLycg0LTQu9GPINC/0YPRgdGC0YvRhSDQvNC10YHRggogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSA9PSAnXDAnKSB7CiAgICAgICAgICAgICAgICAvL21hdHJpeFtpXVtqXSA9ICcgJzsgIC8vINCX0LDQv9C+0LvQvdGP0LXQvCDQv9GD0YHRgtGL0LUg0LzQtdGB0YLQsAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByaW50ZigibWF0cml4WyVkXTogJXNcbiIsIGksIG1hdHJpeFtpXSk7CiAgICB9CgogICAgCiAgICAvLyDQktGL0LLQvtC0INGA0LXQt9GD0LvRjNGC0LDRgtC+0LIKICAgIC8qcHJpbnRmKCLQl9C90LDRh9C10L3QuNC1IG46ICVkXG4iLCBuKTsKICAgIHByaW50Zigi0J/QtdGA0LLQsNGPINGB0YLRgNC+0LrQsCDQv9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y86ICVzXG4iLCBpbnB1dDEpOwogICAgcHJpbnRmKCLQktGC0L7RgNCw0Y8g0YHRgtGA0L7QutCwINC/0L7RgdC70LUg0YPQtNCw0LvQtdC90LjRjzogJXNcbiIsIGlucHV0Mik7CiAgICBwcmludGYoItCf0LXRgNCy0LDRjyDRgdGC0YDQvtC60LAg0L/QvtGB0LvQtSDQuNC90LLQtdGA0YHQuNC4OiAlc1xuIiwgdGVtcCk7CiAgICBwcmludGYoItCU0LvQuNC90LAg0L/QtdGA0LLQvtC5INGB0YLRgNC+0LrQuCDQv9C+0YHQu9C1INGD0LTQsNC70LXQvdC40Y86ICVkXG4iLCBsZW4xKTsKICAgIHByaW50Zigi0JTQu9C40L3QsCDQstGC0L7RgNC+0Lkg0YHRgtGA0L7QutC4INC/0L7RgdC70LUg0YPQtNCw0LvQtdC90LjRjzogJWRcbiIsIGxlbjIpOyovCiAgICAKICAgIGNoYXIqIHJlc3VsdCA9IHRoaXJkRnVuY3Rpb24obWF0cml4LCBsZW4yKTsKICAgIG49c3RybGVuKHJlc3VsdCktbjsKICAgIGlmIChuPjAgJiYgbiE9KGxlbjErbGVuMikpewogICAgbWVtbW92ZShyZXN1bHQgKyBuICsgMSwgcmVzdWx0ICsgbiwgc3RybGVuKHJlc3VsdCkgLSBuICsgMSk7CiAgICByZXN1bHRbbl0gPSAnLCc7fQogICAgcHJpbnRmKCJcbtCg0LXQt9GD0LvRjNGC0LDRgiDRgtGA0LXRgtGM0LXQuSDRhNGD0L3QutGG0LjQuDogJXNcbiIsIHJlc3VsdCk7CiAgICAKfQoKCi8qCnZvaWQgYmluYXJ5X2FuZCgpIHsKICAgIGNoYXIgaW5wdXQxWzEwMF07CiAgICBjaGFyIGlucHV0MlsxMDBdOwogICAgaW50IG1hdHJpeFsyXVtNQVhfTEVOR1RIXTsKICAgIHByaW50ZigiXG5FbnRlciB0aGUgZmlyc3QgdGVybmFyeSBzeW1tZXRyaWMgbnVtYmVyOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQxLCBNQVhfTEVOR1RIKTsKICAgIHByaW50ZigiRW50ZXIgdGhlIHNlY29uZCB0ZXJuYXJ5IHN5bW1ldHJpYyBudW1iZXI6ICIpOwogICAgcmVhZF9pbnB1dChpbnB1dDIsIE1BWF9MRU5HVEgpOwoKICAgIEFycmF5UmVzdWx0IHJlc3VsdCA9IENyZWF0ZUFuQXJyYXkoaW5wdXQxLCBpbnB1dDIsIG1hdHJpeCk7CgogICAgaW50IGNvbHVtbnMgPSByZXN1bHQuY29sdW1uOyAgCiAgICBpbnQgd3EgPSByZXN1bHQucm93OyAgICAgICAgICAKCiAgICBjaGFyIGZpbmFsX3Jlc3VsdFtNQVhfTEVOR1RIXSA9IHswfTsKICAgIGludCByZXN1bHRfaW5kZXggPSAwOwoKICAgIHByaW50ZigiXG5Db2x1bW5zOiAlZFxuIiwgY29sdW1ucyk7CiAgICBwcmludGYoIndxOiAlZFxuIiwgd3EpOyAKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykgewogICAgICAgIGlmIChtYXRyaXhbMF1bal0gPT0gJ2knIHx8IG1hdHJpeFsxXVtqXSA9PSAnaScpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICdpJzsKICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFswXVtqXSA9PSAnMCcgfHwgbWF0cml4WzFdW2pdID09ICcwJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJzAnOwogICAgICAgIH0gZWxzZSBpZiAobWF0cml4WzBdW2pdID09ICcxJyAmJiBtYXRyaXhbMV1bal0gPT0gJzEnKSB7CiAgICAgICAgICAgIGZpbmFsX3Jlc3VsdFtyZXN1bHRfaW5kZXgrK10gPSAnMSc7CiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJywnIHx8IG1hdHJpeFswXVtqXSA9PSAnLicgfHwgbWF0cml4WzFdW2pdID09ICcsJyB8fCBtYXRyaXhbMV1bal0gPT0gJy4nKSB7CiAgICAgICAgICAgIGZpbmFsX3Jlc3VsdFtyZXN1bHRfaW5kZXgrK10gPSAnLCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4XSA9ICdcMCc7CiAgICBwcmludGYoIlxuUmVzdWx0aW5nIHN0cmluZzogJXNcbiIsIGZpbmFsX3Jlc3VsdCk7Cn0KCnZvaWQgYmluYXJ5X29yKCkgewogICAgY2hhciBpbnB1dDFbMTAwXTsKICAgIGNoYXIgaW5wdXQyWzEwMF07CiAgICBpbnQgbWF0cml4WzJdW01BWF9MRU5HVEhdOwogICAgcHJpbnRmKCJcbkVudGVyIHRoZSBmaXJzdCB0ZXJuYXJ5IHN5bW1ldHJpYyBudW1iZXI6ICIpOwogICAgcmVhZF9pbnB1dChpbnB1dDEsIE1BWF9MRU5HVEgpOwogICAgcHJpbnRmKCJFbnRlciB0aGUgc2Vjb25kIHRlcm5hcnkgc3ltbWV0cmljIG51bWJlcjogIik7CiAgICByZWFkX2lucHV0KGlucHV0MiwgTUFYX0xFTkdUSCk7CgogICAgQXJyYXlSZXN1bHQgcmVzdWx0ID0gQ3JlYXRlQW5BcnJheShpbnB1dDEsIGlucHV0MiwgbWF0cml4KTsKCiAgICBpbnQgY29sdW1ucyA9IHJlc3VsdC5jb2x1bW47ICAKICAgIGludCB3cSA9IHJlc3VsdC5yb3c7ICAgICAgICAgCgogICAgY2hhciBmaW5hbF9yZXN1bHRbTUFYX0xFTkdUSF0gPSB7MH07CiAgICBpbnQgcmVzdWx0X2luZGV4ID0gMDsKCiAgICBwcmludGYoIlxuQ29sdW1uczogJWRcbiIsIGNvbHVtbnMpOwogICAgcHJpbnRmKCJ3cTogJWRcbiIsIHdxKTsgIAoKICAgIHByaW50ZigiXG5SZXN1bHRpbmcgbWF0cml4OlxuIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWMgIiwgbWF0cml4W2ldW2pdKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQoKICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7CiAgICAgICAgaWYgKG1hdHJpeFswXVtqXSA9PSAnMScgfHwgbWF0cml4WzFdW2pdID09ICcxJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJzEnOyAgCiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJzAnIHx8IG1hdHJpeFsxXVtqXSA9PSAnMCcpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsgCiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbMF1bal0gPT0gJ2knICYmIG1hdHJpeFsxXVtqXSA9PSAnaScpIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICdpJzsgIAogICAgICAgIH0gZWxzZSBpZiAobWF0cml4WzBdW2pdID09ICcsJyB8fCBtYXRyaXhbMF1bal0gPT0gJy4nIHx8IG1hdHJpeFsxXVtqXSA9PSAnLCcgfHwgbWF0cml4WzFdW2pdID09ICcuJykgewogICAgICAgICAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4KytdID0gJywnOyAgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmluYWxfcmVzdWx0W3Jlc3VsdF9pbmRleCsrXSA9ICcwJzsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbF9yZXN1bHRbcmVzdWx0X2luZGV4XSA9ICdcMCc7CiAgICBwcmludGYoIlxuUmVzdWx0aW5nIHN0cmluZzogJXNcbiIsIGZpbmFsX3Jlc3VsdCk7Cn0KKi8KCnZvaWQgdGhyZWVUb1RlbigpIHsKICAgIGNoYXIgaW5wdXRbMjU2XTsKCiAgICBwcmludGYoIlxuRW50ZXIgYSBzdHJpbmc6ICIpOwogICAgcmVhZF9pbnB1dChpbnB1dCwgTUFYX0xFTkdUSCk7CgogICAgY2hhciAqZGVsaW1pdGVyID0gc3RycGJyayhpbnB1dCwgIi4sIik7CiAgICBpbnQgbiA9IChkZWxpbWl0ZXIpID8gKGRlbGltaXRlciAtIGlucHV0IC0gMSkgOiAoc3RybGVuKGlucHV0KSAtIDEpOwogICAgCiAgICBkb3VibGUgcmVzdWx0ID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaW5wdXRbaV0gIT0gJ1wwJzsgaSsrKSB7CiAgICAgICAgaWYgKGlucHV0W2ldID09ICcuJyB8fCBpbnB1dFtpXSA9PSAnLCcpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA9PSAnaScpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IC0xICogcG93KDMsIG4pOwogICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChpbnB1dFtpXSkpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IChpbnB1dFtpXSAtICcwJykgKiBwb3coMywgbik7CiAgICAgICAgfQogICAgICAgIG4tLTsKICAgIH0KICAgIHByaW50ZigiRGVjaW1hbCB2YWx1ZTogJS4xMGZcbiIsIHJlc3VsdCk7Cn0KCnZvaWQgc3ltbWV0cnkoY29uc3QgY2hhciAqaW5wdXQsIGludCBpc05lZ2F0aXZlKSB7CiAgICBwcmludGYoIk5vbi1zeW1tZXRyaWNhbCByZXN1bHQ6ICVzXG4iLCBpbnB1dCk7CiAgICBzaXplX3QgbGVuID0gc3RybGVuKGlucHV0KTsKICAgIGNoYXIgcmVzdWx0W01BWF9MRU5HVEhdID0gIiI7CiAgICBpbnQgeCA9IDAsIHkgPSAwLCB6ID0gMDsKCiAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAoaW5wdXRbaV0gPT0gJywnKSB7CiAgICAgICAgICAgIG1lbW1vdmUocmVzdWx0ICsgMSwgcmVzdWx0LCBzdHJsZW4ocmVzdWx0KSArIDEpOwogICAgICAgICAgICByZXN1bHRbMF0gPSAnLCc7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgeCA9IGlucHV0W2ldIC0gJzAnOyAKICAgICAgICB6ID0geSArIHg7CgogICAgICAgIGlmICh6IDw9IDEpIHsKICAgICAgICAgICAgbWVtbW92ZShyZXN1bHQgKyAxLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CiAgICAgICAgICAgIHJlc3VsdFswXSA9IHogKyAnMCc7CiAgICAgICAgICAgIHkgPSAwOwogICAgICAgIH0gZWxzZSBpZiAoeiA9PSAyKSB7CiAgICAgICAgICAgIG1lbW1vdmUocmVzdWx0ICsgMSwgcmVzdWx0LCBzdHJsZW4ocmVzdWx0KSArIDEpOwogICAgICAgICAgICByZXN1bHRbMF0gPSAnaSc7CiAgICAgICAgICAgIHkgPSAxOwogICAgICAgIH0gZWxzZSBpZiAoeiA9PSAzKSB7CiAgICAgICAgICAgIG1lbW1vdmUocmVzdWx0ICsgMSwgcmVzdWx0LCBzdHJsZW4ocmVzdWx0KSArIDEpOwogICAgICAgICAgICByZXN1bHRbMF0gPSAnMCc7CiAgICAgICAgICAgIHkgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoeSAhPSAwKSB7CiAgICAgICAgbWVtbW92ZShyZXN1bHQgKyAxLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CiAgICAgICAgcmVzdWx0WzBdID0geSArICcwJzsKICAgIH0KCiAgICBpZiAoaXNOZWdhdGl2ZSkgewogICAgICAgIGludmVydFN5bW1ldHJ5KHJlc3VsdCk7CiAgICB9CgogICAgcHJpbnRmKCJTeW1tZXRyaWNhbCByZXN1bHQ6ICVzXG4iLCByZXN1bHQpOwp9Cgp2b2lkIHdob2xlX3BhcnQoY2hhciAqcGFydCkgewogICAgbG9uZyBsb25nIG51bWJlciA9IHN0cnRvbGwocGFydCwgTlVMTCwgMTApOwoKICAgIGlmIChudW1iZXIgPT0gMCkgewogICAgICAgIHBhcnRbMF0gPSAnMCc7CiAgICAgICAgcGFydFsxXSA9ICdcMCc7CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgYnVmZmVyWzJdOwogICAgICAgIHBhcnRbMF0gPSAnXDAnOyAKCiAgICAgICAgd2hpbGUgKG51bWJlciA+IDApIHsKICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlZCIsIG51bWJlciAlIDMpOwogICAgICAgICAgICBtZW1tb3ZlKHBhcnQgKyAxLCBwYXJ0LCBzdHJsZW4ocGFydCkgKyAxKTsKICAgICAgICAgICAgcGFydFswXSA9IGJ1ZmZlclswXTsgCiAgICAgICAgICAgIG51bWJlciAvPSAzOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBmcmFjdGlvbl9wYXJ0KGNoYXIgKnBhcnQpIHsKICAgIGRvdWJsZSBmcmFjdGlvbmFsVmFsdWUgPSBhdG9mKHBhcnQpIC8gcG93KDEwLCBzdHJsZW4ocGFydCkpOwogICAgY2hhciBidWZmZXJbMl07CiAgICBwYXJ0WzBdID0gJ1wwJzsgCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CiAgICAgICAgZnJhY3Rpb25hbFZhbHVlICo9IDM7CiAgICAgICAgaW50IGRpZ2l0ID0gKGludClmcmFjdGlvbmFsVmFsdWU7CiAgICAgICAgZnJhY3Rpb25hbFZhbHVlIC09IGRpZ2l0OwogICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCBkaWdpdCk7CiAgICAgICAgc3RyY2F0KHBhcnQsIGJ1ZmZlcik7IAogICAgfQp9Cgp2b2lkIHRyYW5zbGF0aW9uKCkgewogICAgY2hhciBpbnB1dFsyNTZdOwogICAgY2hhciBmaXJzdFBhcnRbMTI4XSA9ICIiOwogICAgY2hhciBzZWNvbmRQYXJ0WzEyOF0gPSAiIjsKICAgIGludCBpc05lZ2F0aXZlID0gMDsKCiAgICBwcmludGYoIlxuRW50ZXIgYSBzdHJpbmc6ICIpOwogICAgcmVhZF9pbnB1dChpbnB1dCwgTUFYX0xFTkdUSCk7CgogICAgaWYgKHN0cmNocihpbnB1dCwgJy0nKSAhPSBOVUxMKSB7CiAgICAgICAgaXNOZWdhdGl2ZSA9IDE7CiAgICAgICAgbWVtbW92ZShpbnB1dCwgaW5wdXQgKyAxLCBzdHJsZW4oaW5wdXQpKTsgCiAgICB9CgogICAgY2hhciAqZGVsaW1pdGVyID0gc3RycGJyayhpbnB1dCwgIi4sIik7CgogICAgaWYgKGRlbGltaXRlcikgewogICAgICAgIHNpemVfdCBmaXJzdExlbiA9IGRlbGltaXRlciAtIGlucHV0OwogICAgICAgIHN0cm5jcHkoZmlyc3RQYXJ0LCBpbnB1dCwgZmlyc3RMZW4pOwogICAgICAgIGZpcnN0UGFydFtmaXJzdExlbl0gPSAnXDAnOwoKICAgICAgICBzdHJjcHkoc2Vjb25kUGFydCwgZGVsaW1pdGVyICsgMSk7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShmaXJzdFBhcnQsIGlucHV0KTsKICAgIH0KCiAgICB3aG9sZV9wYXJ0KGZpcnN0UGFydCk7CiAgICBpZiAoc3RybGVuKHNlY29uZFBhcnQpID4gMCkgewogICAgICAgIGZyYWN0aW9uX3BhcnQoc2Vjb25kUGFydCk7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShzZWNvbmRQYXJ0LCAiMCIpOyAKICAgIH0KCiAgICBjaGFyIGNvbWJpbmVkW01BWF9MRU5HVEhdID0gIiI7CiAgICBzbnByaW50Zihjb21iaW5lZCwgc2l6ZW9mKGNvbWJpbmVkKSwgIiVzLCVzIiwgZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0KTsKCiAgICBzeW1tZXRyeShjb21iaW5lZCwgaXNOZWdhdGl2ZSk7Cn0KCmludCBtYWluKCkgewogICAgaW50IGNob2ljZTsKICAgIGNoYXIgaW5wdXQxW01BWF9MRU5HVEhdLCBpbnB1dDJbTUFYX0xFTkdUSF07CiAgICBpbnQgbjsgIC8vINCg0LDQt9C80LXRgCDQvNCw0YLRgNC40YbRiwoKICAgIGludCBtYXRyaXhbTUFYX0xFTkdUSF1bTUFYX0xFTkdUSF07ICAvLyDQnNCw0YLRgNC40YbQsCDQv9GA0L7QuNC30LLQvtC70YzQvdC+0LPQviDRgNCw0LfQvNC10YDQsAoKICAgIGRvIHsKICAgICAgICBwcmludGYoIlxu0JzQtdC90Y46XG4iKTsKICAgICAgICBwcmludGYoIjEuIEZyb20gVGVybmFyeVxuIik7CiAgICAgICAgcHJpbnRmKCIyLiBGcm9tIERlY2ltYWxcbiIpOwogICAgICAgIHByaW50ZigiMy4gINGB0LvQvtC20LXQvdC40Y9cbiIpOwogICAgICAgIHByaW50ZigiNC4gINCy0YvRh9C40YLQsNC90LjQtVxuIik7CiAgICAgICAgcHJpbnRmKCI1LiAg0YPQvNC90L7QttC10L3QuNC1XG4iKTsKICAgICAgICBwcmludGYoIjAuINCS0YvRhdC+0LRcbiIpOwogICAgICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0LLQsNGIINCy0YvQsdC+0YA6ICIpOwoKICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJmNob2ljZSkgIT0gMSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgItCd0LXQstC10YDQvdGL0Lkg0LLQstC+0LQuINCS0YvRhdC+0LQuXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOyAvLyDQntC20LjQtNCw0LXQvCDQstCy0L7QtNCwCgogICAgICAgIHN3aXRjaCAoY2hvaWNlKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgdGhyZWVUb1RlbigpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0L/QtdGA0LLRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MSwgTUFYX0xFTkdUSCk7ICAKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MiwgTUFYX0xFTkdUSCk7ICAKICAgIG5ld0Z1bmN0aW9uKGlucHV0MSwgaW5wdXQyKTsgCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQv9C10YDQstGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQxLCBNQVhfTEVOR1RIKTsgIAogICAgcHJpbnRmKCLQktCy0LXQtNC40YLQtSDQstGC0L7RgNGD0Y4g0YHRgtGA0L7QutGDOiAiKTsKICAgIHJlYWRfaW5wdXQoaW5wdXQyLCBNQVhfTEVOR1RIKTsKICAgIGludmVydFN5bW1ldHJ5KGlucHV0Mik7CiAgICBuZXdGdW5jdGlvbihpbnB1dDEsIGlucHV0Mik7IAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNToKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0L/QtdGA0LLRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MSwgTUFYX0xFTkdUSCk7ICAKICAgIHByaW50Zigi0JLQstC10LTQuNGC0LUg0LLRgtC+0YDRg9GOINGB0YLRgNC+0LrRgzogIik7CiAgICByZWFkX2lucHV0KGlucHV0MiwgTUFYX0xFTkdUSCk7ICAKICAgIG5ld0FkZChpbnB1dDEsIGlucHV0Mik7ICAKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBwcmludGYoItCS0YvRhdC+0LQg0LjQtyDQv9GA0L7Qs9GA0LDQvNC80YsuXG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJpbnRmKCLQndC10LLQtdGA0L3Ri9C5INCy0YvQsdC+0YAuINCf0L7Qv9GA0L7QsdGD0LnRgtC1INGB0L3QvtCy0LAuXG4iKTsKICAgICAgICB9CiAgICB9IHdoaWxlIChjaG9pY2UgIT0gMCk7CgogICAgcmV0dXJuIDA7Cn0K