Your IP : 172.28.240.42


Current Path : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/main/classes/general/
Upload File :
Current File : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/main/classes/general/update_client_partner.php

<?
/**********************************************************************/
/**    DO NOT MODIFY THIS FILE                                       **/
/**    MODIFICATION OF THIS FILE WILL ENTAIL SITE FAILURE            **/
/**********************************************************************/


//TODO: ÑÈÑÒÅÌÀ ÎÁÍÎÂËÅÍÈÉ, module.php, module_admin.php, 
//âñå ôàéëû ñ CModule::CreateModuleObject ÈÇÌÅÍÅÍÛ!


if (!defined("BX_DIR_PERMISSIONS"))
	define("BX_DIR_PERMISSIONS", 0777);

define("DEFAULT_UPDATE_SERVER", "www.bitrixsoft.com");
//define("DEFAULT_UPDATE_SERVER", "mysql.smn");

IncludeModuleLangFile(__FILE__);

if (!function_exists("file_get_contents"))
{
	function file_get_contents($filename)
	{
		$fd = fopen("$filename", "rb");
		$content = fread($fd, filesize($filename));
		fclose($fd);
		return $content;
	}
}

if (!defined("US_SHARED_KERNEL_PATH"))
	define("US_SHARED_KERNEL_PATH", "/bitrix");

if (!defined("US_CALL_TYPE"))
	define("US_CALL_TYPE", "ALL");

if (!defined("US_BASE_MODULE"))
	define("US_BASE_MODULE", "main");

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_class.php");

$GLOBALS["UPDATE_STRONG_UPDATE_CHECK"] = "";
$GLOBALS["CACHE4UPDATESYS_LICENSE_KEY"] = "";

class CUpdateClientPartner
{
	function RegisterModules(&$strError, $lang = false, $stableVersionsOnly = false)
	{
		$strError_tmp = "";

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::RegisterModules");

		$strQuery = CUpdateClientPartner::__CollectRequestData(
			$strError_tmp,
			$lang,
			$stableVersionsOnly,
			array(),
			array()
		);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			$strError .= $strError_tmp;
			CUpdateClientPartner::AddMessage2Log("Empty query list", "GUL01");
			return False;
		}

		CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

		$stime = CUpdateClientPartner::__GetMicroTime();
		$content = CUpdateClientPartner::__GetHTTPPage("REG", $strQuery, $strError_tmp);

		if (strlen($content) <= 0)
		{
			if (StrLen($strError_tmp) <= 0)
				$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
		}

		CUpdateClientPartner::AddMessage2Log("TIME RegisterModules(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");

		if (strlen($strError_tmp) <= 0)
		{
			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
				$strError_tmp .= "[URV02] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			if (!fwrite($fp1, $content))
				$strError_tmp .= "[URV03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", GetMessage("SUPP_RV_WRT_TEMP_FILE")).". ";

			@fclose($fp1);
		}

		if (strlen($strError_tmp) <= 0)
		{
			$updatesDirTmp = "";
			if (!CUpdateClientPartner::UnGzipArchive($updatesDirTmp, $strError_tmp, true))
				$strError_tmp .= "[URV04] ".GetMessage("SUPP_RV_BREAK").". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDirTmp;
			if (!file_exists($updatesDirFull."/update_info.xml") || !is_file($updatesDirFull."/update_info.xml"))
				$strError_tmp .= "[URV05] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_ER_DESCR_FILE")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			if (!is_readable($updatesDirFull."/update_info.xml"))
				$strError_tmp .= "[URV06] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_READ_DESCR_FILE")).". ";
		}

		if (strlen($strError_tmp) <= 0)
			$content = file_get_contents($updatesDirFull."/update_info.xml");

		//echo "!1!".htmlspecialchars($content)."!2!";

		if (strlen($strError_tmp) <= 0)
		{
			$arRes = Array();
			CUpdateClientPartner::__ParseServerData($content, $arRes, $strError_tmp);
		}

		if (strlen($strError_tmp) <= 0)
		{
			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
			{
				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
				{
					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]) > 0)
						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
				}
			}
		}

		if (strlen($strError_tmp) <= 0)
		{
			$handle = @opendir($updatesDirFull);
			if ($handle)
			{
				while (false !== ($dir = readdir($handle)))
				{
					if ($dir == "." || $dir == "..")
						continue;

					if (file_exists($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".$dir))
					{
						$strError_tmp1 = "";
						CUpdateClientPartner::__CopyDirFiles($updatesDirFull."/".$dir, $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".$dir, $strError_tmp1, False);
						if (strlen($strError_tmp1) > 0)
							$strError_tmp .= $strError_tmp1;
					}
				}
				closedir($handle);
			}
		}

		if (strlen($strError_tmp) <= 0)
		{
			CUpdateClientPartner::AddMessage2Log("Modules registered successfully!", "CURV");
			CUpdateClientPartner::__DeleteDirFilesEx($updatesDirFull);
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CURV");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	function LoadModuleNoDemand($moduleId, &$strError, $stableVersionsOnly = "Y", $lang = false)
	{
		$strError_tmp = "";

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::LoadModuleNoDemand");

		$stableVersionsOnly = (($stableVersionsOnly == "N") ? "N" : "Y");

		if ($lang === false)
			$lang = LANGUAGE_ID;

		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array($moduleId), array(), true);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			if (StrLen($strError_tmp) <= 0)
				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
		}

		if (StrLen($strError_tmp) <= 0)
		{
			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

			$stime = CUpdateClientPartner::__GetMicroTime();
			$content = CUpdateClientPartner::__GetHTTPPage("MODULE", $strQuery, $strError_tmp);
			if (strlen($content) <= 0)
			{
				if (StrLen($strError_tmp) <= 0)
					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
			}

			CUpdateClientPartner::AddMessage2Log("TIME LoadModuleNoDemand(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
		}

		if (StrLen($strError_tmp) <= 0)
		{
			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
				$strError_tmp = "[GNSU03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
		}

		if (StrLen($strError_tmp) <= 0)
		{
			fwrite($fp1, $content);
			fclose($fp1);
		}

		if (strlen($strError_tmp) <= 0)
		{
			$temporaryUpdatesDir = "";
			if (!CUpdateClientPartner::UnGzipArchive($temporaryUpdatesDir, $strError_tmp, true))
			{
				$strError_tmp .= "[CL02] ".GetMessage("SUPC_ME_PACK").". ";
				CUpdateClientPartner::AddMessage2Log(GetMessage("SUPC_ME_PACK"), "CL02");
			}
		}

		$arStepUpdateInfo = array();
		if (strlen($strError_tmp) <= 0)
			$arStepUpdateInfo = CUpdateClientPartner::GetStepUpdateInfo($temporaryUpdatesDir, $strError_tmp);

		if (StrLen($strError_tmp) <= 0)
		{
			if (isset($arStepUpdateInfo["DATA"]["#"]["ERROR"]))
			{
				for ($i = 0, $cnt = count($arStepUpdateInfo["DATA"]["#"]["ERROR"]); $i < $cnt; $i++)
					$strError_tmp .= "[".$arStepUpdateInfo["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ".$arStepUpdateInfo["DATA"]["#"]["ERROR"][$i]["#"];
			}
		}

		if (strlen($strError_tmp) <= 0)
		{
			if (!CUpdateClientPartner::UpdateStepModules($temporaryUpdatesDir, $strError_tmp))
			{
				$strError_tmp .= "[CL04] ".GetMessage("SUPC_ME_UPDATE").". ";
				CUpdateClientPartner::AddMessage2Log(GetMessage("SUPC_ME_UPDATE"), "CL04");
			}
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateSystem::AddMessage2Log($strError_tmp, "CURV");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	function SearchModulesEx($arOrder, $arFilter, $searchPage, $lang, &$strError)
	{
		$strError_tmp = "";
		$arResult = array();

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::SearchModulesEx");

		$arOrderKeys = array_keys($arOrder);

		$strQuery = CUpdateClientPartner::__CollectRequestData(
			$strError_tmp,
			$lang,
			$stableVersionsOnly,
			array(),
			array(
				"search_module_id" => $arFilter["ID"],
				"search_module" => $arFilter["NAME"],
				"search_category" => $arFilter["CATEGORY"],
				"search_type" => (is_array($arFilter["TYPE"]) ? implode(",", $arFilter["TYPE"]) : $arFilter["TYPE"]),
				"search_order" => $arOrder[$arOrderKeys[0]],
				"search_order_by" => $arOrderKeys[0],
				"search_page" => $searchPage
			)
		);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			$strError .= $strError_tmp;
			CUpdateClientPartner::AddMessage2Log("Empty query list", "GUL01");
			return False;
		}

		CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

		$stime = CUpdateClientPartner::__GetMicroTime();
		$content = CUpdateClientPartner::__GetHTTPPage("SEARCH", $strQuery, $strError_tmp);

		CUpdateClientPartner::AddMessage2Log("TIME SearchModulesEx(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");

		$arResult = Array();
		if (strlen($strError_tmp) <= 0)
			CUpdateClientPartner::__ParseServerData($content, $arResult, $strError_tmp);

		//echo "<pre>";print_r($arResult);echo "</pre>";

		if (strlen($strError_tmp) <= 0)
		{
			if (!isset($arResult["DATA"]) || !is_array($arResult["DATA"]))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$arResult = $arResult["DATA"]["#"];
			if (!is_array($arResult["CLIENT"]) && (!isset($arResult["ERROR"]) || !is_array($arResult["ERROR"])))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (isset($arResult["ERROR"]))
		{
			for ($i = 0, $cnt = count($arResult["ERROR"]); $i < $cnt; $i++)
				$strError_tmp .= "[".$arResult["ERROR"][$i]["@"]["TYPE"]."] ".$arResult["ERROR"][$i]["#"];
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GUL02");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return $arResult;
	}

	function SearchModules($searchModule, $lang)
	{
		$strError_tmp = "";
		$arResult = array();

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::SearchModules");

		$strQuery = CUpdateClientPartner::__CollectRequestData(
			$strError_tmp,
			$lang,
			$stableVersionsOnly,
			array(),
			array("search_module" => $searchModule)
		);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			$strError .= $strError_tmp;
			CUpdateClientPartner::AddMessage2Log("Empty query list", "GUL01");
			return False;
		}

		CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

		$stime = CUpdateClientPartner::__GetMicroTime();
		$content = CUpdateClientPartner::__GetHTTPPage("SEARCH", $strQuery, $strError_tmp);

		CUpdateClientPartner::AddMessage2Log("TIME SearchModules(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");

		$arResult = Array();
		if (strlen($strError_tmp) <= 0)
			CUpdateClientPartner::__ParseServerData($content, $arResult, $strError_tmp);

		//echo "<pre>";print_r($arResult);echo "</pre>";

		if (strlen($strError_tmp) <= 0)
		{
			if (!isset($arResult["DATA"]) || !is_array($arResult["DATA"]))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$arResult = $arResult["DATA"]["#"];
			if (!is_array($arResult["CLIENT"]) && (!isset($arResult["ERROR"]) || !is_array($arResult["ERROR"])))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GUL02");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return $arResult;
	}
	
	/** Ïèøåò ñîîáùåíèÿ â ëîã ôàéë ñèñòåìû îáíîâëåíèé. ×èñòèò ëîã, åñëè íóæíî. **/
	function AddMessage2Log($sText, $sErrorCode = "")
	{
		$MAX_LOG_SIZE = 1000000;
		$READ_PSIZE = 8000;
		$LOG_FILE = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/updater_partner.log";
		$LOG_FILE_TMP = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/updater_partner_tmp1.log";

		if (strlen($sText)>0 || strlen($sErrorCode)>0)
		{
			$old_abort_status = ignore_user_abort(true);

			if (file_exists($LOG_FILE))
			{
				$log_size = @filesize($LOG_FILE);
				$log_size = IntVal($log_size);

				if ($log_size > $MAX_LOG_SIZE)
				{
					if (!($fp = @fopen($LOG_FILE, "rb")))
					{
						ignore_user_abort($old_abort_status);
						return False;
					}

					if (!($fp1 = @fopen($LOG_FILE_TMP, "wb")))
					{
						ignore_user_abort($old_abort_status);
						return False;
					}

					$iSeekLen = IntVal($log_size-$MAX_LOG_SIZE/2.0);
					fseek($fp, $iSeekLen);

					do
					{
						$data = fread($fp, $READ_PSIZE);
						if (strlen($data) == 0)
							break;

						@fwrite($fp1, $data);
					}
					while(true);

					@fclose($fp);
					@fclose($fp1);

					@copy($LOG_FILE_TMP, $LOG_FILE);
					@unlink($LOG_FILE_TMP);
				}
				clearstatcache();
			}

			if ($fp = @fopen($LOG_FILE, "ab+"))
			{
				if (flock($fp, LOCK_EX))
				{
					@fwrite($fp, date("Y-m-d H:i:s")." - ".$sErrorCode." - ".$sText."\n");
					@fflush($fp);
					@flock($fp, LOCK_UN);
					@fclose($fp);
				}
			}
			ignore_user_abort($old_abort_status);
		}
	}

	function GetRequestedModules($strAddModule)
	{
		$arRequestedModules = array();

		$arClientModules = CUpdateClientPartner::GetCurrentModules($strError_tmp);
		if (strlen($strError_tmp) <= 0)
		{
			if (count($arClientModules) > 0)
			{
				foreach ($arClientModules as $key => $value)
				{
					if (strpos($key, ".") !== false)
						$arRequestedModules[] = $key;
				}
			}
		}

		if (strlen($strAddModule) > 0)
		{
			$arAddModule = explode(",", $strAddModule);
			foreach ($arAddModule as $value)
			{
				$value = trim($value);
				if (strlen($value) > 0 && strpos($value, ".") !== false)
					$arRequestedModules[] = $value;
			}
		}

		return $arRequestedModules;
	}

	/** Ïîëó÷åíèå ëèöåíçèîííîãî êëþ÷à òåêóùåãî êëèåíòà **/
	function GetLicenseKey()
	{
		if (defined("US_LICENSE_KEY"))
			return US_LICENSE_KEY;
		if (defined("LICENSE_KEY"))
			return LICENSE_KEY;
		if (!isset($GLOBALS["CACHE4UPDATESYS_LICENSE_KEY"])	|| $GLOBALS["CACHE4UPDATESYS_LICENSE_KEY"]=="")
		{
			$LICENSE_KEY = "demo";
			if (file_exists($_SERVER["DOCUMENT_ROOT"]."/bitrix/license_key.php"))
				include($_SERVER["DOCUMENT_ROOT"]."/bitrix/license_key.php");
			$GLOBALS["CACHE4UPDATESYS_LICENSE_KEY"] = $LICENSE_KEY;
		}
		return $GLOBALS["CACHE4UPDATESYS_LICENSE_KEY"];
	}

	/* Ïîëó÷èòü îáíîâëåíèÿ ñëåäóþùåãî øàãà */
	function GetNextStepUpdates(&$strError, $lang = false, $stableVersionsOnly = "Y", $arRequestedModules = array(), $bStrongList = false)
	{
		$strError_tmp = "";

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetNextStepUpdates");

		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, $arRequestedModules, array(), $bStrongList);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			if (StrLen($strError_tmp) <= 0)
				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
		}

		if (StrLen($strError_tmp) <= 0)
		{
			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

			$stime = CUpdateClientPartner::__GetMicroTime();
			$content = CUpdateClientPartner::__GetHTTPPage("STEPM", $strQuery, $strError_tmp);
			if (strlen($content) <= 0)
			{
				if (StrLen($strError_tmp) <= 0)
					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
			}

			CUpdateClientPartner::AddMessage2Log("TIME GetNextStepUpdates(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
		}

		if (StrLen($strError_tmp) <= 0)
		{
			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
				$strError_tmp = "[GNSU03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
		}

		if (StrLen($strError_tmp) <= 0)
		{
			fwrite($fp1, $content);
			fclose($fp1);
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GNSU00");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	// Ðàñïàêîâûâàåò àðõèâ ôàéëîâ update_archive.gz â ïàïêy $updatesDir
	function UnGzipArchive(&$updatesDir, &$strError, $bDelArch = true)
	{
		$strError_tmp = "";

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::UnGzipArchive");
		$stime = CUpdateClientPartner::__GetMicroTime();

		$archiveFileName = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz";

		if (!file_exists($archiveFileName) || !is_file($archiveFileName))
			$strError_tmp .= "[UUGZA01] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_NO_TMP_FILE")).". ";

		if (strlen($strError_tmp) <= 0)
		{
			if (!is_readable($archiveFileName))
				$strError_tmp .= "[UUGZA02] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_NO_READ_FILE")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$updatesDir = "update_m".time();
			$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
			CUpdateClientPartner::__CheckDirPath($updatesDirFull."/", true);

			if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
				$strError_tmp .= "[UUGZA03] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_UGA_NO_TMP_CAT")).". ";
			elseif (!is_writable($updatesDirFull))
				$strError_tmp .= "[UUGZA04] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_UGA_WRT_TMP_CAT")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$bCompressionUsed = True;

			$fd = fopen($archiveFileName, "rb");
			$flabel = fread($fd, strlen("BITRIX"));
			fclose($fd);

			if ($flabel == "BITRIX")
				$bCompressionUsed = False;
		}

		if (strlen($strError_tmp) <= 0)
		{
			if ($bCompressionUsed)
				$zp = gzopen($archiveFileName, "rb9f");
			else
				$zp = fopen($archiveFileName, "rb");

			if (!$zp)
				$strError_tmp .= "[UUGZA05] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_CANT_OPEN")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			if ($bCompressionUsed)
				$flabel = gzread($zp, strlen("BITRIX"));
			else
				$flabel = fread($zp, strlen("BITRIX"));

			if ($flabel != "BITRIX")
			{
				$strError_tmp .= "[UUGZA06] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";

				if ($bCompressionUsed)
					gzclose($zp);
				else
					fclose($zp);
			}
		}

		if (strlen($strError_tmp) <= 0)
		{
			$strongUpdateCheck = COption::GetOptionString("main", "strong_update_check", "Y");

			while (true)
			{
				if ($bCompressionUsed)
					$add_info_size = gzread($zp, 5);
				else
					$add_info_size = fread($zp, 5);

				$add_info_size = Trim($add_info_size);
				if (IntVal($add_info_size) > 0 && IntVal($add_info_size)."!"==$add_info_size."!")
				{
					$add_info_size = IntVal($add_info_size);
				}
				else
				{
					if ($add_info_size != "RTIBE")
						$strError_tmp .= "[UUGZA071] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";

					break;
				}

				if ($bCompressionUsed)
					$add_info = gzread($zp, $add_info_size);
				else
					$add_info = fread($zp, $add_info_size);

				$add_info_arr = explode("|", $add_info);
				if (count($add_info_arr) != 3)
				{
					$strError_tmp .= "[UUGZA072] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";
					break;
				}

				$size = $add_info_arr[0];
				$curpath = $add_info_arr[1];
				$crc32 = $add_info_arr[2];

				$contents = "";
				if (IntVal($size) > 0)
				{
					if ($bCompressionUsed)
						$contents = gzread($zp, $size);
					else
						$contents = fread($zp, $size);
				}

				$crc32_new = dechex(crc32($contents));

				if ($crc32_new != $crc32)
				{
					$strError_tmp .= "[UUGZA073] ".str_replace("#FILE#", $curpath, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
					break;
				}
				else
				{
					CUpdateClientPartner::__CheckDirPath($updatesDirFull.$curpath, true);

					if (!($fp1 = fopen($updatesDirFull.$curpath, "wb")))
					{
						$strError_tmp .= "[UUGZA074] ".str_replace("#FILE#", $updatesDirFull.$curpath, GetMessage("SUPP_UGA_CANT_OPEN_WR")).". ";
						break;
					}

					if (strlen($contents) > 0 && !fwrite($fp1, $contents))
					{
						$strError_tmp .= "[UUGZA075] ".str_replace("#FILE#", $updatesDirFull.$curpath, GetMessage("SUPP_UGA_CANT_WRITE_F")).". ";
						@fclose($fp1);
						break;
					}
					fclose($fp1);

					if ($strongUpdateCheck == "Y")
					{
						$crc32_new = dechex(crc32(file_get_contents($updatesDirFull.$curpath)));
						if ($crc32_new != $crc32)
						{
							$strError_tmp .= "[UUGZA0761] ".str_replace("#FILE#", $curpath, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
							break;
						}
					}
				}
			}

			if ($bCompressionUsed)
				gzclose($zp);
			else
				fclose($zp);
		}

		if (strlen($strError_tmp) <= 0)
		{
			if ($bDelArch)
				@unlink($archiveFileName);
		}

		CUpdateClientPartner::AddMessage2Log("TIME UnGzipArchive ".Round(CUpdateClientPartner::__GetMicroTime()-$stime, 3)." sec");

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUUGZA");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	// Âîçâðàùàåò èíôîðìàöèþ ïî çàãðóæåííûì â ïàïêó $updatesDir îáíîâëåíèÿì ìîäóëåé
	function CheckUpdatability($updatesDir, &$strError)
	{
		$strError_tmp = "";

		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
			$strError_tmp .= "[UCU01] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_NO_TMP_CAT")).". ";

		if (strlen($strError_tmp) <= 0)
			if (!is_readable($updatesDirFull))
				$strError_tmp .= "[UCU02] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_RD_TMP_CAT")).". ";

		if ($handle = @opendir($updatesDirFull))
		{
			while (($file = readdir($handle)) !== false)
			{
				if ($file == "." || $file == "..")
					continue;

				if (is_dir($updatesDirFull."/".$file))
				{
					CUpdateClientPartner::CheckUpdatability($updatesDir."/".$file, $strError_tmp);
				}
				elseif (is_file($updatesDirFull."/".$file))
				{
					$strRealPath = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".substr($updatesDir."/".$file, strpos($updatesDir."/".$file, "/"));
					if (file_exists($strRealPath))
					{
						if (!is_writeable($strRealPath))
							$strError_tmp .= "[UCU03] ".str_replace("#FILE#", $strRealPath, GetMessage("SUPP_CU_MAIN_ERR_FILE")).". ";
					}
					else
					{
						$p = CUpdateClientPartner::__bxstrrpos($strRealPath, "/");
						$strRealPath = substr($strRealPath, 0, $p);

						if (strlen($strRealPath) > 1)
							$strRealPath = rtrim($strRealPath, "/");

						$p = CUpdateClientPartner::__bxstrrpos($strRealPath, "/");
						while ($p > 0)
						{
							if (file_exists($strRealPath) && is_dir($strRealPath))
							{
								if (!is_writable($strRealPath))
									$strError_tmp .= "[UCU04] ".str_replace("#FILE#", $strRealPath, GetMessage("SUPP_CU_MAIN_ERR_CAT")).". ";

								break;
							}
							$strRealPath = substr($strRealPath, 0, $p);
							$p = CUpdateClientPartner::__bxstrrpos($strRealPath, "/");
						}
					}
				}
			}
			@closedir($handle);
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUCU");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	// Âîçâðàùàåò èíôîðìàöèþ ïî çàãðóæåííûì â ïàïêó $updatesDir îáíîâëåíèÿì ìîäóëåé
	function GetStepUpdateInfo($updatesDir, &$strError)
	{
		$arResult = array();
		$strError_tmp = "";

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetStepUpdateInfo");

		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
			$strError_tmp .= "[UGLMU01] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_NO_TMP_CAT")).". ";

		if (strlen($strError_tmp) <= 0)
			if (!is_readable($updatesDirFull))
				$strError_tmp .= "[UGLMU02] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_RD_TMP_CAT")).". ";

		if (strlen($strError_tmp) <= 0)
			if (!file_exists($updatesDirFull."/update_info.xml") || !is_file($updatesDirFull."/update_info.xml"))
				$strError_tmp .= "[UGLMU03] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_ER_DESCR_FILE")).". ";

		if (strlen($strError_tmp) <= 0)
			if (!is_readable($updatesDirFull."/update_info.xml"))
				$strError_tmp .= "[UGLMU04] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_READ_DESCR_FILE")).". ";

		if (strlen($strError_tmp) <= 0)
			$content = file_get_contents($updatesDirFull."/update_info.xml");

		//echo "!1!".htmlspecialchars($content)."!2!";

		if (strlen($strError_tmp) <= 0)
		{
			$arResult = Array();
			CUpdateClientPartner::__ParseServerData($content, $arResult, $strError_tmp);
		}

		//echo "!3!".htmlspecialchars($content)."!4!";
		//echo "<pre>";print_r($arRes);echo "</pre>";

		if (strlen($strError_tmp) <= 0)
		{
			if (!isset($arResult["DATA"]) || !is_array($arResult["DATA"]))
				$strError_tmp .= "[UGSMU01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUGLMU");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return $arResult;
	}

	function __CollectRequestData(&$strError, $lang = false, $stableVersionsOnly = "Y", $arRequestedModules = array(), $arAdditionalData = array(), $bStrongList = false)
	{
		$strResult = "";
		$strError_tmp = "";

		if ($lang === false)
			$lang = LANGUAGE_ID;

		$stableVersionsOnly = (($stableVersionsOnly == "N") ? "N" : "Y");

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::__CollectRequestData");

		CUpdateClientPartner::__CheckDirPath($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/", true);

		$arClientModules = CUpdateClientPartner::GetCurrentModules($strError_tmp);

		if (strlen($strError_tmp) <= 0)
		{
			$dbv = $GLOBALS["DB"]->GetVersion();

			$strResult = "utf=".urlencode(defined('BX_UTF') ? "Y" : "N").
				"&lang=".urlencode($lang).
				"&stable=".urlencode($stableVersionsOnly).
				"&CANGZIP=".urlencode((CUpdateClientPartner::__IsGzipInstalled()) ? "Y" : "N").
				"&SUPD_DBS=".urlencode($GLOBALS["DB"]->type).
				"&XE=".urlencode(($GLOBALS["DB"]->XE) ? "Y" : "N").
				"&CLIENT_SITE=".urlencode($_SERVER["SERVER_NAME"]).
				"&LICENSE_KEY=".urlencode(md5(CUpdateClientPartner::GetLicenseKey())).
				"&SUPD_STS=".urlencode(CUpdateClientPartner::__GetFooPath()).
				"&SUPD_URS=".urlencode(CUpdateClientPartner::__GetFooPath1(0)).
				"&SUPD_URSA=".urlencode(CUpdateClientPartner::__GetFooPath1(1)).
				"&TYPENC=".((defined("DEMO") && DEMO=="Y") ? "D" : ((defined("ENCODE") && ENCODE=="Y") ? "E" : "F" )).
				"&CLIENT_PHPVER=".urlencode(phpversion()).
				"&dbv=".urlencode($dbv != false ? $dbv : "");

			$strResultTmp = "";
			if (count($arClientModules) > 0)
			{
				foreach ($arClientModules as $key => $value)
				{
					if (StrLen($strResultTmp) > 0)
						$strResultTmp .= ";";
					$strResultTmp .= $key.",".$value["VERSION"].",".$value["IS_DEMO"];
				}
			}
			if (StrLen($strResultTmp) > 0)
				$strResult .= "&instm=".urlencode($strResultTmp);

//			foreach ($arClientModules as $key => $value)
//				$strResult .= "&m_".$key."=".urlencode($value);

			$strResultTmp = "";
			if (count($arRequestedModules) > 0)
			{
				for ($i = 0, $cnt = count($arRequestedModules); $i < $cnt; $i++)
				{
					if (StrLen($strResultTmp) > 0)
						$strResultTmp .= ",";
					$strResultTmp .= $arRequestedModules[$i];
				}
			}
			if (StrLen($strResultTmp) > 0)
				$strResult .= "&reqm=".urlencode($strResultTmp);
			
			if ($bStrongList)
				$strResult .= "&lim=Y";

			$strResultTmp = "";
			if (count($arAdditionalData) > 0)
			{
				foreach ($arAdditionalData as $key => $value)
				{
					if (StrLen($strResultTmp) > 0)
						$strResultTmp .= "&";
					$strResultTmp .= $key."=".urlencode($value);
				}
			}
			if (StrLen($strResultTmp) > 0)
				$strResult .= "&".$strResultTmp;

			return $strResult;
		}

		CUpdateClientPartner::AddMessage2Log($strError_tmp, "NCRD01");
		$strError .= $strError_tmp;
		return False;
	}

	/** Ñîáèðàåò êëèåíòñêèå ìîäóëè ñ âåðñèÿìè **/
	function GetCurrentModules(&$strError)
	{
		$arClientModules = array();

		if (file_exists($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/classes/general/version.php")
			&& is_file($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/classes/general/version.php"))
		{
			$p = file_get_contents($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/classes/general/version.php");

			preg_match("/define\s*\(\s*\"SM_VERSION\"\s*,\s*\"(\d+\.\d+\.\d+)\"\s*\)\s*/im", $p, $arVers);
			$arClientModules["main"] = array("VERSION" => $arVers[1], "IS_DEMO" => ((defined("DEMO") && DEMO == "Y") ? "Y" : "N"));
		}

		if (!array_key_exists("main", $arClientModules) || strlen($arClientModules["main"]["VERSION"]) <= 0)
		{
			CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GM_ERR_DMAIN"), "Ux09");
			$strError .= "[Ux09] ".GetMessage("SUPP_GM_ERR_DMAIN").". ";
			return array();
		}

		if ($handle = @opendir($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules"))
		{
			while (false !== ($dir = readdir($handle)))
			{
				if (is_dir($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".$dir)
					&& $dir != "." && $dir != ".." && $dir != "main")
				{
					$module_dir = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".$dir;
					if (file_exists($module_dir."/install/index.php"))
					{
						$arInfo = CUpdateClientPartner::__GetModuleInfo($module_dir);
						if (!isset($arInfo["VERSION"]) || strlen($arInfo["VERSION"]) <= 0)
						{
							CUpdateClientPartner::AddMessage2Log(str_replace("#MODULE#", $dir, GetMessage("SUPP_GM_ERR_DMOD")), "Ux11");
							$strError .= "[Ux11] ".str_replace("#MODULE#", $dir, GetMessage("SUPP_GM_ERR_DMOD")).". ";

							return array();
						}
						else
						{
							$arClientModules[$dir] = array("VERSION" => $arInfo["VERSION"], "IS_DEMO" => $arInfo["IS_DEMO"]);
						}
					}
					else
					{
						CUpdateClientPartner::AddMessage2Log(str_replace("#MODULE#", $dir, GetMessage("SUPP_GM_ERR_DMOD")), "Ux12");
					}
				}
			}
			closedir($handle);
		}
		else
		{
			CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GM_NO_KERNEL"), "Ux15");
			$strError .= "[Ux15] ".GetMessage("SUPP_GM_NO_KERNEL").". ";
			
			return array();
		}

		return $arClientModules;
	}

	/* Ïîëó÷èòü ñïèñîê äîñòóïíûõ îáíîâëåíèé */
	function GetUpdatesList(&$strError, $lang = false, $stableVersionsOnly = "Y", $arRequestedModules = array())
	{
		$strError_tmp = "";
		$arResult = array();

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetUpdatesList");

		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, $arRequestedModules);
		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
		{
			$strError .= $strError_tmp;
			CUpdateClientPartner::AddMessage2Log("Empty query list", "GUL01");
			return False;
		}

		CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

		$stime = CUpdateClientPartner::__GetMicroTime();
		$content = CUpdateClientPartner::__GetHTTPPage("LIST", $strQuery, $strError_tmp);

		CUpdateClientPartner::AddMessage2Log("TIME GetUpdatesList(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");

		$arResult = Array();
		if (strlen($strError_tmp) <= 0)
			CUpdateClientPartner::__ParseServerData($content, $arResult, $strError_tmp);

		//echo "<pre>";print_r($arResult);echo "</pre>";

		if (strlen($strError_tmp) <= 0)
		{
			if (!isset($arResult["DATA"]) || !is_array($arResult["DATA"]))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$arResult = $arResult["DATA"]["#"];
			if (!is_array($arResult["CLIENT"]) && (!isset($arResult["ERROR"]) || !is_array($arResult["ERROR"])))
				$strError_tmp .= "[UGAUT01] ".GetMessage("SUPP_GAUT_SYSERR").". ";
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GUL02");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return $arResult;
	}

	function ClearUpdateFolder($updatesDirFull)
	{
		CUpdateClientPartner::__DeleteDirFilesEx($updatesDirFull);
		bx_accelerator_reset();
	}

	function UpdateStepModules($updatesDir, &$strError, $bSaveUpdaters = False)
	{
		global $DB;
		$strError_tmp = "";

		if (!defined("US_SAVE_UPDATERS_DIR") || StrLen(US_SAVE_UPDATERS_DIR) <= 0)
			$bSaveUpdaters = False;

		$stime = CUpdateClientPartner::__GetMicroTime();

		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;

		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
			$strError_tmp .= "[UUK01] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_NO_TMP_CAT")).". ";

		if (strlen($strError_tmp) <= 0)
			if (!is_readable($updatesDirFull))
				$strError_tmp .= "[UUK03] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_RD_TMP_CAT")).". ";

		$arModules = array();
		if (StrLen($strError_tmp) <= 0)
		{
			$handle = @opendir($updatesDirFull);
			if ($handle)
			{
				while (false !== ($dir = readdir($handle)))
				{
					if ($dir == "." || $dir == "..")
						continue;
					if (is_dir($updatesDirFull."/".$dir))
						$arModules[] = $dir;
				}
				closedir($handle);
			}
		}

		if (!is_array($arModules) || count($arModules) <= 0)
			$strError_tmp .= "[UUK02] ".GetMessage("SUPP_UK_NO_MODS").". ";

		if (strlen($strError_tmp) <= 0)
		{
			for ($i = 0, $cnt = count($arModules); $i < $cnt; $i++)
			{
				$strError_tmp1 = "";

				$updateDirFrom = $updatesDirFull."/".$arModules[$i];
				$updateDirTo = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/".$arModules[$i];

				CUpdateClientPartner::__CheckDirPath($updateDirTo."/", true);

				if (!file_exists($updateDirTo) || !is_dir($updateDirTo))
					$strError_tmp1 .= "[UUK04] ".str_replace("#MODULE_DIR#", $updateDirTo, GetMessage("SUPP_UK_NO_MODIR")).". ";

				if (strlen($strError_tmp1) <= 0)
					if (!is_writable($updateDirTo))
						$strError_tmp1 .= "[UUK05] ".str_replace("#MODULE_DIR#", $updateDirTo, GetMessage("SUPP_UK_WR_MODIR")).". ";

				if (strlen($strError_tmp1) <= 0)
					if (!file_exists($updateDirFrom) || !is_dir($updateDirFrom))
						$strError_tmp1 .= "[UUK06] ".str_replace("#DIR#", $updateDirFrom, GetMessage("SUPP_UK_NO_FDIR")).". ";

				if (strlen($strError_tmp1) <= 0)
					if (!is_readable($updateDirFrom))
						$strError_tmp1 .= "[UUK07] ".str_replace("#DIR#", $updateDirFrom, GetMessage("SUPP_UK_READ_FDIR")).". ";

				if (strlen($strError_tmp1) <= 0)
				{
					$handle = @opendir($updateDirFrom);
					$arUpdaters = array();
					if ($handle)
					{
						while (false !== ($dir = readdir($handle)))
						{
							if (substr($dir, 0, 7) == "updater")
							{
								$bPostUpdater = "N";
								if (is_file($updateDirFrom."/".$dir))
								{
									$num = substr($dir, 7, strlen($dir) - 11);
									if (substr($dir, strlen($dir) - 9) == "_post.php")
									{
										$bPostUpdater = "Y";
										$num = substr($dir, 7, strlen($dir) - 16);
									}
									$arUpdaters[] = array("/".$dir, Trim($num), $bPostUpdater);
								}
								elseif (file_exists($updateDirFrom."/".$dir."/index.php"))
								{
									$num = substr($dir, 7);
									if (substr($dir, strlen($dir) - 5) == "_post")
									{
										$bPostUpdater = "Y";
										$num = substr($dir, 7, strlen($dir) - 12);
									}
									$arUpdaters[] = array("/".$dir."/index.php", Trim($num), $bPostUpdater);
								}

								if ($bSaveUpdaters)
									CUpdateClientPartner::__CopyDirFiles($updateDirFrom."/".$dir, $_SERVER["DOCUMENT_ROOT"].US_SAVE_UPDATERS_DIR."/".$arModules[$i]."/".$dir, $strError_tmp1, False);
							}
						}
						closedir($handle);
					}

					for ($i1 = 0; $i1 < count($arUpdaters) - 1; $i1++)
					{
						for ($j1 = $i1 + 1; $j1 < count($arUpdaters); $j1++)
						{
							if (CUpdateClientPartner::__CompareVersions($arUpdaters[$i1][1], $arUpdaters[$j1][1]) > 0)
							{
								$tmp1 = $arUpdaters[$i1];
								$arUpdaters[$i1] = $arUpdaters[$j1];
								$arUpdaters[$j1] = $tmp1;
							}
						}
					}
				}

				if (strlen($strError_tmp1) <= 0)
				{
					if (strtolower($DB->type) == "mysql" && defined("MYSQL_TABLE_TYPE") && strlen(MYSQL_TABLE_TYPE) > 0)
					{
						$DB->Query("SET table_type = '".MYSQL_TABLE_TYPE."'", True);
					}
				}

				if (strlen($strError_tmp1) <= 0)
				{
					for ($i1 = 0; $i1 < count($arUpdaters); $i1++)
					{
						if ($arUpdaters[$i1][2] == "N")
						{
							$strError_tmp2 = "";
							CUpdateClientPartner::__RunUpdaterScript($updateDirFrom.$arUpdaters[$i1][0], $strError_tmp2, "/bitrix/updates/".$updatesDir."/".$arModules[$i], $arModules[$i]);
							if (strlen($strError_tmp2) > 0)
							{
								$strError_tmp1 .= 
										str_replace("#MODULE#", $arModules[$i], str_replace("#VER#", $arUpdaters[$i1][1], GetMessage("SUPP_UK_UPDN_ERR"))).": ".
										$strError_tmp2.". ";
								$strError_tmp1 .= str_replace("#MODULE#", $arModules[$i], GetMessage("SUPP_UK_UPDN_ERR_BREAK"))." ";
								break;
							}
						}
					}
				}

				if (strlen($strError_tmp1) <= 0)
					CUpdateClientPartner::__CopyDirFiles($updateDirFrom, $updateDirTo, $strError_tmp1, True);

				if (strlen($strError_tmp1) <= 0)
				{
					for ($i1 = 0; $i1 < count($arUpdaters); $i1++)
					{
						if ($arUpdaters[$i1][2]=="Y")
						{
							$strError_tmp2 = "";
							CUpdateClientPartner::__RunUpdaterScript($updateDirFrom.$arUpdaters[$i1][0], $strError_tmp2, "/bitrix/updates/".$updatesDir."/".$arModules[$i], $arModules[$i]);
							if (strlen($strError_tmp2) > 0)
							{
								$strError_tmp1 .= 
										str_replace("#MODULE#", $arModules[$i], str_replace("#VER#", $arUpdaters[$i1][1], GetMessage("SUPP_UK_UPDY_ERR"))).": ".
										$strError_tmp2.". ";
								$strError_tmp1 .= str_replace("#MODULE#", $arModules[$i], GetMessage("SUPP_UK_UPDN_ERR_BREAK"))." ";
								break;
							}
						}
					}
				}

				if (strlen($strError_tmp1) > 0)
					$strError_tmp .= $strError_tmp1;
			}
			CUpdateClientPartner::ClearUpdateFolder($updatesDirFull);
		}

		CUpdateClientPartner::AddMessage2Log("TIME UpdateStepModules ".Round(CUpdateClientPartner::__GetMicroTime()-$stime, 3)." sec");

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "USM");
			$strError .= $strError_tmp;
			return False;
		}
		else
		{
			$events = GetModuleEvents("main", "OnModuleUpdate");
			while ($arEvent = $events->Fetch())
				ExecuteModuleEvent($arEvent, $arModules);

			return True;
		}
	}

	
	
	
	
	
	
	
	

	
//	function SubscribeMail($email, &$strError, $lang = false, $stableVersionsOnly = "Y")
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::SubscribeMail");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[RV01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			$strQuery .= "&email=".UrlEncode($email)."&query_type=mail";
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			/*
//			foreach ($arFields as $key => $value)
//				$strQuery .= "&".$key."=".urlencode($value);
//			*/

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("ACTIV", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME SubscribeMail(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arRes = Array();
//			CUpdateClientPartner::ParseServerData($content, $arRes, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
//			{
//				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
//				{
//					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]) > 0)
//						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

//					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
//				}
//			}
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "SM");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	function ActivateCoupon($coupon, &$strError, $lang = false, $stableVersionsOnly = "Y")
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::ActivateCoupon");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[RV01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			$strQuery .= "&coupon=".UrlEncode($coupon)."&query_type=coupon";
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			/*
//			foreach ($arFields as $key => $value)
//				$strQuery .= "&".$key."=".urlencode($value);
//			*/

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("ACTIV", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME ActivateCoupon(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arRes = Array();
//			CUpdateClientPartner::ParseServerData($content, $arRes, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
//			{
//				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
//				{
//					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]) > 0)
//						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

//					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
//				}
//			}
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "AC");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	function UpdateUpdate(&$strError, $lang = false, $stableVersionsOnly = "Y")
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::UpdateUpdate");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[RV01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			$strQuery .= "&query_type=updateupdate";
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			/*
//			foreach ($arFields as $key => $value)
//				$strQuery .= "&".$key."=".urlencode($value);
//			*/

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("REG", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME UpdateUpdate(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
//				$strError_tmp .= "[URV02] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!fwrite($fp1, $content))
//				$strError_tmp .= "[URV03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", GetMessage("SUPP_RV_WRT_TEMP_FILE")).". ";

//			@fclose($fp1);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updatesDirTmp = "";
//			if (!CUpdateClientPartner::UnGzipArchive($updatesDirTmp, $strError_tmp, "Y"))
//				$strError_tmp .= "[URV04] ".GetMessage("SUPP_RV_BREAK").". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDirTmp;
//			if (!file_exists($updatesDirFull."/update_info.xml") || !is_file($updatesDirFull."/update_info.xml"))
//				$strError_tmp .= "[URV05] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_ER_DESCR_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!is_readable($updatesDirFull."/update_info.xml"))
//				$strError_tmp .= "[URV06] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_READ_DESCR_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//			$content = file_get_contents($updatesDirFull."/update_info.xml");

		//echo "!1!".htmlspecialchars($content)."!2!";

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arRes = Array();
//			CUpdateClientPartner::ParseServerData($content, $arRes, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
//			{
//				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
//				{
//					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]) > 0)
//						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

//					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
//				}
//			}
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updateDirTo = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main";
//			CUpdateClientPartner::__CheckDirPath($updateDirTo."/", true);

//			if (!file_exists($updateDirTo) || !is_dir($updateDirTo))
//				$strError_tmp .= "[UUK04] ".str_replace("#MODULE_DIR#", $updateDirTo, GetMessage("SUPP_UK_NO_MODIR")).". ";

//			if (strlen($strError_tmp) <= 0)
//				if (!is_writable($updateDirTo))
//					$strError_tmp .= "[UUK05] ".str_replace("#MODULE_DIR#", $updateDirTo, GetMessage("SUPP_UK_WR_MODIR")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::__CopyDirFiles($updatesDirFull."/main", $updateDirTo, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::AddMessage2Log("Update updated successfully!", "CURV");
//			CUpdateClientPartner::__DeleteDirFilesEx($updatesDirFull);
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "UU");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	function GetPHPSources($errorMessage, $lang, $stableVersionsOnly, $arRequestedModules)
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetNextStepUpdates");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, $arRequestedModules, array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("SRC", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME GetNextStepUpdates(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
//				$strError_tmp = "[GNSU03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			fwrite($fp1, $content);
//			fclose($fp1);
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GNSU00");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}


//	function RegisterVersion(&$strError, $lang = false, $stableVersionsOnly = "Y")
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::RegisterVersion");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[RV01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			$strQuery .= "&query_type=register";
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			/*
//			foreach ($arFields as $key => $value)
//				$strQuery .= "&".$key."=".urlencode($value);
//			*/

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("REG", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME RegisterVersion(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
//				$strError_tmp .= "[URV02] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!fwrite($fp1, $content))
//				$strError_tmp .= "[URV03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", GetMessage("SUPP_RV_WRT_TEMP_FILE")).". ";

//			@fclose($fp1);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updatesDirTmp = "";
//			if (!CUpdateClientPartner::UnGzipArchive($updatesDirTmp, $strError_tmp, "Y"))
//				$strError_tmp .= "[URV04] ".GetMessage("SUPP_RV_BREAK").". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDirTmp;
//			if (!file_exists($updatesDirFull."/update_info.xml") || !is_file($updatesDirFull."/update_info.xml"))
//				$strError_tmp .= "[URV05] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_ER_DESCR_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!is_readable($updatesDirFull."/update_info.xml"))
//				$strError_tmp .= "[URV06] ".str_replace("#FILE#", $updatesDirFull."/update_info.xml", GetMessage("SUPP_RV_READ_DESCR_FILE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//			$content = file_get_contents($updatesDirFull."/update_info.xml");

		//echo "!1!".htmlspecialchars($content)."!2!";

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arRes = Array();
//			CUpdateClientPartner::ParseServerData($content, $arRes, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
//			{
//				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
//				{
//					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]) > 0)
//						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

//					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
//				}
//			}
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!file_exists($updatesDirFull."/include.php") || !is_file($updatesDirFull."/include.php"))
//				$strError_tmp .= "[URV07] ".GetMessage("SUPP_RV_NO_FILE").". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$newfilesize = @filesize($updatesDirFull."/include.php");
//			if (IntVal($newfilesize) != IntVal($arRes["DATA"]["#"]["FILE"][0]["@"]["SIZE"]))
//				$strError_tmp .= "[URV08] ".GetMessage("SUPP_RV_ER_SIZE").". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!is_writeable($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php"))
//				$strError_tmp .= "[URV09] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php", GetMessage("SUPP_RV_NO_WRITE")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (!copy($updatesDirFull."/include.php", $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php"))
//				$strError_tmp .= "[URV10] ".GetMessage("SUPP_RV_ERR_COPY").". ";
//			@chmod($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php", BX_FILE_PERMISSIONS);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$strongUpdateCheck = COption::GetOptionString("main", "strong_update_check", "Y");

//			if ($strongUpdateCheck == "Y")
//			{
//				$crc32_old = dechex(crc32(file_get_contents($updatesDirFull."/include.php")));
//				$crc32_new = dechex(crc32(file_get_contents($_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php")));
//				if ($crc32_new != $crc32_old)
//					$strError_tmp .= "[URV1011] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/include.php", GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
//			}
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::AddMessage2Log("Product registered successfully!", "CURV");
//			CUpdateClientPartner::__DeleteDirFilesEx($updatesDirFull);
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CURV");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	/** Àêòèâèðóåò ëèöåíçèîííûé êëþ÷ **/
//	function ActivateLicenseKey($arFields, &$strError, $lang = false, $stableVersionsOnly = "Y")
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::ActivateLicenseKey");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			$strQuery .= "&query_type=activate";
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			foreach ($arFields as $key => $value)
//				$strQuery .= "&".$key."=".urlencode($value);

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("ACTIV", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME ActivateLicenseKey(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arRes = Array();
//			CUpdateClientPartner::ParseServerData($content, $arRes, $strError_tmp);
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			if (isset($arRes["DATA"]["#"]["ERROR"]) && is_array($arRes["DATA"]["#"]["ERROR"]) && count($arRes["DATA"]["#"]["ERROR"]) > 0)
//			{
//				for ($i = 0; $i < count($arRes["DATA"]["#"]["ERROR"]); $i++)
//				{
//					if (strlen($arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"])>0)
//						$strError_tmp .= "[".$arRes["DATA"]["#"]["ERROR"][$i]["@"]["TYPE"]."] ";

//					$strError_tmp .= $arRes["DATA"]["#"]["ERROR"][$i]["#"].". ";
//				}
//			}
//		}

//		if (strlen($strError_tmp) <= 0)
//			CUpdateClientPartner::AddMessage2Log("License key activated successfully!", "CUALK");

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUALK");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	/* Ïîëó÷èòü îáíîâëåíèÿ ÿçûêîâ ñëåäóþùåãî øàãà */
//	function GetNextStepLangUpdates(&$strError, $lang = false, $arRequestedLangs = array())
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetNextStepLangUpdates");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), $arRequestedLangs, array());
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("STEPL", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME GetNextStepLangUpdates(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
//				$strError_tmp = "[GNSU03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			fwrite($fp1, $content);
//			fclose($fp1);
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GNSLU00");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	/* Ïîëó÷èòü îáíîâëåíèÿ ïîìîùè ñëåäóþùåãî øàãà */
//	function GetNextStepHelpUpdates(&$strError, $lang = false, $arRequestedHelps = array())
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetNextStepHelpUpdates");

//		$strQuery = CUpdateClientPartner::__CollectRequestData($strError_tmp, $lang, $stableVersionsOnly, array(), array(), $arRequestedHelps);
//		if ($strQuery === False || StrLen($strQuery) <= 0 || StrLen($strError_tmp) > 0)
//		{
//			if (StrLen($strError_tmp) <= 0)
//				$strError_tmp = "[GNSU01] ".GetMessage("SUPZ_NO_QSTRING").". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::AddMessage2Log(preg_replace("/LICENSE_KEY=[^&]*/i", "LICENSE_KEY=X", $strQuery));

//			$stime = CUpdateClientPartner::__GetMicroTime();
//			$content = CUpdateClientPartner::GetHTTPPage("STEPH", $strQuery, $strError_tmp);
//			if (strlen($content) <= 0)
//			{
//				if (StrLen($strError_tmp) <= 0)
//					$strError_tmp = "[GNSU02] ".GetMessage("SUPZ_EMPTY_ANSWER").". ";
//			}

//			CUpdateClientPartner::AddMessage2Log("TIME GetNextStepHelpUpdates(request) ".Round(CUpdateClientPartner::__GetMicroTime() - $stime, 3)." sec");
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			if (!($fp1 = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz", "wb")))
//				$strError_tmp = "[GNSU03] ".str_replace("#FILE#", $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates", GetMessage("SUPP_RV_ER_TEMP_FILE")).". ";
//		}

//		if (StrLen($strError_tmp) <= 0)
//		{
//			fwrite($fp1, $content);
//			fclose($fp1);
//		}

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "GNSHU00");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	function UpdateStepHelps($updatesDir, &$strError)
//	{
//		$strError_tmp = "";

//		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::UpdateHelp");
//		$stime = CUpdateClientPartner::__GetMicroTime();

//		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
//		$helpDirFull = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/help";

//		$arHelp = array();
//		if (StrLen($strError_tmp) <= 0)
//		{
//			$handle = @opendir($updatesDirFull);
//			if ($handle)
//			{
//				while (false !== ($dir = readdir($handle)))
//				{
//					if ($dir == "." || $dir == "..")
//						continue;
//					if (is_dir($updatesDirFull."/".$dir))
//						$arHelp[] = $dir;
//				}
//				closedir($handle);
//			}
//		}

//		if (!is_array($arHelp) || count($arHelp) <= 0)
//			$strError_tmp .= "[UUH00] ".GetMessage("SUPP_UH_NO_LANG").". ";

//		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
//			$strError_tmp .= "[UUH01] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_NO_TMP_CAT")).". ";

//		if (strlen($strError_tmp) <= 0)
//			if (!is_readable($updatesDirFull))
//				$strError_tmp .= "[UUH03] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_RD_TMP_CAT")).". ";

//		if (strlen($strError_tmp) <= 0)
//		{
//			CUpdateClientPartner::__CheckDirPath($helpDirFull."/", true);

//			if (!file_exists($helpDirFull) || !is_dir($helpDirFull))
//				$strError_tmp .= "[UUH02] ".str_replace("#FILE#", $helpDirFull, GetMessage("SUPP_UH_NO_HELP_CAT")).". ";
//			elseif (!is_writable($helpDirFull))
//				$strError_tmp .= "[UUH03] ".str_replace("#FILE#", $helpDirFull, GetMessage("SUPP_UH_NO_WRT_HELP")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			for ($i = 0; $i < count($arHelp); $i++)
//			{
//				$strError_tmp1 = "";

//				$updateDirFrom = $updatesDirFull."/".$arHelp[$i];

//				if (strlen($strError_tmp1) <= 0)
//					if (!file_exists($updateDirFrom) || !is_dir($updateDirFrom))
//						$strError_tmp1 .= "[UUH04] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_TMP_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//					if (!is_readable($updateDirFrom))
//						$strError_tmp1 .= "[UUH05] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_READ_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//				{
//					if (file_exists($helpDirFull."/".$arHelp[$i]."_tmp"))
//						CUpdateClientPartner::__DeleteDirFilesEx($helpDirFull."/".$arHelp[$i]."_tmp");
//					if (file_exists($helpDirFull."/".$arHelp[$i]."_tmp"))
//						$strError_tmp1 .= "[UUH06] ".str_replace("#FILE#", $helpDirFull."/".$arHelp[$i]."_tmp", GetMessage("SUPP_UH_CANT_DEL")).". ";
//				}

//				if (strlen($strError_tmp1) <= 0)
//				{
//					if (file_exists($helpDirFull."/".$arHelp[$i]))
//						if (!rename($helpDirFull."/".$arHelp[$i], $helpDirFull."/".$arHelp[$i]."_tmp"))
//							$strError_tmp1 .= "[UUH07] ".str_replace("#FILE#", $helpDirFull."/".$arHelp[$i], GetMessage("SUPP_UH_CANT_RENAME")).". ";
//				}

//				if (strlen($strError_tmp1) <= 0)
//				{
//					CUpdateClientPartner::__CheckDirPath($helpDirFull."/".$arHelp[$i]."/", true);

//					if (!file_exists($helpDirFull."/".$arHelp[$i]) || !is_dir($helpDirFull."/".$arHelp[$i]))
//						$strError_tmp1 .= "[UUH08] ".str_replace("#FILE#", $helpDirFull."/".$arHelp[$i], GetMessage("SUPP_UH_CANT_CREATE")).". ";
//					elseif (!is_writable($helpDirFull."/".$arHelp[$i]))
//						$strError_tmp1 .= "[UUH09] ".str_replace("#FILE#", $helpDirFull."/".$arHelp[$i], GetMessage("SUPP_UH_CANT_WRITE")).". ";
//				}

//				if (strlen($strError_tmp1) <= 0)
//					CUpdateClientPartner::__CopyDirFiles($updateDirFrom, $helpDirFull."/".$arHelp[$i], $strError_tmp1);

//				if (strlen($strError_tmp1) > 0)
//				{
//					$strError_tmp .= $strError_tmp1;
//				}
//				else
//				{
//					if (file_exists($helpDirFull."/".$arHelp[$i]."_tmp"))
//						CUpdateClientPartner::__DeleteDirFilesEx($helpDirFull."/".$arHelp[$i]."_tmp");
//				}
//			}
//			CUpdateClientPartner::ClearUpdateFolder($updatesDirFull);
//		}

//		CUpdateClientPartner::AddMessage2Log("TIME UpdateHelp ".Round(CUpdateClientPartner::__GetMicroTime()-$stime, 3)." sec");

//		if (strlen($strError_tmp)>0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "USH");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

//	function UpdateStepLangs($updatesDir, &$strError)
//	{
//		global $DB;
//		$strError_tmp = "";

//		$stime = CUpdateClientPartner::__GetMicroTime();

//		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
//		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
//			$strError_tmp .= "[UUL01] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_NO_TMP_CAT")).". ";

//		$arLangs = array();
//		if (StrLen($strError_tmp) <= 0)
//		{
//			$handle = @opendir($updatesDirFull);
//			if ($handle)
//			{
//				while (false !== ($dir = readdir($handle)))
//				{
//					if ($dir == "." || $dir == "..")
//						continue;
//					if (is_dir($updatesDirFull."/".$dir))
//						$arLangs[] = $dir;
//				}
//				closedir($handle);
//			}
//		}

//		if (!is_array($arLangs) || count($arLangs) <= 0)
//			$strError_tmp .= "[UUL02] ".GetMessage("SUPP_UL_NO_LANGS").". ";

//		if (strlen($strError_tmp) <= 0)
//			if (!is_readable($updatesDirFull))
//				$strError_tmp .= "[UUL03] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_CU_RD_TMP_CAT")).". ";

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updateDirToComp = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/components/bitrix";

//			CUpdateClientPartner::__CheckDirPath($updateDirToComp."/", true);

//			if (file_exists($updateDirToComp) && is_dir($updateDirToComp))
//				if (!is_writable($updateDirToComp))
//					$strError_tmp .= "[UUL0511] ".str_replace("#FILE#", $updateDirToComp, GetMessage("SUPP_UL_NO_WRT_CAT")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$updateDirTo = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules";

//			CUpdateClientPartner::__CheckDirPath($updateDirTo."/", true);

//			if (!file_exists($updateDirTo) || !is_dir($updateDirTo))
//				$strError_tmp .= "[UUL04] ".str_replace("#FILE#", $updateDirTo, GetMessage("SUPP_UL_CAT")).". ";
//			elseif (!is_writable($updateDirTo))
//				$strError_tmp .= "[UUL05] ".str_replace("#FILE#", $updateDirTo, GetMessage("SUPP_UL_NO_WRT_CAT")).". ";
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arLangModules1 = array();
//			$arLangModules2 = array();
//			$handle1 = @opendir($updateDirToComp);
//			if ($handle1)
//			{
//				while (false !== ($dir1 = readdir($handle1)))
//				{
//					if (is_dir($updateDirToComp."/".$dir1) && $dir1 != "." && $dir1 != "..")
//					{
//						if (!is_writable($updateDirToComp."/".$dir1))
//							$strError_tmp .= "[UUL051] ".str_replace("#FILE#", $updateDirToComp."/".$dir1, GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//						if (file_exists($updateDirToComp."/".$dir1."/lang") && !is_writable($updateDirToComp."/".$dir1."/lang"))
//							$strError_tmp .= "[UUL052] ".str_replace("#FILE#", $updateDirToComp."/".$dir1."/lang", GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//						$arLangModules1[] = $dir1;

//						$handle2 = @opendir($updateDirToComp."/".$dir1."/templates");
//						if ($handle2)
//						{
//							while (false !== ($dir2 = readdir($handle2)))
//							{
//								if (is_dir($updateDirToComp."/".$dir1."/templates/".$dir2) && $dir2 != "." && $dir2 != "..")
//								{
//									if (!is_writable($updateDirToComp."/".$dir1."/templates/".$dir2))
//										$strError_tmp .= "[UUL05111] ".str_replace("#FILE#", $updateDirToComp."/".$dir1."/templates/".$dir2, GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//									if (file_exists($updateDirToComp."/".$dir1."/templates/".$dir2."/lang") && !is_writable($updateDirToComp."/".$dir1."/templates/".$dir2."/lang"))
//										$strError_tmp .= "[UUL05211] ".str_replace("#FILE#", $updateDirToComp."/".$dir1."/templates/".$dir2."/lang", GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//									$arLangModules2[] = $dir1."@".$dir2;
//								}
//							}
//							closedir($handle2);
//						}
//					}
//				}
//				closedir($handle1);
//			}
//		}

//		if (strlen($strError_tmp) <= 0)
//		{
//			$arLangModules = array();
//			$handle = @opendir($updateDirTo);
//			if ($handle)
//			{
//				while (false !== ($dir = readdir($handle)))
//				{
//					if (is_dir($updateDirTo."/".$dir) && $dir!="." && $dir!="..")
//					{
//						if (!is_writable($updateDirTo."/".$dir))
//							$strError_tmp .= "[UUL051] ".str_replace("#FILE#", $updateDirTo."/".$dir, GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//						if (file_exists($updateDirTo."/".$dir."/lang") && !is_writable($updateDirTo."/".$dir."/lang"))
//							$strError_tmp .= "[UUL052] ".str_replace("#FILE#", $updateDirTo."/".$dir."/lang", GetMessage("SUPP_UL_NO_WRT_CAT")).". ";

//						$arLangModules[] = $dir;
//					}
//				}
//				closedir($handle);
//			}
//		}


//		if (strlen($strError_tmp) <= 0)
//		{
//			for ($i = 0; $i < count($arLangs); $i++)
//			{
//				$strError_tmp1 = "";

//				$updateDirFrom = $updatesDirFull."/".$arLangs[$i];

//				if (strlen($strError_tmp1) <= 0)
//					if (!file_exists($updateDirFrom) || !is_dir($updateDirFrom))
//						$strError_tmp1 .= "[UUL06] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_TMP_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//					if (!is_readable($updateDirFrom))
//						$strError_tmp1 .= "[UUL07] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_READ_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//				{
//					$handle1 = @opendir($updateDirFrom."/__components");
//					if ($handle1)
//					{
//						while (false !== ($dir1 = readdir($handle1)))
//						{
//							if (is_dir($updateDirFrom."/__components/".$dir1) && $dir1 != "." && $dir1 != "..")
//							{
//								if (file_exists($updateDirFrom."/__components/".$dir1."/lang") && in_array($dir1, $arLangModules1))
//									CUpdateClientPartner::__CopyDirFiles($updateDirFrom."/__components/".$dir1."/lang", $updateDirToComp."/".$dir1."/lang", $strError_tmp1);

//								$handle2 = @opendir($updateDirFrom."/__components/".$dir1."/templates");
//								if ($handle2)
//								{
//									while (false !== ($dir2 = readdir($handle2)))
//									{
//										if (is_dir($updateDirFrom."/__components/".$dir1."/templates/".$dir2) && $dir2 != "." && $dir2 != "..")
//										{
//											if (file_exists($updateDirFrom."/__components/".$dir1."/templates/".$dir2."/lang") && in_array($dir1."@".$dir2, $arLangModules2))
//												CUpdateClientPartner::__CopyDirFiles($updateDirFrom."/__components/".$dir1."/templates/".$dir2."/lang", $updateDirToComp."/".$dir1."/templates/".$dir2."/lang", $strError_tmp1);
//										}
//									}
//									closedir($handle2);
//								}
//							}
//						}
//						closedir($handle1);
//					}
//				}

				// Óäàëèòü ñòàðûå ôàéëû

//				if (strlen($strError_tmp1) > 0)
//					$strError_tmp .= $strError_tmp1;

//				CUpdateClientPartner::__DeleteDirFilesEx($updateDirFrom."/__components");
//			}
//		}


//		if (strlen($strError_tmp) <= 0)
//		{
//			for ($i = 0; $i < count($arLangs); $i++)
//			{
//				$strError_tmp1 = "";

//				$updateDirFrom = $updatesDirFull."/".$arLangs[$i];

//				if (strlen($strError_tmp1) <= 0)
//					if (!file_exists($updateDirFrom) || !is_dir($updateDirFrom))
//						$strError_tmp1 .= "[UUL06] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_TMP_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//					if (!is_readable($updateDirFrom))
//						$strError_tmp1 .= "[UUL07] ".str_replace("#FILE#", $updateDirFrom, GetMessage("SUPP_UL_NO_READ_LANG")).". ";

//				if (strlen($strError_tmp1) <= 0)
//				{
//					for ($j = 0; $j < count($arLangModules); $j++)
//					{
//						if (file_exists($updateDirFrom."/".$arLangModules[$j]) && is_dir($updateDirFrom."/".$arLangModules[$j]))
//							CUpdateClientPartner::__CopyDirFiles($updateDirFrom."/".$arLangModules[$j], $updateDirTo."/".$arLangModules[$j], $strError_tmp1);
//					}
//				}

				// Óäàëèòü ñòàðûå ôàéëû

//				if (strlen($strError_tmp1) > 0)
//					$strError_tmp .= $strError_tmp1;
//			}
//			CUpdateClientPartner::ClearUpdateFolder($updatesDirFull);
//		}

//		CUpdateClientPartner::AddMessage2Log("TIME UpdateLangs ".Round(CUpdateClientPartner::__GetMicroTime()-$stime, 3)." sec");

//		if (strlen($strError_tmp) > 0)
//		{
//			CUpdateClientPartner::AddMessage2Log($strError_tmp, "USL");
//			$strError .= $strError_tmp;
//			return False;
//		}
//		else
//			return True;
//	}

	/** Çàïóñêàåò updater ìîäóëÿ **/
	function __RunUpdaterScript($path, &$strError, $updateDirFrom, $moduleID)
	{
		global $DBType, $DB, $APPLICATION, $USER;

		if (!isset($GLOBALS["UPDATE_STRONG_UPDATE_CHECK"])
			|| ($GLOBALS["UPDATE_STRONG_UPDATE_CHECK"] != "Y" && $GLOBALS["UPDATE_STRONG_UPDATE_CHECK"] != "N"))
		{
			$GLOBALS["UPDATE_STRONG_UPDATE_CHECK"] = ((US_CALL_TYPE != "DB") ? COption::GetOptionString("main", "strong_update_check", "Y") : "Y");
		}
		$strongUpdateCheck = $GLOBALS["UPDATE_STRONG_UPDATE_CHECK"];

		$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

		$path = str_replace("\\", "/", $path);
		$updaterPath = dirname($path);
		$updaterPath = substr($updaterPath, strlen($_SERVER["DOCUMENT_ROOT"]));
		$updaterPath = Trim($updaterPath, " \t\n\r\0\x0B/\\");
		if (strlen($updaterPath) > 0)
			$updaterPath = "/".$updaterPath;

		$updaterName = substr($path, strlen($_SERVER["DOCUMENT_ROOT"]));

		CUpdateClientPartner::AddMessage2Log("Run updater '".$updaterName."'", "CSURUS1");

		$updater = new CUpdater();
		$updater->Init($updaterPath, $DBType, $updaterName, $updateDirFrom, $moduleID, US_CALL_TYPE);

		$errorMessage = "";

		include($path);

		if (strlen($errorMessage) > 0)
			$strError .= $errorMessage;
		if (is_array($updater->errorMessage) && count($updater->errorMessage) > 0)
			$strError .= implode("\n", $updater->errorMessage);

		unset($updater);
	}

	/** Ñðàâíåíèå äâóõ âåðñèé â ôîðìàòå XX.XX.XX  **/
	/** Âîçâðàùàåò 1, åñëè $strVers1 > $strVers2  **/
	/** Âîçâðàùàåò -1, åñëè $strVers1 < $strVers2 **/
	/** Âîçâðàùàåò 0, åñëè $strVers1 == $strVers2 **/
	function __CompareVersions($strVers1, $strVers2)
	{
		$strVers1 = Trim($strVers1);
		$strVers2 = Trim($strVers2);

		if ($strVers1 == $strVers2)
			return 0;

		$arVers1 = explode(".", $strVers1);
		$arVers2 = explode(".", $strVers2);

		if (IntVal($arVers1[0]) > IntVal($arVers2[0])
			|| IntVal($arVers1[0]) == IntVal($arVers2[0]) && IntVal($arVers1[1]) > IntVal($arVers2[1])
			|| IntVal($arVers1[0]) == IntVal($arVers2[0]) && IntVal($arVers1[1]) == IntVal($arVers2[1]) && IntVal($arVers1[2]) > IntVal($arVers2[2]))
		{
			return 1;
		}

		if (IntVal($arVers1[0]) == IntVal($arVers2[0]) && IntVal($arVers1[1]) == IntVal($arVers2[1]) && IntVal($arVers1[2]) == IntVal($arVers2[2]))
		{
			return 0;
		}

		return -1;
	}

	/** Çàïðàøèâàåò ìåòîäîì POST ñòðàíèöó $page ñî ñïèñêîì ïàðàìåòðîâ **/
	/** $strVars è âîçâðàùàåò òåëî îòâåòà. Â ïàðàìåòðå $strError      **/
	/** âîçâðàùàåòñÿ òåêñò îøèáêè, åñëè òàêîâàÿ áûëà.                 **/
	function __GetHTTPPage($page, $strVars, &$strError)
	{
		global $SERVER_NAME, $DB;

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::GetHTTPPage");

		$ServerIP = COption::GetOptionString("main", "update_site", DEFAULT_UPDATE_SERVER);
		$ServerPort = 80;

		$proxyAddr = COption::GetOptionString("main", "update_site_proxy_addr", "");
		$proxyPort = COption::GetOptionString("main", "update_site_proxy_port", "");
		$proxyUserName = COption::GetOptionString("main", "update_site_proxy_user", "");
		$proxyPassword = COption::GetOptionString("main", "update_site_proxy_pass", "");

		$bUseProxy = (strlen($proxyAddr) > 0 && strlen($proxyPort) > 0);

		if ($page == "LIST")
			$page = "smp_updater_list.php";
		elseif ($page == "STEPM")
			$page = "smp_updater_modules.php";
		elseif ($page == "SEARCH")
			$page = "smp_updater_search.php";
		elseif ($page == "MODULE")
			$page = "smp_updater_actions.php";
		elseif ($page == "REG")
			$page = "smp_updater_register.php";

		$strVars .= "&product=".(IsModuleInstalled("intranet") ? "CORPORTAL" : "BSM");

		if ($bUseProxy)
		{
			$proxyPort = IntVal($proxyPort);
			if ($proxyPort <= 0)
				$proxyPort = 80;

			$requestIP = $proxyAddr;
			$requestPort = $proxyPort;
		}
		else
		{
			$requestIP = $ServerIP;
			$requestPort = $ServerPort;
		}

		$FP = fsockopen($requestIP, $requestPort, $errno, $errstr, 120);

		if ($FP)
		{
			$strRequest = "";

			if ($bUseProxy)
			{
				$strRequest .= "POST http://".$ServerIP."/bitrix/updates/".$page." HTTP/1.0\r\n";
				if (strlen($proxyUserName) > 0)
					$strRequest .= "Proxy-Authorization: Basic ".base64_encode($proxyUserName.":".$proxyPassword)."\r\n";
			}
			else
				$strRequest .= "POST /bitrix/updates/".$page." HTTP/1.0\r\n";

			$strRequest .= "User-Agent: BitrixSMUpdater\r\n";
			$strRequest .= "Accept: */*\r\n";
			$strRequest .= "Host: ".$ServerIP."\r\n";
			$strRequest .= "Accept-Language: en\r\n";
			$strRequest .= "Content-type: application/x-www-form-urlencoded\r\n";
			$strRequest .= "Content-length: ".strlen($strVars)."\r\n\r\n";
			$strRequest .= "$strVars";
			$strRequest .= "\r\n";
//CUpdateClientPartner::AddMessage2Log($strRequest, "!!!!!");
			fputs($FP, $strRequest);

			$bChunked = False;
			while (!feof($FP))
			{
				$line = fgets($FP, 4096);
				if ($line != "\r\n")
				{
					if (preg_match("/Transfer-Encoding: +chunked/i", $line))
						$bChunked = True;
				}
				else
				{
					break;
				}
			}

			$content = "";
			if ($bChunked)
			{
				$maxReadSize = 4096;

				$length = 0;
				$line = FGets($FP, $maxReadSize);
				$line = StrToLower($line);

				$strChunkSize = "";
				$i = 0;
				while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f")))
				{
					$strChunkSize .= $line[$i];
					$i++;
				}

				$chunkSize = hexdec($strChunkSize);

				while ($chunkSize > 0)
				{
					$processedSize = 0;
					$readSize = (($chunkSize > $maxReadSize) ? $maxReadSize : $chunkSize);

					while ($readSize > 0 && $line = fread($FP, $readSize))
					{
						$content .= $line;
						$processedSize += StrLen($line);
						$newSize = $chunkSize - $processedSize;
						$readSize = (($newSize > $maxReadSize) ? $maxReadSize : $newSize);
					}
					$length += $chunkSize;

					$line = FGets($FP, $maxReadSize);

					$line = FGets($FP, $maxReadSize);
					$line = StrToLower($line);

					$strChunkSize = "";
					$i = 0;
					while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f")))
					{
						$strChunkSize .= $line[$i];
						$i++;
					}

					$chunkSize = hexdec($strChunkSize);
				}
			}
			else
			{
				while ($line = fread($FP, 4096))
					$content .= $line;
			}

			fclose($FP);
		}
		else
		{
			$content = "";
			$strError .= GetMessage("SUPP_GHTTP_ER").": [".$errno."] ".$errstr.". ";
			if (IntVal($errno) <= 0)
				$strError .= GetMessage("SUPP_GHTTP_ER_DEF")." ";

			CUpdateClientPartner::AddMessage2Log("Error connecting 2 ".$ServerIP.": [".$errno."] ".$errstr."", "ERRCONN");
		}
		//CUpdateClientPartner::AddMessage2Log($content, "!1!");

		//echo "content:<br>".$content."<br><br>";
		return $content;
	}


	/** Ïðîâåðÿåò íà îøèáêè îòâåò ñåðâåðà $strServerOutput **/
	/** è ïàðñèò â ìàññèâ $arRes                           **/
	function __ParseServerData(&$strServerOutput, &$arRes, &$strError)
	{
		$strError_tmp = "";
		$arRes = array();

		CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::ParseServerData");

		//CUpdateClientPartner::AddMessage2Log($strServerOutput, "!2!");
		//echo "strServerOutput:<br>".htmlspecialchars($strServerOutput)."<br><br>";

		if (strlen($strServerOutput) <= 0)
			$strError_tmp .= "[UPSD01] ".GetMessage("SUPP_AS_EMPTY_RESP").". ";

		if (strlen($strError_tmp) <= 0)
		{
			if (SubStr($strServerOutput, 0, StrLen("<DATA>")) != "<DATA>" && CUpdateClientPartner::__IsGzipInstalled())
				$strServerOutput = @gzuncompress($strServerOutput);
			if (SubStr($strServerOutput, 0, StrLen("<DATA>")) != "<DATA>")
			{
				CUpdateClientPartner::AddMessage2Log(substr($strServerOutput, 0, 100), "UPSD02");
				$strError_tmp .= "[UPSD02] ".GetMessage("SUPP_PSD_BAD_RESPONSE").". ";
			}
		}
		//CUpdateClientPartner::AddMessage2Log($strServerOutput, "!3!");

		//echo "strServerOutput:<br>".htmlspecialchars($strServerOutput)."<br><br>";

		if (strlen($strError_tmp) <= 0)
		{
//			$arRes = CUpdateClientPartner::xmlize($strServerOutput);

			$objXML = new CUpdatesXML();
			$objXML->LoadString($strServerOutput);
			$arRes = $objXML->GetArray();

			if (!is_array($arRes) || !isset($arRes["DATA"]) || !is_array($arRes["DATA"]))
				$strError_tmp .= "[UPSD03] ".GetMessage("SUPP_PSD_BAD_TRANS").". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			if (isset($arRes["DATA"]["#"]["RESPONSE"]))
			{
				$CRCCode = $arRes["DATA"]["#"]["RESPONSE"][0]["@"]["CRC_CODE"];
				if (StrLen($CRCCode) > 0)
					COption::SetOptionString(US_BASE_MODULE, "crc_code", $CRCCode);
			}
			if (isset($arRes["DATA"]["#"]["CLIENT"]) && isset($arRes["DATA"]["#"]["CLIENT"][0]["@"]["DATE_TO_SOURCE"]))
				COption::SetOptionString(US_BASE_MODULE, "~support_finish_date", $arRes["DATA"]["#"]["CLIENT"][0]["@"]["DATE_TO_SOURCE"]);
			if (isset($arRes["DATA"]["#"]["CLIENT"]) && isset($arRes["DATA"]["#"]["CLIENT"][0]["@"]["MAX_SITES"]))
				COption::SetOptionString("main", "PARAM_MAX_SITES", IntVal($arRes["DATA"]["#"]["CLIENT"][0]["@"]["MAX_SITES"]));
			if (isset($arRes["DATA"]["#"]["CLIENT"]) && isset($arRes["DATA"]["#"]["CLIENT"][0]["@"]["MAX_USERS"]))
				COption::SetOptionString("main", "PARAM_MAX_USERS", IntVal($arRes["DATA"]["#"]["CLIENT"][0]["@"]["MAX_USERS"]));
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUPSD");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}

	/** Ñîáèðàåò èç ìàññèâà ìîäóëåé ñòðîêó çàïðîñà **/
//	function ModulesArray2Query($arClientModules, $pref = "bitm_")
//	{
//		$strRes = "";
//		if (is_array($arClientModules))
//		{
//			foreach ($arClientModules as $key => $value)
//			{
//				if (strlen($strRes) > 0)
//					$strRes .= "&";

//				$strRes .= $pref.$key."=".urlencode($value);
//			}
//		}

//		return $strRes;
//	}

	/** Ïðîâåðêà íà óñòàíîâêó GZip êîìïðåññèè **/
	function __IsGzipInstalled()
	{
		if (function_exists("gzcompress")) return True;
		return False;
	}

	function __GetFooPath()
	{
		$db = CLang::GetList($by="", $order="", array("ACTIVE" => "Y"));
		$cnt = 0;
		while ($ar = $db->Fetch())
			$cnt++;
		return $cnt;
	}

	/** Ñîáèðàåò êëèåíòñêèå ÿçûêè ñ äàòàìè **/
//	function GetCurrentLanguages(&$strError, $arSelected = false)
//	{
//		/*
//		$arClientLangs = array();

//		$strLangPath = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/lang";

//		$db_res = false;
//		if (class_exists("CLanguage"))
//			$db_res = CLanguage::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));
//		elseif (class_exists("CLang"))
//			$db_res = CLang::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));

//		if ($db_res === false)
//		{
//			CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_WHERE_LANGS"), "UGL00");
//			$strError .= "[UGL00] ".GetMessage("SUPP_GL_WHERE_LANGS").". ";
//		}
//		else
//		{
//			while ($ar_res = $db_res->Fetch())
//			{
//				if ($arSelected === false || is_array($arSelected) && in_array($ar_res["LID"], $arSelected))
//				{
//					$strLangDate = "";
//					if (file_exists($strLangPath."/".$ar_res["LID"]) && file_exists($strLangPath."/".$ar_res["LID"]."/supd_lang_date.dat"))
//					{
//						$strLangDate = file_get_contents($strLangPath."/".$ar_res["LID"]."/supd_lang_date.dat");
//						$strLangDate = preg_replace("/[\D]+/", "", $strLangDate);

//						if (strlen($strLangDate) != 8)
//						{
//							CUpdateClientPartner::AddMessage2Log(str_replace("#LANG#", $ar_res["LID"], GetMessage("SUPP_GL_ERR_DLANG")), "UGL01");
//							$strError .= "[UGL01] ".str_replace("#LANG#", $ar_res["LID"], GetMessage("SUPP_GL_ERR_DLANG")).". ";
//							$strLangDate = "";
//						}
//					}

//					$arClientLangs[$ar_res["LID"]] = $strLangDate;
//				}
//			}

//			if ($arSelected === false && count($arClientLangs) <= 0)
//			{
//				CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_NO_SITE_LANGS"), "UGL02");
//				$strError .= "[UGL02] ".GetMessage("SUPP_GL_NO_SITE_LANGS").". ";
//			}
//		}

//		return $arClientLangs;
//		*/
//		$arClientLangs = array();

//		$strLangPath = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/modules/main/lang";

//		$handle = @opendir($strLangPath);
//		if ($handle)
//		{
//			while (false !== ($dir = readdir($handle)))
//			{
//				if (is_dir($strLangPath."/".$dir) && $dir!="." && $dir!="..")
//				{
//					if ($arSelected===false || is_array($arSelected) && in_array($dir, $arSelected))
//					{
//						$strLangDate = "";
//						if (file_exists($strLangPath."/".$dir."/supd_lang_date.dat"))
//						{
//							$strLangDate = file_get_contents($strLangPath."/".$dir."/supd_lang_date.dat");
//							$strLangDate = preg_replace("/[\D]+/", "", $strLangDate);

//							if (strlen($strLangDate) != 8)
//							{
//								CUpdateClientPartner::AddMessage2Log(str_replace("#LANG#", $dir, GetMessage("SUPP_GL_ERR_DLANG")), "UGL01");
//								$strError .= "[UGL01] ".str_replace("#LANG#", $dir, GetMessage("SUPP_GL_ERR_DLANG")).". ";
//								$strLangDate = "";
//							}
//						}

//						$arClientLangs[$dir] = $strLangDate;
//					}
//				}
//			}
//			closedir($handle);
//		}

//		$db_res = false;
//		if (class_exists("CLanguage"))
//			$db_res = CLanguage::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));
//		elseif (class_exists("CLang"))
//			$db_res = CLang::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));

//		if ($db_res===false)
//		{
//			CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_WHERE_LANGS"), "UGL00");
//			$strError .= "[UGL00] ".GetMessage("SUPP_GL_WHERE_LANGS").". ";
//		}
//		else
//		{
//			while ($ar_res = $db_res->Fetch())
//			{
//				if ($arSelected===false || is_array($arSelected) && in_array($ar_res["LID"], $arSelected))
//				{
//					if (!array_key_exists($ar_res["LID"], $arClientLangs))
//					{
//						$arClientLangs[$ar_res["LID"]] = "";
//					}
//				}
//			}

//			if ($arSelected===false && count($arClientLangs)<=0)
//			{
//				CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_NO_SITE_LANGS"), "UGL02");
//				$strError .= "[UGL02] ".GetMessage("SUPP_GL_NO_SITE_LANGS").". ";
//			}
//		}

//		return $arClientLangs;
//	}

	function __GetFooPath1($v = 0)
	{
		$q = "SELECT COUNT(ID) as C FROM b_user WHERE ACTIVE = 'Y' AND LAST_LOGIN IS NOT NULL";
		if ($v == 0)
			$q = "SELECT COUNT(U.ID) as C FROM b_user U WHERE U.ACTIVE = 'Y' AND U.LAST_LOGIN IS NOT NULL AND EXISTS(SELECT 'x' FROM b_utm_user UF, b_user_field F WHERE F.ENTITY_ID = 'USER' AND F.FIELD_NAME = 'UF_DEPARTMENT' AND UF.FIELD_ID = F.ID AND UF.VALUE_ID = U.ID AND UF.VALUE_INT IS NOT NULL AND UF.VALUE_INT <> 0)";
		$dbRes = $GLOBALS["DB"]->Query($q, true);
		if ($dbRes && ($arRes = $dbRes->Fetch()))
			return $arRes["C"];
		else
			return 0;
	}

	/** Ñîáèðàåò êëèåíòñêèå help'û ñ äàòàìè **/
//	function GetCurrentHelps(&$strError, $arSelected = false)
//	{
//		$arClientHelps = array();

//		$strHelpPath = $_SERVER["DOCUMENT_ROOT"].US_SHARED_KERNEL_PATH."/help";

//		$handle = @opendir($strHelpPath);
//		if ($handle)
//		{
//			while (false !== ($dir = readdir($handle)))
//			{
//				if (is_dir($strHelpPath."/".$dir) && $dir!="." && $dir!="..")
//				{
//					if ($arSelected===false || is_array($arSelected) && in_array($dir, $arSelected))
//					{
//						$strHelpDate = "";
//						if (file_exists($strHelpPath."/".$dir."/supd_lang_date.dat"))
//						{
//							$strHelpDate = file_get_contents($strHelpPath."/".$dir."/supd_lang_date.dat");
//							$strHelpDate = preg_replace("/[\D]+/", "", $strHelpDate);

//							if (strlen($strHelpDate)!=8)
//							{
//								CUpdateClientPartner::AddMessage2Log(str_replace("#HELP#", $dir, GetMessage("SUPP_GH_ERR_DHELP")), "UGH01");
//								$strError .= "[UGH01] ".str_replace("#HELP#", $dir, GetMessage("SUPP_GH_ERR_DHELP")).". ";
//								$strHelpDate = "";
//							}
//						}

//						$arClientHelps[$dir] = $strHelpDate;
//					}
//				}
//			}
//			closedir($handle);
//		}

//		$db_res = false;
//		if (class_exists("CLanguage"))
//			$db_res = CLanguage::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));
//		elseif (class_exists("CLang"))
//			$db_res = CLang::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>"Y"));

//		if ($db_res===false)
//		{
//			CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_WHERE_LANGS"), "UGH00");
//			$strError .= "[UGH00] ".GetMessage("SUPP_GL_WHERE_LANGS").". ";
//		}
//		else
//		{
//			while ($ar_res = $db_res->Fetch())
//			{
//				if ($arSelected===false || is_array($arSelected) && in_array($ar_res["LID"], $arSelected))
//				{
//					if (!array_key_exists($ar_res["LID"], $arClientHelps))
//					{
//						$arClientHelps[$ar_res["LID"]] = "";
//					}
//				}
//			}

//			if ($arSelected===false && count($arClientHelps)<=0)
//			{
//				CUpdateClientPartner::AddMessage2Log(GetMessage("SUPP_GL_NO_SITE_LANGS"), "UGH02");
//				$strError .= "[UGH02] ".GetMessage("SUPP_GL_NO_SITE_LANGS").". ";
//			}
//		}

//		return $arClientHelps;
//	}

	/** Ñîçäàíèå ïóòÿ, åñëè åãî íåò, è óñòàíîâêà ïðàâ ïèñàòü **/
	function __CheckDirPath($path, $bPermission = true)
	{
		$badDirs = Array();
		$path = str_replace("\\", "/", $path);
		$path = str_replace("//", "/", $path);

		if ($path[strlen($path)-1] != "/") //îòðåæåì èìÿ ôàéëà
		{
			$p = CUpdateClientPartner::__bxstrrpos($path, "/");
			$path = substr($path, 0, $p);
		}

		while (strlen($path)>1 && $path[strlen($path)-1]=="/") //îòðåæåì / â êîíöå, åñëè åñòü
			$path = substr($path, 0, strlen($path)-1);

		$p = CUpdateClientPartner::__bxstrrpos($path, "/");
		while ($p > 0)
		{
			if (file_exists($path) && is_dir($path))
			{
				if ($bPermission)
				{
					if (!is_writable($path))
						@chmod($path, BX_DIR_PERMISSIONS);
				}
				break;
			}
			$badDirs[] = substr($path, $p+1);
			$path = substr($path, 0, $p);
			$p = CUpdateClientPartner::__bxstrrpos($path, "/");
		}

		for ($i = count($badDirs)-1; $i>=0; $i--)
		{
			$path = $path."/".$badDirs[$i];
			@mkdir($path, BX_DIR_PERMISSIONS);
		}
	}


	/** Ðåêóðñèâíîå êîïèðîâàíèå èç $path_from â $path_to **/
	function __CopyDirFiles($path_from, $path_to, &$strError, $bSkipUpdater = True)
	{
		$strError_tmp = "";

		while (strlen($path_from) > 1 && $path_from[strlen($path_from)-1] == "/")
			$path_from = substr($path_from, 0, strlen($path_from)-1);

		while (strlen($path_to) > 1 && $path_to[strlen($path_to)-1] == "/")
			$path_to = substr($path_to, 0, strlen($path_to)-1);

		if (strpos($path_to."/", $path_from."/") === 0)
			$strError_tmp .= "[UCDF01] ".GetMessage("SUPP_CDF_SELF_COPY").". ";

		if (strlen($strError_tmp) <= 0)
		{
			if (!file_exists($path_from))
				$strError_tmp .= "[UCDF02] ".str_replace("#FILE#", $path_from, GetMessage("SUPP_CDF_NO_PATH")).". ";
		}

		if (strlen($strError_tmp) <= 0)
		{
			$strongUpdateCheck = COption::GetOptionString("main", "strong_update_check", "Y");

			if (is_dir($path_from))
			{
				CUpdateClientPartner::__CheckDirPath($path_to."/");

				if (!file_exists($path_to) || !is_dir($path_to))
					$strError_tmp .= "[UCDF03] ".str_replace("#FILE#", $path_to, GetMessage("SUPP_CDF_CANT_CREATE")).". ";
				elseif (!is_writable($path_to))
					$strError_tmp .= "[UCDF04] ".str_replace("#FILE#", $path_to, GetMessage("SUPP_CDF_CANT_WRITE")).". ";

				if (strlen($strError_tmp) <= 0)
				{
					if ($handle = @opendir($path_from))
					{
						while (($file = readdir($handle)) !== false)
						{
							if ($file == "." || $file == "..")
								continue;

							if ($bSkipUpdater && substr($file, 0, strlen("updater")) == "updater")
								continue;

							if (is_dir($path_from."/".$file))
							{
								CUpdateClientPartner::__CopyDirFiles($path_from."/".$file, $path_to."/".$file, $strError_tmp);
							}
							elseif (is_file($path_from."/".$file))
							{
								if (file_exists($path_to."/".$file) && !is_writable($path_to."/".$file))
								{
									$strError_tmp .= "[UCDF05] ".str_replace("#FILE#", $path_to."/".$file, GetMessage("SUPP_CDF_CANT_FILE")).". ";
								}
								else
								{
									if ($strongUpdateCheck == "Y")
										$crc32_old = dechex(crc32(file_get_contents($path_from."/".$file)));

									@copy($path_from."/".$file, $path_to."/".$file);
									@chmod($path_to."/".$file, BX_FILE_PERMISSIONS);

									if ($strongUpdateCheck == "Y")
									{
										$crc32_new = dechex(crc32(file_get_contents($path_to."/".$file)));
										if ($crc32_new != $crc32_old)
										{
											$strError_tmp .= "[UCDF061] ".str_replace("#FILE#", $path_to."/".$file, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
										}
									}
								}
							}
						}
						@closedir($handle);
					}
				}
			}
			else
			{
				$p = CUpdateClientPartner::__bxstrrpos($path_to, "/");
				$path_to_dir = substr($path_to, 0, $p);
				CUpdateClientPartner::__CheckDirPath($path_to_dir."/");

				if (!file_exists($path_to_dir) || !is_dir($path_to_dir))
					$strError_tmp .= "[UCDF06] ".str_replace("#FILE#", $path_to_dir, GetMessage("SUPP_CDF_CANT_FOLDER")).". ";
				elseif (!is_writable($path_to_dir))
					$strError_tmp .= "[UCDF07] ".str_replace("#FILE#", $path_to_dir, GetMessage("SUPP_CDF_CANT_FOLDER_WR")).". ";

				if (strlen($strError_tmp) <= 0)
				{
					if ($strongUpdateCheck == "Y")
						$crc32_old = dechex(crc32(file_get_contents($path_from)));

					@copy($path_from, $path_to);
					@chmod($path_to, BX_FILE_PERMISSIONS);

					if ($strongUpdateCheck == "Y")
					{
						$crc32_new = dechex(crc32(file_get_contents($path_to)));
						if ($crc32_new != $crc32_old)
						{
							$strError_tmp .= "[UCDF0611] ".str_replace("#FILE#", $path_to, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
						}
					}
				}
			}
		}

		if (strlen($strError_tmp) > 0)
		{
			CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUCDF");
			$strError .= $strError_tmp;
			return False;
		}
		else
			return True;
	}


	/** Ðåêóðñèâíîå óäàëåíèå $path **/
	function __DeleteDirFilesEx($path)
	{
		if (!file_exists($path))
			return False;

		if (is_file($path))
		{
			@unlink($path);
			return True;
		}

		if ($handle = @opendir($path))
		{
			while (($file = readdir($handle)) !== false)
			{
				if ($file == "." || $file == "..") continue;

				if (is_dir($path."/".$file))
				{
					CUpdateClientPartner::__DeleteDirFilesEx($path."/".$file);
				}
				else
				{
					@unlink($path."/".$file);
				}
			}
		}
		@closedir($handle);
		@rmdir($path);
		return True;
	}

	function __bxstrrpos($haystack, $needle)
	{
		$index = strpos(strrev($haystack), strrev($needle));
		if($index === false)
			return false;
		$index = strlen($haystack) - strlen($needle) - $index;
		return $index;
	}

	/** Âîçâðàùàåò ýêçåìïëÿð êëàññà-èíñòàëÿòîðà ìîäóëÿ ïî àáñîëþòíîìó ïóòè $path **/
	function __GetModuleInfo($path)
	{
		$arModuleVersion = array();
//		include($path."/install/version.php");
//		if (is_array($arModuleVersion) && array_key_exists("VERSION", $arModuleVersion))
//			return $arModuleVersion;

		include_once($path."/install/index.php");

		$arr = explode("/", $path);
		$i = array_search("modules", $arr);
		$class_name = $arr[$i+1];

		$class_name = str_replace(".", "_", $class_name);
		$cls = new $class_name;

		return array(
			"VERSION" => $cls->MODULE_VERSION,
			"VERSION_DATE" => $cls->MODULE_VERSION_DATE,
			"IS_DEMO" => ((defined($class_name."_DEMO") && constant($class_name."_DEMO")) ? "Y" : "N")
		);
	}

	function __GetMicroTime()
	{
		list($usec, $sec) = explode(" ", microtime());
		return ((float)$usec + (float)$sec);
	}
}

?>