1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | #!/usr/bin/perl # use strict; use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Cookies; #use LWP::Protocol::socks; push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 16*1024); #use Getopt::Std; use Crypt::SSLeay; $|=1; my $locale; my $ct; my $lsd; my $post_form_id; my $composer_id; my $fb_dtsg; my $kuote ; my $tokoh ; my $taunhidup ; my $momen ; my $Agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"; my $browser = LWP::UserAgent->new; push @{ $browser->requests_redirectable }, 'POST'; $browser -> agent($Agent); #$browser ->proxy(['http','https'], 'http://127.0.0.1:3128/'); #$browser ->proxy(['http'], 'http://10.19.19.19:8081/'); #$browser ->proxy(['http'], 'http://127.0.0.1:8118/'); #$browser ->proxy(['http'], 'socks://127.0.0.1:8081/'); my @waktu = localtime(time); $browser->cookie_jar(HTTP::Cookies->new(file => "./log/lwpcookies_update_fb.txt", autosave => 1)); my $log = './log/update_fb_'.$waktu[3].($waktu[4]+1).($waktu[5]+1900).'-'.$waktu[2].'-'.$waktu[1].'-'.$waktu[0].'.txt'; my $url = 'http://www.facebook.com/'; my $urlutama = 'https://login.facebook.com/'; my $urllogin = $urlutama.'login.php?login_attempt=1'; my $user = 'emailmu@email.com'; my $password = 'passwordmu'; my $profile_id = '1000004167XXXXX' ; my $urlprofil = 'http://www.facebook.com/profile.php?id='.$profile_id; my $statusbaru; my $urlquote = 'http://www.quotationspage.com/random.php3'; while (1) { #Get a random quote &getquote($urlquote); $statusbaru = $kuote.' ['.$tokoh.' '.$taunhidup.' '.$momen.']'; #Inisiasi &getstatus($url); #Login : &poslogin($urllogin,$user,$password,$url); #Inisiasi &getstatus1($urlprofil); #Update Status : &posupdate('http://www.facebook.com/ajax/updatestatus.php?__a=1',$urlprofil); #Bersihkan cookie $browser->cookie_jar->clear; $kuote = ''; $tokoh = ''; $taunhidup = ''; $momen = ''; sleep 300; } sub getstatus1 { my $uurl = shift; my $lihat = HTTP::Request->new(GET => $uurl); $lihat->content_type('application/x-www-form-urlencoded'); #$lihat->referer($urlutama.'index.php'); printlog("\n[*] Inisiasi $uurl\n"); my $lihatresponse = $browser->request($lihat); if ($lihatresponse->is_success) { my $kutukupret=join("",$lihatresponse->as_string); if ($kutukupret=~m#name="post_form_id" value="([a-zA-Z0-9]{32})"#) { #if ($kutukupret=~m#name="post_form_id" value="(.+?)"#) { printlog("\n[+] post_form_id = $1\n"); $post_form_id = $1; } else { printlog("\n[-] Hasil post_form_id tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } if ($kutukupret=~m#id="globalContainer"><div id="([a-zA-Z0-9]{22})">#) { #if ($kutukupret=~m#id="globalContainer"><div id="(.+?)">#) { printlog("\n[+] composer_id = $1\n"); $composer_id = $1; } else { printlog("\n[-] Hasil composer_id tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } if ($kutukupret=~m#name="fb_dtsg" value="(.+?)"#) { printlog("\n[+] fb_dtsg = $1\n"); $fb_dtsg = $1; } else { printlog("\n[-] Hasil fb_dtsg tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } } else { print "Error: ".$lihatresponse->status_line."\n\n" ; #die("[-] Error...\n\n"); } } #end of sub sub posupdate { my $purl = shift; my $pref = shift; printlog ("\n[~] Processing: $purl :: $pref\n"); my $loginresponse = $browser->request(POST $purl, [ action => 'PROFILE_UPDATE', profile_id => $profile_id, status => $statusbaru, target_id => $profile_id, app_id => '', 'privacy_data[value]' => '80', 'privacy_data[friends]' => '0', 'privacy_data[list_anon]' => '0', 'privacy_data[list_x_anon]' => '0', composer_id => $composer_id, hey_kid_im_a_composer => 'true', display_context => 'profile', post_form_id => $post_form_id, fb_dtsg => $fb_dtsg, _log_display_context => 'profile', ajax_log => '1', post_form_id_source => 'AsyncRequest', ], 'Referer' => $pref, ); my $kutukupret=join("",$loginresponse->as_string); #my $cucok=$kutukupret=~m/The requested URL could not be retrieved/sg; if ($kutukupret=~m#$tokoh#sg) { printlog("\n[+] Update status baru Berhasil ...\n"); #printlog($loginresponse->as_string); } elsif ($kutukupret=~m#<h2 class="main_message" id="standard_error">(.+?)</h2>#sg) { printlog("\n[-] Update status baru Gagal ! $1.\n"); } else { printlog("\n[-] Update status baru Gagal !\n"); printlog($loginresponse->as_string); die("Error...\n\n"); } } sub poslogin { my $purl = shift; my $puser = shift; my $ppassword = shift; my $pref = shift; printlog ("\n[~] Processing: $purl :: $puser :: $ppassword\n"); my $loginresponse = $browser->request(POST $purl, [ charset_test => $ct, locale => $locale, email => $puser, pass => $ppassword, persistent => '1', charset_test => $ct, lsd => $lsd, ], 'Referer' => $pref, ); my $kutukupret=join("",$loginresponse->as_string); #my $cucok=$kutukupret=~m/The requested URL could not be retrieved/sg; if ($kutukupret=~m#Title: Redirecting\.\.\.#sg) { printlog("\n[+] Login Berhasil ...\n"); #printlog($loginresponse->as_string); } elsif ($kutukupret=~m#<h2 class="main_message" id="standard_error">(.+?)</h2>#sg) { printlog("\n[-] Login Gagal ! $1.\n"); } else { printlog("\n[-] Login Gagal !\n"); printlog($loginresponse->as_string); die("Error...\n\n"); } } sub getstatus { my $uurl = shift; my $lihat = HTTP::Request->new(GET => $uurl); $lihat->content_type('application/x-www-form-urlencoded'); #$lihat->referer($urlutama.'index.php'); printlog("\n[*] Inisiasi $uurl\n"); my $lihatresponse = $browser->request($lihat); if ($lihatresponse->is_success) { my $kutukupret=join("",$lihatresponse->as_string); if ($kutukupret=~m#name="charset_test" value="(.+?)" />#) { printlog("\n[+] charset_test = $1\n"); $ct = $1; } else { printlog("\n[-] Hasil charset_test tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } if ($kutukupret=~m#name="locale" value="(.+?)"#) { printlog("\n[+] locale = $1\n"); $locale = $1; } else { printlog("\n[-] Hasil locale tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } if ($kutukupret=~m#name="lsd" value="(.+?)"#) { printlog("\n[+] lsd = $1\n"); $lsd = $1; } else { printlog("\n[-] Hasil lsd tidak cocok !\n"); printlog($lihatresponse->as_string); #die("[-] Error...\n\n"); } } else { print "Error: ".$lihatresponse->status_line."\n\n" ; #die("[-] Error...\n\n"); } } #end of sub sub getquote { my $uurl = shift; my $lihat = HTTP::Request->new(GET => $uurl); $lihat->content_type('application/x-www-form-urlencoded'); printlog("\n[*] Inisiasi $uurl\n"); my $lihatresponse = $browser->request($lihat); if ($lihatresponse->is_success) { my $kutukupret=join("",$lihatresponse->as_string); $kutukupret=~s#, <i>##sg; $kutukupret=~s#</i>##sg; if ($kutukupret=~m#<a title="Click for further information about this quotation" href="(?:.+?)">(.+?)</a>(?:.+?)<a href="(?:.+?)">(.+?)</a>(.+?){0,1}</b>(.+?){0,1}</dd>#) { printlog("\n[+] Hasil get a random quote = $1 ::: $2::: $3::: $4\n\n"); $kuote = $1; $tokoh = $2; $taunhidup = $3 if ($3); $momen = $4 if ($4); #printlog($kutukupret); } else { printlog("\n[-] Hasil tidak cocok !\n"); #printlog($lihatresponse->as_string); printlog($kutukupret); #die("[-] Error...\n\n"); } } else { print "Error: ".$lihatresponse->status_line."\n\n" ; #die("[-] Error...\n\n"); } } #end of sub sub printlog { print $_[0]; open(LOO,">>$log"); print LOO $_[0]; close(LOO); return; } |
IyEvdXNyL2Jpbi9wZXJsCiMKCnVzZSBzdHJpY3Q7CnVzZSBMV1A6OlVzZXJBZ2VudDsKdXNlIEhUVFA6OlJlcXVlc3Q6OkNvbW1vbjsKdXNlIEhUVFA6OkNvb2tpZXM7CiN1c2UgTFdQOjpQcm90b2NvbDo6c29ja3M7CnB1c2goQExXUDo6UHJvdG9jb2w6Omh0dHA6OkVYVFJBX1NPQ0tfT1BUUywgTWF4TGluZUxlbmd0aCA9PiAxNioxMDI0KTsKI3VzZSBHZXRvcHQ6OlN0ZDsKdXNlIENyeXB0OjpTU0xlYXk7CiR8PTE7CgpteSAkbG9jYWxlOwpteSAkY3Q7Cm15ICRsc2Q7Cm15ICRwb3N0X2Zvcm1faWQ7Cm15ICRjb21wb3Nlcl9pZDsKbXkgJGZiX2R0c2c7CgpteSAka3VvdGUgOwpteSAkdG9rb2ggOwpteSAkdGF1bmhpZHVwIDsKbXkgJG1vbWVuIDsKCm15ICRBZ2VudCAgPSAiTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgOC4wOyBXaW5kb3dzIE5UIDYuMSkiOwpteSAkYnJvd3NlciA9IExXUDo6VXNlckFnZW50LT5uZXc7CnB1c2ggQHsgJGJyb3dzZXItPnJlcXVlc3RzX3JlZGlyZWN0YWJsZSB9LCAnUE9TVCc7CiRicm93c2VyIC0+IGFnZW50KCRBZ2VudCk7CiMkYnJvd3NlciAtPnByb3h5KFsnaHR0cCcsJ2h0dHBzJ10sICdodHRwOi8vMTI3LjAuMC4xOjMxMjgvJyk7CiMkYnJvd3NlciAtPnByb3h5KFsnaHR0cCddLCAnaHR0cDovLzEwLjE5LjE5LjE5OjgwODEvJyk7CiMkYnJvd3NlciAtPnByb3h5KFsnaHR0cCddLCAnaHR0cDovLzEyNy4wLjAuMTo4MTE4LycpOwojJGJyb3dzZXIgLT5wcm94eShbJ2h0dHAnXSwgJ3NvY2tzOi8vMTI3LjAuMC4xOjgwODEvJyk7CgpteSBAd2FrdHUgPSBsb2NhbHRpbWUodGltZSk7CiRicm93c2VyLT5jb29raWVfamFyKEhUVFA6OkNvb2tpZXMtPm5ldyhmaWxlID0+ICIuL2xvZy9sd3Bjb29raWVzX3VwZGF0ZV9mYi50eHQiLCBhdXRvc2F2ZSA9PiAxKSk7Cm15ICRsb2cgPSAnLi9sb2cvdXBkYXRlX2ZiXycuJHdha3R1WzNdLigkd2FrdHVbNF0rMSkuKCR3YWt0dVs1XSsxOTAwKS4nLScuJHdha3R1WzJdLictJy4kd2FrdHVbMV0uJy0nLiR3YWt0dVswXS4nLnR4dCc7CgpteSAkdXJsID0gJ2h0dHA6Ly93d3cuZmFjZWJvb2suY29tLyc7Cm15ICR1cmx1dGFtYSA9ICdodHRwczovL2xvZ2luLmZhY2Vib29rLmNvbS8nOwpteSAkdXJsbG9naW4gPSAkdXJsdXRhbWEuJ2xvZ2luLnBocD9sb2dpbl9hdHRlbXB0PTEnOwpteSAkdXNlciA9ICdlbWFpbG11QGVtYWlsLmNvbSc7Cm15ICRwYXNzd29yZCA9ICdwYXNzd29yZG11JzsKbXkgJHByb2ZpbGVfaWQgPSAnMTAwMDAwNDE2N1hYWFhYJyA7Cm15ICR1cmxwcm9maWwgPSAnaHR0cDovL3d3dy5mYWNlYm9vay5jb20vcHJvZmlsZS5waHA/aWQ9Jy4kcHJvZmlsZV9pZDsKbXkgJHN0YXR1c2JhcnU7Cm15ICR1cmxxdW90ZSA9ICdodHRwOi8vd3d3LnF1b3RhdGlvbnNwYWdlLmNvbS9yYW5kb20ucGhwMyc7Cgp3aGlsZSAoMSkgewogI0dldCBhIHJhbmRvbSBxdW90ZQogJmdldHF1b3RlKCR1cmxxdW90ZSk7CgogJHN0YXR1c2JhcnUgPSAka3VvdGUuJyBbJy4kdG9rb2guJyAnLiR0YXVuaGlkdXAuJyAnLiRtb21lbi4nXSc7CgogI0luaXNpYXNpCiAmZ2V0c3RhdHVzKCR1cmwpOwoJCiAjTG9naW4gOgogJnBvc2xvZ2luKCR1cmxsb2dpbiwkdXNlciwkcGFzc3dvcmQsJHVybCk7CgogI0luaXNpYXNpCiAmZ2V0c3RhdHVzMSgkdXJscHJvZmlsKTsKCiAjVXBkYXRlIFN0YXR1cyA6CiAmcG9zdXBkYXRlKCdodHRwOi8vd3d3LmZhY2Vib29rLmNvbS9hamF4L3VwZGF0ZXN0YXR1cy5waHA/X19hPTEnLCR1cmxwcm9maWwpOwoKICNCZXJzaWhrYW4gY29va2llCiAkYnJvd3Nlci0+Y29va2llX2phci0+Y2xlYXI7CgogJGt1b3RlID0gJyc7CiAkdG9rb2ggPSAnJzsKICR0YXVuaGlkdXAgPSAnJzsKICRtb21lbiA9ICcnOwoKIHNsZWVwIDMwMDsKfQoKc3ViIGdldHN0YXR1czEgewoJbXkgJHV1cmwgPSBzaGlmdDsKCW15ICRsaWhhdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyhHRVQgPT4gJHV1cmwpOwoJJGxpaGF0LT5jb250ZW50X3R5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOwoJIyRsaWhhdC0+cmVmZXJlcigkdXJsdXRhbWEuJ2luZGV4LnBocCcpOwoJcHJpbnRsb2coIlxuWypdIEluaXNpYXNpICR1dXJsXG4iKTsKCW15ICRsaWhhdHJlc3BvbnNlID0gJGJyb3dzZXItPnJlcXVlc3QoJGxpaGF0KTsKCWlmICgkbGloYXRyZXNwb25zZS0+aXNfc3VjY2VzcykgewoJICBteSAka3V0dWt1cHJldD1qb2luKCIiLCRsaWhhdHJlc3BvbnNlLT5hc19zdHJpbmcpOwoJCWlmICgka3V0dWt1cHJldD1+bSNuYW1lPSJwb3N0X2Zvcm1faWQiIHZhbHVlPSIoW2EtekEtWjAtOV17MzJ9KSIjKSB7CgkJI2lmICgka3V0dWt1cHJldD1+bSNuYW1lPSJwb3N0X2Zvcm1faWQiIHZhbHVlPSIoLis/KSIjKSB7CgkJCXByaW50bG9nKCJcblsrXSBwb3N0X2Zvcm1faWQgPSAgJDFcbiIpOwoJCQkkcG9zdF9mb3JtX2lkID0gJDE7CgkJfSBlbHNlIHsJcHJpbnRsb2coIlxuWy1dIEhhc2lsIHBvc3RfZm9ybV9pZCB0aWRhayBjb2NvayAhXG4iKTsKCQkJcHJpbnRsb2coJGxpaGF0cmVzcG9uc2UtPmFzX3N0cmluZyk7CgkJCSNkaWUoIlstXSBFcnJvci4uLlxuXG4iKTsgCgkJCX0KCgkJaWYgKCRrdXR1a3VwcmV0PX5tI2lkPSJnbG9iYWxDb250YWluZXIiPjxkaXYgaWQ9IihbYS16QS1aMC05XXsyMn0pIj4jKSB7CgkJI2lmICgka3V0dWt1cHJldD1+bSNpZD0iZ2xvYmFsQ29udGFpbmVyIj48ZGl2IGlkPSIoLis/KSI+IykgewoJCQlwcmludGxvZygiXG5bK10gY29tcG9zZXJfaWQgPSAgJDFcbiIpOwoJCQkkY29tcG9zZXJfaWQgPSAkMTsKCQl9IGVsc2UgewlwcmludGxvZygiXG5bLV0gSGFzaWwgY29tcG9zZXJfaWQgdGlkYWsgY29jb2sgIVxuIik7CgkJCXByaW50bG9nKCRsaWhhdHJlc3BvbnNlLT5hc19zdHJpbmcpOwoJCQkjZGllKCJbLV0gRXJyb3IuLi5cblxuIik7IAoJCQl9CgoJCWlmICgka3V0dWt1cHJldD1+bSNuYW1lPSJmYl9kdHNnIiB2YWx1ZT0iKC4rPykiIykgewoJCQlwcmludGxvZygiXG5bK10gZmJfZHRzZyA9ICAkMVxuIik7CgkJCSRmYl9kdHNnID0gJDE7CgkJfSBlbHNlIHsJcHJpbnRsb2coIlxuWy1dIEhhc2lsIGZiX2R0c2cgdGlkYWsgY29jb2sgIVxuIik7CgkJCXByaW50bG9nKCRsaWhhdHJlc3BvbnNlLT5hc19zdHJpbmcpOwoJCQkjZGllKCJbLV0gRXJyb3IuLi5cblxuIik7IAoJCQl9CgoJICB9CgllbHNlIHsgCgkgICBwcmludCAiRXJyb3I6ICIuJGxpaGF0cmVzcG9uc2UtPnN0YXR1c19saW5lLiJcblxuIiA7CgkgICAjZGllKCJbLV0gRXJyb3IuLi5cblxuIik7IAoJCX0KfSAjZW5kIG9mIHN1YgoKc3ViIHBvc3VwZGF0ZSB7CglteSAkcHVybCA9IHNoaWZ0OwoJbXkgJHByZWYgPSBzaGlmdDsKCglwcmludGxvZyAoIlxuW35dIFByb2Nlc3Npbmc6ICRwdXJsIDo6ICRwcmVmXG4iKTsKCQoJbXkgJGxvZ2lucmVzcG9uc2UgPSAkYnJvd3Nlci0+cmVxdWVzdChQT1NUICRwdXJsLAogICAgICAgICAgICAgICAgICAgICAgIFsgYWN0aW9uCT0+ICdQUk9GSUxFX1VQREFURScsCgkJCXByb2ZpbGVfaWQJPT4gJHByb2ZpbGVfaWQsCgkJCXN0YXR1cwk9PiAkc3RhdHVzYmFydSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pZAk9PiAkcHJvZmlsZV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9pZAk9PiAnJywKCQkJJ3ByaXZhY3lfZGF0YVt2YWx1ZV0nCT0+ICc4MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAncHJpdmFjeV9kYXRhW2ZyaWVuZHNdJwk9PiAnMCcsCgkJCSdwcml2YWN5X2RhdGFbbGlzdF9hbm9uXScJPT4gJzAnLAoJCQkncHJpdmFjeV9kYXRhW2xpc3RfeF9hbm9uXScJPT4gJzAnLAoJCQljb21wb3Nlcl9pZAk9PiAkY29tcG9zZXJfaWQsCgkJCWhleV9raWRfaW1fYV9jb21wb3Nlcgk9PiAndHJ1ZScsCgkJCWRpc3BsYXlfY29udGV4dAk9PiAncHJvZmlsZScsCgkJCXBvc3RfZm9ybV9pZAk9PiAkcG9zdF9mb3JtX2lkLAoJCQlmYl9kdHNnCT0+ICRmYl9kdHNnLAoJCQlfbG9nX2Rpc3BsYXlfY29udGV4dAk9PiAncHJvZmlsZScsCgkJCWFqYXhfbG9nCT0+ICcxJywKCQkJcG9zdF9mb3JtX2lkX3NvdXJjZQk9PiAnQXN5bmNSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICBdLAoJCQknUmVmZXJlcicJPT4gJHByZWYsCgkJCSk7CgoKICAgbXkgJGt1dHVrdXByZXQ9am9pbigiIiwkbG9naW5yZXNwb25zZS0+YXNfc3RyaW5nKTsKICAgI215ICRjdWNvaz0ka3V0dWt1cHJldD1+bS9UaGUgcmVxdWVzdGVkIFVSTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkL3NnOwogICBpZiAoJGt1dHVrdXByZXQ9fm0jJHRva29oI3NnKSB7CgkJCQlwcmludGxvZygiXG5bK10gVXBkYXRlIHN0YXR1cyBiYXJ1IEJlcmhhc2lsIC4uLlxuIik7CgkJCQkjcHJpbnRsb2coJGxvZ2lucmVzcG9uc2UtPmFzX3N0cmluZyk7CiAgICAgICAgICAgICAgIH0KCWVsc2lmICgka3V0dWt1cHJldD1+bSM8aDIgY2xhc3M9Im1haW5fbWVzc2FnZSIgaWQ9InN0YW5kYXJkX2Vycm9yIj4oLis/KTwvaDI+I3NnKSB7CgkJCQlwcmludGxvZygiXG5bLV0gVXBkYXRlIHN0YXR1cyBiYXJ1IEdhZ2FsICEgJDEuXG4iKTsKCX0KCWVsc2UgewlwcmludGxvZygiXG5bLV0gVXBkYXRlIHN0YXR1cyBiYXJ1IEdhZ2FsICFcbiIpOwoJCQlwcmludGxvZygkbG9naW5yZXNwb25zZS0+YXNfc3RyaW5nKTsKCQkJZGllKCJFcnJvci4uLlxuXG4iKTsgCiAgICAgIH0KfQogCnN1YiBwb3Nsb2dpbiB7CglteSAkcHVybCA9IHNoaWZ0OwoJbXkgJHB1c2VyID0gc2hpZnQ7CglteSAkcHBhc3N3b3JkID0gc2hpZnQ7CglteSAkcHJlZiA9IHNoaWZ0OwoKCXByaW50bG9nICgiXG5bfl0gUHJvY2Vzc2luZzogJHB1cmwgOjogJHB1c2VyIDo6ICRwcGFzc3dvcmRcbiIpOwoJCglteSAkbG9naW5yZXNwb25zZSA9ICRicm93c2VyLT5yZXF1ZXN0KFBPU1QgJHB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgWyBjaGFyc2V0X3Rlc3QJPT4gJGN0LAoJCQlsb2NhbGUJPT4gJGxvY2FsZSwKCQkJZW1haWwJPT4gJHB1c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwk9PiAkcHBhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudAk9PiAnMScsCgkJCWNoYXJzZXRfdGVzdAk9PiAkY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBsc2QJPT4gJGxzZCwKICAgICAgICAgICAgICAgICAgICAgICBdLAoJCQknUmVmZXJlcicJPT4gJHByZWYsCgkJCSk7CgoKICAgbXkgJGt1dHVrdXByZXQ9am9pbigiIiwkbG9naW5yZXNwb25zZS0+YXNfc3RyaW5nKTsKICAgI215ICRjdWNvaz0ka3V0dWt1cHJldD1+bS9UaGUgcmVxdWVzdGVkIFVSTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkL3NnOwogICBpZiAoJGt1dHVrdXByZXQ9fm0jVGl0bGU6IFJlZGlyZWN0aW5nXC5cLlwuI3NnKSB7CgkJCQlwcmludGxvZygiXG5bK10gTG9naW4gQmVyaGFzaWwgLi4uXG4iKTsKCQkJCSNwcmludGxvZygkbG9naW5yZXNwb25zZS0+YXNfc3RyaW5nKTsKICAgICAgICAgICAgICAgfQoJZWxzaWYgKCRrdXR1a3VwcmV0PX5tIzxoMiBjbGFzcz0ibWFpbl9tZXNzYWdlIiBpZD0ic3RhbmRhcmRfZXJyb3IiPiguKz8pPC9oMj4jc2cpIHsKCQkJCXByaW50bG9nKCJcblstXSBMb2dpbiBHYWdhbCAhICQxLlxuIik7Cgl9CgllbHNlIHsJcHJpbnRsb2coIlxuWy1dIExvZ2luIEdhZ2FsICFcbiIpOwoJCQlwcmludGxvZygkbG9naW5yZXNwb25zZS0+YXNfc3RyaW5nKTsKCQkJZGllKCJFcnJvci4uLlxuXG4iKTsgCiAgICAgIH0KfQoKc3ViIGdldHN0YXR1cyB7CglteSAkdXVybCA9IHNoaWZ0OwoJbXkgJGxpaGF0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KEdFVCA9PiAkdXVybCk7CgkkbGloYXQtPmNvbnRlbnRfdHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CgkjJGxpaGF0LT5yZWZlcmVyKCR1cmx1dGFtYS4naW5kZXgucGhwJyk7CglwcmludGxvZygiXG5bKl0gSW5pc2lhc2kgJHV1cmxcbiIpOwoJbXkgJGxpaGF0cmVzcG9uc2UgPSAkYnJvd3Nlci0+cmVxdWVzdCgkbGloYXQpOwoJaWYgKCRsaWhhdHJlc3BvbnNlLT5pc19zdWNjZXNzKSB7CgkgIG15ICRrdXR1a3VwcmV0PWpvaW4oIiIsJGxpaGF0cmVzcG9uc2UtPmFzX3N0cmluZyk7CgkJaWYgKCRrdXR1a3VwcmV0PX5tI25hbWU9ImNoYXJzZXRfdGVzdCIgdmFsdWU9IiguKz8pIiAvPiMpIHsKCQkJcHJpbnRsb2coIlxuWytdIGNoYXJzZXRfdGVzdCA9ICAkMVxuIik7CgkJCSRjdCA9ICQxOwoJCX0gZWxzZSB7CXByaW50bG9nKCJcblstXSBIYXNpbCBjaGFyc2V0X3Rlc3QgdGlkYWsgY29jb2sgIVxuIik7CgkJCXByaW50bG9nKCRsaWhhdHJlc3BvbnNlLT5hc19zdHJpbmcpOwoJCQkjZGllKCJbLV0gRXJyb3IuLi5cblxuIik7IAoJCQl9CgoJCWlmICgka3V0dWt1cHJldD1+bSNuYW1lPSJsb2NhbGUiIHZhbHVlPSIoLis/KSIjKSB7CgkJCXByaW50bG9nKCJcblsrXSBsb2NhbGUgPSAgJDFcbiIpOwoJCQkkbG9jYWxlID0gJDE7CgkJfSBlbHNlIHsJcHJpbnRsb2coIlxuWy1dIEhhc2lsIGxvY2FsZSB0aWRhayBjb2NvayAhXG4iKTsKCQkJcHJpbnRsb2coJGxpaGF0cmVzcG9uc2UtPmFzX3N0cmluZyk7CgkJCSNkaWUoIlstXSBFcnJvci4uLlxuXG4iKTsgCgkJCX0KCgkJaWYgKCRrdXR1a3VwcmV0PX5tI25hbWU9ImxzZCIgdmFsdWU9IiguKz8pIiMpIHsKCQkJcHJpbnRsb2coIlxuWytdIGxzZCA9ICAkMVxuIik7CgkJCSRsc2QgPSAkMTsKCQl9IGVsc2UgewlwcmludGxvZygiXG5bLV0gSGFzaWwgbHNkIHRpZGFrIGNvY29rICFcbiIpOwoJCQlwcmludGxvZygkbGloYXRyZXNwb25zZS0+YXNfc3RyaW5nKTsKCQkJI2RpZSgiWy1dIEVycm9yLi4uXG5cbiIpOyAKCQkJfQoKCSAgfQoJZWxzZSB7IAoJICAgcHJpbnQgIkVycm9yOiAiLiRsaWhhdHJlc3BvbnNlLT5zdGF0dXNfbGluZS4iXG5cbiIgOwoJICAgI2RpZSgiWy1dIEVycm9yLi4uXG5cbiIpOyAKCQl9Cn0gI2VuZCBvZiBzdWIKCnN1YiBnZXRxdW90ZSB7CglteSAkdXVybCA9IHNoaWZ0OwoJbXkgJGxpaGF0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KEdFVCA9PiAkdXVybCk7CgkkbGloYXQtPmNvbnRlbnRfdHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CglwcmludGxvZygiXG5bKl0gSW5pc2lhc2kgJHV1cmxcbiIpOwoJbXkgJGxpaGF0cmVzcG9uc2UgPSAkYnJvd3Nlci0+cmVxdWVzdCgkbGloYXQpOwoJaWYgKCRsaWhhdHJlc3BvbnNlLT5pc19zdWNjZXNzKSB7CgkgIG15ICRrdXR1a3VwcmV0PWpvaW4oIiIsJGxpaGF0cmVzcG9uc2UtPmFzX3N0cmluZyk7CgkJJGt1dHVrdXByZXQ9fnMjLCA8aT4jI3NnOwoJCSRrdXR1a3VwcmV0PX5zIzwvaT4jI3NnOwoJCWlmICgka3V0dWt1cHJldD1+bSM8YSB0aXRsZT0iQ2xpY2sgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBxdW90YXRpb24iIGhyZWY9Iig/Oi4rPykiPiguKz8pPC9hPig/Oi4rPyk8YSBocmVmPSIoPzouKz8pIj4oLis/KTwvYT4oLis/KXswLDF9PC9iPiguKz8pezAsMX08L2RkPiMpIHsKCQkJcHJpbnRsb2coIlxuWytdIEhhc2lsIGdldCBhIHJhbmRvbSBxdW90ZSA9ICAkMSA6OjogJDI6OjogJDM6OjogJDRcblxuIik7CgkJCSRrdW90ZSA9ICQxOwoJCQkkdG9rb2ggPSAkMjsKCQkJJHRhdW5oaWR1cCA9ICQzIGlmICgkMyk7CgkJCSRtb21lbiA9ICQ0IGlmICgkNCk7CgkJCSNwcmludGxvZygka3V0dWt1cHJldCk7CgkJfSBlbHNlIHsJcHJpbnRsb2coIlxuWy1dIEhhc2lsIHRpZGFrIGNvY29rICFcbiIpOwoJCQkjcHJpbnRsb2coJGxpaGF0cmVzcG9uc2UtPmFzX3N0cmluZyk7CgkJCXByaW50bG9nKCRrdXR1a3VwcmV0KTsKCQkJI2RpZSgiWy1dIEVycm9yLi4uXG5cbiIpOyAKCQkJfQoKCSAgfQoJZWxzZSB7IAoJICAgcHJpbnQgIkVycm9yOiAiLiRsaWhhdHJlc3BvbnNlLT5zdGF0dXNfbGluZS4iXG5cbiIgOwoJICAgI2RpZSgiWy1dIEVycm9yLi4uXG5cbiIpOyAKCQl9Cn0gI2VuZCBvZiBzdWIKCnN1YiBwcmludGxvZyB7CiBwcmludCAkX1swXTsgCiBvcGVuKExPTywiPj4kbG9nIik7CiBwcmludCBMT08gJF9bMF07CiBjbG9zZShMT08pOwogcmV0dXJuOwp9CgoK



