diff --git a/programs/cmm/eolite/Eolite.c b/programs/cmm/eolite/Eolite.c index d0d9ddacd2..3dd4805015 100644 --- a/programs/cmm/eolite/Eolite.c +++ b/programs/cmm/eolite/Eolite.c @@ -23,88 +23,9 @@ #include "imgs\left_p.txt" #include "imgs\icons.txt" -#ifdef LANG_RUS - ?define T_FILE "” ©«" - ?define T_TYPE "’ЁЇ" - ?define T_SIZE "ђ §¬Ґа" - ?define T_NEW_FOLDER "Ќ®ў п Ї ЇЄ " - ?define T_NEW_FILE "Ќ®ўл© д ©«" - ?define T_DELETE_FILE "‚л ¤Ґ©б⢨⥫쭮 е®вЁвҐ г¤ «Ёвм" - ?define T_YES "„ " - ?define T_NO "ЌҐв" - ?define T_CANCEL "Ћв¬Ґ­ " - ?define T_CREATE "‘®§¤ вм" - ?define T_RENAME "ЏҐаҐЁ¬Ґ­®ў вм" - ?define FS_ITEM_ALREADY_EXISTS "'ќ«Ґ¬Ґ­в б в ЄЁ¬ Ё¬Ґ­Ґ¬ 㦥 бгйҐбвўгҐв' -E" - ?define T_DEL_ERROR_1 "ЋиЁЎЄ . Џ ЇЄ  ­Ґ Їгбв п." - ?define WAIT_DELETING_FOLDER "“¤ «пҐвбп Ї ЇЄ . Џ®¤®¦ЁвҐ..." - ?define NOT_CREATE_FOLDER "ЌҐ г¤ «®бм ᮧ¤ вм Ї ЇЄг." - ?define NOT_CREATE_FILE "ЌҐ г¤ «®бм ᮧ¤ вм д ©«." - ?define T_PASTE_WINDOW_TITLE "Љ®ЇЁаго..." - ?define T_PASTE_WINDOW_TEXT "Љ®ЇЁагҐвбп д ©«:" - ?define T_PASTE_WINDOW_BUTTON "ЏаҐаў вм" - ?define INFO_AFTER_COPY "Љ®ЇЁа®ў ­ЁҐ § ўҐа襭®" - ?define T_CANCEL_PASTE "Љ®ЇЁа®ў ­ЁҐ ЇаҐЄа йҐ­®. Џ ЇЄ  бЄ®ЇЁа®ў ­  ­Ґ Ї®«­®бвмо." - ?define T_SELECT_APP_TO_OPEN_WITH "‚лЎҐаЁвҐ Їа®Ја ¬¬г ¤«п ®вЄалвЁп д ©« " - ?define DEL_MORE_FILES_1 "ўлЎа ­­лҐ н«Ґ¬Ґ­вл (" - ?define DEL_MORE_FILES_2 " ив.)?" -#elif LANG_EST - ?define T_FILE "Fail" - ?define T_TYPE "Tв„–в„–p" - ?define T_SIZE "Suurus" - ?define T_NEW_FOLDER "Uus kataloog" - ?define T_NEW_FILE "Uus fail" - ?define T_DELETE_FILE "Kas sa tahad tС—esti kustutada" - ?define T_YES "Jah" - ?define T_NO "Ei" - ?define T_CANCEL "Cancel" - ?define T_CREATE "Create" - ?define T_RENAME "Rename" - ?define FS_ITEM_ALREADY_EXISTS "'An item with that name already exists' -E" - ?define T_DEL_ERROR_1 "Viga. Kataloog ei ole tв„–hi." - ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." - ?define NOT_CREATE_FOLDER "Kataloogi ei saa luua." - ?define NOT_CREATE_FILE "Faili ei saa luua." - ?define T_PASTE_WINDOW_TITLE "Kopeerin..." - ?define T_PASTE_WINDOW_TEXT "Kopeerin faili:" - ?define T_PASTE_WINDOW_BUTTON "Abort" - ?define INFO_AFTER_COPY "Copy finished" - ?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." - ?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file" - ?define DEL_MORE_FILES_1 "selected items(" - ?define DEL_MORE_FILES_2 " pcs.)?" -#else - ?define T_FILE "File" - ?define T_TYPE "Type" - ?define T_SIZE "Size" - ?define T_NEW_FOLDER "New folder" - ?define T_NEW_FILE "New file" - ?define T_DELETE_FILE "Do you really want to delete" - ?define T_YES "Yes" - ?define T_NO "No" - ?define T_CANCEL "Cancel" - ?define T_CREATE "Create" - ?define T_RENAME "Rename" - ?define FS_ITEM_ALREADY_EXISTS "'An item with that name already exists' -E" - ?define T_DEL_ERROR_1 "Error. Folder isn't empty." - ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." - ?define NOT_CREATE_FOLDER "Folder can not be created." - ?define NOT_CREATE_FILE "File can not be created." - ?define T_PASTE_WINDOW_TITLE "Copying..." - ?define T_PASTE_WINDOW_TEXT "Copying file:" - ?define T_PASTE_WINDOW_BUTTON "Abort" - ?define INFO_AFTER_COPY "Copy finished" - ?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." - ?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file" - ?define DEL_MORE_FILES_1 "selected items(" - ?define DEL_MORE_FILES_2 " pcs.)?" -#endif - enum {ONLY_SHOW, WITH_REDRAW, ONLY_OPEN}; //OpenDir -enum { CREATE_FILE=1, CREATE_FOLDER, RENAME_ITEM }; //NewElement +enum {CREATE_FILE=1, CREATE_FOLDER, RENAME_ITEM }; //NewElement -#define TITLE "Eolite File Manager v3.01 beta" -#define ABOUT_TITLE "Eolite 3.01 beta" dword col_padding, col_selec, col_lpanel; int toolbar_buttons_x[7]={9,46,85,134,167,203}; @@ -117,52 +38,59 @@ word settings_window; dword _not_draw = false; byte menu_call_mouse=0; +byte del_active=0, + new_element_active=0; + llist files; byte list_full_redraw; +dword buf; +dword file_mas[6898]; +int selected_count; + + byte path[4096], file_path[4096], file_name[256], new_element_name[256], - temp[4096]; -byte - del_active=0, - new_element_active=0, - show_dev_name=1, - real_files_names_case=0, - use_big_fonts=0, - font_type, - font_h, - info_after_copy=0, - sort_num=2, + temp[4096], itdir; +//struct t_settings { +byte use_big_fonts=false, + font_type=0x80, + font_h=9, + sort_num=2, + show_dev_name=true, + real_files_names_case=false, + info_after_copy=false, + two_panels=false; +//} settings; + + dword eolite_ini_path; -char scroll_used=0; +char scroll_used=false; dword menu_stak,about_stak,properties_stak,settings_stak,copy_stak; proc_info Form; int mouse_dd, sc_slider_h, sorting_arrow_x, kolibrios_drive; -dword buf; -dword file_mas[6898]; int j, i; int action_buf; int rand_n; -int selected_count; byte CMD_REFRESH; signed x_old, y_old, dif_x, dif_y, adif_x, adif_y; -edit_box edit2 = {250,213,80,0xFFFFCC,0x94AECE,0xFFFFCC,0xFFFFFF,0,248,#file_name,#mouse_dd,64,6,6}; edit_box new_file_ed = {171,213,180,0xFFFFFF,0x94AECE,0xFFFFFF,0xFFFFFF,0,248,#new_element_name,#mouse_dd,100000000000010b,6,0}; PathShow_data PathShow = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, #path, #temp, 0}; PathShow_data FileShow = {0, 56,215, 6, 100, 0, 0, 0x0, 0xFFFfff, #file_name, #temp, 0}; byte cmd_free=0; +#include "include\translations.h" #include "include\copy.h" #include "include\gui.h" #include "include\sorting.h" @@ -177,7 +105,7 @@ byte cmd_free=0; void main() { - word key,key2, id; + word key, key2, id; dword status_key; char can_show, can_select, stats; dword selected_offset; @@ -396,14 +324,8 @@ void main() FnProcess(id-50); break; case 100...120: - DEVICE_MARK: - DrawRectangle(17,id-100*16+74,159,16, 0); //auaaeaiea - strcpy(#path, #disk_list[id-100].Item); - files.KeyHome(); - Open_Dir(#path,WITH_REDRAW); - pause(5); - DrawRectangle(17,id-100*16+74,159,16, 0xFFFFFF); - break; + ClickOnDisk(id-100); + break; } break; //Key pressed----------------------------------------------------------------------------- @@ -413,34 +335,28 @@ void main() $shr eax,16 key2 = AL; status_key = GetStatusKey(); - + if (Form.status_window>2) break; if (del_active) { - if (key==013) Del_File(true); - if (key==027) Del_File(false); + if (key == ASCII_KEY_ENTER) Del_File(true); + if (key == ASCII_KEY_ESC) Del_File(false); break; } if (new_element_active) { - if (key==027) NewElement(0); - if (key==013) NewElement(1); + if (key == ASCII_KEY_ESC) NewElement(0); + if (key == ASCII_KEY_ENTER) NewElement(1); EAX=key<<8; edit_box_key stdcall (#new_file_ed); break; } - if (edit2.flags!=64) && (key!=13) && (key!=27) - { - EAX=key<<8; - edit_box_key stdcall (#edit2); - break; - } if (files.ProcessKey(key)) { List_ReDraw(); break; } - + if (TestBit(status_key, 2)) { switch(key2) @@ -485,25 +401,31 @@ void main() } break; } - + switch (key) { + case 096: + two_panels ^= 1; + draw_window(); + break; case 209...217: - id=key-110; - if (id-100>=disc_num) break; - GOTO DEVICE_MARK; + key -= 210; + if (key; -- в EditBox'ax теперь можно использовать все цифры от 1 до 9 (мечта Атаульпы:); -- если не выделена строка адреса клавиша BackSpace возвращает в предыдущую папку; -- оптимизирована функция IntToStr() за что огромное спасибо diamond'y, она стала - меньше на 158 байт; -- много интересного почерпнуто из либы Nable'а относительно оптимизации функций; -- по совету Albom'a динамическое выделение памяти было заменено статическим, как - последствие - исчезло два известных бага, связанных с копированием файлов и - их переименованием; -- некоторые переменные стали локальными, ещё оптимизации и небольшие багфиксы. - - -02.08.08 -- v0.94.4 beta5 -- 14.0 Кб -- правка трёх небольших багов, оптимизации. - - -28.07.08 -- v0.94.3 beta5 -- 14.1 Кб -- переход по девайсам Ctrl+<цифра>; -- установлен минимальный размер высоты окна; -- иконка папки "вверх"; -- почищен и оптимизирован код. - - -04.07.08 -- v0.94 beta5 -- 13.9 Кб -- исправлен довольно старый баг, если ползунок прокрутки в папке с очень большим - количеством файлов перетянуть вверх до начала списка, программа вылетала. - - -04.07.08 -- v0.93.9 beta5 -- 13.9 Кб -- работает клавиша "Назад" :) -- устранён баг из-за которого папки "." и ".." подвергались сортировке - - -29.06.08 -- v0.93.8 beta5 -- 13.8 Кб -- сортировка файлов по первой букве имени - - -22.06.08 -- v0.93.6 beta5 -- 13.7 Кб -- новый алгоритм сортировки файлов по размеру, более быстрый (вычитал о нём на - Википедии:), в списке появилось 2 досели потеряных файла. - - -18.06.08 -- v0.93.5 beta5 -- 13.7 Кб -- запуск программы с параметрами - например "Eolite /hd1/1/" откроет программу - с папкой /hd1/1/ в ней. Несуществующий путь открыт не будет; -- устранён глюк окна "О программе", когда нажатие на любую клавишу приводило к - его зависанию (уходу в бесконечный цикл); -- иконка и поддержка файлов ".cvs"; -- оптимизации кода. - - -15.06.08 -- v0.93.4 beta5 -- 13.4 Кб -- исправлен баг с тем появления несуществующего файла в /rd/1/; -- теперь rd, fd, hd1 и т.д. всегда в нижнем регистре; -- устранён вылет проги после нажатия кнопки "Up" (спасибо сеса за найденый баг). - - -14.06.08 -- v0.93.3 beta5 -- 13.4 Кб -- теперь заливается белым не весь список, а потом выводится текст, а рисуются - белые полосы с текстом - так немного медленнее, но перерисовка значительно - меньше (спасибо Марио79 за подсказку); -- оптимизирована и исправлена процедура удаления файла; -- F3 - просмотр любого файла в Тайнипаде; -- исправлены баги интерфейса. - - -14.06.08 -- v0.93 beta5 -- 13.6 Кб -- реализована прокрутка скроллом мыши (спасибо diamond'у за отловленный баг); -- немного уменьшена перерисовка окна; -- уменьшен и оптимизирован код программы; -- частично исправлен баг разворачивания окна, если мы были в конце списка; -- теперь при переименовании файла можно использовать все цифры, кроме восьмёрки -- у программы изменился компилятор на более новый и ключи компиляции; -- оптимизирован kolibri.h--. - - -08.06.08 -- v0.92.1 beta5 -- 14.0 Кб -- исправлен баг, когда ползунок не всегда доезжал не до конца полосы прокрутки; -- оптимизации в прокрутке. - - -08.06.08 -- v0.92 beta5 -- 14.0 Кб -- устранён баг, появившейся в версии 0.88. Если вы в конце списка и начнёте - понемногу увеличивать размеры окна, оттягивая его нижний конец вниз, то со - временем программа вылетит; -- реализован алгоритм плавной прокрутки, есть 1 серьёзный и 1 несерьёзный баг. - - -07.06.08 -- v0.91.5 beta4 -- 14.0 Кб -- удалён неиспользуемый с 03.03.08 (v0.83) кусок кода; -- интерфейс полосы прокрутки стал более объёмным, это было сделано не с целью - улучшения дизайна, а с целью уменьшения кода в исходнике :) -- устранён баг открытия первого файла, который проявлялся только в эмуляторе; -- cпасибо diamond'у за исправление ошибки в процедуре складывания двух строк - copystr() и её оптимизацию; -- установлено ограничение на размер имени файла, отображаемого при его удалении; -- если отменили удаление файла, то опять создаются кнопочки под формой; -- устранён старый баг (замеченный недавно) - если в полосе адреса прописали - несуществующий адрес, программу выкидывало; -- уменьшена перерисовка при переходе в другую папку, где файлов меньше, чем - было в текущей; -- исправлена ошибка в функциях lowcase() и upcase(); -- теперь названия файлов и папок начинаются с большой буквы, далее - прописные; -- с папками на NTFS-разделе программа всё ещё работать не умеет, но, по крайней - мере, при попытке войти в какую-то из них она уже не вылетает; -- немного оптимизирована процедура перехода на девайс; -- исправлен баг из-за которого имена файлов иногда оказывались чуть выше чем - надо, относительно иконок; -- уменьшена перерисовка окна; -- другие оптимизации и багфиксы. - - -02.06.08 -- v0.90.4 beta4 -- 14.1 Кб -- оптимизации и багфиксы (в т.ч. спасибо Maxis за найденный баг). - - -01.06.08 -- v0.90 beta4 -- 14.1 Кб -- критически уменьшена перерисовка, в несколько раз! Огромное спасибо diamond - за подсказку. - - -01.06.08 -- v0.88.5 beta3 -- 14.1 Кб -- раньше при переходе из одной папки в другую вся область с файлами - закрашивалась белым цветом, а поверх выводились новые. Вопрос: зачем - закрашивать ВСЮ область, если файлов ней может быть всего 2? Я тоже не - знаю почему я понял это только сейчас. Закрашиваем только эти файлы. -- раньше рисовалась левая синяя панель, а поверх неё окошечки с девайсами - и т.д. Сейчас не так: синяя панель рисуется ВОКРУГ окошечек, что уменьшает - перерисовку. - - -30.05.08 -- v0.88.2 beta3 -- 14.1 Кб -- устранён баг, связанный с клавишами F2 и Home. - - -27.04.08 -- v0.88 beta3 -- 14.1 Кб -- обьединены процедуры открытия файла; -- устранён баг, связанный с переходом из некорневой папки на другой девайс -- динамическое выделение памяти под папки. - - -08.04.08 -- v0.87 beta3 -- 14.0 Кб -- оптимизировано удаление файла; -- удалён продублированный код переименования файла; -- теперь для списка девайсов в левой панели (RАM-диск, жестяки и т.д.) - существует определённый буфер, а не открывается папка "/" каждый раз при - выводе этого списка или же перехода в какой-то из его элементов; -- при перерисовке окна больше не считывается содержимое папки, просто - выводятся данные, что хранятся в буфере; -- посла деактивации окна то, что было напечатано в строке адреса не исчезает; -- упорядочивание файлов по размеру. - - -27.03.08 -- v0.86 beta3 -- 14.4 Кб -- оптимизирован вывод размера файлов; -- убрана лишняя перерисовка при открытии программы; -- оптимизирован переход в начало и в конец списка файлов; -- исправлен баг с потерей одного файла в корневых разделах жестких дисков; -- обьединены процедуры Ctrl+С и Ctrl+X; -- теперь для каждого изображения не своя переменная, а все они собраны по типам - в один файл: toolbar icons, file icons, device icons; -- уменьшено потребление программой ресурсов при выводе иконок файлов; -- и ещё много-много всего отимизировано! - - -09.03.08 -- v0.84 beta2 -- 16.1 Кб -- cделано окно "О программе" (размер за kpack-ованого изображения 2.5 Кб) -- теперь при переименовании файла можно использовать все цифры; -- оптимизировано процедуры открытия папки, копирования, перерисовка полосы - адреса и полосы переименования файла; -- запрос на удаление. - - -07.03.08 -- v0.83.3 beta2 -- 13.0 Кб -- решён глюк, связанный с корневыми папками жёстких дисков. - - -07.03.08 -- v0.83.2 beta2 -- 13.0 Кб -- решён крайне серьёзный баг с пожиранием программой дополнительного количества - памяти каждый раз после перерисовки окна или открытия папки. - - -07.03.08 -- v0.83.1 beta2 -- 13.0 Кб -- решен баг с прокруткой и папками; -- опитимизации. - - -03.03.08 -- v0.83 beta2 -- 13.0 Кб -- цвет окна более тёмный; -- распределение: вначале папки, затем файлы; -- теперь перетягивание ползунка прокрутки работает и в Колибри! -- реализованы быстрые клавиши Ctrl+C (Ctrl+Ins), Ctrl+X, Ctrl+V. Как сделать с - Shift-ом я не знаю; -- новое лого; -- устранён баг с серой линией, отделяющей названия файлов и их тип; -- устранён древний баг, связанный с невозможностью открыть любой файл с первого; - раза, только со второго; -- устранён баг, связанный с длинной имени файла; -- новая иконка текстовых документов. - - -27.02.08 -- v0.81 beta -- 12.8 Кб -- оптимизирование перерисовки при переходе в другую папку; -- некоторые иконки теперь обтекаемы; -- багфиксы прокрутки списка. - - -25.02.08 -- v0.80 beta -- 12.6 Кб -- критически уменьшена перерисовка! -- багфиксы интерфейса. - - -25.02.08 -- v0.77 beta -- 12.5 Кб -- переименовывание файлов; - - -23.02.08 -- v0.75 beta -- 12.1 Кб -- опять заработали горячие клавиши; -- библиотека eolite_copy.obj больше не нужна; -- теперь работает и вырезание файлов (размером не больше чем ОЗУ); -- улучшение алгоритма прокрутки; -- багфиксы. - - -23.02.08 -- v0.71 beta -- 12.1 Кб -- устранён баг ограничения размера строки для имён файлов; -- ReadMe. - - -23.02.08 -- v0.7 beta -- 12.1 Кб -- ограничение размера строки для имён файлов; -- удалена "." в начале списка файлов. - - -22.02.08 -- v0.65 beta -- 12.3 Кб -- размер файлов теперь выводится в Кб, Мб и Гб; -- оптимизация отрисовки в левой синей панели; -- удобно стало пользоваться полосой адреса. Если она была изменена, нажав Enter - мы переходим по новому адресу, если же нет - открывается выделенная папка, - файл или программа; -- в Колибри не работает, в отличии от эмулятора, реализованное перетягивание - ползунка :( -- выделение по Insert, пока что нигде не используется; - - -18.02.08 -- v0.6 beta -- 11.7 Кб -- совместными усилиями устранён серьёзный баг с нажатием ПКМ на заголовке окна; -- если мы пропишем адрес папки, которой не существует и попытаемся в неё перейти - ничего у нас УЖЕ не получится; -- улучшения в скролле; -- F5 перерисовать окно; -- иконки у устройств; -- панель действий; -- одиночное копирование и вырезание файлов размером не больше чем ОЗУ; -- удаление файлов, пока что без запроса. - - -09.02.08 -- v0.5 beta -- 10 Кб -- оптимизировано Preview; -- до деактивации окна уже нельзя кляцать по белой области и видеть кнопки; -- уменьшен размер иконок - теперь они 16х15; -- нельзя удалить весь путь в строке адреса, "/" по-любому остаётся; -- при деактивации окна выделение не перепрыгивает на первый элемент; -- реализовано открытие програм и ассоциированных файлов; -- расширения больше не в верхнем регистре; -- переходит по носителям, теперь если неизвестный носитель - оно так и напишет; -- добавлены новые типы файлов. - - -04.02.08 -- v0.35 beta -- 9.17 Кб -- для строки адреса отдельный "путь" (не #path, а #edit_path); -- красивая кнопка перехода; -- входит в первую папку; -- вывод типов файлов; -- оптимизация в коде. - - -03.02.08 -- v0.33 beta -- 8.91 Кб (англ.версия) -Первая версия. Краткое хистори: -1. Leency делает дизайн программы и ищет пути решения некоторых проблем. -2. Veliant делает отображение списка файлов из /rd/1/, а Leency реализует - перемотку списка и горячие клавиши. -3. Veliant осуществляет вывод размера файлов. Leency мучается с прокруткой. -4. Veliant выводит иконки, Leency эти иконки рисует и переделывает дизайн окна. -5. Veliant с Leency сделали переход по папкам. -6. Устранение багов. - -22.02.08 -- v0.0 -- 0 Кб -Начало. \ No newline at end of file diff --git a/programs/cmm/eolite/txt/ReadMe_en.txt b/programs/cmm/eolite/txt/ReadMe_en.txt deleted file mode 100644 index 360bb5b907..0000000000 --- a/programs/cmm/eolite/txt/ReadMe_en.txt +++ /dev/null @@ -1,27 +0,0 @@ -Eolite File Manager - -==About this program== -Eolite is a simple in using and pretty looks file manager. -It written in C--. Development has started at 20.01.08. -You can find more information here: -http://board.kolibrios.org/viewtopic.php?f=9&t=973 - - -==Authors== -Leency -Veliant -Punk_Joker -lev - -Nable - -==Thanks== -diamond -Mario79 -Rock_maniak_forever -turbanoff -SoUrcerer -Gluk - - -KolibriOS Forever! \ No newline at end of file diff --git a/programs/cmm/eolite/txt/ReadMe_ru.txt b/programs/cmm/eolite/txt/ReadMe_ru.txt deleted file mode 100644 index afd2b31f26..0000000000 --- a/programs/cmm/eolite/txt/ReadMe_ru.txt +++ /dev/null @@ -1,33 +0,0 @@ -Eolite File Manager - -==О программе== -Файловый менеджер, основными принципами разработки которого -являются простота и удобство использования. Программа написана -на C--, языке промежуточном между языками высокого и низкого -уровня. Разработка началась 20.01.08. -Обсуждение программы здесь: -http://board.kolibrios.org/viewtopic.php?f=9&t=973 - - -==Установка== -Нужно иметь свежий box_lib.obj. Eolite.ini должен быть в папке -с программой. - - -==Авторы== -Leency - разработка, дизайн. -Veliant - программирование, поддержка. -Punk_Joker - код удаления папок, фиксы. - - компонент EditBox и либу к нему. -lev - алгоритм работы с массивами строк. -Nable - некоторые оптимизации и поддержка. - - -==Спасибо== -diamond - активная помощь в программировании, ценные советы. -Mario79 - советы. -S1n - за реализацию работы с lib_ini (увы не используемую). -Rock_maniak_forever, turbanoff, Sorcerer, Gluk, Albom - за найденые баги. - - -У нас будет свой Менует с блекджеком! И шлюхами! KolibriOS Forever! \ No newline at end of file