function ParseAnnotations($DocComment)
{
    preg_match_all('/@([a-zA-Z0-9_-]+)\\:(.+)/', $DocComment, $parsed);
    $annotations = array();
    foreach ($parsed[1] as $i => $Name) {
        $annotations[] = '"' . $Name . '": ' . $parsed[2][$i];
    }
    $Json = '{' . implode(',', ObjectCp1251ToUtf8($annotations)) . '}';
    return JsonDecode($Json);
}
function AdminUpdateApply()
{
    global $updates_folder, $autoupdate_to;
    // Распаковываем архив, показываем сообщение, что обновление прошло успешно.
    $update_file = RealPath2($updates_folder . $_GET['file']);
    if (!is_file($update_file)) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл обновления не найден.');
        return;
    }
    $zip = new ZipArchive();
    $zip->open($update_file);
    $metadata = JsonDecode($zip->getFromName('metadata'));
    if (!isset($metadata) || !isset($metadata['product']) || $metadata['product'] != CMS_UPDATE_PRODUCT || !isset($metadata['type']) || $metadata['type'] != 'update' || !isset($metadata['from_version']) || $metadata['from_version'] != CMS_VERSION || !isset($metadata['to_version']) || !isset($metadata['changelog'])) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл не является файлом обновления или не подходит к вашей версии системы.');
        return;
    }
    $errors = array();
    $numFiles = $zip->numFiles;
    for ($i = 0; $i < $numFiles; $i++) {
        $fn = $zip->getNameIndex($i);
        if ($fn == 'metadata') {
            continue;
        }
        if (substr($fn, -1) != '/') {
            // Файл
            $content = $zip->getFromIndex($i);
            if (is_file($fn)) {
                $r = file_put_contents($fn, $content);
                if ($r === false) {
                    $errors[] = 'Не удалось обновить файл ' . $r;
                }
            } else {
                $r = file_put_contents($fn, $content);
                if ($r !== false) {
                    chmod($fn, 0666);
                } else {
                    $errors[] = 'Не удалось создать файл ' . $r;
                }
            }
        } else {
            // Папка
            if (!is_dir($fn)) {
                $r = MkDirRecursive($fn);
                if ($r === false) {
                    $errors[] = 'Не удалось создать папку ' . $r;
                }
            }
        }
    }
    $zip->close();
    if (count($errors) == 0) {
        // Автообновление
        $autoupdate_to = $metadata['to_version'];
        Audit('Обновление системы: Запуск обновления системы до версии ' . $autoupdate_to);
        include 'config/autoupdate.php';
        // Очистка кэша
        System::cache()->ClearAll();
        System::admin()->AddCenterBox('Обновление системы');
        System::admin()->Highlight('Обновление прошло успешно, система обновлена до версии ' . SafeDB($metadata['to_version'], 20, str) . '.');
        Audit('Обновление системы: Успешное завершение обновления, система была обновлена до версии "' . $autoupdate_to . '"');
    } else {
        System::admin()->AddCenterBox('При обновлении произошли ошибки');
        System::admin()->HighlightError(implode("<br>\n", $errors));
    }
}