- #include <stdio.h> 
- #include <stdlib.h> 
- #include <string.h> 
- #include <math.h> 
-   
- typedef struct dicionario 
- { 
-     char chave[21]; 
-   
-     int* linhas; 
-   
-     int tam_linhas; 
-   
- }Dicionario; 
-   
- void inicializa(Dicionario* tabela, int tam) 
- { 
-     int i; 
-   
-     for(i=0; i < tam; i++) 
-         tabela[i].tam_linhas = 0; 
- } 
-   
- int code(char str[])//gera um codigo p a chave 
- { 
-     int-  tam_str  = strlen(- str ),- aux =0,-  i ,-  j ;
 
-   
-     for(i=0,j=tam_str-1; i < tam_str; i++,j--) 
-         aux  =-  aux  + (- str [- i ]-'a')*(pow(26,- j ));
-   
-     return aux; 
- } 
-   
- int hash(int chave, int tam, int i) 
- { 
-     return (chave%tam + i); 
- } 
-   
- int naoTemRepeticaoDaLinha(int linha, int v[], int tam) 
- { 
-     int i;//índice de reaplicação do Hash 
-   
-     char existe = 'N'; 
-   
-     for(i = 0; i < tam; i++) 
-         if(v[i] == linha) 
-             existe = 'S'; 
-   
-     return (existe == 'N'); 
- } 
-   
- void insereTabela(char* aux, Dicionario* tabela, int tam, int num_linha, int* num_chaves) 
- { 
-     int pos, i=0; 
-   
-     char op_efetuada = 'N'; 
-   
-     pos = hash(code(aux), tam, i); 
-   
-     //printf("%d\n", pos); 
-   
-     while(op_efetuada == 'N') 
-     { 
-   
-         if(tabela[pos].tam_linhas == 0)//se nao houve conflito 
-         { 
-             strcpy(- tabela [- pos ]- . chave,-  aux );//atualiza a chave
 
-   
-             tabela[pos].tam_linhas++;//atualiza o tamanho 
-   
-             tabela [- pos ]- . linhas = (int*) malloc(sizeof(int));//cria o vetor de linhas
-   
-             if(tabela[pos].linhas == NULL) 
-             { 
-                 printf("\nmemoria insuficiente"); 
-   
-             } 
-   
-             tabela[pos].linhas[tabela[pos].tam_linhas - 1] = num_linha;//add a linha atual 
-   
-             op_efetuada = 'S'; 
-   
-             *num_chaves = *num_chaves + 1; 
-   
-         } 
-         else//houve conflito 
-         { 
-   
-             if(strcmp(- aux ,-  tabela [- pos ]- . chave) == 0)//se a chave coincidir
 
-             { 
-                 if(naoTemRepeticaoDaLinha(num_linha, tabela[pos].linhas, tabela[pos].tam_linhas))//se não houver repeticao de linha 
-                 { 
-                     tabela[pos].tam_linhas++; 
-   
-                     tabela [- pos ]- . linhas = (int*) realloc(- tabela [- pos ]- . linhas, (- tabela [- pos ]- . tam_linhas)*sizeof(int) );
-   
-                     if(tabela[pos].linhas == NULL) 
-                     { 
-                         printf("\nmemoria insuficiente"); 
-   
-                     } 
-   
-                     tabela[pos].linhas[tabela[pos].tam_linhas - 1] = num_linha; 
-   
-                     op_efetuada = 'S'; 
-                 } 
-             } 
-             else//procura outra posicao 
-             { 
-                 i++; 
-   
-                 pos = hash(code(aux), tam, i); 
-             } 
-   
-         } 
-     } 
- } 
-   
- void reallocaTabela(Dicionario* tabela, Dicionario* tabela2, int tam, int tam_temp) 
- { 
-     int i, 
-         j, 
-         k, 
-         pos; 
-   
-     char op_efetuada; 
-   
-     for(i=0; i < tam_temp; i++) 
-     { 
-         op_efetuada == 'N'; 
-   
-         if(tabela[i].tam_linhas != 0) 
-         { 
-             j=0; 
-   
-             pos = hash(code(tabela[i].chave), tam, j); 
-   
-             while(op_efetuada == 'N') 
-             { 
-                 if(tabela2[pos].tam_linhas == 0)//se nao houve conflito 
-                 { 
-                     strcpy(- tabela2 [- pos ]- . chave,-  tabela [- i ]- . chave);//atualiza a chave
 
-   
-                     tabela2[pos].tam_linhas = tabela[i].tam_linhas;//atualiza o tamanho 
-   
-                     tabela2 [- pos ]- . linhas = (int*) malloc(- tabela2 [- pos ]- . tam_linhas*sizeof(int));//cria o vetor de linhas
-   
-                     if(tabela2[pos].linhas == NULL) 
-                     { 
-                         printf("\nmemoria insuficiente"); 
-   
-                     } 
-   
-                     for(k=0; k < tabela2[pos].tam_linhas; k++) 
-                         tabela2[pos].linhas[k] = tabela[i].linhas[k]; 
-   
-                     op_efetuada = 'S'; 
-   
-                 } 
-                 else//procura outra posicao 
-                 { 
-                     j++; 
-   
-                     pos = hash(code(tabela[i].chave), tam, j); 
-                 } 
-             } 
-         } 
-     } 
- } 
-   
-   
- ///MAIN 
-   
-   
- int main() 
- { 
-     int tam=11, 
-         num_chaves=0, 
-         i,//coeficiente anti-colisão 
-         num_linha = 1, 
-         tam_temp, 
-         k, 
-         pos; 
-   
-     float load_factor=0;//razão entre o número de chaves distintas na tabela e a capacidade máxima da tabela 
-   
-     char str[101], op_efetuada; 
-   
-     Dicionario *-  tabela  = (- Dicionario *) malloc(- tam *sizeof(- Dicionario ));
-   
-     Dicionario* tabela2; 
-   
-     if(tabela == NULL) 
-     { 
-         printf("\nmemoria insuficiente"); 
-   
-     } 
-   
-     inicializa(tabela, tam);//inicializa tabela com tam_linhas = 0; 
-   
-   
-   
-     //enquanto tiver linhas do texto para ler 
-     while (scanf(" %100[^\n]",-  str ) && strcmp(- str , "$CONSULTAS") != 0)
 
-     { 
-         load_factor = (float) num_chaves/tam; 
-   
-         if(load_factor > 0.5 && num_chaves < 6000)//se load_factor for maior que 1/2 
-         { 
-             tam_temp = tam; 
-   
-             tam = tam*2 + 1;//duplique o tam 
-   
-             tabela2  = (- Dicionario *) malloc(- tam *sizeof(- Dicionario ));
-   
-             if(tabela2 == NULL) 
-             { 
-                 printf("\nmemoria insuficiente"); 
-   
-             } 
-   
-             inicializa(tabela2, tam); 
-   
-             reallocaTabela(tabela, tabela2, tam, tam_temp); 
-   
-   
-             tabela = tabela2; 
-         } 
-   
-         char*-  aux  = strtok(- str , " ");//strtok vai separar a string nas palavras
 
-   
-   
-         while (aux != NULL) 
-         { 
-             //printf("%s\n", aux); 
-             insereTabela(aux, tabela, tam, num_linha, &num_chaves); 
-   
-         } 
-   
-         num_linha++; 
-     } 
-   
-     //como no loop acima ja lemos o $CONSULTAS, so precisamos ler as consultas 
-     while (scanf(" %20[^\n]",-  str ) == 1)//enquanto tiver consulta para ler
 
-     { 
-         i=0; 
-   
-         k=num_chaves; 
-   
-         op_efetuada == 'N'; 
-   
-         pos = hash(code(str), tam, i); 
-   
-         while(op_efetuada == 'N') 
-         { 
-             if(strcmp(- tabela [- pos ]- . chave,- str ) == 0)
 
-             { 
-   
-                 //tam_temp faz papel de contador 
-                 for(tam_temp = 0; tam_temp < tabela[pos].tam_linhas; tam_temp++) 
-                     printf("%d ",-  tabela [- pos ]- . linhas[- tam_temp ]);
 
-   
-   
-                 op_efetuada == 'S'; 
-             } 
-             else 
-             { 
-                 if(k>0) 
-                 { 
-                     i++; 
-   
-                     pos = hash(code(str), tam, i); 
-   
-                     k--; 
-                 } 
-                 else 
-                 { 
-                     op_efetuada == 'S'; 
-   
-                 } 
-             } 
-         } 
-   
-     } 
-   
-   return 0; 
- } 
-   
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgoKdHlwZWRlZiBzdHJ1Y3QgZGljaW9uYXJpbwp7CiAgICBjaGFyIGNoYXZlWzIxXTsKCiAgICBpbnQqIGxpbmhhczsKCiAgICBpbnQgdGFtX2xpbmhhczsKCn1EaWNpb25hcmlvOwoKdm9pZCBpbmljaWFsaXphKERpY2lvbmFyaW8qIHRhYmVsYSwgaW50IHRhbSkKewogICAgaW50IGk7CgogICAgZm9yKGk9MDsgaSA8IHRhbTsgaSsrKQogICAgICAgIHRhYmVsYVtpXS50YW1fbGluaGFzID0gMDsKfQoKaW50IGNvZGUoY2hhciBzdHJbXSkvL2dlcmEgdW0gY29kaWdvIHAgYSBjaGF2ZQp7CiAgICBpbnQgdGFtX3N0ciA9IHN0cmxlbihzdHIpLGF1eD0wLCBpLCBqOwoKICAgIGZvcihpPTAsaj10YW1fc3RyLTE7IGkgPCB0YW1fc3RyOyBpKyssai0tKQogICAgICAgIGF1eCA9IGF1eCArIChzdHJbaV0tJ2EnKSoocG93KDI2LGopKTsKCiAgICByZXR1cm4gYXV4Owp9CgppbnQgaGFzaChpbnQgY2hhdmUsIGludCB0YW0sIGludCBpKQp7CiAgICByZXR1cm4gKGNoYXZlJXRhbSArIGkpOwp9CgppbnQgbmFvVGVtUmVwZXRpY2FvRGFMaW5oYShpbnQgbGluaGEsIGludCB2W10sIGludCB0YW0pCnsKICAgIGludCBpOy8vw61uZGljZSBkZSByZWFwbGljYcOnw6NvIGRvIEhhc2gKCiAgICBjaGFyIGV4aXN0ZSA9ICdOJzsKCiAgICBmb3IoaSA9IDA7IGkgPCB0YW07IGkrKykKICAgICAgICBpZih2W2ldID09IGxpbmhhKQogICAgICAgICAgICBleGlzdGUgPSAnUyc7CgogICAgcmV0dXJuIChleGlzdGUgPT0gJ04nKTsKfQoKdm9pZCBpbnNlcmVUYWJlbGEoY2hhciogYXV4LCBEaWNpb25hcmlvKiB0YWJlbGEsIGludCB0YW0sIGludCBudW1fbGluaGEsIGludCogbnVtX2NoYXZlcykKewogICAgaW50IHBvcywgaT0wOwoKICAgIGNoYXIgb3BfZWZldHVhZGEgPSAnTic7CgogICAgcG9zID0gaGFzaChjb2RlKGF1eCksIHRhbSwgaSk7CgogICAgLy9wcmludGYoIiVkXG4iLCBwb3MpOwoKICAgIHdoaWxlKG9wX2VmZXR1YWRhID09ICdOJykKICAgIHsKCiAgICAgICAgaWYodGFiZWxhW3Bvc10udGFtX2xpbmhhcyA9PSAwKS8vc2UgbmFvIGhvdXZlIGNvbmZsaXRvCiAgICAgICAgewogICAgICAgICAgICBzdHJjcHkodGFiZWxhW3Bvc10uY2hhdmUsIGF1eCk7Ly9hdHVhbGl6YSBhIGNoYXZlCgogICAgICAgICAgICB0YWJlbGFbcG9zXS50YW1fbGluaGFzKys7Ly9hdHVhbGl6YSBvIHRhbWFuaG8KCiAgICAgICAgICAgIHRhYmVsYVtwb3NdLmxpbmhhcyA9IChpbnQqKSBtYWxsb2Moc2l6ZW9mKGludCkpOy8vY3JpYSBvIHZldG9yIGRlIGxpbmhhcwoKICAgICAgICAgICAgaWYodGFiZWxhW3Bvc10ubGluaGFzID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5tZW1vcmlhIGluc3VmaWNpZW50ZSIpOwoKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRhYmVsYVtwb3NdLmxpbmhhc1t0YWJlbGFbcG9zXS50YW1fbGluaGFzIC0gMV0gPSBudW1fbGluaGE7Ly9hZGQgYSBsaW5oYSBhdHVhbAoKICAgICAgICAgICAgb3BfZWZldHVhZGEgPSAnUyc7CgogICAgICAgICAgICAqbnVtX2NoYXZlcyA9ICpudW1fY2hhdmVzICsgMTsKCiAgICAgICAgfQogICAgICAgIGVsc2UvL2hvdXZlIGNvbmZsaXRvCiAgICAgICAgewoKICAgICAgICAgICAgaWYoc3RyY21wKGF1eCwgdGFiZWxhW3Bvc10uY2hhdmUpID09IDApLy9zZSBhIGNoYXZlIGNvaW5jaWRpcgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihuYW9UZW1SZXBldGljYW9EYUxpbmhhKG51bV9saW5oYSwgdGFiZWxhW3Bvc10ubGluaGFzLCB0YWJlbGFbcG9zXS50YW1fbGluaGFzKSkvL3NlIG7Do28gaG91dmVyIHJlcGV0aWNhbyBkZSBsaW5oYQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhYmVsYVtwb3NdLnRhbV9saW5oYXMrKzsKCiAgICAgICAgICAgICAgICAgICAgdGFiZWxhW3Bvc10ubGluaGFzID0gKGludCopIHJlYWxsb2ModGFiZWxhW3Bvc10ubGluaGFzLCAodGFiZWxhW3Bvc10udGFtX2xpbmhhcykqc2l6ZW9mKGludCkgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodGFiZWxhW3Bvc10ubGluaGFzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxubWVtb3JpYSBpbnN1ZmljaWVudGUiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0YWJlbGFbcG9zXS5saW5oYXNbdGFiZWxhW3Bvc10udGFtX2xpbmhhcyAtIDFdID0gbnVtX2xpbmhhOwoKICAgICAgICAgICAgICAgICAgICBvcF9lZmV0dWFkYSA9ICdTJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlLy9wcm9jdXJhIG91dHJhIHBvc2ljYW8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaSsrOwoKICAgICAgICAgICAgICAgIHBvcyA9IGhhc2goY29kZShhdXgpLCB0YW0sIGkpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KfQoKdm9pZCByZWFsbG9jYVRhYmVsYShEaWNpb25hcmlvKiB0YWJlbGEsIERpY2lvbmFyaW8qIHRhYmVsYTIsIGludCB0YW0sIGludCB0YW1fdGVtcCkKewogICAgaW50IGksCiAgICAgICAgaiwKICAgICAgICBrLAogICAgICAgIHBvczsKCiAgICBjaGFyIG9wX2VmZXR1YWRhOwoKICAgIGZvcihpPTA7IGkgPCB0YW1fdGVtcDsgaSsrKQogICAgewogICAgICAgIG9wX2VmZXR1YWRhID09ICdOJzsKCiAgICAgICAgaWYodGFiZWxhW2ldLnRhbV9saW5oYXMgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGo9MDsKCiAgICAgICAgICAgIHBvcyA9IGhhc2goY29kZSh0YWJlbGFbaV0uY2hhdmUpLCB0YW0sIGopOwoKICAgICAgICAgICAgd2hpbGUob3BfZWZldHVhZGEgPT0gJ04nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih0YWJlbGEyW3Bvc10udGFtX2xpbmhhcyA9PSAwKS8vc2UgbmFvIGhvdXZlIGNvbmZsaXRvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRhYmVsYTJbcG9zXS5jaGF2ZSwgdGFiZWxhW2ldLmNoYXZlKTsvL2F0dWFsaXphIGEgY2hhdmUKCiAgICAgICAgICAgICAgICAgICAgdGFiZWxhMltwb3NdLnRhbV9saW5oYXMgPSB0YWJlbGFbaV0udGFtX2xpbmhhczsvL2F0dWFsaXphIG8gdGFtYW5obwoKICAgICAgICAgICAgICAgICAgICB0YWJlbGEyW3Bvc10ubGluaGFzID0gKGludCopIG1hbGxvYyh0YWJlbGEyW3Bvc10udGFtX2xpbmhhcypzaXplb2YoaW50KSk7Ly9jcmlhIG8gdmV0b3IgZGUgbGluaGFzCgogICAgICAgICAgICAgICAgICAgIGlmKHRhYmVsYTJbcG9zXS5saW5oYXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5tZW1vcmlhIGluc3VmaWNpZW50ZSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvcihrPTA7IGsgPCB0YWJlbGEyW3Bvc10udGFtX2xpbmhhczsgaysrKQogICAgICAgICAgICAgICAgICAgICAgICB0YWJlbGEyW3Bvc10ubGluaGFzW2tdID0gdGFiZWxhW2ldLmxpbmhhc1trXTsKCiAgICAgICAgICAgICAgICAgICAgb3BfZWZldHVhZGEgPSAnUyc7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZS8vcHJvY3VyYSBvdXRyYSBwb3NpY2FvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaisrOwoKICAgICAgICAgICAgICAgICAgICBwb3MgPSBoYXNoKGNvZGUodGFiZWxhW2ldLmNoYXZlKSwgdGFtLCBqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKCi8vL01BSU4KCgppbnQgbWFpbigpCnsKICAgIGludCB0YW09MTEsCiAgICAgICAgbnVtX2NoYXZlcz0wLAogICAgICAgIGksLy9jb2VmaWNpZW50ZSBhbnRpLWNvbGlzw6NvCiAgICAgICAgbnVtX2xpbmhhID0gMSwKICAgICAgICB0YW1fdGVtcCwKICAgICAgICBrLAogICAgICAgIHBvczsKCiAgICBmbG9hdCBsb2FkX2ZhY3Rvcj0wOy8vcmF6w6NvIGVudHJlIG8gbsO6bWVybyBkZSBjaGF2ZXMgZGlzdGludGFzIG5hIHRhYmVsYSBlIGEgY2FwYWNpZGFkZSBtw6F4aW1hIGRhIHRhYmVsYQoKICAgIGNoYXIgc3RyWzEwMV0sIG9wX2VmZXR1YWRhOwoKICAgIERpY2lvbmFyaW8qIHRhYmVsYSA9IChEaWNpb25hcmlvKikgbWFsbG9jKHRhbSpzaXplb2YoRGljaW9uYXJpbykpOwoKICAgIERpY2lvbmFyaW8qIHRhYmVsYTI7CgogICAgaWYodGFiZWxhID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCJcbm1lbW9yaWEgaW5zdWZpY2llbnRlIik7CgogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgaW5pY2lhbGl6YSh0YWJlbGEsIHRhbSk7Ly9pbmljaWFsaXphIHRhYmVsYSBjb20gdGFtX2xpbmhhcyA9IDA7CgogICAgZnJlb3BlbigiTDNRMS5pbiIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oIkwzUTEub3V0IiwidyIsc3Rkb3V0KTsKCiAgICBnZXRzKHN0cik7Ly9sw6ogJFRFWFRPCgogICAgLy9lbnF1YW50byB0aXZlciBsaW5oYXMgZG8gdGV4dG8gcGFyYSBsZXIKICAgIHdoaWxlIChzY2FuZigiICUxMDBbXlxuXSIsIHN0cikgJiYgc3RyY21wKHN0ciwgIiRDT05TVUxUQVMiKSAhPSAwKQogICAgewogICAgICAgIGxvYWRfZmFjdG9yID0gKGZsb2F0KSBudW1fY2hhdmVzL3RhbTsKCiAgICAgICAgaWYobG9hZF9mYWN0b3IgPiAwLjUgJiYgbnVtX2NoYXZlcyA8IDYwMDApLy9zZSBsb2FkX2ZhY3RvciBmb3IgbWFpb3IgcXVlIDEvMgogICAgICAgIHsKICAgICAgICAgICAgdGFtX3RlbXAgPSB0YW07CgogICAgICAgICAgICB0YW0gPSB0YW0qMiArIDE7Ly9kdXBsaXF1ZSBvIHRhbQoKICAgICAgICAgICAgdGFiZWxhMiA9IChEaWNpb25hcmlvKikgbWFsbG9jKHRhbSpzaXplb2YoRGljaW9uYXJpbykpOwoKICAgICAgICAgICAgaWYodGFiZWxhMiA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGYoIlxubWVtb3JpYSBpbnN1ZmljaWVudGUiKTsKCiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbmljaWFsaXphKHRhYmVsYTIsIHRhbSk7CgogICAgICAgICAgICByZWFsbG9jYVRhYmVsYSh0YWJlbGEsIHRhYmVsYTIsIHRhbSwgdGFtX3RlbXApOwoKICAgICAgICAgICAgZnJlZSh0YWJlbGEpOwoKICAgICAgICAgICAgdGFiZWxhID0gdGFiZWxhMjsKICAgICAgICB9CgogICAgICAgIGNoYXIqIGF1eCA9IHN0cnRvayhzdHIsICIgIik7Ly9zdHJ0b2sgdmFpIHNlcGFyYXIgYSBzdHJpbmcgbmFzIHBhbGF2cmFzCgoKICAgICAgICB3aGlsZSAoYXV4ICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICAvL3ByaW50ZigiJXNcbiIsIGF1eCk7CiAgICAgICAgICAgIGluc2VyZVRhYmVsYShhdXgsIHRhYmVsYSwgdGFtLCBudW1fbGluaGEsICZudW1fY2hhdmVzKTsKCiAgICAgICAgICAgIGF1eCA9IHN0cnRvayhOVUxMLCAiICIpOwogICAgICAgIH0KCiAgICAgICAgbnVtX2xpbmhhKys7CiAgICB9CgogICAgLy9jb21vIG5vIGxvb3AgYWNpbWEgamEgbGVtb3MgbyAkQ09OU1VMVEFTLCBzbyBwcmVjaXNhbW9zIGxlciBhcyBjb25zdWx0YXMKICAgIHdoaWxlIChzY2FuZigiICUyMFteXG5dIiwgc3RyKSA9PSAxKS8vZW5xdWFudG8gdGl2ZXIgY29uc3VsdGEgcGFyYSBsZXIKICAgIHsKICAgICAgICBpPTA7CgogICAgICAgIGs9bnVtX2NoYXZlczsKCiAgICAgICAgb3BfZWZldHVhZGEgPT0gJ04nOwoKICAgICAgICBwb3MgPSBoYXNoKGNvZGUoc3RyKSwgdGFtLCBpKTsKCiAgICAgICAgd2hpbGUob3BfZWZldHVhZGEgPT0gJ04nKQogICAgICAgIHsKICAgICAgICAgICAgaWYoc3RyY21wKHRhYmVsYVtwb3NdLmNoYXZlLHN0cikgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIixzdHIpOwoKICAgICAgICAgICAgICAgIC8vdGFtX3RlbXAgZmF6IHBhcGVsIGRlIGNvbnRhZG9yCiAgICAgICAgICAgICAgICBmb3IodGFtX3RlbXAgPSAwOyB0YW1fdGVtcCA8IHRhYmVsYVtwb3NdLnRhbV9saW5oYXM7IHRhbV90ZW1wKyspCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCB0YWJlbGFbcG9zXS5saW5oYXNbdGFtX3RlbXBdKTsKCiAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CgogICAgICAgICAgICAgICAgb3BfZWZldHVhZGEgPT0gJ1MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaz4wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGkrKzsKCiAgICAgICAgICAgICAgICAgICAgcG9zID0gaGFzaChjb2RlKHN0ciksIHRhbSwgaSk7CgogICAgICAgICAgICAgICAgICAgIGstLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvcF9lZmV0dWFkYSA9PSAnUyc7CgogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IFxuIixzdHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgcmV0dXJuIDA7Cn0K