%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int line_num = 1;
int col_num = 1;
int token_count = 0;
int keyword_count = 0;
int identifier_count = 0;
int number_count = 0;
int relop_count = 0;
int unknown_count = 0;
typedef struct {
char token_type[20];
char value[100];
int line;
int column;
} TokenInfo;
TokenInfo tokens[1000];
void add_token(const char* type, const char* value, int line, int col) {
strcpy(tokens[token_count].token_type, type);
strcpy(tokens[token_count].value, value);
tokens[token_count].line = line;
tokens[token_count].column = col;
token_count++;
}
void print_statistics() {
printf("\n=================== STATISTICS ===================\n");
printf("Total Tokens: %d\n", token_count);
printf("Keywords: %d\n", keyword_count);
printf("Identifiers: %d\n", identifier_count);
printf("Numbers: %d\n", number_count);
printf("Relational Operators: %d\n", relop_count);
printf("Unknown Tokens: %d\n", unknown_count);
printf("Total Lines: %d\n", line_num);
printf("==================================================\n");
}
void print_token_table() {
printf("\n=================== TOKEN TABLE ===================\n");
printf("%-4s %-15s %-15s %-6s %-6s\n", "No.", "Type", "Value", "Line", "Col");
printf("----------------------------------------------------\n");
for(int i = 0; i < token_count; i++) {
printf("%-4d %-15s %-15s %-6d %-6d\n",
i+1, tokens[i].token_type, tokens[i].value,
tokens[i].line, tokens[i].column);
}
printf("====================================================\n");
}
void save_to_file() {
FILE *fp = fopen("token_analysis.txt", "w");
if(!fp) {
printf("Error creating output file!\n");
return;
}
fprintf(fp, "LEXICAL ANALYSIS REPORT\n");
fprintf(fp, "=======================\n\n");
fprintf(fp, "TOKEN TABLE:\n");
fprintf(fp, "%-4s %-15s %-15s %-6s %-6s\n", "No.", "Type", "Value", "Line", "Col");
fprintf(fp, "----------------------------------------------------\n");
for(int i = 0; i < token_count; i++) {
fprintf(fp, "%-4d %-15s %-15s %-6d %-6d\n",
i+1, tokens[i].token_type, tokens[i].value,
tokens[i].line, tokens[i].column);
}
fprintf(fp, "\nSTATISTICS:\n");
fprintf(fp, "Total Tokens: %d\n", token_count);
fprintf(fp, "Keywords: %d\n", keyword_count);
fprintf(fp, "Identifiers: %d\n", identifier_count);
fprintf(fp, "Numbers: %d\n", number_count);
fprintf(fp, "Relational Operators: %d\n", relop_count);
fprintf(fp, "Unknown Tokens: %d\n", unknown_count);
fprintf(fp, "Total Lines: %d\n", line_num);
fclose(fp);
printf("Analysis saved to: token_analysis.txt\n");
}
%}
DIGIT [0-9]
LETTER [a-zA-Z]
IDENTIFIER {LETTER}({LETTER}|{DIGIT}|_)*
WHITESPACE [ \t]+
%%
"int"|"float"|"char"|"double"|"void"|"if"|"else"|"while"|"for"|"do"|"break"|"continue"|"return"|"switch"|"case"|"default"|"struct"|"union"|"typedef"|"static"|"extern"|"auto"|"register"|"const"|"volatile"|"sizeof"|"long"|"short"|"signed"|"unsigned"|"enum"|"goto" {
printf("Token %-3d: %-15s Value: %-12s Line: %-3d Col: %-3d\n",
token_count + 1, "KEYWORD", yytext, line_num, col_num);
add_token("KEYWORD", yytext, line_num, col_num);
keyword_count++;
col_num += yyleng;
}
{IDENTIFIER} {
printf("Token %-3d: %-15s Value: %-12s Line: %-3d Col: %-3d\n",
token_count + 1, "IDENTIFIER", yytext, line_num, col_num);
add_token("IDENTIFIER", yytext, line_num, col_num);
identifier_count++;
col_num += yyleng;
}
printf("Token %-3d: %-15s Value: %-12s Line: %-3d Col: %-3d\n",
token_count + 1, "NUMBER", yytext, line_num, col_num);
add_token("NUMBER", yytext, line_num, col_num);
number_count++;
col_num += yyleng;
}
"<="|">="|"=="|"!="|"<"|">" {
printf("Token %-3d: %-15s Value: %-12s Line: %-3d Col: %-3d\n",
token_count + 1, "RELATIONAL_OP", yytext, line_num, col_num);
add_token("RELATIONAL_OP", yytext, line_num, col_num);
relop_count++;
col_num += yyleng;
}
{WHITESPACE} {
col_num += yyleng;
}
\n {
line_num++;
col_num = 1;
}
"//".*$ {
col_num += yyleng;
}
"/*"([^*]|\*+[^*/])*\*+"/" {
for(int i = 0; i < yyleng; i++) {
if(yytext[i] == '\n') {
line_num++;
col_num = 1;
} else {
col_num++;
}
}
}
. {
printf("Token %-3d: %-15s Value: %-12s Line: %-3d Col: %-3d\n",
token_count + 1, "UNKNOWN", yytext, line_num, col_num);
add_token("UNKNOWN", yytext, line_num, col_num);
unknown_count++;
col_num += yyleng;
}
%%
int yywrap() {
return 1;
}
void print_menu() {
printf("\n=============== MENU OPTIONS ===============\n");
printf("1. Show Token Table\n");
printf("2. Show Statistics\n");
printf("3. Save Analysis to File\n");
printf("4. Exit\n");
printf("===========================================\n");
printf("Enter your choice: ");
}
int main(int argc, char *argv[]) {
printf("======================================\n");
printf(" ADVANCED LEX TOKENIZER v2.0\n");
printf("======================================\n");
printf("Features: Keywords, Identifiers, Numbers,\n");
printf(" Relational Operators, Comments\n");
printf("======================================\n\n");
if(argc > 1) {
FILE *input_file = fopen(argv[1], "r");
if(!input_file) {
printf
("Error
: Cannot
open file
'%s'\n"
, argv
[1]); printf("Usage: %s [input_file.c]\n", argv[0]);
return 1;
}
yyin = input_file;
printf("Analyzing file: %s\n", argv[1]);
printf("======================================\n");
} else {
printf("Enter source code (Ctrl+D to finish):\n");
printf("======================================\n");
}
yylex();
if(argc > 1) {
fclose(yyin);
}
printf("\n======================================\n");
printf(" LEXICAL ANALYSIS COMPLETE\n");
printf("======================================\n");
int choice;
do {
print_menu();
scanf("%d", &choice);
switch(choice) {
case 1:
print_token_table();
break;
case 2:
print_statistics();
break;
case 3:
save_to_file();
break;
case 4:
printf("Thank you for using Advanced LEX Tokenizer!\n");
break;
default:
printf("Invalid choice! Please try again.\n");
}
} while(choice != 4);
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKaW50IGxpbmVfbnVtID0gMTsKaW50IGNvbF9udW0gPSAxOwppbnQgdG9rZW5fY291bnQgPSAwOwppbnQga2V5d29yZF9jb3VudCA9IDA7CmludCBpZGVudGlmaWVyX2NvdW50ID0gMDsKaW50IG51bWJlcl9jb3VudCA9IDA7CmludCByZWxvcF9jb3VudCA9IDA7CmludCB1bmtub3duX2NvdW50ID0gMDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNoYXIgdG9rZW5fdHlwZVsyMF07CiAgICBjaGFyIHZhbHVlWzEwMF07CiAgICBpbnQgbGluZTsKICAgIGludCBjb2x1bW47Cn0gVG9rZW5JbmZvOwoKVG9rZW5JbmZvIHRva2Vuc1sxMDAwXTsKCnZvaWQgYWRkX3Rva2VuKGNvbnN0IGNoYXIqIHR5cGUsIGNvbnN0IGNoYXIqIHZhbHVlLCBpbnQgbGluZSwgaW50IGNvbCkgewogICAgc3RyY3B5KHRva2Vuc1t0b2tlbl9jb3VudF0udG9rZW5fdHlwZSwgdHlwZSk7CiAgICBzdHJjcHkodG9rZW5zW3Rva2VuX2NvdW50XS52YWx1ZSwgdmFsdWUpOwogICAgdG9rZW5zW3Rva2VuX2NvdW50XS5saW5lID0gbGluZTsKICAgIHRva2Vuc1t0b2tlbl9jb3VudF0uY29sdW1uID0gY29sOwogICAgdG9rZW5fY291bnQrKzsKfQoKdm9pZCBwcmludF9zdGF0aXN0aWNzKCkgewogICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT0gU1RBVElTVElDUyA9PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIHByaW50ZigiVG90YWwgVG9rZW5zOiAlZFxuIiwgdG9rZW5fY291bnQpOwogICAgcHJpbnRmKCJLZXl3b3JkczogJWRcbiIsIGtleXdvcmRfY291bnQpOwogICAgcHJpbnRmKCJJZGVudGlmaWVyczogJWRcbiIsIGlkZW50aWZpZXJfY291bnQpOwogICAgcHJpbnRmKCJOdW1iZXJzOiAlZFxuIiwgbnVtYmVyX2NvdW50KTsKICAgIHByaW50ZigiUmVsYXRpb25hbCBPcGVyYXRvcnM6ICVkXG4iLCByZWxvcF9jb3VudCk7CiAgICBwcmludGYoIlVua25vd24gVG9rZW5zOiAlZFxuIiwgdW5rbm93bl9jb3VudCk7CiAgICBwcmludGYoIlRvdGFsIExpbmVzOiAlZFxuIiwgbGluZV9udW0pOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Cn0KCnZvaWQgcHJpbnRfdG9rZW5fdGFibGUoKSB7CiAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PSBUT0tFTiBUQUJMRSA9PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIHByaW50ZigiJS00cyAlLTE1cyAlLTE1cyAlLTZzICUtNnNcbiIsICJOby4iLCAiVHlwZSIsICJWYWx1ZSIsICJMaW5lIiwgIkNvbCIpOwogICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCB0b2tlbl9jb3VudDsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlLTRkICUtMTVzICUtMTVzICUtNmQgJS02ZFxuIiwgCiAgICAgICAgICAgICAgIGkrMSwgdG9rZW5zW2ldLnRva2VuX3R5cGUsIHRva2Vuc1tpXS52YWx1ZSwgCiAgICAgICAgICAgICAgIHRva2Vuc1tpXS5saW5lLCB0b2tlbnNbaV0uY29sdW1uKTsKICAgIH0KICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Cn0KCnZvaWQgc2F2ZV90b19maWxlKCkgewogICAgRklMRSAqZnAgPSBmb3BlbigidG9rZW5fYW5hbHlzaXMudHh0IiwgInciKTsKICAgIGlmKCFmcCkgewogICAgICAgIHByaW50ZigiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IGZpbGUhXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIGZwcmludGYoZnAsICJMRVhJQ0FMIEFOQUxZU0lTIFJFUE9SVFxuIik7CiAgICBmcHJpbnRmKGZwLCAiPT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CiAgICAKICAgIGZwcmludGYoZnAsICJUT0tFTiBUQUJMRTpcbiIpOwogICAgZnByaW50ZihmcCwgIiUtNHMgJS0xNXMgJS0xNXMgJS02cyAlLTZzXG4iLCAiTm8uIiwgIlR5cGUiLCAiVmFsdWUiLCAiTGluZSIsICJDb2wiKTsKICAgIGZwcmludGYoZnAsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IHRva2VuX2NvdW50OyBpKyspIHsKICAgICAgICBmcHJpbnRmKGZwLCAiJS00ZCAlLTE1cyAlLTE1cyAlLTZkICUtNmRcbiIsIAogICAgICAgICAgICAgICAgaSsxLCB0b2tlbnNbaV0udG9rZW5fdHlwZSwgdG9rZW5zW2ldLnZhbHVlLCAKICAgICAgICAgICAgICAgIHRva2Vuc1tpXS5saW5lLCB0b2tlbnNbaV0uY29sdW1uKTsKICAgIH0KICAgIAogICAgZnByaW50ZihmcCwgIlxuU1RBVElTVElDUzpcbiIpOwogICAgZnByaW50ZihmcCwgIlRvdGFsIFRva2VuczogJWRcbiIsIHRva2VuX2NvdW50KTsKICAgIGZwcmludGYoZnAsICJLZXl3b3JkczogJWRcbiIsIGtleXdvcmRfY291bnQpOwogICAgZnByaW50ZihmcCwgIklkZW50aWZpZXJzOiAlZFxuIiwgaWRlbnRpZmllcl9jb3VudCk7CiAgICBmcHJpbnRmKGZwLCAiTnVtYmVyczogJWRcbiIsIG51bWJlcl9jb3VudCk7CiAgICBmcHJpbnRmKGZwLCAiUmVsYXRpb25hbCBPcGVyYXRvcnM6ICVkXG4iLCByZWxvcF9jb3VudCk7CiAgICBmcHJpbnRmKGZwLCAiVW5rbm93biBUb2tlbnM6ICVkXG4iLCB1bmtub3duX2NvdW50KTsKICAgIGZwcmludGYoZnAsICJUb3RhbCBMaW5lczogJWRcbiIsIGxpbmVfbnVtKTsKICAgIAogICAgZmNsb3NlKGZwKTsKICAgIHByaW50ZigiQW5hbHlzaXMgc2F2ZWQgdG86IHRva2VuX2FuYWx5c2lzLnR4dFxuIik7Cn0KCiV9CgpESUdJVCBbMC05XQpMRVRURVIgW2EtekEtWl0KSURFTlRJRklFUiB7TEVUVEVSfSh7TEVUVEVSfXx7RElHSVR9fF8pKgpJTlRFR0VSIHtESUdJVH0rCkZMT0FUIHtESUdJVH0qXC57RElHSVR9KwpOVU1CRVIge0lOVEVHRVJ9fHtGTE9BVH0KV0hJVEVTUEFDRSBbIFx0XSsKCiUlCgoiaW50InwiZmxvYXQifCJjaGFyInwiZG91YmxlInwidm9pZCJ8ImlmInwiZWxzZSJ8IndoaWxlInwiZm9yInwiZG8ifCJicmVhayJ8ImNvbnRpbnVlInwicmV0dXJuInwic3dpdGNoInwiY2FzZSJ8ImRlZmF1bHQifCJzdHJ1Y3QifCJ1bmlvbiJ8InR5cGVkZWYifCJzdGF0aWMifCJleHRlcm4ifCJhdXRvInwicmVnaXN0ZXIifCJjb25zdCJ8InZvbGF0aWxlInwic2l6ZW9mInwibG9uZyJ8InNob3J0Inwic2lnbmVkInwidW5zaWduZWQifCJlbnVtInwiZ290byIgewogICAgcHJpbnRmKCJUb2tlbiAlLTNkOiAlLTE1cyBWYWx1ZTogJS0xMnMgTGluZTogJS0zZCBDb2w6ICUtM2RcbiIsIAogICAgICAgICAgIHRva2VuX2NvdW50ICsgMSwgIktFWVdPUkQiLCB5eXRleHQsIGxpbmVfbnVtLCBjb2xfbnVtKTsKICAgIGFkZF90b2tlbigiS0VZV09SRCIsIHl5dGV4dCwgbGluZV9udW0sIGNvbF9udW0pOwogICAga2V5d29yZF9jb3VudCsrOwogICAgY29sX251bSArPSB5eWxlbmc7Cn0KCntJREVOVElGSUVSfSB7CiAgICBwcmludGYoIlRva2VuICUtM2Q6ICUtMTVzIFZhbHVlOiAlLTEycyBMaW5lOiAlLTNkIENvbDogJS0zZFxuIiwgCiAgICAgICAgICAgdG9rZW5fY291bnQgKyAxLCAiSURFTlRJRklFUiIsIHl5dGV4dCwgbGluZV9udW0sIGNvbF9udW0pOwogICAgYWRkX3Rva2VuKCJJREVOVElGSUVSIiwgeXl0ZXh0LCBsaW5lX251bSwgY29sX251bSk7CiAgICBpZGVudGlmaWVyX2NvdW50Kys7CiAgICBjb2xfbnVtICs9IHl5bGVuZzsKfQoKe05VTUJFUn0gewogICAgcHJpbnRmKCJUb2tlbiAlLTNkOiAlLTE1cyBWYWx1ZTogJS0xMnMgTGluZTogJS0zZCBDb2w6ICUtM2RcbiIsIAogICAgICAgICAgIHRva2VuX2NvdW50ICsgMSwgIk5VTUJFUiIsIHl5dGV4dCwgbGluZV9udW0sIGNvbF9udW0pOwogICAgYWRkX3Rva2VuKCJOVU1CRVIiLCB5eXRleHQsIGxpbmVfbnVtLCBjb2xfbnVtKTsKICAgIG51bWJlcl9jb3VudCsrOwogICAgY29sX251bSArPSB5eWxlbmc7Cn0KCiI8PSJ8Ij49InwiPT0ifCIhPSJ8IjwifCI+IiB7CiAgICBwcmludGYoIlRva2VuICUtM2Q6ICUtMTVzIFZhbHVlOiAlLTEycyBMaW5lOiAlLTNkIENvbDogJS0zZFxuIiwgCiAgICAgICAgICAgdG9rZW5fY291bnQgKyAxLCAiUkVMQVRJT05BTF9PUCIsIHl5dGV4dCwgbGluZV9udW0sIGNvbF9udW0pOwogICAgYWRkX3Rva2VuKCJSRUxBVElPTkFMX09QIiwgeXl0ZXh0LCBsaW5lX251bSwgY29sX251bSk7CiAgICByZWxvcF9jb3VudCsrOwogICAgY29sX251bSArPSB5eWxlbmc7Cn0KCntXSElURVNQQUNFfSB7CiAgICBjb2xfbnVtICs9IHl5bGVuZzsKfQoKXG4gewogICAgbGluZV9udW0rKzsKICAgIGNvbF9udW0gPSAxOwp9CgoiLy8iLiokIHsKICAgIGNvbF9udW0gKz0geXlsZW5nOwp9CgoiLyoiKFteKl18XCorW14qL10pKlwqKyIvIiB7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgeXlsZW5nOyBpKyspIHsKICAgICAgICBpZih5eXRleHRbaV0gPT0gJ1xuJykgewogICAgICAgICAgICBsaW5lX251bSsrOwogICAgICAgICAgICBjb2xfbnVtID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb2xfbnVtKys7CiAgICAgICAgfQogICAgfQp9CgouIHsKICAgIHByaW50ZigiVG9rZW4gJS0zZDogJS0xNXMgVmFsdWU6ICUtMTJzIExpbmU6ICUtM2QgQ29sOiAlLTNkXG4iLCAKICAgICAgICAgICB0b2tlbl9jb3VudCArIDEsICJVTktOT1dOIiwgeXl0ZXh0LCBsaW5lX251bSwgY29sX251bSk7CiAgICBhZGRfdG9rZW4oIlVOS05PV04iLCB5eXRleHQsIGxpbmVfbnVtLCBjb2xfbnVtKTsKICAgIHVua25vd25fY291bnQrKzsKICAgIGNvbF9udW0gKz0geXlsZW5nOwp9CgolJQoKaW50IHl5d3JhcCgpIHsKICAgIHJldHVybiAxOwp9Cgp2b2lkIHByaW50X21lbnUoKSB7CiAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09IE1FTlUgT1BUSU9OUyA9PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCIxLiBTaG93IFRva2VuIFRhYmxlXG4iKTsKICAgIHByaW50ZigiMi4gU2hvdyBTdGF0aXN0aWNzXG4iKTsKICAgIHByaW50ZigiMy4gU2F2ZSBBbmFseXNpcyB0byBGaWxlXG4iKTsKICAgIHByaW50ZigiNC4gRXhpdFxuIik7CiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCJFbnRlciB5b3VyIGNob2ljZTogIik7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCIgICAgQURWQU5DRUQgTEVYIFRPS0VOSVpFUiB2Mi4wXG4iKTsKICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCJGZWF0dXJlczogS2V5d29yZHMsIElkZW50aWZpZXJzLCBOdW1iZXJzLFxuIik7CiAgICBwcmludGYoIiAgICAgICAgICBSZWxhdGlvbmFsIE9wZXJhdG9ycywgQ29tbWVudHNcbiIpOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKICAgIAogICAgaWYoYXJnYyA+IDEpIHsKICAgICAgICBGSUxFICppbnB1dF9maWxlID0gZm9wZW4oYXJndlsxXSwgInIiKTsKICAgICAgICBpZighaW5wdXRfZmlsZSkgewogICAgICAgICAgICBwcmludGYoIkVycm9yOiBDYW5ub3Qgb3BlbiBmaWxlICclcydcbiIsIGFyZ3ZbMV0pOwogICAgICAgICAgICBwcmludGYoIlVzYWdlOiAlcyBbaW5wdXRfZmlsZS5jXVxuIiwgYXJndlswXSk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICB5eWluID0gaW5wdXRfZmlsZTsKICAgICAgICBwcmludGYoIkFuYWx5emluZyBmaWxlOiAlc1xuIiwgYXJndlsxXSk7CiAgICAgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiRW50ZXIgc291cmNlIGNvZGUgKEN0cmwrRCB0byBmaW5pc2gpOlxuIik7CiAgICAgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICB9CiAgICAKICAgIHl5bGV4KCk7CiAgICAKICAgIGlmKGFyZ2MgPiAxKSB7CiAgICAgICAgZmNsb3NlKHl5aW4pOwogICAgfQogICAgCiAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCIgICAgTEVYSUNBTCBBTkFMWVNJUyBDT01QTEVURVxuIik7CiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIAogICAgaW50IGNob2ljZTsKICAgIGRvIHsKICAgICAgICBwcmludF9tZW51KCk7CiAgICAgICAgc2NhbmYoIiVkIiwgJmNob2ljZSk7CiAgICAgICAgCiAgICAgICAgc3dpdGNoKGNob2ljZSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBwcmludF90b2tlbl90YWJsZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHByaW50X3N0YXRpc3RpY3MoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBzYXZlX3RvX2ZpbGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBwcmludGYoIlRoYW5rIHlvdSBmb3IgdXNpbmcgQWR2YW5jZWQgTEVYIFRva2VuaXplciFcbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgY2hvaWNlISBQbGVhc2UgdHJ5IGFnYWluLlxuIik7CiAgICAgICAgfQogICAgfSB3aGlsZShjaG9pY2UgIT0gNCk7CiAgICAKICAgIHJldHVybiAwOwp9Cg==