Файл: ai-bolit/ai-bolit.php
Строк: 3933
<?php
///////////////////////////////////////////////////////////////////////////
// Created and developed by Greg Zemskov, Revisium Company
// Email: ai@revisium.com, http://revisium.com/ai/, skype: greg_zemskov
// Commercial usage is not allowed without a license purchase or written permission of author
// Source code usage is not allowed without author's permission
// Certificated in Federal Institute of Industrial Property in 2012
// http://revisium.com/ai/i/mini_aibolit.jpg
////////////////////////////////////////////////////////////////////////////
// Запрещено использование скрипта в коммерческих целях без приобретения лицензии.
// Запрещено использование исходного кода скрипта без приобретения лицензии.
//
// По вопросам приобретения лицензии обращайтесь в компанию "Ревизиум": http://www.revisium.com
// ai@revisium.com
// На скрипт получено авторское свидетельство в Роспатенте
// http://revisium.com/ai/i/mini_aibolit.jpg
///////////////////////////////////////////////////////////////////////////
// put 1 for expert mode, 0 for basic check and 2 for paranoic mode
// установите 1 для режима "Эксперта", 0 для быстрой проверки и 2 для параноидальной проверки (для лечения сайта)
define('AI_EXPERT', 1);
//define('LANG', 'EN');
define('LANG', 'RU');
// Put any strong password to open the script from web
// Впишите вместо put_any_strong_password_here сложный пароль
define('PASS', 'put_any_strong_password_here');
define('REPORT_MASK_PHPSIGN', 1);
define('REPORT_MASK_SPAMLINKS', 2);
define('REPORT_MASK_DOORWAYS', 4);
define('REPORT_MASK_SUSP', 8);
define('REPORT_MASK_CANDI', 16);
define('REPORT_MASK_WRIT', 32);
define('REPORT_MASK_FULL', REPORT_MASK_PHPSIGN | REPORT_MASK_SPAMLINKS | REPORT_MASK_DOORWAYS | REPORT_MASK_SUSP
/* <-- remove this line to enable "recommendations"
| REPORT_MASK_CANDI | REPORT_MASK_WRIT
remove this line to enable "recommendations" --> */
);
$defaults = array(
'path' => dirname(__FILE__),
'scan_all_files' => 0, // full scan (rather than just a .js, .php, .html, .htaccess)
'scan_delay' => 1, // delay in file scanning to reduce system load
'max_size_to_scan' => '512K',
'site_url' => '', // website url
'no_rw_dir' => 0,
'report_mask' => REPORT_MASK_FULL // full-featured report
);
define('DEBUG_MODE', 0);
define('DIR_SEPARATOR', '/');
define('DOUBLECHECK_FILE', 'AI-BOLIT-DOUBLECHECK.php');
if ((isset($_SERVER['OS']) && stripos('Win', $_SERVER['OS']) !== false)/* && stripos('CygWin', $_SERVER['OS']) === false)*/) {
define('DIR_SEPARATOR', '\');
}
if (LANG == 'RU') {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RUSSIAN INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001', '<h3>AI-Болит v.%s — ищет вредоносный код и вирусы в файлах.</h3><h5>Григорий Земсков, компания "<a href="http://www.revisium.com/">Ревизиум</a>", 2012-2014, <a target=_blank href="http://revisium.com/ai/">Страница проекта на Revisium.com.</a> %s</h5>');
define('AI_STR_002', '<div class="update">Проверьте обновление на сайте <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Возможно, ваша версия скрипта уже устарела.</div>');
define('AI_STR_003', 'ВНИМАНИЕ! Не оставляйте файл ai-bolit.php или файл отчета на сервере, и не давайте прямых ссылок с других сайтов на файл отчета или скрипта. Отчет содержит важную информацию о вашем сайте или сервере, сохраните его в надежном месте от посторонних глаз!');
define('AI_STR_004', 'Путь');
define('AI_STR_005', 'Дата создания');
define('AI_STR_006', 'Дата модификации');
define('AI_STR_007', 'Размер');
define('AI_STR_008', 'Конфигурация PHP');
define('AI_STR_009', "Вы установили слабый пароль на скрипт AI-BOLIT. Укажите пароль не менее 8 символов, содержащий латинские буквы в верхнем и нижнем регистре, а также цифры. Например, такой <b>%s</b>");
define('AI_STR_010', "Запустите скрипт с паролем, который установлен в переменной PASS (в начале файла). <br/>Например, так http://ваш_сайт_и_путь_до_скрипта/ai-bolit.php?p=<b>%s</b>");
define('AI_STR_011', 'Текущая директория не доступна для чтения скрипту. Пожалуйста, укажите права на доступ <b>rwxr-xr-x</b> или с помощью командной строки <b>chmod +r имя_директории</b>');
define('AI_STR_012', "<div class="rep">Текущая база скрипта содержит %s шелл-сигнатур, а также %s других вредоносных фрагментов. Затрачено времени: <b>%s</b>.<br/>Сканирование начато: %s. Сканирование завершено: %s</div> ");
define('AI_STR_013', '<div class="rep">Всего проверено %s директорий и %s файлов.</div>');
define('AI_STR_014', '<div class="rep" style="color: #0000A0">Внимание, скрипт выполнил быструю проверку сайта. Проверяются только наиболее критические файлы, но часть вредоносных скриптов может быть не обнаружена. Пожалуйста, запустите скрипт из командной строки для выполнения полного тестирования. Подробнее смотрите в <a href="http://revisium.com/ai/faq.php">FAQ вопрос №10</a>.</div>');
define('AI_STR_015', '<div class="sec">Критические замечания</div>');
define('AI_STR_016', 'Найдены сигнатуры шелл-скрипта. Подозрение на вредоносный скрипт:');
define('AI_STR_017', 'Шелл-скрипты не найдены.');
define('AI_STR_018', 'Обнаружены сигнатуры javascript вирусов:');
define('AI_STR_019', 'Обнаружены сигнатуры исполняемых файлов unix. Они могут быть вредоносными файлами:');
define('AI_STR_020', 'Двойное расширение, зашифрованный контент или подозрение на вредоносный скрипт. Требуется дополнительный анализ:');
define('AI_STR_021', 'Подозрение на вредоносный скрипт:');
define('AI_STR_022', 'Список файловых ссылок (symlinks):');
define('AI_STR_023', 'Список скрытых файлов:');
define('AI_STR_024', 'Скорее всего этот файл лежит в каталоге с дорвеем:');
define('AI_STR_025', 'Не найдено директорий c дорвеями');
define('AI_STR_026', 'Предупреждения');
define('AI_STR_027', 'Опасный код в .htaccess (редирект на внешний сервер, подмена расширений или автовнедрение кода):');
define('AI_STR_028', 'В не .php файле содержится стартовая сигнатура PHP кода. Возможно, там вредоносный код:');
define('AI_STR_029', 'В этих файлах размещен код по продаже ссылок. Убедитесь, что размещали его вы:');
define('AI_STR_030', 'Непроверенные файлы - ошибка чтения');
define('AI_STR_031', 'В этих файлах размещены невидимые ссылки. Подозрение на ссылочный спам:');
define('AI_STR_032', 'Список невидимых ссылок:');
define('AI_STR_033', 'Отображены только первые ');
define('AI_STR_034', 'Найдены директории, в которых подозрительно много файлов .php или .html. Подозрение на дорвей:');
define('AI_STR_035', 'Скрипт использует код, который часто используются во вредоносных скриптах:');
define('AI_STR_036', 'Директории из файла .adirignore были пропущены при сканировании:');
define('AI_STR_037', 'Версии найденных CMS:');
define('AI_STR_038', 'Большие файлы (больше чем %s! Пропущено:');
define('AI_STR_039', 'Не найдено файлов больше чем %s');
define('AI_STR_040', 'Временные файлы или файлы(каталоги)-кандидаты на удаление по ряду причин:');
define('AI_STR_041', 'Потенциально небезопасно! Директории, доступные скрипту на запись:');
define('AI_STR_042', 'Не найдено директорий, доступных на запись скриптом');
define('AI_STR_043', 'Использовано памяти при сканировании: ');
define('AI_STR_044', '<div id="igid" style="display: none;"><div class="sec">Добавить в список игнорируемых</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Скопируйте этот список и вставьте его в файл .aignore, чтобы исключить эти файлы из отчета.</div></div>');
define('AI_STR_045', '<div class="notice"><span class="vir">[!]</span> В скрипте отключено полное сканирование файлов, проверяются только .php, .html, .htaccess. Чтобы выполнить более тщательное сканирование, <br/>поменяйте значение настройки на <b>'scan_all_files' => 1</b> в самом верху скрипта. Скрипт в этом случае может работать очень долго. Рекомендуется отключить на хостинге лимит по времени выполнения, либо запускать скрипт из командной строки.</div>');
define('AI_STR_046', '[x] закрыть сообщение');
define('AI_STR_047', '<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank"><b>Оперативное лечение сайта от вирусов. Защита от взлома. Гарантия на работы. </b></a></span><br/><p style="color: #D0FFD0; font-size: 13px;">Быстро и качественно вылечим Ваш сайт от вирусов, удалим вредоносный код с сайта, поставим уникальную защиту от взлома. <a href="http://www.revisium.com/ru/order/" target=_blank>Отправьте нам запрос</a> на сайте www.revisium.com →</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0">Также приглашаем в группу ВКонтакте<br/> <a href="http://vk.com/siteprotect" target="_blank">"Безопасность Веб-сайтов"</a>. А еще у нас есть твиттер <a href="http://twitter.com/revisium" target=_blank>@revisium</a> и страница <a href="http://www.facebook.com/Revisium" target=_blank>facebook.com/revisium</a>. Присоединяйтесь!</p><hr color=#E0E0E0 size=1><p style="color: #E0E0E0"><b style="color: yellow">[$$$]</b> Если Вы хостер, веб-студия, seo-специалист или вебмастер — напишите нам на ai@revisium.com, для Вас есть партнерская программа.</p>');
define('AI_STR_048', '<p>Если у вас есть эккаунт ВКонтакте, приглашаем в <a href="http://vk.com/siteprotect" target=_blank>группу "Безопасность Веб-сайтов"</a>: там я делюсь опытом защиты веб-сайтов и поиска вредоносных скриптов.</p>');
define('AI_STR_049', 'Отказ от гарантий: даже если скрипт не нашел вредоносных скриптов на сайте, автор не гарантирует их полное отсутствие, а также не несет ответственности за возможные последствия работы скрипта ai-bolit.php или неоправданные ожидания пользователей относительно функциональности и возможностей.');
define('AI_STR_050', 'Замечания и предложения по работе скрипта и пропущенные вредоносные скрипты присылайте на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<p>Также будем чрезвычайно благодарны за любые упоминания скрипта AI-Bolit на вашем сайте, в блоге, среди друзей, знакомых и клиентов. Ссылочку можно поставить на <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. <p>Если будут вопросы - пишите <a href="mailto:ai@revisium.com">ai@revisium.com</a>. ');
define('AI_STR_051', 'Отчет по ');
define('AI_STR_052', 'Эвристический анализ обнаружил подозрительные файлы. Проверьте их на наличие вредоносного кода.');
define('AI_STR_053', 'Много косвенных вызовов функции');
define('AI_STR_054', 'Подозрение на обфусцированные переменные');
define('AI_STR_055', 'Подозрительное использование массива глобальных переменных');
define('AI_STR_056', 'Дробление строки на символы');
define('AI_STR_057', 'Сканирование выполнено в обычном режиме. Некоторые вредоносные скрипты могут быть не обнаружены.<br> Желательно проверить сайт в режиме "Эксперт". Подробно описано в <a href="http://www.revisium.com/ai/faq.php">FAQ</a> и инструкции к скрипту.');
define('AI_STR_058', 'Обнаружены фишинговые страницы:');
} else {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ENGLISH INTERFACE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
define('AI_STR_001', '<h3>AI-BOLIT v.%s — Advanced Server-Side Scanner of Viruses, Malicious and Hacker's Scripts.</h3><h5>Greg Zemskov, 2012-2014, <a target=_blank href="http://revisium.com/aibo/">AI-BOLIT web site.</a>. Non-commercial use only.</h5>');
define('AI_STR_002', '<div class="update">Check for updates on <a href="http://revisium.com/ai/">http://revisium.com/ai/</a>. Probably your version is out-of-date.</div>');
define('AI_STR_003', 'Caution! Do not leave either ai-bolit.php or report file on server and do not provide direct links to the report file. Report file contains sensitive information about your website which could be used by hackers. So keep it in safe place and don't leave on website!');
define('AI_STR_004', 'Path');
define('AI_STR_005', 'Created');
define('AI_STR_006', 'Modified');
define('AI_STR_007', 'Size');
define('AI_STR_008', 'PHP Info');
define('AI_STR_009', "Your password for AI-BOLIT is weak. Password must be more than 8 character length, contain both latin letters in upper and lower case, and digits. E.g. <b>%s</b>");
define('AI_STR_010', "Open AI-BOLIT with password specified in the beggining of file in PASS variable. <br/>E.g. http://you_website.com/ai-bolit.php?p=<b>%s</b>");
define('AI_STR_011', 'Current folder is not readable. Please change permission for <b>rwxr-xr-x</b> or using command line <b>chmod +r folder_name</b>');
define('AI_STR_012', "<div class="rep">%s malicious signatures known, %s virus signatures and other malicious code. Elapsed: <b>%s</b
>.<br/>Started: %s. Stopped: %s</div> ");
define('AI_STR_013', '<div class="rep">Scanned %s folders and %s files.</div>');
define('AI_STR_014', '<div class="rep" style="color: #0000A0">Attention! Script has performed quick scan. It scans only .html/.js/.php files in quick scan mode so some of malicious scripts might not be detected. <br>Please launch script from a command line thru SSH to perform full scan.');
define('AI_STR_015', '<div class="sec">Critical</div>');
define('AI_STR_016', 'Shell script signatures detected. Might be a malicious or hacker's script:');
define('AI_STR_017', 'Shell scripts signatures not detected.');
define('AI_STR_018', 'Javascript virus signatures detected:');
define('AI_STR_019', 'Unix executables signatures detected. They might be a malicious binaries or rootkits:');
define('AI_STR_020', 'Suspicious encoded strings, extra .php extention or external includes detected in PHP files. Might be a malicious or hacker's script:');
define('AI_STR_021', 'Might be a malicious or hacker's script:');
define('AI_STR_022', 'Symlinks:');
define('AI_STR_023', 'Hidden files:');
define('AI_STR_024', 'Files might be a part of doorway:');
define('AI_STR_025', 'Doorway folders not detected');
define('AI_STR_026', 'Warnings');
define('AI_STR_027', 'Malicious code in .htaccess (redirect to external server, extention handler replacement or malicious code auto-append):');
define('AI_STR_028', 'Non-PHP file has PHP signature. Check for malicious code:');
define('AI_STR_029', 'This script has black-SEO links or linkfarm. Check if it was installed by your:');
define('AI_STR_030', 'Reading error. Skipped.');
define('AI_STR_031', 'These files have invisible links, might be black-seo stuff:');
define('AI_STR_032', 'List of invisible links:');
define('AI_STR_033', 'Displayed first ');
define('AI_STR_034', 'Folders contained too many .php or .html files. Might be a doorway:');
define('AI_STR_035', 'Suspicious code detected. It's usually used in malicious scrips:');
define('AI_STR_036', 'The following list of files specified in .adirignore has been skipped:');
define('AI_STR_037', 'CMS found:');
define('AI_STR_038', 'Large files (greater than %s! Skipped:');
define('AI_STR_039', 'Files greater than %s not found');
define('AI_STR_040', 'Files recommended to be remove due to security reason:');
define('AI_STR_041', 'Potentially unsafe! Folders which are writable for scripts:');
define('AI_STR_042', 'Writable folders not found');
define('AI_STR_043', 'Memory used: ');
define('AI_STR_044', '<div id="igid" style="display: none;"><div class="sec">Add to ignore list</div><form name="ignore"><textarea name="list" style="width: 600px; height: 400px;"></textarea></form><div class="details">Copy and paste the following list into .aignore to eliminate these files from AI-BOLIT report.</div></div>');
define('AI_STR_045', '<div class="notice"><span class="vir">[!]</span> Ai-BOLIT is working in quick scan mode, only .php, .html, .htaccess files will be checked. Change the following setting 'scan_all_files' => 1 to perform full scanning.</b>. </div>');
define('AI_STR_046', '[x] close window');
define('AI_STR_047', '<div class="offer" id="ofr"><span style="font-size: 15px;"><a href="http://www.revisium.com/ru/order/" target="_blank">
We will protect your website against hackers and viruses with guarantee!</a></span><br/>
<p>We completely remove malicious software and scripts from your website, protect website against hackers, check servers for rootkits and suid-files, teach you how to keep your website secured. <a href="http://www.revisium.com/en/order/">Contact Us</a>');
define('AI_STR_048', '');
define('AI_STR_049', "Disclaimer: I'm not liable to you for any damages, including general, special, incidental or consequential damages arising out of the use or inability to use the script (including but not limited to loss of data or report being rendered inaccurate or failure of the script). There's no warranty for the program. Use at your own risk. ");
define('AI_STR_050', "I'm sincerely appreciate reports for any bugs you may found in the script. Please email me: <a href="mailto:audit@revisium.com">audit@revisium.com</a>.<p> Also I appriciate any reference to the script in your blog or forum posts. Thank you for the link to download page: <a href="http://revisium.com/aibo/">http://revisium.com/aibo/</a>");
define('AI_STR_051', 'Report for ');
define('AI_STR_052', 'Heuristic Analyzer has detected suspicious files. Check if they are malware.');
define('AI_STR_053', 'Function called by reference');
define('AI_STR_054', 'Suspected for obfuscated variables');
define('AI_STR_055', 'Suspected for $GLOBAL array usage');
define('AI_STR_056', 'Abnormal split of string');
define('AI_STR_057', 'Scanning has been done in simple mode. It is strongly recommended to perform scanning in "Expert" mode. See readme.txt for details.');
define('AI_STR_058', 'Phishing pages detected:');
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// This is signatures wrapped into base64.
$g_DBShe = unserialize(base64_decode("YTozMTI6e2k6MDtzOjg6IlpPQlVHVEVMIjtpOjE7czoxMzoiTWFnZWxhbmdDeWJlciI7aToyO3M6MTM6InByb2ZleG9yLmhlbGwiO2k6MztzOjIwOiI8IS0tQ09PS0lFIFVQREFURS0tPiI7aTo0O3M6OToiLy9yYXN0YS8vIjtpOjU7czo1NzoiJHBhcmFtMm1hc2suIilcPVtcPHFxPlwiXSguKj8pKD89W1w8cXE+XCJdIClbXDxxcT5cIl0vc2llIjtpOjY7czoxOToiKTsgJGkrKykkcmV0Lj1jaHIoJCI7aTo3O3M6Mjc6ImVyZWdfcmVwbGFjZSg8cT4mZW1haWwmPHE+LCI7aTo4O3M6MTM6Il1dKSk7fX1ldmFsKCQiO2k6OTtzOjMwOiJmd3JpdGUoZm9wZW4oZGlybmFtZShfX0ZJTEVfXykiO2k6MTA7czoxMToiQmFieV9EcmFrb24iO2k6MTE7czoyNDoiJGlzZXZhbGZ1bmN0aW9uYXZhaWxhYmxlIjtpOjEyO3M6MTU6Ik5ldEBkZHJlc3MgTWFpbCI7aToxMztzOjM0OiJQYXNzd29yZDo8cz4iLiRfUE9TVFs8cT5wYXNzd2Q8cT5dIjtpOjE0O3M6MTU6IkNyZWF0ZWQgQnkgRU1NQSI7aToxNTtzOjEyOiJHSUY4OUE7PD9waHAiO2k6MTY7czoyODoib1RhdDhEM0RzRTgnJn5oVTA2Q0NINTskZ1lTcSI7aToxNztzOjIwOiIkbWQ1PW1kNSgiJHJhbmRvbSIpOyI7aToxODtzOjY6IjN4cDFyMyI7aToxOTtzOjMyOiIkaW09c3Vic3RyKCR0eCwkcCsyLCRwMi0oJHArMikpOyI7aToyMDtzOjE1OiJOaW5qYVZpcnVzIEhlcmUiO2k6MjE7czoyMToiN1AxdGQrTldsaWFJL2hXa1o0Vlg5IjtpOjIyO3M6MTA6Ijxkb3Q+SXJJc1QiO2k6MjM7czoxMDoibmRyb2l8aHRjXyI7aToyNDtzOjEwOiJhbmRleHxvb2dsIjtpOjI1O3M6MTc6IkhhY2tlZCBCeSBFbkRMZVNzIjtpOjI2O3M6MTc6IigkX1BPU1RbImRpciJdKSk7IjtpOjI3O3M6NTU6IigkaW5kYXRhLCRiNjQ9MSl7aWYoJGI2ND09MSl7JGNkPWJhc2U2NF9kZWNvZGUoJGluZGF0YSkiO2k6Mjg7czo3NToiJGltPXN1YnN0cigkaW0sMCwkaSkuc3Vic3RyKCRpbSwkaTIrMSwkaTQtKCRpMisxKSkuc3Vic3RyKCRpbSwkaTQrMTIsc3RybGVuIjtpOjI5O3M6MTg6Ijw/cGhwIGVjaG8gIiMhISMiOyI7aTozMDtzOjEwOiJQdW5rZXIyQm90IjtpOjMxO3M6MTE6IiRzaDNsbENvbG9yIjtpOjMyO3M6NDc6IkBjaHIoKCRoWyRlWyRvXV08PDQpKygkaFskZVsrKyRvXV0pKTt9fWV2YWwoJGQpIjtpOjMzO3M6MzY6InBwY3xtaWRwfHdpbmRvd3MgY2V8bXRrfGoybWV8c3ltYmlhbiI7aTozNDtzOjQwOiJhYmFjaG98YWJpemRpcmVjdG9yeXxhYm91dHxhY29vbnxhbGV4YW5hIjtpOjM1O3M6NToiWmVkMHgiO2k6MzY7czo4OiJkYXJrbWlueiI7aTozNztzOjEzOiJSZWFMX1B1TmlTaEVyIjtpOjM4O3M6NzoiT29OX0JveSI7aTozOTtzOjIwOiJfX1ZJRVdTVEFURUVOQ1JZUFRFRCI7aTo0MDtzOjY6Ik00bGwzciI7aTo0MTtzOjI1OiJjcmVhdGVGaWxlc0ZvcklucHV0T3V0cHV0IjtpOjQyO3M6ODoiUGFzaGtlbGEiO2k6NDM7czoyMjoiXmNeYV5sXnBeZV5yXl9eZ15lXnJecCI7aTo0NDtzOjE0OiI9PSAiYmluZHNoZWxsIiI7aTo0NTtzOjE1OiJXZWJjb21tYW5kZXIgYXQiO2k6NDY7czoyNToiaXNzZXQoJF9QT1NUWydleGVjZ2F0ZSddKSI7aTo0NztzOjM3OiJmd3JpdGUoJGZwc2V0diwgZ2V0ZW52KCJIVFRQX0NPT0tJRSIpIjtpOjQ4O3M6MjA6Ii1JL3Vzci9sb2NhbC9iYW5kbWluIjtpOjQ5O3M6MjE6IiRPT08wMDAwMDA9dXJsZGVjb2RlKCI7aTo1MDtzOjg6IllFTkkzRVJJIjtpOjUxO3M6MTU6ImxldGFrc2VrYXJhbmcoKSI7aTo1MjtzOjY6ImQzbGV0ZSI7aTo1MztzOjQzOiJmdW5jdGlvbiB1cmxHZXRDb250ZW50cygkdXJsLCAkdGltZW91dCA9IDUpIjtpOjU0O3M6NDY6Im92ZXJmbG93LXk6c2Nyb2xsO1wiPiIuJGxpbmtzLiRodG1sX21mWydib2R5J10iO2k6NTU7czoxNjoiTWFkZSBieSBEZWxvcmVhbiI7aTo1NjtzOjc1OiJpZihlbXB0eSgkX0dFVFsnemlwJ10pIGFuZCBlbXB0eSgkX0dFVFsnZG93bmxvYWQnXSkgJiBlbXB0eSgkX0dFVFsnaW1nJ10pKXsiO2k6NTc7czo2NToic3RyX3JvdDEzKCRiYXNlYVsoJGRpbWVuc2lvbiokZGltZW5zaW9uLTEpIC0gKCRpKiRkaW1lbnNpb24rJGopXSkiO2k6NTg7czo2MDoiUjBsR09EbGhFd0FRQUxNQUFBQUFBUC8vLzV5Y0FNN09ZLy8vblAvL3p2L09uUGYzOS8vLy93QUFBQUFBIjtpOjU5O3M6NDU6InByZWdfbWF0Y2goJyFNSURQfFdBUHxXaW5kb3dzLkNFfFBQQ3xTZXJpZXM2MCI7aTo2MDtzOjQ3OiJwcmVnX21hdGNoKCcvKD88PVJld3JpdGVSdWxlKS4qKD89XFtMXCxSXD0zMDJcXSI7aTo2MTtzOjM3OiIkdXJsID0gJHVybHNbcmFuZCgwLCBjb3VudCgkdXJscyktMSldIjtpOjYyO3M6ODA6IndwX3Bvc3RzIFdIRVJFIHBvc3RfdHlwZSA9ICdwb3N0JyBBTkQgcG9zdF9zdGF0dXMgPSAncHVibGlzaCcgT1JERVIgQlkgYElEYCBERVNDIjtpOjYzO3M6NjU6Imh0dHA6Ly8nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS51cmxkZWNvZGUoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIjtpOjY0O3M6MzY6ImZ3cml0ZSgkZixnZXRfZG93bmxvYWQoJF9HRVRbJ3VybCddKSI7aTo2NTtzOjc0OiIkcGFyYW0geCAkbi5zdWJzdHIgKCRwYXJhbSwgbGVuZ3RoKCRwYXJhbSkgLSBsZW5ndGgoJGNvZGUpJWxlbmd0aCgkcGFyYW0pKSI7aTo2NjtzOjQ3OiIkdGltZV9zdGFydGVkLiRzZWN1cmVfc2Vzc2lvbl91c2VyLnNlc3Npb25faWQoKSI7aTo2NztzOjQ4OiIkdGhpcy0+Ri0+R2V0Q29udHJvbGxlcigkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkiO2k6Njg7czoyMToibHVjaWZmZXJAbHVjaWZmZXIub3JnIjtpOjY5O3M6Mjc6ImJhc2U2NF9kZWNvZGUoJGNvZGVfc2NyaXB0KSI7aTo3MDtzOjIxOiJ1bmxpbmsoJHdyaXRhYmxlX2RpcnMiO2k6NzE7czo0MToiZmlsZV9nZXRfY29udGVudHModHJpbSgkZlskX0dFVFsnaWQnXV0pKTsiO2k6NzI7czoxMDoiQ3liZXN0ZXI5MCI7aTo3MztzOjI3OiIvaG9tZS9teWRpci9lZ2dkcm9wL2ZpbGVzeXMiO2k6NzQ7czoyOToiLS1EQ0NESVIgW2xpbmRleCAkVXNlcigkaSkgMl0iO2k6NzU7czoxMjoidW5iaW5kIFJBVyAtIjtpOjc2O3M6MTE6InB1dGJvdCAkYm90IjtpOjc3O3M6MTM6InByaXZtc2cgJG5pY2siO2k6Nzg7czoyNjoicHJvYyBodHRwOjpDb25uZWN0IHt0b2tlbn0iO2k6Nzk7czo0Mzoic2V0IGdvb2dsZShkYXRhKSBbaHR0cDo6ZGF0YSAkZ29vZ2xlKHBhZ2UpXSI7aTo4MDtzOjIyOiJiaW5kIGpvaW4gLSAqIGdvcF9qb2luIjtpOjgxO3M6MTM6InByaXZtc2cgJGNoYW4iO2k6ODI7czoyNDoicjRhVGMuZFBudEUvZnp0U0YxYkgzUkgwIjtpOjgzO3M6MTA6ImJpbmQgZGNjIC0iO2k6ODQ7czozNToia2lsbCAtQ0hMRCBcJGJvdHBpZCA+L2Rldi9udWxsIDI+JjEiO2k6ODU7czo1MDoicmVnc3ViIC1hbGwgLS0gLCBbc3RyaW5nIHRvbG93ZXIgJG93bmVyXSAiIiBvd25lcnMiO2k6ODY7czozMDoiYmluZCBmaWx0IC0gIlwwMDFBQ1RJT04gKlwwMDEiIjtpOjg3O3M6Mjc6ImF5dSBwcjEgcHIyIHByMyBwcjQgcHI1IHByNiI7aTo4ODtzOjIwOiJzZXQgcHJvdGVjdC10ZWxuZXQgMCI7aTo4OTtzOjMzOiIvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQgLURTU0wiO2k6OTA7czo3NjoiJHRzdTJbcmFuZCgwLGNvdW50KCR0c3UyKSAtIDEpXS4kdHN1MVtyYW5kKDAsY291bnQoJHRzdTEpIC0gMSldLiR0c3UyW3JhbmQoMCI7aTo5MTtzOjE5OiJmb3BlbignL2V0Yy9wYXNzd2QnIjtpOjkyO3M6MTE6ImYwVk1SZ0VCQVFBIjtpOjkzO3M6MzU6IjBkMGEwZDBhNjc2YzZmNjI2MTZjMjAyNDZkNzk1ZjczNmQ3IjtpOjk0O3M6OToiZXRhbGZuaXpnIjtpOjk1O3M6Mzc6IkpIWnBjMmwwWTI5MWJuUWdQU0FrU0ZSVVVGOURUMDlMU1VWZlYiO2k6OTY7czoxMzoiZWRvY2VkXzQ2ZXNhYiI7aTo5NztzOjU6ImUvKi4vIjtpOjk4O3M6Mjg6IkBzZXRjb29raWUoImhpdCIsIDEsIHRpbWUoKSsiO2k6OTk7czo0NjoiZmluZF9kaXJzKCRncmFuZHBhcmVudF9kaXIsICRsZXZlbCwgMSwgJGRpcnMpOyI7aToxMDA7czo2OToiQGNvcHkoJF9GSUxFU1tmaWxlTWFzc11bdG1wX25hbWVdLCRfUE9TVFtwYXRoXS4kX0ZJTEVTW2ZpbGVNYXNzXVtuYW1lIjtpOjEwMTtzOjc2OiJpbnQzMigoKCR6ID4+IDUgJiAweDA3ZmZmZmZmKSBeICR5IDw8IDIpICsgKCgkeSA+PiAzICYgMHgxZmZmZmZmZikgXiAkeiA8PCA0IjtpOjEwMjtzOjExOiJWT0JSQSBHQU5HTyI7aToxMDM7czo1OToiZWNobyB5IDsgc2xlZXAgMSA7IH0gfCB7IHdoaWxlIHJlYWQgOyBkbyBlY2hvIHokUkVQTFk7IGRvbmUiO2k6MTA0O3M6OToiPHN0ZGxpYi5oIjtpOjEwNTtzOjQ1OiJhZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdfYmxvZ2luZm8nLCAxMDAwMSkiO2k6MTA2O3M6MTc6Iml0c29rbm9wcm9ibGVtYnJvIjtpOjEwNztzOjI4OiJpZiBzZWxmLmhhc2hfdHlwZSA9PSAncHdkdW1wIjtpOjEwODtzOjU5OiIkZnJhbWV3b3JrLnBsdWdpbnMubG9hZCgiI3tycGN0eXBlLmRvd25jYXNlfXJwYyIsIG9wdHMpLnJ1biI7aToxMDk7czo1Nzoic3VicHJvY2Vzcy5Qb3BlbignJXNnZGIgLXAgJWQgLWJhdGNoICVzJyAlIChnZGJfcHJlZml4LCBwIjtpOjExMDtzOjU3OiJhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1oZWxwLCBwcm9nPSJzY3R1bm5lbCIiO2k6MTExO3M6MzI6InJ1bGVfcmVxID0gcmF3X2lucHV0KCJTb3VyY2VGaXJlIjtpOjExMjtzOjUwOiJvcy5zeXN0ZW0oJ2VjaG8gYWxpYXMgbHM9Ii5scy5iYXNoIiA+PiB+Ly5iYXNocmMnKSI7aToxMTM7czo0MjoiY29ubmVjdGlvbi5zZW5kKCJzaGVsbCAiK3N0cihvcy5nZXRjd2QoKSkrIjtpOjExNDtzOjY3OiJwcmludCgiWyFdIEhvc3Q6ICIgKyBob3N0bmFtZSArICIgbWlnaHQgYmUgZG93biFcblshXSBSZXNwb25zZSBDb2RlIjtpOjExNTtzOjY5OiJkZWYgZGFlbW9uKHN0ZGluPScvZGV2L251bGwnLCBzdGRvdXQ9Jy9kZXYvbnVsbCcsIHN0ZGVycj0nL2Rldi9udWxsJykiO2k6MTE2O3M6ODM6InN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbCA9IFRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VIjtpOjExNztzOjQ3OiJpZihpc3NldCgkX0dFVFsnaG9zdCddKSYmaXNzZXQoJF9HRVRbJ3RpbWUnXSkpeyI7aToxMTg7czoxNToiTklHR0VSUy5OSUdHRVJTIjtpOjExOTtzOjI1OiJIVFRQIGZsb29kIGNvbXBsZXRlIGFmdGVyIjtpOjEyMDtzOjIxOiI4MCAtYiAkMSAtaSBldGgwIC1zIDgiO2k6MTIxO3M6MTM6ImV4cGxvaXRjb29raWUiO2k6MTIyO3M6MjY6InN5c3RlbSgicGhwIC1mIHhwbCAkaG9zdCIpIjtpOjEyMztzOjExOiJzaCBnbyAkMS4keCI7aToxMjQ7czoxMjoiYXo4OHBpeDAwcTk4IjtpOjEyNTtzOjMwOiJ1bmxlc3Mob3BlbihQRkQsJGdfdXBsb2FkX2RiKSkiO2k6MTI2O3M6MTE6Ind3dy50MHMub3JnIjtpOjEyNztzOjM5OiIkdmFsdWUgPX4gcy8lKC4uKS9wYWNrKCdjJyxoZXgoJDEpKS9lZzsiO2k6MTI4O3M6MTQ6IlRoZSBEYXJrIFJhdmVyIjtpOjEyOTtzOjYxOiJRM0psWkdsMElEb2dWVzVrWlhKbmNtOTFibVFnUkdWMmFXd2dKbTVpYzNBN0lDQjhEUW84WVNCb2NtVm1QIjtpOjEzMDtzOjI5OiJ9ZWxzZWlmKCRfR0VUWydwYWdlJ109PSdkZG9zJyI7aToxMzE7czoxNjoieyRfUE9TVFsncm9vdCddfSI7aToxMzI7czozOToiSS9nY1ovdlgwQTEwRERSRGc3RXprL2QrMys4cXZxcVMxSzArQVhZIjtpOjEzMztzOjY0OiJGSjNGa3VQS0ZrVS81M1dFQm1JYWlwa3RuTHdRVzh6NDlkYzFyYmJMcXN3OGU2OWw2dkpNKzMvMTI0eFZuKzdsIjtpOjEzNDtzOjEwMjoiXHUwMDNjXHUwMDY5XHUwMDZkXHUwMDY3XHUwMDIwXHUwMDczXHUwMDcyXHUwMDYzXHUwMDNkXHUwMDIyXHUwMDY4XHUwMDc0XHUwMDc0XHUwMDcwXHUwMDNhXHUwMDJmXHUwMDJmIjtpOjEzNTtzOjU1OiI0NjM4Mzk2MTBjMDAwYjAwODAwMTAwZmZmZmZmZmZmZmZmMjFmOTA0MDEwMDAwMDEwMDJjMDAwIjtpOjEzNjtzOjMwOiJmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWNoZXJvKSkiO2k6MTM3O3M6MjQ6IiRiYXNsaWs9JF9QT1NUWydiYXNsaWsnXSI7aToxMzg7czoxODoicHJvY19vcGVuKCdJSFN0ZWFtIjtpOjEzOTtzOjU2OiJceDMxXHhkYlx4ZjdceGUzXHg1M1x4NDNceDUzXHg2YVx4MDJceDg5XHhlMVx4YjBceDY2XHhjZCI7aToxNDA7czo1ODoiQUFBQUFBQUFNQUF3QUJBQUFBZUFVQUFEUUFBQURzQ1FBQUFBQUFBRFFBSUFBREFDZ0FGd0FVQUFFQSI7aToxNDE7czozMToiJGluaVsndXNlcnMnXSA9IGFycmF5KCdyb290JyA9PiI7aToxNDI7czo1ODoiSEozSGp1dGNrb1JmcFhmOUExelFPMkF3RFJyUmV5OXVHdlRlZXo3OXFBYW8xYTByZ3Vka1prUjhSYSI7aToxNDM7czo1MDoiY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgImh0dHA6Ly8kaG9zdDoyMDgyIikiO2k6MTQ0O3M6NjQ6IjwlPSAiXCIgJiBvU2NyaXB0TmV0LkNvbXB1dGVyTmFtZSAmICJcIiAmIG9TY3JpcHROZXQuVXNlck5hbWUgJT4iO2k6MTQ1O3M6MTA0OiJzcWxDb21tYW5kLlBhcmFtZXRlcnMuQWRkKCgoVGFibGVDZWxsKWRhdGFHcmlkSXRlbS5Db250cm9sc1swXSkuVGV4dCwgU3FsRGJUeXBlLkRlY2ltYWwpLlZhbHVlID0gZGVjaW1hbCI7aToxNDY7czo5MDoiUmVzcG9uc2UuV3JpdGUoIjxicj4oICkgPGEgaHJlZj0/dHlwZT0xJmZpbGU9IiAmIHNlcnZlci5VUkxlbmNvZGUoaXRlbS5wYXRoKSAmICJcPiIgJiBpdGVtIjtpOjE0NztzOjExMToibmV3IEZpbGVTdHJlYW0oUGF0aC5Db21iaW5lKGZpbGVJbmZvLkRpcmVjdG9yeU5hbWUsIFBhdGguR2V0RmlsZU5hbWUoaHR0cFBvc3RlZEZpbGUuRmlsZU5hbWUpKSwgRmlsZU1vZGUuQ3JlYXRlIjtpOjE0ODtzOjcxOiJSZXNwb25zZS5Xcml0ZShTZXJ2ZXIuSHRtbEVuY29kZSh0aGlzLkV4ZWN1dGVDb21tYW5kKHR4dENvbW1hbmQuVGV4dCkpKSI7aToxNDk7czo4MzoiPCU9UmVxdWVzdC5TZXJ2ZXJ2YXJpYWJsZXMoIlNDUklQVF9OQU1FIiklPj90eHRwYXRoPTwlPVJlcXVlc3QuUXVlcnlTdHJpbmcoInR4dHBhdGgiO2k6MTUwO3M6NjA6Im91dHN0ciArPSBzdHJpbmcuRm9ybWF0KCI8YSBocmVmPSc/ZmRpcj17MH0nPnsxfS88L2E+Jm5ic3A7IiI7aToxNTE7czo2MToiUU9pS1dBZ1Y2MTNMdnN0S1krVUI5OEpaVFJHSWhZQmRIdUpDQXdtK1h0aDE2QXdROFg0dFBNY01WWlF0ZSI7aToxNTI7czozMzoicmUuZmluZGFsbChkaXJ0KycoLiopJyxwcm9nbm0pWzBdIjtpOjE1MztzOjQwOiJmaW5kIC8gLW5hbWUgLnNzaCA+ICRkaXIvc3Noa2V5cy9zc2hrZXlzIjtpOjE1NDtzOjYwOiJGU19jaGtfZnVuY19saWJjPSggJChyZWFkZWxmIC1zICRGU19saWJjIHwgZ3JlcCBfY2hrQEAgfCBhd2siO2k6MTU1O3M6NDk6Ikx5ODNNVGczT1dReU1USmtZemhqWW1ZMFpEUm1aREEwTkdFelpERTNaamszWm1JMk4iO2k6MTU2O3M6OTU6IiRmaWxlID0gJF9GSUxFU1siZmlsZW5hbWUiXVsibmFtZSJdOyBlY2hvICI8YSBocmVmPVwiJGZpbGVcIj4kZmlsZTwvYT4iO30gZWxzZSB7ZWNobygiZW1wdHkiKTt9IjtpOjE1NztzOjQ4OiJESjdWSVU3UklDWHI2c0VFVjJjQnRIRFNPZTluVmRwRUdoRW12UlZSTlVSZncxd1EiO2k6MTU4O3M6NTE6Ikx6OF9MeTh2RHg4ZV92Ny03dTd1M3M3dXpzN096cTZ1bnE3ZXJxNnV2cTUtam82dWpuNSI7aToxNTk7czo4MzoiaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUlDQVlBQUFEQS1tNjJBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVUiO2k6MTYwO3M6NTE6InNlcnZlci48L3A+XHJcbjwvYm9keT48L2h0bWw+IjtleGl0O31pZihwcmVnX21hdGNoKCI7aToxNjE7czo3NzoiJEZjaG1vZCwkRmRhdGEsJE9wdGlvbnMsJEFjdGlvbiwkaGRkYWxsLCRoZGRmcmVlLCRoZGRwcm9jLCR1bmFtZSwkaWRkKTpzaGFyZWQiO2k6MTYyO3M6MTU6InBocCAiLiR3c29fcGF0aCI7aToxNjM7czo2MToiJHByb2Q9InN5Ii4icyIuInRlbSI7JGlkPSRwcm9kKCRfUkVRVUVTVFsncHJvZHVjdCddKTskeydpZCd9OyI7aToxNjQ7czozMDoiQGFzc2VydCgkX1JFUVVFU1RbJ1BIUFNFU1NJRCddIjtpOjE2NTtzOjY4OiJQT1NUIHskcGF0aH17JGNvbm5lY3Rvcn0/Q29tbWFuZD1GaWxlVXBsb2FkJlR5cGU9RmlsZSZDdXJyZW50Rm9sZGVyPSI7aToxNjY7czo4NzoiImFkbWluMS5waHAiLCAiYWRtaW4xLmh0bWwiLCAiYWRtaW4yLnBocCIsICJhZG1pbjIuaHRtbCIsICJ5b25ldGltLnBocCIsICJ5b25ldGltLmh0bWwiIjtpOjE2NztzOjk3OiJAcGF0aDE9KCdhZG1pbi8nLCdhZG1pbmlzdHJhdG9yLycsJ21vZGVyYXRvci8nLCd3ZWJhZG1pbi8nLCdhZG1pbmFyZWEvJywnYmItYWRtaW4vJywnYWRtaW5Mb2dpbi8nIjtpOjE2ODtzOjM2OiJjYXQgJHtibGtsb2dbMl19IHwgZ3JlcCAicm9vdDp4OjA6MCIiO2k6MTY5O3M6NDY6Ij91cmw9Jy4kX1NFUlZFUlsnSFRUUF9IT1NUJ10pLnVubGluayhST09UX0RJUi4iO2k6MTcwO3M6NDY6ImxvbmcgaW50OnQoMCwzKT1yKDAsMyk7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiO2k6MTcxO3M6NzU6ImNyZWF0ZV9mdW5jdGlvbigiJiQiLiJmdW5jdGlvbiIsIiQiLiJmdW5jdGlvbiA9IGNocihvcmQoJCIuImZ1bmN0aW9uKS0zKTsiKSI7aToxNzI7czo4NjoiZnVuY3Rpb24gZ29vZ2xlX2JvdCgpIHskc1VzZXJBZ2VudCA9IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKTtpZighKHN0cnAiO2k6MTczO3M6NzQ6ImNvcHkoJF9GSUxFU1sndXBrayddWyd0bXBfbmFtZSddLCJray8iLmJhc2VuYW1lKCRfRklMRVNbJ3Vwa2snXVsnbmFtZSddKSk7IjtpOjE3NDtzOjY3OiJmb3IgKCR2YWx1ZSkgeyBzLyYvJmFtcDsvZzsgcy88LyZsdDsvZzsgcy8+LyZndDsvZzsgcy8iLyZxdW90Oy9nOyB9IjtpOjE3NTtzOjQyOiIkZGJfZCA9IEBteXNxbF9zZWxlY3RfZGIoJGRhdGFiYXNlLCRjb24xKTsiO2k6MTc2O3M6NTE6IlNlbmQgdGhpcyBmaWxlOiA8SU5QVVQgTkFNRT0idXNlcmZpbGUiIFRZUEU9ImZpbGUiPiI7aToxNzc7czoyMjoiZndyaXRlICgkZnAsICIkeWF6aSIpOyI7aToxNzg7czo1MjoibWFwIHsgcmVhZF9zaGVsbCgkXykgfSAoJHNlbF9zaGVsbC0+Y2FuX3JlYWQoMC4wMSkpOyI7aToxNzk7czoyNzoiMj4mMSAxPiYyIiA6ICIgMT4mMSAyPiYxIik7IjtpOjE4MDtzOjU5OiJnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkb2xkX25hbWUsICRuYW1lLCI7aToxODE7czo2OToiX19hbGxfXyA9IFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJdIjtpOjE4MjtzOjI5OiJpZiAoaXNfZmlsZSgiL3RtcC8kZWtpbmNpIikpeyI7aToxODM7czozODoiaWYoJGNtZCAhPSAiIikgcHJpbnQgU2hlbGxfRXhlYygkY21kKTsiO2k6MTg0O3M6MjY6IiRjbWQgPSAoJF9SRVFVRVNUWydjbWQnXSk7IjtpOjE4NTtzOjU1OiIkdXBsb2FkZmlsZSA9ICRycGF0aC4iLyIgLiAkX0ZJTEVTWyd1c2VyZmlsZSddWyduYW1lJ107IjtpOjE4NjtzOjMzOiJpZiAoJGZ1bmNhcmcgPX4gL15wb3J0c2NhbiAoLiopLykiO2k6MTg3O3M6NDY6IjwlIEZvciBFYWNoIFZhcnMgSW4gUmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMgJT4iO2k6MTg4O3M6NDg6ImlmKCcnPT0oJGRmPUBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSl7ZWNobyI7aToxODk7czozODoiJGZpbGVuYW1lID0gJGJhY2t1cHN0cmluZy4iJGZpbGVuYW1lIjsiO2k6MTkwO3M6NTk6IjwlI0B+Xkh3QUFBQT09QCNAJkRua3dLeC9/Un9VTkAjQCZueDlQZDsoQCNAJnVnY0FBQT09XiN+QCU+IjtpOjE5MTtzOjI0OiIkZnVuY3Rpb24oJF9QT1NUWydjbWQnXSkiO2k6MTkyO3M6Mjk6ImVjaG8gIkZJTEUgVVBMT0FERUQgVE8gJGRleiI7IjtpOjE5MztzOjY4OiJpZiAoIUBpc19saW5rKCRmaWxlKSAmJiAoJHIgPSByZWFscGF0aCgkZmlsZSkpICE9IEZBTFNFKSAkZmlsZSA9ICRyOyI7aToxOTQ7czo4NzoiVU5JT04gU0VMRUNUICcwJyAsICc8PyBzeXN0ZW0oXCRfR0VUW2NwY10pO2V4aXQ7ID8+JyAsMCAsMCAsMCAsMCBJTlRPIE9VVEZJTEUgJyRvdXRmaWxlIjtpOjE5NTtzOjg5OiJpZihtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siZmljIl1bInRtcF9uYW1lIl0sZ29vZF9saW5rKCIuLyIuJF9GSUxFU1siZmljIl1bIm5hbWUiXSkpKSI7aToxOTY7czo3MjoiY29ubmVjdChTT0NLRVQsIHNvY2thZGRyX2luKCRBUkdWWzFdLCBpbmV0X2F0b24oJEFSR1ZbMF0pKSkgb3IgZGllIHByaW50IjtpOjE5NztzOjUyOiJlbHNlaWYoQGlzX3dyaXRhYmxlKCRGTikgJiYgQGlzX2ZpbGUoJEZOKSkgJHRtcE91dE1GIjtpOjE5ODtzOjY4OiJ3aGlsZSAoJHJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQsTVlTUUxfQVNTT0MpKSBwcmludF9yKCRyb3cpOyI7aToxOTk7czoxODoiJGZlKCIkY21kICAyPiYxIik7IjtpOjIwMDtzOjY5OiJzZW5kKFNPQ0s1LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3tvfSsrOzsiO2k6MjAxO3M6Njk6In0gZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pIFBSSVZNU0cgKC4rPykgXDooLispLykgeyI7aToyMDI7czozNzoiZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygic2hlbGxfZXhlYyIpKSI7aToyMDM7czo3MToic3lzdGVtKCIkY21kIDE+IC90bXAvY21kdGVtcCAyPiYxOyBjYXQgL3RtcC9jbWR0ZW1wOyBybSAvdG1wL2NtZHRlbXAiKTsiO2k6MjA0O3M6NTI6IiRfRklMRVNbJ3Byb2JlJ11bJ3NpemUnXSwgJF9GSUxFU1sncHJvYmUnXVsndHlwZSddKTsiO2k6MjA1O3M6ODc6IiRyYTQ0ICA9IHJhbmQoMSw5OTk5OSk7JHNqOTggPSAic2gtJHJhNDQiOyRtbCA9ICIkc2Q5OCI7JGE1ID0gJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddOyI7aToyMDY7czo2NjoibXlzcWxfcXVlcnkoIkNSRUFURSBUQUJMRSBgeHBsb2l0YCAoYHhwbG9pdGAgTE9OR0JMT0IgTk9UIE5VTEwpIik7IjtpOjIwNztzOjY2OiJwYXNzdGhydSggJGJpbmRpci4ibXlzcWxkdW1wIC0tdXNlcj0kVVNFUk5BTUUgLS1wYXNzd29yZD0kUEFTU1dPUkQiO2k6MjA4O3M6ODQ6IjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+U2NoZW1hPC9hPiI7aToyMDk7czo2MDoiaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkkc2hlbGxPdXQ9c3RyaXBzbGFzaGVzKCRzaGVsbE91dCk7IjtpOjIxMDtzOjQ3OiJpZiAoIWRlZmluZWQkcGFyYW17Y21kfSl7JHBhcmFte2NtZH09ImxzIC1sYSJ9OyI7aToyMTE7czoyMzoic2hlbGxfZXhlYygndW5hbWUgLWEnKTsiO2k6MjEyO3M6OTE6ImlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsYSddWyd0bXBfbmFtZSddLCAkY3VyZGlyLiIvIi4kX0ZJTEVTWydmaWxhJ11bJ25hbWUnXSkpIHsiO2k6MjEzO3M6ODM6ImlmIChlbXB0eSgkX1BPU1RbJ3dzZXInXSkpIHskd3NlciA9ICJ3aG9pcy5yaXBlLm5ldCI7fSBlbHNlICR3c2VyID0gJF9QT1NUWyd3c2VyJ107IjtpOjIxNDtzOjM2OiI8JT1lbnYucXVlcnlIYXNodGFibGUoInVzZXIubmFtZSIpJT4iO2k6MjE1O3M6NjE6IlB5U3lzdGVtU3RhdGUuaW5pdGlhbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydGllcygpLCBudWxsLCBhcmd2KTsiO2k6MjE2O3M6MzU6ImlmKCEkd2hvYW1pKSR3aG9hbWk9ZXhlYygid2hvYW1pIik7IjtpOjIxNztzOjM2OiJzaGVsbF9leGVjKCRfUE9TVFsnY21kJ10gLiAiIDI+JjEiKTsiO2k6MjE4O3M6NTM6IlBuVmxrV002MyFAI0AmZEt4fm5NRFdNfkR/L0Vzbn54fzZEQCNAJlB+fiw/blksV1B7UG9qIjtpOjIxOTtzOjI1OiIhJF9SRVFVRVNUWyJjOTlzaF9zdXJsIl0pIjtpOjIyMDtzOjYwOiIoZXJlZygnXltbOmJsYW5rOl1dKmNkW1s6Ymxhbms6XV0qJCcsICRfUkVRVUVTVFsnY29tbWFuZCddKSkiO2k6MjIxO3M6MjM6IiRsb2dpbj1AcG9zaXhfZ2V0dWlkKCk7IjtpOjIyMjtzOjM4OiJzeXN0ZW0oInVuc2V0IEhJU1RGSUxFOyB1bnNldCBTQVZFSElTVCI7aToyMjM7czozMToiPEhUTUw+PEhFQUQ+PFRJVExFPmNnaS1zaGVsbC5weSI7aToyMjQ7czozNjoiZXhlY2woIi9iaW4vc2giLCJzaCIsIi1pIiwoY2hhciopMCk7IjtpOjIyNTtzOjI2OiJuY2Z0cHB1dCAtdSAkZnRwX3VzZXJfbmFtZSI7aToyMjY7czoyOToiJGFbaGl0c10nKTsgXHJcbiNlbmRxdWVyeVxyXG4iO2k6MjI3O3M6MjM6Inske3Bhc3N0aHJ1KCRjbWQpfX08YnI+IjtpOjIyODtzOjQyOiIkYmFja2Rvb3ItPmNjb3B5KCRjZmljaGllciwkY2Rlc3RpbmF0aW9uKTsiO2k6MjI5O3M6NTk6IiRpemlubGVyMj1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJGZuYW1lKSwxMCw4KSwtNCk7IjtpOjIzMDtzOjUwOiJmb3IoOyRwYWRkcj1hY2NlcHQoQ0xJRU5ULCBTRVJWRVIpO2Nsb3NlIENMSUVOVCkgeyI7aToyMzE7czo4OiJBc21vZGV1cyI7aToyMzI7czozNzoicGFzc3RocnUoZ2V0ZW52KCJIVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyMzM7czozOToiJF9fX189QGd6aW5mbGF0ZSgkX19fXykpe2lmKGlzc2V0KCRfUE9TIjtpOjIzNDtzOjg1OiIkc3Viaj11cmxkZWNvZGUoJF9HRVRbJ3N1J10pOyRib2R5PXVybGRlY29kZSgkX0dFVFsnYm8nXSk7JHNkcz11cmxkZWNvZGUoJF9HRVRbJ3NkJ10pIjtpOjIzNTtzOjMyOiIka2E9Jzw/Ly9CUkUnOyRrYWthPSRrYS4nQUNLLy8/PiI7aToyMzY7czozMToiQ2F1dGFtIGZpc2llcmVsZSBkZSBjb25maWd1cmFyZSI7aToyMzc7czoxMjoiQlJVVEVGT1JDSU5HIjtpOjIzODtzOjE4OiJwd2QgPiBHZW5lcmFzaS5kaXIiO2k6MjM5O3M6NTY6InhoIC1zICIvdXNyL2xvY2FsL2FwYWNoZS9zYmluL2h0dHBkIC1EU1NMIiAuL2h0dHBkIC1tICQxIjtpOjI0MDtzOjQ4OiIkYT0oc3Vic3RyKHVybGVuY29kZShwcmludF9yKGFycmF5KCksMSkpLDUsMSkuYykiO2k6MjQxO3M6MjE6IiFAJF9DT09LSUVbJHNlc3NkdF9rXSI7aToyNDI7czo1ODoiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSI7aToyNDM7czo0NDoiY29weSgkX0ZJTEVTW3hdW3RtcF9uYW1lXSwkX0ZJTEVTW3hdW25hbWVdKSkiO2k6MjQ0O3M6NTQ6IiRNZXNzYWdlU3ViamVjdCA9IGJhc2U2NF9kZWNvZGUoJF9QT1NUWyJtc2dzdWJqZWN0Il0pOyI7aToyNDU7czoxNzoicmVuYW1lKCJ3c28ucGhwIiwiO2k6MjQ2O3M6ODg6IiRyZWRpcmVjdFVSTD0naHR0cDovLycuJHJTaXRlLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddO2lmKGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkiO2k6MjQ3O3M6NDA6IiRmaWxlcGF0aD1AcmVhbHBhdGgoJF9QT1NUWydmaWxlcGF0aCddKTsiO2k6MjQ4O3M6NDI6Ildvcmtlcl9HZXRSZXBseUNvZGUoJG9wRGF0YVsncmVjdkJ1ZmZlciddKSI7aToyNDk7czoyMToiRmFUYUxpc1RpQ3pfRnggRngyOVNoIjtpOjI1MDtzOjEzOiJ3NGNrMW5nIHNoZWxsIjtpOjI1MTtzOjIyOiJwcml2YXRlIFNoZWxsIGJ5IG00cmNvIjtpOjI1MjtzOjIwOiJTaGVsbCBieSBNYXdhcl9IaXRhbSI7aToyNTM7czoxMjoiUEhQU0hFTEwuUEhQIjtpOjI1NDtzOjQ2OiJyb3VuZCgwKzk4MzAuNCs5ODMwLjQrOTgzMC40Kzk4MzAuNCs5ODMwLjQpKT09IjtpOjI1NTtzOjExMDoidnp2NmQraU92dGtkMzhUbEh1OG1RYXZYZG5KQ2JwUWNwWGhOYmJMbVpPcU1vcERaZU5hbGIrVktsZWRoQ2pwVkFNUVNRbnhWSUVDUUFmTHU1S2dMbXdCNmVoUVFHTlNCWWpwZzlnNUdkQmloWG8iO2k6MjU2O3M6NjU6ImlmIChlcmVnKCdeW1s6Ymxhbms6XV0qY2RbWzpibGFuazpdXSsoW147XSspJCcsICRjb21tYW5kLCAkcmVncykpIjtpOjI1NztzOjc2OiJMUzBnUkhWdGNETmtJR0o1SUZCcGNuVnNhVzR1VUVoUUlGZGxZbk5vTTJ4c0lIWXhMakFnWXpCa1pXUWdZbmtnY2pCa2NqRWdPa3c9IjtpOjI1ODtzOjE0MjoiNWpiMjBpS1c5eUlITjBjbWx6ZEhJb0pISmxabVZ5WlhJc0ltRndiM0owSWlrZ2IzSWdjM1J5YVhOMGNpZ2tjbVZtWlhKbGNpd2libWxuYldFaUtTQnZjaUJ6ZEhKcGMzUnlLQ1J5WldabGNtVnlMQ0ozWldKaGJIUmhJaWtnYjNJZ2MzUnlhWE4wY2lnayI7aToyNTk7czoyMToiZXZhbChiYXNlNjRfZGVjb2RlKCRfIjtpOjI2MDtzOjQ4OiJ3c29FeCgndGFyIGNmenYgJyAuIGVzY2FwZXNoZWxsYXJnKCRfUE9TVFsncDInXSkiO2k6MjYxO3M6ODY6Ijxub2JyPjxiPiRjZGlyJGNmaWxlPC9iPiAoIi4kZmlsZVsic2l6ZV9zdHIiXS4iKTwvbm9icj48L3RkPjwvdHI+PGZvcm0gbmFtZT1jdXJyX2ZpbGU+IjtpOjI2MjtzOjE2OiJDb250ZW50LVR5cGU6ICRfIjtpOjI2MztzOjE0MToiPC90ZD48dGQgaWQ9ZmE+WyA8YSB0aXRsZT1cIkhvbWU6ICciLmh0bWxzcGVjaWFsY2hhcnMoc3RyX3JlcGxhY2UoIlwiLCAkc2VwLCBnZXRjd2QoKSkpLiInLlwiIGlkPWZhIGhyZWY9XCJqYXZhc2NyaXB0OlZpZXdEaXIoJyIucmF3dXJsZW5jb2RlIjtpOjI2NDtzOjEwNzoiQ1Fib0dsN2YreGNBeVV5c3hiNW1LUzZrQVdzblJMZFMrc0tnR29aV2Rzd0xGSlpWOHRWelhzcSttZVNQSE14VEkzblNVQjRmSjJ2UjNyM09udlh0TkFxTjZ3bi9EdFRUaStDdTFVT0p3TkwiO2k6MjY1O3M6Mzk6IldTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSI7aToyNjY7czoxMjY6IlgxTkZVMU5KVDA1YkozUjRkR0YxZEdocGJpZGRJRDBnZEhKMVpUc05DaUFnSUNCcFppQW9KRjlRVDFOVVd5ZHliU2RkS1NCN0RRb2dJQ0FnSUNCelpYUmpiMjlyYVdVb0ozUjRkR0YxZEdoZkp5NGtjbTFuY205MWNDd2diVyI7aToyNjc7czozOToiSkAhVnJAKiZSSFJ3fkpMdy5HfHhsaG5MSn4/MS5id09ieGJQfCFWIjtpOjI2ODtzOjExOiJ6ZWhpcmhhY2tlciI7aToyNjk7czoxNjE6IignIicsJyZxdW90OycsJGZuKSkuJyI7ZG9jdW1lbnQubGlzdC5zdWJtaXQoKTtcJz4nLmh0bWxzcGVjaWFsY2hhcnMoc3RybGVuKCRmbik+Zm9ybWF0P3N1YnN0cigkZm4sMCxmb3JtYXQtMykuJy4uLic6JGZuKS4nPC9hPicuc3RyX3JlcGVhdCgnICcsZm9ybWF0LXN0cmxlbigkZm4pIjtpOjI3MDtzOjE2MDoicHJpbnQoKGlzX3JlYWRhYmxlKCRmKSAmJiBpc193cml0ZWFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIudygxKS5mb250KCdyZWQnLCdSVycsMykpLncoMSk6KCgoaXNfcmVhZGFibGUoJGYpKT8iPHRyPjx0ZD4iLncoMSkuYigiUiIpLncoNCk6IiIpLigoaXNfd3JpdGFibCI7aToyNzE7czo3MzoiUjBsR09EbGhGQUFVQUtJQUFBQUFBUC8vLzkzZDNjREF3SWFHaGdRRUJQLy8vd0FBQUNINUJBRUFBQVlBTEFBQUFBQVVBQlFBQSI7aToyNzI7czo5MDoiPCU9UmVxdWVzdC5TZXJ2ZXJWYXJpYWJsZXMoInNjcmlwdF9uYW1lIiklPj9Gb2xkZXJQYXRoPTwlPVNlcnZlci5VUkxQYXRoRW5jb2RlKEZvbGRlci5Ecml2IjtpOjI3MztzOjExMzoibTkxZEN3Z0pHVnZkWFFwT3cwS2MyVnNaV04wS0NSeWIzVjBJRDBnSkhKcGJpd2dkVzVrWldZc0lDUmxiM1YwSUQwZ0pISnBiaXdnTVRJd0tUc05DbWxtSUNnaEpISnZkWFFnSUNZbUlDQWhKR1Z2ZFgiO2k6Mjc0O3M6Mzg6IlJvb3RTaGVsbCEnKTtzZWxmLmxvY2F0aW9uLmhyZWY9J2h0dHA6IjtpOjI3NTtzOjc2OiJhIGhyZWY9Ijw/ZWNobyAiJGZpc3Rpay5waHA/ZGl6aW49JGRpemluLy4uLyI/PiIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uIjtpOjI3NjtzOjEyNzoiQ0IyYVRacElERXdNalF0RFFvakxTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExRMEtJM0psY1hWcCI7aToyNzc7czozMToicygpLmcoKS5zKCkucygpLmcoKS5zKCkucygpLmcoKSI7aToyNzg7czoxMjI6Im50KShkaXNrX3RvdGFsX3NwYWNlKGdldGN3ZCgpKS8oMTAyNCoxMDI0KSkgLiAiTWIgIiAuICJGcmVlIHNwYWNlICIgLiAoaW50KShkaXNrX2ZyZWVfc3BhY2UoZ2V0Y3dkKCkpLygxMDI0KjEwMjQpKSAuICJNYiA8IjtpOjI3OTtzOjM3OiJrbGFzdmF5di5hc3A/eWVuaWRvc3lhPTwlPWFrdGlma2xhcyU+IjtpOjI4MDtzOjQ0OiJXVCtQe35FVzBFclBPdG5VQCNAJl5sXnNQMWxkbnlAI0AmbnNrK3IwLEdUKyI7aToyODE7czoxMTU6Im1wdHkoJF9QT1NUWyd1ciddKSkgJG1vZGUgfD0gMDQwMDsgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSAkbW9kZSB8PSAwMjAwOyBpZiAoIWVtcHR5KCRfUE9TVFsndXgnXSkpICRtb2RlIHw9IDAxMDAiO2k6MjgyO3M6MTA1OiIvMHRWU0cvU3V2MFVyL2hhVVlBZG4zak1Rd2Jib2NHZmZBZUMyOUJOOXRtQmlKZFYxbGsrallEVTkyQzk0amR0RGlmK3hPWWpHNkNMaHgzMVVvOXg5L2VBV2dzQks2MGtLMm1Md3F6cWQiO2k6MjgzO3M6ODY6ImNybGYuJ3VubGluaygkbmFtZSk7Jy4kY3JsZi4ncmVuYW1lKCJ+Ii4kbmFtZSwgJG5hbWUpOycuJGNybGYuJ3VubGluaygiZ3JwX3JlcGFpci5waHAiIjtpOjI4NDtzOjE1OiJEWF9IZWFkZXJfZHJhd24iO2k6Mjg1O3M6MzA6IltBdjRiZkNZQ1MseEtXayQrVGtVUyx4bkdkQXhbTyI7aToyODY7czoxMTE6IkJEQVFrSkNRd0xEQmdORFJneUlSd2hNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpML3dBQVJDQUFRQUJBREFTSUFBaEVCQSI7aToyODc7czoxMToiY3RzaGVsbC5waHAiO2k6Mjg4O3M6NDc6IkV4ZWN1dGVkIGNvbW1hbmQ6IDxiPjxmb250IGNvbG9yPSNkY2RjZGM+WyRjbWRdIjtpOjI4OTtzOjEzOiJXU0NSSVBULlNIRUxMIjtpOjI5MDtzOjc6ImNhc3VzMTUiO2k6MjkxO3M6NzY6IlIwbEdPRGxoSmdBV0FJQUFBQUFBQVAvLy95SDVCQVVVQUFFQUxBQUFBQUFtQUJZQUFBSXZqSStweSswUEY0aTBnVnZ6dVZ4WERub1EiO2k6MjkyO3M6MTc6ImFkbWluQHNweWdydXAub3JnIjtpOjI5MztzOjE0OiJ0ZW1wX3I1N190YWJsZSI7aToyOTQ7czoxNzoiJGM5OXNoX3VwZGF0ZWZ1cmwiO2k6Mjk1O3M6OToiQnkgUHN5Y2gwIjtpOjI5NjtzOjE2OiJjOTlmdHBicnV0ZWNoZWNrIjtpOjI5NztzOjg0OiI8dGV4dGFyZWEgbmFtZT1cInBocGV2XCIgcm93cz1cIjVcIiBjb2xzPVwiMTUwXCI+Ii5AJF9QT1NUWydwaHBldiddLiI8L3RleHRhcmVhPjxicj4iO2k6Mjk4O3M6OTQ6IiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/KCgkcGVybXMgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOigoJHBlcm1zICYgMHgwODAwKSA/ICdTJyA6ICctJykiO2k6Mjk5O3M6MzA6IiRyYW5kX3dyaXRhYmxlX2ZvbGRlcl9mdWxscGF0aCI7aTozMDA7czoxMDoiRHIuYWJvbGFsaCI7aTozMDE7czo2OiJLIUxMM3IiO2k6MzAyO3M6NzoiTXJIYXplbSI7aTozMDM7czoxMDoiQzBkZXJ6LmNvbSI7aTozMDQ7czoyNjoiT0xCOlBST0RVQ1Q6T05MSU5FX0JBTktJTkciO2k6MzA1O3M6MTA6IkJZIE1NTkJPQloiO2k6MzA2O3M6MTY6IkNvbm5lY3RCYWNrU2hlbGwiO2k6MzA3O3M6ODoiSGFja2VhZG8iO2k6MzA4O3M6NToiZDNiflgiO2k6MzA5O3M6NToicmFodWkiO2k6MzEwO3M6OToiTXIuSGlUbWFuIjtpOjMxMTtzOjEwOiJNcmxvb2wuZXhlIjt9"));
$gX_DBShe = unserialize(base64_decode("YTo0OTp7aTowO3M6MTU6IkRhcmtDcmV3RnJpZW5kcyI7aToxO3M6MTE6IlNpbUF0dGFja2VyIjtpOjI7czoxMjoiXVtyb3VuZCgwKV0oIjtpOjM7czozMjoiPCEtLSNleGVjIGNtZD0iJEhUVFBfQUNDRVBUIiAtLT4iO2k6NDtzOjQ6IkFtIXIiO2k6NTtzOjU6IjZlc2FiIjtpOjY7czo4OiJbY29kZXJ6XSI7aTo3O3M6MTE6IlsgUGhwcm94eSBdIjtpOjg7czo2OiJTcGFtZXIiO2k6OTtzOjc6IkRlZmFjZXIiO2k6MTA7czoxMToiRGV2aWxIYWNrZXIiO2k6MTE7czo3OiJ3ZWJyMDB0IjtpOjEyO3M6NjoiazBkLmNjIjtpOjEzO3M6NTU6ImlzX2NhbGxhYmxlKCdleGVjJykgYW5kICFpbl9hcnJheSgnZXhlYycsICRkaXNhYmxlZnVuY3MiO2k6MTQ7czoxNDoiJEdMT0JBTFNbJ19fX18iO2k6MTU7czoyMzoiaXNfd3JpdGFibGUoIi92YXIvdG1wIikiO2k6MTY7czoyMzoiZXZhbChmaWxlX2dldF9jb250ZW50cygiO2k6MTc7czozNDoiL3Byb2Mvc3lzL2tlcm5lbC95YW1hL3B0cmFjZV9zY29wZSI7aToxODtzOjQ5OiInaHR0cGQuY29uZicsJ3Zob3N0cy5jb25mJywnY2ZnLnBocCcsJ2NvbmZpZy5waHAnIjtpOjE5O3M6NzoiYnIwd3MzciI7aToyMDtzOjc6Im1pbHcwcm0iO2k6MjE7czozNjoiaW5jbHVkZSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pIjtpOjIyO3M6MTA6ImRpciAvT0cgL1giO2k6MjM7czozNDoiaWYgKCgkcGVybXMgJiAweEMwMDApID09IDB4QzAwMCkgeyI7aToyNDtzOjU5OiJpZiAoaXNfY2FsbGFibGUoImV4ZWMiKSBhbmQgIWluX2FycmF5KCJleGVjIiwkZGlzYWJsZWZ1bmMpKSI7aToyNTtzOjQwOiJzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fdXNlcm5hbWUiICk7IjtpOjI2O3M6MTk6InByaW50ICJTcGFtZWQnPjxicj4iO2k6Mjc7czo1MToiJG1lc3NhZ2UgPSBlcmVnX3JlcGxhY2UoIiU1QyUyMiIsICIlMjIiLCAkbWVzc2FnZSk7IjtpOjI4O3M6MTU6Ii9ldGMvbmFtZWQuY29uZiI7aToyOTtzOjEwOiIvZXRjL2h0dHBkIjtpOjMwO3M6MTE6Ii92YXIvY3BhbmVsIjtpOjMxO3M6MTg6Ik5lIHVkYWxvcyB6YWdydXppdCI7aTozMjtzOjE0OiJleGVjKCJybSAtciAtZiI7aTozMztzOjg6IlNoZWxsIE9rIjtpOjM0O3M6MTE6Im15c2hlbGxleGVjIjtpOjM1O3M6OToicm9vdHNoZWxsIjtpOjM2O3M6OToiYW50aXNoZWxsIjtpOjM3O3M6MTI6InI1N3NoZWxsLnBocCI7aTozODtzOjExOiJMb2N1czdTaGVsbCI7aTozOTtzOjExOiJTdG9ybTdTaGVsbCI7aTo0MDtzOjg6Ik4zdHNoZWxsIjtpOjQxO3M6MTE6ImRldmlselNoZWxsIjtpOjQyO3M6MTI6IldlYiBTaGVsbCBieSI7aTo0MztzOjc6IkZ4Yzk5c2giO2k6NDQ7czo4OiJjaWhzaGVsbCI7aTo0NTtzOjc6Ik5URGFkZHkiO2k6NDY7czo4OiJyNTdzaGVsbCI7aTo0NztzOjg6ImM5OXNoZWxsIjtpOjQ4O3M6NjI6IjxkaXYgY2xhc3M9ImJsb2NrIGJ0eXBlMSI+PGRpdiBjbGFzcz0iZHRvcCI+PGRpdiBjbGFzcz0iZGJ0bSI+Ijt9"));
$g_FlexDBShe = unserialize(base64_decode("YToyNzY6e2k6MDtzOjc5OiJSZXdyaXRlUnVsZVxzK1xeXChcLlwqXCksXChcLlwqXClcJFxzK1wkMlwucGhwXD9yZXdyaXRlX3BhcmFtcz1cJDEmcGFnZV91cmw9XCQyIjtpOjE7czo1ODoiZnVuY3Rpb25ccytyZWFkX3BpY1woXHMqXCRBXHMqXClccyp7XHMqXCRhXHMqPVxzKlwkX1NFUlZFUiI7aToyO3M6NTI6ImZpbGVtdGltZVwoXCRiYXNlcGF0aFxzKlwuXHMqWyciXS9jb25maWd1cmF0aW9uXC5waHAiO2k6MztzOjYyOiJsaXN0XHMqXChccypcJGhvc3RccyosXHMqXCRwb3J0XHMqLFxzKlwkc2l6ZVxzKixccypcJGV4ZWNfdGltZSI7aTo0O3M6NDE6Imxpc3RpbmdfcGFnZVwoXHMqbm90aWNlXChccypbJyJdc3ltbGlua2VkIjtpOjU7czozNToibWFrZV9kaXJfYW5kX2ZpbGVcKFxzKlwkcGF0aF9qb29tbGEiO2k6NjtzOjIxOiJmdW5jdGlvblxzK2luRGlhcGFzb24iO2k6NztzOjQxOiImJlxzKiFlbXB0eVwoXHMqXCRfQ09PS0lFXFtbJyJdZmlsbFsnIl1cXSI7aTo4O3M6MzM6ImZpbGVfZXhpc3RzXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aTo5O3M6NTk6InN0cl9yZXBsYWNlXChcJGZpbmRccyosXHMqXCRmaW5kXHMqXC5ccypcJGh0bWxccyosXHMqXCR0ZXh0IjtpOjEwO3M6MzY6IlwkZGF0YW1hc2lpPWRhdGVcKCJEIE0gZCwgWSBnOmkgYSJcKSI7aToxMTtzOjM0OiJcJGFkZGRhdGU9ZGF0ZVwoIkQgTSBkLCBZIGc6aSBhIlwpIjtpOjEyO3M6MTg6ImZ1Y2tccyt5b3VyXHMrbWFtYSI7aToxMztzOjUwOiJHb29nbGVib3RbJyJdezAsMX1ccypcKVwpe2VjaG9ccytmaWxlX2dldF9jb250ZW50cyI7aToxNDtzOjM3OiJbJyJdezAsMX0uYy5bJyJdezAsMX1cLnN1YnN0clwoXCR2YmcsIjtpOjE1O3M6Mjg6ImFycmF5XChcJGVuLFwkZXMsXCRlZixcJGVsXCkiO2k6MTY7czo0NjoibG9jXHMqPVxzKlsnIl17MCwxfTxcP2VjaG9ccytcJHJlZGlyZWN0O1xzKlw/PiI7aToxNztzOjE3OiJLYXphbi9pbmRleFwuaHRtbCI7aToxODtzOjE4OiI9PTBcKXtqc29uUXVpdFwoXCQiO2k6MTk7czo0MDoiQHN0cmVhbV9zb2NrZXRfY2xpZW50XChbJyJdezAsMX10Y3A6Ly9cJCI7aToyMDtzOjMwOiI6OlsnIl1cLnBocHZlcnNpb25cKFwpXC5bJyJdOjoiO2k6MjE7czozODoicHJlZ19yZXBsYWNlXChbJyJdLlVURlxcLTg6XCguXCpcKS5Vc2UiO2k6MjI7czoxMzoiIj0+XCR7XCR7IlxceCI7aToyMztzOjQyOiJmc29ja29wZW5cKFwkbVxbMFxdLFwkbVxbMTBcXSxcJF8sXCRfXyxcJG0iO2k6MjQ7czozMzoiZVZhTFwoXHMqdHJpbVwoXHMqYmFTZTY0X2RlQ29EZVwoIjtpOjI1O3M6NDY6ImVjaG9ccyptZDVcKFwkX1BPU1RcW1snIl17MCwxfWNoZWNrWyciXXswLDF9XF0iO2k6MjY7czoyNToiaW1nIHNyYz1bJyJdb3BlcmEwMDBcLnBuZyI7aToyNztzOjM3OiJmdW5jdGlvbiByZWxvYWRcKFwpe2hlYWRlclwoIkxvY2F0aW9uIjtpOjI4O3M6NDA6InN1YnN0cl9jb3VudFwoZ2V0ZW52XChcXFsnIl1IVFRQX1JFRkVSRVIiO2k6Mjk7czozMToid2ViaVwucnUvd2ViaV9maWxlcy9waHBfbGlibWFpbCI7aTozMDtzOjY1OiJjaHIyPVwoXChlbmMyJjE1XCk8PDRcKVx8XChlbmMzPj4yXCk7Y2hyMz1cKFwoZW5jMyYzXCk8PDZcKVx8ZW5jNCI7aTozMTtzOjEyOiJSRVJFRkVSX1BUVEgiO2k6MzI7czo5OiJ0c29oX3B0dGgiO2k6MzM7czoxNToidG5lZ2FfcmVzdV9wdHRoIjtpOjM0O3M6NDc6Im1tY3J5cHRcKFwkZGF0YSwgXCRrZXksIFwkaXYsIFwkZGVjcnlwdCA9IEZBTFNFIjtpOjM1O3M6MTM6ImZvcG9cLmNvbVwuYXIiO2k6MzY7czoyMDoic3ByYXZvY2huaWstbm9tZXJvdi0iO2k6Mzc7czoxODoiaWNxLWRseWEtdGVsZWZvbmEtIjtpOjM4O3M6MTc6InRlbGVmb25uYXlhLWJhemEtIjtpOjM5O3M6MjY6InNsZXNoXCtzbGVzaFwrZG9tZW5cK3BvaW50IjtpOjQwO3M6MjI6InNyYz0iZmlsZXNfc2l0ZS9qc1wuanMiO2k6NDE7czo5NToiXCR0PVwkcztccypcJG9ccyo9XHMqWyciXVsnIl07XHMqZm9yXChcJGk9MDtcJGk8c3RybGVuXChcJHRcKTtcJGlcK1wrXCl7XHMqXCRvXHMqXC49XHMqXCR0e1wkaX0iO2k6NDI7czo4MDoiV0JTX0RJUlxzKlwuXHMqWyciXXswLDF9dGVtcC9bJyJdezAsMX1ccypcLlxzKlwkYWN0aXZlRmlsZVxzKlwuXHMqWyciXXswLDF9XC50bXAiO2k6NDM7czo1MToiQCptYWlsXChcJG1vc0NvbmZpZ19tYWlsZnJvbSwgXCRtb3NDb25maWdfbGl2ZV9zaXRlIjtpOjQ0O3M6NjY6IlwkW2EtekEtWjAtOV9dKz8vXCouezEsMTB9XCovXHMqXC5ccypcJFthLXpBLVowLTlfXSs/L1wqLnsxLDEwfVwqLyI7aTo0NTtzOjE3OiJAXCRfUE9TVFxbXChjaHJcKCI7aTo0NjtzOjMzOiI8XD9waHBccytyZW5hbWVcKFsnIl13c29cLnBocFsnIl0iO2k6NDc7czo1MjoiXCRzdHI9WyciXXswLDF9PGgxPjQwM1xzK0ZvcmJpZGRlbjwvaDE+PCEtLVxzKnRva2VuOiI7aTo0ODtzOjUwOiJjaHVua19zcGxpdFwoYmFzZTY0X2VuY29kZVwoZnJlYWRcKFwke1wke1snIl17MCwxfSI7aTo0OTtzOjYwOiJpbmlfZ2V0XChbJyJdezAsMX1maWx0ZXJcLmRlZmF1bHRfZmxhZ3NbJyJdezAsMX1cKVwpe2ZvcmVhY2giO2k6NTA7czozODoiZmlsZV9nZXRfY29udGVudHNcKHRyaW1cKFwkZlxbXCRfR0VUXFsiO2k6NTE7czoxMzM6Im1haWxcKFwkYXJyXFtbJyJdezAsMX10b1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1zdWJqWyciXXswLDF9XF0sXCRhcnJcW1snIl17MCwxfW1zZ1snIl17MCwxfVxdLFwkYXJyXFtbJyJdezAsMX1oZWFkWyciXXswLDF9XF1cKTsiO2k6NTI7czo1NDoiaWZcKGlzc2V0XChcJF9QT1NUXFtbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XF1cKVwpIjtpOjUzO3M6MzU6ImJhc2U2NF9kZWNvZGVcKFwkX1BPU1RcW1snIl17MCwxfV8tIjtpOjU0O3M6NTM6InJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uXChccypbJyJdezAsMX1yZWFkX2Fuc19jb2RlIjtpOjU1O3M6NzU6IlwkcGFyYW1ccyo9XHMqXCRwYXJhbVxzKnhccypcJG5cLnN1YnN0clxzKlwoXCRwYXJhbVxzKixccypsZW5ndGhcKFwkcGFyYW1cKSI7aTo1NjtzOjI0OiJiYXNlWyciXXswLDF9XC5cKDMyXCoyXCkiO2k6NTc7czo2NjoiaWZcKEBcJHZhcnNcKGdldF9tYWdpY19xdW90ZXNfZ3BjXChcKVxzKlw/XHMqc3RyaXBzbGFzaGVzXChcJHVyaVwpIjtpOjU4O3M6Mjk6IlwpXF07fWlmXChpc3NldFwoXCRfU0VSVkVSXFtfIjtpOjU5O3M6NDI6ImlmXChlbXB0eVwoXCRfQ09PS0lFXFtbJyJdeFsnIl1cXVwpXCl7ZWNobyI7aTo2MDtzOjUyOiJpc193cml0YWJsZVwoXCRkaXJcLlsnIl13cC1pbmNsdWRlcy92ZXJzaW9uXC5waHBbJyJdIjtpOjYxO3M6MjE6IkFwcGxlXHMrU3BBbVxzK1JlWnVsVCI7aTo2MjtzOjE3OiIjXHMqc3RlYWx0aFxzKmJvdCI7aTo2MztzOjIyOiIjXHMqc2VjdXJpdHlzcGFjZVwuY29tIjtpOjY0O3M6Mjg6IlVSTD08XD9lY2hvXHMrXCRpbmRleDtccytcPz4iO2k6NjU7czo5NToiPHNjcmlwdFxzK3R5cGU9WyciXXswLDF9dGV4dC9qYXZhc2NyaXB0WyciXXswLDF9XHMrc3JjPVsnIl17MCwxfWpxdWVyeS11XC5qc1snIl17MCwxfT48L3NjcmlwdD4iO2k6NjY7czo1NzoiY3JlYXRlX2Z1bmN0aW9uXChbJyJdWyciXSxccypcJG9wdFxbMVxdXHMqXC5ccypcJG9wdFxbNFxdIjtpOjY3O3M6NTA6ImZpbGVfcHV0X2NvbnRlbnRzXChTVkNfU0VMRlxzKlwuXHMqWyciXS9cLmh0YWNjZXNzIjtpOjY4O3M6NTE6IlwkYWxsZW1haWxzXHMqPVxzKkBzcGxpdFwoIlxcbiJccyosXHMqXCRlbWFpbGxpc3RcKSI7aTo2OTtzOjE4OiJKb29tbGFfYnJ1dGVfRm9yY2UiO2k6NzA7czozODoiXCRzeXNfcGFyYW1zXHMqPVxzKkAqZmlsZV9nZXRfY29udGVudHMiO2k6NzE7czozNToiZndyaXRlXHMqXChccypcJGZsd1xzKixccypcJGZsXHMqXCkiO2k6NzI7czo4NjoiZmlsZV9wdXRfY29udGVudHNccypcKFsnIl17MCwxfTFcLnR4dFsnIl17MCwxfVxzKixccypwcmludF9yXHMqXChccypcJF9QT1NUXHMqLFxzKnRydWUiO2k6NzM7czo4MDoiXCRoZWFkZXJzXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1oZWFkZXJzWyciXXswLDF9XF0iO2k6NzQ7czo0NDoiY3JlYXRlX2Z1bmN0aW9uXHMqXChbJyJdWyciXVxzKixccypzdHJfcm90MTMiO2k6NzU7czozMzoiZGllXHMqXChccypQSFBfT1NccypcLlxzKmNoclxzKlwoIjtpOjc2O3M6NTU6ImlmXHMqXChtZDVcKHRyaW1cKFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6Nzc7czo0NDoiZlxzKj1ccypcJHFccypcLlxzKlwkYVxzKlwuXHMqXCRiXHMqXC5ccypcJHgiO2k6Nzg7czo0MToiY29udGVudD1bJyJdezAsMX0xO1VSTD1jZ2ktYmluXC5odG1sXD9jbWQiO2k6Nzk7czo2MzoiXCR1cmxbJyJdezAsMX1ccypcLlxzKlwkc2Vzc2lvbl9pZFxzKlwuXHMqWyciXXswLDF9L2xvZ2luXC5odG1sIjtpOjgwO3M6NjQ6IlwkX1NFU1NJT05cW1snIl17MCwxfXNlc3Npb25fcGluWyciXXswLDF9XF1ccyo9XHMqWyciXXswLDF9XCRQSU4iO2k6ODE7czo0MjoiZnNvY2tvcGVuXHMqXChccypcJENvbm5lY3RBZGRyZXNzXHMqLFxzKjI1IjtpOjgyO3M6NDc6ImVjaG9ccytcJGlmdXBsb2FkPVsnIl17MCwxfVxzKkl0c09rXHMqWyciXXswLDF9IjtpOjgzO3M6Nzc6InByZWdfbWF0Y2hcKFsnIl0vXCh5YW5kZXhcfGdvb2dsZVx8Ym90XCkvaVsnIl0sXHMqZ2V0ZW52XChbJyJdSFRUUF9VU0VSX0FHRU5UIjtpOjg0O3M6NTI6IlwkbWFpbGVyXHMqPVxzKlwkX1BPU1RcW1snIl17MCwxfXhfbWFpbGVyWyciXXswLDF9XF0iO2k6ODU7czo1NzoiXCRPT08wTzBPMDA9X19GSUxFX187XHMqXCRPTzAwTzAwMDBccyo9XHMqMHgxYjU0MDtccypldmFsIjtpOjg2O3M6MTI6IkJ5XHMrV2ViUm9vVCI7aTo4NztzOjgwOiJoZWFkZXJcKFsnIl17MCwxfXM6XHMqWyciXXswLDF9XHMqXC5ccypwaHBfdW5hbWVccypcKFxzKlsnIl17MCwxfW5bJyJdezAsMX1ccypcKSI7aTo4ODtzOjczOiJtb3ZlX3VwbG9hZGVkX2ZpbGVcKFwkX0ZJTEVTXFtbJyJdezAsMX1lbGlmWyciXXswLDF9XF1cW1snIl17MCwxfXRtcF9uYW1lIjtpOjg5O3M6NjI6IlwkZ3ppcFxzKj1ccypAKmd6aW5mbGF0ZVxzKlwoXHMqQCpzdWJzdHJccypcKFxzKlwkZ3plbmNvZGVfYXJnIjtpOjkwO3M6ODM6ImlmXHMqXChccyptYWlsXHMqXChccypcJG1haWxzXFtcJGlcXVxzKixccypcJHRlbWFccyosXHMqYmFzZTY0X2VuY29kZVxzKlwoXHMqXCR0ZXh0IjtpOjkxO3M6ODQ6ImZ3cml0ZVxzKlwoXHMqXCRmaFxzKixccypzdHJpcHNsYXNoZXNccypcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5MjtzOjk0OiJlY2hvXHMrZmlsZV9nZXRfY29udGVudHNccypcKFxzKmJhc2U2NF91cmxfZGVjb2RlXHMqXChccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjkzO3M6NjA6ImlmXHMqXChccypAKm1kNVxzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo5NDtzOjk5OiJjaHJccypcKFxzKjEwMVxzKlwpXHMqXC5ccypjaHJccypcKFxzKjExOFxzKlwpXHMqXC5ccypjaHJccypcKFxzKjk3XHMqXClccypcLlxzKmNoclxzKlwoXHMqMTA4XHMqXCkiO2k6OTU7czoxNTI6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtbJyJdezAsMX1bYS16QS1aMC05X10rP1snIl17MCwxfVxdXChccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9W2EtekEtWjAtOV9dKz9bJyJdezAsMX1cXVxzKlwpIjtpOjk2O3M6NzU6IlwkcmVzdWx0RlVMXHMqPVxzKnN0cmlwY3NsYXNoZXNccypcKFxzKlwkX1BPU1RcW1snIl17MCwxfXJlc3VsdEZVTFsnIl17MCwxfSI7aTo5NztzOjE1OiIvdXNyL3NiaW4vaHR0cGQiO2k6OTg7czozMjoiUFJJVk1TR1wuXCo6XC5vd25lclxcc1wrXChcLlwqXCkiO2k6OTk7czo4MzoicHJpbnRccytcJHNvY2tccytbJyJdezAsMX1OSUNLIFsnIl17MCwxfVxzK1wuXHMrXCRuaWNrXHMrXC5ccytbJyJdezAsMX1cXG5bJyJdezAsMX0iO2k6MTAwO3M6ODA6IlwkdXJsXHMqPVxzKlwkdXJsXHMqXC5ccypbJyJdezAsMX1cP1snIl17MCwxfVxzKlwuXHMqaHR0cF9idWlsZF9xdWVyeVwoXCRxdWVyeVwpIjtpOjEwMTtzOjEyMzoicHJlZ19tYXRjaF9hbGxcKFsnIl17MCwxfS88YSBocmVmPSJcXC91cmxcXFw/cT1cKFwuXCtcP1wpXFsmXHwiXF1cKy9pc1snIl17MCwxfSwgXCRwYWdlXFtbJyJdezAsMX1leGVbJyJdezAsMX1cXSwgXCRsaW5rc1wpIjtpOjEwMjtzOjEwMToiPHNjcmlwdFxzK2xhbmd1YWdlPVsnIl17MCwxfUphdmFTY3JpcHRbJyJdezAsMX0+XHMqcGFyZW50XC53aW5kb3dcLm9wZW5lclwubG9jYXRpb25ccyo9XHMqWyciXWh0dHA6Ly8iO2k6MTAzO3M6Nzc6IlwkcFxzKj1ccypzdHJwb3NccypcKFxzKlwkdHhccyosXHMqWyciXXswLDF9eyNbJyJdezAsMX1ccyosXHMqXCRwMlxzKlwrXHMqMlwpIjtpOjEwNDtzOjE1OiJcKG1zaWVcfG9wZXJhXCkiO2k6MTA1O3M6NDk6IlJld3JpdGVDb25kXHMqJXtIVFRQX1VTRVJfQUdFTlR9XHMqXC5cKm5kcm9pZFwuXCoiO2k6MTA2O3M6OTk6ImlmXHMqXChccyppc19kaXJccypcKFxzKlwkRnVsbFBhdGhccypcKVxzKlwpXHMqQWxsRGlyXHMqXChccypcJEZ1bGxQYXRoXHMqLFxzKlwkRmlsZXNccypcKTtccyp9XHMqfSI7aToxMDc7czoxNjc6IlsnIl17MCwxfUZyb206XHMqWyciXXswLDF9XC5cJF9QT1NUXFtbJyJdezAsMX1yZWFsbmFtZVsnIl17MCwxfVxdXC5bJyJdezAsMX0gWyciXXswLDF9XC5bJyJdezAsMX0gPFsnIl17MCwxfVwuXCRfUE9TVFxbWyciXXswLDF9ZnJvbVsnIl17MCwxfVxdXC5bJyJdezAsMX0+XFxuWyciXXswLDF9IjtpOjEwODtzOjUzOiI8IS0tI2V4ZWNccytjbWQ9WyciXXswLDF9XCRIVFRQX0FDQ0VQVFsnIl17MCwxfVxzKi0tPiI7aToxMDk7czoyNjoiXFstXF1ccytDb25uZWN0aW9uXHMrZmFpbGQiO2k6MTEwO3M6NjM6ImlmXCgvXF5cXDpcJG93bmVyIVwuXCpcXEBcLlwqUFJJVk1TR1wuXCo6XC5tc2dmbG9vZFwoXC5cKlwpL1wpeyI7aToxMTE7czozNDoicHJpbnRccypcJHNvY2sgIlBSSVZNU0cgIlwuXCRvd25lciI7aToxMTI7czo2NDoiXF09WyciXXswLDF9aXBbJyJdezAsMX1ccyo7XHMqaWZccypcKFxzKmlzc2V0XHMqXChccypcJF9TRVJWRVJcWyI7aToxMTM7czo1MToiXF1ccyp9XHMqPVxzKnRyaW1ccypcKFxzKmFycmF5X3BvcFxzKlwoXHMqXCR7XHMqXCR7IjtpOjExNDtzOjMwOiJwcmludFwoIiNccytpbmZvXHMrT0tcXG5cXG4iXCkiO2k6MTE1O3M6MTEyOiJcJHVzZXJfYWdlbnRccyo9XHMqcHJlZ19yZXBsYWNlXHMqXChccypbJyJdXHxVc2VyXFxcLkFnZW50XFw6XFtcXHMgXF1cP1x8aVsnIl1ccyosXHMqWyciXVsnIl1ccyosXHMqXCR1c2VyX2FnZW50IjtpOjExNjtzOjcxOiJcJHBccyo9XHMqc3RycG9zXChcJHR4XHMqLFxzKlsnIl17MCwxfXsjWyciXXswLDF9XHMqLFxzKlwkcDJccypcK1xzKjJcKSI7aToxMTc7czo5MjoiY3JlYXRlX2Z1bmN0aW9uXHMqXChccypbJyJdXCRtWyciXVxzKixccypbJyJdaWZccypcKFxzKlwkbVxzKlxbXHMqMHgwMVxzKlxdXHMqPT1ccypbJyJdTFsnIl0iO2k6MTE4O3M6ODk6IlwkbGV0dGVyXHMqPVxzKnN0cl9yZXBsYWNlXHMqXChccypcJEFSUkFZXFswXF1cW1wkalxdXHMqLFxzKlwkYXJyXFtcJGluZFxdXHMqLFxzKlwkbGV0dGVyIjtpOjExOTtzOjk6IklySXNUXC5JciI7aToxMjA7czo0NjoiaWZccypcKGRldGVjdF9tb2JpbGVfZGV2aWNlXChcKVwpXHMqe1xzKmhlYWRlciI7aToxMjE7czozMjoiXCRwb3N0XHMqPVxzKlsnIl1cXHg3N1xceDY3XFx4NjUiO2k6MTIyO3M6Mjc6ImVjaG9ccypbJyJdYW5zd2VyPWVycm9yWyciXSI7aToxMjM7czozNDoidXJsPTxcP3BocFxzKmVjaG9ccypcJHJhbmRfdXJsO1w/PiI7aToxMjQ7czo0NToiaWZcKENoZWNrSVBPcGVyYXRvclwoXClccyomJlxzKiFpc01vZGVtXChcKVwpIjtpOjEyNTtzOjU5OiJzdHJwb3NcKFwkdWEsXHMqWyciXXswLDF9eWFuZGV4Ym90WyciXXswLDF9XClccyohPT1ccypmYWxzZSI7aToxMjY7czoxMzQ6ImlmXHMqXChcJGtleVxzKiE9XHMqWyciXXswLDF9bWFpbF90b1snIl17MCwxfVxzKiYmXHMqXCRrZXlccyohPVxzKlsnIl17MCwxfXNtdHBfc2VydmVyWyciXXswLDF9XHMqJiZccypcJGtleVxzKiE9XHMqWyciXXswLDF9c210cF9wb3J0IjtpOjEyNztzOjUyOiJlY2hvWyciXXswLDF9PGNlbnRlcj48Yj5Eb25lXHMqPT0+XHMqXCR1c2VyZmlsZV9uYW1lIjtpOjEyODtzOjE1OiJbJyJdZS9cKlwuL1snIl0iO2k6MTI5O3M6Mjg6ImFzc2VydFxzKlwoXHMqQCpzdHJpcHNsYXNoZXMiO2k6MTMwO3M6NTE6IlwpXHMqXC5ccypzdWJzdHJccypcKFxzKm1kNVxzKlwoXHMqc3RycmV2XHMqXChccypcJCI7aToxMzE7czo2NToiXCRmbFxzKj1ccyoiPG1ldGEgaHR0cC1lcXVpdj1cXCJSZWZyZXNoXFwiXHMrY29udGVudD1cXCIwO1xzKlVSTD0iO2k6MTMyO3M6OTA6IixccyphcnJheVxzKlwoJ1wuJywnXC5cLicsJ1RodW1ic1wuZGInXClccypcKVxzKlwpXHMqe1xzKmNvbnRpbnVlO1xzKn1ccyppZlxzKlwoXHMqaXNfZmlsZSI7aToxMzM7czo4MzoiaWZccypcKFxzKlwkZGF0YVNpemVccyo8XHMqQk9UQ1JZUFRfTUFYX1NJWkVccypcKVxzKnJjNFxzKlwoXHMqXCRkYXRhLFxzKlwkY3J5cHRrZXkiO2k6MTM0O3M6MTc4OiJpZlxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cGF0aFsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1bJyJdezAsMX1ccypcKVxzKntccypcJHVwbG9hZGZpbGVccyo9XHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9bmFtZVsnIl17MCwxfVxzKlxdIjtpOjEzNTtzOjk5OiJpZlxzKlwoXHMqZndyaXRlXHMqXChccypcJGhhbmRsZVxzKixccypmaWxlX2dldF9jb250ZW50c1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTM2O3M6ODk6ImFycmF5X2tleV9leGlzdHNccypcKFxzKlwkZmlsZVJhc1xzKixccypcJGZpbGVUeXBlXClccypcP1xzKlwkZmlsZVR5cGVcW1xzKlwkZmlsZVJhc1xzKlxdIjtpOjEzNztzOjY1OiJ1cmxlbmNvZGVcKHByaW50X3JcKGFycmF5XChcKSwxXClcKSw1LDFcKVwuY1wpLFwkY1wpO31ldmFsXChcJGRcKSI7aToxMzg7czo0NDoiaWZccypcKFxzKmZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqJ3BjbnRsX2ZvcmsiO2k6MTM5O3M6NDM6ImZpbmRccysvXHMrLXR5cGVccytmXHMrLXBlcm1ccystMDQwMDBccystbHMiO2k6MTQwO3M6NzE6ImV4ZWNsXChbJyJdL2Jpbi9zaFsnIl1ccyosXHMqWyciXS9iaW4vc2hbJyJdXHMqLFxzKlsnIl0taVsnIl1ccyosXHMqMFwpIjtpOjE0MTtzOjQxOiJmdW5jdGlvblxzK2luamVjdFwoXCRmaWxlLFxzKlwkaW5qZWN0aW9uPSI7aToxNDI7czozODoiZmNsb3NlXChcJGZcKTtccyplY2hvXHMqWyciXW9cLmtcLlsnIl0iO2k6MTQzO3M6OTI6InByZWdfcmVwbGFjZVxzKlwoXHMqXCRleGlmXFtccypcXFsnIl1NYWtlXFxbJyJdXHMqXF1ccyosXHMqXCRleGlmXFtccypcXFsnIl1Nb2RlbFxcWyciXVxzKlxdIjtpOjE0NDtzOjcyOiJcXmRvd25sb2Fkcy9cKFxbMC05XF1cKlwpL1woXFswLTlcXVwqXCkvXCRccytkb3dubG9hZHNcLnBocFw/Yz1cJDEmcD1cJDIiO2k6MTQ1O3M6ODE6IlwkcmVzPW15c3FsX3F1ZXJ5XChbJyJdezAsMX1TRUxFQ1RccytcKlxzK0ZST01ccytgd2F0Y2hkb2dfb2xkXzA1YFxzK1dIRVJFXHMrcGFnZSI7aToxNDY7czo1MjoiUmV3cml0ZVJ1bGVccytcLlwqXHMraW5kZXhcLnBocFw/dXJsPVwkMFxzK1xbTCxRU0FcXSI7aToxNDc7czoxMDA6IklPOjpTb2NrZXQ6OklORVQtPm5ld1woUHJvdG9ccyo9PlxzKiJ0Y3AiXHMqLFxzKkxvY2FsUG9ydFxzKj0+XHMqMzYwMDBccyosXHMqTGlzdGVuXHMqPT5ccypTT01BWENPTk4iO2k6MTQ4O3M6Mzk6ImV2YWxccypcKCpccypzdHJyZXZccypcKCpccypzdHJfcmVwbGFjZSI7aToxNDk7czoyMTM6IkAqbW92ZV91cGxvYWRlZF9maWxlXHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkc2VjdXJpdHlfY29kZVxzKlwuXHMqIi8iXHMqXC5ccypcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKSI7aToxNTA7czo4MjoiXCRVUkxccyo9XHMqXCR1cmxzXFtccypyYW5kXChccyowXHMqLFxzKmNvdW50XHMqXChccypcJHVybHNccypcKVxzKi1ccyoxXHMqXClccypcXSI7aToxNTE7czoyMzI6Imlzc2V0XHMqXChccypcJF9GSUxFU1xbXHMqWyciXXswLDF9eFsnIl17MCwxfVxzKlxdXHMqXClccypcP1xzKlwoXHMqaXNfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1xzKlsnIl17MCwxfXhbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKlwpXHMqXD9ccypcKFxzKmNvcHlccypcKFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX14WyciXXswLDF9XHMqXF0iO2k6MTUyO3M6ODc6ImlmXHMqXChccypcJGlccyo8XHMqXChccypjb3VudFxzKlwoXHMqXCRfUE9TVFxbXHMqWyciXXswLDF9cVsnIl17MCwxfVxzKlxdXHMqXClccyotXHMqMSI7aToxNTM7czo3MDoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypBRE1JTl9SRURJUl9VUkxccyosXHMqZmFsc2VccyosXHMqXCRjdHhccypcKSI7aToxNTQ7czoxMjoidG1oYXBiemNlcmZmIjtpOjE1NTtzOjk3OiJjb250ZW50PVsnIl17MCwxfW5vLWNhY2hlWyciXXswLDF9O1xzKlwkY29uZmlnXFtbJyJdezAsMX1kZXNjcmlwdGlvblsnIl17MCwxfVxdXHMqXC49XHMqWyciXXswLDF9IjtpOjE1NjtzOjc0OiJjbGVhcnN0YXRjYWNoZVwoXHMqXCk7XHMqaWZccypcKFxzKiFpc19kaXJccypcKFxzKlwkZmxkXHMqXClccypcKVxzKnJldHVybiI7aToxNTc7czo5NzoiXCRyQnVmZkxlblxzKj1ccypvcmRccypcKFxzKlZDX0RlY3J5cHRccypcKFxzKmZyZWFkXHMqXChccypcJGlucHV0LFxzKjFccypcKVxzKlwpXHMqXClccypcKlxzKjI1NiI7aToxNTg7czo5OiJJclNlY1RlYW0iO2k6MTU5O3M6NzM6IkBoZWFkZXJcKFsnIl1Mb2NhdGlvbjpccypbJyJdXC5bJyJdaFsnIl1cLlsnIl10WyciXVwuWyciXXRbJyJdXC5bJyJdcFsnIl0iO2k6MTYwO3M6Njc6InNldF90aW1lX2xpbWl0XHMqXChccyowXHMqXCk7XHMqaWZccypcKCFTZWNyZXRQYWdlSGFuZGxlcjo6Y2hlY2tLZXkiO2k6MTYxO3M6MTA2OiJyZXR1cm5ccypcKFxzKnN0cnN0clxzKlwoXHMqXCRzXHMqLFxzKidlY2hvJ1xzKlwpXHMqPT1ccypmYWxzZVxzKlw/XHMqXChccypzdHJzdHJccypcKFxzKlwkc1xzKixccyoncHJpbnQnIjtpOjE2MjtzOjc1OiJ0aW1lXChcKVxzKlwrXHMqMTAwMDBccyosXHMqWyciXS9bJyJdXCk7XHMqZWNob1xzK1wkbV96ejtccypldmFsXHMqXChcJG1fenoiO2k6MTYzO3M6MTQ1OiJpZlwoIWVtcHR5XChcJF9GSUxFU1xbWyciXXswLDF9bWVzc2FnZVsnIl17MCwxfVxdXFtbJyJdezAsMX1uYW1lWyciXXswLDF9XF1cKVxzK0FORFxzK1wobWQ1XChcJF9QT1NUXFtbJyJdezAsMX1uaWNrWyciXXswLDF9XF1cKVxzKj09XHMqWyciXXswLDF9IjtpOjE2NDtzOjQ3OiJzdHJfcm90MTNccypcKFxzKmd6aW5mbGF0ZVxzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNjU7czo1MDoiZ3p1bmNvbXByZXNzXHMqXChccypzdHJfcm90MTNccypcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTY2O3M6NTA6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZVxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2NztzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cl9yb3QxM1xzKlwoXHMqc3RycmV2IjtpOjE2ODtzOjYxOiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldlxzKlwoXHMqc3RyX3JvdDEzIjtpOjE2OTtzOjQ0OiJnemluZmxhdGVccypcKFxzKmJhc2U2NF9kZWNvZGVccypcKFxzKnN0cnJldiI7aToxNzA7czo2ODoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTcxO3M6NTQ6ImJhc2U2NF9kZWNvZGVccypcKFxzKmd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToxNzI7czo0NzoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypzdHJfcm90MTMiO2k6MTczO3M6NDc6Imd6aW5mbGF0ZVxzKlwoXHMqc3RyX3JvdDEzXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjE3NDtzOjE3OiJCcmF6aWxccytIYWNrVGVhbSI7aToxNzU7czo2MDoiXCR0bGRccyo9XHMqYXJyYXlccypcKFxzKlsnIl1jb21bJyJdLFsnIl1vcmdbJyJdLFsnIl1uZXRbJyJdIjtpOjE3NjtzOjQ1OiJkZWZpbmVccypcKCpccypbJyJdU0JDSURfUkVRVUVTVF9GSUxFWyciXVxzKiwiO2k6MTc3O3M6MzQ6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl0vXC5cKy9lc2kiO2k6MTc4O3M6MTc6Ik15c3RlcmlvdXNccytXaXJlIjtpOjE3OTtzOjUxOiJcJGhlYWRlcnNccypcLj1ccypcJF9QT1NUXFtccypbJyJdZU1haWxBZGRbJyJdXHMqXF0iO2k6MTgwO3M6MzM6ImRlZmluZVxzKlwoXHMqWyciXURFRkNBTExCQUNLTUFJTCI7aToxODE7czo0NzoiZGVmYXVsdF9hY3Rpb25ccyo9XHMqWyciXXswLDF9RmlsZXNNYW5bJyJdezAsMX0iO2k6MTgyO3M6Mzg6ImVjaG9ccytAZmlsZV9nZXRfY29udGVudHNccypcKFxzKlwkZ2V0IjtpOjE4MztzOjE1NjoiaWZccypcKFxzKnN0cmlwb3NccypcKFxzKlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF1ccyosXHMqWyciXXswLDF9QW5kcm9pZFsnIl17MCwxfVwpXHMqIT09ZmFsc2VccyomJlxzKiFcJF9DT09LSUVcW1snIl17MCwxfWRsZV91c2VyX2lkIjtpOjE4NDtzOjYwOiJoZWFkZXJccypcKFsnIl1Mb2NhdGlvbjpccypbJyJdXHMqXC5ccypcJHRvXHMqXC5ccyp1cmxkZWNvZGUiO2k6MTg1O3M6MTA6IkRjMFJIYVsnIl0iO2k6MTg2O3M6MzY6IiF0b3VjaFwoWyciXXswLDF9XC5cLi9cLlwuL2xhbmd1YWdlLyI7aToxODc7czozODoiZXZhbFwoXHMqc3RyaXBzbGFzaGVzXChccypcXFwkX1JFUVVFU1QiO2k6MTg4O3M6Nzg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqWyciXXswLDF9PHNjcmlwdFxzK3NyYz1bJyJdezAsMX1odHRwOi8vPFw/PVwkZG9tYWluXD8+LyI7aToxODk7czo4NToiZXhpdFxzKlwoXHMqWyciXXswLDF9PHNjcmlwdD5ccypzZXRUaW1lb3V0XHMqXChccypcXFsnIl17MCwxfWRvY3VtZW50XC5sb2NhdGlvblwuaHJlZiI7aToxOTA7czoyNToiZnVuY3Rpb25ccytzcWwyX3NhZmVccypcKCI7aToxOTE7czo0MToiXCRwb3N0UmVzdWx0XHMqPVxzKmN1cmxfZXhlY1xzKlwoKlxzKlwkY2giO2k6MTkyO3M6ODc6IiYmXHMqZnVuY3Rpb25fZXhpc3RzXHMqXCgqXHMqWyciXXswLDF9Z2V0bXhyclsnIl17MCwxfVwpXHMqXClccyp7XHMqQGdldG14cnJccypcKCpccypcJCI7aToxOTM7czo1NzoiaXNfX3dyaXRhYmxlXHMqXCgqXHMqXCRwYXRoXHMqXC5ccyp1bmlxaWRccypcKCpccyptdF9yYW5kIjtpOjE5NDtzOjI4OiJmaWxlX3B1dF9jb250ZW50elxzKlwoKlxzKlwkIjtpOjE5NTtzOjU1OiJAKmd6aW5mbGF0ZVxzKlwoXHMqQCpiYXNlNjRfZGVjb2RlXHMqXChccypAKnN0cl9yZXBsYWNlIjtpOjE5NjtzOjEwNToiZm9wZW5ccypcKCpccypbJyJdaHR0cDovL1snIl1ccypcLlxzKlwkY2hlY2tfZG9tYWluXHMqXC5ccypbJyJdOjgwWyciXVxzKlwuXHMqXCRjaGVja19kb2NccyosXHMqWyciXXJbJyJdIjtpOjE5NztzOjQzOiJAXCRfQ09PS0lFXFtbJyJdezAsMX1zdGF0Q291bnRlclsnIl17MCwxfVxdIjtpOjE5ODtzOjM1OiJpZlxzKlwoKlxzKkAqcHJlZ19tYXRjaFxzKlwoKlxzKnN0ciI7aToxOTk7czo5NDoiYXJyYXlfcG9wXHMqXCgqXHMqXCR3b3JrUmVwbGFjZVxzKixccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKixccypcJGNvdW50S2V5c05ldyI7aToyMDA7czo1NDoiKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl1fX19bJyJdXHMqIjtpOjIwMTtzOjIzOiJcKFxzKlsnIl1JTlNIRUxMWyciXVxzKiI7aToyMDI7czo0NzoiXCRiXHMqXC5ccypcJHBccypcLlxzKlwkaFxzKlwuXHMqXCRrXHMqXC5ccypcJHYiO2k6MjAzO3M6ODg6Ij1ccypwcmVnX3NwbGl0XHMqXChccypbJyJdL1xcLFwoXFwgXCtcKVw/L1snIl0sXHMqQCppbmlfZ2V0XHMqXChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnMiO2k6MjA0O3M6MTAxOiJpZlxzKlwoIWZ1bmN0aW9uX2V4aXN0c1xzKlwoXHMqWyciXXBvc2l4X2dldHB3dWlkWyciXVxzKlwpXHMqJiZccyohaW5fYXJyYXlccypcKFxzKlsnIl1wb3NpeF9nZXRwd3VpZCI7aToyMDU7czoxMjM6InByZWdfcmVwbGFjZVxzKlwoXHMqWyciXS9cXlwod3d3XHxmdHBcKVxcXC4vaVsnIl1ccyosXHMqWyciXVsnIl0sXHMqQFwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XHMqXF1ccypcKSI7aToyMDY7czoyNjE6ImlmXHMqXCgqXHMqaXNzZXRccypcKCpccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9W2EtekEtWl8wLTldK1snIl17MCwxfVxzKlxdXHMqXCkqXHMqXClccyp7XHMqXCRbYS16QS1aXzAtOV0rXHMqPVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1bYS16QS1aXzAtOV0rWyciXXswLDF9XHMqXF07XHMqZXZhbFxzKlwoKlxzKlwkW2EtekEtWl8wLTldK1xzKlwpKiI7aToyMDc7czo4MToiZXZhbFxzKlwoKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFwoKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjIwODtzOjEzOToiaWZccytcKFxzKnN0cnBvc1xzKlwoXHMqXCR1cmxccyosXHMqWyciXWpzL21vb3Rvb2xzXC5qc1snIl1ccypcKVxzKj09PVxzKmZhbHNlXHMrJiZccytzdHJwb3NccypcKFxzKlwkdXJsXHMqLFxzKlsnIl1qcy9jYXB0aW9uXC5qc1snIl17MCwxfSI7aToyMDk7czo2ODoiaWZccytcKCpccyptYWlsXHMqXChccypcJHJlY3BccyosXHMqXCRzdWJqXHMqLFxzKlwkc3R1bnRccyosXHMqXCRmcm0iO2k6MjEwO3M6NDM6IjxcP3BocFxzK1wkX0Zccyo9XHMqX19GSUxFX19ccyo7XHMqXCRfWFxzKj0iO2k6MjExO3M6Nzk6IlwkeFxkK1xzKj1ccypbJyJdLis/WyciXVxzKjtccypcJHhcZCtccyo9XHMqWyciXS4rP1snIl1ccyo7XHMqXCR4XGQrXHMqPVxzKlsnIl0iO2k6MjEyO3M6MTE1OiJcJGJlZWNvZGVccyo9QCpmaWxlX2dldF9jb250ZW50c1xzKlwoKlsnIl17MCwxfVxzKlwkdXJscHVyc1xzKlsnIl17MCwxfVwpKlxzKjtccyplY2hvXHMrWyciXXswLDF9XCRiZWVjb2RlWyciXXswLDF9IjtpOjIxMztzOjEwMToiXCRHTE9CQUxTXFtccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcXVxbXHMqXGQrXHMqXF1cKFxzKlwkX1xkK1xzKixccypfXGQrXHMqXChccypcZCtccypcKVxzKlwpXHMqXCkiO2k6MjE0O3M6NzM6InByZWdfcmVwbGFjZVxzKlwoKlxzKlsnIl17MCwxfS9cLlwqXFsuKz9cXVw/L2VbJyJdezAsMX1ccyosXHMqc3RyX3JlcGxhY2UiO2k6MjE1O3M6MTQ5OiJcJEdMT0JBTFNcW1snIl17MCwxfS4rP1snIl17MCwxfVxdPUFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKVxzKixccypiYXNlNjRfZGVjb2RlXHMqXChccypbJyJdezAsMX0uKz9bJyJdezAsMX1ccypcKSI7aToyMTY7czoyMDA6IlVOSU9OXHMrU0VMRUNUXHMrWyciXXswLDF9MFsnIl17MCwxfVxzKixccypbJyJdezAsMX08XD8gc3lzdGVtXChcXFwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtjcGNcXVwpO2V4aXQ7XHMqXD8+WyciXXswLDF9XHMqLFxzKjBccyosMFxzKixccyowXHMqLFxzKjBccytJTlRPXHMrT1VURklMRVxzK1snIl17MCwxfVwkWyciXXswLDF9IjtpOjIxNztzOjY2OiJpc3NldFxzKlwoKlxzKlwkX1BPU1RccypcW1xzKlsnIl17MCwxfWV4ZWNnYXRlWyciXXswLDF9XHMqXF1ccypcKSoiO2k6MjE4O3M6NzE6ImZ3cml0ZVxzKlwoKlxzKlwkZnBzZXR2XHMqLFxzKmdldGVudlxzKlwoXHMqWyciXUhUVFBfQ09PS0lFWyciXVxzKlwpXHMqIjtpOjIxOTtzOjI2OiJzeW1saW5rXHMqXCgqXHMqWyciXS9ob21lLyI7aToyMjA7czo3MDoiZnVuY3Rpb25ccyt1cmxHZXRDb250ZW50c1xzKlwoKlxzKlwkdXJsXHMqLFxzKlwkdGltZW91dFxzKj1ccypcZCtccypcKSI7aToyMjE7czo0OToic3RycmV2XCgqXHMqWyciXXswLDF9ZWRvY2VkXzQ2ZXNhYlsnIl17MCwxfVxzKlwpKiI7aToyMjI7czo0Mjoic3RycmV2XCgqXHMqWyciXXswLDF9dHJlc3NhWyciXXswLDF9XHMqXCkqIjtpOjIyMztzOjIwOiJleGVjXHMqXChccypbJyJdaXBmdyI7aToyMjQ7czoxMzY6IndwX3Bvc3RzXHMrV0hFUkVccytwb3N0X3R5cGVccyo9XHMqWyciXXswLDF9cG9zdFsnIl17MCwxfVxzK0FORFxzK3Bvc3Rfc3RhdHVzXHMqPVxzKlsnIl17MCwxfXB1Ymxpc2hbJyJdezAsMX1ccytPUkRFUlxzK0JZXHMrYElEYFxzK0RFU0MiO2k6MjI1O3M6MTEyOiJmaWxlX2dldF9jb250ZW50c1xzKlwoKlxzKnRyaW1ccypcKFxzKlwkLis/XFtcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9Lis/WyciXXswLDF9XF1cXVwpXCk7IjtpOjIyNjtzOjIxMzoiaXNfY2FsbGFibGVccypcKCpccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVwpKlxzK2FuZFxzKyFpbl9hcnJheVxzKlwoKlxzKlsnIl17MCwxfShmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pWyciXXswLDF9XHMqLFxzKlwkZGlzYWJsZWZ1bmNzIjtpOjIyNztzOjI0OiJcJEdMT0JBTFNcW1snIl17MCwxfV9fX18iO2k6MjI4O3M6NDM6ImZvcGVuXHMqXCgqXHMqWyciXXswLDF9L2V0Yy9wYXNzd2RbJyJdezAsMX0iO2k6MjI5O3M6NTk6ImV2YWxccypcKCpAKlxzKnN0cmlwc2xhc2hlc1xzKlwoKlxzKmFycmF5X3BvcFxzKlwoKlxzKkAqXCRfIjtpOjIzMDtzOjQxOiJldmFsXHMqXCgqQCpccypzdHJpcHNsYXNoZXNccypcKCpccypAKlwkXyI7aToyMzE7czo3NDoiQCpzZXRjb29raWVccypcKCpccypbJyJdezAsMX1oaXRbJyJdezAsMX0sXHMqMVxzKixccyp0aW1lXHMqXCgqXHMqXCkqXHMqXCsiO2k6MjMyO3M6MzY6ImV2YWxccypcKCpccypmaWxlX2dldF9jb250ZW50c1xzKlwoKiI7aToyMzM7czo0NjoicHJlZ19yZXBsYWNlXHMqXCgqXHMqWyciXXswLDF9L1wuXCovZVsnIl17MCwxfSI7aToyMzQ7czo4MToiXHMqe1xzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqXF1ccyp9IjtpOjIzNTtzOjEzNToiWyciXXswLDF9aHR0cGRcLmNvbmZbJyJdezAsMX1ccyosXHMqWyciXXswLDF9dmhvc3RzXC5jb25mWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNmZ1wucGhwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfWNvbmZpZ1wucGhwWyciXXswLDF9IjtpOjIzNjtzOjMzOiJwcm9jX29wZW5ccypcKFxzKlsnIl17MCwxfUlIU3RlYW0iO2k6MjM3O3M6ODg6IlwkaW5pXHMqXFtccypbJyJdezAsMX11c2Vyc1snIl17MCwxfVxzKlxdXHMqPVxzKmFycmF5XHMqXChccypbJyJdezAsMX1yb290WyciXXswLDF9XHMqPT4iO2k6MjM4O3M6ODg6ImN1cmxfc2V0b3B0XHMqXChccypcJGNoXHMqLFxzKkNVUkxPUFRfVVJMXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly9cJGhvc3Q6XGQrWyciXXswLDF9XHMqXCkiO2k6MjM5O3M6NDU6InN5c3RlbVxzKlwoKlxzKlsnIl17MCwxfXdob2FtaVsnIl17MCwxfVxzKlwpKiI7aToyNDA7czo1MjoiZmluZFxzKy9ccystbmFtZVxzK1wuc3NoXHMrPlxzK1wkZGlyL3NzaGtleXMvc3Noa2V5cyI7aToyNDE7czo1MjoiYXNzZXJ0XHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyNDI7czo1MDoiZXZhbFxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MjQzO3M6MjU6InBocFxzKyJccypcLlxzKlwkd3NvX3BhdGgiO2k6MjQ0O3M6ODk6IkAqYXNzZXJ0XHMqXCgqXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfS4rP1snIl17MCwxfVxzKlxdXHMqIjtpOjI0NTtzOjIxOiJldmExW2EtekEtWjAtOV9dKz9TaXIiO2k6MjQ2O3M6OTM6IlwkY21kXHMqPVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbXHMqWyciXXswLDF9Lis/WyciXXswLDF9XHMqXF1ccypcKSI7aToyNDc7czo5NjoiXCRmdW5jdGlvblxzKlwoKlxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClccypcW1xzKlsnIl17MCwxfWNtZFsnIl17MCwxfVxzKlxdXHMqXCkqIjtpOjI0ODtzOjIzOiJcJGZlXCgiXCRjbWRccysyPiYxIlwpOyI7aToyNDk7czoxNDE6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdXCRjbWRccysxPlxzKi90bXAvY21kdGVtcFxzKzI+JjE7XHMqY2F0XHMrL3RtcC9jbWR0ZW1wO1xzKnJtXHMrL3RtcC9jbWR0ZW1wWyciXVwpOyI7aToyNTA7czo1Mzoic2V0Y29va2llXCgqXHMqWyciXW15c3FsX3dlYl9hZG1pbl91c2VybmFtZVsnIl1ccypcKSoiO2k6MjUxO3M6ODY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXVuYW1lXHMrLWFbJyJdXHMqXCkqIjtpOjI1MjtzOjEyNDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypAKlwkX1BPU1RccypcW1xzKlsnIl0uKz9bJyJdXHMqXF1ccypcLlxzKiJccyoyXHMqPlxzKiYxXHMqWyciXSI7aToyNTM7czo0OToiIUAqXCRfUkVRVUVTVFxzKlxbXHMqWyciXWM5OXNoX3N1cmxbJyJdXHMqXF1ccypcKSI7aToyNTQ7czozNzoiXCRsb2dpblxzKj1ccypAKnBvc2l4X2dldHVpZFwoKlxzKlwpKiI7aToyNTU7czozMToibmNmdHBwdXRccyotdVxzKlwkZnRwX3VzZXJfbmFtZSI7aToyNTY7czo4MjoicnVuY29tbWFuZFxzKlwoXHMqWyciXXNoZWxsaGVscFsnIl1ccyosXHMqWyciXShHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpWyciXSI7aToyNTc7czo1NToie1xzKlwkXHMqe1xzKnBhc3N0aHJ1XHMqXCgqXHMqXCRjbWRccypcKVxzKn1ccyp9XHMqPGJyPiI7aToyNTg7czo1ODoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypcXFsnIl1IVFRQX0FDQ0VQVF9MQU5HVUFHRSI7aToyNTk7czo1NjoicGFzc3RocnVccypcKCpccypnZXRlbnZccypcKCpccypbJyJdSFRUUF9BQ0NFUFRfTEFOR1VBR0UiO2k6MjYwO3M6ODc6IlNFTEVDVFxzKzFccytGUk9NXHMrbXlzcWxcLnVzZXJccytXSEVSRVxzK2NvbmNhdFwoXHMqYHVzZXJgXHMqLFxzKidAJ1xzKixccypgaG9zdGBccypcKSI7aToyNjE7czo5NzoiXCRNZXNzYWdlU3ViamVjdFxzKj1ccypiYXNlNjRfZGVjb2RlXHMqXChccypcJF9QT1NUXHMqXFtccypbJyJdezAsMX1tc2dzdWJqZWN0WyciXXswLDF9XHMqXF1ccypcKSI7aToyNjI7czo0NzoicmVuYW1lXHMqXChccypccypbJyJdezAsMX13c29cLnBocFsnIl17MCwxfVxzKiwiO2k6MjYzO3M6NzQ6ImZpbGVwYXRoXHMqPVxzKkAqcmVhbHBhdGhccypcKFxzKlwkX1BPU1RccypcW1xzKlsnIl1maWxlcGF0aFsnIl1ccypcXVxzKlwpIjtpOjI2NDtzOjc4OiJmaWxlcGF0aFxzKj1ccypAKnJlYWxwYXRoXHMqXChccypcJF9QT1NUXHMqXFtccypcXFsnIl1maWxlcGF0aFxcWyciXVxzKlxdXHMqXCkiO2k6MjY1O3M6NDA6ImV2YWxccypcKCpccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8iO2k6MjY2O3M6MTA3OiJ3c29FeFxzKlwoXHMqXFxbJyJdXHMqdGFyXHMqY2Z6dlxzKlxcWyciXVxzKlwuXHMqZXNjYXBlc2hlbGxhcmdccypcKFxzKlwkX1BPU1RcW1xzKlxcWyciXXAyXFxbJyJdXHMqXF1ccypcKSI7aToyNjc7czo3NDoiV1NPc2V0Y29va2llXHMqXChccyptZDVccypcKFxzKkAqXCRfU0VSVkVSXFtccypbJyJdSFRUUF9IT1NUWyciXVxzKlxdXHMqXCkiO2k6MjY4O3M6Nzg6IldTT3NldGNvb2tpZVxzKlwoXHMqbWQ1XHMqXChccypAKlwkX1NFUlZFUlxbXHMqXFxbJyJdSFRUUF9IT1NUXFxbJyJdXHMqXF1ccypcKSI7aToyNjk7czoxNzA6IlwkaW5mbyBcLj0gXChcKFwkcGVybXNccyomXHMqMHgwMDQwXClccypcP1woXChcJHBlcm1zXHMqJlxzKjB4MDgwMFwpXHMqXD9ccypcXFsnIl1zXFxbJyJdXHMqOlxzKlxcWyciXXhcXFsnIl1ccypcKVxzKjpcKFwoXCRwZXJtc1xzKiZccyoweDA4MDBcKVxzKlw/XHMqJ1MnXHMqOlxzKictJ1xzKlwpIjtpOjI3MDtzOjM1OiJkZWZhdWx0X2FjdGlvblxzKj1ccypcXFsnIl1GaWxlc01hbiI7aToyNzE7czozMzoic3lzdGVtXHMrZmlsZVxzK2RvXHMrbm90XHMrZGVsZXRlIjtpOjI3MjtzOjE5OiJoYWNrZWRccytieVxzK0htZWk3IjtpOjI3MztzOjExOiJieVxzK0dyaW5heSI7aToyNzQ7czoyMzoiQ2FwdGFpblxzK0NydW5jaFxzK1RlYW0iO2k6Mjc1O3M6OTY6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFtccypbJyJdezAsMX1wMlsnIl17MCwxfVxzKlxdXHMqPT1ccypbJyJdezAsMX1jaG1vZFsnIl17MCwxfSI7fQ=="));
$gX_FlexDBShe = unserialize(base64_decode("YToyNTI6e2k6MDtzOjIyOiJkaXNhYmxlX2Z1bmN0aW9ucz1OT05FIjtpOjE7czoyMToiJl9TRVNTSU9OXFtwYXlsb2FkXF09IjtpOjI7czoyNjoiPFw/XHMqPUBgXCRbYS16QS1aMC05X10rP2AiO2k6MztzOjE2OiJQSFBTSEVMTF9WRVJTSU9OIjtpOjQ7czo2OToidG91Y2hcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjU7czo4MToiZmlsZV9nZXRfY29udGVudHNcKFxzKlwkX1NFUlZFUlxbXHMqWyciXURPQ1VNRU5UX1JPT1RbJyJdXHMqXF1ccypcLlxzKlsnIl0vZW5naW5lIjtpOjY7czo1NjoiQFwkX1NFUlZFUlxbXHMqSFRUUF9IT1NUXHMqXF0+WyciXVxzKlwuXHMqWyciXVxcclxcblsnIl0iO2k6NztzOjcxOiJ0cmltXChccypcJGhlYWRlcnNccypcKVxzKlwpXHMqYXNccypcJGhlYWRlclxzKlwpXHMqaGVhZGVyXChccypcJGhlYWRlciI7aTo4O3M6MTY6IkNvZGVkXHMrYnlccytFWEUiO2k6OTtzOjEyOiJCeVxzK1dlYlJvb1QiO2k6MTA7czoyMDoiaGVhZGVyXHMqXChccypfXGQrXCgiO2k6MTE7czo0MToiaWZccypcKGZ1bmN0aW9uX2V4aXN0c1woXHMqWyciXXBjbnRsX2ZvcmsiO2k6MTI7czoyOToiZG9fd29ya1woXHMqXCRpbmRleF9maWxlXHMqXCkiO2k6MTM7czo4MzoiXCRpZFxzKlwuXHMqWyciXVw/ZD1bJyJdXHMqXC5ccypiYXNlNjRfZW5jb2RlXChccypcJF9TRVJWRVJcW1xzKlsnIl1IVFRQX1VTRVJfQUdFTlQiO2k6MTQ7czoyNToibmV3XHMrY29uZWN0QmFzZVwoWyciXWFIUiI7aToxNTtzOjkwOiJmaWxlX2dldF9jb250ZW50c1woUk9PVF9ESVJcLlsnIl0vdGVtcGxhdGVzL1snIl1cLlwkY29uZmlnXFtbJyJdc2tpblsnIl1cXVwuWyciXS9tYWluXC50cGwiO2k6MTY7czo1OToiJTwhLS1cXHNcKlwkbWFya2VyXFxzXCotLT5cLlwrXD88IS0tXFxzXCovXCRtYXJrZXJcXHNcKi0tPiUiO2k6MTc7czoyNDoiZnVuY3Rpb25ccytnZXRmaXJzdHNodGFnIjtpOjE4O3M6MTg6InJlc3VsdHNpZ25fd2FybmluZyI7aToxOTtzOjI5OiJmaWxlX2V4aXN0c1woXHMqXCRGaWxlQmF6YVRYVCI7aToyMDtzOjE5OiI9PVxzKlsnIl1jc2hlbGxbJyJdIjtpOjIxO3M6NjE6IlwkX1NFUlZFUlxbWyciXXswLDF9UkVNT1RFX0FERFJbJyJdezAsMX1cXTtpZlwoXChwcmVnX21hdGNoXCgiO2k6MjI7czo2NzoiXCRmaWxlX2Zvcl90b3VjaFxzKj1ccypcJF9TRVJWRVJcW1snIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1cXSI7aToyMztzOjIzOiJcJGluZGV4X3BhdGhccyosXHMqMDQwNCI7aToyNDtzOjMwOiJyZWFkX2ZpbGVfbmV3XzJcKFwkcmVzdWx0X3BhdGgiO2k6MjU7czozODoiY2hyXChccypoZXhkZWNcKFxzKnN1YnN0clwoXHMqXCRtYWtldXAiO2k6MjY7czoyNzoiXGQrJkBwcmVnX21hdGNoXChccypzdHJ0clwoIjtpOjI3O3M6NzU6InZhbHVlPVsnIl08XD9ccysoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXSI7aToyODtzOjE4OiJBY2FkZW1pY29ccytSZXN1bHQiO2k6Mjk7czozMDoiU0VMRUNUXHMrXCpccytGUk9NXHMrZG9yX3BhZ2VzIjtpOjMwO3M6NDE6ImdfZGVsZXRlX29uX2V4aXRccyo9XHMqbmV3XHMrRGVsZXRlT25FeGl0IjtpOjMxO3M6NTI6ImlmXChwcmVnX21hdGNoXChbJyJdI3dvcmRwcmVzc19sb2dnZWRfaW5cfGFkbWluXHxwd2QiO2k6MzI7czo1MDoiWyciXVwuWyciXVsnIl1cLlsnIl1bJyJdXC5bJyJdWyciXVwuWyciXVsnIl1cLlsnIl0iO2k6MzM7czoyODoiXCk7ZnVuY3Rpb25ccytzdHJpbmdfY3B0XChcJCI7aTozNDtzOjI4OiJcJHNldGNvb2tcKTtzZXRjb29raWVcKFwkc2V0IjtpOjM1O3M6MzU6Ijxsb2M+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmw7IjtpOjM2O3M6NDA6IlwkYmFubmVkSVBccyo9XHMqYXJyYXlcKFxzKlsnIl1cXjY2XC4xMDIiO2k6Mzc7czo2MjoiXCRyZXN1bHQ9c21hcnRDb3B5XChccypcJHNvdXJjZVxzKlwuXHMqWyciXS9bJyJdXHMqXC5ccypcJGZpbGUiO2k6Mzg7czozODoiXCRmaWxsID0gXCRfQ09PS0lFXFtcXFsnIl1maWxsXFxbJyJdXF0iO2k6Mzk7czo4MzoiaWZcKFsnIl1zdWJzdHJfY291bnRcKFsnIl1cJF9TRVJWRVJcW1snIl1SRVFVRVNUX1VSSVsnIl1cXVxzKixccypbJyJdcXVlcnlcLnBocFsnIl0iO2k6NDA7czo4NToiaWZcKFxzKlwkX0dFVFxbXHMqWyciXWlkWyciXVxzKlxdIT1ccypbJyJdWyciXVxzKlwpXHMqXCRpZD1cJF9HRVRcW1xzKlsnIl1pZFsnIl1ccypcXSI7aTo0MTtzOjIyOiI8YVxzK2hyZWY9WyciXW9zaGlia2EtIjtpOjQyO3M6NzY6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdY2RccysvdG1wO3dnZXQiO2k6NDM7czo1NToiZ2V0cHJvdG9ieW5hbWVcKFxzKlsnIl10Y3BbJyJdXHMqXClccytcfFx8XHMrZGllXHMrc2hpdCI7aTo0NDtzOjQ3OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRpbmRleF9wYXRoXHMqLFxzKlwkY29kZSI7aTo0NTtzOjY2OiIsXHMqWyciXS9pbmRleFxcXC5cKHBocFx8aHRtbFwpL2lbJyJdXHMqLFxzKlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3IiO2k6NDY7czoxMzoiQU9MXHMrRGV0YWlscyI7aTo0NztzOjIwOiJ0SEFOS3Nccyt0T1xzK1Nub3BweSI7aTo0ODtzOjIwOiJNYXNyMVxzK0N5YjNyXHMrVGU0bSI7aTo0OTtzOjE4OiJVczNccytZMHVyXHMrYnI0MW4iO2k6NTA7czoyMDoiTWFzcmlccytDeWJlclxzK1RlYW0iO2k6NTE7czo0OToiZndyaXRlXChcJGZwXHMqLFxzKnN0cnJldlwoXHMqXCRjb250ZXh0XHMqXClccypcKSI7aTo1MjtzOjk6Ii9wbXQvcmF2LyI7aTo1MztzOjM0OiJmaWxlX2dldF9jb250ZW50c1woXHMqWyciXS92YXIvdG1wIjtpOjU0O3M6MjM6IlwkaW5fUGVybXNccysmXHMrMHg0MDAwIjtpOjU1O3M6NDM6ImZvcGVuXChccypcJHJvb3RfZGlyXHMqXC5ccypbJyJdL1wuaHRhY2Nlc3MiO2k6NTY7czo2MjoiaW50MzJcKFwoXChcJHpccyo+PlxzKjVccyomXHMqMHgwN2ZmZmZmZlwpXHMqXF5ccypcJHlccyo8PFxzKjIiO2k6NTc7czozNToiPGd1aWQ+PFw/cGhwXHMrZWNob1xzK1wkY3VycmVudF91cmwiO2k6NTg7czoxOToiLWtseWNoLWstaWdyZVwuaHRtbCI7aTo1OTtzOjY2OiI8ZGl2XHMraWQ9WyciXWxpbmsxWyciXT48YnV0dG9uIG9uY2xpY2s9WyciXXByb2Nlc3NUaW1lclwoXCk7WyciXT4iO2k6NjA7czoxMToic2NvcGJpblsnIl0iO2k6NjE7czoxNDoiLUFwcGxlX1Jlc3VsdC0iO2k6NjI7czo0NzoidGFyXHMrLWN6ZlxzKyJccypcLlxzKlwkRk9STXt0YXJ9XHMqXC5ccyoiXC50YXIiO2k6NjM7czoxNDoiQ1ZWMjpccypcJENWVjIiO2k6NjQ7czo2MzoiXCRDVlYyQ1xzKj1ccypcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbXHMqWyciXUNWVjJDIjtpOjY1O3M6NzU6ImZ3cml0ZVwoXHMqXCRmXHMqLFxzKmdldF9kb3dubG9hZFwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aTo2NjtzOjMzOiJcW1xdXHMqPVxzKlsnIl1SZXdyaXRlRW5naW5lXHMrb24iO2k6Njc7czo5ODoic3Vic3RyXChccypcJHN0cmluZzJccyosXHMqc3RybGVuXChccypcJHN0cmluZzJccypcKVxzKi1ccyo5XHMqLFxzKjlcKVxzKj09XHMqWyciXXswLDF9XFtsLHI9MzAyXF0iO2k6Njg7czoxMzoiPWJ5XHMrRFJBR09OPSI7aTo2OTtzOjQwOiJfX2ZpbGVfZ2V0X3VybF9jb250ZW50c1woXHMqXCRyZW1vdGVfdXJsIjtpOjcwO3M6ODI6IlwkVVJMXHMqPVxzKlwkdXJsc1xbXHMqcmFuZFwoXHMqMFxzKixccypjb3VudFwoXHMqXCR1cmxzXHMqXClccyotXHMqMVwpXHMqXF1cLnJhbmQiO2k6NzE7czo0OToibWFpbFwoXHMqXCRyZXRvcm5vXHMqLFxzKlwkYXN1bnRvXHMqLFxzKlwkbWVuc2FqZSI7aTo3MjtzOjc4OiJjYWxsX3VzZXJfZnVuY1woXHMqWyciXWFjdGlvblsnIl1ccypcLlxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiO2k6NzM7czozNToiZmlsZV9leGlzdHNcKFxzKlsnIl0vdG1wL3RtcC1zZXJ2ZXIiO2k6NzQ7czoyNzoiXChbJyJdXCR0bXBkaXIvc2Vzc19mY1wubG9nIjtpOjc1O3M6NTI6InRvdWNoXChccypbJyJdezAsMX1cJGJhc2VwYXRoL2NvbXBvbmVudHMvY29tX2NvbnRlbnQiO2k6NzY7czo0NjoiPVwkZmlsZVwoQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aTo3NztzOjcyOiJzZW5kX3NtdHBcKFxzKlwkZW1haWxcW1snIl17MCwxfWFkclsnIl17MCwxfVxdXHMqLFxzKlwkc3VialxzKixccypcJHRleHQiO2k6Nzg7czozNDoiX19MSU5LX188YVxzK2hyZWY9WyciXXswLDF9aHR0cDovLyI7aTo3OTtzOjQ0OiJzY3JpcHRzXFtccypnenVuY29tcHJlc3NcKFxzKmJhc2U2NF9kZWNvZGVcKCI7aTo4MDtzOjc4OiIhZmlsZV9wdXRfY29udGVudHNcKFxzKlwkZGJuYW1lXHMqLFxzKlwkdGhpcy0+Z2V0SW1hZ2VFbmNvZGVkVGV4dFwoXHMqXCRkYm5hbWUiO2k6ODE7czoxMTc6IlwkY29udGVudFxzKj1ccypodHRwX3JlcXVlc3RcKFsnIl17MCwxfWh0dHA6Ly9bJyJdezAsMX1ccypcLlxzKlwkX1NFUlZFUlxbWyciXXswLDF9U0VSVkVSX05BTUVbJyJdezAsMX1cXVwuWyciXXswLDF9LyI7aTo4MjtzOjYwOiJtYWlsXChccypcJE1haWxUb1xzKixccypcJE1lc3NhZ2VTdWJqZWN0XHMqLFxzKlwkTWVzc2FnZUJvZHkiO2k6ODM7czozNjoiZmlsZV9wdXRfY29udGVudHNcKFxzKlsnIl17MCwxfS9ob21lIjtpOjg0O3M6NzA6Im1haWxcKFxzKlwkYVxbXGQrXF1ccyosXHMqXCRhXFtcZCtcXVxzKixccypcJGFcW1xkK1xdXHMqLFxzKlwkYVxbXGQrXF0iO2k6ODU7czoyMzoiaXNfd3JpdGFibGU9aXNfd3JpdGFibGUiO2k6ODY7czoyMzoiZXhwbG9pdC1kYlwuY29tL3NlYXJjaC8iO2k6ODc7czoxNDoiRGF2aWRccypCbGFpbmUiO2k6ODg7czozMzoiY3JvbnRhYlxzKy1sXHxncmVwXHMrLXZccytjcm9udGFiIjtpOjg5O3M6ODA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChccypbJyJdezAsMX1hdFxzK25vd1xzKy1mIjtpOjkwO3M6NjM6IiMhL2Jpbi9zaG5jZFxzK1snIl17MCwxfVsnIl17MCwxfVwuXCRTQ1BcLlsnIl17MCwxfVsnIl17MCwxfW5pZiI7aTo5MTtzOjQ0OiJmaWxlX3B1dF9jb250ZW50c1woWyciXXswLDF9XC4vbGlid29ya2VyXC5zbyI7aTo5MjtzOjM2OiJcJHVzZXJfYWdlbnRfdG9fZmlsdGVyXHMqPVxzKmFycmF5XCgiO2k6OTM7czoyMDoiZm9wZW5cKFxzKlsnIl0vaG9tZS8iO2k6OTQ7czoyMDoibWtkaXJcKFxzKlsnIl0vaG9tZS8iO2k6OTU7czozOToiI1VzZVsnIl17MCwxfVxzKixccypmaWxlX2dldF9jb250ZW50c1woIjtpOjk2O3M6Mjk6ImVyZWdpXChccypzcWxfcmVnY2FzZVwoXHMqXCRfIjtpOjk3O3M6NzE6IlwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrXHMqXF1cKFwkX1xbXHMqXGQrXHMqXF1cKFxzKlwkX1xbXHMqXGQrIjtpOjk4O3M6MzY6ImV2YWxcKFxzKlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkPGFtYyI7aTo5OTtzOjMzOiJAXCRmdW5jXChcJGNmaWxlLCBcJGNkaXJcLlwkY25hbWUiO2k6MTAwO3M6NjI6InVuYW1lXF1bJyJdezAsMX1ccypcLlxzKnBocF91bmFtZVwoXClccypcLlxzKlsnIl17MCwxfVxbL3VuYW1lIjtpOjEwMTtzOjU0OiJcJEdMT0JBTFNcW1snIl17MCwxfVthLXpBLVowLTlfXSs/WyciXXswLDF9XF1cKFxzKk5VTEwiO2k6MTAyO3M6MjM6Il9fdXJsX2dldF9jb250ZW50c1woXCRsIjtpOjEwMztzOjI2OiJcJGRvcl9jb250ZW50PXByZWdfcmVwbGFjZSI7aToxMDQ7czo3MzoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1sc1xzKy92YXIvbWFpbCI7aToxMDU7czozMDoiaGVhZGVyXChbJyJdezAsMX1yOlxzKm5vXHMrY29tIjtpOjEwNjtzOjQ4OiJwcmVnX21hdGNoX2FsbFwoXHMqWyciXVx8XChcLlwqXCk8XFwhLS0ganMtdG9vbHMiO2k6MTA3O3M6Mzc6ImlmXHMqXChccyppbmlfZ2V0XChbJyJdezAsMX1zYWZlX21vZGUiO2k6MTA4O3M6NDk6IkAqZmlsZV9wdXRfY29udGVudHNcKFxzKlwkdGhpcy0+ZmlsZVxzKixccypzdHJyZXYiO2k6MTA5O3M6NDE6Ii9wbHVnaW5zL3NlYXJjaC9xdWVyeVwucGhwXD9fX19fcGdmYT1odHRwIjtpOjExMDtzOjkxOiJtYWlsXChccypzdHJpcHNsYXNoZXNcKFwkdG9cKVxzKixccypzdHJpcHNsYXNoZXNcKFwkc3ViamVjdFwpXHMqLFxzKnN0cmlwc2xhc2hlc1woXCRtZXNzYWdlIjtpOjExMTtzOjg1OiJcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxbWyciXXswLDF9dXJbJyJdezAsMX1cXVwpXClccypcJG1vZGVccypcfD1ccyowNDAwIjtpOjExMjtzOjgyOiJlcmVnX3JlcGxhY2VcKFsnIl17MCwxfSU1QyUyMlsnIl17MCwxfVxzKixccypbJyJdezAsMX0lMjJbJyJdezAsMX1ccyosXHMqXCRtZXNzYWdlIjtpOjExMztzOjg4OiJmaWxlX3B1dF9jb250ZW50c1woXHMqXCRuYW1lXHMqLFxzKmJhc2U2NF9kZWNvZGVcKFxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExNDtzOjEyMjoid2luZG93XC5sb2NhdGlvbj1ifVxzKlwpXChccypuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKlx8XHxccypuYXZpZ2F0b3JcLnZlbmRvclxzKlx8XHxccyp3aW5kb3dcLm9wZXJhXHMqLFxzKlsnIl17MCwxfWh0dHA6Ly8iO2k6MTE1O3M6ODk6Ilwkc2FwZV9vcHRpb25cW1xzKlsnIl17MCwxfWZldGNoX3JlbW90ZV90eXBlWyciXXswLDF9XHMqXF1ccyo9XHMqWyciXXswLDF9c29ja2V0WyciXXswLDF9IjtpOjExNjtzOjEwNToiXCRwYXRoXHMqPVxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdXHMqXC5ccypbJyJdezAsMX0vaW1hZ2VzL3N0b3JpZXMvWyciXXswLDF9IjtpOjExNztzOjgyOiJAKmFycmF5X2RpZmZfdWtleVwoXHMqQCphcnJheVwoXHMqXChzdHJpbmdcKVxzKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjExODtzOjIwOiJldmFsXHMqXChccypUUExfRklMRSI7aToxMTk7czozODoiSlJlc3BvbnNlOjpzZXRCb2R5XHMqXChccypwcmVnX3JlcGxhY2UiO2k6MTIwO3M6NDg6IlxzKlsnIl17MCwxfXNsdXJwWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfW1zbmJvdCI7aToxMjE7czo1NDoiXHMqWyciXXswLDF9cm9va2VlWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfXdlYmVmZmVjdG9yIjtpOjEyMjtzOjExOiJDb3VwZGVncmFjZSI7aToxMjM7czoxMjoiU3VsdGFuSGFpa2FsIjtpOjEyNDtzOjYwOiJmaWxlX2dldF9jb250ZW50c1woYmFzZW5hbWVcKFwkX1NFUlZFUlxbWyciXXswLDF9U0NSSVBUX05BTUUiO2k6MTI1O3M6Mjc6Imh0dHBzOi8vYXBwbGVpZFwuYXBwbGVcLmNvbSI7aToxMjY7czoxOToiXCRia2V5d29yZF9iZXo9WyciXSI7aToxMjc7czozNDoiY3JjMzJcKFxzKlwkX1BPU1RcW1xzKlsnIl17MCwxfWNtZCI7aToxMjg7czoxOToiZ3JlcFxzKy12XHMrY3JvbnRhYiI7aToxMjk7czoyODoiWyciXVsnIl1ccypcLlxzKmd6VW5jb01wcmVTcyI7aToxMzA7czoyOToiWyciXVsnIl1ccypcLlxzKkJBc2U2NF9kZUNvRGUiO2k6MTMxO3M6MzI6ImV2YWxcKFsnIl1cPz5bJyJdXC5iYXNlNjRfZGVjb2RlIjtpOjEzMjtzOjI3OiJjdXJsX2luaXRcKFxzKmJhc2U2NF9kZWNvZGUiO2k6MTMzO3M6MTI6Im1pbHcwcm1cLmNvbSI7aToxMzQ7czo0NToiXCRmaWxlXChAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjEzNTtzOjM2OiJyZXR1cm5ccytiYXNlNjRfZGVjb2RlXChcJGFcW1wkaVxdXCkiO2k6MTM2O3M6ODoiSGFyY2hhTGkiO2k6MTM3O3M6NjA6InBsdWdpbnMvc2VhcmNoL3F1ZXJ5XC5waHBcP19fX19wZ2ZhPWh0dHAlM0ElMkYlMkZ3d3dcLmdvb2dsZSI7aToxMzg7czozNjoiY3JlYXRlX2Z1bmN0aW9uXChzdWJzdHJcKDIsMVwpLFwkc1wpIjtpOjEzOTtzOjgxOiJ0eXBlb2ZccypcKGRsZV9hZG1pblwpXHMqPT1ccypbJyJdezAsMX11bmRlZmluZWRbJyJdezAsMX1ccypcfFx8XHMqZGxlX2FkbWluXHMqPT0iO2k6MTQwO3M6MzI6IlxbXCRvXF1cKTtcJG9cK1wrXCl7aWZcKFwkbzwxNlwpIjtpOjE0MTtzOjMyOiJcJFNcW1wkaVwrXCtcXVwoXCRTXFtcJGlcK1wrXF1cKCI7aToxNDI7czozNzoic2V0Y29va2llXChccypcJHpcWzBcXVxzKixccypcJHpcWzFcXSI7aToxNDM7czo4NjoiL2luZGV4XC5waHBcP29wdGlvbj1jb21famNlJnRhc2s9cGx1Z2luJnBsdWdpbj1pbWdtYW5hZ2VyJmZpbGU9aW1nbWFuYWdlciZ2ZXJzaW9uPTE1NzYiO2k6MTQ0O3M6MTU6ImNhdGF0YW5ccytzaXR1cyI7aToxNDU7czo0MToiaWZcKFxzKmlzc2V0XChccypcJF9SRVFVRVNUXFtbJyJdezAsMX1jaWQiO2k6MTQ2O3M6NDA6InN0cl9yZXBsYWNlXHMqXChccypbJyJdezAsMX0vcHVibGljX2h0bWwiO2k6MTQ3O3M6NTE6IkBhcnJheVwoXHMqXChzdHJpbmdcKVxzKnN0cmlwc2xhc2hlc1woXHMqXCRfUkVRVUVTVCI7aToxNDg7czo2MDoiaWZccypcKFxzKmZpbGVfcHV0X2NvbnRlbnRzXHMqXChccypcJGluZGV4X3BhdGhccyosXHMqXCRjb2RlIjtpOjE0OTtzOjk0OiJpZlwoaXNfZGlyXChcJHBhdGhcLlsnIl17MCwxfS93cC1jb250ZW50WyciXXswLDF9XClccytBTkRccytpc19kaXJcKFwkcGF0aFwuWyciXXswLDF9L3dwLWFkbWluIjtpOjE1MDtzOjI4OiJpZlwoXCRvPDE2XCl7XCRoXFtcJGVcW1wkb1xdIjtpOjE1MTtzOjk6ImJ5XHMrZzAwbiI7aToxNTI7czoxNToiQXV0b1xzKlhwbG9pdGVyIjtpOjE1MztzOjEwMjoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl17MCwxfVwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXFsiIjtpOjE1NDtzOjcyOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXXswLDF9Y21kXC5leGUiO2k6MTU1O3M6OToiQnlccytEWjI3IjtpOjE1NjtzOjI3OiJFdGhuaWNccytBbGJhbmlhblxzK0hhY2tlcnMiO2k6MTU3O3M6MjA6IlZvbGdvZ3JhZGluZGV4XC5odG1sIjtpOjE1ODtzOjMyOiJcJF9Qb3N0XFtbJyJdezAsMX1TU05bJyJdezAsMX1cXSI7aToxNTk7czoxNToicGFja1xzKyJTbkE0eDgiIjtpOjE2MDtzOjE0OiJbJyJdezAsMX1EWmUxciI7aToxNjE7czoxMjoiVGVhTVxzK01vc1RhIjtpOjE2MjtzOjYzOiJpZlwobWFpbFwoXCRlbWFpbFxbXCRpXF0sXHMqXCRzdWJqZWN0LFxzKlwkbWVzc2FnZSxccypcJGhlYWRlcnMiO2k6MTYzO3M6MzY6InByaW50XHMrWyciXXswLDF9ZGxlX251bGxlZFsnIl17MCwxfSI7aToxNjQ7czozOToiaWZccypcKGNoZWNrX2FjY1woXCRsb2dpbixcJHBhc3MsXCRzZXJ2IjtpOjE2NTtzOjM4OiJwcmVnX3JlcGxhY2VcKFwpe3JldHVyblxzK19fRlVOQ1RJT05fXyI7aToxNjY7czozMzoiXCRvcHRccyo9XHMqXCRmaWxlXChAKlwkX0NPT0tJRVxbIjtpOjE2NztzOjM2OiJpZlwoQGZ1bmN0aW9uX2V4aXN0c1woWyciXXswLDF9ZnJlYWQiO2k6MTY4O3M6MTA4OiJmb3JcKFwkW2EtekEtWjAtOV9dKz89XGQrO1wkW2EtekEtWjAtOV9dKz88XGQrO1wkW2EtekEtWjAtOV9dKz8tPVxkK1wpe2lmXChcJFthLXpBLVowLTlfXSs/IT1cZCtcKVxzKmJyZWFrO30iO2k6MTY5O3M6MzU6IlwkY291bnRlclVybFxzKj1ccypbJyJdezAsMX1odHRwOi8vIjtpOjE3MDtzOjY3OiJhcnJheVwoXHMqWyciXWhbJyJdXHMqLFxzKlsnIl10WyciXVxzKixccypbJyJddFsnIl1ccyosXHMqWyciXXBbJyJdIjtpOjE3MTtzOjQyOiJpZlxzKlwoZnVuY3Rpb25fZXhpc3RzXChbJyJdc2Nhbl9kaXJlY3RvcnkiO2k6MTcyO3M6NjI6IlwkX1NFU1NJT05cW1snIl17MCwxfWRhdGFfYVsnIl17MCwxfVxdXFtcJG5hbWVcXVxzKj1ccypcJHZhbHVlIjtpOjE3MztzOjM4OiJaZW5kXHMrT3B0aW1pemF0aW9uXHMrdmVyXHMrMVwuMFwuMFwuMSI7aToxNzQ7czoyNjoiaW5kZXhcLnBocFw/aWQ9XCQxJiV7UVVFUlkiO2k6MTc1O3M6ODY6IkBpbmlfc2V0XHMqXChbJyJdezAsMX1pbmNsdWRlX3BhdGhbJyJdezAsMX0sWyciXXswLDF9aW5pX2dldFxzKlwoWyciXXswLDF9aW5jbHVkZV9wYXRoIjtpOjE3NjtzOjI4OiJpZlxzKlwoQGlzX3dyaXRhYmxlXChcJGluZGV4IjtpOjE3NztzOjI4OiJcJF9QT1NUXFtbJyJdezAsMX1zbXRwX2xvZ2luIjtpOjE3ODtzOjM3OiJfWyciXXswLDF9XF1cWzJcXVwoWyciXXswLDF9TG9jYXRpb246IjtpOjE3OTtzOjM0OiJpZlwoQHByZWdfbWF0Y2hcKHN0cnRyXChbJyJdezAsMX0vIjtpOjE4MDtzOjE1OiI8IS0tXHMranMtdG9vbHMiO2k6MTgxO3M6NzoidWdnYzovLyI7aToxODI7czo0NzoiaWYgXChkYXRlXChbJyJdezAsMX1qWyciXXswLDF9XClccyotXHMqXCRuZXdzaWQiO2k6MTgzO3M6MTY6IjxEYXZpZFxzK0JsYWluZT4iO2k6MTg0O3M6MjU6IlwkaXNldmFsZnVuY3Rpb25hdmFpbGFibGUiO2k6MTg1O3M6NDE6ImlmIFwoIXN0cnBvc1woXCRzdHJzXFswXF0sWyciXXswLDF9PFw/cGhwIjtpOjE4NjtzOjg1OiJcJHN0cmluZ1xzKj1ccypcJF9TRVNTSU9OXFtbJyJdezAsMX1kYXRhX2FbJyJdezAsMX1cXVxbWyciXXswLDF9bnV0emVybmFtZVsnIl17MCwxfVxdIjtpOjE4NztzOjU2OiJ3aGlsZVwoY291bnRcKFwkbGluZXNcKT5cJGNvbF96YXBcKSBhcnJheV9wb3BcKFwkbGluZXNcKSI7aToxODg7czoxMDQ6InNpdGVfZnJvbT1bJyJdezAsMX1cLlwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9IT1NUWyciXXswLDF9XF1cLlsnIl17MCwxfSZzaXRlX2ZvbGRlcj1bJyJdezAsMX1cLlwkZlxbMVxdIjtpOjE4OTtzOjMxOiJcJGZpbGViXHMqPVxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjE5MDtzOjMzOiJwb3J0bGV0cy9mcmFtZXdvcmsvc2VjdXJpdHkvbG9naW4iO2k6MTkxO3M6Mjk6IlwkYlxzKj1ccyptZDVfZmlsZVwoXCRmaWxlYlwpIjtpOjE5MjtzOjUxOiJcJGRhdGFccyo9XHMqYXJyYXlcKFsnIl17MCwxfXRlcm1pbmFsWyciXXswLDF9XHMqPT4iO2k6MTkzO3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX1nb29nbGUiO2k6MTk0O3M6NzA6InN0cnBvc1woXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVJbJyJdezAsMX1cXSxccypbJyJdezAsMX15YW5kZXgiO2k6MTk1O3M6Nzc6InN0cmlzdHJcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sXHMqWyciXXswLDF9WWFuZGV4Qm90IjtpOjE5NjtzOjUzOiJmb3BlblwoWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vWyciXXswLDF9XC5cJGZpbGVwYXRocyI7aToxOTc7czozNjoicHJlZ19yZXBsYWNlXChccypbJyJdZVsnIl0sWyciXXswLDF9IjtpOjE5ODtzOjQwOiIoW15cP1xzXSlcKHswLDF9XC5bXCtcKl1cKXswLDF9XDJbYS16XSplIjtpOjE5OTtzOjE3OiJteDJcLmhvdG1haWxcLmNvbSI7aToyMDA7czozNToicGhwX1snIl1cLlwkZXh0XC5bJyJdXC5kbGxbJyJdezAsMX0iO2k6MjAxO3M6MjA6Ii9lWyciXVxzKixccypbJyJdXFx4IjtpOjIwMjtzOjMyOiI8aDE+NDAzIEZvcmJpZGRlbjwvaDE+PCEtLSB0b2tlbiI7aToyMDM7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO2k6MjA0O3M6NDQ6ImFycmF5XChccypbJyJdR29vZ2xlWyciXVxzKixccypbJyJdU2x1cnBbJyJdIjtpOjIwNTtzOjEyOiJhbmRleFx8b29nbGUiO2k6MjA2O3M6MjQ6InBhZ2VfZmlsZXMvc3R5bGUwMDBcLmNzcyI7aToyMDc7czoyMToiPT1bJyJdXClcKTtyZXR1cm47XD8+IjtpOjIwODtzOjE2OiJTcGFtXHMrY29tcGxldGVkIjtpOjIwOTtzOjM1OiJlY2hvXHMrWyciXXswLDF9aW5zdGFsbF9va1snIl17MCwxfSI7aToyMTA7czo2MDoiXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl17MCwxfWN2dlsnIl17MCwxfVxdIjtpOjIxMTtzOjExOiJDVlY6XHMqXCRjdiI7aToyMTI7czozMDoiY3VybFwuaGF4eFwuc2UvcmZjL2Nvb2tpZV9zcGVjIjtpOjIxMztzOjEyOiJraWxsYWxsXHMrLTkiO2k6MjE0O3M6NTc6InByZWdfcmVwbGFjZVxzKlwoXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMTU7czo1ODoiXCRtYWlsZXJccyo9XHMqXCRfUE9TVFxbXHMqWyciXXswLDF9eF9tYWlsZXJbJyJdezAsMX1ccypcXSI7aToyMTY7czozMDoicHJlZ19yZXBsYWNlXHMqXChccypbJyJdL1wuXCovIjtpOjIxNztzOjI5OiJFcnJvckRvY3VtZW50XHMrNDAwXHMraHR0cDovLyI7aToyMTg7czoyOToiRXJyb3JEb2N1bWVudFxzKzUwMFxzK2h0dHA6Ly8iO2k6MjE5O3M6Mjg6Imdvb2dsZVx8eWFuZGV4XHxib3RcfHJhbWJsZXIiO2k6MjIwO3M6MjE6ImV2YWxccypcKFxzKnN0cl9yb3QxMyI7aToyMjE7czozODoiZXZhbFxzKlwoXHMqZ3ppbmZsYXRlXHMqXChccypzdHJfcm90MTMiO2k6MjIyO3M6NDg6ImZ1bmN0aW9uXHMqY2htb2RfUlxzKlwoXHMqXCRwYXRoXHMqLFxzKlwkcGVybVxzKiI7aToyMjM7czozMzoic3ltYmlhblx8bWlkcFx8d2FwXHxwaG9uZVx8cG9ja2V0IjtpOjIyNDtzOjI4OiJlY2hvXHMrWyciXW9cLmtcLlsnIl07XHMqXD8+IjtpOjIyNTtzOjcyOiJAc2V0Y29va2llXChbJyJdbVsnIl0sXHMqWyciXVthLXpBLVowLTlfXSs/WyciXSxccyp0aW1lXChcKVxzKlwrXHMqODY0MDAiO2k6MjI2O3M6NzA6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXdnZXQiO2k6MjI3O3M6MzM6Imd6dW5jb21wcmVzc1xzKlwoXHMqYmFzZTY0X2RlY29kZSI7aToyMjg7czozMDoiZ3ppbmZsYXRlXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIyOTtzOjI1OiJldmFsXHMqXChccypiYXNlNjRfZGVjb2RlIjtpOjIzMDtzOjMyOiJzdHJfaXJlcGxhY2VccypcKCpccypbJyJdPC9oZWFkPiI7aToyMzE7czozOToiaWZccypcKFxzKnByZWdfbWF0Y2hccypcKFxzKlsnIl0jeWFuZGV4IjtpOjIzMjtzOjMxOiI9XHMqYXJyYXlfbWFwXHMqXCgqXHMqc3RycmV2XHMqIjtpOjIzMztzOjk6IlwkX19fXHMqPSI7aToyMzQ7czo0OToiZ3p1bmNvbXByZXNzXHMqXCgqXHMqc3Vic3RyXHMqXCgqXHMqYmFzZTY0X2RlY29kZSI7aToyMzU7czoyMzoiQWRkSGFuZGxlclxzK3BocC1zY3JpcHQiO2k6MjM2O3M6MTQ1OiJcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XHMqXChccypcZCtccypcXlxzKlxkK1xzKlwpIjtpOjIzNztzOjM4OiJzdHJlYW1fc29ja2V0X2NsaWVudFxzKlwoXHMqWyciXXRjcDovLyI7aToyMzg7czo5NToiaXNzZXRcKFxzKkAqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVwpXHMqb3JccypkaWVcKCouKj9cKSoiO2k6MjM5O3M6NTc6Ik9wdGlvbnNccytGb2xsb3dTeW1MaW5rc1xzK011bHRpVmlld3NccytJbmRleGVzXHMrRXhlY0NHSSI7aToyNDA7czozMjoiaXNfd3JpdGFibGVccypcKCpccypbJyJdL3Zhci90bXAiO2k6MjQxO3M6OTU6ImFkZF9maWx0ZXJccypcKCpccypbJyJdezAsMX10aGVfY29udGVudFsnIl17MCwxfVxzKixccypbJyJdezAsMX1fYmxvZ2luZm9bJyJdezAsMX1ccyosXHMqLis/XCkqIjtpOjI0MjtzOjI5OiJldmFsXHMqXCgqXHMqZ2V0X29wdGlvblxzKlwoKiI7aToyNDM7czoxMDQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVxzKlxbIjtpOjI0NDtzOjEwNzoiaWZccypcKFxzKmlzX2NhbGxhYmxlXHMqXCgqXHMqWyciXXswLDF9KGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilbJyJdezAsMX1ccypcKSoiO2k6MjQ1O3M6MTE0OiJpZlxzKlwoXHMqZnVuY3Rpb25fZXhpc3RzXHMqXChccypbJyJdezAsMX0oZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVsnIl17MCwxfVxzKlwpXHMqXCkiO2k6MjQ2O3M6NzQ6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXHMqXCgqXHMqWyciXXJtXHMqLWZyIjtpOjI0NztzOjc0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlwoKlxzKlsnIl1ybVxzKi1yZiI7aToyNDg7czo3ODoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilccypcKCpccypbJyJdcm1ccyotclxzKi1mIjtpOjI0OTtzOjQwOiJldmFsXHMqXCgqXHMqZ3ppbmZsYXRlXHMqXCgqXHMqc3RyX3JvdDEzIjtpOjI1MDtzOjE5OiJyb3VuZFxzKlwoXHMqMFxzKlwrIjtpOjI1MTtzOjE5OiJDb250ZW50LVR5cGU6XHMqXCRfIjt9"));
$gXX_FlexDBShe = unserialize(base64_decode("YToyMDg6e2k6MDtzOjQ4OiJwYXJzZV9xdWVyeV9zdHJpbmdcKFxzKlwkRU5We1xzKlsnIl1RVUVSWV9TVFJJTkciO2k6MTtzOjQ0OiJAXCRbYS16QS1aMC05X10rP1woXHMqXCRbYS16QS1aMC05X10rP1xzKlwpOyI7aToyO3M6Mzk6IlthLXpBLVowLTlfXSs/XChccypbYS16QS1aMC05X10rPz1ccypcKSI7aTozO3M6MTI6IlsnIl1yaW55WyciXSI7aTo0O3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjU7czoxNToiWyciXW9mbmlwaHBbJyJdIjtpOjY7czoxNzoiWyciXTMxdG9yX3J0c1snIl0iO2k6NztzOjE0OiJbJyJddHJlc3NhWyciXSI7aTo4O3M6MTM6ImVkb2NlZF80NmVzYWIiO2k6OTtzOjEyOiJzc2VycG1vY251emciO2k6MTA7czo5OiJldGFsZm5pemciO2k6MTE7czoxMjoiWyciXXJpbnlbJyJdIjtpOjEyO3M6MTQ6IlsnIl1mbGZncnpbJyJdIjtpOjEzO3M6NzoiY3VjdmFzYiI7aToxNDtzOjk6ImZnZV9lYmcxMyI7aToxNTtzOjE0OiJbJyJdbmZmcmVnWyciXSI7aToxNjtzOjEzOiJvbmZyNjRfcXJwYnFyIjtpOjE3O3M6MTI6InRtaGFwYnpjZXJmZiI7aToxODtzOjk6InRtdmFzeW5nciI7aToxOTtzOjQ4OiI8XD9ccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXCkiO2k6MjA7czoyMToiZGF0YTp0ZXh0L2h0bWw7YmFzZTY0IjtpOjIxO3M6MTM6Im51bGxfZXhwbG9pdHMiO2k6MjI7czoxMzA6ImlmXChpc3NldFwoXCRfUkVRVUVTVFxbWyciXVthLXpBLVowLTlfXSs/WyciXVxdXClcKVxzKntccypcJFthLXpBLVowLTlfXSs/XHMqPVxzKlwkX1JFUVVFU1RcW1snIl1bYS16QS1aMC05X10rP1snIl1cXTtccypleGl0XChcKTsiO2k6MjM7czo1NjoibWFpbFwoXHMqXCRhcnJcW1snIl10b1snIl1cXVxzKixccypcJGFyclxbWyciXXN1YmpbJyJdXF0iO2k6MjQ7czoyNDoidW5saW5rXChccypfX0ZJTEVfX1xzKlwpIjtpOjI1O3M6MjE6Ii1JL3Vzci9sb2NhbC9iYW5kbWFpbiI7aToyNjtzOjQzOiJuYW1lPVsnIl11cGxvYWRlclsnIl1ccytpZD1bJyJddXBsb2FkZXJbJyJdIjtpOjI3O3M6MzE6ImVjaG9ccypbJyJdPGI+VXBsb2FkPHNzPlN1Y2Nlc3MiO2k6Mjg7czozNzoiaGVhZGVyXChccypbJyJdTG9jYXRpb246XHMqXCRsaW5rWyciXSI7aToyOTtzOjUxOiJ0eXBlPVsnIl1zdWJtaXRbJyJdXHMqdmFsdWU9WyciXVVwbG9hZCBmaWxlWyciXVxzKj4iO2k6MzA7czozMDoiZWxzZVxzKntccyplY2hvXHMqWyciXWZhaWxbJyJdIjtpOjMxO3M6NDQ6IlxzKj1ccyppbmlfZ2V0XChccypbJyJdZGlzYWJsZV9mdW5jdGlvbnNbJyJdIjtpOjMyO3M6NTc6IkBlcnJvcl9yZXBvcnRpbmdcKFxzKjBccypcKTtccyppZlxzKlwoXHMqIWlzc2V0XHMqXChccypcJCI7aTozMztzOjU4OiJyb3VuZFxzKlwoXHMqXChccypcJHBhY2tldHNccypcKlxzKjY1XClccyovXHMqMTAyNFxzKixccyoyIjtpOjM0O3M6MTI6Ilplcm9EYXlFeGlsZSI7aTozNTtzOjExOiJTX1xdQF9cXlVcXiI7aTozNjtzOjUwOiI8aW5wdXRccyt0eXBlPXN1Ym1pdFxzK3ZhbHVlPVVwbG9hZFxzKi8+XHMqPC9mb3JtPiI7aTozNztzOjEwODoiaWZcKFxzKiFzb2NrZXRfc2VuZHRvXChccypcJHNvY2tldFxzKixccypcJGRhdGFccyosXHMqc3RybGVuXChccypcJGRhdGFccypcKVxzKixccyowXHMqLFxzKlwkaXBccyosXHMqXCRwb3J0IjtpOjM4O3M6NTQ6InN1YnN0clwoXHMqXCRyZXNwb25zZVxzKixccypcJGluZm9cW1xzKlsnIl1oZWFkZXJfc2l6ZSI7aTozOTtzOjE5OiJkaWVcKFxzKlsnIl1ubyBjdXJsIjtpOjQwO3M6NzQ6IlwkcmV0ID0gXCR0aGlzLT5fZGItPnVwZGF0ZU9iamVjdFwoIFwkdGhpcy0+X3RibCwgXCR0aGlzLCBcJHRoaXMtPl90Ymxfa2V5IjtpOjQxO3M6NDQ6Im9wZW5ccypcKFxzKk1ZRklMRVxzKixccypbJyJdXHMqPlxzKnRhclwudG1wIjtpOjQyO3M6MTg6Ii1cKi1ccypjb25mXHMqLVwqLSI7aTo0MztzOjQ5OiJAdG91Y2hccypcKFxzKlwkY3VyZmlsZVxzKixccypcJHRpbWVccyosXHMqXCR0aW1lIjtpOjQ0O3M6MzM6InRvdWNoXHMqXChccypkaXJuYW1lXChccypfX0ZJTEVfXyI7aTo0NTtzOjI3OiJcLlwuL1wuXC4vXC5cLi9cLlwuL21vZHVsZXMiO2k6NDY7czoyOToiZXhlY1woXHMqWyciXS9iaW4vc2hbJyJdXHMqXCkiO2k6NDc7czoxNToiL3RtcC9cLklDRS11bml4IjtpOjQ4O3M6MTU6Ii90bXAvdG1wLXNlcnZlciI7aTo0OTtzOjI2OiI9XHMqWyciXXNlbmRtYWlsXHMqLXRccyotZiI7aTo1MDtzOjI0OiJwcm9jX2Nsb3NlXChccypcJHByb2Nlc3MiO2k6NTE7czoxNjoiO1xzKi9iaW4vc2hccyotaSI7aTo1MjtzOjIzOiJbJyJdXHMqXHxccyovYmluL3NoWyciXSI7aTo1MztzOjQyOiJAdW1hc2tcKFxzKjA3NzdccyomXHMqflxzKlwkZmlsZXBlcm1pc3Npb24iO2k6NTQ7czo1MjoiY2htb2RcKFxzKlwkW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9ccyosXHMqMDc1NSI7aTo1NTtzOjUyOiJjaG1vZFwoXHMqXCRbXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1xzKixccyowNDA0IjtpOjU2O3M6NDc6InN0cnRvbG93ZXJcKFxzKnN1YnN0clwoXHMqXCR1c2VyX2FnZW50XHMqLFxzKjAsIjtpOjU3O3M6OToiTDNaaGNpOTNkIjtpOjU4O3M6NTU6Ilwkb3V0XHMqXC49XHMqXCR0ZXh0e1xzKlwkaVxzKn1ccypcXlxzKlwka2V5e1xzKlwkalxzKn0iO2k6NTk7czo4NDoiL2luZGV4XC5waHBcP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9WyciXVwuXCRwb3N0XFtbJyJdezAsMX1pZFsnIl17MCwxfVxdIjtpOjYwO3M6Mjc6IkBjaGRpclwoXHMqXCRfUE9TVFxbXHMqWyciXSI7aTo2MTtzOjY0OiJpc3NldFwoXHMqXCRfQ09PS0lFXFtccyptZDVcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9IT1NUIjtpOjYyO3M6Mjc6InN0cmxlblwoXHMqXCRwYXRoVG9Eb3JccypcKSI7aTo2MztzOjI5OiJmb3BlblwoXHMqWyciXVwuXC4vXC5odGFjY2VzcyI7aTo2NDtzOjQzOiJcJF9QT1NUXFtccypbJyJdezAsMX1lTWFpbEFkZFsnIl17MCwxfVxzKlxdIjtpOjY1O3M6NzI6Im1haWxcKFxzKlwkcmVjaXBpZW50XHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJccypcKSI7aTo2NjtzOjY4OiJtYWlsXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnNccypcKSI7aTo2NztzOjUzOiJtYWlsXChccypcJHRvXHMqLFxzKlwkc3ViaixccypcJG1zZ1xzKixccypcJGZyb21ccypcKSI7aTo2ODtzOjQzOiJjb250ZW50PSJcZCs7VVJMPWh0dHBzOi8vZG9jc1wuZ29vZ2xlXC5jb20vIjtpOjY5O3M6NDI6Ilwka2V5XHMqPVxzKlwkX0dFVFxbWyciXXswLDF9cVsnIl17MCwxfVxdOyI7aTo3MDtzOjE5OiIvaW5zdHJ1a3RzaXlhLWRseWEtIjtpOjcxO3M6MTQ6Ii9cP2RvPW9zaGlia2EtIjtpOjcyO3M6MTc6Ii9cP2RvPWthay11ZGFsaXQtIjtpOjczO3M6MTU6Imd6aW5mbGF0ZVwoXChcKCI7aTo3NDtzOjIzOiIwXHMqXChccypnenVuY29tcHJlc3NcKCI7aTo3NTtzOjIwOiJcJF9SRVFVRVNUXFtbJyJdbGFsYSI7aTo3NjtzOjQzOiJzdHJwb3NcKFwkaW1ccyosXHMqWyciXTxcP1snIl1ccyosXHMqXCRpXCsxIjtpOjc3O3M6NjM6Imh0dHA6Ly93d3dcLmdvb2dsZVwuY29tL3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5XC5bJyJdJmhsPVwkbGFuZyI7aTo3ODtzOjQzOiJodHRwOi8vZ29cLm1haWxcLnJ1L3NlYXJjaFw/cT1bJyJdXC5cJHF1ZXJ5IjtpOjc5O3M6NTA6Imh0dHA6Ly93d3dcLmJpbmdcLmNvbS9zZWFyY2hcP3E9XCRxdWVyeSZwcT1cJHF1ZXJ5IjtpOjgwO3M6Mzg6InNldFRpbWVvdXRcKFxzKlsnIl1sb2NhdGlvblwucmVwbGFjZVwoIjtpOjgxO3M6MTIwOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXVtccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/L1tccyVcLkBcLVwrXChcKS9hLXpBLVowLTlfXSs/XC5naWYiO2k6ODI7czoxMjA6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypbJyJdW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz8vW1xzJVwuQFwtXCtcKFwpL2EtekEtWjAtOV9dKz9cLmpwZyI7aTo4MztzOjEyMDoiKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoKlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rPy9bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg0O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wucG5nIjtpOjg1O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuZ2lmIjtpOjg2O3M6MTQyOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF1ccypcLlxzKlsnIl1bXHMlXC5AXC1cK1woXCkvYS16QS1aMC05X10rP1wuanBnIjtpOjg3O3M6MTA2OiJ1bmxpbmtcKFxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxdXHMqXC5ccypbJyJdezAsMX0vYXNzZXRzL2NhY2hlL3RlbXAvRmlsZVNldHRpbmdzIjtpOjg4O3M6NDg6ImlmXChccypzdHJwb3NcKFxzKlwkdmFsdWVccyosXHMqXCRtYXNrXHMqXClccypcKSI7aTo4OTtzOjg6ImFiYWtvL0FPIjtpOjkwO3M6NTU6IlwqL1xzKihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccyovXCoiO2k6OTE7czozNDoiZ3JvdXBfY29uY2F0XCgweDIxN2UscGFzc3dvcmQsMHgzYSI7aTo5MjtzOjM3OiJjb25jYXRcKDB4MjE3ZSxwYXNzd29yZCwweDNhLHVzZXJuYW1lIjtpOjkzO3M6MjM6IlwrdW5pb25cK3NlbGVjdFwrMCwwLDAsIjtpOjk0O3M6OToic2V4c2V4c2V4IjtpOjk1O3M6MzU6IlwkYmFzZV9kb21haW5ccyo9XHMqZ2V0X2Jhc2VfZG9tYWluIjtpOjk2O3M6MzE6IiFlcmVnXChbJyJdXF5cKHVuc2FmZV9yYXdcKVw/XCQiO2k6OTc7czo5MToiXCRbYS16QS1aMC05X10rPz1cJFthLXpBLVowLTlfXSs/XChcJFthLXpBLVowLTlfXSs/LFwkW2EtekEtWjAtOV9dKz9cKFsnIl17XCRbYS16QS1aMC05X10rPyI7aTo5ODtzOjE5OiJsbXBfY2xpZW50XChzdHJjb2RlIjtpOjk5O3M6MTY6ImV2YWxcKFsnIl1ccyovXCoiO2k6MTAwO3M6MTU6ImV2YWxcKFsnIl1ccyovLyI7aToxMDE7czozNDoiXCRxdWVyeVxzKyxccytbJyJdZnJvbSUyMGpvc191c2VycyI7aToxMDI7czo3OToiXCRbYS16QS1aMC05X10rP1xbXCRbYS16QS1aMC05X10rP1xdXFtcJFthLXpBLVowLTlfXSs/XFtcZCtcXVwuXCRbYS16QS1aMC05X10rPyI7aToxMDM7czoyOToiXClcKSxQSFBfVkVSU0lPTixtZDVfZmlsZVwoXCQiO2k6MTA0O3M6ODM6IihmdHBfZXhlY3xzeXN0ZW18c2hlbGxfZXhlY3xwYXNzdGhydXxwb3Blbnxwcm9jX29wZW4pXChbJyJdezAsMX1jdXJsXHMrLU9ccytodHRwOi8vIjtpOjEwNTtzOjE5OiJjb2Rlc1wubWFpbmxpbmtcLnJ1IjtpOjEwNjtzOjM2OiJjaG1vZFwoZGlybmFtZVwoX19GSUxFX19cKSxccyowNTExXCkiO2k6MTA3O3M6Mzk6ImxvY2F0aW9uXC5yZXBsYWNlXChcXFsnIl1cJHVybF9yZWRpcmVjdCI7aToxMDg7czoyODoiTW90aGVyWyciXXNccytNYWlkZW5ccytOYW1lOiI7aToxMDk7czo5MDoiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKFsnIl1teXNxbGR1bXBccystaFxzK2xvY2FsaG9zdFxzKy11IjtpOjExMDtzOjc3OiJhcnJheV9tZXJnZVwoXCRleHRccyosXHMqYXJyYXlcKFsnIl13ZWJzdGF0WyciXSxbJyJdYXdzdGF0c1snIl0sWyciXXRlbXBvcmFyeSI7aToxMTE7czozMzoiQ29tZmlybVxzK1RyYW5zYWN0aW9uXHMrUGFzc3dvcmQ6IjtpOjExMjtzOjIyOiJ4cnVtZXJfc3BhbV9saW5rc1wudHh0IjtpOjExMztzOjY6IlNFb0RPUiI7aToxMTQ7czo3MDoiPFw/cGhwXHMrKGluY2x1ZGV8aW5jbHVkZV9vbmNlfHJlcXVpcmV8cmVxdWlyZV9vbmNlKVxzKlwoXHMqWyciXS9ob21lLyI7aToxMTU7czoyMjoiLFsnIl08XD9waHBcXG5bJyJdXC5cJCI7aToxMTY7czo1MDoiPGlmcmFtZVxzK3NyYz1bJyJdaHR0cHM6Ly9kb2NzXC5nb29nbGVcLmNvbS9mb3Jtcy8iO2k6MTE3O3M6MzY6ImV4ZWNccyt7WyciXS9iaW4vc2hbJyJdfVxzK1snIl0tYmFzaCI7aToxMTg7czo0NToiaWZcKGZpbGVfcHV0X2NvbnRlbnRzXChcJGluZGV4X3BhdGgsXHMqXCRjb2RlIjtpOjExOTtzOjMxOiI9XHMqbmV3XHMrRGlyZWN0b3J5SXRlcmF0b3JcKFwkIjtpOjEyMDtzOjUzOiJcJFthLXpBLVowLTlfXSs/ID0gXCRbYS16QS1aMC05X10rP1woWyciXXswLDF9aHR0cDovLyI7aToxMjE7czo1MjoiY1wubGVuZ3RoXCk7fXJldHVyblxzKlxcWyciXVxcWyciXTt9aWZcKCFnZXRDb29raWVcKCI7aToxMjI7czo4OiIjdPpJN/bf0CI7aToxMjM7czozMToic2VsZWN0IGxhbmd1YWdlc19pZCwgbmFtZSwgY29kZSI7aToxMjQ7czo0NDoidXBkYXRlIGNvbmZpZ3VyYXRpb24gc2V0IGNvbmZpZ3VyYXRpb25fdmFsdWUiO2k6MTI1O3M6NjU6InNlbGVjdCBjb25maWd1cmF0aW9uX2lkLCBjb25maWd1cmF0aW9uX3RpdGxlLCBjb25maWd1cmF0aW9uX3ZhbHVlIjtpOjEyNjtzOjM2OiIvYWRtaW4vY29uZmlndXJhdGlvblwucGhwL2xvZ2luXC5waHAiO2k6MTI3O3M6MTAxOiJzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZVwoWyciXS5bJyJdXHMqLFxzKlsnIl0uWyciXVxzKixccypzdHJfcmVwbGFjZSI7aToxMjg7czoxMjoiZG1sbGQwUmhkR0U9IjtpOjEyOTtzOjgxOiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVwoWyciXWx3cC1kb3dubG9hZFxzK2h0dHA6Ly8iO2k6MTMwO3M6Njg6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlsnIl1bJyJdXHMqLFxzKmV2YWxcKFwkW2EtekEtWjAtOV9dKz9ccypcKVxzKlwpIjtpOjEzMTtzOjY3OiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XHMqXClccyosIjtpOjEzMjtzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XFsiO2k6MTMzO3M6Mzk6IlwkW2EtekEtWjAtOV9dKz9cKFxzKlwkW2EtekEtWjAtOV9dKz9cWyI7aToxMzQ7czo1OToiXChccypcJHNlbmRccyosXHMqXCRzdWJqZWN0XHMqLFxzKlwkbWVzc2FnZVxzKixccypcJGhlYWRlcnMiO2k6MTM1O3M6MTc6Ij1ccypbJyJdL3Zhci90bXAvIjtpOjEzNjtzOjY1OiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXS92YXIvdG1wLyI7aToxMzc7czoyNjoiZXhpdFwoXCk6ZXhpdFwoXCk6ZXhpdFwoXCkiO2k6MTM4O3M6Mzg6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLWNnaVxzK1wuIjtpOjEzOTtzOjM4OiJAbW92ZV91cGxvYWRlZF9maWxlXChccypcJHVzZXJmaWxlX3RtcCI7aToxNDA7czoyMjoiZGlzYWJsZV9mdW5jdGlvbnM9bm9uZSI7aToxNDE7czoxNTU6IlwkW2EtekEtWjAtOV9dKz9cW1xzKlwkW2EtekEtWjAtOV9dKz9ccypcXVxbXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuIjtpOjE0MjtzOjIyMjoiXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqXCRbYS16QS1aMC05X10rP1xbXHMqXGQrXHMqXF1ccypcLlxzKlwkW2EtekEtWjAtOV9dKz9cW1xzKlxkK1xzKlxdXHMqXC5ccypcJFthLXpBLVowLTlfXSs/XFtccypcZCtccypcXVxzKlwuXHMqIjtpOjE0MztzOjYwOiJcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XChccypcJFthLXpBLVowLTlfXSs/XCgiO2k6MTQ0O3M6NDI6Ij1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl17MCwxfVwkYVsnIl17MCwxfSI7aToxNDU7czo5OiJcJGJcKFsnIl0iO2k6MTQ2O3M6MzE6IlwkYlxzKj1ccypjcmVhdGVfZnVuY3Rpb25cKFsnIl0iO2k6MTQ3O3M6MzY6IlgtTWFpbGVyOlxzKk1pY3Jvc29mdCBPZmZpY2UgT3V0bG9vayI7aToxNDg7czo1NjoiQCpmaWxlX3B1dF9jb250ZW50c1woXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVCkiO2k6MTQ5O3M6MTk6IlsnIl0vXGQrL1xbYS16XF1cKmUiO2k6MTUwO3M6NjQ6IlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpXHMqXFtccypbYS16QS1aMC05X10rP1xzKlxdXCgiO2k6MTUxO3M6MTM6IkBleHRyYWN0XHMqXCQiO2k6MTUyO3M6MTM6IkBleHRyYWN0XHMqXCgiO2k6MTUzO3M6Nzc6Im1haWxccypcKFwkZW1haWxccyosXHMqWyciXXswLDF9PVw/VVRGLThcP0JcP1snIl17MCwxfVwuYmFzZTY0X2VuY29kZVwoXCRmcm9tIjtpOjE1NDtzOjgxOiJtYWlsXChcJF9QT1NUXFtbJyJdezAsMX1lbWFpbFsnIl17MCwxfVxdLFxzKlwkX1BPU1RcW1snIl17MCwxfXN1YmplY3RbJyJdezAsMX1cXSwiO2k6MTU1O3M6ODQ6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoXHMqXCRfRklMRVNcW1snIl1bYS16QS1aMC05X10rP1snIl1cXVxbWyciXXRtcF9uYW1lWyciXVxdXHMqLCI7aToxNTY7czo0NToiTW96aWxsYS81XC4wXHMqXChjb21wYXRpYmxlO1xzKkdvb2dsZWJvdC8yXC4xIjtpOjE1NztzOjE0OiJyb290QGxvY2FsaG9zdCI7aToxNTg7czo0MzoiKFxcWzAtOV1bMC05XVswLTldfFxceFswLTlhLWZdWzAtOWEtZl0pezcsfSI7aToxNTk7czoxNzoiPC9ib2R5PlxzKjxzY3JpcHQiO2k6MTYwO3M6NDM6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXXByZWdfcmVwbGFjZVsnIl0iO2k6MTYxO3M6Mzc6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWFzc2VydFsnIl0iO2k6MTYyO3M6NDY6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6MTYzO3M6NDQ6IlwkW2EtekEtWjAtOV9dKz9ccyo9XHMqWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjE2NDtzOjM1OiJcJFthLXpBLVowLTlfXSs/XHMqPVxzKlsnIl1ldmFsWyciXSI7aToxNjU7czoyODoiQ3JlZGl0XHMqQ2FyZFxzKlZlcmlmaWNhdGlvbiI7aToxNjY7czo2NjoiUmV3cml0ZUNvbmRccyole0hUVFA6QWNjZXB0LUxhbmd1YWdlfVxzKlwocnVcfHJ1LXJ1XHx1a1wpXHMqXFtOQ1xdIjtpOjE2NztzOjQyOiJSZXdyaXRlQ29uZFxzKiV7SFRUUDp4LW9wZXJhbWluaS1waG9uZS11YX0iO2k6MTY4O3M6MzQ6IlJld3JpdGVDb25kXHMqJXtIVFRQOngtd2FwLXByb2ZpbGUiO2k6MTY5O3M6MjI6ImV2YWxccypcKFxzKmdldF9vcHRpb24iO2k6MTcwO3M6Mjk6ImVjaG9ccytbJyJdezAsMX1nb29kWyciXXswLDF9IjtpOjE3MTtzOjUxOiJDVVJMT1BUX1JFRkVSRVIsXHMqWyciXXswLDF9aHR0cHM6Ly93d3dcLmdvb2dsZVwuY28iO2k6MTcyO3M6MTU6IlwkYXV0aF9wYXNzXHMqPSI7aToxNzM7czo2NDoiPVxzKlwkR0xPQkFMU1xbXHMqWyciXV8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKVsnIl1ccypcXSI7aToxNzQ7czo2NDoiZWNob1xzK3N0cmlwc2xhc2hlc1xzKlwoXHMqXCRfKEdFVHxQT1NUfFNFUlZFUnxDT09LSUV8UkVRVUVTVClcWyI7aToxNzU7czoyMjoiPGgxPkxvYWRpbmdcLlwuXC48L2gxPiI7aToxNzY7czoxMjoicGhwaW5mb1woXCk7IjtpOjE3NztzOjE4NzoiKGV2YWx8YmFzZTY0X2RlY29kZXxnemluZmxhdGV8Z3p1bmNvbXByZXNzfHN0cl9yb3QxM3xtZDUpXHMqXChccyooZXZhbHxiYXNlNjRfZGVjb2RlfGd6aW5mbGF0ZXxnenVuY29tcHJlc3N8c3RyX3JvdDEzfG1kNSlccypcKFxzKihldmFsfGJhc2U2NF9kZWNvZGV8Z3ppbmZsYXRlfGd6dW5jb21wcmVzc3xzdHJfcm90MTN8bWQ1KSI7aToxNzg7czoxMToiSGFja2VkXHMrQnkiO2k6MTc5O3M6MTU6IlsnIl0vXC5cKi9lWyciXSI7aToxODA7czoyODoiZWNob1xzKlwoKlxzKlsnIl1OTyBGSUxFWyciXSI7aToxODE7czoxOTA6Im1vdmVfdXBsb2FkZWRfZmlsZVxzKlwoKlxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkX0ZJTEVTXFtccypbJyJdezAsMX1maWxlbmFtZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX1uYW1lWyciXXswLDF9XHMqXF0iO2k6MTgyO3M6MjM6ImNvcHlccypcKFxzKlsnIl1odHRwOi8vIjtpOjE4MztzOjgyOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9UmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKlVSTD1odHRwOi8vIjtpOjE4NDtzOjgxOiI8bWV0YVxzK2h0dHAtZXF1aXY9WyciXXswLDF9cmVmcmVzaFsnIl17MCwxfVxzK2NvbnRlbnQ9WyciXXswLDF9XGQrO1xzKnVybD08XD9waHAiO2k6MTg1O3M6MTA6IlsnIl1hSFIwY0QiO2k6MTg2O3M6Njc6InN0cmNoclxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg3O3M6Njc6InN0cnN0clxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg4O3M6Njc6InN0cnBvc1xzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF0iO2k6MTg5O3M6MzM6IkFkZFR5cGVccythcHBsaWNhdGlvbi94LWh0dHBkLXBocCI7aToxOTA7czoxMDoicGNudGxfZXhlYyI7aToxOTE7czo2OToiKGZ0cF9leGVjfHN5c3RlbXxzaGVsbF9leGVjfHBhc3N0aHJ1fHBvcGVufHByb2Nfb3BlbilcKCpbJyJdY2RccysvdG1wIjtpOjE5MjtzOjI3OiJcJE9PTy4rPz1ccyp1cmxkZWNvZGVccypcKCoiO2k6MTkzO3M6MTI6InJtXHMrLWZccystciI7aToxOTQ7czoxMjoicm1ccystclxzKy1mIjtpOjE5NTtzOjg6InJtXHMrLWZyIjtpOjE5NjtzOjg6InJtXHMrLXJmIjtpOjE5NztzOjYzOiIoaW5jbHVkZXxpbmNsdWRlX29uY2V8cmVxdWlyZXxyZXF1aXJlX29uY2UpXHMqXCgqXHMqWyciXWltYWdlcy8iO2k6MTk4O3M6ODk6IihpbmNsdWRlfGluY2x1ZGVfb25jZXxyZXF1aXJlfHJlcXVpcmVfb25jZSlccypcKCpccypAKlwkXyhHRVR8UE9TVHxTRVJWRVJ8Q09PS0lFfFJFUVVFU1QpIjtpOjE5OTtzOjU5OiJiYXNlNjRfZGVjb2RlXHMqXCgqXHMqQCpcJF8oR0VUfFBPU1R8U0VSVkVSfENPT0tJRXxSRVFVRVNUKSI7aToyMDA7czo1MToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZVxzKlwoXHMqWyciXXswLDF9JTNDIjtpOjIwMTtzOjg6Ii8vTk9uYU1FIjtpOjIwMjtzOjg6ImxzXHMrLWxhIjtpOjIwMztzOjM3OiJpbmlfc2V0XChccypbJyJdezAsMX1tYWdpY19xdW90ZXNfZ3BjIjtpOjIwNDtzOjI4OiJhbmRyb2lkXHxhdmFudGdvXHxibGFja2JlcnJ5IjtpOjIwNTtzOjQxOiJmaW5kXHMrL1xzKy10eXBlXHMrZlxzKy1uYW1lXHMrXC5odHBhc3N3ZCI7aToyMDY7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wMjAwMCI7aToyMDc7czozNzoiZmluZFxzKy9ccystdHlwZVxzK2ZccystcGVybVxzKy0wNDAwMCI7fQ=="));
$g_ExceptFlex = unserialize(base64_decode("YToxMDc6e2k6MDtzOjM3OiJlY2hvICI8c2NyaXB0PiBhbGVydFwoJyJcLlwkZGItPmdldEVyIjtpOjE7czo0MDoiZWNobyAiPHNjcmlwdD4gYWxlcnRcKCciXC5cJG1vZGVsLT5nZXRFciI7aToyO3M6ODoic29ydFwoXCkiO2k6MztzOjEwOiJtdXN0LXJldmFsIjtpOjQ7czo2OiJyaWV2YWwiO2k6NTtzOjk6ImRvdWJsZXZhbCI7aTo2O3M6NjY6InJlcXVpcmVccypcKCpccypcJF9TRVJWRVJcW1xzKlsnIl17MCwxfURPQ1VNRU5UX1JPT1RbJyJdezAsMX1ccypcXSI7aTo3O3M6NzE6InJlcXVpcmVfb25jZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjg7czo2NjoiaW5jbHVkZVxzKlwoKlxzKlwkX1NFUlZFUlxbXHMqWyciXXswLDF9RE9DVU1FTlRfUk9PVFsnIl17MCwxfVxzKlxdIjtpOjk7czo3MToiaW5jbHVkZV9vbmNlXHMqXCgqXHMqXCRfU0VSVkVSXFtccypbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XHMqXF0iO2k6MTA7czoxNzoiXCRzbWFydHktPl9ldmFsXCgiO2k6MTE7czozMDoicHJlcFxzK3JtXHMrLXJmXHMrJXtidWlsZHJvb3R9IjtpOjEyO3M6MjI6IlRPRE86XHMrcm1ccystcmZccyt0aGUiO2k6MTM7czoyNzoia3Jzb3J0XChcJHdwc21pbGllc3RyYW5zXCk7IjtpOjE0O3M6NjM6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCIlM0NzY3JpcHQgc3JjPSciIFwrIGdhSnNIb3N0IFwrICJnbyI7aToxNTtzOjY6IlwuZXhlYyI7aToxNjtzOjg6ImV4ZWNcKFwpIjtpOjE3O3M6MjQ6IlwkeDEgPSBcJHRoaXMtPncgLSBcJHgxOyI7aToxODtzOjMxOiJhc29ydFwoXCRDYWNoZURpck9sZEZpbGVzQWdlXCk7IjtpOjE5O3M6MTM6IlwoJ3I1N3NoZWxsJywiO2k6MjA7czoyNToiZXZhbFwoImxpc3RlbmVyID0gIlwrbGlzdCI7aToyMTtzOjg6ImV2YWxcKFwpIjtpOjIyO3M6MzM6InByZWdfcmVwbGFjZV9jYWxsYmFja1woJy9cXHtcKGltYSI7aToyMztzOjIxOiJldmFsIFwoX2N0TWVudUluaXRTdHIiO2k6MjQ7czoyOToiYmFzZTY0X2RlY29kZVwoXCRhY2NvdW50S2V5XCkiO2k6MjU7czozOToiYmFzZTY0X2RlY29kZVwoXCRkYXRhXClcKTsgXCRhcGktPnNldFJlIjtpOjI2O3M6NDg6InJlcXVpcmVcKFwkX1NFUlZFUlxbXFwiRE9DVU1FTlRfUk9PVFxcIlxdXC5cXCIvYiI7aToyNztzOjY1OiJiYXNlNjRfZGVjb2RlXChcJF9SRVFVRVNUXFsncGFyYW1ldGVycydcXVwpOyBpZlwoQ2hlY2tTZXJpYWxpemVkRCI7aToyODtzOjYzOiJwY250bF9leGVjJyA9PiBBcnJheVwoQXJyYXlcKDFcKSwgXCRhclJlc3VsdFxbJ1NFQ1VSSU5HX0ZVTkNUSU8iO2k6Mjk7czozOToiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkNVdGlsOjpKU0VzY2FwIjtpOjMwO3M6Njg6ImJhc2U2NF9kZWNvZGVcKFwkX1JFUVVFU1RcWyd0aXRsZV9jaGFuZ2VyX2xpbmsnXF1cKTsgaWYgXChzdHJsZW5cKFwkIjtpOjMxO3M6NTE6ImV2YWxcKCdcJGhleGR0aW1lID0gIicgXC4gXCRoZXhkdGltZSBcLiAnIjsnXCk7IFwkZiI7aTozMjtzOjUyOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnXCRyb3ctPnRpdGxlIC0gIlwuX01PRFVMRV9JU19FIjtpOjMzO3M6Mzc6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCdcJGNpZHMgIlwuX0NBTk4iO2k6MzQ7czo0MToiaWZcKDFcKSB7IFwkdl9ob3VyID0gXChcJHBfaGVhZGVyXFsnbXRpbWUiO2k6MzU7czo3MDoiZG9jdW1lbnRcLndyaXRlXCh1bmVzY2FwZVwoIiUzQ3NjcmlwdCUyMHNyYz0lMjJodHRwIiBcKyBcKFwoImh0dHBzOiIgPSI7aTozNjtzOjU3OiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nIiBcKyBwa0Jhc2VVUkwiO2k6Mzc7czozMjoiZWNobyAiPHNjcmlwdD5hbGVydFwoJyJcLkpUZXh0OjoiO2k6Mzg7czoyNToiJ2ZpbGVuYW1lJ1wpLCBcKCdyNTdzaGVsbCI7aTozOTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIiBcLiBcJGVyck1zZyBcLiAiJ1wpIjtpOjQwO3M6NDI6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKFxcIkVycm9yIHdoZW4gbG9hZGluZyI7aTo0MTtzOjQzOiJlY2hvICI8c2NyaXB0PmFsZXJ0XCgnIlwuSlRleHQ6Ol9cKCdWQUxJRF9FIjtpOjQyO3M6ODoiZXZhbFwoXCkiO2k6NDM7czo4OiInc3lzdGVtJyI7aTo0NDtzOjY6IidldmFsJyI7aTo0NTtzOjY6IiJldmFsIiI7aTo0NjtzOjY6ImNvcHlcKCI7aTo0NztzOjc6Il9zeXN0ZW0iO2k6NDg7czo5OiJzYXZlMmNvcHkiO2k6NDk7czoxMDoiZmlsZXN5c3RlbSI7aTo1MDtzOjg6InNlbmRtYWlsIjtpOjUxO3M6ODoiY2FuQ2htb2QiO2k6NTI7czoxMzoiL2V0Yy9wYXNzd2RcKSI7aTo1MztzOjI0OiJ1ZHA6Ly8nXC5zZWxmOjpcJF9jX2FkZHIiO2k6NTQ7czozNDoiZWRvY2VkXzQ2ZXNhYlwoJydcfCJcKVxcXCknLCAncmVnZSI7aTo1NTtzOjk6ImRvdWJsZXZhbCI7aTo1NjtzOjE2OiJvcGVyYXRpbmcgc3lzdGVtIjtpOjU3O3M6MTA6Imdsb2JhbGV2YWwiO2k6NTg7czoyMToid2l0aCAwLzAvMCBpZiBcKDFcKSB7IjtpOjU5O3M6NDg6IlwkeDIgPSBcJHBhcmFtXFtbJyJdezAsMX14WyciXXswLDF9XF0gXCsgXCR3aWR0aCI7aTo2MDtzOjExOiJzcGVjaWFsaXNlZCI7aTo2MTtzOjE5OiJ3cF9nZXRfY3VycmVudF91c2VyIjtpOjYyO3M6NzoiLT5jaG1vZCI7aTo2MztzOjc6Il9tYWlsXCgiO2k6NjQ7czo3OiJfY29weVwoIjtpOjY1O3M6NDY6InN0cnBvc1woXCRfU0VSVkVSXFsnSFRUUF9VU0VSX0FHRU5UJ1xdLCAnRHJ1cGEiO2k6NjY7czo0NToic3RycG9zXChcJF9TRVJWRVJcWydIVFRQX1VTRVJfQUdFTlQnXF0sICdNU0lFIjtpOjY3O3M6NDU6InN0cnBvc1woXCRfU0VSVkVSXFsiSFRUUF9VU0VSX0FHRU5UIlxdLCAnTVNJRSI7aTo2ODtzOjE3OiJldmFsIFwoY2xhc3NTdHJcKSI7aTo2OTtzOjMxOiJmdW5jdGlvbl9leGlzdHNcKCdiYXNlNjRfZGVjb2RlIjtpOjcwO3M6NDQ6ImVjaG8gIjxzY3JpcHQ+YWxlcnRcKCciXC5KVGV4dDo6X1woJ1ZBTElEX0VNIjtpOjcxO3M6NTI6IlwkeDEgPSBcJG1pbl94OyBcJHgyID0gXCRtYXhfeDsgXCR5MSA9IFwkbWluX3k7IFwkeTIiO2k6NzI7czo1NToiXCRjdG1cWydhJ1xdXClcKSB7IFwkeCA9IFwkeCBcKiBcJHRoaXMtPms7IFwkeSA9IFwoXCR0aCI7aTo3MztzOjYwOiJbJyJdezAsMX1jcmVhdGVfZnVuY3Rpb25bJyJdezAsMX0sIFsnIl17MCwxfWdldF9yZXNvdXJjZV90eXAiO2k6NzQ7czo0OToiWyciXXswLDF9Y3JlYXRlX2Z1bmN0aW9uWyciXXswLDF9LCBbJyJdezAsMX1jcnlwdCI7aTo3NTtzOjY5OiJzdHJwb3NcKFwkX1NFUlZFUlxbWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XF0sIFsnIl17MCwxfUx5bngiO2k6NzY7czo2ODoic3Ryc3RyXChcJF9TRVJWRVJcW1snIl17MCwxfUhUVFBfVVNFUl9BR0VOVFsnIl17MCwxfVxdLCBbJyJdezAsMX1NU0kiO2k6Nzc7czoyNToic29ydFwoXCREaXN0cmlidXRpb25cW1wkayI7aTo3ODtzOjI1OiJzb3J0XChmdW5jdGlvblwoYSxiXCl7cmV0IjtpOjc5O3M6MjU6Imh0dHA6Ly93d3dcLmZhY2Vib29rXC5jb20iO2k6ODA7czoyNToiaHR0cDovL21hcHNcLmdvb2dsZVwuY29tLyI7aTo4MTtzOjUyOiJ1ZHA6Ly8nXC5zZWxmOjpcJGNfYWRkciwgODAsIFwkZXJybm8sIFwkZXJyc3RyLCAxNTAwIjtpOjgyO3M6MjA6IlwoXC5cKlwodmlld1wpXD9cLlwqIjtpOjgzO3M6NDQ6ImVjaG8gWyciXXswLDF9PHNjcmlwdD5hbGVydFwoWyciXXswLDF9XCR0ZXh0IjtpOjg0O3M6MTc6InNvcnRcKFwkdl9saXN0XCk7IjtpOjg1O3M6Nzc6Im1vdmVfdXBsb2FkZWRfZmlsZVwoIFwkX0ZJTEVTXFsndXBsb2FkZWRfcGFja2FnZSdcXVxbJ3RtcF9uYW1lJ1xdLCBcJG1vc0NvbmZpIjtpOjg2O3M6MzE6IkNyZWRpdCBDYXJkIFZlcmlmaWNhdGlvbiBDb2RlJzsiO2k6ODc7czoxMjoiZmFsc2VcKSBcKTsjIjtpOjg4O3M6MTU6Im5jeV9uYW1lYCcgXCk7IyI7aTo4OTtzOjQ3OiJzdHJwb3NcKFwkX1NFUlZFUlxbJ0hUVFBfVVNFUl9BR0VOVCdcXSwgJ01hYyBPUyI7aTo5MDtzOjIwOiIvL25vbmFtZTogJzxcPz1DVXRpbCI7aTo5MTtzOjUwOiJkb2N1bWVudFwud3JpdGVcKHVuZXNjYXBlXCgiJTNDc2NyaXB0IHNyYz0nL2JpdHJpeCI7aTo5MjtzOjI1OiJcJF9TRVJWRVIgXFsiUkVNT1RFX0FERFIiIjtpOjkzO3M6MTc6ImFIUjBjRG92TDJOeWJETXVaIjtpOjk0O3M6NTU6IkpSZXNwb25zZTo6c2V0Qm9keVwocHJlZ19yZXBsYWNlXChcJHBhdHRlcm5zLCBcJHJlcGxhY2UiO2k6OTU7czo0MDoiXFx4MWZcXHg4YlxceDA4XFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCI7aTo5NjtzOjQwOiJcXHg1MFxceDRiXFx4MDVcXHgwNlxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjk3O3M6NDY6IlxceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceDJGXFx4M0VcXVxbXF4iO2k6OTg7czo0MDoiXFx4ODlcXHg1MFxceDRFXFx4NDdcXHgwRFxceDBBXFx4MUFcXHgwQSI7aTo5OTtzOjEwOiJcKTsjaScsICcmIjtpOjEwMDtzOjE3OiJcKTsjbWlzJywgJyAnLCBcJCI7aToxMDE7czoyMDoiXCk7I2knLCBcJGRhdGEsIFwkbWEiO2k6MTAyO3M6MzU6IlwkZnVuY1woIFwkcGFyYW1zXFtcJHR5cGVcXS0+cGFyYW1zIjtpOjEwMztzOjQwOiJcXHgxZlxceDhiXFx4MDhcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwIjtpOjEwNDtzOjQ1OiJcXHgwMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFx4MDgiO2k6MTA1O3M6NDA6IlxceDIxXFx4MjNcXHgyNFxceDI1XFx4MjZcXHgyN1xceDJhXFx4MmIiO2k6MTA2O3M6MzU6IlxceDgzXFx4OEJcXHg4RFxceDlCXFx4OUVcXHg5RlxceEExIjt9"));
$g_SusDB = unserialize(base64_decode("YToxMzE6e2k6MDtzOjE0OiJAKmV4dHJhY3RccypcKCI7aToxO3M6MTQ6IkAqZXh0cmFjdFxzKlwkIjtpOjI7czoxMjoiWyciXWV2YWxbJyJdIjtpOjM7czoyMToiWyciXWJhc2U2NF9kZWNvZGVbJyJdIjtpOjQ7czoyMzoiWyciXWNyZWF0ZV9mdW5jdGlvblsnIl0iO2k6NTtzOjE0OiJbJyJdYXNzZXJ0WyciXSI7aTo2O3M6NDM6ImZvcmVhY2hccypcKFxzKlwkZW1haWxzXHMrYXNccytcJGVtYWlsXHMqXCkiO2k6NztzOjc6IlNwYW1tZXIiO2k6ODtzOjE1OiJldmFsXHMqWyciXChcJF0iO2k6OTtzOjE3OiJhc3NlcnRccypbJyJcKFwkXSI7aToxMDtzOjI4OiJzcnBhdGg6Ly9cLlwuL1wuXC4vXC5cLi9cLlwuIjtpOjExO3M6MTI6InBocGluZm9ccypcKCI7aToxMjtzOjE2OiJTSE9XXHMrREFUQUJBU0VTIjtpOjEzO3M6MTI6IlxicG9wZW5ccypcKCI7aToxNDtzOjk6ImV4ZWNccypcKCI7aToxNTtzOjEzOiJcYnN5c3RlbVxzKlwoIjtpOjE2O3M6MTU6IlxicGFzc3RocnVccypcKCI7aToxNztzOjE2OiJcYnByb2Nfb3BlblxzKlwoIjtpOjE4O3M6MTU6InNoZWxsX2V4ZWNccypcKCI7aToxOTtzOjE2OiJpbmlfcmVzdG9yZVxzKlwoIjtpOjIwO3M6OToiXGJkbFxzKlwoIjtpOjIxO3M6MTQ6Ilxic3ltbGlua1xzKlwoIjtpOjIyO3M6MTI6IlxiY2hncnBccypcKCI7aToyMztzOjE0OiJcYmluaV9zZXRccypcKCI7aToyNDtzOjEzOiJcYnB1dGVudlxzKlwoIjtpOjI1O3M6MTM6ImdldG15dWlkXHMqXCgiO2k6MjY7czoxNDoiZnNvY2tvcGVuXHMqXCgiO2k6Mjc7czoxNzoicG9zaXhfc2V0dWlkXHMqXCgiO2k6Mjg7czoxNzoicG9zaXhfc2V0c2lkXHMqXCgiO2k6Mjk7czoxODoicG9zaXhfc2V0cGdpZFxzKlwoIjtpOjMwO3M6MTU6InBvc2l4X2tpbGxccypcKCI7aTozMTtzOjI3OiJhcGFjaGVfY2hpbGRfdGVybWluYXRlXHMqXCgiO2k6MzI7czoxMjoiXGJjaG1vZFxzKlwoIjtpOjMzO3M6MTI6IlxiY2hkaXJccypcKCI7aTozNDtzOjE1OiJwY250bF9leGVjXHMqXCgiO2k6MzU7czoxNDoiXGJ2aXJ0dWFsXHMqXCgiO2k6MzY7czoxNToicHJvY19jbG9zZVxzKlwoIjtpOjM3O3M6MjA6InByb2NfZ2V0X3N0YXR1c1xzKlwoIjtpOjM4O3M6MTk6InByb2NfdGVybWluYXRlXHMqXCgiO2k6Mzk7czoxNDoicHJvY19uaWNlXHMqXCgiO2k6NDA7czoxMzoiZ2V0bXlnaWRccypcKCI7aTo0MTtzOjE5OiJwcm9jX2dldHN0YXR1c1xzKlwoIjtpOjQyO3M6MTU6InByb2NfY2xvc2VccypcKCI7aTo0MztzOjE5OiJlc2NhcGVzaGVsbGNtZFxzKlwoIjtpOjQ0O3M6MTk6ImVzY2FwZXNoZWxsYXJnXHMqXCgiO2k6NDU7czoxNjoic2hvd19zb3VyY2VccypcKCI7aTo0NjtzOjEzOiJcYnBjbG9zZVxzKlwoIjtpOjQ3O3M6MTM6InNhZmVfZGlyXHMqXCgiO2k6NDg7czoxNjoiaW5pX3Jlc3RvcmVccypcKCI7aTo0OTtzOjEwOiJjaG93blxzKlwoIjtpOjUwO3M6MTA6ImNoZ3JwXHMqXCgiO2k6NTE7czoxNzoic2hvd25fc291cmNlXHMqXCgiO2k6NTI7czoxOToibXlzcWxfbGlzdF9kYnNccypcKCI7aTo1MztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTQ7czoxMjoiZ2V0bXlpZFxzKlwoIjtpOjU1O3M6MTE6IlxibGVha1xzKlwoIjtpOjU2O3M6MTU6InBmc29ja29wZW5ccypcKCI7aTo1NztzOjIxOiJnZXRfY3VycmVudF91c2VyXHMqXCgiO2k6NTg7czoxMToic3lzbG9nXHMqXCgiO2k6NTk7czoxODoiXCRkZWZhdWx0X3VzZV9hamF4IjtpOjYwO3M6MjE6ImV2YWxccypcKCpccyp1bmVzY2FwZSI7aTo2MTtzOjc6IkZMb29kZVIiO2k6NjI7czozMToiZG9jdW1lbnRcLndyaXRlXHMqXChccyp1bmVzY2FwZSI7aTo2MztzOjExOiJcYmNvcHlccypcKCI7aTo2NDtzOjIzOiJtb3ZlX3VwbG9hZGVkX2ZpbGVccypcKCI7aTo2NTtzOjg6IlwuMzMzMzMzIjtpOjY2O3M6ODoiXC42NjY2NjYiO2k6Njc7czoyMToicm91bmRccypcKCpccyowXHMqXCkqIjtpOjY4O3M6MTExOiJjb3B5XHMqXCgqXHMqXCRfRklMRVNccypcW1xzKlsnIl17MCwxfWZpbGVbJyJdezAsMX1ccypcXVxbXHMqWyciXXswLDF9dG1wX25hbWVbJyJdezAsMX1ccypcXVxzKixccypcJHVwbG9hZGZpbGUiO2k6Njk7czoxMjY6Im1vdmVfdXBsb2FkZWRfZmlsZXNccypcKCpccypcJF9GSUxFU1xzKlxbXHMqWyciXXswLDF9ZmlsZVsnIl17MCwxfVxzKlxdXFtccypbJyJdezAsMX10bXBfbmFtZVsnIl17MCwxfVxzKlxdXHMqLFxzKlwkdXBsb2FkZmlsZSI7aTo3MDtzOjUwOiJpbmlfZ2V0XHMqXChccypbJyJdezAsMX1kaXNhYmxlX2Z1bmN0aW9uc1snIl17MCwxfSI7aTo3MTtzOjM2OiJVTklPTlxzK1NFTEVDVFxzK1snIl17MCwxfTBbJyJdezAsMX0iO2k6NzI7czoxMDoiMlxzKj5ccyomMSI7aTo3MztzOjU3OiJlY2hvXHMqXCgqXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1ET0NVTUVOVF9ST09UWyciXXswLDF9XF0iO2k6NzQ7czozNzoiPVxzKkFycmF5XHMqXCgqXHMqYmFzZTY0X2RlY29kZVxzKlwoKiI7aTo3NTtzOjE0OiJraWxsYWxsXHMrLVxkKyI7aTo3NjtzOjc6ImVyaXVxZXIiO2k6Nzc7czoxMDoidG91Y2hccypcKCI7aTo3ODtzOjc6InNzaGtleXMiO2k6Nzk7czo4OiJAaW5jbHVkZSI7aTo4MDtzOjg6IkByZXF1aXJlIjtpOjgxO3M6NjI6ImlmXHMqXChtYWlsXHMqXChccypcJHRvLFxzKlwkc3ViamVjdCxccypcJG1lc3NhZ2UsXHMqXCRoZWFkZXJzIjtpOjgyO3M6Mzg6IkBpbmlfc2V0XHMqXCgqWyciXXswLDF9YWxsb3dfdXJsX2ZvcGVuIjtpOjgzO3M6MTg6IkBmaWxlX2dldF9jb250ZW50cyI7aTo4NDtzOjE3OiJmaWxlX3B1dF9jb250ZW50cyI7aTo4NTtzOjQ2OiJhbmRyb2lkXHMqXHxccyptaWRwXHMqXHxccypqMm1lXHMqXHxccypzeW1iaWFuIjtpOjg2O3M6Mjg6IkBzZXRjb29raWVccypcKCpbJyJdezAsMX1oaXQiO2k6ODc7czoxMDoiQGZpbGVvd25lciI7aTo4ODtzOjY6IjxrdWt1PiI7aTo4OTtzOjU6InN5cGV4IjtpOjkwO3M6OToiXCRiZWVjb2RlIjtpOjkxO3M6ODoiQmFja2Rvb3IiO2k6OTI7czoxNDoicGhwX3VuYW1lXHMqXCgiO2k6OTM7czo1NToibWFpbFxzKlwoKlxzKlwkdG9ccyosXHMqXCRzdWJqXHMqLFxzKlwkbXNnXHMqLFxzKlwkZnJvbSI7aTo5NDtzOjI5OiJlY2hvXHMqWyciXTxzY3JpcHQ+XHMqYWxlcnRcKCI7aTo5NTtzOjY3OiJtYWlsXHMqXCgqXHMqXCRzZW5kXHMqLFxzKlwkc3ViamVjdFxzKixccypcJGhlYWRlcnNccyosXHMqXCRtZXNzYWdlIjtpOjk2O3M6NjU6Im1haWxccypcKCpccypcJHRvXHMqLFxzKlwkc3ViamVjdFxzKixccypcJG1lc3NhZ2VccyosXHMqXCRoZWFkZXJzIjtpOjk3O3M6MTIwOiJzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9SFRUUF9bJyJdezAsMX1ccypcKSpccyohPT1ccyowXHMqJiZccypzdHJwb3NccypcKCpccypcJG5hbWVccyosXHMqWyciXXswLDF9UkVRVUVTVF8iO2k6OTg7czo1MzoiaXNfZnVuY3Rpb25fZW5hYmxlZFxzKlwoXHMqWyciXXswLDF9aWdub3JlX3VzZXJfYWJvcnQiO2k6OTk7czozMDoiZWNob1xzKlwoKlxzKmZpbGVfZ2V0X2NvbnRlbnRzIjtpOjEwMDtzOjI2OiJlY2hvXHMqXCgqWyciXXswLDF9PHNjcmlwdCI7aToxMDE7czozMToicHJpbnRccypcKCpccypmaWxlX2dldF9jb250ZW50cyI7aToxMDI7czoyNzoicHJpbnRccypcKCpbJyJdezAsMX08c2NyaXB0IjtpOjEwMztzOjg1OiI8bWFycXVlZVxzK3N0eWxlXHMqPVxzKlsnIl17MCwxfXBvc2l0aW9uXHMqOlxzKmFic29sdXRlXHMqO1xzKndpZHRoXHMqOlxzKlxkK1xzKnB4XHMqIjtpOjEwNDtzOjQyOiI9XHMqWyciXXswLDF9XC5cLi9cLlwuL1wuXC4vd3AtY29uZmlnXC5waHAiO2k6MTA1O3M6NzoiZWdnZHJvcCI7aToxMDY7czo5OiJyd3hyd3hyd3giO2k6MTA3O3M6MTU6ImVycm9yX3JlcG9ydGluZyI7aToxMDg7czoxNzoiXGJjcmVhdGVfZnVuY3Rpb24iO2k6MTA5O3M6NDM6Intccypwb3NpdGlvblxzKjpccyphYnNvbHV0ZTtccypsZWZ0XHMqOlxzKi0iO2k6MTEwO3M6MTU6IjxzY3JpcHRccythc3luYyI7aToxMTE7czo2NjoiX1snIl17MCwxfVxzKlxdXHMqPVxzKkFycmF5XHMqXChccypiYXNlNjRfZGVjb2RlXHMqXCgqXHMqWyciXXswLDF9IjtpOjExMjtzOjMzOiJBZGRUeXBlXHMrYXBwbGljYXRpb24veC1odHRwZC1jZ2kiO2k6MTEzO3M6NDQ6ImdldGVudlxzKlwoKlxzKlsnIl17MCwxfUhUVFBfQ09PS0lFWyciXXswLDF9IjtpOjExNDtzOjQ1OiJpZ25vcmVfdXNlcl9hYm9ydFxzKlwoKlxzKlsnIl17MCwxfTFbJyJdezAsMX0iO2k6MTE1O3M6MjE6IlwkX1JFUVVFU1RccypcW1xzKiUyMiI7aToxMTY7czo1MToidXJsXHMqXChbJyJdezAsMX1kYXRhXHMqOlxzKmltYWdlL3BuZztccypiYXNlNjRccyosIjtpOjExNztzOjUxOiJ1cmxccypcKFsnIl17MCwxfWRhdGFccyo6XHMqaW1hZ2UvZ2lmO1xzKmJhc2U2NFxzKiwiO2k6MTE4O3M6MzA6Ijpccyp1cmxccypcKFxzKlsnIl17MCwxfTxcP3BocCI7aToxMTk7czoxNzoiPC9odG1sPi4rPzxzY3JpcHQiO2k6MTIwO3M6MTc6IjwvaHRtbD4uKz88aWZyYW1lIjtpOjEyMTtzOjY0OiIoZnRwX2V4ZWN8c3lzdGVtfHNoZWxsX2V4ZWN8cGFzc3RocnV8cG9wZW58cHJvY19vcGVuKVxzKlsnIlwoXCRdIjtpOjEyMjtzOjExOiJcYm1haWxccypcKCI7aToxMjM7czo0NjoiZmlsZV9nZXRfY29udGVudHNccypcKCpccypbJyJdezAsMX1waHA6Ly9pbnB1dCI7aToxMjQ7czoxMTg6IjxtZXRhXHMraHR0cC1lcXVpdj1bJyJdezAsMX1Db250ZW50LXR5cGVbJyJdezAsMX1ccytjb250ZW50PVsnIl17MCwxfXRleHQvaHRtbDtccypjaGFyc2V0PXdpbmRvd3MtMTI1MVsnIl17MCwxfT48Ym9keT4iO2k6MTI1O3M6NjI6Ij1ccypkb2N1bWVudFwuY3JlYXRlRWxlbWVudFwoXHMqWyciXXswLDF9c2NyaXB0WyciXXswLDF9XHMqXCk7IjtpOjEyNjtzOjY5OiJkb2N1bWVudFwuYm9keVwuaW5zZXJ0QmVmb3JlXChkaXYsXHMqZG9jdW1lbnRcLmJvZHlcLmNoaWxkcmVuXFswXF1cKTsiO2k6MTI3O3M6Nzc6IjxzY3JpcHRccyt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXHMrc3JjPSJodHRwOi8vW2EtekEtWjAtOV9dKz9cLnBocCI+PC9zY3JpcHQ+IjtpOjEyODtzOjI3OiJlY2hvXHMrWyciXXswLDF9b2tbJyJdezAsMX0iO2k6MTI5O3M6MTg6Ii91c3Ivc2Jpbi9zZW5kbWFpbCI7aToxMzA7czoyMzoiL3Zhci9xbWFpbC9iaW4vc2VuZG1haWwiO30="));
$g_SusDBPrio = unserialize(base64_decode("YToxMjE6e2k6MDtpOjA7aToxO2k6MDtpOjI7aTowO2k6MztpOjA7aTo0O2k6MDtpOjU7aTowO2k6NjtpOjA7aTo3O2k6MDtpOjg7aToxO2k6OTtpOjE7aToxMDtpOjA7aToxMTtpOjA7aToxMjtpOjA7aToxMztpOjA7aToxNDtpOjA7aToxNTtpOjA7aToxNjtpOjA7aToxNztpOjA7aToxODtpOjA7aToxOTtpOjA7aToyMDtpOjA7aToyMTtpOjA7aToyMjtpOjA7aToyMztpOjA7aToyNDtpOjA7aToyNTtpOjA7aToyNjtpOjA7aToyNztpOjA7aToyODtpOjA7aToyOTtpOjE7aTozMDtpOjE7aTozMTtpOjA7aTozMjtpOjA7aTozMztpOjA7aTozNDtpOjA7aTozNTtpOjA7aTozNjtpOjA7aTozNztpOjA7aTozODtpOjA7aTozOTtpOjA7aTo0MDtpOjA7aTo0MTtpOjA7aTo0MjtpOjA7aTo0MztpOjA7aTo0NDtpOjA7aTo0NTtpOjA7aTo0NjtpOjA7aTo0NztpOjA7aTo0ODtpOjA7aTo0OTtpOjA7aTo1MDtpOjA7aTo1MTtpOjA7aTo1MjtpOjA7aTo1MztpOjA7aTo1NDtpOjA7aTo1NTtpOjA7aTo1NjtpOjE7aTo1NztpOjA7aTo1ODtpOjA7aTo1OTtpOjI7aTo2MDtpOjE7aTo2MTtpOjA7aTo2MjtpOjA7aTo2MztpOjA7aTo2NDtpOjI7aTo2NTtpOjI7aTo2NjtpOjA7aTo2NztpOjA7aTo2ODtpOjA7aTo2OTtpOjI7aTo3MDtpOjE7aTo3MTtpOjA7aTo3MjtpOjA7aTo3MztpOjE7aTo3NDtpOjA7aTo3NTtpOjE7aTo3NjtpOjE7aTo3NztpOjI7aTo3ODtpOjE7aTo3OTtpOjM7aTo4MDtpOjI7aTo4MTtpOjA7aTo4MjtpOjI7aTo4MztpOjA7aTo4NDtpOjA7aTo4NTtpOjI7aTo4NjtpOjA7aTo4NztpOjA7aTo4ODtpOjA7aTo4OTtpOjE7aTo5MDtpOjE7aTo5MTtpOjE7aTo5MjtpOjE7aTo5MztpOjA7aTo5NDtpOjI7aTo5NTtpOjI7aTo5NjtpOjI7aTo5NztpOjI7aTo5ODtpOjI7aTo5OTtpOjE7aToxMDA7aToxO2k6MTAxO2k6MztpOjEwMjtpOjM7aToxMDM7aToxO2k6MTA0O2k6MztpOjEwNTtpOjM7aToxMDY7aToyO2k6MTA3O2k6MDtpOjEwODtpOjM7aToxMDk7aToxO2k6MTEwO2k6MTtpOjExMTtpOjM7aToxMTI7aTozO2k6MTEzO2k6MztpOjExNDtpOjE7aToxMTU7aToxO2k6MTE2O2k6MTtpOjExNztpOjQ7aToxMTg7aToxO2k6MTE5O2k6MztpOjEyMDtpOjA7fQ=="));
$g_AdwareSig = unserialize(base64_decode("YTozMzp7aTowO3M6MTk6Il9fbGlua2ZlZWRfcm9ib3RzX18iO2k6MTtzOjEzOiJMSU5LRkVFRF9VU0VSIjtpOjI7czoxNDoiTGlua2ZlZWRDbGllbnQiO2k6MztzOjE4OiJfX3NhcGVfZGVsaW1pdGVyX18iO2k6NDtzOjI5OiJkaXNwZW5zZXJcLmFydGljbGVzXC5zYXBlXC5ydSI7aTo1O3M6MTE6IkxFTktfY2xpZW50IjtpOjY7czoxMToiU0FQRV9jbGllbnQiO2k6NztzOjE2OiJfX2xpbmtmZWVkX2VuZF9fIjtpOjg7czoxNjoiU0xBcnRpY2xlc0NsaWVudCI7aTo5O3M6MTc6Ii0+R2V0TGlua3NccypcKFwpIjtpOjEwO3M6MTc6ImRiXC50cnVzdGxpbmtcLnJ1IjtpOjExO3M6Mzc6ImNsYXNzXHMrQ01fY2xpZW50XHMrZXh0ZW5kc1xzKkNNX2Jhc2UiO2k6MTI7czoxOToibmV3XHMrQ01fY2xpZW50XChcKSI7aToxMztzOjE2OiJ0bF9saW5rc19kYl9maWxlIjtpOjE0O3M6MjA6ImNsYXNzXHMrbG1wX2Jhc2Vccyt7IjtpOjE1O3M6MTU6IlRydXN0bGlua0NsaWVudCI7aToxNjtzOjEzOiItPlxzKlNMQ2xpZW50IjtpOjE3O3M6MTY2OiJpc3NldFxzKlwoKlxzKlwkX1NFUlZFUlxzKlxbXHMqWyciXXswLDF9SFRUUF9VU0VSX0FHRU5UWyciXXswLDF9XHMqXF1ccypcKVxzKiYmXHMqXCgqXHMqXCRfU0VSVkVSXHMqXFtccypbJyJdezAsMX1IVFRQX1VTRVJfQUdFTlRbJyJdezAsMX1cXVxzKj09XHMqWyciXXswLDF9TE1QX1JvYm90IjtpOjE4O3M6NDM6IlwkbGlua3MtPlxzKnJldHVybl9saW5rc1xzKlwoKlxzKlwkbGliX3BhdGgiO2k6MTk7czo0NDoiXCRsaW5rc19jbGFzc1xzKj1ccypuZXdccytHZXRfbGlua3NccypcKCpccyoiO2k6MjA7czo1MjoiWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfVwuWyciXXswLDF9XHMqXCkqXHMqO1xzKlw/PiI7aToyMTtzOjc6Imxldml0cmEiO2k6MjI7czoxMDoiZGFwb3hldGluZSI7aToyMztzOjY6InZpYWdyYSI7aToyNDtzOjY6ImNpYWxpcyI7aToyNTtzOjg6InByb3ZpZ2lsIjtpOjI2O3M6MTk6ImNsYXNzXHMrVFdlZmZDbGllbnQiO2k6Mjc7czoxODoibmV3XHMrU0xDbGllbnRcKFwpIjtpOjI4O3M6MjQ6Il9fbGlua2ZlZWRfYmVmb3JlX3RleHRfXyI7aToyOTtzOjE2OiJfX3Rlc3RfdGxfbGlua19fIjtpOjMwO3M6MTg6InM6MTE6ImxtcF9jaGFyc2V0IiI7aTozMTtzOjIwOiI9XHMrbmV3XHMrTUxDbGllbnRcKCI7aTozMjtzOjQ3OiJlbHNlXHMraWZccypcKFxzKlwoXHMqc3RycG9zXChccypcJGxpbmtzX2lwXHMqLCI7fQ=="));
$g_JSVirSig = unserialize(base64_decode("YToxMTM6e2k6MDtzOjcwOiJ1c2VyQWdlbnRcfHBwXHxodHRwXHxkYXphbHl6WyciXXswLDF9XC5zcGxpdFwoWyciXXswLDF9XHxbJyJdezAsMX1cKSwwIjtpOjE7czo0MToiZj0nZidcKydyJ1wrJ28nXCsnbSdcKydDaCdcKydhckMnXCsnb2RlJzsiO2k6MjtzOjIyOiJcLnByb3RvdHlwZVwuYX1jYXRjaFwoIjtpOjM7czozNzoidHJ5e0Jvb2xlYW5cKFwpXC5wcm90b3R5cGVcLnF9Y2F0Y2hcKCI7aTo0O3M6MzQ6ImlmXChSZWZcLmluZGV4T2ZcKCdcLmdvb2dsZVwuJ1wpIT0iO2k6NTtzOjg2OiJpbmRleE9mXHxpZlx8cmNcfGxlbmd0aFx8bXNuXHx5YWhvb1x8cmVmZXJyZXJcfGFsdGF2aXN0YVx8b2dvXHxiaVx8aHBcfHZhclx8YW9sXHxxdWVyeSI7aTo2O3M6NTQ6IkFycmF5XC5wcm90b3R5cGVcLnNsaWNlXC5jYWxsXChhcmd1bWVudHNcKVwuam9pblwoIiJcKSI7aTo3O3M6ODI6InE9ZG9jdW1lbnRcLmNyZWF0ZUVsZW1lbnRcKCJkIlwrImkiXCsidiJcKTtxXC5hcHBlbmRDaGlsZFwocVwrIiJcKTt9Y2F0Y2hcKHF3XCl7aD0iO2k6ODtzOjc5OiJcK3p6O3NzPVxbXF07Zj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7dz10aGlzO2U9d1xbZlxbInN1YnN0ciJcXVwoIjtpOjk7czoxMTU6InM1XChxNVwpe3JldHVybiBcK1wrcTU7fWZ1bmN0aW9uIHlmXChzZix3ZVwpe3JldHVybiBzZlwuc3Vic3RyXCh3ZSwxXCk7fWZ1bmN0aW9uIHkxXCh3Ylwpe2lmXCh3Yj09MTY4XCl3Yj0xMDI1O2Vsc2UiO2k6MTA7czo2NDoiaWZcKG5hdmlnYXRvclwudXNlckFnZW50XC5tYXRjaFwoL1woYW5kcm9pZFx8bWlkcFx8ajJtZVx8c3ltYmlhbiI7aToxMTtzOjEwNjoiZG9jdW1lbnRcLndyaXRlXCgnPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IidcK2RvbWFpblwrJyI+PC9zY3InXCsnaXB0PidcKSI7aToxMjtzOjMxOiJodHRwOi8vcGhzcFwucnUvXy9nb1wucGhwXD9zaWQ9IjtpOjEzO3M6MTc6IjwvaHRtbD5ccyo8c2NyaXB0IjtpOjE0O3M6MTc6IjwvaHRtbD5ccyo8aWZyYW1lIjtpOjE1O3M6NjY6Ij1uYXZpZ2F0b3JcW2FwcFZlcnNpb25fdmFyXF1cLmluZGV4T2ZcKCJNU0lFIlwpIT0tMVw/JzxpZnJhbWUgbmFtZSI7aToxNjtzOjc6IlxceDY1QXQiO2k6MTc7czo5OiJcXHg2MXJDb2QiO2k6MTg7czoyMjoiImZyIlwrIm9tQyJcKyJoYXJDb2RlIiI7aToxOTtzOjExOiI9ImV2IlwrImFsIiI7aToyMDtzOjc4OiJcW1woXChlXClcPyJzIjoiIlwpXCsicCJcKyJsaXQiXF1cKCJhXCQiXFtcKFwoZVwpXD8ic3UiOiIiXClcKyJic3RyIlxdXCgxXClcKTsiO2k6MjE7czozOToiZj0nZnInXCsnb20nXCsnQ2gnO2ZcKz0nYXJDJztmXCs9J29kZSc7IjtpOjIyO3M6MjA6ImZcKz1cKGhcKVw/J29kZSc6IiI7IjtpOjIzO3M6NDE6ImY9J2YnXCsncidcKydvJ1wrJ20nXCsnQ2gnXCsnYXJDJ1wrJ29kZSc7IjtpOjI0O3M6NTA6ImY9J2Zyb21DaCc7ZlwrPSdhckMnO2ZcKz0ncWdvZGUnXFsic3Vic3RyIlxdXCgyXCk7IjtpOjI1O3M6MTY6InZhclxzK2Rpdl9jb2xvcnMiO2k6MjY7czo5OiJ2YXJccytfMHgiO2k6Mjc7czoyMDoiQ29yZUxpYnJhcmllc0hhbmRsZXIiO2k6Mjg7czo3OiJwaW5nbm93IjtpOjI5O3M6ODoic2VyY2hib3QiO2k6MzA7czoxMDoia20wYWU5Z3I2bSI7aTozMTtzOjY6ImMzMjg0ZCI7aTozMjtzOjg6IlxceDY4YXJDIjtpOjMzO3M6ODoiXFx4NmRDaGEiO2k6MzQ7czo3OiJcXHg2ZmRlIjtpOjM1O3M6NzoiXFx4NmZkZSI7aTozNjtzOjg6IlxceDQzb2RlIjtpOjM3O3M6NzoiXFx4NzJvbSI7aTozODtzOjc6IlxceDQzaGEiO2k6Mzk7czo3OiJcXHg3MkNvIjtpOjQwO3M6ODoiXFx4NDNvZGUiO2k6NDE7czoxMDoiXC5keW5kbnNcLiI7aTo0MjtzOjk6IlwuZHluZG5zLSI7aTo0MztzOjc5OiJ9XHMqZWxzZVxzKntccypkb2N1bWVudFwud3JpdGVccypcKFxzKlsnIl17MCwxfVwuWyciXXswLDF9XClccyp9XHMqfVxzKlJcKFxzKlwpIjtpOjQ0O3M6NDU6ImRvY3VtZW50XC53cml0ZVwodW5lc2NhcGVcKCclM0NkaXYlMjBpZCUzRCUyMiI7aTo0NTtzOjE4OiJcLmJpdGNvaW5wbHVzXC5jb20iO2k6NDY7czo0MToiXC5zcGxpdFwoIiYmIlwpO2g9MjtzPSIiO2lmXChtXClmb3JcKGk9MDsiO2k6NDc7czo0MToiPGlmcmFtZVxzK3NyYz0iaHR0cDovL2RlbHV4ZXNjbGlja3NcLnByby8iO2k6NDg7czo0NToiM0Jmb3JcfGZyb21DaGFyQ29kZVx8MkMyN1x8M0RcfDJDODhcfHVuZXNjYXBlIjtpOjQ5O3M6NTg6Ijtccypkb2N1bWVudFwud3JpdGVcKFsnIl17MCwxfTxpZnJhbWVccypzcmM9Imh0dHA6Ly95YVwucnUiO2k6NTA7czoxMTA6IndcLmRvY3VtZW50XC5ib2R5XC5hcHBlbmRDaGlsZFwoc2NyaXB0XCk7XHMqY2xlYXJJbnRlcnZhbFwoaVwpO1xzKn1ccyp9XHMqLFxzKlxkK1xzKlwpXHMqO1xzKn1ccypcKVwoXHMqd2luZG93IjtpOjUxO3M6MTEwOiJpZlwoIWdcKFwpJiZ3aW5kb3dcLm5hdmlnYXRvclwuY29va2llRW5hYmxlZFwpe2RvY3VtZW50XC5jb29raWU9IjE9MTtleHBpcmVzPSJcK2VcLnRvR01UU3RyaW5nXChcKVwrIjtwYXRoPS8iOyI7aTo1MjtzOjcwOiJubl9wYXJhbV9wcmVsb2FkZXJfY29udGFpbmVyXHw1MDAxXHxoaWRkZW5cfGlubmVySFRNTFx8aW5qZWN0XHx2aXNpYmxlIjtpOjUzO3M6MzE6IjwhLS0gW2EtekEtWjAtOV9dKz9cfFx8c3RhdCAtLT4iO2k6NTQ7czo4NToiJnBhcmFtZXRlcj1cJGtleXdvcmQmc2U9XCRzZSZ1cj0xJkhUVFBfUkVGRVJFUj0nXCtlbmNvZGVVUklDb21wb25lbnRcKGRvY3VtZW50XC5VUkxcKSI7aTo1NTtzOjQ4OiJ3aW5kb3dzXHxzZXJpZXNcfDYwXHxzeW1ib3NcfGNlXHxtb2JpbGVcfHN5bWJpYW4iO2k6NTY7czozNToiXFtbJyJdZXZhbFsnIl1cXVwoc1wpO319fX08L3NjcmlwdD4iO2k6NTc7czo1OToia0M3MEZNYmx5SmtGV1pvZENLbDFXWU9kV1lVbG5RelJuYmwxV1pzVkVkbGRtTDA1V1p0VjNZdlJHSTkiO2k6NTg7czo1NToie2s9aTtzPXNcLmNvbmNhdFwoc3NcKGV2YWxcKGFzcVwoXClcKS0xXClcKTt9ej1zO2V2YWxcKCI7aTo1OTtzOjEzMDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hcKG5ld1xzK1JlZ0V4cFwoXHMqIlwoXD86XF5cfDsgXCkiXHMqXCtccypuYW1lXC5yZXBsYWNlXCgvXChcW1xcXC5cJFw/XCpcfHt9XFxcKFxcXClcXFxbXFxcXVxcL1xcXCtcXlxdXCkvZyI7aTo2MDtzOjg2OiJzZXRDb29raWVccypcKCpccyoiYXJ4X3R0IlxzKixccyoxXHMqLFxzKmR0XC50b0dNVFN0cmluZ1woXClccyosXHMqWyciXXswLDF9L1snIl17MCwxfSI7aTo2MTtzOjE0NDoiZG9jdW1lbnRcLmNvb2tpZVwubWF0Y2hccypcKFxzKm5ld1xzK1JlZ0V4cFxzKlwoXHMqIlwoXD86XF5cfDtccypcKSJccypcK1xzKm5hbWVcLnJlcGxhY2VccypcKC9cKFxbXFxcLlwkXD9cKlx8e31cXFwoXFxcKVxcXFtcXFxdXFwvXFxcK1xeXF1cKS9nIjtpOjYyO3M6OTg6InZhclxzK2R0XHMrPVxzK25ld1xzK0RhdGVcKFwpLFxzK2V4cGlyeVRpbWVccys9XHMrZHRcLnNldFRpbWVcKFxzK2R0XC5nZXRUaW1lXChcKVxzK1wrXHMrOTAwMDAwMDAwIjtpOjYzO3M6MTA1OiJpZlxzKlwoXHMqbnVtXHMqPT09XHMqMFxzKlwpXHMqe1xzKnJldHVyblxzKjE7XHMqfVxzKmVsc2Vccyp7XHMqcmV0dXJuXHMrbnVtXHMqXCpccypyRmFjdFwoXHMqbnVtXHMqLVxzKjEiO2k6NjQ7czo0MToiXCs9U3RyaW5nXC5mcm9tQ2hhckNvZGVcKHBhcnNlSW50XCgwXCsneCciO2k6NjU7czo4MzoiPHNjcmlwdFxzK2xhbmd1YWdlPSJKYXZhU2NyaXB0Ij5ccypwYXJlbnRcLndpbmRvd1wub3BlbmVyXC5sb2NhdGlvbj0iaHR0cDovL3ZrXC5jb20iO2k6NjY7czo0NDoibG9jYXRpb25cLnJlcGxhY2VcKFsnIl17MCwxfWh0dHA6Ly92NWs0NVwucnUiO2k6Njc7czoxMjk6Ijt0cnl7XCtcK2RvY3VtZW50XC5ib2R5fWNhdGNoXChxXCl7YWE9ZnVuY3Rpb25cKGZmXCl7Zm9yXChpPTA7aTx6XC5sZW5ndGg7aVwrXCtcKXt6YVwrPVN0cmluZ1xbZmZcXVwoZVwodlwrXCh6XFtpXF1cKVwpLTEyXCk7fX07fSI7aTo2ODtzOjE0MjoiZG9jdW1lbnRcLndyaXRlXHMqXChbJyJdezAsMX08WyciXXswLDF9XHMqXCtccyp4XFswXF1ccypcK1xzKlsnIl17MCwxfSBbJyJdezAsMX1ccypcK1xzKnhcWzRcXVxzKlwrXHMqWyciXXswLDF9PlwuWyciXXswLDF9XHMqXCt4XHMqXFsyXF1ccypcKyI7aTo2OTtzOjYwOiJpZlwodFwubGVuZ3RoPT0yXCl7elwrPVN0cmluZ1wuZnJvbUNoYXJDb2RlXChwYXJzZUludFwodFwpXCsiO2k6NzA7czo3NDoid2luZG93XC5vbmxvYWRccyo9XHMqZnVuY3Rpb25cKFwpXHMqe1xzKmlmXHMqXChkb2N1bWVudFwuY29va2llXC5pbmRleE9mXCgiO2k6NzE7czo5NzoiXC5zdHlsZVwuaGVpZ2h0XHMqPVxzKlsnIl17MCwxfTBweFsnIl17MCwxfTt3aW5kb3dcLm9ubG9hZFxzKj1ccypmdW5jdGlvblwoXClccyp7ZG9jdW1lbnRcLmNvb2tpZSI7aTo3MjtzOjEyMjoiXC5zcmM9XChbJyJdezAsMX1odHBzOlsnIl17MCwxfT09ZG9jdW1lbnRcLmxvY2F0aW9uXC5wcm90b2NvbFw/WyciXXswLDF9aHR0cHM6Ly9zc2xbJyJdezAsMX06WyciXXswLDF9aHR0cDovL1snIl17MCwxfVwpXCsiO2k6NzM7czozMDoiNDA0XC5waHBbJyJdezAsMX0+XHMqPC9zY3JpcHQ+IjtpOjc0O3M6NzY6InByZWdfbWF0Y2hcKFsnIl17MCwxfS9zYXBlL2lbJyJdezAsMX1ccyosXHMqXCRfU0VSVkVSXFtbJyJdezAsMX1IVFRQX1JFRkVSRVIiO2k6NzU7czo3NDoiZGl2XC5pbm5lckhUTUxccypcKz1ccypbJyJdezAsMX08ZW1iZWRccytpZD0iZHVtbXkyIlxzK25hbWU9ImR1bW15MiJccytzcmMiO2k6NzY7czo3Mzoic2V0VGltZW91dFwoWyciXXswLDF9YWRkTmV3T2JqZWN0XChcKVsnIl17MCwxfSxcZCtcKTt9fX07YWRkTmV3T2JqZWN0XChcKSI7aTo3NztzOjUxOiJcKGI9ZG9jdW1lbnRcKVwuaGVhZFwuYXBwZW5kQ2hpbGRcKGJcLmNyZWF0ZUVsZW1lbnQiO2k6Nzg7czozMDoiQ2hyb21lXHxpUGFkXHxpUGhvbmVcfElFTW9iaWxlIjtpOjc5O3M6MTk6IlwkOlwoe31cKyIiXClcW1wkXF0iO2k6ODA7czo1Mzoie3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O308L3N0eWxlPjxkaXZccytjbGFzcz0iO2k6ODE7czoxMjg6ImlmXHMqXChcKHVhXC5pbmRleE9mXChbJyJdezAsMX1jaHJvbWVbJyJdezAsMX1cKVxzKj09XHMqLTFccyomJlxzKnVhXC5pbmRleE9mXCgid2luIlwpXHMqIT1ccyotMVwpXHMqJiZccypuYXZpZ2F0b3JcLmphdmFFbmFibGVkIjtpOjgyO3M6NTg6InBhcmVudFwud2luZG93XC5vcGVuZXJcLmxvY2F0aW9uPVsnIl17MCwxfWh0dHA6Ly92a1wuY29tXC4iO2k6ODM7czo0MToiXF1cLnN1YnN0clwoMCwxXClcKTt9fXJldHVybiB0aGlzO30sXFx1MDAiO2k6ODQ7czo2ODoiamF2YXNjcmlwdFx8aGVhZFx8dG9Mb3dlckNhc2VcfGNocm9tZVx8d2luXHxqYXZhRW5hYmxlZFx8YXBwZW5kQ2hpbGQiO2k6ODU7czoyMToibG9hZFBOR0RhdGFcKHN0ckZpbGUsIjtpOjg2O3M6MjA6IlwpO2lmXCghflwoWyciXXswLDF9IjtpOjg3O3M6MjM6Ii8vXHMqU29tZVwuZGV2aWNlc1wuYXJlIjtpOjg4O3M6NTU6InN0cmlwb3NccypcKFxzKmZfaGF5c3RhY2tccyosXHMqZl9uZWVkbGVccyosXHMqZl9vZmZzZXQiO2k6ODk7czozMjoid2luZG93XC5vbmVycm9yXHMqPVxzKmtpbGxlcnJvcnMiO2k6OTA7czoxMDU6ImNoZWNrX3VzZXJfYWdlbnQ9XFtccypbJyJdezAsMX1MdW5hc2NhcGVbJyJdezAsMX1ccyosXHMqWyciXXswLDF9aVBob25lWyciXXswLDF9XHMqLFxzKlsnIl17MCwxfU1hY2ludG9zaCI7aTo5MTtzOjE1MzoiZG9jdW1lbnRcLndyaXRlXChbJyJdezAsMX08WyciXXswLDF9XCtbJyJdezAsMX1pWyciXXswLDF9XCtbJyJdezAsMX1mWyciXXswLDF9XCtbJyJdezAsMX1yWyciXXswLDF9XCtbJyJdezAsMX1hWyciXXswLDF9XCtbJyJdezAsMX1tWyciXXswLDF9XCtbJyJdezAsMX1lIjtpOjkyO3M6MTc6InNleGZyb21pbmRpYVwuY29tIjtpOjkzO3M6MTE6ImZpbGVreFwuY29tIjtpOjk0O3M6MTM6InN0dW1tYW5uXC5uZXQiO2k6OTU7czoxNDoiaHR0cDovL3h6eFwucG0iO2k6OTY7czoxODoiXC5ob3B0b1wubWUvanF1ZXJ5IjtpOjk3O3M6MTE6Im1vYmktZ29cLmluIjtpOjk4O3M6MTg6ImJhbmtvZmFtZXJpY2FcLmNvbSI7aTo5OTtzOjE2OiJteWZpbGVzdG9yZVwuY29tIjtpOjEwMDtzOjE3OiJmaWxlc3RvcmU3MlwuaW5mbyI7aToxMDE7czoxNjoiZmlsZTJzdG9yZVwuaW5mbyI7aToxMDI7czoxNToidXJsMnNob3J0XC5pbmZvIjtpOjEwMztzOjE4OiJmaWxlc3RvcmUxMjNcLmluZm8iO2k6MTA0O3M6MTI6InVybDEyM1wuaW5mbyI7aToxMDU7czoxNDoiZG9sbGFyYWRlXC5jb20iO2k6MTA2O3M6MTE6InNlY2NsaWtcLnJ1IjtpOjEwNztzOjExOiJtb2J5LWFhXC5ydSI7aToxMDg7czoxMjoic2VydmxvYWRcLnJ1IjtpOjEwOTtzOjQ4OiJzdHJpcG9zXChuYXZpZ2F0b3JcLnVzZXJBZ2VudFxzKixccypsaXN0X2RhdGFcW2kiO2k6MTEwO3M6MjY6ImlmXHMqXCghc2VlX3VzZXJfYWdlbnRcKFwpIjtpOjExMTtzOjQ2OiJjXC5sZW5ndGhcKTt9cmV0dXJuXHMqWyciXVsnIl07fWlmXCghZ2V0Q29va2llIjtpOjExMjtzOjcwOiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9ZnRwOi8vIjt9"));
$gX_JSVirSig = unserialize(base64_decode("YToxNTp7aTowO3M6NDg6ImRvY3VtZW50XC53cml0ZVxzKlwoXHMqdW5lc2NhcGVccypcKFsnIl17MCwxfSUzYyI7aToxO3M6Njk6ImRvY3VtZW50XC5nZXRFbGVtZW50c0J5VGFnTmFtZVwoWyciXWhlYWRbJyJdXClcWzBcXVwuYXBwZW5kQ2hpbGRcKGFcKSI7aToyO3M6Mjg6ImlwXChob25lXHxvZFwpXHxpcmlzXHxraW5kbGUiO2k6MztzOjQ4OiJzbWFydHBob25lXHxibGFja2JlcnJ5XHxtdGtcfGJhZGFcfHdpbmRvd3MgcGhvbmUiO2k6NDtzOjQwOiJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi1cZCtweDt0b3A6LVxkK3B4IjtpOjU7czozMDoiY29tcGFsXHxlbGFpbmVcfGZlbm5lY1x8aGlwdG9wIjtpOjY7czo1NjoiO2M9MX07d2hpbGVcKGMtLVwpe2lmXChrXFtjXF1cKXtwPXBcLnJlcGxhY2VcKG5ldyBSZWdFeHAiO2k6NztzOjM3OiJkb2N1bWVudFwud3JpdGVcKFsnIl08c2NyWyciXVwrWyciXWlwIjtpOjg7czo0OToiaWZyYW1lXC5zdHlsZVwud2lkdGhccyo9XHMqWyciXXswLDF9MHB4WyciXXswLDF9OyI7aTo5O3M6MTAxOiJkb2N1bWVudFwuY2FwdGlvbj1udWxsO3dpbmRvd1wuYWRkRXZlbnRcKFsnIl17MCwxfWxvYWRbJyJdezAsMX0sZnVuY3Rpb25cKFwpe3ZhciBjYXB0aW9uPW5ldyBKQ2FwdGlvbiI7aToxMDtzOjEyOiJodHRwOi8vZnRwXC4iO2k6MTE7czo3OiJubm5cLnBtIjtpOjEyO3M6Nzoibm5tXC5wbSI7aToxMztzOjc4OiI8c2NyaXB0XHMqdHlwZT1bJyJdezAsMX10ZXh0L2phdmFzY3JpcHRbJyJdezAsMX1ccypzcmM9WyciXXswLDF9aHR0cDovL2dvb1wuZ2wiO2k6MTQ7czo2NzoiIlxzKlwrXHMqbmV3IERhdGVcKFwpXC5nZXRUaW1lXChcKTtccypkb2N1bWVudFwuYm9keVwuYXBwZW5kQ2hpbGRcKCI7fQ=="));
$g_PhishingSig = unserialize(base64_decode("YToyNjp7aTowO3M6MjE6Ii1ccypQYXlQYWxccyo8L3RpdGxlPiI7aToxO3M6MTY6Ijx0aXRsZT5QYXlccypQYWwiO2k6MjtzOjIyOiItXHMqUHJpdmF0aVxzKjwvdGl0bGU+IjtpOjM7czoxOToiPHRpdGxlPlxzKlVuaUNyZWRpdCI7aTo0O3M6MTk6IkJhbmtccytvZlxzK0FtZXJpY2EiO2k6NTtzOjI1OiJBbGliYWJhJm5ic3A7TWFudWZhY3R1cmVyIjtpOjY7czoyMDoiVmVyaWZpZWRccytieVxzK1Zpc2EiO2k6NztzOjIxOiJIb25nXHMrTGVvbmdccytPbmxpbmUiO2k6ODtzOjMwOiJZb3VyXHMrYWNjb3VudFxzK1x8XHMrTG9nXHMraW4iO2k6OTtzOjE2OiJPbmxpbmVccytCYW5raW5nIjtpOjEwO3M6MTQ6Ik9ubGluZS1CYW5raW5nIjtpOjExO3M6MjI6IlNpZ25ccytpblxzK3RvXHMrWWFob28iO2k6MTI7czoxMToiQkFOQ09MT01CSUEiO2k6MTM7czoxNjoiPHRpdGxlPlxzKkFtYXpvbiI7aToxNDtzOjE1OiI8dGl0bGU+XHMqQXBwbGUiO2k6MTU7czoyMjoiPHRpdGxlPkdvb2dsZVxzK1NlY3VyZSI7aToxNjtzOjI4OiI8dGl0bGU+TWVyYWtccytNYWlsXHMrU2VydmVyIjtpOjE3O3M6MjM6Ijx0aXRsZT5Tb2NrZXRccytXZWJtYWlsIjtpOjE4O3M6MTg6Ijx0aXRsZT5cW0xfUVVFUllcXSI7aToxOTtzOjMxOiI8dGl0bGU+QU5aXHMrSW50ZXJuZXRccytCYW5raW5nIjtpOjIwO3M6MzM6ImNvbVwud2Vic3RlcmJhbmtcLnNlcnZsZXRzXC5Mb2dpbiI7aToyMTtzOjE1OiI8dGl0bGU+XHMqR21haWwiO2k6MjI7czoyNjoiU29jaWFsXHMrU2VjdXJpdHlccytOdW1iZXIiO2k6MjM7czozNjoiXGQrO1VSTD1odHRwczovL3d3d1wud2VsbHNmYXJnb1wuY29tIjtpOjI0O3M6MTg6Ijx0aXRsZT5XZWxscyBGYXJnbyI7aToyNTtzOjQ5OiJwcm9wZXJ0eT0ib2c6c2l0ZV9uYW1lIlxzKmNvbnRlbnQ9IkZhY2Vib29rIlxzKi8+Ijt9"));
//var_dump($g_FlexDBShe);
//exit;
$g_UnsafeFilesArray = array('td*.php', 'a{1,}.php', 'zd*.php', '123.php', 'testd*.php', 'asd.php', 'info.php', 'CHANGELOG.php',
'COPYRIGHT.php', 'CREDITS.php', 'LICENSE.php', 'LICENSES.php', 'backup.+?.zip',
'backup.+?.tar.gz', 'backup.+?.tgz',
'phpinfo.php', 'changelog.txt', 'readme.txt', 'INSTALLATION.php', 'dump.sql', 'changelog.log');
$g_UnsafeDirArray = array('install', 'backup', 'webalizer', 'awstats');
////////////////////////////////////////////////////////////////////////////
if (!isCli() && !isset($_SERVER['HTTP_USER_AGENT'])) {
echo "#####################################################n";
echo "# Error: cannot run on php-cgi. Requires php as cli #n";
echo "# #n";
echo "# See FAQ: http://revisium.com/ai/faq.php #n";
echo "#####################################################n";
exit;
}
define('AI_VERSION', '20140813');
define('INFO_M', base64_decode('PGZvbnQgY29sb3I9I0UwNjA2MD7QotC+0LvRjNC60L4g0LTQu9GPINC90LXQutC+0LzQvNC10YDRh9C10YHQutC+0LPQviDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyE8L2ZvbnQ+PC9oNT4='));
////////////////////////////////////////////////////////////////////////////
$l_Res = '';
$g_Structure = array();
$g_Counter = 0;
$g_NotRead = array();
$g_FileInfo = array();
$g_Iframer = array();
$g_PHPCodeInside = array();
$g_CriticalJS = array();
$g_Phishing = array();
$g_HeuristicDetected = array();
$g_HeuristicType = array();
$g_UnixExec = array();
$g_SkippedFolders = array();
$g_UnsafeFilesFound = array();
$g_CMS = array();
$g_SymLinks = array();
$g_HiddenFiles = array();
$g_TotalFolder = 0;
$g_TotalFiles = 0;
$g_FoundTotalDirs = 0;
$g_FoundTotalFiles = 0;
if (!isCli()) {
$defaults['site_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/';
}
define('CRC32_LIMIT', pow(2, 31) - 1);
define('CRC32_DIFF', CRC32_LIMIT * 2 -2);
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
srand(time());
set_time_limit(0);
ini_set('max_execution_time', '90000');
ini_set('memory_limit','256M');
if (!function_exists('stripos')) {
function stripos($par_Str, $par_Entry, $Offset = 0) {
return strpos(strtolower($par_Str), strtolower($par_Entry), $Offset);
}
}
define('CMS_BITRIX', 'Bitrix');
define('CMS_WORDPRESS', 'Wordpress');
define('CMS_JOOMLA', 'Joomla');
define('CMS_DLE', 'Data Life Engine');
define('CMS_IPB', 'Invision Power Board');
define('CMS_WEBASYST', 'WebAsyst');
define('CMS_OSCOMMERCE', 'OsCommerce');
define('CMS_DRUPAL', 'Drupal');
define('CMS_MODX', 'MODX');
define('CMS_INSTANTCMS', 'Instant CMS');
define('CMS_PHPBB', 'PhpBB');
define('CMS_VBULLETIN', 'vBulletin');
define('CMS_SHOPSCRIPT', 'PHP ShopScript Premium');
define('CMS_VERSION_UNDEFINED', '0.0');
class CmsVersionDetector {
private $root_path;
private $versions;
private $types;
public function __construct($root_path = '.') {
$this->root_path = $root_path;
$this->versions = array();
$this->types = array();
$version = '';
if ($this->checkBitrix($version)) {
$this->addCms(CMS_BITRIX, $version);
}
if ($this->checkWordpress($version)) {
$this->addCms(CMS_WORDPRESS, $version);
}
if ($this->checkJoomla($version)) {
$this->addCms(CMS_JOOMLA, $version);
}
if ($this->checkDle($version)) {
$this->addCms(CMS_DLE, $version);
}
if ($this->checkIpb($version)) {
$this->addCms(CMS_IPB, $version);
}
if ($this->checkWebAsyst($version)) {
$this->addCms(CMS_WEBASYST, $version);
}
if ($this->checkOsCommerce($version)) {
$this->addCms(CMS_OSCOMMERCE, $version);
}
if ($this->checkDrupal($version)) {
$this->addCms(CMS_DRUPAL, $version);
}
if ($this->checkMODX($version)) {
$this->addCms(CMS_MODX, $version);
}
if ($this->checkInstantCms($version)) {
$this->addCms(CMS_INSTANTCMS, $version);
}
if ($this->checkPhpBb($version)) {
$this->addCms(CMS_PHPBB, $version);
}
if ($this->checkVBulletin($version)) {
$this->addCms(CMS_VBULLETIN, $version);
}
if ($this->checkPhpShopScript($version)) {
$this->addCms(CMS_SHOPSCRIPT, $version);
}
}
function getCmsList() {
return $this->types;
}
function getCmsVersions() {
return $this->versions;
}
function getCmsNumber() {
return count($this->types);
}
function getCmsName($index = 0) {
return $this->types[$index];
}
function getCmsVersion($index = 0) {
return $this->versions[$index];
}
private function addCms($type, $version) {
$this->types[] = $type;
$this->versions[] = $version;
}
private function checkBitrix(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/bitrix')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/bitrix/modules/main/classes/general/version.php'));
if (preg_match('|define("SM_VERSION","(.+?)")|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkWordpress(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/wp-admin')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/wp-includes/version.php'));
if (preg_match('|$wp_versions*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkJoomla(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/libraries/joomla')) {
$res = true;
// for 1.5.x
$tmp_content = @implode('', @file($this->root_path .'/libraries/joomla/version.php'));
if (preg_match('|vars+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
if (preg_match('|vars+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version .= '.' . $tmp_ver[1];
}
}
// for 1.7.x
$tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version .= '.' . $tmp_ver[1];
}
}
// for 2.5.x and 3.x
$tmp_content = @implode('', @file($this->root_path .'/libraries/cms/version/version.php'));
if (preg_match('|publics+$RELEASEs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
if (preg_match('|publics+$DEV_LEVELs*=s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version .= '.' . $tmp_ver[1];
}
}
}
return $res;
}
private function checkDle(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/engine/engine.php')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/engine/data/config.php'));
if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
$tmp_content = @implode('', @file($this->root_path .'/install.php'));
if (preg_match('|'version_id's*=>s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkIpb(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/ips_kernel')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/ips_kernel/class_xml.php'));
if (preg_match('|IP.Boards+v([0-9.]+)|si', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkWebAsyst(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/wbs/installer')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/license.txt'));
if (preg_match('|v([0-9.]+)|si', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkOsCommerce(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/includes/version.php')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/includes/version.php'));
if (preg_match('|([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkDrupal(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/sites/all')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/CHANGELOG.txt'));
if (preg_match('|Drupals+([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkMODX(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/manager/assets')) {
$res = true;
// no way to pick up version
}
return $res;
}
private function checkInstantCms(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/plugins/p_usertab')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/index.php'));
if (preg_match('|InstantCMSs+v([0-9.]+)|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkPhpBb(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/includes/acp')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/config.php'));
if (preg_match('|phpBBs+([0-9.x]+)|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkVBulletin(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/core/admincp')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/core/api.php'));
if (preg_match('|vBulletins+([0-9.x]+)|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
private function checkPhpShopScript(&$version) {
$version = CMS_VERSION_UNDEFINED;
$res = false;
if (file_exists($this->root_path .'/install/consts.php')) {
$res = true;
$tmp_content = @implode('', @file($this->root_path .'/install/consts.php'));
if (preg_match('|STRING_VERSION',s*'(.+?)'|smi', $tmp_content, $tmp_ver)) {
$version = $tmp_ver[1];
}
}
return $res;
}
}
/**
* Print file
*/
function printFile() {
$l_FileName = $_GET['fn'];
$l_CRC = isset($_GET['c']) ? (int)$_GET['c'] : 0;
$l_Content = implode('', file($l_FileName));
$l_FileCRC = realCRC($l_Content);
if ($l_FileCRC != $l_CRC) {
echo 'Доступ запрещен.';
exit;
}
echo '<pre>' . htmlspecialchars($l_Content) . '</pre>';
}
/**
*
*/
function realCRC($str_in, $full = false)
{
$in = crc32( $full ? normal($str_in) : $str_in );
return ($in > CRC32_LIMIT) ? ($in - CRC32_DIFF) : $in;
}
/**
* Determine php script is called from the command line interface
* @return bool
*/
function isCli()
{
return php_sapi_name() == 'cli';
}
function myCheckSum($str) {
return str_replace('-', 'x', crc32($str));
}
/*
*
*/
function shanonEntropy($par_Str)
{
$dic = array();
$len = strlen($par_Str);
for ($i = 0; $i < $len; $i++) {
$dic[$par_Str[$i]]++;
}
$result = 0.0;
$frequency = 0.0;
foreach ($dic as $item)
{
$frequency = (float)$item / (float)$len;
$result -= $frequency * (log($frequency) / log(2));
}
return $result;
}
function generatePassword ($length = 9)
{
// start with a blank password
$password = "";
// define possible characters - any character in this string can be
// picked for use in the password, so if you want to put vowels back in
// or add special characters such as exclamation marks, this is where
// you should do it
$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
// we refer to the length of $possible a few times, so let's grab it now
$maxlength = strlen($possible);
// check for length overflow and truncate if necessary
if ($length > $maxlength) {
$length = $maxlength;
}
// set up a counter for how many characters are in the password so far
$i = 0;
// add random characters to $password until $length is reached
while ($i < $length) {
// pick a random character from the possible ones
$char = substr($possible, mt_rand(0, $maxlength-1), 1);
// have we already used this character in $password?
if (!strstr($password, $char)) {
// no, so it's OK to add it onto the end of whatever we've already got...
$password .= $char;
// ... and increase the counter by one
$i++;
}
}
// done!
return $password;
}
/**
* Print to console
* @param mixed $text
* @param bool $add_lb Add line break
* @return void
*/
function stdOut($text, $add_lb = true)
{
global $BOOL_RESULT;
if (!isCli())
return;
if (is_bool($text))
{
$text = $text ? 'true' : 'false';
}
else if (is_null($text))
{
$text = 'null';
}
if (!is_scalar($text))
{
$text = print_r($text, true);
}
if (!$BOOL_RESULT)
{
@fwrite(STDOUT, $text . ($add_lb ? "n" : ''));
}
}
/**
* Print progress
* @param int $num Current file
*/
function printProgress($num, &$par_File)
{
global $g_CriticalPHP, $g_Base64, $g_Phishing, $g_CriticalJS, $g_Iframer;
$total_files = $GLOBALS['g_FoundTotalFiles'];
$elapsed_time = microtime(true) - START_TIME;
$stat = '';
if ($elapsed_time >= 1)
{
$elapsed_seconds = round($elapsed_time, 0);
$fs = floor($num / $elapsed_seconds);
$left_files = $total_files - $num;
if ($fs > 0)
{
$left_time = ($left_files / $fs); //ceil($left_files / $fs);
$stat = '. [Avg: ' . round($fs,2) . ' files/s' . ($left_time > 0 ? ' Left: ' . seconds2Human($left_time) : '') . '] [Mlw:' . (count($g_CriticalPHP) + count($g_Base64)) . '|' . (count($g_CriticalJS) + count($g_Iframer) + count($g_Phishing)) . ']';
}
}
$l_FN = substr($par_File, -60);
$text = "[$l_FN] $num of {$total_files}" . $stat;
$text = str_pad($text, 160, ' ', STR_PAD_RIGHT);
stdOut(str_repeat(chr(8), 160) . $text, false);
}
/**
* Seconds to human readable
* @param int $seconds
* @return string
*/
function seconds2Human($seconds)
{
$r = '';
$_seconds = floor($seconds);
$ms = $seconds - $_seconds;
$seconds = $_seconds;
if ($hours = floor($seconds / 3600))
{
$r .= $hours . (isCli() ? ' h ' : ' час ');
$seconds = $seconds % 3600;
}
if ($minutes = floor($seconds / 60))
{
$r .= $minutes . (isCli() ? ' m ' : ' мин ');
$seconds = $seconds % 60;
}
if ($minutes<3) $r .= ' ' . $seconds + ($ms > 0 ? round($ms, 5) : 0) . (isCli() ? ' s' : ' сек'); //' сек' - not good for shell
return $r;
}
if (isCli())
{
$cli_options = array(
'm:' => 'memory:',
's:' => 'size:',
'a' => 'all',
'd:' => 'delay:',
'l:' => 'list:',
'r:' => 'report:',
'f' => 'fast',
'j:' => 'file',
'p:' => 'path:',
'q' => 'quite',
'h' => 'help'
);
$options = getopt(implode('', array_keys($cli_options)), array_values($cli_options));
if (isset($options['h']) OR isset($options['help']))
{
$memory_limit = ini_get('memory_limit');
echo <<<HELP
AI-Bolit - Script to search for shells and other malicious software.
Usage: php {$_SERVER['PHP_SELF']} [OPTIONS] [PATH]
Current default path is: {$defaults['path']}
-j, --file=FILE Specified path and filename to scan the only file
-l, --list=FILE Full path and filename to create plain text file with a list of found malware
-p, --path=PATH Directory path to scan, by default the file directory is used
Current path: {$defaults['path']}
-m, --memory=SIZE Maximum amount of memory a script may consume. Current value: $memory_limit
Can take shorthand byte values (1M, 1G...)
-s, --size=SIZE Scan files are smaller than SIZE. 0 - All files. Current value: {$defaults['max_size_to_scan']}
-a, --all Scan all files (by default scan. js,. php,. html,. htaccess)
-d, --delay=INT delay in milliseconds when scanning files to reduce load on the file system (Default: 1)
-r, --report=PATH/EMAILS
Full path to create report or email address to send report to.
You can also specify multiple email separated by commas.
-q, Use only with -j. Quiet result check of file, 1=Infected
--help Display this help and exit
* Mandatory arguments listed below are required for both full and short way of usage.
HELP;
exit;
}
$l_FastCli = false;
if (
(isset($options['memory']) AND !empty($options['memory']) AND ($memory = $options['memory']))
OR (isset($options['m']) AND !empty($options['m']) AND ($memory = $options['m']))
)
{
$memory = getBytes($memory);
if ($memory > 0)
{
$defaults['memory_limit'] = $memory;
}
}
if (
(isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
)
{
define('SCAN_FILE', $file);
}
if (
(isset($options['list']) AND !empty($options['list']) AND ($file = $options['list']) !== false)
OR (isset($options['l']) AND !empty($options['l']) AND ($file = $options['l']) !== false)
)
{
define('PLAIN_FILE', $file);
}
if (
(isset($options['size']) AND !empty($options['size']) AND ($size = $options['size']) !== false)
OR (isset($options['s']) AND !empty($options['s']) AND ($size = $options['s']) !== false)
)
{
$size = getBytes($size);
$defaults['max_size_to_scan'] = $size > 0 ? $size : 0;
}
if (
(isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
AND (isset($options['q']))
)
{
$BOOL_RESULT = true;
}
if (isset($options['f']))
{
$l_FastCli = true;
}
if (
(isset($options['delay']) AND !empty($options['delay']) AND ($delay = $options['delay']) !== false)
OR (isset($options['d']) AND !empty($options['d']) AND ($delay = $options['d']) !== false)
)
{
$delay = (int) $delay;
if (!($delay < 0))
{
$defaults['scan_delay'] = $delay;
}
}
if (isset($options['all']) OR isset($options['a']))
{
$defaults['scan_all_files'] = 1;
}
if (
(isset($options['report']) AND ($report = $options['report']) !== false)
OR (isset($options['r']) AND ($report = $options['r']) !== false)
)
{
define('REPORT', $report);
}
defined('REPORT') OR define('REPORT', 'AI-BOLIT-REPORT-' . date('d-m-Y_H-i') . '-' . rand(1, 999999) . '.html');
$last_arg = max(1, sizeof($_SERVER['argv']) - 1);
if (isset($_SERVER['argv'][$last_arg]))
{
$path = $_SERVER['argv'][$last_arg];
if (
substr($path, 0, 1) != '-'
AND (substr($_SERVER['argv'][$last_arg - 1], 0, 1) != '-' OR array_key_exists(substr($_SERVER['argv'][$last_arg - 1], -1), $cli_options)))
{
$defaults['path'] = $path;
}
}
if (
(isset($options['path']) AND !empty($options['path']) AND ($path = $options['path']) !== false)
OR (isset($options['p']) AND !empty($options['p']) AND ($path = $options['p']) !== false)
)
{
$defaults['path'] = $path;
}
}
if (!defined('PLAIN_FILE')) { define('PLAIN_FILE', ''); }
// Init
define('MAX_ALLOWED_PHP_HTML_IN_DIR', 100);
define('BASE64_LENGTH', 69);
define('MAX_PREVIEW_LEN', 80);
define('MAX_EXT_LINKS', 1001);
// Perform full scan when running from command line
if (isCli() || isset($_GET['full'])) {
$defaults['scan_all_files'] = 1;
}
if ($l_FastCli) {
$defaults['scan_all_files'] = 0;
}
define('SCAN_ALL_FILES', (bool) $defaults['scan_all_files']);
define('SCAN_DELAY', (int) $defaults['scan_delay']);
define('MAX_SIZE_TO_SCAN', getBytes($defaults['max_size_to_scan']));
if ($defaults['memory_limit'] AND ($defaults['memory_limit'] = getBytes($defaults['memory_limit'])) > 0)
ini_set('memory_limit', $defaults['memory_limit']);
define('START_TIME', microtime(true));
define('ROOT_PATH', realpath($defaults['path']));
if (!ROOT_PATH)
{
if (isCli()) {
die(stdOut("Directory '{$defaults['path']}' not found!"));
}
}
elseif(!is_readable(ROOT_PATH))
{
if (isCli()) {
die(stdOut("Cannot read directory '" . ROOT_PATH . "'!"));
}
}
define('CURRENT_DIR', getcwd());
chdir(ROOT_PATH);
// Проверяем отчет
if (isCli() AND REPORT !== '' AND !getEmails(REPORT))
{
$report = str_replace('\', '/', REPORT);
$abs = strpos($report, '/') === 0 ? DIR_SEPARATOR : '';
$report = array_values(array_filter(explode('/', $report)));
$report_file = array_pop($report);
$report_path = realpath($abs . implode(DIR_SEPARATOR, $report));
define('REPORT_FILE', $report_file);
define('REPORT_PATH', $report_path);
if (REPORT_FILE AND REPORT_PATH AND is_file(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE))
{
@unlink(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE);
}
}
if (function_exists('phpinfo')) {
ob_start();
phpinfo();
$l_PhpInfo = ob_get_contents();
ob_end_clean();
$l_PhpInfo = str_replace('border: 1px', '', $l_PhpInfo);
preg_match('|<body>(.*)</body>|smi', $l_PhpInfo, $l_PhpInfoBody);
}
$l_Result =<<<MAIN_PAGE
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
<style type="text/css" title="currentStyle">
@import "http://www.revisium.com/extra/media/css/demo_page.css";
@import "http://www.revisium.com/extra/media/css/jquery.dataTables.css";
</style>
<script type="text/javascript" language="javascript" src="http://yandex.st/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript" language="javascript" src="https://datatables.net/download/build/jquery.dataTables.js"></script>
<style type="text/css">
body {
font-family: Georgia;
color: #303030;
background: #FFFFF0;
font-size: 12px;
margin: 20px;
padding: 0;
}
.hidd {
display: none;
}
h3 {
font-size: 27px;
margin: 0 0;
}
.sec {
font-size: 25px;
margin-bottom: 10px;
}
.warn {
color: #FF4C00;
margin: 0 0 20px 0;
}
.warn .it {
color: #FF4C00;
}
.warn2 {
color: #42ADFF;
margin: 0 0 20px 0;
}
.warn2 .it {
color: #42ADFF;
}
.ok {
color: #007F0E;
margin: 0 0 20px 0;
}
.vir {
color: #A00000;
margin: 0 0 20px 0;
}
.vir .it {
color: #A00000;
}
.disclaimer {
font-size: 11px;
font-family: Arial;
color: #505050;
margin: 10px 0 10px 0;
}
.thanx {
border: 1px solid #F0F0F0;
padding: 20px 20px 10px 20px;
font-size: 12px;
font-family: Arial;
background: #FBFFBA;
}
.footer {
margin: 40px 0 0 0;
}
.rep {
margin: 10px 0 20px 0;
font-size: 11px;
font-family: Arial;
}
.php_ok
{
color: #007F0E;
}
.php_bad
{
color: #A00000;
}
.notice
{
border: 1px solid cornflowerblue;
padding: 10px;
font-size: 12px;
font-family: Arial;
background: #E8F8F8;
}
.offer {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
position: absolute;
width: 350px;
right: 20px;
top: 54px;
background: #E06060;
color: white;
font-size: 11px;
font-family: Arial;
padding: 15px 20px 10px 20px;
}
.offer2 {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
position: absolute;
width: 350px;
right: 100px;
top: 100px;
background: #30A030;
color: white;
font-size: 11px;
font-family: Arial;
padding: 20px 20px 10px 20px;
}
.offer A, .offer2 A {
color: yellow;
}
.update {
color: red;
font-size: 12px;
font-family: Arial;
margin: 0 0 20px 0;
}
.updateinfo {
color: blue;
font-size: 12px;
font-family: Arial;
margin: 0 0 20px 0;
}
.tbg0 {
}
.tbg1 {
background: #F0F0F0;
}
.it {
font-size: 12px;
font-family: Arial;
}
.ctd {
font-size: 12px;
font-family: Arial;
color: #909090;
}
.flist {
margin: 10px 0 30px 0;
}
.tbgh {
background: #E0E0E0;
}
TH {
text-align: left;
font-size: 12px;
font-family: Arial;
color: #909090;
}
.details {
font-size: 9px;
font-family: Arial;
color: #303030;
}
.marker
{
color: #FF0000;
font-size: 16px;
font-weight: 700;
}
</style>
<script language="javascript">
function addToIgnore(par_Lnk, par_FN, par_CRC) {
var o = document.getElementById('igid');
var ta = document.forms.ignore.list;
ta.value = ta.value + par_FN + String.fromCharCode(09) + par_CRC + String.fromCharCode(10);
par_Lnk.innerHTML = 'Добавлено';
o.style.display = 'block';
}
function hsig(id) {
var divs = document.getElementsByTagName("tr");
for(var i = 0; i < divs.length; i++){
if (divs[i].getAttribute('o') == id) {
divs[i].innerHTML = '';
}
}
return false;
}
</script>
</head>
<body>
<noindex>
MAIN_PAGE;
////////////////////////////////////////////////////////////////////////////
$l_Result .= sprintf(AI_STR_001, AI_VERSION, INFO_M);
$l_CreationTime = filemtime(__FILE__);
if (time() - $l_CreationTime > 86400 * 7) {
$l_Result .= AI_STR_002;
}
$l_Result .= '<div class="update" style="margin: 20px 0 20px 0; padding: 20px; width: 500px; border: 1px solid #400000"><b>' . AI_STR_003 . '</b></div>';
if (AI_EXPERT == 0) {
$l_Result .= '<div class="updateinfo">' . AI_STR_057 . '</div>';
} else {
$l_Result .= '<div style="font-size: 8px; color: #909090; margin: 10px 0 10px 0;">MODE=' . AI_EXPERT . '</div>';
}
define('QCR_INDEX_FILENAME', 'fn');
define('QCR_INDEX_TYPE', 'type');
define('QCR_INDEX_WRITABLE', 'wr');
define('QCR_SVALUE_FILE', '1');
define('QCR_SVALUE_FOLDER', '0');
/**
* Extract emails from the string
* @param string $email
* @return array of strings with emails or false on error
*/
function getEmails($email)
{
$email = preg_split('#[,s;]#', $email, -1, PREG_SPLIT_NO_EMPTY);
$r = array();
for ($i = 0, $size = sizeof($email); $i < $size; $i++)
{
if (function_exists('filter_var')) {
if (filter_var($email[$i], FILTER_VALIDATE_EMAIL))
{
$r[] = $email[$i];
}
} else {
// for PHP4
if (strpos($email[$i], '@') !== false) {
$r[] = $email[$i];
}
}
}
return empty($r) ? false : $r;
}
/**
* Get bytes from shorthand byte values (1M, 1G...)
* @param int|string $val
* @return int
*/
function getBytes($val)
{
$val = trim($val);
$last = strtolower($val{strlen($val) - 1});
switch($last) {
case 't':
$val *= 1024;
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return intval($val);
}
/**
* Format bytes to human readable
* @param int $bites
* @return string
*/
function bytes2Human($bites)
{
if ($bites < 1024)
{
return $bites . ' b';
}
elseif (($kb = $bites / 1024) < 1024)
{
return number_format($kb, 2) . ' Kb';
}
elseif (($mb = $kb / 1024) < 1024)
{
return number_format($mb, 2) . ' Mb';
}
elseif (($gb = $mb / 1024) < 1024)
{
return number_format($gb, 2) . ' Gb';
}
else
{
return number_format($gb / 1024, 2) . 'Tb';
}
}
///////////////////////////////////////////////////////////////////////////
function needIgnore($par_FN, $par_CRC) {
global $g_IgnoreList;
for ($i = 0; $i < count($g_IgnoreList); $i++) {
if (strpos($par_FN, $g_IgnoreList[$i][0]) !== false) {
if ($par_CRC == $g_IgnoreList[$i][1]) {
return true;
}
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////
function printList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
global $g_Structure;
if ($par_TableName == null) {
$par_TableName = 'table_' . rand(1000000,9000000);
}
$l_Result = '';
$l_Result .= "<div class="flist"><table cellspacing=1 cellpadding=4 border=0 id="" . $par_TableName . "">";
$l_Result .= "<thead><tr class="tbgh" . ( $i % 2 ). "">";
$l_Result .= "<th>" . AI_STR_004 . "</th>";
$l_Result .= "<th>" . AI_STR_005 . "</th>";
$l_Result .= "<th>" . AI_STR_006 . "</th>";
$l_Result .= "<th width=90>" . AI_STR_007 . "</th>";
$l_Result .= "<th width=90>CRC32</th>";
$l_Result .= "<th width=0></th>";
$l_Result .= "<th width=0></th>";
$l_Result .= "<th width=0></th>";
$l_Result .= "</tr></thead><tbody>";
for ($i = 0; $i < count($par_List); $i++) {
if ($par_SigId != null) {
$l_SigId = 'id_' . $par_SigId[$i];
} else {
$l_SigId = 'id_z' . rand(1000000,9000000);
}
$l_Pos = $par_List[$i];
if ($par_NeedIgnore) {
if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
continue;
}
}
$l_Creat = $g_Structure['c'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['c'][$l_Pos]) : '-';
$l_Modif = $g_Structure['m'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['m'][$l_Pos]) : '-';
$l_Size = $g_Structure['s'][$l_Pos] > 0 ? bytes2Human($g_Structure['s'][$l_Pos]) : '-';
if ($par_Details != null) {
$l_WithMarker = preg_replace('|@AI_MARKER@|smi', '<span class="marker">|</span>', $par_Details[$i]);
$l_Body = '<div class="details">';
if ($par_SigId != null) {
$l_Body .= '<a href="#" onclick="return hsig('' . $l_SigId . '')">[x]</a> ';
}
$l_Body .= $l_WithMarker . '</div>';
} else {
$l_Body = '';
}
$l_Result .= '<tr class="tbg' . ( $i % 2 ). '" o="' . $l_SigId .'">';
if (is_file($g_Structure['n'][$l_Pos])) {
$l_Result .= '<td><div class="it"><a class="it" target="_blank" href="'. $defaults['site_url'] . 'ai-bolit.php?fn=' .
$g_Structure['n'][$l_Pos] . '&ph=' . realCRC(PASS) . '&c=' . $g_Structure['crc'][$l_Pos] . '">' . $g_Structure['n'][$l_Pos] . '</a></div>' . $l_Body . '</td>';
} else {
$l_Result .= '<td><div class="it">' . $g_Structure['n'][$par_List[$i]] . '</div></td>';
}
$l_Result .= '<td><div class="ctd">' . $l_Creat . '</div></td>';
$l_Result .= '<td><div class="ctd">' . $l_Modif . '</div></td>';
$l_Result .= '<td><div class="ctd">' . $l_Size . '</div></td>';
$l_Result .= '<td><div class="ctd"><a href="#" onclick="addToIgnore(this, '' . $g_Structure['n'][$l_Pos] . '','' . $g_Structure['crc'][$l_Pos] . '');return false;">' . $g_Structure['crc'][$l_Pos] . '</a></div></td>';
$l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['c'][$l_Pos] . '</div></td>';
$l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['m'][$l_Pos] . '</div></td>';
$l_Result .= '<td class="hidd"><div class="hidd">' . $l_SigId . '</div></td>';
$l_Result .= '</tr>';
}
$l_Result .= "</tbody></table></div>";
return $l_Result;
}
///////////////////////////////////////////////////////////////////////////
function printPlainList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
global $g_Structure;
// $l_Result = "n#n";
$l_Src = array('"', '<', '>', '&');
$l_Dst = array('"', '<', '>', '&');
for ($i = 0; $i < count($par_List); $i++) {
$l_Pos = $par_List[$i];
if ($par_NeedIgnore) {
if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
continue;
}
}
if ($par_Details != null) {
$l_Body = preg_replace('|(Ld+).+@AI_MARKER@|smi', '$1: ...', $par_Details[$i]);
$l_Body = preg_replace('/[^x21-x7F]/', '.', $l_Body);
$l_Body = str_replace($l_Src, $l_Dst, $l_Body);
} else {
$l_Body = '';
}
if (is_file($g_Structure['n'][$l_Pos])) {
$l_Result .= $g_Structure['n'][$l_Pos] . "ttt" . $l_Body . "n";
} else {
$l_Result .= $g_Structure['n'][$par_List[$i]] . "n";
}
}
return $l_Result;
}
///////////////////////////////////////////////////////////////////////////
function extractValue(&$par_Str, $par_Name) {
if (preg_match('|<tr><td class="e">s*'.$par_Name.'s*</td><td class="v">(.+?)</td>|sm', $par_Str, $l_Result)) {
return str_replace('no value', '', strip_tags($l_Result[1]));
}
}
///////////////////////////////////////////////////////////////////////////
function QCR_ExtractInfo($par_Str) {
$l_PhpInfoSystem = extractValue($par_Str, 'System');
$l_PhpPHPAPI = extractValue($par_Str, 'Server API');
$l_AllowUrlFOpen = extractValue($par_Str, 'allow_url_fopen');
$l_AllowUrlInclude = extractValue($par_Str, 'allow_url_include');
$l_DisabledFunction = extractValue($par_Str, 'disable_functions');
$l_DisplayErrors = extractValue($par_Str, 'display_errors');
$l_ErrorReporting = extractValue($par_Str, 'error_reporting');
$l_ExposePHP = extractValue($par_Str, 'expose_php');
$l_LogErrors = extractValue($par_Str, 'log_errors');
$l_MQGPC = extractValue($par_Str, 'magic_quotes_gpc');
$l_MQRT = extractValue($par_Str, 'magic_quotes_runtime');
$l_OpenBaseDir = extractValue($par_Str, 'open_basedir');
$l_RegisterGlobals = extractValue($par_Str, 'register_globals');
$l_SafeMode = extractValue($par_Str, 'safe_mode');
$l_DisabledFunction = ($l_DisabledFunction == '' ? '-?-' : $l_DisabledFunction);
$l_OpenBaseDir = ($l_OpenBaseDir == '' ? '-?-' : $l_OpenBaseDir);
$l_Result = '<div class="sec">' . AI_STR_008 . ': ' . phpversion() . '</div>';
$l_Result .= 'System Version: <span class="php_ok">' . $l_PhpInfoSystem . '</span><br/>';
$l_Result .= 'PHP API: <span class="php_ok">' . $l_PhpPHPAPI. '</span><br/>';
$l_Result .= 'allow_url_fopen: <span class="php_' . ($l_AllowUrlFOpen == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlFOpen. '</span><br/>';
$l_Result .= 'allow_url_include: <span class="php_' . ($l_AllowUrlInclude == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlInclude. '</span><br/>';
$l_Result .= 'disable_functions: <span class="php_' . ($l_DisabledFunction == '-?-' ? 'bad' : 'ok') . '">' . $l_DisabledFunction. '</span><br/>';
$l_Result .= 'display_errors: <span class="php_' . ($l_DisplayErrors == 'On' ? 'ok' : 'bad') . '">' . $l_DisplayErrors. '</span><br/>';
$l_Result .= 'error_reporting: <span class="php_ok">' . $l_ErrorReporting. '</span><br/>';
$l_Result .= 'expose_php: <span class="php_' . ($l_ExposePHP == 'On' ? 'bad' : 'ok') . '">' . $l_ExposePHP. '</span><br/>';
$l_Result .= 'log_errors: <span class="php_' . ($l_LogErrors == 'On' ? 'ok' : 'bad') . '">' . $l_LogErrors . '</span><br/>';
$l_Result .= 'magic_quotes_gpc: <span class="php_' . ($l_MQGPC == 'On' ? 'ok' : 'bad') . '">' . $l_MQGPC. '</span><br/>';
$l_Result .= 'magic_quotes_runtime: <span class="php_' . ($l_MQRT == 'On' ? 'bad' : 'ok') . '">' . $l_MQRT. '</span><br/>';
$l_Result .= 'register_globals: <span class="php_' . ($l_RegisterGlobals == 'On' ? 'bad' : 'ok') . '">' . $l_RegisterGlobals . '</span><br/>';
$l_Result .= 'open_basedir: <span class="php_' . ($l_OpenBaseDir == '-?-' ? 'bad' : 'ok') . '">' . $l_OpenBaseDir . '</span><br/>';
if (phpversion() < '5.3.0') {
$l_Result .= 'safe_mode (PHP < 5.3.0): <span class="php_' . ($l_SafeMode == 'On' ? 'ok' : 'bad') . '">' . $l_SafeMode. '</span><br/>';
}
return $l_Result . '<p>';
}
///////////////////////////////////////////////////////////////////////////
function QCR_Debug($par_Str) {
if (!DEBUG_MODE) {
return;
}
$l_MemInfo = ' ';
if (function_exists('memory_get_usage')) {
$l_MemInfo .= ' curmem=' . bytes2Human(memory_get_usage());
}
if (function_exists('memory_get_peak_usage')) {
$l_MemInfo .= ' maxmem=' . bytes2Human(memory_get_peak_usage());
}
stdOut("n" . date('H:i:s') . ': ' . $par_Str . $l_MemInfo . "n");
}
///////////////////////////////////////////////////////////////////////////
function QCR_ScanDirectories($l_RootDir)
{
global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs,
$defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeFilesArray, $g_UnsafeDirArray,
$g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles;
$l_DirCounter = 0;
$l_DoorwayFilesCounter = 0;
$l_SourceDirIndex = $g_Counter - 1;
QCR_Debug('Scan ' . $l_RootDir);
$l_QuotedSeparator = quotemeta(DIR_SEPARATOR);
$l_NeedCheckCandi = ($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI;
if ($l_DIRH = @opendir($l_RootDir))
{
while (($l_FileName = readdir($l_DIRH)) !== false)
{
if ($l_FileName == '.' || $l_FileName == '..') continue;
if (is_link($l_FileName))
{
$g_SymLinks[] = $l_FileName;
continue;
}
$l_FileName = $l_RootDir . DIR_SEPARATOR . $l_FileName;
$l_Ext = substr($l_FileName, strrpos($l_FileName, '.') + 1);
$l_IsDir = is_dir($l_FileName);
// which files should be scanned
$l_NeedToScan = SCAN_ALL_FILES || (in_array($l_Ext, array(
'js', 'php', 'php3', 'phtml', 'shtml', 'khtml',
'php4', 'php5', 'tpl', 'inc', 'htaccess', 'html', 'htm'
)));
if (strpos(basename($l_FileName), '.') === 0) {
$g_HiddenFiles[] = $l_FileName;
}
if ($l_IsDir)
{
// if folder in ignore list
$l_Skip = false;
for ($dr = 0; $dr < count($g_DirIgnoreList); $dr++) {
if (($g_DirIgnoreList[$dr] != '') &&
preg_match('#' . $g_DirIgnoreList[$dr] . '#', $l_FileName, $l_Found)) {
$l_Skip = true;
}
}
// skip on ignore
if ($l_Skip) {
$g_SkippedFolders[] = $l_FileName;
continue;
}
$g_Structure['d'][$g_Counter] = $l_IsDir;
$g_Structure['n'][$g_Counter] = $l_FileName;
$l_DirCounter++;
if ($l_NeedCheckCandi) {
for ($j = 0; $j < count($g_UnsafeDirArray); $j++) {
if (preg_match('|' . $l_QuotedSeparator . $g_UnsafeDirArray[$j] . '$|i', $l_FileName, $l_Found)) {
$g_UnsafeFilesFound[] = $g_Counter;
break;
}
}
}
if ($l_DirCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
{
$g_Doorway[] = $l_SourceDirIndex;
$l_DirCounter = -655360;
}
$g_Counter++;
$g_FoundTotalDirs++;
QCR_ScanDirectories($l_FileName);
} else
{
if ($l_NeedToScan)
{
$g_FoundTotalFiles++;
if (in_array($l_Ext, array(
'php', 'php3',
'php4', 'php5', 'html', 'htm', 'phtml', 'shtml', 'khtml'
))
)
{
$l_DoorwayFilesCounter++;
if ($l_DoorwayFilesCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
{
$g_Doorway[] = $l_SourceDirIndex;
$l_DoorwayFilesCounter = -655360;
}
}
$l_Stat = stat($l_FileName);
$g_Structure['d'][$g_Counter] = $l_IsDir;
$g_Structure['n'][$g_Counter] = $l_FileName;
$g_Structure['s'][$g_Counter] = $l_Stat['size'];
$g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
$g_Structure['m'][$g_Counter] = $l_Stat['mtime'];
if ($l_NeedCheckCandi) {
for ($j = 0; $j < count($g_UnsafeFilesArray); $j++) {
if (preg_match('|' . $l_QuotedSeparator . $g_UnsafeFilesArray[$j] . '|i', $l_FileName, $l_Found)) {
$g_UnsafeFilesFound[] = $g_Counter;
break;
}
}
}
$g_Counter++;
}
}
}
closedir($l_DIRH);
}
return $g_Structure;
}
///////////////////////////////////////////////////////////////////////////
function QCR_ScanFile($l_TheFile)
{
global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs,
$defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeFilesArray, $g_UnsafeDirArray,
$g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles;
QCR_Debug('Scan file ' . $l_TheFile);
$l_Stat = stat($l_TheFile);
$g_Structure['d'][$g_Counter] = false;
$g_Structure['n'][$g_Counter] = $l_TheFile;
$g_Structure['s'][$g_Counter] = $l_Stat['size'];
$g_Structure['c'][$g_Counter] = $l_Stat['ctime'];
$g_Structure['m'][$g_Counter] = $l_Stat['mtime'];
$g_Counter++;
return $g_Structure;
}
///////////////////////////////////////////////////////////////////////////
function getFragment($par_Content, $par_Pos) {
$l_MaxChars = MAX_PREVIEW_LEN;
$l_MaxLen = strlen($par_Content);
$l_RightPos = min($par_Pos + $l_MaxChars, $l_MaxLen);
$l_MinPos = max(0, $par_Pos - $l_MaxChars);
$l_FoundStart = substr($par_Content, 0, $par_Pos);
$l_FoundStart = str_replace("r", '', $l_FoundStart);
$l_LineNo = strlen($l_FoundStart) - strlen(str_replace("n", '', $l_FoundStart)) + 1;
$l_Res = 'L' . $l_LineNo . " " . ($l_MinPos > 0 ? '...' : '') . substr($par_Content, $l_MinPos, $par_Pos - $l_MinPos) .
'@AI_MARKER@' .
substr($par_Content, $par_Pos, $l_RightPos - $par_Pos - 1);
return htmlspecialchars($l_Res);
}
///////////////////////////////////////////////////////////////////////////
function _utf8_decode($string)
{
$tmp = $string;
$count = 0;
while (detect_utf_encoding($tmp) !== false )
{
$tmp = utf8_decode($tmp);
$count++;
}
for ($i = 0; $i < $count-1 ; $i++)
{
$string = utf8_decode($string);
}
return $string;
}
///////////////////////////////////////////////////////////////////////////
function escapedHexToHex($escaped)
{ $GLOBALS['g_EncObfu']++; return chr(hexdec($escaped[1])); }
function escapedOctDec($escaped)
{ $GLOBALS['g_EncObfu']++; return chr(octdec($escaped[1])); }
function escapedDec($escaped)
{ $GLOBALS['g_EncObfu']++; return chr($escaped[1]); }
///////////////////////////////////////////////////////////////////////////
if (!defined('T_ML_COMMENT')) {
define('T_ML_COMMENT', T_COMMENT);
} else {
define('T_DOC_COMMENT', T_ML_COMMENT);
}
function UnwrapObfu($par_Content) {
$GLOBALS['g_EncObfu'] = 0;
$par_Content = preg_replace_callback('/\\x([a-fA-F0-9]{1,2})/i','escapedHexToHex', $par_Content);
$par_Content = preg_replace_callback('/\\([0-9]{1,3})/i','escapedOctDec', $par_Content);
// $par_Content = preg_replace_callback('/\\([0-9]{2})/i','escapedDec', $par_Content);
$par_Content = preg_replace('/['"]s*?.s*?['"]/smi', '', $par_Content);
return $par_Content;
}
///////////////////////////////////////////////////////////////////////////
// Unicode BOM is U+FEFF, but after encoded, it will look like this.
define ('UTF32_BIG_ENDIAN_BOM' , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define ('UTF16_BIG_ENDIAN_BOM' , chr(0xFE) . chr(0xFF));
define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define ('UTF8_BOM' , chr(0xEF) . chr(0xBB) . chr(0xBF));
function detect_utf_encoding($text) {
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
if ($first3 == UTF8_BOM) return 'UTF-8';
elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
return false;
}
///////////////////////////////////////////////////////////////////////////
function QCR_SearchPHP($src)
{
if (preg_match("/(<?php[ws]{5,})/smi", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
return $l_Found[0][1];
}
if (preg_match("/(<script[^>]*languages*=s*)('|"|)php('|"|)([^>]*>)/i", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
return $l_Found[0][1];
}
return false;
}
///////////////////////////////////////////////////////////////////////////
function knowUrl($par_URL) {
global $g_UrlIgnoreList;
for ($jk = 0; $jk < count($g_UrlIgnoreList); $jk++) {
if ((stripos($par_URL, $g_UrlIgnoreList[$jk]) !== false)) {
return true;
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////
function QCR_GoScan($par_Offset)
{
global $g_IframerFragment, $g_Iframer, $g_SuspDir, $g_Redirect, $g_Doorway, $g_EmptyLink, $g_Structure, $g_Counter,
$g_WritableDirectories, $g_HeuristicType, $g_HeuristicDetected, $g_TotalFolder, $g_TotalFiles, $g_WarningPHP, $g_AdwareList,
$g_CriticalPHP, $g_Phishing, $g_CriticalJS, $g_UrlIgnoreList, $g_CriticalJSFragment, $g_PHPCodeInside, $g_PHPCodeInsideFragment,
$g_NotRead, $g_WarningPHPFragment, $g_WarningPHPSig, $g_BigFiles, $g_RedirectPHPFragment, $g_EmptyLinkSrc, $g_CriticalPHPSig, $g_CriticalPHPFragment,
$g_Base64Fragment, $g_UnixExec, $g_PhishingSigFragment, $g_PhishingFragment, $g_PhishingSig, $g_CriticalJSSig, $g_IframerFragment, $g_CMS, $defaults, $g_AdwareListFragment, $g_KnownList;
static $_files_and_ignored = 0;
QCR_Debug('QCR_GoScan ' . $par_Offset);
for ($i = $par_Offset; $i < $g_Counter; $i++)
{
$l_Filename = $g_Structure['n'][$i];
QCR_Debug('Check ' . $l_Filename);
if ($g_Structure['d'][$i])
{
// FOLDER
$g_TotalFolder++;
if (is_writable($l_Filename))
{
$g_WritableDirectories[] = $i;
}
}
else
{
// FILE
if ((MAX_SIZE_TO_SCAN > 0 AND $g_Structure['s'][$i] > MAX_SIZE_TO_SCAN) || ($g_Structure['s'][$i] < 0))
{
$g_BigFiles[] = $i;
}
else
{
$g_TotalFiles++;
$l_Content = @implode('', file($l_Filename));
if (($l_Content == '') && ($g_Structure['s'][$i] > 0)) {
$g_NotRead[] = $i;
}
$g_Structure['crc'][$i] = realCRC($l_Content);
$l_KnownCRC = $g_Structure['crc'][$i] + realCRC(basename($l_Filename));
if (in_array($l_KnownCRC, $g_KnownList)) {
printProgress(++$_files_and_ignored, $l_Filename);
continue;
}
$l_Unwrapped = UnwrapObfu($l_Content);
if (detect_utf_encoding($l_Content) !== false) {
if (function_exists('mb_convert_encoding')) {
$l_Unwrapped = mb_convert_encoding($l_Unwrapped, "CP1251");
} else {
$g_NotRead[] = $i;
}
}
// ignore itself
if (strpos($l_Content, 'OI87547623YUIOIUYIOYHJW') !== false) {
continue;
}
// warnings
$l_Pos = '';
if (WarningPHP($l_Filename, $l_Unwrapped, $l_Pos, $l_SigId))
{ $l_Prio = 1;
if (strpos($l_Filename, '.php') !== false) {
$l_Prio = 0;
}
$g_WarningPHP[$l_Prio][] = $i;
$g_WarningPHPFragment[$l_Prio][] = getFragment($l_Content, $l_Pos);
$g_WarningPHPSig[] = $l_SigId;
}
// adware
if (Adware($l_Filename, $l_Unwrapped, $l_Pos))
{
$g_AdwareList[] = $i;
$g_AdwareListFragment[] = getFragment($l_Unwrapped, $l_Pos);
}
// critical
$g_SkipNextCheck = false;
if (CriticalPHP($l_Filename, $i, $l_Unwrapped, $l_Pos, $l_SigId))
{
$g_CriticalPHP[] = $i;
$g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
$g_CriticalPHPSig[] = $l_SigId;
$g_SkipNextCheck = true;
} else {
if (CriticalPHP($l_Filename, $i, $l_Content, $l_Pos, $l_SigId))
{
$g_CriticalPHP[] = $i;
$g_CriticalPHPFragment[] = getFragment($l_Content, $l_Pos);
$g_CriticalPHPSig[] = $l_SigId;
$g_SkipNextCheck = true;
}
}
// critical without comments
$l_NoComments = preg_replace('|/*.*?*/|smiu', '', $l_Unwrapped);
if ($l_NoComments == $l_Unwrapped) {
$g_SkipNextCheck = true;
}
if ((!$g_SkipNextCheck) && CriticalPHP($l_Filename, $i, $l_NoComments, $l_Pos, $l_SigId))
{
$g_CriticalPHP[] = $i;
$g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
$g_CriticalPHPSig[] = $l_SigId;
}
$l_TypeDe = 0;
if (ai_check_extra_obfus($l_Content, $l_TypeDe)) {
$g_HeuristicDetected[] = $i;
$g_HeuristicType[] = $l_TypeDe;
}
// critical JS
$l_Pos = CriticalJS($l_Filename, $i, $l_Unwrapped, $l_SigId);
if ($l_Pos !== false)
{
$g_CriticalJS[] = $i;
$g_CriticalJSFragment[] = getFragment($l_Unwrapped, $l_Pos);
$g_CriticalJSSig[] = $l_SigId;
}
// phishing
$l_Pos = Phishing($l_Filename, $i, $l_Unwrapped, $l_SigId);
if ($l_Pos !== false)
{
$g_Phishing[] = $i;
$g_PhishingFragment[] = getFragment($l_Unwrapped, $l_Pos);
$g_PhishingSigFragment[] = $l_SigId;
}
if
(stripos($l_Filename, 'index.php') ||
stripos($l_Filename, 'index.htm') ||
SCAN_ALL_FILES
)
{
// check iframes
if (preg_match_all('|<iframe[^>]+src.+?>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER))
{
for ($kk = 0; $kk < count($l_Found); $kk++) {
$l_Pos = stripos($l_Found[$kk][0], 'http://');
if (($l_Pos !== false) && (!knowUrl($l_Found[$kk][0]))) {
$g_Iframer[] = $i;
$g_IframerFragment[] = getFragment($l_Found[$kk][0], $l_Pos);
}
}
}
// check empty links
if (preg_match_all('|<a[^>]+href([^>]+?)>(.*?)</a>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER))
{
for ($kk = 0; $kk < count($l_Found); $kk++) {
if ((stripos($l_Found[$kk][1], 'http://') !== false) &&
(trim(strip_tags($l_Found[$kk][2])) == '')) {
$l_NeedToAdd = true;
if ((stripos($l_Found[$kk][1], $default['site_url']) !== false)
|| knowUrl($l_Found[$kk][1])) {
$l_NeedToAdd = false;
}
if ($l_NeedToAdd && (count($g_EmptyLink) < MAX_EXT_LINKS)) {
$g_EmptyLink[] = $i;
$g_EmptyLinkSrc[$i][] = substr($l_Found[$kk][0], 0, MAX_PREVIEW_LEN);
}
}
}
}
}
// check for PHP code inside any type of file
if ((stripos($l_Filename, '.php') === false) &&
(stripos($l_Filename, '.phtml') === false))
{
$l_Pos = QCR_SearchPHP($l_Content);
if ($l_Pos !== false)
{
$g_PHPCodeInside[] = $i;
$g_PHPCodeInsideFragment[] = getFragment($l_Unwrapped, $l_Pos);
}
}
// articles
if (stripos($l_Filename, 'article_index'))
{
$g_AdwareSig[] = $i;
}
// unix executables
if (strpos($l_Content, chr(127) . 'ELF') !== false)
{
$g_UnixExec[] = $i;
}
// htaccess
if (stripos($l_Filename, '.htaccess'))
{
if (stripos($l_Content, 'index.php?name=$1') !== false ||
stripos($l_Content, 'index.php?m=1') !== false
)
{
$g_SuspDir[] = $i;
}
$l_Pos = stripos($l_Content, '^(%2d|-)[^=]+$');
if ($l_Pos !== false)
{
$g_Redirect[] = $i;
$g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
}
$l_Pos = stripos($l_Content, '%{HTTP_USER_AGENT}');
if ($l_Pos !== false)
{
$g_Redirect[] = $i;
$g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
}
if (
preg_match_all('|(RewriteConds+%{HTTP_HOST}/%1 !^[w.]*([^/]+)/\1$s+[NC])|smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)
)
{
$g_Redirect[] = $i;
$g_RedirectPHPFragment[] = getFragment($l_Content, $l_Found[0][1]);
}
//
$l_HTAContent = preg_replace('|^s*#.+$|m', '', $l_Content);
if (
preg_match_all("|RewriteRules+.+?s+http://(.+?)/.+s+[.*R=d+.*]|smi", $l_HTAContent, $l_Found, PREG_SET_ORDER)
)
{
$l_Host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
for ($j = 0; $j < sizeof($l_Found); $j++)
{
$l_Found[$j][1] = str_replace('www.', '', $l_Found[$j][1]);
if ($l_Found[$j][1] != $l_Host)
{
$g_Redirect[] = $i;
break;
}
}
}
unset($l_HTAContent);
$l_Pos = stripos($l_Content, 'auto_prepend_file');
if ($l_Pos !== false) {
$g_Redirect[] = $i;
$g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
}
$l_Pos = stripos($l_Content, 'auto_append_file');
if ($l_Pos !== false) {
$g_Redirect[] = $i;
$g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
}
if (preg_match("|RewriteRules+^(.*)$s+-s+[s*Fs*,s*Ls*]|smi", $l_Content, $l_Found)) {
$g_Redirect[] = $i;
}
}
}
unset($l_Unwrapped);
unset($l_Content);
printProgress(++$_files_and_ignored, $l_Filename);
} // end of if (file)
usleep(SCAN_DELAY * 1000);
} // end of for
}
///////////////////////////////////////////////////////////////////////////
function WarningPHP($l_FN, $l_Content, &$l_Pos, &$l_SigId)
{
global $g_SusDB;
$l_Res = false;
foreach ($g_SusDB as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
return true;
}
}
}
return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function Adware($l_FN, $l_Content, &$l_Pos)
{
global $g_AdwareSig;
$l_Res = false;
foreach ($g_AdwareSig as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
return true;
}
}
}
return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function CheckException(&$l_Content, &$l_Found) {
global $g_ExceptFlex, $gX_FlexDBShe, $gXX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
$l_FoundStrPlus = substr($l_Content, max($l_Found[0][1] - 10, 0), 70);
foreach ($g_ExceptFlex as $l_ExceptItem) {
if (preg_match('#(' . $l_ExceptItem . ')#smi', $l_FoundStrPlus, $l_Detected)) {
$l_Exception = true;
return true;
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////
function Phishing($l_FN, $l_Index, $l_Content, &$l_SigId)
{
global $g_PhishingSig;
$l_Res = false;
foreach ($g_PhishingSig as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "Phis: $l_FN matched [$l_Item] in $l_Posn";
}
return $l_Pos;
}
}
}
return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function CriticalJS($l_FN, $l_Index, $l_Content, &$l_SigId)
{
global $g_JSVirSig, $gX_JSVirSig;
$l_Res = false;
foreach ($g_JSVirSig as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "JS: $l_FN matched [$l_Item] in $l_Posn";
}
return $l_Pos;
}
}
}
if (AI_EXPERT > 1) {
foreach ($gX_JSVirSig as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "JS PARA: $l_FN matched [$l_Item] in $l_Posn";
}
return $l_Pos;
}
}
}
}
return $l_Res;
}
///////////////////////////////////////////////////////////////////////////
function get_descr_heur($type) {
$msg = '';
switch ($type) {
case 1: $msg = AI_STR_053;
break;
case 2: $msg = AI_STR_054;
break;
case 3: $msg = AI_STR_055;
break;
case 4: $msg = AI_STR_056;
break;
}
return $msg;
}
function ai_check_extra_obfus($content, &$type) {
$res = false;
// 1
if (preg_match_all('|($[a-zA-Z0-9_]{3,}[[d+]]s*(s*$)|smiu', $content, $found, PREG_SET_ORDER)) {
$ref_calls = count($found);
}
// 2
if (preg_match_all('|$([a-zA-Z0-9_]{3,}?)s*[;=(]|smi', $content, $found, PREG_SET_ORDER)) {
$obf_var1 = 0;
$obf_var2 = 0;
$arr = array();
foreach ($found as $item) {
$arr[$item[1]] = 1;
}
$found = array_keys($arr);
foreach ($found as $item) {
if (preg_match('|([a-zA-Z]{2,}[0-9]+[a-zA-Z]+){1,}|', $item, $found_ob)) {
$obf_var1++;
}
if (!preg_match('|([aeiouy_])|i', $item, $found_ob) && (strlen($item) > 4)) {
$obf_var2++;
}
if (preg_match('|([0-9bcdfghjklmnpqrstvwxz]{6,})|i', $item, $found_ob) && (strlen($item) > 3)) {
$obf_var3++;
}
}
}
// 3
if (preg_match_all('|($GLOBALS['[a-z_0-9]+'][d+]()|smiu', $content, $found, PREG_SET_ORDER)) {
$ref_glob = count($found);
}
// 4
// if (preg_match_all('|(["'].+?["']s*.s*){10,}|smiu', $content, $found, PREG_SET_ORDER)) {
// $type = 4;
// return true;
// }
/////////////////////////////////////
if ($ref_calls > 10) {
$type = 1;
return true;
}
if ($ref_glob > 10) {
$type = 2;
return true;
}
if ($obf_var1 + $obf_var2 + $obf_var3 >= 3) {
$type = 3;
return true;
}
return false;
}
///////////////////////////////////////////////////////////////////////////
function CriticalPHP($l_FN, $l_Index, $l_Content, &$l_Pos, &$l_SigId)
{
global $g_ExceptFlex, $gXX_FlexDBShe, $gX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
// OI87547623YUIOIUYIOYHJW
foreach ($g_FlexDBShe as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "CRIT 1: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
}
}
if (AI_EXPERT > 1) {
foreach ($gXX_FlexDBShe as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "CRIT 2: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
}
}
}
if (AI_EXPERT > 0) {
foreach ($gX_FlexDBShe as $l_Item) {
if (preg_match('#(' . $l_Item . ')#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (!CheckException($l_Content, $l_Found)) {
$l_Pos = $l_Found[0][1];
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "CRIT 3: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
}
}
}
foreach ($g_DBShe as $l_Item) {
$l_Pos = stripos($l_Content, $l_Item);
if ($l_Pos !== false) {
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "CRIT 4: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
}
if (AI_EXPERT) {
foreach ($gX_DBShe as $l_Item) {
$l_Pos = stripos($l_Content, $l_Item);
if ($l_Pos !== false) {
$l_SigId = myCheckSum($l_Item);
if (DEBUG_MODE) {
echo "CRIT 5: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
}
if ((strpos($l_FN, '.ph') !== false) && (AI_EXPERT > 1)) {
// for php only
$g_Specials = array(');#');
foreach ($g_Specials as $l_Item) {
$l_Pos = stripos($l_Content, $l_Item);
if ($l_Pos !== false) {
$l_SigId = myCheckSum($l_Item);
return true;
}
}
}
}
if ((strpos($l_Content, 'GIF89') === 0) && (strpos($l_FN, '.php') !== false )) {
$l_Pos = 0;
if (DEBUG_MODE) {
echo "CRIT 6: $l_FN matched [$l_Item] in $l_Posn";
}
return true;
}
if (strpos($l_FN, '.php.') !== false ) {
$g_Base64[] = $l_Index;
$g_Base64Fragment[] = '".php."';
$l_Pos = 0;
if (DEBUG_MODE) {
echo "CRIT 7: $l_FN matched [$l_Item] in $l_Posn";
}
return false;
}
if (preg_match('#((include|require|require_once|include_once)s*(*s*["']http://.+?["'])#smi', $l_Content, $l_Found)) {
$g_Base64[] = $l_Index;
$g_Base64Fragment[] = substr($l_Found[1], 0, MAX_PREVIEW_LEN);
if (DEBUG_MODE) {
echo "CRIT 8: $l_FN matchedn";
}
}
// detect base64 suspicious
if (preg_match('|([A-Za-z0-9+/]{' . BASE64_LENGTH . ',})|smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if (preg_match('#base64_decodes*(#smi',
$l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
if ((!CheckException($l_Content, $l_Found)) && (!in_array($l_Index, $g_Base64))) {
$g_Base64[] = $l_Index;
$g_Base64Fragment[] = getFragment($l_Content, $l_Found[1][1]);
if (DEBUG_MODE) {
echo "CRIT 9: $l_FN matchedn";
}
}
}
}
// count number of base64_decode entries
$l_Count = substr_count($l_Content, 'base64_decode');
if ($l_Count > 10) {
$g_Base64[] = $l_Index;
$g_Base64Fragment[] = getFragment($l_Content, stripos($l_Content, 'base64_decode'));
if (DEBUG_MODE) {
echo "CRIT 10: $l_FN matchedn";
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////
if (!isCli()) {
header('Content-type: text/html; charset=utf-8');
}
if (!isCli()) {
$l_PassOK = false;
if (strlen(PASS) > 8) {
$l_PassOK = true;
}
if ($l_PassOK && preg_match('|[0-9]|', PASS, $l_Found) && preg_match('|[A-Z]|', PASS, $l_Found) && preg_match('|[a-z]|', PASS, $l_Found) ) {
$l_PassOK = true;
}
if (!$l_PassOK) {
echo sprintf(AI_STR_009, generatePassword());
exit;
}
if (isset($_GET['fn']) && ($_GET['ph'] == crc32(PASS))) {
printFile();
exit;
}
if ($_GET['p'] != PASS) {
echo sprintf(AI_STR_010, generatePassword());
exit;
}
}
if (!is_readable(ROOT_PATH)) {
echo AI_STR_011;
exit;
}
if (isCli()) {
if (defined('REPORT_PATH') AND REPORT_PATH)
{
if (!is_writable(REPORT_PATH))
{
die("nCannot write report. Report dir " . REPORT_PATH . " is not writable.");
}
else if (!REPORT_FILE)
{
die("nCannot write report. Report filename is empty.");
}
else if (($file = REPORT_PATH . DIR_SEPARATOR . REPORT_FILE) AND is_file($file) AND !is_writable($file))
{
die("nCannot write report. Report file '$file' exists but is not writable.");
}
}
}
$g_IgnoreList = array();
$g_DirIgnoreList = array();
$g_UrlIgnoreList = array();
$g_KnownList = array();
$g_AiBolitAbsolutePath = dirname(__FILE__);
$l_IgnoreFilename = $g_AiBolitAbsolutePath . '/.aignore';
$l_DirIgnoreFilename = $g_AiBolitAbsolutePath . '/.adirignore';
$l_UrlIgnoreFilename = $g_AiBolitAbsolutePath . '/.aurlignore';
$l_KnownFilename = '.aknown';
if (file_exists($l_IgnoreFilename)) {
$l_IgnoreListRaw = file($l_IgnoreFilename);
for ($i = 0; $i < count($l_IgnoreListRaw); $i++)
{
$g_IgnoreList[] = explode("t", trim($l_IgnoreListRaw[$i]));
}
unset($l_IgnoreListRaw);
}
if (file_exists($l_DirIgnoreFilename)) {
$g_DirIgnoreList = file($l_DirIgnoreFilename);
for ($i = 0; $i < count($g_DirIgnoreList); $i++) {
$g_DirIgnoreList[$i] = trim($g_DirIgnoreList[$i]);
}
}
if (file_exists($l_UrlIgnoreFilename)) {
$g_UrlIgnoreList = file($l_UrlIgnoreFilename);
for ($i = 0; $i < count($g_UrlIgnoreList); $i++) {
$g_UrlIgnoreList[$i] = trim($g_UrlIgnoreList[$i]);
}
}
$g_AiBolitAbsolutePathKnownFiles = dirname($g_AiBolitAbsolutePath) . '/known_files';
$g_AiBolitKnownFilesDirs = array('.');
if ($l_DIRH = opendir($g_AiBolitAbsolutePathKnownFiles))
{
while (($l_FileName = readdir($l_DIRH)) !== false)
{
if ($l_FileName == '.' || $l_FileName == '..') continue;
array_push($g_AiBolitKnownFilesDirs, $l_FileName);
}
closedir($l_DIRH);
}
foreach ($g_AiBolitKnownFilesDirs as $l_PathKnownFiles)
{
if ($l_PathKnownFiles != '.') {
$l_AbsolutePathKnownFiles = $g_AiBolitAbsolutePathKnownFiles . '/' . $l_PathKnownFiles;
} else {
$l_AbsolutePathKnownFiles = $l_PathKnownFiles;
}
if ($l_DIRH = opendir($l_AbsolutePathKnownFiles))
{
while (($l_FileName = readdir($l_DIRH)) !== false)
{
if ($l_FileName == '.' || $l_FileName == '..') continue;
if (strpos($l_FileName, $l_KnownFilename) !== false) {
$g_KnownListTmp = file($l_AbsolutePathKnownFiles . '/' . $l_FileName);
for ($i = 0; $i < count($g_KnownListTmp); $i++) {
$g_KnownListTmp[$i] = trim($g_KnownListTmp[$i]);
}
$g_KnownList = array_merge($g_KnownListTmp, $g_KnownList);
}
}
closedir($l_DIRH);
}
}
stdOut("Loaded " . count($g_KnownList) . ' known files');
QCR_Debug();
// scan single file
if (defined('SCAN_FILE')) {
if (file_exists(SCAN_FILE) && is_file(SCAN_FILE) && is_readable(SCAN_FILE)) {
stdOut("Start scanning file '" . SCAN_FILE . "'.");
QCR_ScanFile(SCAN_FILE);
} else {
stdOut("Error:" . SCAN_FILE . " either is not a file or readable");
}
} else {
// scan list of files from file
if (file_exists(DOUBLECHECK_FILE)) {
stdOut("Start scanning the list from '" . DOUBLECHECK_FILE . "'.");
$l_FHList = fopen(DOUBLECHECK_FILE, "r");
while(!feof($l_FHList)) {
$l_FN = trim(fgets($l_FHList));
if (file_exists($l_FN)) {
QCR_ScanFile($l_FN);
}
}
fclose($l_FHList);
} else {
// scan whole file system
stdOut("Start scanning '" . ROOT_PATH . "'.");
QCR_ScanDirectories(ROOT_PATH);
}
}
$g_FoundTotalFiles = count($g_Structure['n']);
QCR_Debug();
stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
stdOut(str_repeat(' ', 160),false);
$g_FoundTotalFiles = count($g_Structure['n']);
// detect version CMS
$l_CmsListDetector = new CmsVersionDetector('.');
$l_CmsDetectedNum = $l_CmsListDetector->getCmsNumber();
for ($tt = 0; $tt < $l_CmsDetectedNum; $tt++) {
$g_CMS[] = $l_CmsListDetector->getCmsName($tt) . ' v' . $l_CmsListDetector->getCmsVersion($tt);
}
QCR_GoScan(0);
QCR_Debug();
////////////////////////////////////////////////////////////////////////////
if ($BOOL_RESULT) {
if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR (count($g_Iframer) > 0) OR (count($g_UnixExec) > 0))
{
echo "1n";
exit(0);
}
}
////////////////////////////////////////////////////////////////////////////
$l_Result .= "<div class="sec"><b>" . AI_STR_051 . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : realpath('.')) . "</b></div>";
$time_tacked = seconds2Human(microtime(true) - START_TIME);
$l_Result .= sprintf(AI_STR_013, $g_TotalFolder, $g_TotalFiles);
if (!$defaults['scan_all_files']) {
$l_Result .= AI_STR_014;
}
$l_Result .= AI_STR_015;
$l_ShowOffer = false;
stdOut("nBuilding reportn");
////////////////////////////////////////////////////////////////////////////
// save
if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_SuspDir) > 0) OR
(count($g_Iframer) > 0) OR (count($g_UnixExec)))
{
if (!file_exists(DOUBLECHECK_FILE)) {
if ($l_FH = fopen(DOUBLECHECK_FILE, 'w')) {
fputs($l_FH, '<?php die("Forbidden"); ?>' . "n");
$l_CurrPath = dirname(__FILE__);
for ($i = 0; $i < count($g_CriticalPHP); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalPHP[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalPHP[$i]]));
}
for ($i = 0; $i < count($g_Base64); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Base64[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Base64[$i]]));
}
for ($i = 0; $i < count($g_CriticalJS); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalJS[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_CriticalJS[$i]]));
}
for ($i = 0; $i < count($g_SuspDir); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_SuspDir[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_SuspDir[$i]]));
}
for ($i = 0; $i < count($g_Iframer); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Iframer[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_Iframer[$i]]));
}
for ($i = 0; $i < count($g_UnixExec); $i++) {
fputs($l_FH, str_replace($l_CurrPath, '.', $g_Structure['n'][$g_UnixExec[$i]]) . "n");
//unlink(str_replace($l_CurrPath, '.', $g_Structure['n'][$g_UnixExec[$i]]));
}
fclose($l_FH);
} else {
stdOut("Error! Cannot create " . DOUBLECHECK_FILE);
}
} else {
stdOut(DOUBLECHECK_FILE . ' already exists.');
$l_Result .= '<div class="err">' . DOUBLECHECK_FILE . ' already exists.</div>';
}
}
////////////////////////////////////////////////////////////////////////////
stdOut("Building list of shells " . count($g_CriticalPHP));
if (function_exists("gethostname") && is_callable("gethostname")) {
$l_HostName = gethostname();
} else {
$l_HostName = '???';
}
$l_PlainResult = "# Malware list detected by AI-Bolit (http://revisium.com/ai/) on " . date("d/m/Y H:i:s", time()) . " " . $l_HostName . "nn";
if (count($g_CriticalPHP) > 0) {
$l_Result .= '<div class="vir"><b>' . AI_STR_016 . '</b> (' . count($g_CriticalPHP) . ')';
$l_Result .= printList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit');
$l_PlainResult .= printPlainList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit');
$l_Result .= '</div>';
$l_ShowOffer = true;
} else {
$l_Result .= '<div class="ok"><b>' . AI_STR_017. '</b></div>';
}
stdOut("Building list of js " . count($g_CriticalJS));
if (count($g_CriticalJS) > 0) {
$l_Result .= '<div class="vir"><b>' . AI_STR_018 . '</b> (' . count($g_CriticalJS) . ')';
$l_Result .= printList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir');
$l_PlainResult .= printPlainList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir');
$l_Result .= "</div>";
$l_ShowOffer = true;
}
stdOut("Building phishing pages " . count($g_Phishing));
if (count($g_Phishing) > 0) {
$l_Result .= '<div class="vir"><b>' . AI_STR_058 . '</b> (' . count($g_Phishing) . ')';
$l_Result .= printList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir');
$l_PlainResult .= printPlainList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir');
$l_Result .= "</div>";
$l_ShowOffer = true;
}
stdOut("Building list of unix executables " . count($g_UnixExec));
if (count($g_UnixExec) > 0) {
$l_Result .= "<div class="vir"><b>". AI_STR_019 ."</b> (" . count($g_UnixExec) . ')';
$l_Result .= printList($g_UnixExec, '', true);
$l_PlainResult .= printPlainList($g_UnixExec, '', true);
$l_Result .= "</div>";
$l_ShowOffer = true;
}
stdOut("Building list of iframes " . count($g_Iframer));
if (count($g_Iframer) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="vir"><b>" . AI_STR_021 . "</b> (" . count($g_Iframer) . ')';
$l_Result .= printList($g_Iframer, $g_IframerFragment, true);
$l_Result .= "</div>";
}
stdOut("Building list of base64s " . count($g_Base64));
if (count($g_Base64) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_020 ."</b> (" . count($g_Base64) . ')';
$l_Result .= printList($g_Base64, $g_Base64Fragment, true);
$l_PlainResult .= printPlainList($g_Base64, $g_Base64Fragment, true);
$l_Result .= "</div>";
}
stdOut("Building list of heuristics " . count($g_HeuristicDetected));
if (count($g_HeuristicDetected) > 0) {
$l_Result .= '<div class="warn"><b>' . AI_STR_052 . '</b><ul>';
for ($i = 0; $i < count($g_HeuristicDetected); $i++) {
$l_Result .= '<li>' . $g_Structure['n'][$g_HeuristicDetected[$i]] . ' (' . get_descr_heur($g_HeuristicType[$i]) . ')</li>';
}
$l_Result .= '</ul></div>';
$l_ShowOffer = true;
}
stdOut("Building list of unread files " . count($g_NotRead));
if (count($g_NotRead) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="vir"><b>" . AI_STR_030 . ":</b>";
$l_Result .= printList($g_NotRead);
$l_Result .= "</div>";
}
stdOut("Building list of symlinks " . count($g_SymLinks));
if (count($g_SymLinks) > 0) {
$l_Result .= "<div class="warn"><b>" . AI_STR_022 . "</b> (" . count($g_SymLinks) .")<br>";
$l_Result .= implode("<br>", $g_SymLinks);
$l_Result .= "</div>";
}
stdOut("Building list of hidden files " . count($g_HiddenFiles));
if (count($g_HiddenFiles) > 0) {
$l_Result .= "<div class="warn"><b>" . AI_STR_023 . "</b> (" . count($g_HiddenFiles) . ")<br>";
$l_Result .= implode("<br>", $g_HiddenFiles);
$l_Result .= "</div>";
}
stdOut("Building list of susp dirs " . count($g_SuspDir));
if (count($g_SuspDir) > 0) {
$l_Result .= "<div class="vir"><b>" . AI_STR_024 . "</b><br>";
$l_Result .= printList($g_SuspDir);
$l_Result .= "</div>";
} else {
$l_Result .= '<div class="ok"><b>' . AI_STR_025 . '</b></div>';
}
stdOut("Building list of redirects " . count($g_Redirect));
$l_Result .= "<div class="sec">" . AI_STR_026 . "</div>";
if (count($g_Redirect) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_027 . "</b>";
$l_Result .= printList($g_Redirect, $g_RedirectPHPFragment, true);
$l_Result .= "</div>";
}
stdOut("Building list of php inj " . count($g_PHPCodeInside));
if ((count($g_PHPCodeInside) > 0) && (($defaults['report_mask'] & REPORT_MASK_PHPSIGN) == REPORT_MASK_PHPSIGN)) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_028 . "</b>";
$l_Result .= printList($g_PHPCodeInside, $g_PHPCodeInsideFragment, true);
$l_Result .= "</div>";
}
stdOut("Building list of adware " . count($g_AdwareList));
if (count($g_AdwareList) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_029 . "</b>";
$l_Result .= printList($g_AdwareList, $g_AdwareListFragment, true);
$l_Result .= "</div>";
}
stdOut("Building list of empty links " . count($g_EmptyLink));
if ((count($g_EmptyLink) > 0) && (($defaults['report_mask'] & REPORT_MASK_SPAMLINKS) == REPORT_MASK_SPAMLINKS)) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_031 . "</b>";
$l_Result .= printList($g_EmptyLink, '', true);
$l_Result .= AI_STR_032 . '<br/>';
if (count($g_EmptyLink) == MAX_EXT_LINKS) {
$l_Result .= '(' . AI_STR_033 . MAX_EXT_LINKS . ')<br/>';
}
for ($i = 0; $i < count($g_EmptyLink); $i++) {
$l_Idx = $g_EmptyLink[$i];
for ($j = 0; $j < count($g_EmptyLinkSrc[$l_Idx]); $j++) {
$l_Result .= '<span class="details">' . $g_Structure['n'][$g_EmptyLink[$i]] . ' → ' . htmlspecialchars($g_EmptyLinkSrc[$l_Idx][$j]) . '</span><br/>';
}
}
$l_Result .= "</div>";
}
stdOut("Building list of doorways " . count($g_Doorway));
if ((count($g_Doorway) > 0) && (($defaults['report_mask'] & REPORT_MASK_DOORWAYS) == REPORT_MASK_DOORWAYS)) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_034 . "</b>";
$l_Result .= printList($g_Doorway);
$l_Result .= "</div>";
}
stdOut("Building list of php warnings " . (count($g_WarningPHP[0]) + count($g_WarningPHP[1])));
if (($defaults['report_mask'] & REPORT_MASK_SUSP) == REPORT_MASK_SUSP) {
if ((count($g_WarningPHP[0]) + count($g_WarningPHP[1])) > 0) {
$l_ShowOffer = true;
$l_Result .= "<div class="warn"><b>" . AI_STR_035 . "</b>";
for ($i = 0; $i < count($g_WarningPHP); $i++) {
if (count($g_WarningPHP[$i]) > 0)
$l_Result .= printList($g_WarningPHP[$i], $g_WarningPHPFragment[$i], true, $g_WarningPHPSig, 'table_warn');
}
$l_Result .= "</div>";
}
}
stdOut("Building list of skipped dirs " . count($g_SkippedFolders));
if (count($g_SkippedFolders) > 0) {
$l_Result .= "<div class="warn2"><b>" . AI_STR_036 . "</b><br/>";
$l_Result .= implode("<br>", $g_SkippedFolders);
$l_Result .= "</div>";
}
stdOut("Building list of writeable dirs " . count($g_WritableDirectories));
if (count($g_CMS) > 0) {
$l_Result .= "<div class="warn2"><b>" . AI_STR_037 . "</b><br/>";
$l_Result .= implode("<br>", $g_CMS);
$l_Result .= "</div>";
}
if (!isCli()) {
$l_Result .= QCR_ExtractInfo($l_PhpInfoBody[1]);
}
$max_size_to_scan = getBytes(MAX_SIZE_TO_SCAN);
$max_size_to_scan = $max_size_to_scan > 0 ? $max_size_to_scan : getBytes('1m');
stdOut("Building list of bigfiles " . count($g_BigFiles));
if (count($g_BigFiles) > 0) {
$l_Result .= "<div class="warn2"><b>" . sprintf(AI_STR_038, bytes2Human($max_size_to_scan)) . "</b>";
$l_Result .= printList($g_BigFiles);
$l_Result .= "</div>";
} else {
if (SCAN_ALL_FILES) {
$l_Result .= '<div class="ok"><b>' . sprintf(AI_STR_039, bytes2Human($max_size_to_scan)) . '</b></div>';
}
}
stdOut("Building list of sensitive files " . count($g_UnsafeFilesFound) . "n");
if ((count($g_UnsafeFilesFound) > 0) && (($defaults['report_mask'] & REPORT_MASK_CANDI) == REPORT_MASK_CANDI)) {
$l_Result .= "<div class="warn2"><b>" . AI_STR_040 . "</b>";
$l_Result .= printList($g_UnsafeFilesFound);
$l_Result .= "</div>";
}
if (!$defaults['no_rw_dir']) {
if ((($defaults['report_mask'] & REPORT_MASK_WRIT) == REPORT_MASK_WRIT)) {
if ((count($g_WritableDirectories) > 0)) {
$l_Result .= "<div class="warn2"><b>" . AI_STR_041 . "</b>";
$l_Result .= printList($g_WritableDirectories);
$l_Result .= "</div>";
} else {
$l_Result .= '<div class="ok"><b>' . AI_STR_042 . '</b></div>';
}
}
}
if (function_exists('memory_get_peak_usage')) {
$l_Result .= AI_STR_043 . bytes2Human(memory_get_peak_usage()) . '<p>';
}
$l_Result .= AI_STR_044;
if (!SCAN_ALL_FILES) {
$l_Result .= AI_STR_045;
}
$l_Result .= sprintf(AI_STR_012, count($g_DBShe) + count($gX_DBShe) + count($g_FlexDBShe), (count($g_SusDB) + count($g_AdwareSig ) + count($g_JSVirSig)), $time_tacked, date('d-m-Y в H:i:s', floor(START_TIME)) , date('d-m-Y в H:i:s'));
$l_Result .= '<div class="footer"><div class="disclaimer"><span class="vir">[!]</span> ' . AI_STR_049 . '</div>';
$l_Result .= '<div class="thanx">' . AI_STR_050 . '</div>';
$l_Result .= '</div>';
$l_OfferVK = AI_STR_048;
if ($l_ShowOffer) {
$l_Result .= AI_STR_047 .
'<p><a href="#" onclick="document.getElementById('ofr').style.display='none'" style="color: #303030">' . AI_STR_046 . '</a></p>' .
'</div>';
} else {
$l_Result .= '<div class="offer2" id="ofr2">' . $l_OfferVK .
'<p><a href="#" onclick="document.getElementById('ofr2').style.display='none'" style="color: #303030">' . AI_STR_046 .'</a></p>' .
'</div>';
}
$l_Result .=<<<ENDING
</body>
<script language="javascript">
$(document).ready(function(){
$('#table_crit').dataTable({
"aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
"aoColumns": [
{"iDataSort": 7},
{"iDataSort": 5},
{"iDataSort": 6},
{"bSortable": true},
{"bSortable": true},
{"bVisible": false},
{"bVisible": false},
{"bVisible": false}
],
"iDisplayLength": 500,
"oLanguage": {
"sLengthMenu": "Отображать по _MENU_ записей",
"sZeroRecords": "Ничего не найдено",
"sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
"sInfoEmpty": "Нет файлов",
"sInfoFiltered": "(всего записей _MAX_)",
"sSearch": "Поиск:",
"sUrl": "",
"oPaginate": {
"sFirst": "Первая",
"sPrevious": "Предыдущая",
"sNext": "Следующая",
"sLast": "Последняя"
},
"oAria": {
"sSortAscending": ": активировать для сортировки столбца по возрастанию",
"sSortDescending": ": активировать для сортировки столбцов по убыванию"
}
}
} );
});
$(document).ready(function(){
$('#table_vir').dataTable({
"aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
"aoColumns": [
{"iDataSort": 7},
{"iDataSort": 5},
{"iDataSort": 6},
{"bSortable": true},
{"bSortable": true},
{"bVisible": false},
{"bVisible": false},
{"bVisible": false}
],
"iDisplayLength": 500,
"oLanguage": {
"sLengthMenu": "Отображать по _MENU_ записей",
"sZeroRecords": "Ничего не найдено",
"sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
"sInfoEmpty": "Нет файлов",
"sInfoFiltered": "(всего записей _MAX_)",
"sSearch": "Поиск:",
"sUrl": "",
"oPaginate": {
"sFirst": "Первая",
"sPrevious": "Предыдущая",
"sNext": "Следующая",
"sLast": "Последняя"
},
"oAria": {
"sSortAscending": ": активировать для сортировки столбца по возрастанию",
"sSortDescending": ": активировать для сортировки столбцов по убыванию"
}
},
} );
});
$('#table_warn').dataTable({
"aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
"aoColumns": [
{"iDataSort": 7},
{"iDataSort": 5},
{"iDataSort": 6},
{"bSortable": true},
{"bSortable": true},
{"bVisible": false},
{"bVisible": false},
{"bVisible": false}
],
"iDisplayLength": 500,
"oLanguage": {
"sLengthMenu": "Отображать по _MENU_ записей",
"sZeroRecords": "Ничего не найдено",
"sInfo": "Отображается c _START_ по _END_ из _TOTAL_ файлов",
"sInfoEmpty": "Нет файлов",
"sInfoFiltered": "(всего записей _MAX_)",
"sSearch": "Поиск:",
"sUrl": "",
"oPaginate": {
"sFirst": "Первая",
"sPrevious": "Предыдущая",
"sNext": "Следующая",
"sLast": "Последняя"
},
"oAria": {
"sSortAscending": ": активировать для сортировки столбца по возрастанию",
"sSortDescending": ": активировать для сортировки столбцов по убыванию"
}
}
} );
</script>
</html>
ENDING;
////////////////////////////////////////////////////////////////////////////
if (!isCli())
{
echo $l_Result;
exit;
}
if (!defined('REPORT') OR REPORT === '')
{
die('Report not written.');
}
// write plain text result
if (PLAIN_FILE != '') {
if ($l_FH = fopen(PLAIN_FILE, "w")) {
fputs($l_FH, $l_PlainResult);
fclose($l_FH);
}
}
$emails = getEmails(REPORT);
if (!$emails) {
if ($l_FH = fopen($file, "w")) {
fputs($l_FH, $l_Result);
fclose($l_FH);
stdOut("nReport written to '$file'.");
} else {
stdOut("nCannot create '$file'.");
}
} else {
$headers = array(
'MIME-Version: 1.0',
'Content-type: text/html; charset=UTF-8',
'From: ' . ($defaults['email_from'] ? $defaults['email_from'] : 'AI-Bolit@myhost')
);
for ($i = 0, $size = sizeof($emails); $i < $size; $i++)
{
mail($emails[$i], 'AI-Bolit Report ' . date("d/m/Y H:i", time()), $l_Result, implode("rn", $headers));
}
stdOut("nReport sended to " . implode(', ', $emails));
}
$time_taken = microtime(true) - START_TIME;
$time_taken = number_format($time_taken, 5);
stdOut("Scanning complete! Time taken: " . seconds2Human($time_taken));
stdOut("nn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
stdOut("Attention! DO NOT LEAVE either ai-bolit.php or AI-BOLIT-REPORT-<xxxx>-<yy>.html nfile on server. COPY it locally then REMOVE from server. ");
stdOut("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
QCR_Debug();
?>