Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> Поезд Одесса - Сталинград | Odesskiy Listok

Поезд Одесса - Сталинград

| |

Сыну и внуку Андрею

Пролог. Одесса

Десятого июля в Одессе светает рано, еще нет пяти утра. Первый луч солнца скользит от Приморского бульвара по зеленым шапкам платанов и акаций Пушкинской улицы вдоль старорежимных особняков, пересекая сбегающие к морю справа налево улицы: знаменитую Дерибасовскую, улицу Жуковского, куда меня водили в детский сад, и, наконец, достигает перекрестка с улицей Бебеля, на которой мы поселились перед войной в доме номер двенадцать.
Пока Одессе не был знаком вой сирен воздушной тревоги, я никогда не просыпался с рассветом, – временем самых крепких и завораживающих снов! Но к этому утру тысяча девятьсот сорок первого года, в свои шесть с половиной лет, я уже успел приобрести опыт круглосуточных рывков с нашего четвертого этажа во двор, в подвальное бомбоубежище. Там, в тускло освещаемом скучном подземелье, дети досыпали недобранное, а взрослые, главным образом женщины и старики, бессонно вслушивались в хлопки разрывов зенитных снарядов и ждали сигнала отбоя.
И вот – начало рассвета, налета нет, тишина, очень хочется спать, а тут: – Сыночек, проснись! С трудом разлепляю веки. Надо мной, словно кристаллизуясь из бледного рассветного воздуха, склонилась мама. Глаза ее подозрительно блестят. Нет, это не сон.
- Вставай, мы эвакуируемся, нас ждет поезд. Я уже знаю, о чем идет речь. Многие наши знакомые – женщины, мальчики и девочки – исчезли из поля моего зрения, растворились в степных и морских просторах, за которыми располагалась таинственная эвакуация.
Мама терпеливо и сочувственно помогает мне одеться. Напротив меня – сестренка, ей почти полтора годика отроду. Она уже одета, озабоченно морщит лобик и молча просится на ручки… Помню как мы вскарабкались в полутемный товарный вагон, теплушку, оборудованную двухъярусными нарами. Наши места – наверху, возле маленького окошка.
Было объявлено, что поезд пойдет до Сталинграда, который считался глубоким и надежным тылом.
Папа нас провожал. Он оставался в Одессе как ответственный работник радиокомитета. Папа был спокоен и успокаивал маму: мол, расстаемся ненадолго. Вообще, уныния и паники среди отъезжающих не наблюдалось, слышались оптимистические возгласы: – Скоро вернемся, мы даже теплых вещей не взяли, к осени будем дома… Последний прогноз, кажется, был высказан мамой. Через несколько минут ей предстояло стать одинокой женщиной с двумя малолетними детьми.
Правда, не совсем одинокой. Вместе с нами отправлялась в путь сестра папы Роза. Ей за сорок, она никогда не была замужем и много лет работала рабочей на конфетной фабрике. Сухая, подвижная и преданная родственникам тетя Роза относилась к типу людей, внешне лишенных возраста. Ей всегда было где-то около сорока. Кроме Розы, у папы было еще две замужних сестры: Соня Орлович и Лиза Столяр, каждая имела по сыну. Обе сестры пока оставались в Одессе.
Несколько слов о моих родителях. Мама – довольно полная (по одесским меркам – «то, шо надо») двадцатидевятилетняя кареглазая женщина, по паспорту – Белла Хаскелевна (в советском «просторечии» – Ефимовна) Пох. Перед эвакуацией работала научным сотрудником Одесского музея русского и украинского искусств. Папа – среднего роста, не толстый, не худой, чуть лысеющий со лба, тридцатичетырехлетний, голубоглазый (и сестра в него, а я цветом глаз пошел в маму). Официально папа – Лазарь Яковлевич Райзман, для друзей и близких – просто Леня. На момент нашего отъезда папа работал ответственным редактором «Последних известий» и заместителем председателя Одесского радиокомитета. Предлагаемые вниманию читателей воспоминания включают записи, сделанные мамой, и письма родителей военных лет. Поэтому и папа, и мама являются полноправными соавторами настоящих записок.

Глава 1. Дорога от Одессы до Армавира

Эшелон двигался на восток, останавливаясь, буквально, через каждые пять километров. В нашу теплушку вместилось полсотни пассажиров. Было жарко. На частых стоянках люди выбирались наружу, торопливо вдыхали душистый степной воздух и всматривались из-под ладоней в восточный край неба. Однажды мама узнала в седоголовом человеке, одиноко стоявшем на краю насыпи, Петра Столярского, профессора Одесской консерватории. Мама показала его мне и объяснила, что у Столярского учился Давид Ойстрах. В его школе учились и другие знаменитые музыканты.
На третий день пути за дверьми нашего состава проползла станция Березовка, до которой в мирное время добирались пригородным поездом за четыре часа. Начались воздушные тревоги, сопровождаемые зловещими гудками тормозящих паровозов. Многие женщины в страхе выскакивали из вагонов и, прижав к себе детей, бежали в пшеницу, кусты и под редкие в степи деревья. Мама оставалась в вагоне, как наседка, подбирала детей под себя и молча лежала на нарах, готовая к любому исходу. «Если попадем под бомбу, – думала она, – то уж все вместе». И все долгое время нашего пути мама старалась не отходить от нас ни на шаг. А тетя Роза бегала за кипятком, покупала на станциях еду и для нас, и для беспомощных старух и стариков. Ее помощь и поддержка были неоценимы.
Поезд останавливался все чаще, иногда он сутками стоял посреди степи. Рядом не было ни воды, ни уборных, отходить далеко от эшелона было опасно, в любую минуту он мог тронуться с места. В пути нас нагоняли другие, так же медленно продвигавшиеся, составы с беженцами.
Встречались отставшие от своих эшелонов матери, потерявшие детей, и дети, потерянные матерями. Бродили по путям «беспоездные» дедушки и бабушки. Они протягивали руки за подаянием. Нагнали эшелон с беженцами из бессарабского города Бельцы. Эти люди, захваченные врасплох, бежали, в чем были, без верхней одежды, еды и питья. Они несли на руках голодных детей. Мама отдала им все, что могла. Однажды поезд остановился на какой-то станции, где были краны с водой и туалет. Люди мылись, мыли детей, стирали пеленки. Мама встретила у этих источников цивилизации одесских друзей и знакомых из других теплушек нашего состава. Договаривались держаться вместе…
Наступила седьмая ночь эвакуации, поезд приближался к Запорожью. Немцы бомбили город и окрестности. Паровозы непрерывно гудели, вокруг горели дома, было светло от пожаров и осветительных ракет. Люди из вагонов убегали в степь, многие попали под бомбы и не вернулись. Мама оставалась на вагонных нарах, прижав сестру и меня к себе. Мы заболели. У сестренки был коклюш, она заходилась в кашле. Я молча температурил. Во время воздушной тревоги теплушка пустела, дышать становилось легче. Надышавшись чистого воздуха, мы уснули и проспали всю эту бомбежку.
Когда проснулись, солнце стояло высоко, в природе было тихо, но зато шумели пассажиры. Оказалось, перед отправлением состава, когда люди спали, последние четыре вагона, включая наш, были отцеплены, и состав укатил, оставив около двух сотен беженцев на огромной абсолютно безлюдной станции. Вдали, кроме разрушенных бомбами зданий, ничего вселяющего надежду не наблюдалось.
А ведь рано или поздно здесь могут появиться немецкие танки. Решили ловить проходящие поезда и упрашивать машинистов прицепить и увезти подальше от войны наши беспризорные теплушки. Однако в этот день и в последовавшую за ним ночь ни одного паровоза или поезда так и не дождались. Наступил новый день, и опять – те же зловещие пустота и безмолвие. Наконец, ближе к вечеру послышался гудок паровоза, он тянул за собой состав, груженный громоздким оборудованием.
Машинист остановил поезд, к паровозу подбежали люди из наших вагонов. После недолгих переговоров теплушки начали прицеплять к эшелону. Оказалось, что все дороги уже в руках немцев, и больше ждать помощи неоткуда… С новым поездом покатили быстрее, чем в начале пути. Проехали Донбасс, вот и Украина уже позади, миновали Ростов-на-Дону, поезд идет по Северному Кавказу. Вокруг горы, леса, реки, война где-то далеко. Хорошо, когда просторы родины огромны! Год выдался урожайным, сады ломятся от плодов. А состав мчится все быстрее и быстрее. Яблони, домики, заборчики, мостики через речушки, да и сами речки и канавы, как бы перегоняя друг друга, стремглав бегут на запад. Куда они, там же немцы! А мы катим почти без остановок, продукты на исходе, купить их на станциях люди не успевают, выпита вся вода, у многих понос, у стариков даже кровавый.


Наконец, когда состав остановился на станции Армавир, единогласно решили остаться здесь до лучших времен. Выгрузились почти мгновенно – минут за десять. За время пути из массы выдвинулись женщины-лидеры, они и вершили судьбы беженского коллектива. Мама была в их числе (но только, когда нас не бомбили). Паровоз попрощался с нами длинным гудком и потащил свою железную поклажу дальше – на Урал или в Сибирь. Перрон станции Армавир был завален беженцами с их нехитрым скарбом. Активистки договорились с горсоветом о размещении людей. Нашу семью, включая тетю, подселили в домик школьной учительницы, сын которой был на фронте. Мама начала хлопотать об устройстве на работу, взятые из дома деньги подходили к концу. При домике учительницы имелся зеленый дворик, рядом располагался недорогой рынок. Купили примус. Жизнь входила в мирную, хоть и шаткую, колею. Мы с сестрой поправились и дни напролет безмятежно возились во дворе.
Одесса была в осаде, и письма оттуда не приходили. Мама писала папе каждый день, но, увы, безответно. С нашей «легкой руки» в Армавир потянулись новые партии одесских беженцев. Появлялись знакомые, они передавали приветы от папы, и мама немного успокоилась. А через три недели после нашего приезда в Армавир прибыли замужние сестры папы: старшая Соня Орлович с мужем Осипом (их семнадцатилетний сын Изя был курсантом в военном училище) и младшая Лиза Столяр с четырехлетним сыном Яшей. Муж Лизы Израиль был призван в армию в первые дни войны и бесследно исчез; ни единой весточки от него так и не пришло. Папины сестры привезли маме зимнее пальто и пятьсот рублей на жизнь. Говорили, что Одессу, скорее всего, сдадут немцам.
Мама начала работать в местной школе учителем истории.
В октябре 1941 года через 96 дней с начала войны и после 72 дней обороны города Красная Армия оставила Одессу. В день сдачи родного города в Армавир приехал папа. Одесский радиокомитет эвакуировали в последний момент. При встрече оба моих родителя плакали. На следующий день после прибытия папа пришел в горвоенкомат Армавира и подал заявление о зачислении в ряды Красной Армии, несмотря на то, что был «белобилетником» по зрению. Через несколько дней папу аттестовали как политрука, и он стал ждать отправки на полуторамесячные курсы усовершенствования политсостава (КУПС).
Моя память сохранила широкую пыльную улицу, на которой стоял наш дом. По улице можно было, загребая босыми ногами обильную теплую пыль, добрести до деревянного моста через широкую мощную Кубань, вода в которой была почти такого же цвета, как уличная пыль, может быть чуточку темнее. За Кубанью что-то такое зеленело, а дальше за этим зеленым пространством то ли толпились холмы, то ли громоздились горы, точно не помню. А иногда по ночам наша пыльная улица озарялась грозовыми молниями, такими ослепительно яркими, каких я в Одессе никогда не видел (наверное, там их скрывали высокие городские дома). А потом томительно долго со сладким ужасом я ждал медленно наплывающего, сначала еле слышного, а в конце оглушительного грома.
В эти дни немцы заняли Ростов-на-Дону и начали бомбить Армавир. На пустыре вблизи нашего домика была вырыта щель – укрытие в виде траншеи, накрытой жердями, на которые насыпали землю. Вместе с другими детьми мы забирались в этот подземный ход, подгоняемые знакомой сиреной воздушной тревоги. Взрослые обычно щелью пренебрегали. Из-за Кубани доносилась слабая, как отдаленный грозовой гром, но почти непрерывная канонада. Папа настоял на нашей новой эвакуации. Он хотел, чтобы мы уехали до его отправки на курсы.
От Армавира до Ташкента

На этот раз мы ехали вшестером: мама с двумя детьми, тетя Лиза с Яшей и тетя Роза. Чета Орловичей, Осип и Соня, решили остаться – будь что будет. Вечером второго ноября сорок первого года мы погрузилась на открытую платформу товарного поезда. В вагоны, даже теплушки, попасть не было никакой возможности, беженцы валом шли на восток. Во время посадки три раза объявляли воздушную тревогу. В городе было разрушено несколько зданий. На соседней платформе стояла расчехленная зенитка, ее ствол был нацелен на солнце, склонявшееся к закату.
Папа и его сестра Соня стояли высоко над нами на пешеходном мосту, перекинутом через станционные рельсовые пути. Папа не отрываясь смотрел вниз, на нас, а мама не сводила глаз с моста. К провожающим подошел человек в форме, на его плече висела на ремне винтовка, на мосту останавливаться не разрешалось. Папа показал на нас рукой подошедшему, видимо объяснил ситуацию. Охранник недолго постоял рядом с папой, а потом ушел, не хотел мешать последнему расставанию.
Было уже темно, когда состав тронулся. Папа на мосту был еле различим. Он проплыл над нами, как будто отправился в полет куда-то далеко в ночное небо. Мама даже не видела, как он махал нам рукой. Наверное, он тоже не видел маминых рук. Моросил дождик, дети лежали, а взрослые сидели под зонтиками.
Поезд часто останавливался. Наконец, рассвело, Дождь прекратился, мы нежились в солнечных лучах. На границе Краснодарского края и Ставрополья вблизи станции с ласковым названием Овечка над нами стал кружить самолет с хорошо различимыми крестами на крыльях. Немец! Впереди, но, к счастью, в стороне от железнодорожной колеи упала бомба. Высоко взлетела черная земля. Поезд остановился, перепуганные люди начали спрыгивать и сползать с платформ и из теплушек, они несли на руках или тащили за собой детей и пытались укрыться с ними в мелком кустарнике и еще мокрой высокой траве. Самолет с оглушительным ревом пронесся над ними, стрекоча пулеметом. Потом он возвратился и снова стрелял по бегущим и ползущим в панике людям, потом еще и еще.
Женщины, дети, старики падали, оставались лежать, некоторые кричали, звали на помощь. А потом немец улетел на север. Мы все это время оставались на своей платформе. Мама прикрыла собой нас с сестричкой, а тетя Лиза – Яшу. Когда самолет убрался, мама и еще нескольких женщин побежали за помощью на станцию, находившуюся в полукилометре от поезда. В нашем составе, разумеется, не было никаких медикаментов, а тем более медиков. Трупы расстрелянных одиннадцати женщин и шестерых детей похоронили в общей братской могиле. Раненых подвезли на поезде к станции и отправили в больницу.
Ночью состав продолжил путь. Немцы бомбили нас еще раз, но обошлось без жертв и повреждений. Дождь, отставший от поезда в Армавире, нагнал нас на третий день и затем лил непрерывно. Детей укрывали, как могли, взрослые были обречены мокнуть и мерзнуть. Вода и продукты были на исходе. Наконец на девятый день поезд остановился в трех километрах от столицы Дагестана Махачкалы.
Дальше пути были забиты эшелонами. Люди выгрузились, дети идти не могли, а взрослые так ослабли, чтобы были не в состоянии тащить на себе и малышей, и пожитки. Пришлось семьям объединяться и совместно нанимать телеги для переезда в город. В эту позднюю осень сорок первого года Махачкала была последним перевалочным пунктом на пути беженцев в Среднюю Азию. Полураздетые, обездоленные и голодные женщины, дети и старики стремились в теплые края на другой, восточный берег Каспия. Пароходов не хватало. Тысячи людей запрудили улицы, многие просили милостыню. Местные магазины блистали пустыми полками. Те, кто был в состоянии, подавались за продуктами в горные аулы. Изможденные люди толпились у солдатской столовой, предлагали в обмен на еду последнюю одежду.
Проникнуть в порт поближе к редким пароходам не было никакой возможности, дрались за каждый клочок земли, примыкающий к причалам. В городе вспыхнули эпидемии гриппа, кори, даже сыпного тифа. Особенно было много больных детей. Случайно мама узнала, что этой ночью уходит пароход на Астрахань. «Куда угодно, – решили взрослые, – только выбраться поскорей из этого ада!» Два местных дагестанских парня за двести рублей провезли на телеге нас с вещами в порт, к воротам причала, с которого предполагалась посадка на астраханский рейс. Вдоль ворот протянулись железнодорожные пути, а между ними и прямо на них сидели и лежали тысячи беженцев с детьми и тюками. Паровозы, маневрируя, выпускали пар, окутывавший людей, и гудели, требуя очистить рельсы. Из клубов пара, как тюлени из моря, молча выныривали согнувшиеся под поклажей фигуры в старых пальто, платках или лохмотьях и протискивались сквозь толпу в поисках хоть какого-нибудь временного клочка незанятой земли.
Однажды при тусклом свете занимавшейся сквозь плотные облака зари, мы увидели вблизи на рельсах труп старика, которого родные не успели ночью перетащить на другие, пока свободные пути. Машинист, наверное, тоже не заметил тело беспомощного человека, который даже не успел крикнуть.
За кошмарной ночью последовал мучительный, полный неопределенности день. Наконец, ближе к вечеру заветные ворота со скрипом отворились. Началась невообразимая давка. Крики о помощи, стоны сменяли друг друга. Наша семья – мама впереди с сестрой на руках, мы с Яшей в середине, а сзади с вещами тети Лиза и Роза – буквально проломилась сквозь людское месиво на палубу небольшого пароходика «Алтай». Все внутренние помещения судна были каким-то образом заполнены людьми еще до начала посадки. Мы разместились на палубе и были счастливы: на «Алтае» имелся кипяток, а на детей выдавали суп!
Даже разыгравшийся каспийский шторм не поверг нас в уныние. Нас – я имею в виду себя и маму. Мы, по-моему, единственные из всех пассажиров хорошо переносили качку. Народ с палубы втиснулся, как смог, во внутреннее пространство корабля, а мы вдвоем с любопытством вглядывались в хорошо различимые высокие песчаные берега, на которые с плеском карабкались языки волн бутылочного цвета. Приближаясь к Астрахани, «Алтай» вошел в устье Волги. Шторм прекратился.
Астрахань встретила неприветливо. Пристань номер семнадцать была буквально завалена людьми. Было холодно и мокро, – ноябрь не июнь. Двое суток ночевали на улице. Нас, детей, укрыли, чем попало, а взрослые, чтобы окончательно не окоченеть, ходили по кругу ночи напролет. На третий день удалось забраться в пакгауз – огромный сарай, предназначенный для хранения пароходных грузов. Мы радовались крыше над головой. В пакгаузе детей переодели, как могли, помыли, накормили. Я помню, как выщипывали из одежды и давили пальцами серовато-прозрачных шустрых вшей, коих было неисчислимое количество. Здесь легче дожидаться обещанного рейса на Гурьев или Ульяновск, из которых мы рассчитывали пробиться к ленинградским родичам, эвакуированным на Урал. Однако вскоре стало известно, что Волга выше Саратова и река Урал, в устье которой находился Гурьев, «встали», покрылись льдом, началась зима, пароходы не ходили.
Неожиданно объявили посадку на Гурьев. Туда собирался прорваться грузовой пароход «Карл Маркс», борта которого снаружи были покрыты зловещей черной краской. С трудом втиснулись в душный нижний трюм. Повсюду была невероятная давка, вместо расчетных шестисот пассажиров на «Карл Маркс» посадили две тысячи. Взрослые сидели, тесно прижавшись друг к другу, детей держали на руках. Из еды имелись только сушеная рыба да сухари… Двое суток пароход не отходил от пристани. Поскольку духота в трюме была «теплой», детей раздели, били вшей, которые плодились с огромной скоростью. К концу вторых суток неподвижности было объявлено, что Урал замерз и пароход пойдет в Красноводск, расположенный на противоположном восточном берегу Каспия. Наконец-то мы отчалили! В трюме начали умирать люди. Их трупы долго не убирали. Мама ходила к капитану, просила отделить мертвых от живых. Возвращаться с палубы в трупную зловонную духоту трюма было мучительно. Снаружи прямо под ухом вдоль бортов скрежетали льдины. Начался шторм, людей укачивало, их рвало.
На пятый день пути в трюме погас свет. Каждые сутки умирало семь-восемь человек. Среди детей свирепствовала корь. Мертвые валялись вперемежку с живыми, качка не утихала. Матери не отдавали мертвых детей, везли их с собой, чтобы похоронить в земле. Через восемь дней после отплытия из Астрахани девятнадцатого ноября «Карл Маркс» пришвартовался в Красноводске.

[Продолжение следует]

Отправить новый комментарий

Содержимое этого поля хранится скрыто и не будет показываться публично.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <tr> <td> <table>
  • Строки и параграфы переносятся автоматически.
  • Images can be added to this post.
Больше информации о возможностях форматирования