#include <stdio.h> 
#include <stdlib.h> 
 
#define MS 5 
#define may x 
#define nguoi o 
 
typedef  enum  { e,  x,  o}  xo; 
 
void  inBanCo( xo ( * bc) [ MS] ) ; 
void  tinhDiem( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] ) ; 
void  mayDi( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] ) ; 
int  win( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] ) ; 
int  hetO( xo ( * bc) [ MS] ) ; 
int  checkHang( xo ( * bc) [ MS] ,  int  hang,  xo ben) ; 
int  checkCot( xo ( * bc) [ MS] ,  int  cot,  xo ben) ; 
int  checkDuongCheo1( xo ( * bc) [ MS] ,  xo ben) ; 
int  checkDuongCheo2( xo ( * bc) [ MS] ,  xo ben) ; 
int  full0( int  ( * diem) [ MS] ) ; 
int  checkWin( xo ( * bc) [ MS] ,  xo ben) ; 
int  checkWinHang( xo ( * bc) [ MS] ,  int  h,  xo ben) ; 
int  checkWinCot( xo ( * bc) [ MS] ,  int  c,  xo ben) ; 
int  checkWinDuongCheo1( xo ( * bc) [ MS] ,  xo ben) ; 
int  checkWinDuongCheo2( xo ( * bc) [ MS] ,  xo ben) ; 
void  cls( ) ; 
 
int  main( )  { 
	int  n,  m; 
	int  diem[ MS] [ MS] ; 
	xo banCo[ MS] [ MS]  =  { { e} } ; 
 
	while  ( ! win( banCo,  diem) )  { 
		cls( ) ; 
		inBanCo( banCo) ; 
		do  { 
			do  { 
				printf ( "\n Ban danh o (hang - cot): " ) ;  				if  ( m <  0  ||  n <  0  ||  m >  MS ||  n >  MS) 
					printf ( "\n Khong co o do\n \n " ) ;  			}  while  ( m <  0  ||  n <  0  ||  m >  MS ||  n >  MS) ; 
			if  ( banCo[ m -  1 ] [ n -  1 ]  !=  e) 
				printf ( "\n Khong the danh o nay\n " ) ;  		}  while  ( banCo[ m -  1 ] [ n -  1 ]  !=  e) ; 
		banCo[ m -  1 ] [ n -  1 ]  =  nguoi; 
		tinhDiem( banCo,  diem) ; 
		mayDi( banCo,  diem) ; 
	} 
 
	return  0 ; 
} 
 
int  checkDuongCheo2( xo ( * bc) [ MS] ,  xo ben)  { 
	int  count =  0 ; 
	for  ( int  k =  0 ;  k <  MS;  k++ ) 
		if  ( bc[ k] [ MS -  k -  1 ]  ==  ben) 
			count++; 
	return  count; 
} 
 
int  checkDuongCheo1( xo ( * bc) [ MS] ,  xo ben)  { 
	int  count =  0 ; 
	for  ( int  k =  0 ;  k <  MS;  k++ ) 
		if  ( bc[ k] [ k]  ==  ben) 
			count++; 
	return  count; 
} 
 
int  checkCot( xo ( * bc) [ MS] ,  int  cot,  xo ben)  { 
	int  count =  0 ; 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		if  ( bc[ i] [ cot]  ==  ben) 
			count++; 
	return  count; 
} 
 
int  checkHang( xo ( * bc) [ MS] ,  int  hang,  xo ben)  { 
	int  count =  0 ; 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		if  ( bc[ hang] [ i]  ==  ben) 
			count++; 
	return  count; 
} 
 
void  cls( )  { 
} 
 
int  hetO( xo ( * bc) [ MS] )  { 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
			if  ( bc[ i] [ j]  ==  e) 
				return  0 ; 
	return  1 ; 
} 
 
int  full0( int  ( * diem) [ MS] )  { 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
			if  ( diem[ i] [ j]  !=  0 ) 
				return  0 ; 
	return  1 ; 
} 
 
int  checkWinHang( xo ( * bc) [ MS] ,  int  h,  xo ben)  { 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		if  ( bc[ h] [ i]  !=  ben) 
			return  0 ; 
	return  1 ; 
} 
 
int  checkWinCot( xo ( * bc) [ MS] ,  int  c,  xo ben)  { 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		if  ( bc[ i] [ c]  !=  ben) 
			return  0 ; 
	return  1 ; 
} 
 
int  checkWinDuongCheo1( xo ( * bc) [ MS] ,  xo ben)  { 
	for  ( int  k =  0 ;  k <  MS;  k++ ) 
		if  ( bc[ k] [ k]  !=  ben) 
			return  0 ; 
	return  1 ; 
} 
 
int  checkWinDuongCheo2( xo ( * bc) [ MS] ,  xo ben)  { 
	for  ( int  k =  0 ;  k <  MS;  k++ ) 
		if  ( bc[ k] [ MS -  k -  1 ]  !=  ben) 
			return  0 ; 
	return  1 ; 
} 
 
int  checkWin( xo ( * bc) [ MS] ,  xo ben)  { 
	for  ( int  k =  0 ;  k <  MS;  k++ )  { 
		if  ( checkWinHang( bc,  k,  ben) ) 
			return  1 ; 
		else  if  ( checkWinCot( bc,  k,  ben) ) 
			return  1 ; 
	} 
	if  ( checkWinDuongCheo1( bc,  ben)  ||  checkWinDuongCheo2( bc,  ben) ) 
		return  1 ; 
	return  0 ; 
} 
 
int  win( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] )  { 
	if  ( checkWin( bc,  nguoi) )  { 
		cls( ) ; 
		inBanCo( bc) ; 
		return  1 ; 
	} 
	if  ( checkWin( bc,  may) )  { 
		cls( ) ; 
		inBanCo( bc) ; 
		return  1 ; 
	} 
	if  ( full0( diem) )  { 
		cls( ) ; 
		inBanCo( bc) ; 
		return  1 ; 
	} 
	if  ( hetO( bc) )  { 
		cls( ) ; 
		inBanCo( bc) ; 
		return  1 ; 
	} 
	return  0 ; 
} 
 
void  mayDi( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] )  { 
	int  k =  0 ,  l =  0 ; 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
			if  ( diem[ k] [ l]  <=  diem[ i] [ j]  &&  bc[ i] [ j]  ==  e)  { 
				k =  i; 
				l =  j; 
			} 
	bc[ k] [ l]  =  may; 
} 
 
void  inDiem( int  ( * diem) [ MS] )  { 
	for  ( int  i =  0 ;  i <  MS;  i++ )  { 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
	} 
} 
 
void  tinhDiem( xo ( * bc) [ MS] ,  int  ( * diem) [ MS] )  { 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		for  ( int  j =  0 ;  j <  MS;  j++ )  { 
			diem[ i] [ j]  =  0 ; 
			if  ( j ==  i ||  i ==  MS -  j -  1 ) 
				diem[ i] [ j] ++; 
		} 
	int  n =  0 ,  m =  0 ; 
	for  ( int  i =  0 ;  i <  MS;  i++ )  { 
		if  ( checkCot( bc,  i,  nguoi)  &&  checkCot( bc,  i,  may) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ k] [ i]  =  0 ; 
		if  ( checkHang( bc,  i,  nguoi)  &&  checkHang( bc,  i,  may) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ i] [ k]  =  0 ; 
	} 
	n =  0 ,  m =  0 ; 
	if  ( ( n =  checkDuongCheo1( bc,  nguoi) )  &&  ( m =  checkDuongCheo1( bc,  may) ) ) 
		for  ( int  k =  0 ;  k <  MS;  k++ ) 
			diem[ k] [ k]  =  0 ; 
	else 
		for  ( int  k =  0 ;  k <  MS;  k++ ) 
			diem[ k] [ k]  +=  ( m >  n ?  m :  n) ; 
	n =  0 ,  m =  0 ; 
	if  ( ( n =  checkDuongCheo2( bc,  nguoi) )  &&  ( m =  checkDuongCheo2( bc,  may) ) ) 
		for  ( int  k =  0 ;  k <  MS;  k++ ) 
			diem[ k] [ MS -  k -  1 ]  =  0 ; 
	else 
		for  ( int  k =  0 ;  k <  MS;  k++ ) 
			diem[ k] [ MS -  k -  1 ]  +=  ( m >  n ?  m :  n) ; 
	for  ( int  i =  0 ;  i <  MS;  i++ )  { 
		n =  0 ,  m =  0 ; 
		if  ( ( ( n =  checkCot( bc,  i,  nguoi) )  &&  ! checkCot( bc,  i,  may) )  ||  ( m =  checkCot( bc,  i,  may)  &&  ! checkCot( bc,  i,  nguoi) ) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ k] [ i]  +=  ( m >  n ?  m :  n) ; 
		n =  0 ,  m =  0 ; 
		if  ( ( ( n =  checkHang( bc,  i,  nguoi) )  &&  ! checkHang( bc,  i,  may) )  ||  ( m =  checkHang( bc,  i,  may)  &&  ! checkHang( bc,  i,  nguoi) ) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ i] [ k]  +=  ( m >  n ?  m :  n) ; 
		int  emt =  0 ; 
		if  ( ( emt =  checkCot( bc,  i,  e)  &&  ! checkCot( bc,  i,  may)  &&  ! checkCot( bc,  i,  nguoi) ) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ k] [ i]  +=  emt; 
		emt =  0 ; 
		if  ( ( emt =  checkHang( bc,  i,  e)  &&  ! checkHang( bc,  i,  may)  &&  ! checkHang( bc,  i,  nguoi) ) ) 
			for  ( int  k =  0 ;  k <  MS;  k++ ) 
				diem[ i] [ k]  +=  emt; 
	} 
	for  ( int  i =  0 ;  i <  MS;  i++ ) 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
			if  ( bc[ i] [ j]  ==  nguoi ||  bc[ i] [ j]  ==  may) 
				diem[ i] [ j]  =  0 ; 
} 
 
void  inBanCo( xo ( * bc) [ MS] )  { 
	for  ( int  i =  0 ;  i <  MS;  i++ )  { 
		for  ( int  j =  0 ;  j <  MS;  j++ ) 
			if  ( bc[ i] [ j]  ==  e) 
			else  if  ( bc[ i] [ j]  ==  x) 
			else 
	} 
} 
 
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTVMgNQojZGVmaW5lIG1heSB4CiNkZWZpbmUgbmd1b2kgbwoKdHlwZWRlZiBlbnVtIHtlLCB4LCBvfSB4bzsKCnZvaWQgaW5CYW5Dbyh4byAoKmJjKVtNU10pOwp2b2lkIHRpbmhEaWVtKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKTsKdm9pZCBtYXlEaSh4byAoKmJjKVtNU10sIGludCAoKmRpZW0pW01TXSk7CmludCB3aW4oeG8gKCpiYylbTVNdLCBpbnQgKCpkaWVtKVtNU10pOwppbnQgaGV0Tyh4byAoKmJjKVtNU10pOwppbnQgY2hlY2tIYW5nKHhvICgqYmMpW01TXSwgaW50IGhhbmcsIHhvIGJlbik7CmludCBjaGVja0NvdCh4byAoKmJjKVtNU10sIGludCBjb3QsIHhvIGJlbik7CmludCBjaGVja0R1b25nQ2hlbzEoeG8gKCpiYylbTVNdLCB4byBiZW4pOwppbnQgY2hlY2tEdW9uZ0NoZW8yKHhvICgqYmMpW01TXSwgeG8gYmVuKTsKaW50IGZ1bGwwKGludCAoKmRpZW0pW01TXSk7CmludCBjaGVja1dpbih4byAoKmJjKVtNU10sIHhvIGJlbik7CmludCBjaGVja1dpbkhhbmcoeG8gKCpiYylbTVNdLCBpbnQgaCwgeG8gYmVuKTsKaW50IGNoZWNrV2luQ290KHhvICgqYmMpW01TXSwgaW50IGMsIHhvIGJlbik7CmludCBjaGVja1dpbkR1b25nQ2hlbzEoeG8gKCpiYylbTVNdLCB4byBiZW4pOwppbnQgY2hlY2tXaW5EdW9uZ0NoZW8yKHhvICgqYmMpW01TXSwgeG8gYmVuKTsKdm9pZCBjbHMoKTsKCmludCBtYWluKCkgewoJaW50IG4sIG07CglpbnQgZGllbVtNU11bTVNdOwoJeG8gYmFuQ29bTVNdW01TXSA9IHt7ZX19OwoKCXdoaWxlICghd2luKGJhbkNvLCBkaWVtKSkgewoJCWNscygpOwoJCWluQmFuQ28oYmFuQ28pOwoJCWRvIHsKCQkJZG8gewoJCQkJcHJpbnRmKCJcbkJhbiBkYW5oIG8gKGhhbmcgLSBjb3QpOiAiKTsKCQkJCXNjYW5mKCIlZCAlZCIsICZtLCAmbik7CgkJCQlpZiAobSA8IDAgfHwgbiA8IDAgfHwgbSA+IE1TIHx8IG4gPiBNUykKCQkJCQlwcmludGYoIlxuS2hvbmcgY28gbyBkb1xuXG4iKTsKCQkJfSB3aGlsZSAobSA8IDAgfHwgbiA8IDAgfHwgbSA+IE1TIHx8IG4gPiBNUyk7CgkJCWlmIChiYW5Db1ttIC0gMV1bbiAtIDFdICE9IGUpCgkJCQlwcmludGYoIlxuS2hvbmcgdGhlIGRhbmggbyBuYXlcbiIpOwoJCX0gd2hpbGUgKGJhbkNvW20gLSAxXVtuIC0gMV0gIT0gZSk7CgkJYmFuQ29bbSAtIDFdW24gLSAxXSA9IG5ndW9pOwoJCXRpbmhEaWVtKGJhbkNvLCBkaWVtKTsKCQltYXlEaShiYW5DbywgZGllbSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCmludCBjaGVja0R1b25nQ2hlbzIoeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWludCBjb3VudCA9IDA7Cglmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJaWYgKGJjW2tdW01TIC0gayAtIDFdID09IGJlbikKCQkJY291bnQrKzsKCXJldHVybiBjb3VudDsKfQoKaW50IGNoZWNrRHVvbmdDaGVvMSh4byAoKmJjKVtNU10sIHhvIGJlbikgewoJaW50IGNvdW50ID0gMDsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQlpZiAoYmNba11ba10gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9CgppbnQgY2hlY2tDb3QoeG8gKCpiYylbTVNdLCBpbnQgY290LCB4byBiZW4pIHsKCWludCBjb3VudCA9IDA7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJaWYgKGJjW2ldW2NvdF0gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9CgppbnQgY2hlY2tIYW5nKHhvICgqYmMpW01TXSwgaW50IGhhbmcsIHhvIGJlbikgewoJaW50IGNvdW50ID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlpZiAoYmNbaGFuZ11baV0gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9Cgp2b2lkIGNscygpIHsKCXN5c3RlbSgiY2xzIik7Cn0KCmludCBoZXRPKHhvICgqYmMpW01TXSkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKQoJCWZvciAoaW50IGogPSAwOyBqIDwgTVM7IGorKykKCQkJaWYgKGJjW2ldW2pdID09IGUpCgkJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgZnVsbDAoaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKQoJCQlpZiAoZGllbVtpXVtqXSAhPSAwKQoJCQkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKaW50IGNoZWNrV2luSGFuZyh4byAoKmJjKVtNU10sIGludCBoLCB4byBiZW4pIHsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlpZiAoYmNbaF1baV0gIT0gYmVuKQoJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgY2hlY2tXaW5Db3QoeG8gKCpiYylbTVNdLCBpbnQgYywgeG8gYmVuKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJaWYgKGJjW2ldW2NdICE9IGJlbikKCQkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKaW50IGNoZWNrV2luRHVvbmdDaGVvMSh4byAoKmJjKVtNU10sIHhvIGJlbikgewoJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCWlmIChiY1trXVtrXSAhPSBiZW4pCgkJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCmludCBjaGVja1dpbkR1b25nQ2hlbzIoeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQlpZiAoYmNba11bTVMgLSBrIC0gMV0gIT0gYmVuKQoJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgY2hlY2tXaW4oeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykgewoJCWlmIChjaGVja1dpbkhhbmcoYmMsIGssIGJlbikpCgkJCXJldHVybiAxOwoJCWVsc2UgaWYgKGNoZWNrV2luQ290KGJjLCBrLCBiZW4pKQoJCQlyZXR1cm4gMTsKCX0KCWlmIChjaGVja1dpbkR1b25nQ2hlbzEoYmMsIGJlbikgfHwgY2hlY2tXaW5EdW9uZ0NoZW8yKGJjLCBiZW4pKQoJCXJldHVybiAxOwoJcmV0dXJuIDA7Cn0KCmludCB3aW4oeG8gKCpiYylbTVNdLCBpbnQgKCpkaWVtKVtNU10pIHsKCWlmIChjaGVja1dpbihiYywgbmd1b2kpKSB7CgkJY2xzKCk7CgkJaW5CYW5DbyhiYyk7CgkJcHJpbnRmKCJcbk5ndW9pIHRoYW5nXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWlmIChjaGVja1dpbihiYywgbWF5KSkgewoJCWNscygpOwoJCWluQmFuQ28oYmMpOwoJCXByaW50ZigiXG5NYXkgdGhhbmdcbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKGZ1bGwwKGRpZW0pKSB7CgkJY2xzKCk7CgkJaW5CYW5DbyhiYyk7CgkJcHJpbnRmKCJcbkhvYSBjb1xuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoaGV0TyhiYykpIHsKCQljbHMoKTsKCQlpbkJhbkNvKGJjKTsKCQlwcmludGYoIlxuSG9hIGNvXG4iKTsKCQlyZXR1cm4gMTsKCX0KCXJldHVybiAwOwp9Cgp2b2lkIG1heURpKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKSB7CglpbnQgayA9IDAsIGwgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKQoJCWZvciAoaW50IGogPSAwOyBqIDwgTVM7IGorKykKCQkJaWYgKGRpZW1ba11bbF0gPD0gZGllbVtpXVtqXSAmJiBiY1tpXVtqXSA9PSBlKSB7CgkJCQlrID0gaTsKCQkJCWwgPSBqOwoJCQl9CgliY1trXVtsXSA9IG1heTsKfQoKdm9pZCBpbkRpZW0oaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IE1TOyBqKyspCgkJCXByaW50ZigiJWQgIiwgZGllbVtpXVtqXSk7CgkJcHJpbnRmKCJcbiIpOwoJfQp9Cgp2b2lkIHRpbmhEaWVtKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKSB7CgkJCWRpZW1baV1bal0gPSAwOwoJCQlpZiAoaiA9PSBpIHx8IGkgPT0gTVMgLSBqIC0gMSkKCQkJCWRpZW1baV1bal0rKzsKCQl9CglpbnQgbiA9IDAsIG0gPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKSB7CgkJaWYgKGNoZWNrQ290KGJjLCBpLCBuZ3VvaSkgJiYgY2hlY2tDb3QoYmMsIGksIG1heSkpCgkJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJCWRpZW1ba11baV0gPSAwOwoJCWlmIChjaGVja0hhbmcoYmMsIGksIG5ndW9pKSAmJiBjaGVja0hhbmcoYmMsIGksIG1heSkpCgkJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJCWRpZW1baV1ba10gPSAwOwoJfQoJbiA9IDAsIG0gPSAwOwoJaWYgKChuID0gY2hlY2tEdW9uZ0NoZW8xKGJjLCBuZ3VvaSkpICYmIChtID0gY2hlY2tEdW9uZ0NoZW8xKGJjLCBtYXkpKSkKCQlmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJCWRpZW1ba11ba10gPSAwOwoJZWxzZQoJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJZGllbVtrXVtrXSArPSAobSA+IG4gPyBtIDogbik7CgluID0gMCwgbSA9IDA7CglpZiAoKG4gPSBjaGVja0R1b25nQ2hlbzIoYmMsIG5ndW9pKSkgJiYgKG0gPSBjaGVja0R1b25nQ2hlbzIoYmMsIG1heSkpKQoJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJZGllbVtrXVtNUyAtIGsgLSAxXSA9IDA7CgllbHNlCgkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQlkaWVtW2tdW01TIC0gayAtIDFdICs9IChtID4gbiA/IG0gOiBuKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykgewoJCW4gPSAwLCBtID0gMDsKCQlpZiAoKChuID0gY2hlY2tDb3QoYmMsIGksIG5ndW9pKSkgJiYgIWNoZWNrQ290KGJjLCBpLCBtYXkpKSB8fCAobSA9IGNoZWNrQ290KGJjLCBpLCBtYXkpICYmICFjaGVja0NvdChiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtrXVtpXSArPSAobSA+IG4gPyBtIDogbik7CgkJbiA9IDAsIG0gPSAwOwoJCWlmICgoKG4gPSBjaGVja0hhbmcoYmMsIGksIG5ndW9pKSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbWF5KSkgfHwgKG0gPSBjaGVja0hhbmcoYmMsIGksIG1heSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtpXVtrXSArPSAobSA+IG4gPyBtIDogbik7CgkJaW50IGVtdCA9IDA7CgkJaWYgKChlbXQgPSBjaGVja0NvdChiYywgaSwgZSkgJiYgIWNoZWNrQ290KGJjLCBpLCBtYXkpICYmICFjaGVja0NvdChiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtrXVtpXSArPSBlbXQ7CgkJZW10ID0gMDsKCQlpZiAoKGVtdCA9IGNoZWNrSGFuZyhiYywgaSwgZSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbWF5KSAmJiAhY2hlY2tIYW5nKGJjLCBpLCBuZ3VvaSkpKQoJCQlmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJCQlkaWVtW2ldW2tdICs9IGVtdDsKCX0KCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlmb3IgKGludCBqID0gMDsgaiA8IE1TOyBqKyspCgkJCWlmIChiY1tpXVtqXSA9PSBuZ3VvaSB8fCBiY1tpXVtqXSA9PSBtYXkpCgkJCQlkaWVtW2ldW2pdID0gMDsKfQoKdm9pZCBpbkJhbkNvKHhvICgqYmMpW01TXSkgewoJcHJpbnRmKCJcbiIpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKQoJCQlpZiAoYmNbaV1bal0gPT0gZSkKCQkJCXByaW50ZigifCAiKTsKCQkJZWxzZSBpZiAoYmNbaV1bal0gPT0geCkKCQkJCXByaW50ZigifFgiKTsKCQkJZWxzZQoJCQkJcHJpbnRmKCJ8TyIpOwoJCXByaW50ZigifFxuIik7Cgl9Cn0K