/*
_______________________________________
| Thành Viên Nhóm | Ma Sinh Viên |
|_____________________________________|
| Nguy?n Ð?c Quang | :2411061767 |
| |
| Tr?n Minh Quang | :2411062029 |
| |
| Lu?ng Vi?t Nh?t | :2411061614 |
| |
| Hoàng Gia Th? | :2411061927 |
| |
| Nguy?n Ti?n Dung | :2411061649 |
|_____________________________________|
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
typedef int Position;
// Cau truc sinh vien
typedef struct {
char tenMon[ 50 ] ;
} MonHoc;
struct Sinhvien {
char id[ 20 ] ;
char name[ 50 ] ;
char ns[ 20 ] ;
int tuoi;
float diem[ MAX] ;
int soMon;
} ;
// Kieu danh sach mang
typedef struct {
struct Sinhvien A[ MAX] ;
int Last;
} List;
// =============================== Cac thao tac co ban ===============================
Position FIRST( List L) {
return 1 ;
}
Position END( List L) {
return L.Last + 1 ;
}
Position NEXT( Position P, List L) {
if ( P < END( L) ) return P + 1 ;
return END( L) ;
}
Position PREVIOUS( Position P, List L) {
if ( P > FIRST( L) ) return P - 1 ;
return FIRST( L) ;
}
struct Sinhvien RETRIEVE( Position P, List L) {
return L.A [ P- 1 ] ;
}
Position LOCATE( char id[ ] , List L) {
for ( int i = 0 ; i < L.Last ; i++ ) {
if ( strcmp ( L.
A [ i
] .
id , id
) == 0 ) return i+ 1 ;
}
return END( L) ;
}
void MAKENULL_LIST( List * L) {
L-> Last = 0 ;
}
int EMPTY_LIST( List L) {
return L.Last == 0 ;
}
void INSERT_LIST( struct Sinhvien x, Position P, List * L) {
if ( L-> Last >= MAX) {
return ;
}
if ( P < FIRST( * L) || P > END( * L) ) {
printf ( "Vi tri khong hop le\n " ) ; return ;
}
for ( int i = L-> Last; i >= P; i-- ) {
L-> A[ i] = L-> A[ i- 1 ] ;
}
L-> A[ P- 1 ] = x;
L-> Last++;
}
void DELETE_LIST( Position P, List * L) {
if ( P < FIRST( * L) || P >= END( * L) ) {
printf ( "Vi tri khong hop le\n " ) ; return ;
}
for ( int i = P- 1 ; i < L-> Last- 1 ; i++ ) {
L-> A[ i] = L-> A[ i+ 1 ] ;
}
L-> Last--;
}
// Xoa sinh vien theo MSV
void DELETE_BY_ID( char id[ ] , List * L) {
printf ( "\n +==========================================================================+\n " ) ; printf ( "| XOA SINH VIEN THEO MSV |\n " ) ; printf ( "+==========================================================================+\n " ) ;
Position p = LOCATE( id, * L) ;
if ( p == END( * L) ) {
printf ( "| Khong tim thay sinh vien co MSV: %-36s|\n " , id
) ; printf ( "+==========================================================================+\n " ) ; return ;
}
struct Sinhvien sv = L-> A[ p - 1 ] ;
char confirm;
printf ( "| Tim thay sinh vien: |\n " ) ; printf ( "| MSSV : %-59s|\n " , sv.
id ) ; printf ( "| Ho ten : %-59s|\n " , sv.
name ) ; printf ( "| Ngay sinh : %-27sTuoi : %-11d |\n " , sv.
ns , sv.
tuoi ) ; printf ( "+--------------------------------------------------------------------------+\n " ) ; printf ( " Ban co chac chan muon xoa sinh vien nay khong? (y/n): " ) ; printf ( "+==========================================================================+\n " ) ;
if ( confirm != 'y' && confirm != 'Y' ) {
printf ( "| Da huy thao tac xoa sinh vien. |\n " ) ; printf ( "+==========================================================================+\n " ) ; return ;
}
for ( int i = p - 1 ; i < L-> Last - 1 ; i++ ) {
L-> A[ i] = L-> A[ i + 1 ] ;
}
L-> Last--;
printf ( "| Da xoa sinh vien thanh cong |\n " ) ; printf ( "+--------------------------------------------------------------------------+\n " ) ; printf ( "| Thong tin sinh vien da xoa: |\n " ) ; printf ( "| MSSV : %-59s|\n " , sv.
id ) ; printf ( "| Ho ten : %-59s|\n " , sv.
name ) ; printf ( "| Ngay sinh : %-27sTuoi : %-11d |\n " , sv.
ns , sv.
tuoi ) ; printf ( "+==========================================================================+\n " ) ; }
// ================== Cac chuc nang mo rong ==================
void ChuanHoan( char s[ ] , int size) {
for ( int i = 0 ; i < size; i++ ) {
if ( s[ i] == '/' ) {
if ( i == 1 ) {
for ( int j = size; j >= 0 ; j-- ) {
s[ j+ 1 ] = s[ j] ;
}
s[ 0 ] = '0' ;
size++;
}
if ( s[ i+ 2 ] == '/' && i+ 2 < size) {
for ( int k = size; k >= i+ 1 ; k-- ) {
s[ k+ 1 ] = s[ k] ;
}
s[ i+ 1 ] = '0' ;
size++;
}
}
}
}
int laNamNhuan( int y) {
return ( ( y % 400 == 0 ) || ( y % 4 == 0 && y % 100 != 0 ) ) ;
}
int soNgayTrongThang( int m, int y) {
if ( m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 )
return 31 ;
if ( m == 4 || m == 6 || m == 9 || m == 11 )
return 30 ;
if ( m == 2 )
return laNamNhuan( y) ? 29 : 28 ;
return 0 ;
}
void ChuanHoaTen( char * name) {
char temp[ 100 ] ;
int i = 0 , j = 0 ;
while ( i < len && name[ i] == ' ' ) i++;
int space = 0 ;
while ( i < len) {
if ( name[ i] != ' ' ) {
if ( space && j > 0 ) {
temp[ j++ ] = ' ' ;
space = 0 ;
}
temp[ j++ ] = name[ i] ;
} else {
space = 1 ;
}
i++;
}
if ( j > 0 && temp[ j- 1 ] == ' ' ) j--;
temp[ j] = '\0 ' ;
for ( i = 0 ; i < j; i++ ) {
if ( temp[ i] >= 'A' && temp[ i] <= 'Z' )
temp[ i] = temp[ i] - 'A' + 'a' ;
}
int newWord = 1 ;
for ( i = 0 ; i < j; i++ ) {
if ( temp[ i] == ' ' ) {
newWord = 1 ;
} else if ( newWord && temp[ i] >= 'a' && temp[ i] <= 'z' ) {
temp[ i] = temp[ i] - 'a' + 'A' ;
newWord = 0 ;
} else {
newWord = 0 ;
}
}
}
struct Sinhvien nhapSinhVien( List L) {
struct Sinhvien sv;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| NHAP THONG TIN SINH VIEN MOI |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; while ( 1 ) {
if ( LOCATE( sv.id , L) != END( L) ) {
printf ( "MSSV da ton tai, nhap lai\n " ) ; } else {
break ;
}
}
int check;
do {
check = 1 ;
scanf ( " %19[^\n ]" , sv.
name ) ;
for ( int i
= 0 ; i
< strlen ( sv.
name ) ; i
++ ) { if ( ! ( ( sv.name [ i] >= 'a' && sv.name [ i] <= 'z' ) || ( sv.name [ i] >= 'A' && sv.name [ i] <= 'Z' ) || sv.name [ i] == ' ' ) ) {
check = 0 ;
break ;
}
}
if ( check == 0 ) {
printf ( "Ho va ten khong chua so hoac ky tu dac biet (Nhap lai)\n " ) ; } else {
ChuanHoaTen( sv.name ) ;
}
} while ( check == 0 ) ;
do {
printf ( ">> Nhap ngay sinh (dd/mm/yyyy): " ) ;
ChuanHoan( sv.ns , size) ;
char day[ 3 ] , month[ 3 ] , year[ 5 ] ;
day[ 0 ] = sv.ns [ 0 ] ;
day[ 1 ] = sv.ns [ 1 ] ;
day[ 2 ] = '\0 ' ;
month[ 0 ] = sv.ns [ 3 ] ;
month[ 1 ] = sv.ns [ 4 ] ;
month[ 2 ] = '\0 ' ;
for ( int i = 6 , j = 0 ; i <= size; i++, j++ ) {
year[ j] = sv.ns [ i] ;
year[ j+ 1 ] = '\0 ' ;
}
int maxday = soNgayTrongThang( m, y) ;
if ( d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100 ) {
printf ( "Ngay sinh khong hop le vui long nhap lai!\n " ) ; } else {
int namNow = 2025 ;
do {
if ( sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2 ) {
printf ( "Vui long nhap lai tuoi dung voi tuoi that cua ban\n " ) ; }
} while ( sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2 ) ;
break ;
}
} while ( 1 ) ;
return sv;
}
void PRINT_LIST( List L) {
if ( L.Last == 0 ) {
return ;
}
printf ( "\n +-----+--------------+---------------------------+--------------+-------+\n " ) ; printf ( "| STT | MSSV | Ho Ten | Ngay Sinh | Tuoi |\n " ) ; printf ( "+-----+--------------+---------------------------+--------------+-------+\n " ) ;
for ( int i = 0 ; i < L.Last ; i++ ) {
printf ( "| %-3d | %-12s | %-25s | %-12s | %-5d |\n " , i+ 1 , L.A [ i] .id , L.A [ i] .name , L.A [ i] .ns , L.A [ i] .tuoi ) ;
}
printf ( "+-----+--------------+---------------------------+--------------+-------+\n " ) ; }
void SORT_BY_NAME( List * L) {
for ( int i = 0 ; i < L-> Last - 1 ; i++ ) {
for ( int j = i + 1 ; j < L-> Last; j++ ) {
if ( strcmp ( L
-> A
[ i
] .
name , L
-> A
[ j
] .
name ) > 0 ) { struct Sinhvien tmp = L-> A[ i] ;
L-> A[ i] = L-> A[ j] ;
L-> A[ j] = tmp;
}
}
}
printf ( "Da sap xep theo ten\n " ) ; }
void SORT_BY_TUOI( List * L) {
for ( int i = 0 ; i < L-> Last - 1 ; i++ ) {
for ( int j = i + 1 ; j < L-> Last; j++ ) {
if ( L-> A[ i] .tuoi > L-> A[ j] .tuoi ) {
struct Sinhvien tmp = L-> A[ i] ;
L-> A[ i] = L-> A[ j] ;
L-> A[ j] = tmp;
}
}
}
printf ( "Da sap xep theo tuoi\n " ) ; }
void SEARCH_BY_NAME( List L) {
char name[ 20 ] ;
printf ( "\n +==========================================================================+\n " ) ; printf ( "| TIM KIEM SINH VIEN THEO HO TEN |\n " ) ; printf ( "+==========================================================================+\n " ) ; printf ( ">> Nhap ten can tim: \n " ) ; int found = 0 ;
for ( int i = 0 ; i < L.Last ; i++ ) {
if ( strstr ( L.
A [ i
] .
name , name
) != NULL
) { found = 1 ;
struct Sinhvien sv = L.A [ i] ;
printf ( " Da tim thay sinh vien trong danh sach \n " ) ; printf ( "+==========================================================================+\n " ) ; printf ( "| Thong tin sinh vien: |\n " ) ; printf ( "| MSSV : %-59s|\n " , sv.
id ) ; printf ( "| Ho ten : %-59s|\n " , sv.
name ) ; printf ( "| Ngay sinh : %-27sTuoi : %-11d |\n " , sv.
ns , sv.
tuoi ) ; printf ( "+==========================================================================+\n " ) ; }
}
if ( ! found) {
printf ( " Khong tim thay sinh vien nao co ten chua tu khoa tren \n " ) ; }
}
// ================== MAIN ==================
int main( ) {
char * names[ ] = {
"NGUYEN DUC QUANG" ,
"TRAN MINH QUANG" ,
"LUONG VIET NHAT" ,
"HOANG GIA THE" ,
"NGUYEN TIEN DUNG"
} ;
char * ids[ ] = {
"2411061767" ,
"2411062029" ,
"2411061614" ,
"2411061927" ,
"2411061649"
} ;
int n = 5 ; // so thanh vien
printf ( "+==================================================================================+\n " ) ; printf ( "| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n " ) ; printf ( "+==================================================================================+\n " ) ; printf ( "| %-30s | %-20s | |\n " , "THANH VIEN NHOM" , "MA SINH VIEN" ) ; printf ( "+----------------------------------------------------------------------------------+\n " ) ;
for ( int i = 0 ; i < n; i++ ) {
printf ( "| %-30s | :%-19s | | \n " , names
[ i
] , ids
[ i
] ) ; printf ( "+----------------------------------------------------------------------------------+\n " ) ; }
List L;
MAKENULL_LIST( & L) ;
int choice;
while ( 1 ) {
printf ( "\n +=================================================================+\n " ) ; printf ( "| HE THONG QUAN LY SINH VIEN |\n " ) ; printf ( "+=================================================================+\n " ) ; printf ( "| [1] Them sinh vien vao danh sach (INSERT_LIST) |\n " ) ; printf ( "| [2] Xoa sinh vien theo MSV (DELETE_BY_ID) |\n " ) ; printf ( "| [3] Nhap diem cho cac sinh vien |\n " ) ; printf ( "| [4] Tim kiem sinh vien theo MSV (LOCATE) |\n " ) ; printf ( "| [5] Tim kiem sinh vien theo ten (SEARCH_BY_NAME) |\n " ) ; printf ( "| [6] Sap xep danh sach theo ten (abc) |\n " ) ; printf ( "| [7] In danh sach sinh vien |\n " ) ; printf ( "| [8] Them mon hoc moi vao danh sach |\n " ) ;
printf ( "| [0] Thoat chuong trinh |\n " ) ; printf ( "+=================================================================+\n " ) ; printf ( ">> Nhap lua chon cua ban: " ) ;
if ( choice == 0 ) {
break ;
}
switch ( choice) {
case 1 : {
struct Sinhvien sv = nhapSinhVien( L) ;
Position p;
printf ( "Nhap Vi Tri Sinh Vien Muon Them Chen Vao Dau 1 Cuoi 2: " ) ; if ( p == 1 ) {
INSERT_LIST( sv, 1 , & L) ;
printf ( "Them sinh vien vao thanh cong. \n " ) ; }
else if ( p == 2 ) {
INSERT_LIST( sv, END( L) , & L) ;
printf ( "Them sinh vien vao thanh cong. \n " ) ; }
else {
printf ( "Lua chon khong hop le \n " ) ; }
break ;
}
case 2 : {
char id[ 20 ] ;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| XOA SINH VIEN THEO MA SINH VIEN |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; printf ( ">> Nhap MSV can xoa: " ) ; DELETE_BY_ID( id, & L) ;
break ;
}
case 3 : {
char id[ 20 ] ;
printf ( "\n +---------------------------------------------+\n " ) ; printf ( "| NHAP DIEM CHO CAC SINH VIEN |\n " ) ; printf ( "+---------------------------------------------+\n " ) ; // CHÚ Ý DUNG FOR LONG QUA CAC SINH VIEN VA DIEM NHA CAC BRO
break ;
}
case 4 : {
char id[ 20 ] ;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| TIM KIEM SINH VIEN THEO MSV |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; Position p = LOCATE( id, L) ;
if ( p == 0 || p == END( L) ) {
printf ( " Khong tim thay sinh vien co MSV: \n " , id
) ;
} else {
struct Sinhvien sv = RETRIEVE( p, L) ;
printf ( " Da tim thay sinh vien trong danh sach \n " ) ; printf ( "+==========================================================================+\n " ) ; printf ( "| Thong tin sinh vien: |\n " ) ; printf ( "| MSSV : %-59s|\n " , sv.
id ) ; printf ( "| Ho ten : %-59s|\n " , sv.
name ) ; printf ( "| Ngay sinh : %-27sTuoi : %-11d |\n " , sv.
ns , sv.
tuoi ) ; printf ( "+==========================================================================+\n " ) ; }
break ;
}
case 5 :
SEARCH_BY_NAME( L) ;
break ;
case 6 :
SORT_BY_NAME( & L) ;
break ;
case 7 :
PRINT_LIST( L) ;
break ;
case 8 : {
char mon[ 50 ] ;
printf ( "Nhap mon hoc can them\n " ) ;
break ;
}
break ;
case 9 :
default :
printf ( "Lua chon khong hop le\n " ) ; }
}
return 0 ;
}
LyoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnwgICBUaMOgbmggVmnDqm4gTmjDs20gIHwgICBNYSBTaW5oIFZpw6puIHwKfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CnwJTmd1eT9uIMOQP2MgUXVhbmcgfAk6MjQxMTA2MTc2NwkgIHwKfAkJCQkJCQkJCSAgfAp8CVRyP24gTWluaCBRdWFuZwkgfAk6MjQxMTA2MjAyOSAgIHwKfAkJCQkJCQkJCSAgfAp8CUx1P25nIFZpP3QgTmg/dAkgfAk6MjQxMTA2MTYxNCAgIHwKfAkJCQkJCQkJCSAgfAp8CUhvw6BuZyBHaWEgVGg/CSB8CToyNDExMDYxOTI3ICAgfAp8CQkJCQkJCQkJICB8CnwJTmd1eT9uIFRpP24gRHVuZyB8CToyNDExMDYxNjQ5ICAgfAp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojZGVmaW5lIE1BWCAxMDAKIAp0eXBlZGVmIGludCBQb3NpdGlvbjsKIAovLyBDYXUgdHJ1YyBzaW5oIHZpZW4KdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciB0ZW5Nb25bNTBdOwogCn0gTW9uSG9jOwogCnN0cnVjdCBTaW5odmllbiB7CiAgICBjaGFyIGlkWzIwXTsKICAgIGNoYXIgbmFtZVs1MF07CiAgICBjaGFyIG5zWzIwXTsKICAgIGludCB0dW9pOwogICAgZmxvYXQgZGllbVtNQVhdOyAKICAgIGludCBzb01vbjsgCn07CiAKLy8gS2lldSBkYW5oIHNhY2ggbWFuZwp0eXBlZGVmIHN0cnVjdCB7CiAgICBzdHJ1Y3QgU2luaHZpZW4gQVtNQVhdOwogICAgaW50IExhc3Q7IAp9IExpc3Q7CiAKIAogCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2FjIHRoYW8gdGFjIGNvIGJhbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKUG9zaXRpb24gRklSU1QoTGlzdCBMKSB7CiAgICByZXR1cm4gMTsKfQogClBvc2l0aW9uIEVORChMaXN0IEwpIHsKICAgIHJldHVybiBMLkxhc3QgKyAxOwp9CiAKUG9zaXRpb24gTkVYVChQb3NpdGlvbiBQLCBMaXN0IEwpIHsKICAgIGlmIChQIDwgRU5EKEwpKSByZXR1cm4gUCArIDE7CiAgICByZXR1cm4gRU5EKEwpOwp9CiAKUG9zaXRpb24gUFJFVklPVVMoUG9zaXRpb24gUCwgTGlzdCBMKSB7CiAgICBpZiAoUCA+IEZJUlNUKEwpKSByZXR1cm4gUCAtIDE7CiAgICByZXR1cm4gRklSU1QoTCk7Cn0KIApzdHJ1Y3QgU2luaHZpZW4gUkVUUklFVkUoUG9zaXRpb24gUCwgTGlzdCBMKSB7CiAgICByZXR1cm4gTC5BW1AtMV07Cn0KIApQb3NpdGlvbiBMT0NBVEUoY2hhciBpZFtdLCBMaXN0IEwpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC5MYXN0OyBpKyspIHsKICAgICAgICBpZiAoc3RyY21wKEwuQVtpXS5pZCwgaWQpID09IDApCiAgICAgICAgICAgIHJldHVybiBpKzE7CiAgICB9CiAgICByZXR1cm4gRU5EKEwpOwp9CiAKdm9pZCBNQUtFTlVMTF9MSVNUKExpc3QgKkwpIHsKICAgIEwtPkxhc3QgPSAwOwp9CiAKaW50IEVNUFRZX0xJU1QoTGlzdCBMKXsKICAgIHJldHVybiBMLkxhc3QgPT0gMDsKfQogCnZvaWQgSU5TRVJUX0xJU1Qoc3RydWN0IFNpbmh2aWVuIHgsIFBvc2l0aW9uIFAsIExpc3QgKkwpIHsKICAgIGlmIChMLT5MYXN0ID49IE1BWCkgewogICAgICAgIHByaW50ZigiRGFuaCBzYWNoIGRheVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFAgPCBGSVJTVCgqTCkgfHwgUCA+IEVORCgqTCkpIHsKICAgICAgICBwcmludGYoIlZpIHRyaSBraG9uZyBob3AgbGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSBMLT5MYXN0OyBpID49IFA7IGktLSkgewogICAgICAgIEwtPkFbaV0gPSBMLT5BW2ktMV07CiAgICB9CiAKICAgIEwtPkFbUC0xXSA9IHg7CiAgICBMLT5MYXN0Kys7Cn0KIAp2b2lkIERFTEVURV9MSVNUKFBvc2l0aW9uIFAsIExpc3QgKkwpIHsKICAgIGlmIChQIDwgRklSU1QoKkwpIHx8IFAgPj0gRU5EKCpMKSkgewogICAgICAgIHByaW50ZigiVmkgdHJpIGtob25nIGhvcCBsZVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChpbnQgaSA9IFAtMTsgaSA8IEwtPkxhc3QtMTsgaSsrKSB7CiAgICAgICAgTC0+QVtpXSA9IEwtPkFbaSsxXTsKICAgIH0KICAgIEwtPkxhc3QtLTsKfQogCiAKIAovLyBYb2Egc2luaCB2aWVuIHRoZW8gTVNWCnZvaWQgREVMRVRFX0JZX0lEKGNoYXIgaWRbXSwgTGlzdCAqTCkgewogICAgcHJpbnRmKCJcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgcHJpbnRmKCJ8ICAgICAgICAgICAgICAgICAgICAgICAgIFhPQSBTSU5IIFZJRU4gVEhFTyBNU1YgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CgogICAgUG9zaXRpb24gcCA9IExPQ0FURShpZCwgKkwpOwoKICAgIGlmIChwID09IEVORCgqTCkpIHsKICAgICAgICBwcmludGYoInwgICBLaG9uZyB0aW0gdGhheSBzaW5oIHZpZW4gY28gTVNWOiAlLTM2c3xcbiIsIGlkKTsKICAgICAgICBwcmludGYoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzdHJ1Y3QgU2luaHZpZW4gc3YgPSBMLT5BW3AgLSAxXTsKCiAgICBjaGFyIGNvbmZpcm07CiAgICBwcmludGYoInwgICBUaW0gdGhheSBzaW5oIHZpZW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgcHJpbnRmKCJ8ICAgTVNTViAgICAgIDogJS01OXN8XG4iLCBzdi5pZCk7CiAgICBwcmludGYoInwgICBIbyB0ZW4gICAgOiAlLTU5c3xcbiIsIHN2Lm5hbWUpOwogICAgcHJpbnRmKCJ8ICAgTmdheSBzaW5oIDogJS0yN3NUdW9pIDogJS0xMWQgICAgICAgICAgICAgIHxcbiIsIHN2Lm5zLCBzdi50dW9pKTsKICAgIHByaW50ZigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgICBwcmludGYoIiAgICBCYW4gY28gY2hhYyBjaGFuIG11b24geG9hIHNpbmggdmllbiBuYXkga2hvbmc/ICh5L24pOiAiKTsKICAgIHNjYW5mKCIgJWMiLCAmY29uZmlybSk7CiAgICBwcmludGYoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwoKICAgIGlmIChjb25maXJtICE9ICd5JyAmJiBjb25maXJtICE9ICdZJykgewogICAgICAgIHByaW50ZigifCAgIERhIGh1eSB0aGFvIHRhYyB4b2Egc2luaCB2aWVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGludCBpID0gcCAtIDE7IGkgPCBMLT5MYXN0IC0gMTsgaSsrKSB7CiAgICAgICAgTC0+QVtpXSA9IEwtPkFbaSArIDFdOwogICAgfQogICAgTC0+TGFzdC0tOwoKICAgIHByaW50ZigifCAgIERhIHhvYSBzaW5oIHZpZW4gdGhhbmggY29uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpOwogICAgcHJpbnRmKCJ8ICAgVGhvbmcgdGluIHNpbmggdmllbiBkYSB4b2E6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgcHJpbnRmKCJ8ICAgTVNTViAgICAgIDogJS01OXN8XG4iLCBzdi5pZCk7CiAgICBwcmludGYoInwgICBIbyB0ZW4gICAgOiAlLTU5c3xcbiIsIHN2Lm5hbWUpOwogICAgcHJpbnRmKCJ8ICAgTmdheSBzaW5oIDogJS0yN3NUdW9pIDogJS0xMWQgICAgICAgICAgICAgIHxcbiIsIHN2Lm5zLCBzdi50dW9pKTsKICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7Cn0KCgoKCiAKLy8gPT09PT09PT09PT09PT09PT09IENhYyBjaHVjIG5hbmcgbW8gcm9uZyA9PT09PT09PT09PT09PT09PT0KIAp2b2lkIENodWFuSG9hbihjaGFyIHNbXSwgaW50IHNpemUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgaWYgKHNbaV0gPT0gJy8nKSB7CiAgICAgICAgICAgIGlmIChpID09IDEpIHsgCiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc2l6ZTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgICAgICAgICAgICBzW2orMV0gPSBzW2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc1swXSA9ICcwJzsKICAgICAgICAgICAgICAgIHNpemUrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc1tpKzJdID09ICcvJyAmJiBpKzIgPCBzaXplKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gc2l6ZTsgayA+PSBpKzE7IGstLSkgewogICAgICAgICAgICAgICAgICAgIHNbaysxXSA9IHNba107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzW2krMV0gPSAnMCc7CiAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KIAppbnQgbGFOYW1OaHVhbihpbnQgeSkgewogICAgcmV0dXJuICggKHkgJSA0MDAgPT0gMCkgfHwgKHkgJSA0ID09IDAgJiYgeSAlIDEwMCAhPSAwKSApOwp9CiAKaW50IHNvTmdheVRyb25nVGhhbmcoaW50IG0sIGludCB5KSB7CiAgICBpZiAobSA9PSAxIHx8IG0gPT0gMyB8fCBtID09IDUgfHwgbSA9PSA3IHx8IG0gPT0gOCB8fCBtID09IDEwIHx8IG0gPT0gMTIpCiAgICAgICAgcmV0dXJuIDMxOwogICAgaWYgKG0gPT0gNCB8fCBtID09IDYgfHwgbSA9PSA5IHx8IG0gPT0gMTEpCiAgICAgICAgcmV0dXJuIDMwOwogICAgaWYgKG0gPT0gMikKICAgICAgICByZXR1cm4gbGFOYW1OaHVhbih5KSA/IDI5IDogMjg7CiAgICByZXR1cm4gMDsgCn0KIAp2b2lkIENodWFuSG9hVGVuKGNoYXIgKm5hbWUpIHsKICAgIGNoYXIgdGVtcFsxMDBdOwogICAgaW50IGkgPSAwLCBqID0gMDsKICAgIGludCBsZW4gPSBzdHJsZW4obmFtZSk7CiAKICAgIHdoaWxlIChpIDwgbGVuICYmIG5hbWVbaV0gPT0gJyAnKSBpKys7CiAgICBpbnQgc3BhY2UgPSAwOyAKICAgIHdoaWxlIChpIDwgbGVuKSB7CiAgICAgICAgaWYgKG5hbWVbaV0gIT0gJyAnKSB7CiAgICAgICAgICAgIGlmIChzcGFjZSAmJiBqID4gMCkgewogICAgICAgICAgICAgICAgdGVtcFtqKytdID0gJyAnOyAKICAgICAgICAgICAgICAgIHNwYWNlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZW1wW2orK10gPSBuYW1lW2ldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNwYWNlID0gMTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQogCiAgICBpZiAoaiA+IDAgJiYgdGVtcFtqLTFdID09ICcgJykgai0tOwogICAgdGVtcFtqXSA9ICdcMCc7CiAKICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKICAgICAgICBpZiAodGVtcFtpXSA+PSAnQScgJiYgdGVtcFtpXSA8PSAnWicpCiAgICAgICAgICAgIHRlbXBbaV0gPSB0ZW1wW2ldIC0gJ0EnICsgJ2EnOwogICAgfQogCiAgICBpbnQgbmV3V29yZCA9IDE7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CiAgICAgICAgaWYgKHRlbXBbaV0gPT0gJyAnKSB7CiAgICAgICAgICAgIG5ld1dvcmQgPSAxOwogICAgICAgIH0gZWxzZSBpZiAobmV3V29yZCAmJiB0ZW1wW2ldID49ICdhJyAmJiB0ZW1wW2ldIDw9ICd6JykgewogICAgICAgICAgICB0ZW1wW2ldID0gdGVtcFtpXSAtICdhJyArICdBJzsKICAgICAgICAgICAgbmV3V29yZCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3V29yZCA9IDA7CiAgICAgICAgfQogICAgfQogCiAgICBzdHJjcHkobmFtZSwgdGVtcCk7Cn0KIApzdHJ1Y3QgU2luaHZpZW4gbmhhcFNpbmhWaWVuKExpc3QgTCkgewogICAgc3RydWN0IFNpbmh2aWVuIHN2OwogICAgcHJpbnRmKCJcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpOwogICAgcHJpbnRmKCJ8ICAgICAgIE5IQVAgVEhPTkcgVElOIFNJTkggVklFTiBNT0kgICAgICB8XG4iKTsKICAgIHByaW50ZigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7Cgl3aGlsZSAoMSkgewogICAgICAgIHByaW50ZigiPj4gTmhhcCBNU1Y6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIHN2LmlkKTsKICAgICAgICBpZiAoTE9DQVRFKHN2LmlkLCBMKSAhPSBFTkQoTCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJNU1NWIGRhIHRvbiB0YWksIG5oYXAgbGFpXG4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAKIAogCWludCBjaGVjazsKIAogICAgZG8gewogICAgICAgIGNoZWNrID0gMTsgCiAgICAgICAgcHJpbnRmKCI+PiBOaGFwIGhvIHRlbjogIik7CiAgICAgICAgc2NhbmYoIiAlMTlbXlxuXSIsIHN2Lm5hbWUpOyAKIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RybGVuKHN2Lm5hbWUpOyBpKyspIHsKICAgICAgICAgICAgaWYgKCEoKHN2Lm5hbWVbaV0gPj0gJ2EnICYmIHN2Lm5hbWVbaV0gPD0gJ3onKSB8fCAoc3YubmFtZVtpXSA+PSAnQScgJiYgc3YubmFtZVtpXSA8PSAnWicpIHx8IHN2Lm5hbWVbaV0gPT0gJyAnKSkgewogICAgICAgICAgICAgICAgY2hlY2sgPSAwOyAKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogCiAgICAgICAgaWYgKGNoZWNrID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJIbyB2YSB0ZW4ga2hvbmcgY2h1YSBzbyBob2FjIGt5IHR1IGRhYyBiaWV0IChOaGFwIGxhaSlcbiIpOwogICAgICAgIH0gZWxzZSB7CiAKICAgICAgICAgICAgIENodWFuSG9hVGVuKHN2Lm5hbWUpOwogCiAgICAgICAgfQogICAgfSB3aGlsZSAoY2hlY2sgPT0gMCk7IAogCiAgZG8gewogICAgcHJpbnRmKCI+PiBOaGFwIG5nYXkgc2luaCAoZGQvbW0veXl5eSk6ICIpOwogICAgc2NhbmYoIiVzIiwgc3YubnMpOwogCiAgICBpbnQgc2l6ZSA9IHN0cmxlbihzdi5ucyk7CiAgICBDaHVhbkhvYW4oc3YubnMsIHNpemUpOwogCiAgICBjaGFyIGRheVszXSwgbW9udGhbM10sIHllYXJbNV07CiAgICBkYXlbMF0gPSBzdi5uc1swXTsKICAgIGRheVsxXSA9IHN2Lm5zWzFdOwogICAgZGF5WzJdID0gJ1wwJzsKICAgIG1vbnRoWzBdID0gc3YubnNbM107CiAgICBtb250aFsxXSA9IHN2Lm5zWzRdOwogICAgbW9udGhbMl0gPSAnXDAnOwogICAgZm9yIChpbnQgaSA9IDYsIGogPSAwOyBpIDw9IHNpemU7IGkrKywgaisrKSB7CiAgICAgICAgeWVhcltqXSA9IHN2Lm5zW2ldOwogICAgICAgIHllYXJbaisxXSA9ICdcMCc7CiAgICB9CiAKICAgIGludCBkID0gYXRvaShkYXkpOwogICAgaW50IG0gPSBhdG9pKG1vbnRoKTsKICAgIGludCB5ID0gYXRvaSh5ZWFyKTsKICAgIGludCBtYXhkYXkgPSBzb05nYXlUcm9uZ1RoYW5nKG0seSk7CiAgICBpZiAoZCA8PSAwIHx8IGQgPiBtYXhkYXkgfHwgbSA8PSAwIHx8IG0gPiAxMiB8fCB5IDw9IDEwMCkgewogICAgICAgIHByaW50ZigiTmdheSBzaW5oIGtob25nIGhvcCBsZSB2dWkgbG9uZyBuaGFwIGxhaSFcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgbmFtTm93ID0gMjAyNTsKCSAgICBkbyB7CgkgICAgICAgIHByaW50ZigiPj4gTmhhcCB0dW9pOiAiKTsKCSAgICAgICAgc2NhbmYoIiVkIiwgJnN2LnR1b2kpOwoJICAgICAgICBpZiAoc3YudHVvaSA8IG5hbU5vdyAtIHkgLSAyIHx8IHN2LnR1b2kgPiBuYW1Ob3cgLSB5ICsgMikgewoJICAgICAgICAgICAgcHJpbnRmKCJWdWkgbG9uZyBuaGFwIGxhaSB0dW9pIGR1bmcgdm9pIHR1b2kgdGhhdCBjdWEgYmFuXG4iKTsKCSAgICAgICAgfQoJICAgIH0gd2hpbGUgKHN2LnR1b2kgPCBuYW1Ob3cgLSB5IC0gMiB8fCBzdi50dW9pID4gbmFtTm93IC0geSArIDIpOwogICAgICAgIGJyZWFrOyAKICAgIH0KfSB3aGlsZSAoMSk7CiAKIAoJcmV0dXJuIHN2Owp9CiAKdm9pZCBQUklOVF9MSVNUKExpc3QgTCkgewogICAgaWYgKEwuTGFzdCA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCJEYW5oIHNhY2ggcm9uZyFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KIAogICAgcHJpbnRmKCJcbistLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLStcbiIpOwogICAgcHJpbnRmKCJ8IFNUVCB8IE1TU1YgICAgICAgICB8IEhvIFRlbiAgICAgICAgICAgICAgICAgICAgfCBOZ2F5IFNpbmggICAgfCBUdW9pICB8XG4iKTsKICAgIHByaW50ZigiKy0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tK1xuIik7CiAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC5MYXN0OyBpKyspIHsKICAgICAgICBwcmludGYoInwgJS0zZCB8ICUtMTJzIHwgJS0yNXMgfCAlLTEycyB8ICUtNWQgfFxuIiwKICAgICAgICAgICAgICAgaSsxLCBMLkFbaV0uaWQsIEwuQVtpXS5uYW1lLCBMLkFbaV0ubnMsIEwuQVtpXS50dW9pKTsKICAgIH0KIAogICAgcHJpbnRmKCIrLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rXG4iKTsKfQogCnZvaWQgU09SVF9CWV9OQU1FKExpc3QgKkwpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC0+TGFzdCAtIDE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IEwtPkxhc3Q7IGorKykgewogICAgICAgICAgICBpZiAoc3RyY21wKEwtPkFbaV0ubmFtZSwgTC0+QVtqXS5uYW1lKSA+IDApIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiB0bXAgPSBMLT5BW2ldOwogICAgICAgICAgICAgICAgTC0+QVtpXSA9IEwtPkFbal07CiAgICAgICAgICAgICAgICBMLT5BW2pdID0gdG1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcHJpbnRmKCJEYSBzYXAgeGVwIHRoZW8gdGVuXG4iKTsKfQogCnZvaWQgU09SVF9CWV9UVU9JKExpc3QgKkwpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC0+TGFzdCAtIDE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IEwtPkxhc3Q7IGorKykgewogICAgICAgICAgICBpZiAoTC0+QVtpXS50dW9pID4gTC0+QVtqXS50dW9pKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU2luaHZpZW4gdG1wID0gTC0+QVtpXTsKICAgICAgICAgICAgICAgIEwtPkFbaV0gPSBMLT5BW2pdOwogICAgICAgICAgICAgICAgTC0+QVtqXSA9IHRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHByaW50ZigiRGEgc2FwIHhlcCB0aGVvIHR1b2lcbiIpOwp9CiAKdm9pZCBTRUFSQ0hfQllfTkFNRShMaXN0IEwpIHsKICAgIGNoYXIgbmFtZVsyMF07CiAgICBwcmludGYoIlxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CiAgICBwcmludGYoInwgICAgICAgICAgICAgICAgICAgICAgVElNIEtJRU0gU0lOSCBWSUVOIFRIRU8gSE8gVEVOICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKCXByaW50ZigiPj4gTmhhcCB0ZW4gY2FuIHRpbTogXG4iKTsKICAgIHNjYW5mKCIgJVteXG5dIiwgbmFtZSk7CiAgICBpbnQgZm91bmQgPSAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC5MYXN0OyBpKyspIHsKICAgICAgICBpZiAoc3Ryc3RyKEwuQVtpXS5uYW1lLCBuYW1lKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgc3RydWN0IFNpbmh2aWVuIHN2ID0gTC5BW2ldOwoKICAgICAgICAgICAgcHJpbnRmKCIgICBEYSB0aW0gdGhheSBzaW5oIHZpZW4gdHJvbmcgZGFuaCBzYWNoICAgICAgXG4iKTsKICAgICAgICAgICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgICAgICAgICAgcHJpbnRmKCJ8ICAgVGhvbmcgdGluIHNpbmggdmllbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICAgICAgcHJpbnRmKCJ8ICAgTVNTViAgICAgIDogJS01OXN8XG4iLCBzdi5pZCk7CiAgICAgICAgICAgIHByaW50ZigifCAgIEhvIHRlbiAgICA6ICUtNTlzfFxuIiwgc3YubmFtZSk7CiAgICAgICAgICAgIHByaW50ZigifCAgIE5nYXkgc2luaCA6ICUtMjdzVHVvaSA6ICUtMTFkICAgICAgICAgICAgICB8XG4iLCBzdi5ucywgc3YudHVvaSk7CiAgICAgICAgICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghZm91bmQpIHsKICAgICAgICBwcmludGYoIiAgIEtob25nIHRpbSB0aGF5IHNpbmggdmllbiBuYW8gY28gdGVuIGNodWEgdHUga2hvYSB0cmVuICAgICAgXG4iKTsKICAgIH0KfQoKIAovLyA9PT09PT09PT09PT09PT09PT0gTUFJTiA9PT09PT09PT09PT09PT09PT0KaW50IG1haW4oKSB7CgljaGFyICpuYW1lc1tdID0gewogICAgICAgICJOR1VZRU4gRFVDIFFVQU5HIiwKICAgICAgICAiVFJBTiBNSU5IIFFVQU5HIiwKICAgICAgICAiTFVPTkcgVklFVCBOSEFUIiwKICAgICAgICAiSE9BTkcgR0lBIFRIRSIsCiAgICAgICAgIk5HVVlFTiBUSUVOIERVTkciCiAgICB9OwogCiAgICBjaGFyICppZHNbXSA9IHsKICAgICAgICAiMjQxMTA2MTc2NyIsCiAgICAgICAgIjI0MTEwNjIwMjkiLAogICAgICAgICIyNDExMDYxNjE0IiwKICAgICAgICAiMjQxMTA2MTkyNyIsCiAgICAgICAgIjI0MTEwNjE2NDkiCiAgICB9OwogCiAgICBpbnQgbiA9IDU7IC8vIHNvIHRoYW5oIHZpZW4KIAogICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgcHJpbnRmKCJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFJIFRBUCBMT04gQkFJIDcgLSBRVUFOIExJIFNJTkggVklFTiAgICAgICAgICAgICAgIHwgICAgXG4iKTsKICAgIHByaW50ZigifCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFxuIik7CiAgICBwcmludGYoInwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9QOiBESDE0QzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBcbiIpOwogICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgcHJpbnRmKCJ8ICAgICAgICAgICAgICAgJS0zMHMgfCAlLTIwcyB8ICAgICAgICAgICAgfFxuIiwgIlRIQU5IIFZJRU4gTkhPTSIsICJNQSBTSU5IIFZJRU4iKTsKICAgIHByaW50ZigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgIHByaW50ZigifCAgICAgICAgICAgICAgICUtMzBzIHwgOiUtMTlzIHwgICAgICAgICAgICB8IFxuIiwgbmFtZXNbaV0sIGlkc1tpXSk7CiAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgICB9CiAKICAgIExpc3QgTDsKICAgIE1BS0VOVUxMX0xJU1QoJkwpOwogCiAKIAogICAgaW50IGNob2ljZTsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgcHJpbnRmKCJcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgICAgIHByaW50ZigifCAgICAgICAgICAgICAgICAgICAgIEhFIFRIT05HIFFVQU4gTFkgU0lOSCBWSUVOICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgICAgICBwcmludGYoInwgWzFdIFRoZW0gc2luaCB2aWVuIHZhbyBkYW5oIHNhY2ggKElOU0VSVF9MSVNUKSAgICAgICAgICAgICAgCSAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFsyXSBYb2Egc2luaCB2aWVuIHRoZW8gTVNWIChERUxFVEVfQllfSUQpICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoInwgWzNdIE5oYXAgZGllbSBjaG8gY2FjIHNpbmggdmllbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgICAgIHByaW50ZigifCBbNF0gVGltIGtpZW0gc2luaCB2aWVuIHRoZW8gTVNWIChMT0NBVEUpICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFs1XSBUaW0ga2llbSBzaW5oIHZpZW4gdGhlbyB0ZW4gKFNFQVJDSF9CWV9OQU1FKSAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoInwgWzZdIFNhcCB4ZXAgZGFuaCBzYWNoIHRoZW8gdGVuIChhYmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgICAgIHByaW50ZigifCBbN10gSW4gZGFuaCBzYWNoIHNpbmggdmllbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFs4XSBUaGVtIG1vbiBob2MgbW9pIHZhbyBkYW5oIHNhY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKIAogICAgICAgIHByaW50ZigifCBbMF0gVGhvYXQgY2h1b25nIHRyaW5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgICAgICBwcmludGYoIj4+IE5oYXAgbHVhIGNob24gY3VhIGJhbjogIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmNob2ljZSk7CiAKICAgICAgICBpZiAoY2hvaWNlID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJEYSB0aG9hdFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNob2ljZSkgewogICAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiBzdiA9IG5oYXBTaW5oVmllbihMKTsKICAgICAgICAgICAgICAgIFBvc2l0aW9uIHA7CiAgICAgICAgICAgICAgICBwcmludGYoIk5oYXAgVmkgVHJpIFNpbmggVmllbiBNdW9uIFRoZW0gQ2hlbiBWYW8gRGF1IDEgQ3VvaSAyOiAiKTsKICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZwKTsKICAgICAgICAgICAgICAgIGlmKHAgPT0gMSApewogICAgICAgICAgICAgICAgICAgIElOU0VSVF9MSVNUKHN2LCAxLCAmTCk7CQogICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlbSBzaW5oIHZpZW4gdmFvIHRoYW5oIGNvbmcuIFxuIik7CgkJCQl9CgkJCQllbHNlIGlmKHAgPT0gMil7CgkJCQkgICAgSU5TRVJUX0xJU1Qoc3YsIEVORChMKSwgJkwpOwoJCQkJICAgIHByaW50ZigiVGhlbSBzaW5oIHZpZW4gdmFvIHRoYW5oIGNvbmcuIFxuIik7CQoJCQkJfQoJCQkJZWxzZXsKCQkJCSAgICBwcmludGYoIkx1YSBjaG9uIGtob25nIGhvcCBsZSBcbiIpOwoJCQkJfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgICAgICBjaGFyIGlkWzIwXTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigifCAgICAgWE9BIFNJTkggVklFTiBUSEVPIE1BIFNJTkggVklFTiAgICAgfFxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCI+PiBOaGFwIE1TViBjYW4geG9hOiAiKTsKICAgICAgICAgICAgICAgIHNjYW5mKCIlcyIsIGlkKTsKICAgICAgICAgICAgICAgIERFTEVURV9CWV9JRChpZCwgJkwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgICAgICBjaGFyIGlkWzIwXTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgIAkJCSAJcHJpbnRmKCJ8ICAgICAgICAgTkhBUCBESUVNIENITyBDQUMgU0lOSCBWSUVOICAgICAgICAgfFxuIik7CiAgIAkJCQlwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgCQkJLy8gQ0jDmiDDnSBEVU5HIEZPUiBMT05HIFFVQSBDQUMgU0lOSCBWSUVOIFZBIERJRU0gTkhBIENBQyBCUk8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgNDogewogCiAgICAgICAgICAgICAgICBjaGFyIGlkWzIwXTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigifCAgICAgICBUSU0gS0lFTSBTSU5IIFZJRU4gVEhFTyBNU1YgICAgICAgfFxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCI+PiBOaGFwIE1TVjogIik7CiAgICAgICAgICAgICAgICBzY2FuZigiJXMiLCBpZCk7CiAgICAgICAgICAgICAgICBQb3NpdGlvbiBwID0gTE9DQVRFKGlkLCBMKTsKICAgICAgICAgICAgICAgIGlmIChwID09IDAgfHwgcCA9PSBFTkQoTCkpIHsKICAgICAgIAkJIHByaW50ZigiICAgS2hvbmcgdGltIHRoYXkgc2luaCB2aWVuIGNvIE1TVjogXG4iLCBpZCk7CiAgICAgIAkJIAogICAJCSB9IGVsc2UgewogICAgIAkJICAgc3RydWN0IFNpbmh2aWVuIHN2ID0gUkVUUklFVkUocCwgTCk7CiAgICAgIAkJCQkgcHJpbnRmKCIgICBEYSB0aW0gdGhheSBzaW5oIHZpZW4gdHJvbmcgZGFuaCBzYWNoICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKICAgICAgIAkJCQkgcHJpbnRmKCIrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgICAgIAkJCQkgcHJpbnRmKCJ8ICAgVGhvbmcgdGluIHNpbmggdmllbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgIAkJCQkgcHJpbnRmKCJ8ICAgTVNTViAgICAgIDogJS01OXN8XG4iLCBzdi5pZCk7CiAgICAgICAJCQkJIHByaW50ZigifCAgIEhvIHRlbiAgICA6ICUtNTlzfFxuIiwgc3YubmFtZSk7CiAgICAgICAJCQkJIHByaW50ZigifCAgIE5nYXkgc2luaCA6ICUtMjdzVHVvaSA6ICUtMTFkICAgICAgICAgICAgICB8XG4iLCBzdi5ucywgc3YudHVvaSk7CiAgICAgICAJCQkJIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CiAgICB9CiAgICBicmVhazsKfQogICAgICAgICAgICBjYXNlIDU6IAogICAgICAgICAgICAgICAgU0VBUkNIX0JZX05BTUUoTCk7CiAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBTT1JUX0JZX05BTUUoJkwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgIFBSSU5UX0xJU1QoTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA4OnsKICAgICAgICAgICAgCWNoYXIgbW9uWzUwXTsKICAgICAgICAgICAgCXByaW50ZigiTmhhcCBtb24gaG9jIGNhbiB0aGVtXG4iKTsKICAgICAgICAgICAgCXNjYW5mKCIlcyIsbW9uKTsKIAoJCQkJYnJlYWs7CgkJCX0KIAogICAgCQkJYnJlYWs7CiAgICAgICAgICAgIGNhc2UgOToKIAogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJpbnRmKCJMdWEgY2hvbiBraG9uZyBob3AgbGVcbiIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9