Separation of application design repositories

pull/56/head
Dmitry Razumov 2 years ago
parent df3801fa97
commit df0760dca3
Signed by: asmeron
GPG Key ID: 50BC1DB583B79706

@ -1,300 +0,0 @@
ТЕХНИЧЕСКОЕ ЗАДАНИЕ на разработку утилиты **ubl-settings-bootloader**
1. **ОПИСАНИЕ:**
Графическое средство настройки загрузчика ОС UBLinux
1. **ЭТАПЫ И СРОКИ СОЗДАНИЯ ПРИЛОЖЕНИЯ:**
1. Общий срок работ по созданию приложения составляет N дней:
1. N дня - макет и дизайн приложения и его утверждение
1. N дней - разработка приложения
1. N дня - тестирование приложения и исправление ошибок
1. Перечень этапов разработки приложения:
1. Разработка макета и дизайна приложения
1. Утверждение и доработка макета
1. Создание работающего интерфейса, включая полную разработку действующих ярлыков, кнопок и т.д.
1. Проектирование алгоритма работы приложения
1. Написание работающего кода приложения, включая полноценно работающие элементы графического интерфейса, а также перевод (поддержка локализации En, Ru), самостоятельно
1. Тестирование и исправление ошибок, самостоятельно
1. Публикация
1. **ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ:**
1. Приложение разрабатывается под нужды операционной системы UBLinux
1. Использование фирменного логотипа компании
1. Название приложения, техническое: **ubl-settings-bootloader** (далее **\${NAME_APPLICATION}**)
1. Название приложения, публичное: **Загрузка системы**
1. Описание приложения: **Настройка параметров загрузки системы**
1. Стек технологий:
1. Язык программирования: Bash или C(++)
1. Приложение для разработки графического интерфейса: Glade 3
1. Графические библиотеки: GTK3
1. Операционная система разработки: UBLinux DB
1. Структура:
1. В исходных кодах использовать префикс корня **CMAKE_INSTALL_PREFIX** для сборки приложений. Например, `CMAKE_INSTALL_PREFIX/share`.
1. Bash/C(++): Весь функционал сосредоточен в графической части, вызовы и исполнение процедур написаны на языках Bash, C(++)
**/usr/bin/\${NAME_APPLICATION} (скомпилированный бинарный файл)**
1. Графическая часть, фронт
**/usr/share/\${NAME_APPLICATION}/ui/\${NAME_APPLICATION}.glade**
1. Стили виджетов GTK
**/usr/share/\${NAME_APPLICATION}/css/\${NAME_APPLICATION}.css**
1. Элементы изображений
1. Иконки:
**/usr/share/icons/hicolor/scalable/apps/\${NAME_APPLICATION}{\*.png,\*.svg}**
Файлы изображений png иконок должны иметь имена вида:
- ru.ublinux.\${NAME_APPLICATION}.svg
- ru.ublinux.\${NAME_APPLICATION}.\${NAME_ICONS}.svg
Где \${NAME_ICONS} - имя графического элемента, например: checked, warning, alert и т.д.
Файлы изображений png иконок должны генерироваться из svg файла в размеры 16, 32, 48, 64 пикселей сценарием make-файла.
1. Изображения:
**/usr/share/\${NAME_APPLICATION}/ui/{\*.png,\*.svg}**
1. Локализация En/Ru
1. Для локализации должен быть создан файл-шаблон ***\${NAME_APPLICATION}.pot***, на его основе должны быть созданы сами ***po-файлы*** переводов на необходимые языки, через файл сборки из po-файлов компилируются ***mo-файлы*** и размещаются сценарием установки по указанному пути:
**/usr/share/locale/\${LANG}/LC_MESSAGES/\${FILE_MO}**
где \${LANG} - каталог с именем локали, например, "ru" или "ru_RU",
\${FILE_MO} - файл локализации программы, например, "\${NAME_APPLICATION}.mo"
1. В файле локализации .pot и .po должна присутствовать строчка информационная, показывающая позицию локализации в коде
Пример:
```bash
#: source/${NAME_APPLICATION}.c:41
msgid "Example string for localization"
msgstr "Пример строки для локализации"
```
1. Вывод **всех** текстовых элементов осуществляется через средства локализации.
1. Файл с перечнем и описанием параметров передаваемых ядру
**/usr/share/${NAME_APPLICATION}/cmdline-linux.csv**
1. Файл с перечнем и описанием параметров терминала для ввода
**/usr/share/${NAME_APPLICATION}/grub-terminal-input.csv**
1. Файл с перечнем и описанием параметров терминала для вывода
**/usr/share/${NAME_APPLICATION}/grub-terminal-output.csv**
1. Файл с перечнем мелодий при загрузки системы
**/usr/share/${NAME_APPLICATION}/grub-beeplist.csv**
1. Версия ПО
1. Файл, в котором хранится версия - VERSION.md, находится в корне каталога проекта.
1. При компиляции (через сценарий make-файла) данные из файла VERSION.md передаются в значение переменной (-ых) version_application в файлах-исходниках ПО.
1. **ТЕХНИЧЕСКОЕ ЗАДАНИЕ:**
1. Ярлык (desktop-файл):
1. Type: Application
1. Exec: ubl-settings-bootloader
1. Categories: X-UBL-SettingsManager;X-UBL-SystemSettings
1. Главное окно:
1. Требования к внешнему виду:
1. Адаптивный (резиновый) дизайн.
1. Наличие элементов интерфейса:
1. Статических - не меняют свою ширину при изменении размеров окна или родительского элемента.
1. Динамических - меняют свою ширину при изменении размеров окна или родительского элемента. Обычно занимают пространство от края до края окна или родительского элемента, либо пространство от рядом расположенного элемента до до края окна или родительского элемента.
1. Минимальный размер окна до прекращения масштабирования 800 на 600 пикселей.
1. Шапка в стиле приложений GTK3 с содержимым:
1. Иконка приложения. Статический элемент. Выравнивание по левому краю.
1. Кнопка с выпадающим списком "Загрузить" -> ("Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию"). Статический элемент. Выравнивание по левому краю.
1. Заголовок окна, название приложения. Выравнивание по центру между элементами.
1. Кнопка с выпадающим списком "Сохранить" -> ("Сохранить в глобальную и локальную конфигурацию, Сохранить в глобальную конфигурацию, Сохранить в локальную конфигурацию"). Статический элемент. Выравнивание по правому краю.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении". Статический элемент. Выравнивание по правому краю.
1. Стандартные элементы окна, кнопки "Свернуть, Минимизировать/На весь экран, Закрыть"
1. В верхней части крупный логотип утилиты, справа от него имя (первая строка) и краткое описание утилиты (вторая строка). Фон заполнен изображением. Статические элементы. Выравнивание по левому краю.
1. Строка уведомления, представляющая собой полосу с инфографикой строки уведомлений. Динамический элемент. От края до края окна по горизонтали.
1. Рабочая область.
1. Требования к «Рабочей области». Динамический элемент. От края до края по горизонтали и вертикали окна. Выводятся группы настроек запуска:
1. Блок с заголовком "Меню загрузки". Динамический элемент. От края до края окна по горизонтали.
1. чекбокс "Таймер меню выбора варианта загрузки". Статический элемент. Выравнивание по левому краю.
1. счётчик от 1 до 60 с лэйблом "секунд". Статический элемент. Выравнивание по левому краю.
1. лэйбл "Загрузка по умолчанию:". Статический элемент. Выравнивание по левому краю.
1. комбобокс с вариантами выбора ОС для загрузки. Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. лэйбл "Режим отображения экрана загрузки:". Статический элемент. Выравнивание по левому краю.
1. комбобокс вариантов режима загрузки: "Анимация загрузки с журналом", "Анимация загрузки без журнала", "Отсутствие анимации загрузки с выводом журнала", "Отсутствие анимации загрузки с выводом сокращенного журнала". Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. Блок с заголовком "Пользователи меню загрузчика". Динамический элемент. От края до края окна по горизонтали.
1. Таблица со скроллбаром. Динамический элемент. От края до края родительского элемента по горизонтали. Заголовок: столбец "Администратор" чекбоксы (на активацию опции), столбец "Пользователь", столбец "Пароль". Содержимое:
- чекбокс, логин пользователя, скрытый "*" пароль пользователя
1. кнопка с иконкой "Добавить"
1. кнопка с иконкой "Удалить"
1. Блок с заголовком "Мелодия при запуске". Динамический элемент. От края до края окна по горизонтали.
1. Таблица со скроллбаром. Динамический элемент. От края до края родительского элемента по горизонтали. Заголовок: столбец "Выбрано" чекбоксы (на активацию опции), столбец "Название", столбец "Код мелодии". Содержимое:
- чекбокс, название мелодии, числовая последовательность кода мелодии
1. кнопка с иконкой "Добавить"
1. кнопка с иконкой "Удалить"
1. Блок с заголовком "Параметры, передаваемые ядру". Динамический элемент. От края до края окна по горизонтали.
1. Таблица со скроллбаром. Динамический элемент. От края до края родительского элемента по горизонтали. Заголовок: столбец "Активно" чекбоксы (на активацию опции), столбец "Опция", столбец "Значение". Содержимое:
1. чекбокс, quiet, Загрузка без текстовых сообщений
1. чекбокс, splash, Показывать окно приветствия
1. чекбокс, noplymouth, Отключить Plymouth
1. чекбокс, acpi=off, Отключить ACPI
1. чекбокс, noapic, Отключить APIC
1. чекбокс, nolapic, Отключить локальный APIC
1. чекбокс, single, Режим одного пользователя
1. чекбокс, nomodeset, Отключить выбор и загрузку ядром драйверов видео
1. чекбокс, i915.enable_dc=0, Отключить управление питанием графического процессора
1. чекбокс, ahci.mobile_lpm_policy=1, Максимальная производительность, управление питанием
1. чекбокс, snd-intel-dspcfg.dsp_driver=1, Принудительный выбор драйвера звукового устройства от Intel
1. чекбокс, intel_idle.max_cstate=1, Предотвращает переход процессора в состояние глубокого сна
1. чекбокс, intel_idle.max_cstate=4, Устраняет мерцание дисплея ноутбука на процессорах Ultra Voltage
1. Поле ввода с лэйблом "Параметры командной строки:". Динамический элемент. От края до края родительского элемента по горизонтали.
1. Блок с заголовком "Терминал для ввода". Динамический элемент. От края до края окна по горизонтали.
1. Таблица со скроллбаром. Динамический элемент. От края до края родительского элемента по горизонтали. Заголовок: столбец "Активно" чекбоксы (на активацию опции), столбец "Опция", столбец "Значение". Содержимое:
1. чекбокс, console, PC BIOS & консоль EFI
1. чекбокс serial, Последовательный терминал
1. чекбокс, ofconsole, Консоль Open Firmware
1. чекбокс, at_keyboard, Клавиатура PC AT (Coreboot)
1. чекбокс, usb_keyboard, Клавиатура USB Keyboard (протокол HID Boot)
1. поле ввода с лэйблом "Параметры командной строки:". Динамический элемент. От края до края родительского элемента по горизонтали.
1. Блок с заголовком "Терминал для вывода". Динамический элемент. От края до края окна по горизонтали.
1. Таблица со скроллбаром. Динамический элемент. От края до края родительского элемента по горизонтали. Заголовок: столбец "Активно" чекбоксы (на активацию опции), столбец "Опция", столбец "Значение". Содержимое:
1. чекбокс, console, PC BIOS & консоль EFI
1. чекбокс, serial, Последовательный терминал
1. чекбокс, ofconsole, Консоль Open Firmware
1. чекбокс, gfxterm, Вывод в графическом режиме
1. чекбокс, vga_text, Текстовый вывод VGA (Coreboot)
1. поле ввода с лэйблом "Параметры командной строки:". Динамический элемент. От края до края родительского элемента по горизонтали.
1. **ОСОБЕННОСТИ**
1. При загрузке утилиты по умолчанию загружаются данные из локального конфигурационного файла (выполняются команды блоков "Чтение значений: из локального конфигурационного файла").
1. Функции записи в локальный конфигурационный файл и чтения-записи в глобальный конфигурационный файл должны проходить процедуру повышения привилегий прав пользователя через polkit.
1. Сохранение должно происходить *только* при наличии изменённых данных в элементах форм приложения, в противном случае выводить в информационной строке сообщение: "Нечего сохранять!".
1. Кнопка "Загрузить" -> ("Загрузить в глобальную конфигурацию, Загрузить локальную конфигурацию"). При нажатии на кнопку происходит открытие меню с пунктами: "Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию". Загрузка текущей и глобальной конфигурации в системе через скрипт ubconfig (выполняются команды блоков "Чтение значений: из локального конфигурационного файла"), загрузка конфигурации из файла настроек ОС ublinux.ini (выполняются команды блоков "Чтение значений: из глобального конфигурационного файла").
1. Кнопка "Сохранить" -> ("Сохранить в глобальную и локальную конфигурацию). Сохраняет текущие настройки через скрипт ubconfig (выполняются команды блоков "Установить значение: в локальный конфигурационный файл") и в конфигурационный файл настроек ОС ublinux.ini (выполняются команды блоков "Установить значение: в глобальный конфигурационный файл"). При выборе пунктов "Сохранить в глобальную конфигурацию, Сохранить в локальную конфигурацию" происходит отдельное сохранение настроек.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении"
1. Справка - запуск окна с встроенным браузером (WebKitWebView) с переходом на ссылку:
1. локализованный (ru_RU) вариант:
https://wiki.ublinux.ru/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
1. локализованный (en_EN) вариант:
https://wiki.ublinux.com/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
Если WebKitWebView не доступен, то запуск через `xdg-open ${URLWIKI}`.
1. О приложении. Открывается диалоговое окно с выводом информации о программе:
1. Заголовок окна по локализованному названию утилиты
1. Копирайты, порядок:
1. Иконка приложения
1. Название утилиты
1. Версия программы (переменная version_application)
1. Название утилиты, локализованное
1. Ссылка "Домашняя страница проекта" на https://ublinux.ru/
1. Авторские права © ООО "Юбисофт", 2022 - \$LASTYEAR
- локализованный (en_EN) вариант: "Copyright © UBSoft LLC, 2022 - \$LASTYEAR"
- где \$LASTYEAR - текущий год.
1. Обработчик ошибок. Встроенный небольшой обработчик кодов внутренних ошибок, который должен передавать статус возникшей ошибки в строку уведомления. Например: "Невозможно прочитать значение параметра XXXXXX!"
1. Строка уведомлений. Цвет в зависимости от сигнала:
- песочный, пиктограмма "Птичка", сообщения об удачных загрузках или сохранениях конфигураций системы.
- красный, пиктограмма "Восклицательный знак", сообщения об ошибках при сохранении, загрузке параметров конфигурации, при ошибках в работе программы, полученных от обработчика ошибок.
1. Содержимое комбобокса "Загрузка по умолчанию:".
1. Первый пункт всегда "Последняя удачная загрузка".
1. Список из доступных ОС для загрузки.
1. Поля "Параметры командной строки" заполняются автоматически при выборе необходимых параметров в таблицах соответствующих блоков (активация через чекбоксы), в поле передаётся название параметра и его значение (если значение имеется), разделение через пробел.
1. При удалении параметра из поля "Параметры командной строки" соответствующий параметр теряет свой статус активности (галочка снимается) в таблице соответствующего блока.
1. При редактировании (изменении) параметра в поле "Параметры командной строки" соответствующий параметр теряет свой статус активности (галочка снимается) в таблице соответствующего блока.
1. Значения параметров, передаваемых ядру, берутся из файла /usr/share/${NAME_APPLICATION}/cmdline-linux.csv
1. Значения параметров, терминала для ввода, берутся из файла /usr/share/${NAME_APPLICATION}/grub-terminal-input.csv
1. Значения параметров, терминала для вывода, берутся из файла /usr/share/${NAME_APPLICATION}/grub-terminal-output.csv
1. Значения параметров, терминала для вывода, берутся из файла /usr/share/${NAME_APPLICATION}/grub-beeplist.csv
1. Вывод файлов csv так же должен быть локализован средствами pot-, po-, mo- файлов.
1. **КОМАНДЫ**
1. Справка, О приложении > Домашняя страница проекта:
`xdg-open \${URLWIKI} &`
1. Меню загрузки
1. Таймер выбора варианта загрузки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_TIMEOUT`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_TIMEOUT`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_TIMEOUT=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_TIMEOUT=$VALUE`
где \$VALUE - параметр, цифровой, от 1 до 60.
1. Загрузка по умолчанию:
1. Должен быть получен список ОС и вариантов загрузки.
1. Получить активный выбор:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_DEFAULT`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_DEFAULT`
1. Задать параметр загрузки:
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_DEFAULT=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_DEFAULT=$VALUE`
где \$VALUE - параметр, строковый, получен из содержимого выбранной строки комбобокса выбора "Загрузка по умолчанию".
1. Режим загрузки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_BOOT_SILENT`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_BOOT_SILENT`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_BOOT_SILENT=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_BOOT_SILENT=$VALUE`
где \$VALUE - параметр, строковый. Соответствие:
*splash* - анимация загрузки, полный лог
*splash quiet ub.silent* - анимация загрузки, нет лога
*quiet ub.silent* - без анимации загрузки, минимальный лог
*plymouth.enable=0* - без анимации загрузки, полный лог
1. Имя пользователя меню загрузки:
1. Чтение значения:
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default get boot GRUB_USER`, если получено (null), то значение пустое.
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_USER=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_USER=$VALUE`
где \$VALUE - параметр, строковый. Если выбран параметр комбобокса "Вручную" значение взять из поля "Имя пользователя меню загрузки:".
1. Пароль пользователя меню загрузки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_PASSWORD`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_PASSWORD`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_PASSWORD=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_PASSWORD=$VALUE`
где \$VALUE - параметр, строковый. Если выбран параметр комбобокса "Вручную" значение взять из поля "Пароль пользователя меню загрузки:".
1. Параметры, передаваемые ядру
1. через функции фронтенда передавать выбранный параметр в поле "Параметры командной строки" блока "Параметры, передаваемые ядру"
1. Параметры командной строки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_CMDLINE_LINUX`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_CMDLINE_LINUX`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_CMDLINE_LINUX=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_CMDLINE_LINUX=$VALUE`
где \$VALUE - перечень параметров, полученных исходя из выбранных опций в блоке "Параметры, передаваемые ядру", разделённых пробелом.
1. Терминал для ввода
1. через функции фронтенда передавать выбранный параметр в поле "Параметры командной строки" блока "Терминал для ввода"
1. Параметры командной строки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_TERMINAL_INPUT`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_TERMINAL_INPUT`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_TERMINAL_INPUT=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_TERMINAL_INPUT=$VALUE`
где \$VALUE - перечень параметров, полученных исходя из выбранных опций в блоке "Терминал для ввода", разделённых пробелом.
1. Терминал для вывода
1. через функции фронтенда передавать выбранный параметр в поле "Параметры командной строки" блока "Терминал для вывода"
1. Параметры командной строки:
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get boot GRUB_TERMINAL_OUTPUT`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get boot GRUB_TERMINAL_OUTPUT`
1. Установить значение:
1. в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set boot GRUB_TERMINAL_OUTPUT=$VALUE`
1. в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set boot GRUB_TERMINAL_OUTPUT=$VALUE`
где \$VALUE - перечень параметров, полученных исходя из выбранных опций в блоке "Терминал для вывода", разделённых пробелом.
1. **ПОМОЩЬ И ПАРАМЕТРЫ ЗАПУСКА**
1. Помощь
- Пример вывода:
> ${NAME_APPLICATION} version: \$VERSION
> Application Description for UBLinux
>
> Использование: ${NAME_APPLICATION} [OPTIONS...]
> Параметры приложения:
> \$OPTIONS
Где \$OPTIONS - параметры запуска, \$VERSION - версия программы (переменная version_application).
1. Параметры запуска:
1. *-h, --help* - Показать параметры справки
1. *-V, --version* - Показать текущую версию
1. *--lock-help* - Блокировка вызова справки
1. *--lock-save* - Блокировка сохранения локальной и глобальной конфигурации
1. *--lock-save-local* - Блокировка сохранения локальной конфигурации
1. *--lock-save-global* - Блокировка сохранения глобальной конфигурации
1. *--lock-load-global* - Блокировка загрузки глобальной конфигурации
1. Действия при указанных параметрах:
1. *--lock-help* - делать неактивным пункт "Справка" в выпадающем списке кнопки с иконкой.
1. *--lock-save* - делать неактивной кнопку "Сохранить".
1. *--lock-save-local* - делать неактивным пункт "Сохранить локальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-save-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Сохранить глобальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-load-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Загрузить глобальную конфигурацию" в выпадающем списке кнопки "Загрузить".
1. **ПРИБЛИЗИТЕЛЬНЫЙ МАКЕТ ПРИЛОЖЕНИЯ.**
1. Главное окно
![](https://gitea.ublinux.ru/miramax166/design-ubl-settings-apps/raw/branch/master/ubl-settings-bootloader/pic/01%28ru_RU%29.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

@ -1,242 +0,0 @@
ТЕХНИЧЕСКОЕ ЗАДАНИЕ на разработку утилиты **ubl-settings-datetime**
1. **ОПИСАНИЕ:**
Графическое средство настройки даты и времени в ОС UBLinux
1. **ЭТАПЫ И СРОКИ СОЗДАНИЯ ПРИЛОЖЕНИЯ:**
1. Общий срок работ по созданию приложения составляет N дней:
1. N дня - макет и дизайн приложения и его утверждение
1. N дней - разработка приложения
1. N дня - тестирование приложения и исправление ошибок
1. Перечень этапов разработки приложения:
1. Разработка макета и дизайна приложения
1. Утверждение и доработка макета
1. Создание работающего интерфейса, включая полную разработку действующих ярлыков, кнопок и т.д.
1. Проектирование алгоритма работы приложения
1. Написание работающего кода приложения, включая полноценно работающие элементы графического интерфейса, а также перевод (поддержка локализации En, Ru), самостоятельно
1. Тестирование и исправление ошибок, самостоятельно
1. Публикация
1. **ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ:**
1. Приложение разрабатывается под нужды операционной системы UBLinux
1. Использование фирменного логотипа компании
1. Название приложения, техническое: **ubl-settings-datetime** (далее **\${NAME_APPLICATION}**)
1. Название приложения, публичное: **Дата и время**
1. Описание приложения: **Настройка даты и времени системы**
1. Стек технологий:
1. Язык программирования: Bash или C(++)
1. Приложение для разработки графического интерфейса: Glade 3
1. Графические библиотеки: GTK3
1. Операционная система разработки: UBLinux DB
1. Структура:
1. В исходных кодах использовать префикс корня **CMAKE_INSTALL_PREFIX** для сборки приложений. Например, `CMAKE_INSTALL_PREFIX/share`.
1. Bash/C(++): Весь функционал сосредоточен в графической части, вызовы и исполнение процедур написаны на языках Bash, C(++)
**/usr/bin/\${NAME_APPLICATION} (скомпилированный бинарный файл)**
1. Графическая часть, фронт
**/usr/share/\${NAME_APPLICATION}/ui/\${NAME_APPLICATION}.glade**
1. Стили виджетов GTK
**/usr/share/\${NAME_APPLICATION}/css/\${NAME_APPLICATION}.css**
1. Элементы изображений
1. Иконки:
**/usr/share/icons/hicolor/scalable/apps/\${NAME_APPLICATION}{\*.png,\*.svg}**
Файлы изображений png иконок должны иметь имена вида:
- ru.ublinux.\${NAME_APPLICATION}.svg
- ru.ublinux.\${NAME_APPLICATION}.\${NAME_ICONS}.svg
Где \${NAME_ICONS} - имя графического элемента, например: checked, warning, alert и т.д.
Файлы изображений png иконок должны генерироваться из svg файла в размеры 16, 32, 48, 64 пикселей сценарием make-файла.
1. Изображения:
**/usr/share/\${NAME_APPLICATION}/ui/{\*.png,\*.svg}**
1. Локализация En/Ru
1. Для локализации должен быть создан файл-шаблон ***\${NAME_APPLICATION}.pot***, на его основе должны быть созданы сами ***po-файлы*** переводов на необходимые языки, через файл сборки из po-файлов компилируются ***mo-файлы*** и размещаются сценарием установки по указанному пути:
**/usr/share/locale/\${LANG}/LC_MESSAGES/\${FILE_MO}**
где \${LANG} - каталог с именем локали, например, "ru" или "ru_RU",
\${FILE_MO} - файл локализации программы, например, "\${NAME_APPLICATION}.mo"
1. В файле локализации .pot и .po должна присутствовать строчка информационная, показывающая позицию локализации в коде
Пример:
```bash
#: source/${NAME_APPLICATION}.c:41
msgid "Example string for localization"
msgstr "Пример строки для локализации"
```
1. Вывод **всех** текстовых элементов осуществляется через средства локализации.
2. Версия ПО
1. Файл, в котором хранится версия - VERSION.md, находится в корне каталога проекта.
1. При компиляции (через сценарий make-файла) данные из файла VERSION.md передаются в значение переменной (-ых) version_application в файлах-исходниках ПО.
1. **ТЕХНИЧЕСКОЕ ЗАДАНИЕ:**
1. Ярлык (desktop-файл):
1. Type: Application
1. Exec: ubl-settings-datetime
1. Categories: X-UBL-SettingsManager;X-UBL-SystemSettings
1. Главное окно:
1. Требования к внешнему виду:
1. Адаптивный (резиновый) дизайн.
1. Наличие элементов интерфейса:
1. Статических - не меняют свою ширину при изменении размеров окна или родительского элемента.
1. Динамических - меняют свою ширину при изменении размеров окна или родительского элемента. Обычно занимают пространство от края до края окна или родительского элемента, либо пространство от рядом расположенного элемента до до края окна или родительского элемента.
1. Минимальный размер окна до прекращения масштабирования 800 на 600 пикселей.
1. Шапка в стиле приложений GTK3 с содержимым:
1. Иконка приложения. Статический элемент. Выравнивание по левому краю.
1. Кнопка с выпадающим списком "Загрузить" -> ("Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию"). Статический элемент. Выравнивание по левому краю.
1. Заголовок окна, название приложения. Выравнивание по центру между элементами.
1. Кнопка с выпадающим списком "Сохранить" -> ("Сохранить в глобальную и локальную конфигурацию, Сохранить в глобальную конфигурацию, Сохранить в локальную конфигурацию"). Статический элемент. Выравнивание по правому краю.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении". Статический элемент. Выравнивание по правому краю.
1. Стандартные элементы окна, кнопки "Свернуть, Минимизировать/На весь экран, Закрыть"
1. В верхней части крупный логотип утилиты, справа от него имя (первая строка) и краткое описание утилиты (вторая строка). Фон заполнен изображением. Статические элементы. Выравнивание по левому краю.
1. Строка уведомления, представляющая собой полосу с инфографикой строки уведомлений. Динамический элемент. От края до края окна по горизонтали.
1. Рабочая область.
1. Требования к "Рабочей области". Динамический элемент. От края до края по горизонтали и вертикали окна. Выводятся группы настроек запуска:
1. Блок с заголовком "Текущие дата и время". Динамический элемент. От края до края окна по горизонтали.
1. лейбл "Время". Статический элемент. Выравнивание по левому краю.
1. счётчик от 00 до 23 (часы). Статический элемент. Выравнивание по левому краю.
1. лейбл ":" (разделитель). Статический элемент. Выравнивание по левому краю.
1. счётчик от 00 до 59 (минуты). Статический элемент. Выравнивание по левому краю.
1. лейбл "Дата". Статический элемент. Выравнивание по левому краю.
1. поле ввода. Ввод даты в формате ДД.ММ.ГГГГ. Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. кнопка с иконкой календаря. Вызов объекта датапикер (визуальное представление выбора даты). Статический элемент. Выравнивание по левому краю.
1. кнопка "Синхронизировать". Синхронизация выставленных даты и времени с часами и датой системы. Неактивно, если выбраны значения "По умолчанию, DHCP, Вручную" чекбокса в блоке "Синхронизация через NTP". Динамический элемент. Выравнивание по левому краю. Делит пространство в равных долях с соседними элементами.
1. кнопка "Синхронизировать аппаратное время". Синхронизация даты и времени с временем BIOS рабочей станции. Динамический элемент. Выравнивание по левому краю. Делит пространство в равных долях с соседними элементами.
1. Блок с заголовком "Синхронизация через NTP". Динамический элемент. От края до края окна по горизонтали.
1. комбобокс с вариантами выбора сервера: "Остановлено, По умолчанию, DHCP, Вручную". При выборе "По умолчанию", второе поле для ввода вручную становится заблокированным для манипуляций - текст введённого поля серый. При выборе "По умолчанию" в конфигурационный файл передаются значения: "NTPSERVERS=default". Статический элемент. Выравнивание по левому краю.
1. поле ввода для ручного указания серверов. Неактивно, если выбраны значения "Отключено, Остановлено, По умолчанию, DHCP" комбобокса в блоке "Синхронизация через NTP". Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. Блок с заголовком "Часовой пояс". Динамический элемент. От края до края окна по горизонтали.
1. лейбл "Синхронизация аппаратного времени:". Статический элемент. Выравнивание по левому краю.
1. комбобокс с вариантами "Локальное время, Время по UTC". Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. лейбл "Регион:". Статический элемент. Выравнивание по левому краю.
1. комбобокс. Локализованный перечень регионов. Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. лейбл "Зона:". Статический элемент. Выравнивание по левому краю.
1. комбобокс. Перечень городов с поправкой на часовой пояс. Например, "(UTC +06) Омск". Перечень регионов, локализация стандартными средствами. Динамический элемент. Выравнивание по левому краю. Делит пространство с соседними элементами.
1. **ОСОБЕННОСТИ**
1. При загрузке утилиты по умолчанию загружаются данные из локального конфигурационного файла (выполняются команды блоков "Чтение значений: из локального конфигурационного файла").
1. Функции записи в локальный конфигурационный файл и чтения-записи в глобальный конфигурационный файл должны проходить процедуру повышения привилегий прав пользователя через polkit.
1. Сохранение должно происходить *только* при наличии изменённых данных в элементах форм приложения, в противном случае выводить в информационной строке сообщение: "Нечего сохранять!".
1. Кнопка "Загрузить" -> ("Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию"). При нажатии на кнопку происходит открытие меню с пунктами: "Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию". Загрузка текущей и глобальной конфигурации в системе через скрипт ubconfig (выполняются команды блоков "Чтение значений: из локального конфигурационного файла"), загрузка конфигурации из файла настроек ОС ublinux.ini (выполняются команды блоков "Чтение значений: из глобального конфигурационного файла").
1. Кнопка "Сохранить" -> ("Сохранить в глобальную и локальную конфигурацию). Сохраняет текущие настройки через скрипт ubconfig (выполняются команды блоков "Установить значение: в локальный конфигурационный файл") и в конфигурационный файл настроек ОС ublinux.ini (выполняются команды блоков "Установить значение: в глобальный конфигурационный файл"). При выборе пунктов "Сохранить в глобальную конфигурацию, Сохранить в локальную конфигурацию" происходит отдельное сохранение настроек.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении"
1. Справка - запуск окна с встроенным браузером (WebKitWebView) с переходом на ссылку:
1. локализованный (ru_RU) вариант:
https://wiki.ublinux.ru/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
1. локализованный (en_EN) вариант:
https://wiki.ublinux.com/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
Если WebKitWebView не доступен, то запуск через `xdg-open ${URLWIKI}`.
1. О приложении. Открывается диалоговое окно с выводом информации о программе:
1. Заголовок окна по локализованному названию утилиты
1. Копирайты, порядок:
1. Иконка приложения
1. Название утилиты
1. Версия программы (переменная version_application)
1. Название утилиты, локализованное
1. Ссылка "Домашняя страница проекта" на https://ublinux.ru/
1. Авторские права © ООО "Юбисофт", 2022 - \$LASTYEAR
- локализованный (en_EN) вариант: "Copyright © UBSoft LLC, 2022 - \$LASTYEAR"
- где \$LASTYEAR - текущий год.
1. Обработчик ошибок. Встроенный небольшой обработчик кодов внутренних ошибок, который должен передавать статус возникшей ошибки в строку уведомления. Например: "Невозможно прочитать значение параметра XXXXXX!"
1. Строка уведомлений. Цвет в зависимости от сигнала:
- песочный, пиктограмма "Птичка", сообщения об удачных загрузках или сохранениях конфигураций системы.
- красный, пиктограмма "Восклицательный знак", сообщения об ошибках при наличии незаполненных полей (мешающих работе логики программы), при сохранении, загрузке параметров конфигурации, при ошибках в работе программы, полученных от обработчика ошибок.
1. Блокировать дальнейшую работу с программой:
1. Если неправильно вручную введены или отредактированы данные в поле "Дата:" то при нажатии на кнопку "Синхронизировать" - изменить цвет информационной строки на красный и вывести сообщение "Неверный формат даты!".
1. При исправлении ошибки и повторного нажатия на кнопку "Синхронизировать" или при корректной работе - изменить цвет информационной строки на песочный и вывести сообщение об успешной синхронизации.
1. Если неправильно отработал скрипт при нажатии на кнопку "Синхронизировать аппаратное время" - изменить цвет информационной строки на красный и вывести сообщение "Ошибка синхронизации аппаратных часов!".
1. При исправлении ошибки и повторного нажатия на кнопку "Синхронизировать аппаратное время" или при корректной работе скрипта - изменить цвет информационной строки на песочный и вывести сообщение "Аппаратные часы успешно синхронизированы".
1. Если в комбобоксе блока "Синхронизировать через NTP" выбрано значение "Вручную" - изменить цвет информационной строки на красный и вывести сообщение "Введите NTP-сервер(-ы) для синхронизации!", кнопку "Сохранить" сделать неактивной.
1. При исправлении ошибки и потери фокуса поля - изменить цвет информационной строки на песочный и вывести сообщение "NTP-сервер(-ы) корректны", кнопку "Сохранить" сделать активной.
1. **КОМАНДЫ**
1. Справка, О приложении > Домашняя страница проекта:
`xdg-open \${URLWIKI} &`
1. Текущие дата и время
1. Чтение значения:
1. через средства функции на языке С(++)
1. Установить значение:
1. счётчики часы и минуты: `date +%T -s "h:m:sec"` (кнопка "Синхронизировать")
1. дата: `date +%Y%m%d -s "2000:06:14"` (кнопка "Синхронизировать")
1. Синхронизировать аппаратное время:
1. Установить значение: `hwclock --systohc` (кнопка "Синхронизировать аппаратное время")
1. Синхронизация через NTP
1. Чтение значения:
1. из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get network NTPSERVERS`
1. из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get network NTPSERVERS`
1. Установить значение:
1. "Остановлено"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set network NTPSERVERS=stop`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set network NTPSERVERS=stop`
1. "По умолчанию"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set network NTPSERVERS=default`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set network NTPSERVERS=default`
1. "DHCP"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set network NTPSERVERS=dhcp`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set network NTPSERVERS=dhcp`
1. "Вручную"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set network NTPSERVERS=$VALUE`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set network NTPSERVERS=$VALUE`
где $VALUE - перечень серверов, полученных из поля в блоке "Синхронизация через NTP", разделённых "," или ";".
1. Если выбрано значение "По умолчанию", то неактивное поле ввода заполняется командой:
- `ubconfig --source default get [] NTPSERVERS_DEFAULT`
1. Проверка запущенных процессов синхронизации (systemd-timesyncd, ntpd, chronyd) и остановка этих сервисов сервисов, осуществляется выполнением команды `/usr/bin/ubconfig remove network NTPSERVERS` при выборе опции "Остановлено" из выпадающего списка блока "Синхронизация через NTP"
1. Часовой пояс
1. Синхронизация аппаратного времени:
1. Чтение значений:
- из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get clock HWCLOCK_SYNC`
- из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get clock HWCLOCK_SYNC`
1. Установить значение:
1. "Локальное время"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set clock HWCLOCK_SYNC=localtime`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set clock HWCLOCK_SYNC=localtime`
1. "Время по UTC"
в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set clock HWCLOCK_SYNC=utc`
в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set clock HWCLOCK_SYNC=utc`
1. Комбобокс "Регион", "Зона":
1. Чтение значений:
- из локального конфигурационного файла: `/usr/bin/ubconfig --default --source system get clock ZONE`
- из глобального конфигурационного файла: `/usr/bin/ubconfig --default --source global get clock ZONE`
1. Установить значение:
- в локальный конфигурационный файл: `/usr/bin/ubconfig --target system set clock ZONE=$VALUE`
- в глобальный конфигурационный файл: `/usr/bin/ubconfig --target global set clock ZONE=$VALUE`
где $VALUE - сложение срок-значений из комбобокса "Регион" и "Зона" через символ "/", например "Asia/Omsk".
1. **ПОМОЩЬ И ПАРАМЕТРЫ ЗАПУСКА**
1. Помощь
- Пример вывода:
> ${NAME_APPLICATION} version: \$VERSION
> Application Description for UBLinux
>
> Использование: ${NAME_APPLICATION} [OPTIONS...]
> Параметры приложения:
> \$OPTIONS
Где \$OPTIONS - параметры запуска, \$VERSION - версия программы (переменная version_application).
1. Параметры запуска:
1. *-h, --help* - Показать параметры справки
1. *-V, --version* - Показать текущую версию
1. *--lock-help* - Блокировка вызова справки
1. *--lock-save* - Блокировка сохранения локальной и глобальной конфигурации
1. *--lock-save-local* - Блокировка сохранения локальной конфигурации
1. *--lock-save-global* - Блокировка сохранения глобальной конфигурации
1. *--lock-load-global* - Блокировка загрузки глобальной конфигурации
1. *--lock-datetime* - Блокировка изменения даты и времени
1. *--lock-timezone* - Блокировка изменения часового пояса
1. *--lock-ntp-mode* - Блокировка выбора режима NTP
1. *--lock-ntp-edit* - Блокировка перечня NTP серверов
1. *--lock-sync-hwclock* - Блокировка выбора режима синхронизации аппаратного времени
1. Действия при указанных параметрах:
1. *--lock-help* - делать неактивным пункт "Справка" в выпадающем списке кнопки с иконкой.
1. *--lock-save* - делать неактивной кнопку "Сохранить".
1. *--lock-save-local* - делать неактивным пункт "Сохранить локальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-save-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Сохранить глобальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-load-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Загрузить глобальную конфигурацию" в выпадающем списке кнопки "Загрузить".
1. *--lock-datetime* - делать неактивными лейбл "Время:", счётчик (часы), лейбл ":", счётчик (минуты), лейбл "Дата:", поле ввода, кнопка с иконкой календаря.
1. *--lock-timezone* - делать неактивными лейбл "Регион:", комбобокс с выбором регионов, лейбл "Зона:", комбобокс с выбором зон.
1. *--lock-ntp-mode* - делать неактивным выпадающий список вариантов синхронизации NTP.
1. *--lock-ntp-edit* - делать неактивным поле ввода списка серверов NTP.
1. *--lock-sync-hwclock* - делать неактивным лейбл "Синхронизация аппаратного времени" и комбобокс с вариантами выбора режима синхронизации аппаратного времени.
1. **ПРИБЛИЗИТЕЛЬНЫЙ МАКЕТ ПРИЛОЖЕНИЯ.**
1. Главное окно
![](https://gitea.ublinux.ru/miramax166/design-ubl-settings-apps/raw/branch/master/ubl-settings-datetime/pic/01%28ru_RU%29.png)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

@ -1,156 +0,0 @@
ТЕХНИЧЕСКОЕ ЗАДАНИЕ на разработку утилиты **ubl-settings-diskquota**
1. **ОПИСАНИЕ:**
Графическое средство настройки квот пользователей в ОС UBLinux
1. **ЭТАПЫ И СРОКИ СОЗДАНИЯ ПРИЛОЖЕНИЯ:**
1. Общий срок работ по созданию приложения составляет N дней:
1. N дня - макет и дизайн приложения и его утверждение
1. N дней - разработка приложения
1. N дня - тестирование приложения и исправление ошибок
1. Перечень этапов разработки приложения:
1. Разработка макета и дизайна приложения
1. Утверждение и доработка макета
1. Создание работающего интерфейса, включая полную разработку действующих ярлыков, кнопок и т.д.
1. Проектирование алгоритма работы приложения
1. Написание работающего кода приложения, включая полноценно работающие элементы графического интерфейса, а также перевод (поддержка локализации En, Ru), самостоятельно
1. Тестирование и исправление ошибок, самостоятельно
1. Публикация
1. **ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ:**
1. Приложение разрабатывается под нужды операционной системы UBLinux
1. Использование фирменного логотипа компании
1. Название приложения, техническое: **ubl-settings-diskquota** (далее **\${NAME_APPLICATION}**)
1. Название приложения, публичное: **Дисковые квоты**
1. Описание приложения: **Настройка параметров дисковых квот для групп и пользователей системы**
1. Стек технологий:
1. Язык программирования: Bash или C(++)
1. Приложение для разработки графического интерфейса: Glade 3
1. Графические библиотеки: GTK3
1. Операционная система разработки: UBLinux DB
1. Структура:
1. В исходных кодах использовать префикс корня **CMAKE_INSTALL_PREFIX** для сборки приложений. Например, `CMAKE_INSTALL_PREFIX/share`.
1. Bash/C(++): Весь функционал сосредоточен в графической части, вызовы и исполнение процедур написаны на языках Bash, C(++)
**/usr/bin/\${NAME_APPLICATION} (скомпилированный бинарный файл)**
1. Графическая часть, фронт
**/usr/share/\${NAME_APPLICATION}/ui/\${NAME_APPLICATION}.glade**
1. Стили виджетов GTK
**/usr/share/\${NAME_APPLICATION}/css/\${NAME_APPLICATION}.css**
1. Элементы изображений
1. Иконки:
**/usr/share/icons/hicolor/scalable/apps/\${NAME_APPLICATION}{\*.png,\*.svg}**
Файлы изображений png иконок должны иметь имена вида:
- ru.ublinux.\${NAME_APPLICATION}.svg
- ru.ublinux.\${NAME_APPLICATION}.\${NAME_ICONS}.svg
Где \${NAME_ICONS} - имя графического элемента, например: checked, warning, alert и т.д.
Файлы изображений png иконок должны генерироваться из svg файла в размеры 16, 32, 48, 64 пикселей сценарием make-файла.
1. Изображения:
**/usr/share/\${NAME_APPLICATION}/ui/{\*.png,\*.svg}**
1. Локализация En/Ru
1. Для локализации должен быть создан файл-шаблон ***\${NAME_APPLICATION}.pot***, на его основе должны быть созданы сами ***po-файлы*** переводов на необходимые языки, через файл сборки из po-файлов компилируются ***mo-файлы*** и размещаются сценарием установки по указанному пути:
**/usr/share/locale/\${LANG}/LC_MESSAGES/\${FILE_MO}**
где \${LANG} - каталог с именем локали, например, "ru" или "ru_RU",
\${FILE_MO} - файл локализации программы, например, "\${NAME_APPLICATION}.mo"
1. В файле локализации .pot и .po должна присутствовать строчка информационная, показывающая позицию локализации в коде
Пример:
```bash
#: source/${NAME_APPLICATION}.c:41
msgid "Example string for localization"
msgstr "Пример строки для локализации"
```
1. Вывод **всех** текстовых элементов осуществляется через средства локализации.
1. Версия ПО
1. Файл, в котором хранится версия - VERSION.md, находится в корне каталога проекта.
1. При компиляции (через сценарий make-файла) данные из файла VERSION.md передаются в значение переменной (-ых) version_application в файлах-исходниках ПО.
1. **ТЕХНИЧЕСКОЕ ЗАДАНИЕ:**
1. Ярлык (desktop-файл):
1. Type: Application
1. Exec: ubl-settings-video
1. Categories: X-UBL-SettingsManager;X-UBL-SystemSettings
1. Главное окно:
1. Требования к внешнему виду:
1. Адаптивный (резиновый) дизайн.
1. Наличие элементов интерфейса:
1. Статических - не меняют свою ширину при изменении размеров окна или родительского элемента.
1. Динамических - меняют свою ширину при изменении размеров окна или родительского элемента. Обычно занимают пространство от края до края окна или родительского элемента, либо пространство от рядом расположенного элемента до до края окна или родительского элемента.
1. Минимальный размер окна до прекращения масштабирования 800 на 600 пикселей.
1. Шапка в стиле приложений GTK3 с содержимым:
1. Иконка приложения. Статический элемент. Выравнивание по левому краю.
1. Кнопка с выпадающим списком "Загрузить" -> ("Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию"). Статический элемент. Выравнивание по левому краю.
1. Заголовок окна, название приложения. Выравнивание по центру между элементами.
1. Кнопка с выпадающим списком "Сохранить" -> ("Сохранить глобальную и локальную конфигурацию, Сохранить глобальную конфигурацию, Сохранить локальную конфигурацию"). Статический элемент. Выравнивание по правому краю.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении". Статический элемент. Выравнивание по правому краю.
1. Стандартные элементы окна, кнопки "Свернуть, Минимизировать/На весь экран, Закрыть"
1. В верхней части крупный логотип утилиты, справа от него имя (первая строка) и краткое описание утилиты (вторая строка). Фон заполнен изображением. Статические элементы. Выравнивание по левому краю.
1. Строка уведомления, представляющая собой полосу с инфографикой строки уведомлений. Динамический элемент. От края до края окна по горизонтали.
1. Рабочая область.
1. Требования к "Рабочей области". Динамический элемент. От края до края по горизонтали и вертикали окна. Выводятся группы настроек запуска:
1. **ОСОБЕННОСТИ**
1. При загрузке утилиты по умолчанию загружаются данные из локального конфигурационного файла (выполняются команды блоков "Чтение значений: из локального конфигурационного файла").
1. Функции записи в локальный конфигурационный файл и чтения-записи в глобальный конфигурационный файл должны проходить процедуру повышения привилегий прав пользователя через polkit.
1. Сохранение должно происходить *только* при наличии изменённых данных в элементах форм приложения, в противном случае выводить в информационной строке сообщение: "Нечего сохранять!".
1. Кнопка "Загрузить" -> ("Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию"). При нажатии на кнопку происходит открытие меню с пунктами: "Загрузить глобальную конфигурацию, Загрузить локальную конфигурацию". Загрузка текущей и глобальной конфигурации в системе через скрипт ubconfig (выполняются команды блоков "Чтение значений: из локального конфигурационного файла"), загрузка конфигурации из файла настроек ОС ublinux.ini (выполняются команды блоков "Чтение значений: из глобального конфигурационного файла").
1. Кнопка "Сохранить" -> ("Сохранить глобальную и локальную конфигурацию). Сохраняет текущие настройки через скрипт ubconfig (выполняются команды блоков "Установить значение: в локальный конфигурационный файл") и в конфигурационный файл настроек ОС ublinux.ini (выполняются команды блоков "Установить значение: в глобальный конфигурационный файл"). При выборе пунктов "Сохранить глобальную конфигурацию, Сохранить локальную конфигурацию" происходит отдельное сохранение настроек.
1. Обработчик ошибок. Встроенный небольшой обработчик кодов внутренних ошибок, который должен передавать статус возникшей ошибки в строку уведомления. Например: "Невозможно прочитать значение параметра XXXXXX!"
1. Строка уведомлений. Цвет в зависимости от сигнала:
- песочный, пиктограмма "Птичка", сообщения об удачных загрузках или сохранениях конфигураций системы.
- красный, пиктограмма "Восклицательный знак", сообщения об ошибках при сохранении, загрузке параметров конфигурации, при ошибках в работе программы, полученных от обработчика ошибок.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении"
1. Справка - запуск окна с встроенным браузером (WebKitWebView) с переходом на ссылку:
1. локализованный (ru_RU) вариант:
https://wiki.ublinux.ru/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
1. локализованный (en_EN) вариант:
https://wiki.ublinux.com/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
Если WebKitWebView не доступен, то запуск через `xdg-open ${URLWIKI}`.
1. О приложении. Открывается диалоговое окно с выводом информации о программе:
1. Заголовок окна по локализованному названию утилиты
1. Копирайты, порядок:
1. Иконка приложения
1. Название утилиты
1. Версия программы (переменная version_application)
1. Название утилиты, локализованное
1. Ссылка "Домашняя страница проекта" на https://ublinux.ru/
1. Авторские права © ООО "Юбисофт", 2022 - \$LASTYEAR
- локализованный (en_EN) вариант: "Copyright © UBSoft LLC, 2022 - \$LASTYEAR"
- где \$LASTYEAR - текущий год.
1. **КОМАНДЫ**
1. **ПОМОЩЬ И ПАРАМЕТРЫ ЗАПУСКА**
1. Помощь
- Пример вывода:
> ${NAME_APPLICATION} version: \$VERSION
> Application Description for UBLinux
>
> Использование: ${NAME_APPLICATION} [OPTIONS...]
> Параметры приложения:
> \$OPTIONS
Где \$OPTIONS - параметры запуска, \$VERSION - версия программы (переменная version_application).
1. Параметры запуска:
1. *-h, --help* - Показать параметры справки
1. *-V, --version* - Показать текущую версию
1. *--lock-help* - Блокировка вызова справки
1. *--lock-settings* - Блокировка вызова настроек
1. *--lock-save* - Блокировка сохранения локальной и глобальной конфигурации
1. *--lock-save-local* - Блокировка сохранения локальной конфигурации
1. *--lock-save-global* - Блокировка сохранения глобальной конфигурации
1. *--lock-load-global* - Блокировка загрузки глобальной конфигурации
1. Действия при указанных параметрах:
1. *--lock-help* - делать неактивным пункт "Справка" в выпадающем списке кнопки с иконкой.
1. *--lock-settings* - блокировать создание конфигурационного файла у пользователя и игнорировать его, если он создан.
1. *--lock-save* - делать неактивной кнопку "Сохранить".
1. *--lock-save-local* - делать неактивным пункт "Сохранить локальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-save-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Сохранить глобальную конфигурацию" в выпадающем списке кнопки "Сохранить".
1. *--lock-load-global* - делать неактивным пункт "Сохранить глобальную и локальную конфигурацию" и "Загрузить глобальную конфигурацию" в выпадающем списке кнопки "Загрузить".
1. **ПРИБЛИЗИТЕЛЬНЫЙ МАКЕТ ПРИЛОЖЕНИЯ.**
1. Главное окно
![enter image description here](https://gitea.ublinux.ru/miramax166/design-ubl-settings-apps/raw/branch/master/ubl-settings-diskquota/pic/01%28ru_RU%29.png)

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

@ -1,203 +0,0 @@
%PDF-1.5
1 0 obj
<</Type /Pages
/Kids [3 0 R]
/Count 1>>
endobj
3 0 obj
<</Type /Page
/Parent 1 0 R
/MediaBox [0 0 841.89 595.28]
/Resources 2 0 R
/Rotate 0
/Contents 4 0 R>>
endobj
4 0 obj
<</Length 111>>
stream
BT /F7 9.00 Tf ET
/GS0 gs
1.000 0.000 0.000 1.000 0.000 0.000 cm
q 813.13 0 0 575.28 14.38 10.00 cm
/I1 Do Q
s
endstream
endobj
5 0 obj
<</Type /OCG /Name (print)
/Usage <</Print <</PrintState /ON>> /View <</ViewState /OFF>>>>>>
endobj
6 0 obj
<</Type /OCG /Name (view)
/Usage <</Print <</PrintState /OFF>> /View <</ViewState /ON>>>>>>
endobj
7 0 obj
<</Type /ExtGState
/CA 1
/n 7
/ca 1
/BM /Normal
/SA true
>>
endobj
8 0 obj
<</Type /Font
/BaseFont /Helvetica
/Subtype /Type1
/Encoding /WinAnsiEncoding
>>
endobj
9 0 obj
<</Type /XObject
/Subtype /Image
/Width 841
/Height 595
/ColorSpace /DeviceRGB
/BitsPerComponent 8
/Filter /FlateDecode
/DecodeParms <</Predictor 15 /Colors 3 /BitsPerComponent 8 /Columns 841>>
/Length 24443>>
stream
xÚì<EFBFBD>÷OËÿ‡¿ÿÓ<C3BF>1b0ä  <06>J Þ¢{¯¨ b/  b¹z±bCDņX…ïãyß»Ÿýœs@ôªËëù<C3AB>왳;;;;ûžgfwÿ× „B!~þOU „BB!„r;!„BB!„r;!„Bˆ_ÐíÞßß91á<31>?<)3<><©ÿçËw77ŒŒÿÃÓ?÷bÝÞíûÒÍcâÿø€'qæÑçï±¾êÈŒD<C592>79~ÔÆÛï??ÿº+«{þð \q¹î«Wa}å±ÙÉ ujOB!„ø®Ü׸ðô?®õ-ÜîORÖéjK­.ÊJ2µûaÜ®¾æöî驞V,·B!Ä÷çvhÕð•—^×v»w•·/œ449±OÒàq³×<C2B3>¸[Êõ<C5A0>÷Méãñ$gŸ~íõªË+!;}¦|ZïhœgÀ²¿j}ÝΓ˜”Ćsß~H|[œ;Àci.·«{rqwîô1“‡L˜—wâîëúÿ¨Uõ<55>ãkf<6B>”Ô'¡ï€QÓV¾]]ïëvõÕWòÆ&ò)5sïÝ· ïnä <0A>w©ØßÙoѹŸß][34þ<34>„‰
ö-ÉžÂ>‡eä)uíò?Ô>¾´'{T?³Q¹<51>B!¾?·‹6rx§ÏØM·Þú»]ý«‹+Göù{bÍ„&uÖ‡ïÞßÛð‡gÐʳdïËòÇ}˜’ó$/<[ÃF÷¤ó]Š÷ƒ¯Û¥Îœ›ÑÇ?|ÝõwìíúºáñžÄ©sg¦8nWÿäDÖàx÷.ÿð$MÞvó<76>i_ùž)Iÿý%z\ïv»ÚÇó²˜8fõÅ ­9nçIè“àqç:ûèc_»«~tfŸ?<ž”´é“ú{ävB!„øÝ.qÁ³Ë‡Å{ú¦ï¾÷ÎÇíÞ?Ø=©<>Ç3`îþÛUµu5<75>/m˜˜è‰ºúÊÛ¿UÍëcõÏO7ÿó*4+Ñãé7ïÄËz·ë¿tÏ Ä<7F>Ë¿ûþýÝüñfÌò÷,IýÇíjŠs?(Zˆ…Go=¯©~ø×æ)©<-}OÅû†úê³>|J𼡸ÑëÚ—¥ûf}ØpDÞ<44>:ÇímÛ0±ß‡…¹G+þ6¯æ¸Ýž>£—<C2A3>¼û²æù<C3A6>ýsó9~Äúï|ÜîʼneÓí¹ôäÍõÿÎP!„â»q»¬ÓoªŠ²x<)³Ž>©s»]ý‹ã³ÿkÌK„í÷Þ7Ô•¬˜MÞ]ñúì¢Oü°Q#= “÷TTŸY˜âñ$Î8òì¿æ½þq»ÜóW>ˆQŸŒ}îËèƒæ]=¿ì·«»¼rbÖoná?bøþö¦Ññßïý{Š­ß‚¢¿ÃúÛí<ññ<1E>÷á½[Ž™5kÞ.qvÁß»4åü£Ï”ý<E2809D>ëW¡o†B!„ßÛÕ6¼|hF²Ç3pÑ©óëÿãvï+vOJðS»?⇬¹†7½½¸| 7ëÐ$Ï3xÅÑ]}<ýæ-Z1Èãñ#Ç튫/,íφ3wìœÕ×ó᩼êbÇíj$²‡¡Þ=x©qlVÆn){_w~qRcïK˜Û}¸<>ú<EFBFBD>?<²ŠœDLÅ·+Y7ÌÏíþóˆá?{Ÿ÷½ÜN!„? Û¡FwwNJôÄIKøŸy»çGf4!95çrR=ž¤ GÇ{’²Š^ÞÞ4*Þ3`Bڇ鼉;ïûlâ¸ÝÅ·¯NÌí‡Ü¥¤ôõÞº}õö?nWw%ð¼<C3B0>§Oæ¡Êæí羪oÄí<)SvœÙ=<3D>üãGo¸ñöo[?âÃfY§í¡½Ú?§x|Ý®ÏôÃÏþ™·Ûæ<C39B>·zà‰æí„BñcºÆscØ¿_'pž·³»“ñC³Ž”¾xóúþÑÄkಿ¼ŽTÿê伿ßkè3uÿ“zïK¯6³7fË_ü<>ÛÕÕ?Þ?¥<>íÈ»aÝÜ®¾ú\NïóvŽÞv?o7eßÃÿ<o—8~õ¹Š×o_?8¹øÃ\rVQu½ó.Å¥º†Úkk?Ì>&Í8ä<38><|ÿË^xâá7•W¶LIþ`<60>>ÏÛÅ_x´ôEÍÒC †Ä7ý“,r;!„B|÷n‡9/ïv»†úª³‡ü×K«žäiûÿ™«¯:j?<?fs)æå<C3A6><C3A5>ó¾Rçû¹]Ãû²-c½;ò¾RÑàr;¼©âð¬žÿ~6%cg©²î®ß{²‰ã6ݨõù}»úÊ£³ð·ø!Ë‹?üI]ɺáñ®Mú$öñ·ïÓÇu žó
›µ“Û !„âGp»²v*ëÃÔ›û÷íÞ><·%kÒ°”Ä„>)ç,;pÓu;Ô~沟««´[^yùmCSn×PwuµwnlÈšk>¹ÝÎ»Ë ;—eŽ˜Ô§OÒà sןôþ¦Þ?û¬.=ºzæØ<C3A6>ýú$$ö9eñ®Ëϼ[ùüvñÛFÅ{<‰“vÞûðÃ*Õ·,ž4$©ObÊðôÅ»Ïîüð[&>ÏÛ-9znóìQ©‰‰Éç®8VVSßxÊí„Bñݹ<C39D>ø[Ô|ߥB!„<>ÛÉí„B!ävr;!„B¹<>B!„<>Û !„BÈí„B!„ÜN!„BÈí„B!„ÜN!„Bn'„B!ävB!„Bn'„B!ävB!„â »ÝB!„â‹ò?v; ²B!Ä—Bn'„B!·“Û !„BÈíävB!„r;!„BB!„<>ÛÉí„B!ävÿv÷oÞ¼ñx<7oÞt§ÄÇÇ_¿~½´´4"""ØKLLL^^Þ£G<C2A3>œÕjjjV­Z×¶mÛÑ£G_»ví3
sÿþ}r^·n]QQQZZÚ¿¯\²š5kOâ¡C‡†úcµÌÌÌ;wî°@<40>×ÖÖê²B!¾¥«ùëZ¿c÷}¹]yyùo¿ýVXXè¤<{öŒ”½{÷³0yòäåË—#^-[¶ìرã«W¯Xçùóç±±±-Z´?~|NNNTTTëÖ­ÏŸ?ÿ©…9rd«V­¶oßN1NŸ>ýïOƨQ£(sII‰“òþýû.]º<>XWW÷µª={ö„††ÎŸ??<<üâÅ‹ºÌ„Bˆoìvnejú7Š¿/·»qãÞsîÜ9'¥¦¦†”üüü7o²ð短[·øxðàAQº¶mÛ:su¨^bbbRR“É»wï>ZÚÚÚ   -[¶ü–Ð2„¬¾¾þSÝnúôéNÊ_ýõ——/_:‰Ÿ”gc43ŸÕ8(ª«²²ò£WTT±2è2B!þWz÷Ñ>ñ}¹ÝÅ‹ñž+W®¸åƒ” 6ܾ}Û­}eee|Ü·oßÇYصk—;Ÿêêêû÷ï³ðêÕ«´´4V ËËË3ƒ>|øŠ+ÆŒŒ~±2‰ `µ–-[9räĉƒ¶¬ÈgÒ¤I¤‡„„DFFnÞ¼ùSÝ®uëÖ(¥<E28098>•¹Ý“'OøxôèÑÞ½{³Â¸<xÀÁÆÅÅ­râ²111( Ý)¾zõ*ëWUUM˜0<CB9C>bÌž=
±<}2AC{õêÅG|÷w/lÂjOŸ>e+»té²cDzš•§]»v¨[ƒ÷&8ufµ3gÎôïßß”®¤¤$<<±v&çbäÈìhĈv?<3F>Ó„[R;vÌdÿþý{÷îÍÊÊêܹ3õàØmAAGM¶S§N-//'åäÉ“)))v²Øctt´[……Bˆ_Yï>ú_ž/·C#ð ÇZ¼óLæv6Q‡¾¬ð¾ðñÑ£GŠ-ÌÚ´i­ZµZ¶lÞÀj‡"1((ˆåîÝ»/Y²$44ã!Ý!çÀ¥V®\Ù¢E s©¨¨(ÒÙ]ÇŽY ŸæÝèÑ£1B¶Ú½{wƒ÷a5²íС)(i~~> <>RaBìËäHIœ?>ÆÆJ‡÷tíÚ¹A•¨.VËÍÍå/¶ZYY0,jùòåìºgÏž|uüøq6Ǩøˆ®­^½šb`ö/*8p c/&qìØ±¤X<C2A4>mÙ²……ׯ_“s<E2809C>=X6 4PF,°[·nK—.<2E><><EFBFBD>¥nKKK·nÝjìÙ³‡}á¸äÌ<C3A4><C38C>H”Ÿ² 6Œ“ÆØ·oßyóæqD¤ß¸
ööí[ò?}ú4Ëö´ŸB!½û¨º}_ng=}YY™“òüùsR>ln‡¨ýæ Ãcœi0P¾BÚìã”)S~ÿý÷ººº6mÚ :ó •AM<41> ÷£~ˆ;b"Ñæê0 ˆ>{yñâ+¬Zµ*//ÏçæoZZÖ’’’‚Ö° œ†lׯ_Ož×¯_§H[¡V³fÍrönfÁ_„288Ý!ýÔ©S¤\ºt‰åÇ<C3A5>{<žË—/7 PZÓVÀçøŠ<C3B8>ë¼°ILLŒé,.K>h(Y!j¨¶×འM-q¬8è—U;%qޱ¶¶ÿcCVcÃ-[Ž9Òt<C392>³cšøæÍwŒŽŽ¶)L3rÎ)ÅHNN6<4E>ã™ÆQŸ,pDÕ©.]ÒB!$v?Þ¼<C39E>½0aúâžÉ»víšsO9C0-T á+Ò1<Ÿù? þrîð8p€<70>XHHHÈ%K,Ñæ½ÈÍîíâ$3¢ÃÂüùóÍ~låQ£F 0ÀçþüóOÖ¡$¸Ô³gÏÜ_á%رcÇX¡   mÛ¶èóñ7?P[SRÔI4h<34>½x<C2BD>9Qr÷ãnv€3<>îÝ»;oé¢n>«õêÕË´ØaàÀ<C3A0>Ô•û¡F³Ló0ÓµéÓ§ó÷ĉîÃD4¯^½ŠÕY>¸²É™±téR[ Ç>|¸3Ûg<C39B>QÚ¤¬9bXX˜M×پܸ !„ß¿{5_Å>uÆî{ÞîÍ7h jeÏZUUUÅÇÇGGG#4¥¥¥ôñî×Wñ¤   W¯^%''wêÔ %²tL(55•œ1-”+;;ÛFVäºhÑ"·¾ 6É·oß>1?ŠÁÂöíÛq$‡˜˜˜~ýúù:ð]L¨gÏždn7ïÞ½kn‡¬P¶¬¬,{KãÎ<C3A3>;ö(aMM ‡ƒR ¬6wî\ocL¨U«VöäG}áÂê'`&F×®]<5D>y;>ʃ®½xñE#süoçÎ<C3A7>dbGÊßmÛ¶ÙVC† éÑ£‡é5êFÚcŽˆ©û0©|JS6ªýµ©¾… ÚQpȬ6tèÐÄÄD«({3æàÁƒŽÛYµØÝjÛ¸Ì_ݺ/„BüRn÷c¿' kÖ¬¡/1bIJe˺t陯ؼ݄ V­Z…4x<>²2_¡,:tÀØ0¡uëÖ¥¤¤`<6·„]±Lnö ˜Íi………™ð™ôÛ¼+lܸ±Á{£ÖÜ…BËH§œö¼<C3B6>ÿ¼] Vݺuc!//<2F>mq#<>?Îò½{÷,XÀBFFGÊaÚ½S¦L¡À(lQQÝ ´mW¬X<C2AC>ô´k×®W¯^”™lñ?œ2`&FçÎ<C3A7>çÌ™cËTQ6m¢¢¢Ö®]KýØä\II‰¹ÝêÕ«GŽÉrqqñ¸qãX 3gÎdaÏž=6™G¥=yò¤¢¢Âq5öNaØ"Ë·gÏžµYIvŠ<10>=ºuëÖ(š½Y2hРåË—S~Ô8p õ?cÆ ÜC#
pèÐ!ÛÜ™›¤`ŠB!~e·kNâwêvõõõ{÷î<C3B7>ŽŽÆc233<33>‡£§ïÞ½;BOß©S§1cÆ=zÔ™-»{÷.bgÓc8„3}U]]<5D>ô` xƒs³2--͹‡Ë¾&NœhËxÆáÇYà/Fb‰ØBI¶ˆ{ÿ¤w)8`3g•••ln?¹G†ˆ)Ã{6lØIñÈsâp<C3A2>3tŠÕ<C5A0>¿˜˜˜ªª*q¯I“&5x#†Â„„„PTÙf}2qöžžžnY·nݲð£*(ÙR›Œ‹‹£>MgmB™Û¶m«={öŒ’˜]ÕÔÔ°¹ûûìèÆŽK&ñññgΜið¾\ÌñZaØ û¥ž‘¶ˆˆÎªGùíõ—çÏŸó-)Ø$[XX{õêUäÏžÌ{úô))8¥¢†Bˆ_Óíþ½\ý<>Ýî£4ýKl_ä·â dháÂ…;wîœ3gúâ¾éù¥øþ¾<C3BE>ýŸ ÿŸ¬ûÔ_òkhÆ<68>bo={ö XÔ/{Ö„Bˆ_Ü20·ûÆ\»vÍãñ´lÙrРA_Cì~6mÚ4jÔ(ÕƒB!·ûߣ‰%!„BÈí~·B!„<>ÛÉí„B!ävB!„Bn'„B!·û»<>B!„øhÞN!„Bóvr;!„B¹<>ÜN!„Bn'„B!ävB!„r;¹<>B!„ÜNn'„BB!„r;!„BB!„<>ÛÉí„B!ävr;!„B¹<>B!„<>Û !„BÈíävB!„r;¹<>B!„ÜNn'„BB!„r;!„B¹<>ÜîÓ¹zõjzzzEE…ÿWÇ<57>ÏÎή¬¬TãB!„Üî{çñãÇS§NýÍKLLÌóçÏÝß^¿~=((ˆ¯BBB¶nÝZ[[«&(„B¹ÝwÊÉ“'Û´#G¾{÷ξ}úôidd¤ûÛ=zhO!„r»ï×í~ócÕªU>¬¨¨HNNöù
¬©©Q+B!„Üî{Q ù­ÙL<C399>:UMP!„r»ï—ìììæ»]QQš B!ävß/·oßn¦Øé†¬B!ävß;OŸ>mÕªUsÜnìØ±jB!„<>Û}a=z´cÇŽüÿæÐ¡CuuuŸšÕ»wïfÏží¯q-Z´ óI6lX}}½š B!äv_´´´€ój'NœhÎæ×¯_ÏËË0aBLLLË-}23f̵kת««Y³²²rþüùîo<C3AE>=ªÛ²B!„<>Û}IºtéÐíÖ­[לÍSSS»ëºpáBŸ™9>N™2ÅgµŽ;>|åÊ•ÿ<>B!„Ü®¹ÔÔÔüË(iÌíÂÃÃß¼yã¿þ<C2BF>;wÛã®]»Ô"…B!·û87nÜÈÌÌü믿|ÒËÊÊ3-<2D>Çã³ò»wï¶nݺpáB»ÇÚ´ÛMž<9`IêêêZ·n-·B!„Üî39uê”ý×-Zlܸñýû÷ÎW§OŸnÌí00çß…5xŸ:t¨}•œœüòå˦Ý.===`aðBŠ!·B!„Üîs8tè<74><C3A8>K¥¥¥½zõНJKKÇ<4B>×ÄÏ”lÚ´éùóç¬Y\\áþ*!!Á¾š7ožÿ+MÜ“=wîœîÉ
!„Bn÷9œ$ëÑ£ÇÀ<C387>›ó+tAAAcÆŒ ˜Ibb¢ÝœÅánݺuâĉüü|÷›999>ïR¼|ù²{÷îߥX±bŃÔ"…B Lqqq3Fø³ÁÉ|~ïäÉ“îÆ<>WRR>}ú´°°°sçÎîo<C3AE>9¢ß@B!„ÜîãÔ××GEEýöõÙ¿¿{¿h\3…rðàÁjB!„<>Û5—éÓ§m±CãnݺåÞéÁƒ¹m->|¨&(„B¹]³¨®®îÕ«×Wu»;vøì´oß¾Íß¼™?<3F>,„B!·ûÀÝ»wCBB¾Ø¥§§û¼*ð×òbbbæ{ñ<C3B1>¶K—.îdB!„<>Û}„'N4­h(WZZÚþýû/^¼xãÆ<C3A3>sçÎmذ!..®é­zôèa?¤â&??ßgµàà`„Ͼ%[ÿ|t[V!„r»OàíÛ·íÛ·oLÑzõêuýúuÿ­Þ¿¿cÇŽ6mÚ4¶á ü·zñâEvv¶û;æÎs„ ÎW}ûö-))QB!„Üî(,,lÌÏrrrþ¼°Ãýû÷=OÀmƒƒƒýçíŒÛ·o4ˆuÖ¬YãóUuuu|||hhèîÝ»ÝÿôâpîÜ9lÒ½ÓçÏŸ÷èÑÙVüÚìÚµëСCfÀö³ÏB!„<>Û}555ˆKJJJc?AÒœgÝÊË˽ۼysmmmÀ­êëëoÞ¼éó4ž<34>>yòäÛŸé<C5B8>;wRfç_¥AII )çÏŸÿ6¸víZ‡fÏž¹mÛ6]{B!„ÜîãÜ¿ùòåãÇ<C3A3>ïÖ­[O˵mÛ¶¢¢¢™yîØ±£‰ß1éÑ£GZZÚÊ•+
¾ñTÜ'a?ÎòôéS'寿þ"åúz;õ±Û/^œ9s†sô¾APÄ?i…fn˲ù}ÀÖòUñ©9ø¬YWWWYYé|©"ý
ø´UˆBn×\¦L™ÒœW\7nÜØü<‘ž={6'ÛsçÎ}·gúøñã”ðÁƒô+XŠŠH¹}ûvƒ÷Ÿ³ÅÅÅ…‡‡O<E280A1>:µ¼¼Ü6©ªªš0aBddäìÙ³YíÞ½{íÛ·
ÂŒÿý÷<EFBFBD><EFBFBD><EFBFBD>mÛ¶¡†7o^·nU”ššj¹5xgéغuëQ£F!”<><><C5A0>åoƒ÷¯±¯Ý»w¯Y³fñâÅVÃË-;v¬ ÄÚµk£¢¢ºtéëo ,  -[¶D¬[µj•œœ\SSp«ÆÊvëÖ­!C†´k×nðàÁ6mIµpì………Î^ØÜÔÖÖCÇŽCCC.\øúõkjãjÓ¦ 5@"ù°£ýû÷ïÝ»7++«sçΓ&MrŠ}äÈìŸs¤dUVVæ<ýI&+V¬ðiiñññìÅIÉÏÏgä°(r×®]9‰|Ë®­öNž<ɨÆþÞ¡C‡¢££©Äþ{
'SÉé£<ïœîðáé޾}û^¸p<C2B8>”ùóç;r*­`¨3fÌàèH±‡Gׯ_oë<6F>çåË—ß¼yÃyiï…Ñ…<C391>ÓÐ7mÚD<C39A>Qf…dš Gaí„2lÙ²…bsN9ÆÄÄÄ8ϰ>{öŒ½wèСwïÞÎCö8ÐnoÞ¼Iå[«£NØöÊ•+<2B>µv7>-ŸF²mi<¸¸¸˜ÝÑh9#4; œ}j,88˜«ƒÊäì ñþ'®±ÆÆ1®^½Ú] ®¸^½zé!įîvãÆ<C3A3>kŽ„Ý½{÷“²%:7'[÷›ß§N<C2A7>
Xfzû?iôâóæÍ £¿qã]g[¢Ëá/éÈĆ XÇþÙÚÒ¥KYmÉ%|¤3£Ÿ£ƒ§Ó¢+zøð!)t<>ô<EFBFBD>t½ôÜtó¬†%Ðy“È2<32>=å¢GŸ9s&)dN9-ZÄ2B“<E28098>û<×HGÞ½{÷•+W®ZµjòäɬLp«€eãxéeé¶éhY<68>öìÙƒÐØ»Ïæv·šrRZú]dˆ®wçÎ<C3A7>x[EE»¦ð¬CÉ)Iee¥½XMT8lØ0¶µ:OJJš8q"b4kÖ¬K—.Ù¯çà@VwîÜq»<71>ûG­ÑÊLiãíÛ·´v‡Ã*Xí@,ØëÛ9ÍÌÌdM{ôUâŒà(8Á^víÚðX¨ êY<zô(…dM³aö¨á£œPê™ôëׇcAkð$²ÂcÈ“KCÂhÉ™¬ìß7Û¬F"£hl>mÚ4«J·¡¹X#À´Iy¨FšMBBå¤AšÏ1®³ÍSRRÈ™<C388>‡Õ6mÏt<C38F>e0`k÷1NŸ<C5B8>ÕÙÕ<C399>¨ÑüXÞ¾};M޽Ӵì'-iÛ•Ê¡%p¦8pÆÒÿÄ5ÖØùü¯š3gÎ8£/!„<>Û}äŸI|ê=A§wùqÝîܹs”½ ûY¾|9½¸õè<C3B5>?Fq““éª<C3A9>‰O„ü„ÞDÖñx<f!<21>=rwÒôÇ|´Î<7F>6ÑïÒ<C3AF>± œƒî¹Áû_}YÁ~†¾Š*²º¢ó£3£ÿFÈø˜——gó@lˆö5xï[µk×®K—.>ÿrKÀœlùìÙ³6]p«€eËÎΦK¶{Ó{÷îµþ;´R<C2B4>>}šð–ÇŒsþüyøˆ© 5n<E28093><4B>à»¶S6::Ú¦XŽ9bû¥×OLL´ÆF4<˰°°<C2B0>m6ÈÁþa<C3BE>Í<E280B9>QìÆŠ<C386>jXƒGp¬öíÛ£n8åA¶†jódÔíܹsñ9Ó£u^ºvíÊy·<79>º<EFBFBD>p#ªˆ¾<C382>$ŠD¥M˜0—b§T^‚Ü[‹â£™ˆ×-JBáI4a¢<>×;Cã/ZO ´Úà/'޲qD6«ºÿ~çw±%ê™6cïHÙ„-ÓŒ™½¸ßa2â<E280B9>©«mÚaÀÖî?
r·ük½Tˆµ*‡j±ÑEB^<5E>+bÁØ­-<qÖhýå§bGG³±°óÍÞvBÈí~`·ŒŒüÔl¯^½ú£»Ý… |ž®³.³´´Ô™3ÃÂÂÂøHÏG_â/Áôvn·3c°[~™™9räȤ¤$K!OVÈÍ͵ÿÃ:iÒ$r^¸p!«9UgŠ`Ö­b?,#> ¥o¶eƒ±"ý·
X6šœ3;bZyùòeÛ
ú÷ïoÊ[·nõ9ÅAAAævv<76>ÛíCh<43>-#Ž6H&H€%ÚiŸ;7»ê€TÙó í6¨ÿ/#:ŰÒ: b Þ7 Ü9Êûü<00>ÉŸûX8ãîñqÞ(÷ù~œÊÍ7³à̪â(#FŒ n äV«?ÿüÓ>ÚQ¸Ÿ2d_8·Í,Žnó—Öt ^´h­”ö‰]Ù{îÖÈßNì.€F[»»¢ü[¾åȈ!ÄøñãY¶Ú8£†Û¡Ú¶°ý8§Ì§±á î5×O½É „¿¢ÛµiÓæSŸeöéAD·³ââb'ÅúÑ7n8½<38>3©FŸšŸŸOßiÏ<69>ÑÛCWμÝáÇÝö‹/¼?%HL×8oÞ<º7³sóHºÆðððªª*þfeeÙ<65>0`ÎW^^n<>ÑG²Ü­[7Ÿ“…<E2809C>%$$زIÉöíÛn°l=zô°i?ŽÑþSGmóvvk<76>²ÅÄÄ`‡©©©§­€‘ÐÙÓ œI«+ÔÄ>²~bb¢ÕrÃS»víJiͬ0VÛÕØýbŸy;§oÖ¬YV€€ÅÀÆÚ·oß»wï©S§rt6 uðàA¬/4ÏkðÞõC—.]Jæ˜XË´šñ?®Ê¸¸8´‰59Yœ pqʃ.£ŒH9½ym74i!œAÎ)u¦¸ŠóN4òGå»Ï&e F 4•£G<C2A3>Zû$…c§ö:tèзoßׯ_[Ó={ö¬m…ôx<žììlÖ¬©©qî“Òêðx÷¿òýl´ÎMˆlíîSàßò­@ÍP“,PÎ;朜Wæ)†3z Ø~kl/æ¬áåT]/f{÷îÝSG%„<>Û}œOý³‡ÚíÌ*Üo{ìÛ·<C39B>”ÊÊJ:ãààà3fÐy÷êÕ†j¤§GøHwˆ*t„6ÿd™lÙ²…<C2B2>ÑÑѹ¹¹äD‡ŠL<C5A0>UçÎ<C3A7>Iä+6·™$§QQQsçÎE¬|úô©=PO7†î°É¨Q£ì¡(þ² ÷<>¤§§;ÍæÐ¡Cv÷3àVË——g<E28094>7aE!!! ûµùBLA1=ržd~×<1E>sæáÌEœ·­m×tØË—/'C¬7²;Ñýû÷_²d ûÊÈÈ <C388>oݺ5n‡Ìœ9‡pÿOa:u{£³·àlâ‡Úó/Ú<>*!”ÁòçQlt™JfMNÁôéÓ333í^$'”¨ùµk×Ú93j>ÇbÆÌ:”<>D>ˆŽ•dÍš5T&.EÛ ÃŽ;Òr-ZÄq\T/~IQ}®Gí‘Ê={ö¸<4F>;w(-;š6m{áÄQÝ»wÇiøöâÅÔ&g³æö.M˜1,±{ýìמtd[Î/FK°t¼7â<37>¶j<C2B6>âqD[»{–ŽîÓòí8
@†h(ËÔ *Å´G <09>ß!Ÿ3g•lËÛ<>åæßØì¡^Úû¥ÈÜÚ<C39C>37,„¿¨ÛÑñ7G¾?ʉ'¾Û3M÷ë~v‡>†þ©¶¶u9r$}3}pUUUaa!kÒ‡¡ƒô¬H‡ïÜ"<22>îÊyü|Û¶mø¤I“èScbbœé=l  ç&gëœðú*û–~n×®]¨°sëÑI#ˆù ^ôt<E2809A>ôs“'OvÈæÍ­ï·ÉHöEÜ*`Ù°+Lˆƒ0`Àõë×±IäïôéÓr³cÇ2¬©©Y¶lYNNNƒ÷I2vG%DDDÐï:?vMí±Éëׯ‰a <0C>œ©.{7´tÒ$"²6iÏW€Æ¹oÚÓW'Ož¼víß–––qŽlþ̧삃²›ìÔäˆ#¼¿éHI8
‡£„aaa7n´;¡Ô§a"ýÀ<C3BD>Κϱ4xñÛãñ`? jåÌ¿Ú]EŒÊþ gÍnõöìÙÓ&±Øõ˜1cœ|Ðyóæ± ÅàtøÏ—S ‘ãš?¾ÝÞ]°`<60>#ÐöB«Mq€ :tèà´<>3Îéc<C3A9>
¡¨4ª´´4ÄËV ÙÍzvM±©ÛÆZ»Ï@ÈÝòY­K—.6,¡&ûõëDz<C387>N†mO<>æí|ô?qŒd6¶³gÏÚyš+ ¾œÊÖØo¤ !įâvååå¹¹¹cÇŽ¥hBˆÔ>Ѽ >zC688˜pOçýCGáÏûÍ-»±[YYé¿9)>O2}íÂølÕtÙ>5ç¦7AЈ€9cfî‡Ììßr|ÞO!~´_¶n}Öăí×s|VûèY¶7ib/M¿Û„Arí‡Q|òùì
ùÆ¿0×ür:<3A>
!„Ü.ØÛíÛ·"²¹sç6'zâŽ;ÌaΜ9—.]zòä‰Ï„Olܸ1 ê1ß·oßOÁ/_¾ŒFûÿ
ݯV¶M6<EFBFBD>5JåkÀŒŠŠ²Ÿ2BñK»<4B>aO%Äy! 1jjjÜ/ñ¹iݺuUU•ÿ&µµµ[¶l ±·5}¦4?~n¯(~³ö%„B¹ÝÏãv¯_¿¶g’™™é¼-èõk×ì·mâ<òåæêÕ«ÑÑÑîÕ²²²Ü¦˜˜˜èó3ß猗B!ävߩە••´\ÇŽ·lÙRZZúêÕ+û<>.\˜;w®ÿ¯|¹¡ä>¿©ÛðÏk>8¯éùÿ?4{Q­P!„r»fQ]]ûÛ×!33ÓçùèçÏŸÛÿðù7´iÛ¶­&LPB!„Ü®Y ^¿}MvîÜé³Sÿɹ&°ÿ˜$„B!·û8ö»ù_•V­Z9¿YjØOª6‡ÈÈHýÞ<C3BD>B!ävÍ¥_¿~¿}}V¬XáÞé«W¯üoËÄç'y…B!ävMqåÊ•6mÚ|U±ŽŽ®¬¬tïtùòåîÂÃ÷nÝzéÒ¥¢¢¢ùó绿jÑ¢…óßB!ävçüùóöo|üß<C3BC>µ©ùQƒƒÓÒÒfÒ½{÷G<C3B7>•••íÞ½ÛþKz·nÝÜo×&$$ø˜å±ÿOïdÞ»woòÇ<08>;¦wf…B!·ûÅÅÅöKÂéééÏŸ?oðþ<ÊäÉ“›»½{÷Ú¿&»uëVÏž=Ý_õêÕëÉ“'|•ššp[îöíÛþåY³fMc»Ûµk—Z¤B!äv3ŒŒ´Â}äÈ÷—4ñ¿bÛ¶mëþgb¯_¿ž3gŽ}5zôhçÿ‰5ævýúõ X˜û÷ïËí„B!·ûW<}úszôèOúƒ3­””ÿ|Ο?<3F>ºÿÑ{cn‡, ÛºoËÊí„B!·ûb`ZŸ¥ƒ¹sç6'‡ÆÜnèС×ò䉿í„B!·ûZÄÇÇ4­mÛ¶5góÂÂÂÌÌÌž={úüôIÛ¶mŸ={æ¿þÁƒåvB!„<>Û}-òóóý‘.<<¼¬¬ì“òy÷î]ee¥ûåŒôôt÷Ý[xüøqXX˜{G!!!IIIsæÌÙ·oß/Ô"…B!·ûŽÀÞܦ8pàÀË—/WWW?yòäÈ#>bwöìYŸÿH+„B!·ûޏsçN3÷xøðájB!„<>Û}×,^¼¸™n×»woMÚ !„Bn÷ýòæÍÐÐÐæÿ˲ââb5A!„BÈí¾SŠŠŠünÙ²eåååwïÞõùÏ0fÌ5A!„BÈí¾S
|^¹4hP]]<5D>}[VVìþ¶sçÎÎÿ·B!„<>Û}w”——<E28094>5ÊÔ­K—.•••îoOœ8a_­]»¶¦¦FMP!„r»ïšúúú³gÏ6,à/äíÞ½{êÔ©>TãB!„ÜN!„BÈí„B!ävr;!„B¹<>ÜN!„Bn'„B!ävB!„Bn'„B!·“Û !„BÈíävB!„r;!„BB!„<>ÛÉí„B!ävr;!„B¹<>B!„<>Û !„B¹<>B!„ÜNn'„B!·“Û !„BÈí„B!„ÜN!„Bn'·B!„<>ÛÉí„B!ävr;!„B¹<>B!„<>Û !„BÈíävB!„r;¹<>B!„ÜN!„BÈí„B!„ÜN¿ !Äç"·BˆïÑíT Bˆo=ävBBÈíävBBÈíävBEg!„<>Û !„Üî§åÝ»wþ‰õõõïß¿Wåñ«»Ý<C2BB>233Ý)¥¥¥±±±UUUjâqåÊ•víÚµlÙ²E\“-½tèÐáÑ£G¶ ³gÏŽŠŠ"‘…'OžX÷Ö¹sgÒËÊÊT™?wtÞ¿×®];vì¸qãFTÆI¯««ëß¿ÿöíÛ¿ ­.99ù÷ß§å¼zõÊC<éСCÄCÖ™?¾µ:#???<<<%%e÷îÝî<?5½¨¨(&&æùóç>»~ûöíÒ¥KiØ4ïÇäháC† iÓ¦ •“<E280A2><E2809C>ÍjN>qqq\5ÁÁÁ¯“ÏÇ9vŽTÍI(züBn———éŽe¤Rˆjâ›ñìÙ³åË—¯\¹rܸq4¿yóæ±¼iÓ¦ÚÚZ¾½víZHHHhhèŒ3æÌ™Cï…Éa{OŸ>eeúK¶ÍÍÍ<C38D>ŽŽnÛ¶myy¹êóg<C3B3>ÎÇŽ#qÒ¤Iééé, =–þæÍ› 6<>ššÚÌMh'[RRÒ h6YYYþX·n ŒsçÎeì1xð`Kß¹s'é„Êádz€ÿ}^:eèÖ­).\pïù;vlëÖ­Ù/{g…ãÇ<C3A3>Û‡« W¯^999v¥˜Æ!v ŠÈÛãˆX¾{÷.é(#ƒV[³f<C2B3>š“<C5A1>ÛýBn·cdžzÎ4¾ÅA¨¬¬üR»`Äé§6A3Wû$šÎó‹ìñóŽŽ:'òRÏŸQ†¯QQ߆<C39F>üÀ<C3BC>4?÷Iuu5Ã<35>Þ½{crrûömzåU«V=xð€•<E282AC>=jé¯^½êÔ©ÓäÉ“×~ÊèL$A¦N<C2A6>jñû™3g²ðúõ먨( \ñññÍÙ&L˜Ð½{÷ššQ¨ððpŸ½ãŒ"¦OŸn<C5B8>öàÁƒIgeLÑÒÉ?cùSÓwíÚåü×Ù³gÝ»>yò¤#|¬yãÆ 2ayíÚµ)W„­Ö·o߉'²€ÿ!¯–ÿË—/Ù–ÌÙ*((Èòg䣿$äv¿<76>Û9r„*°û…ˆˆÂ)„Ââ²eË:vì8~üxÆ…Æ<>[“1â-[,°bèke¢‰Œ)/]ºÔµkתª*6¡«&ËU¿}ûöÎ<C3B6>;¬`»£ÿ&¶Ò=³\RRB†­Zµ"+h/^¾|¹85zôhzô=z°kRø’-»xöìÙìÙ³éû)€Çã¡¿wÝ’%KˆõÎm+W®<57>ƒEF„] Ì )¦Gè¤Ì7oÞŒ‰‰aG÷ïßgáêÕ«VBÄl¾bÅ
熵O&÷îÝkß¾=ñ”î„ò„„„lÛ¶<C39B>Õ<EFBFBD>
Ib—.]<5D>ivAµ³•…ÝvíÚQ½Ö—P€ö^èHX<48>ª°/`µÍ†”<E280A0>]P?6§åæôéÓTB‡˜a…d¼Îš¦œÍ±cÇrZW®\yøða:LˆÃ1³¯««³žƒBÒX=sºSRR¬Ï ¢££I¸¦› PB»ÁÊ9MNN¦åtS*Òcccɪ±¹{÷nÖ}‹ÊÆœ}÷j<C3B7>ïÞ½ëLiØ1&$$ 0@qí§ŒÎ\È4þsçαŒ¸ðíúõëÍ~òóóI3f í¿9—$ ˆ ò‡lÞ¼Ù†/^¼àBàÂä"% <20>ÏŸþi«íÙ³‡<C2B3>4ÅOM''NðñÌ™3î]#ÄÉòòr.4b<EFBFBD>s¿8//<2F>Ê®]»F<C2BB>ÉÉÉ!<21>ÈÌòºuëÊÊÊöíÛG†\¹lEÔ5ÃãÚWsr»_Èíˆ)T<>͈Ì7Ï
>è&-Z„ðßb<C39F>óçÏÛÜ>:…0ÙÊæNF<4E>…WÙý\Vôß6m¢k'€òˆ„$¾º~ýºÍ¾°ŒÖ¤øí@•Ô²÷[·n :tÈ<74>!VÈ¥K—âIÄ8Ö§Sg<53>& äCD¦ÌYYY¬C¿N¢ p JE
r` ý|$üRYÀüÈc³¡°ÝÓ™?>Å`<60>ˆŒí!©¸KEE¡“Á1;b×&õ㟠ÕH&T#é¨*E"°²yçÎ<C3A7>{ö쉮­^½š£CUm_Ô-±Ü°1” #z°j$Û­[·²@>T ÕuêÔ)>²/ëä3kÖ,÷©´D! ÷tBxF…§¦¦bc3gÎä[öËé3Y¤z­¨$²9§å´´´ŒŒ NRk}‰&Lj#ËtH×t—ßÅÚí¼Ož<™•9ÅýúõÃSÙ„NVÑØ<C391>SÌp»=cƒ€+#Ó¬<bÄvdÏG†Šk?kt¶qA€qBæó˜m×ÌMê½.¸F‡\¾|¹‰’ vΕbñÁyj…¡¬…ÇOM·<4D>Ä: ƒîÝQN.aJe—*%7Ť´\AÎl_hh(—€î¤ Ýa<C39D>Ë<EFBFBD>¢æ$äv¿<76>Û™8lväðáÃÄ/Â
šBD°X† v³lÚ´iôåtÒNlzüø±ó ²ú˜À¡A¨­fwÌNì&šI!û%n¢¨¢C'Í~³³³é°‰h€Á(+ 2öÌJee%>g!Œ2<C592>žkKx'ÑÐ}×o„ ¬ÆPžD ©6€¦üHƒ`öˆ!XXXÈú¦2¿„WŽ9³IDÜÎ †Í‘]j¬±Lˆ³îGjð9>"(ë¼° ¸ïß¿O<C2BF>B×BVT8ÇbÃk<µå\#ǬöúõkËŠý&&&Z_EVT¢æ,E:~ü8][Y°yófìã±gn(*«Ù\Wzzº=<3D>MÁÂÂÂ( Ugu….Sù¨!9°2Èî¦L™b<E284A2>PÀ5Ý<35>
76l˜-Ÿ={­ìx±CRªªªh`<60>M$øÏÛeffRcWƹYÙf@ÃÃÃ9L¡?qt&nÐäh´þïÍp½û»]ÐnGŽÉuç ÿƒ<>œM¨Óäl<C3A4>Iܳ¯lŒJXøÔtûxóæM·ã²"qΜ9\ûŒhÛö¨Ÿ½/B<>¹¾H$@1Ö²kŸ²ñá+a<>¤4À¹`…<>Ûý*nG_h%((ÈžØÀo¢¢¢l>Ï}# ¥pÆ…„gjý«GQ§N<C2A7> Îšt·Nxåã#GÐD´ “[¸p!)ûöí³W#Ýää䨔›<>¿ãÇ<C3A3>·Ù ëjÛ¶-E"œÏ8Þ±ÀäädÛy†qÄáœD$`J:vHå¸sf×<66>]@Ý|VëÕ«×þýûÝ)È<> ±ñí`íQn£b”ßî"9£»_ìP^^î~ˆ§ër>šZUWW³ŒÿÙ&6ÉjÞLžÎDrÉò-[žÿ5ÝpŠ©m·ÓÛir¦÷† »7ávî×´­kô™ç£P«j*S¿ûðDgšAdddhh¨ ºüÝÎ?B6¶ <>÷îÝpï\q´çá6£.œëׯ³•3аñ*Žõ©éöÑîûÜ“0`2ê¼ëLŸÛ3%×uïÞÝ~å`ÆŒ¨žé#¡ ½s¿*Û鞬PôøµÜκ^ÑÄf_Pü¦¤¤Ä¹q@ˆa¡¶¶¶M6DÂP‡úöíkCÃ/:Aˆ‰ŽŽ¶·énܸ±(föwIÓ§OGÅlº…¾œƒŠÃ`è¡éÔ.…ÎX¶Ù#³éFfVVõ»víêãv$FDDPlÛÐ^”£TlÈq9ų°Ëác$hbnn.«Í<C2AB>;×6aFé©©6#ˆÔâ4”3`&μGa1<>zxñâ…Õ¬Y³<59>*;³={>Ïì§G<C2A7>Ó<>Y1ŽŽ#2<>±¯Üï˜=svP(ú3ª—³»·†óËY&<26>*u?[Íéf{F¿ä,XÀ²ûqoú ÓtÖ¦!ý×ô©ö„„[>~ü8ëØÍeë\)% øZbÃ?O#¹Ýîùóç4<\ßéêPðàà`*Vf²_!:£Y„<>Ï×ãÆ<C3A3>sÞG7±Ç?œëÔZ+8£ “°pRˆ λ hß{ù¤tw¶>óÍvÝYP¥Ùã ö¡]õÎÕ1sæL{w„pÁåÉú ÎÝ/Oè]
¡èñ˹<EFBFBD><EFBFBD>­óD|aa!)øQ%ÊÎζǿ°=†‰¸Žù¾Â(™~šŽ<$$Ħdìö.b3Cè£Ï   ÂYûöí Oîù6aµíÛ·[÷Ÿ0Âf”IaØÐÖ´Ù#ûÛ¯_?²5·»páãÜn`/˜œÏÙZ@¤$—/_¶­LJ2220BŠ—””ÄÊS¦L!”Ÿ>}º¨¨ÈÖyyy,¬X±ÂR† ““ƒU<C692>mƒ÷<C692>ÿLLþl†ÒQ.Ô„h»víZ{j‡a·©3n‡*ÙÔZqq±ý¨Űgãöxq¿³lOøõïßÉ%Ô9»vl]]]‡‰•†……!©H6
e¿qÃrçÎ<EFBFBD>ñ0ó!Ž”ê"*¡§´éR{Â’
7#·÷]Ìí \Ó]ôôt§¡Z+--µ{Ü‹-<x0g­±îyïÞ½¬ï¾×ÜðÏO<PxªšÓ<C5A1>ãÒ[ß¿í³IG²_!:ÛMÞj/\×D÷mÖÑ£G;ÆMob/“ÆÆÆ®Y³fÕªUD..Ÿ"±Q
<EFBFBD>ŽöL8â*æâ²˜ì Nœ™¿OMoð¾¢ä~üΉ<C38E>¸×˼yó,Îs,\¼ÄdF}¸£_.
Æf¤ÿõ×_6ý¿råJj€å7oZV¥ÝîPsr»_ÈígqqqίK4xŸOÇáï2:$¢¡ »<>G`rî °!AŠ~Úyz}ëÖ­ö€ÿСCí%¢CD#H^<5E>'N Æ—½{÷>uê” %æ‡Õžl´ºÿ~ç¶<C3A7>ÝQå/Ja÷+**<2A>HÂ"ý½=Ml
8}út÷.Ù˜žŠóQH¶%:ó "Ê#=öûOž<!Cmˆ ÉÜÞó¥?°»±DgÊÆ<C38A>p€&²þ™8SìÎ}èÖ­[<1C>ƒlY93Ç¢-p“-¡MÄ̶mÛÆj ½Ìá„éÍ7Ü©s¤Í¹[ä€~Y5ÒÉÙMLŠíH']ûBªØibb"îξ8ÅvÏ—BrÔ(8§˜C£Þ&OžŒàRÃöô<1B>„¾<E2809E>š¸¦»ÒÆ Þw“9Ëì½Ûíéž={úôdn8û”ÍyµÙ<C2B5>MPjªšýN6ÍŽŽ&ÄÑ1ÒP û¢3^EL ys)!÷\4`·µ°lo…ÓJ‰\MlÂ¥mé¡¡¡¤Ó´2\bζv-cQ 2ÛµkGôs&ÌX<C38C>A ƒ%F,v©~^zƒ÷V/ñÖ~£›±–óã\tD3BÁ AƒÜ<C692>rI2„æ(ˆ Ä[ç<>‰³gϲ&<>á=øëì:55Õ¬r»_Åíþ%÷C»ÿ>·o_þo‰ÏjDs:ÿŰ¥¦3d“€ÿnÈ-ÍM—„ÎÌ~:ÁGͯ<C38D>Ï«:iûÔªþqÛO|íèì ÿ<1F>ûÛþK222|î) !ävB4#FøÜEâgr»€ïß|ƒmÿ ŒÙ"##}î<!ävB!·ûðÛºuë¾ý¶ÿ†úúúeËé" BEg!„<>Û !„ÜN¡è!·B¹<>Bn'·B¹<>Bn'·BüÚÑY!>¹<>B!Ä/ŠÜN!„Bn'·B!„<>ÛÉí„B!ävB!„Bn'„B!·“Û !„BÈíävB!„r;!„BBˆý°¾Bÿ—B!~*·S%!¾Aô<41>Û !„ÜN!·“Û !„ÜN!·“Û !<14>Bn'„r»ÿïÞ½óO|ÿþ}}}½Î©r»oávÈÌÌt§”ÆÆÆVUU©qˆ7o<ÏÍ7Ý)ñññׯ_¿víZXXXHHH«V­"##—-[V^^në<zôhÀ€={ö ¥Ñ®Y³FíöçŽÎÕÕÕœåðððN<C3B0>:­_¿þíÛ·ÎWùùù¤§¤¤ìÞ½Û±(ZÑìÙ³#""† V\\ìn]ÓÉpÉ%íÛ·ïÕ«×Ù³gŠu.]J¤}8&WVV6dÈ<64>6mÚPìììl+J·aÃJÛ¢E®]»Ò˜<C392>|>|HÊ•+Wt¢…<C2A2>Û}a·ËËË£¿t.wÔ8Ä7]£Õ:)Ïž=#eïÞ½{öìaaîܹ¹¹¹Ó§OGãZ·n]RRÂ:'Ožä«‰'®^½:++«]»v\ t۪ϟ2:clƒ BÒÓÓ322X@ïì«<C3AC>;w²2±køðá,:tÈÒi´qãÆ%$$¡_M¤“ÿüùó³ àˆ¬àYgìØ±|Eƒìß¿?û:~ü¸ 3h™aNNÙ’¾ÿ~Ò1EÊ9sæÌ9sætëÖ­sçÎæ|ÏŸ?OKKc5TU'Z¹Ý;v´¥³<C2A5>ÇŽ³†©¬¬üR»`\ÛÌ›_ãžEÓy~=~ÞÑQçÄwêù3ÊðãÞÜi¬ä7nÜ Õ<C2A0>;wÎI©©©!%??Ÿ>ÒÝ «««;uêôòåËÇ»Ç!–ÉîÝ»×~Êè|íÚ5Ç™`ÆŒ¸Tƒw.<<á³Ö5uêT,Šå[·n9í£b<>±ÜXúÍ7Iß·o_ƒwRÍ툸5fšœ<C5A1>%Ö®]´Õúöí>¾zõ
qÄ;-æÍ¶·oßf+Ò-Ò2bщBn÷…ÝîÈ#T1ˆe:ˈˆˆàà`RR8Ù²eË:vì8~üø¢¢"ÃbB­ÉøxË-,¿~ýš@öûï¿3E‰¶—.]êÚµkUU8p€<70>G¨Ý°aaôÎ<C3B4>;¬`»{òäI÷îÝ<xÀrII ¶jÕŠ¬,n.^¼xùòåVÈ]»v<C2BB>˜Ø£GvM
1—lÙųgÏfÏžMt¦<1E>gÕªUî£cÐïܸ¹rå
9Xü=zôhïÞ½mìN0­¸¸84e&ÄÇÄİ£û÷ï³põêU+aRR¯X±Â¹ñç“ɽ{÷Ú·oOÔnÛ¶-å Ù¶m«=}ú”BØ¥Kdš]PíleÁ½]»vT¯uQ ½—ƒ²Ua·xÀj )» ~jkk}ÎæéÓ§©„:ÐíY!׬YÚ¦œÍ±cÇrZW®\‰Mš4 CâpÌìëêꬢ<7F>ô7VϜë2©<32>èèhÒ®éfÁ<>ÆÐ¢E Îirr2¢Æé¦T¤ÇÆÆÚ¬/rŒîûS”Šš<>5Q÷ Šõñ”Í´ïñãÇ–Î!³ÇuëÖ)®ý”Ñ™+7//Ï.g" — í™e®PÖüóÏ?m5è½{÷îæÍ<C38D>à\,4^VVF´QÄöíÛY‡féS$ V^^Î%@r2¡`´=.sÚ0í“Ë?''‡o §\5{÷î%>Ì7<E280BA>uˆ¤Ó°Íð¸*u¢…<C2A2>Û}a·;sæ U@¸a™Ðƒgk@ô¬‹-Â?øˆo±Îùóçí:…0•ì9bé£F<C2A3>«ì~î‰'øKÿ½iÓ&ºvL¯È
G$ðñÕõë×ÙWc­!ò-aUbÌÍÞX:tÈ<74>!VÈ¥K—âIDRÖôè{4%ŸAƒQ欬,ÖIHH Ñ}KŽRrìØ1û8fÌ>ÁóóóYÀüÈÄùóçS è0°=$w©¨¨ X÷ïߟ±k“úñÏ„j$ªtT•"¾Ù¼sçÎ={öD×V¯^ÍÑ¡ª¶/ê–ÜèZP.$ŒDêÁªl·nÝÊùP<C3B9>TשS§øÈ¾&NœH>³fÍrŸJ;AN…n<E280A6>£Â‰SSS±±™3gš*Ù½N z­¨$²9§å´´4º:NRk=‰Ö›"Ž,Ó§\Ó]|k·ó>yòdVæ÷ë×OeºFZ…óÌœ»rŒî>+ÛñãÇYÀ³}¦ôè¡©RèPÙ§Åwßw?kt~þü¹E6ÄrÛ?‰¯æÌ™ÃðÃÙÊ3Wzcé6¢°K‰†=räHÿifƺ\\Œ[ì""-60£m;?ˆÊHÏ-Ä.'<27>VêÎ<C3AA> <0B>«['Z¹Ýv;“Ý<E2809C>=|ø0Žà…¦×Ç Ž°Â´iÓèËé¤ÙÐrxüø±sóY!æšÀÅ£J¶šÝË0;!;RÈ~íÑTÑ¡“f¿ÙÙÙ#FŒ nR€uëÖ±*c<>Ô0ªÆç,PRÒsss-ã<>Ä\w8ž0a«y<-âÛøžò#m µÙ#†ä<éeQžbó— α g6‰ˆÛ™Á°9²K<C2B2>5 öé¾›ƒÏ™¬óÂ&TàŽ;ÌW._¾Œ~뱯 ÏCm9×È1«½~ýÚ²b¿‰‰‰Öý<C396>…¨9KÐ z8¶²nûÁnq{²‡¢²ÚÝ»wYNOO·gÀ)XXX%¡ê¬¡®Ðe*…²<0E>ÝM™2Å\<àšîF…Ïž=ËVv¼Ø¡Í®ÑÀ|¦+¬y¸µŒþÛ¤µLß5ì~­È¦ôlÂ˜Š¥É¡ž
j?}t¦éNŸ><3E>öÏ8‡<38><EFBFBD>úœé[4r<34>Ò¶c8[1¦²éºÆÒíã¹sç!0qn°º¡Á³2vÈUɈ%<<|ðàÁ$Vq ÓòI$tXS´û°Œ:X<>3f¸ss.%!„ÜîKb¡‡p6iÒ$zkü&**ÊÅî<11>QrEE…37FÈëÔ©=´³&Va«™ÉÑ£‰h&·páB{º…€èóoàrrrlÊÍ<C38A>òÇßñãÇÛl<C39B>ÍuµmÛ"Òà>:s³ÀäädÛy†qÄáœD$<>M:vHå¸s¶Û3qË. n>«õêÕËn&: C&ÄÎ}%;XŒÊ™‰¤?£üÔ›{rÂî;”——[Ge â#GŽt>šZÑc±ŒÿÙ&6ÉjÞl³ ö4rÉò-[žÿ5ÝpŠ©m·´ÙirºÏ!C†àîîMŠ<E280B9>lÝ3yÔ³=T‡1;_™Òq°6¥‡­ê×%~…èÌHÆip7].œëׯ»Ö´$j•ŸŸÏ%óâÅ 7e$Ì2´0˜<71>u&¶m
Ù®_ʉ;fff'E¬ÎŸ°™~÷Œ5n§{²BÈí¾¼ÛY×J̲Ù¢'‘®¤¤Ä”Ȭ‚ÂS6mÒévèСoß¾6ŸdOJ™d0*<2A>ŽŽ~úô©=¿qãFb¨<62>_­?¦«&ð1æFÅì<C385>³Ý»wsPqqq úXUUE_Î.…4Y¶Ù#³éFbzVV$!õ»víêãv$^)¶mÈßJņ™S<ë8|ŒMÌÍ͵3mÖ3fLjjªE¤§±G»ü3qæí8
ûȸœÞÂ飩:ëfÍš…TÙ!˜íÙóyf?=zô°žÃ™ãè8"›·³¯ì~<7E>Ûž9;(ýÕK<C395>ÙÝ[
Ãùå,“N•ºŸàæt³†mÝ$Ǹ`Áíit3El•Ã4<C383>µiHÿ5}ª=!!ÁM¿ìæ²MR<JâssгO«s¦`©ÞøøxÚkÆÎ‘²ÀÙ6l_YëÕ\Ý/<12>ít;er±˜¸Æ¹H<C2B9>w)ahƒLÚž5°Î<C2B0>;Ïœ9³Áû\]ÀôÒÒR®š¤¤$Gûü±+ÂÂÃ?~Îõè<‰K†4`®w÷ÌÜýû÷YÇýÓ*z—B¹ÝWq;»<>A¶Îñ………¤ÝèžéD³³³íñ/l<>Á(®c>‡¯L˜0<CB9C>~šŽ<$$ĦdªÆÄÄØãP6m"n2Æ
"Ú¶oßž è¼<C3A8>k}<«m߾ݺÿ””\$22hHaØÚÖ´Ù#ûÛ¯_?²5·»pá±Ø <09>ìÅÞsO ‘­…]JrùòeÛʤ$###¤xDsVž2e
súô颢"3†¼¼<V¬Xa)øDNNNpp°=Á0“†îâpŽráÄQQQk×®¥06¸7uÆíP%Z+..¶ŸN ölÜ/îWDmÜß¿ÿ%KPçìÚ}°uuuôp&V†¤"ÙöZƒ÷}ú0<ŒÜÈ„#¥ºÈ‡Ãa<C383>
G­p).µ',©p3r»ê¼ÁpMwIÒÓÓ<C393>†j Œ^Óîq/Z´hðàÁœ5÷”°±fÍÖ1bõiÍÆtyïÞ½¤/\¸<>træÀiv3ÚæöPm²_!:Xhá´í9sæØÌý´iÓì+»qÏHÆ®JÚŒ¥s-OhçÇw·º€éË—/gÛyóæ­ZµŠÖÈГóñ<¢ÒFKf5.yç .+¢%ã1\<5C>q)×£¦ï³ìˆKŒt.@Öq†jöD©Ïë_B¹Ýщ³w)Œ{÷îápÕÕÕŒAíç= Xv;<3B>¸éÜ,((`Cb(ñÀ<C3B1>ÈPØð:t¨Ý Dt¸„BTÀy Æ`ÔÛ»wïS§N™Pb~A<ÒÆÄû÷ïwnÛÙUþ¢v/¸¢¢‰Ä<E280B0><C384>{fÙpúôéî]X1?¢3ÎG!Ùià/„ð!=a÷É“'ÄY"5.e5@æöž/îewcé<(šÈúgb;¥êØ<C3AA>ÍQȇ [1Èuì kúªÑº²¥ÃÀiè½¶mÛÆj ½Ìát7o¦{ Î6ÿç<C3BF>Ð/«ÆÑ£GÛ­ŠíHgYYû¢c§‰‰‰öË^œb»çK!9jœSÌ¡Qo“'OFp©a»?E#‰<><E280B0>¥æ®é.´1@ƒ÷ÝdÎ2»`ïv{ºgÏžÎÚn8:š§¸]»v œwiñB{Y˜¿´ Ïi®H'UÚØí3ñóEçû÷ïsrí0X"Ú8¯ŠÓxE O !ìÚqæƒi¥¡¡¡´ç<>‡ÆÒÉœXÇuÊõÅUfï¼Û t^Û§½g¸H ä¼§Õà}u—vË&\³”Í.+.ë…Ð<E280A6><C390>º<C2BA>B¦¦¦ZBÈí¾#OΓþ_$·o_þo‰Ïj<C38F>=¢grOd:ÓoMgÈ&ÿ©‘[š›. ]ZNNNÀ7¿B>¯êÜÿHà“jXOÔ):ÿÉÈÈp3BÈí~r·?"#FŒð¹*„Ü®‰ÑTdd¤Ï=!„ÜNn'„?¤ÛÕ××/[¶L¿(„ÜNn'„?ƒÛ !ävr;!„<>Û !ävr;!„<>Û !ävB¡è,„r;!„øÞ£³B|r;!„Bˆ_¹<>B!„ÜNn'„B!·“Û !„BÈí„B!„ÜN!„Bn'·B!„<>ÛÉí„B!ävBñ³£_Bè·â§r;UâD¹<>BÈí„r;¹<>BÈí„r;¹<>BÑY!ävŸL}}½ZƒBnçÏ»wït:„<>Ûý`n·nÝ:{¯¤E-[¶8pà<70>Ë233ïܹãG<C2A3>jkk}¾MKKkÕªU×®]_¼xÁ
 èÙ³ghhhllìš5kªªªtñ£Dç‡r-_¹r…åÊÊÊÙ³g·oßž”%KܸqÃÖyûö-IïÕ«×Ù³g;aÂçã<C3A7>ºtéÒ©S§-[¶TWW[bYYÙ<59>!CÚ´iCI²³³É¶‰Â8¼yó†REDD ¸¸Øg“ÂÂÂ'NØr]]]ÿþý·oßî{éÒ¥aaañññJ!ävÿЬ¬¬ÈÈÈÝ^-[F¥”——ÿ@gqÏž=¸ÚüùóÃÃÃ/^¼èóí±cÇ8¢©S§¾ÿþäÉ“,Oœ8qõêÕu»ví¨Rb±®!¾ÿèüüùs†j¤3*c/X°`úôé$ÆÄÄ4xoA
2ÒSRRZ·n<C2B7><6E>¹3!œ;wŽñ˜Æmݺ•eT/##ƒñ-Ú@‘¨‚æääŒöïßßXaÜé„vÊ& AAA¢óeÆ8çÎ<C3A7>k
¸6OMMµb<C2B5>; ùá#ýøñãjBÈí>†°<16>1¨¿Û¹ïزüêÕ«'Ožø+ß®¨¨(**"Ú¸ýûŽh×®],>|˜e'Ö3Ðç#FûU™îw ñï£3W+ªdwYçÏŸgáСCö-ÆÐŽ…7o¾oß¾:{cÒ¤IÎ/`½xñâñãLj ãg÷ï߯¬¬daíÚµQQQÎ^ß¾}‘¶Æ
ã¤ßºuË )oß¾eÌl&gœ9s†o_¿~Mæ¶9†ÊW6ì¼páE òטS¹Ý¿<C2BF>i\\œ-ÿõ×_T
ªd<1F>9Ò£G¢ØâÅ‹t2eÜi!‰!æŠ+lµáÇ3&ZxºvíÚæÍ×­[׳gO¦·oß¶5Ÿ>}:{öì¶mÛvéÒeÇŽD1Ãk ò‰ŽŽ&:³SÆÍ¤[ñÎK—. £mw±
F<EFBFBD>E¸d˜kJÇæÄw«{5·ãvŒ¼Y&šÛWUUU Ó)¤<C2A4><7F>É<EFBFBD>!CÚµk7xð`z'<27>¸ß­<><C2B7>Ÿm qÜ•+Wb<57>ô<19>:u¢N¿<zôhïÞ½mÿàÁK¤§á“““9üºº:]„B4':3¤Ü°aƒIÕ²eËöìÙÃ
2¼s`$rµ6xo¤FDD˜Ÿmß¾<C39F>u|æòr Úƒ( üð0îܹC¼ât~yyy\à+†»D³ßÿ<7F>8ÙXaœt2!7¾µ<C2BE>:tp¾å#JGÄ ÜåççÐÆŒãñxø*===eP<65>SR<'!„Üî3™:u*ffË6ow÷î]O<E28093>:ÅrRRVÂܬY³p,Rׯg+‹‰>ôeìØ±¨ ‰¬‰-Y²„o ˆ¾ØØX”0úòåËÎ<C38B>;c{\½z5k¢\vcže9}ú4Ë|ËßË—/~™™ñ—5ÝÅ&gÜ[¶lá+ÆÁX FÈ2±Û½;%qçÎ<C3A7>,[ÎÄëU«VÙ<56>&Ê· .Ä,Ù„ŽÄ=òæ0—/_Þ²eKÊðìÙ3“]\pÞ¼yN9‰Ý,SDjêÐæltž™™i“>ws„<1F>ÎŒ!—.]jŠ« ±³hÃ5k+ØàŠ!qiäÈ'ÎÑ86!¼ ¸<>ÝCV{HŽlQ1g†<67>ÌïÝ»×Xaœ<61>sæÌaÔê|´àf“"2'ò¸7OKKcøÇBÇŽ)%±Ý‰i«Bn÷9øºuë¶xñbûxûöm*åúõë ÞÛ‰‰‰(æÅì>Haa!öfOæaí¡•+W2â$r±Zvvö´iÓøÖ¦ÐP%4Ž`ŠÏ™Z­óÒµkWÌÉFºlKÊ”)SXÞ»w¯­ÆÐÙöBoÛ¶í„ ¶nÝÊjöð2eÆGó*@IýÝŽ½Û4¤…ob({Gïì% FÒì”âåææ>}ú”ò³ |e…qîÛZ—PYYI½qP/l¾k7©)vXXqïd‡†[½14:t¨u6|å¾_#„hNtæâE§¸ˆ,\Ø“s!!!vOÖ8wîö~ýú97Us;£²&×ìÇHV¯^½²¸Æ‡ FÎÁÁÁ+ÆùÈåß½{wç£E'„cŒgƒa÷æÄ4s»víÚñ-jÈ0•Ñ2{<x°Ú€r»Ï¤¬¬ŒZpnwÚ*8¦B\ÃØ,ÝfìÌ<C3AC>ˆž˜«ùü·œœÓ8çžclllffæèÑ£}ÖÄuÌíÜØ]7 ###Ý)Û¶m[´he¯JØì<C398>=Rí¼†fX·;~ü¸ÍJú åŸ={F@ç+",£vêÙ ¬ö¸´M"ÚǨ¨(6ûö­ŒÎƒ…M
ì<EFBFBD><EFBFBD>G<EFBFBD>õÿ÷v !>Ûíì6¨½Å`<60>±(RÕ£G[<5B>D„<44>«˜!_c™ÛíZÜÎnÎ:<3A>Lp¥Û<C2A5>ÕæøÿüóO¬‰ÂŒB‰‡/^¼°<C2BC>´h3dÈÿŽÛY›téâ<Äì¾›!„<>Û}2¨UëÖ­<C396>Ñ­
ÂÄr×®]Q·³Xc/à=„°õë×Û-WJ÷æÍÖ$V>|˜[ßb
gbM¸Ä\Â(+ÔÖÖbЬ`CÛÇ<C39B>×°:óv………u^Xf_Xà˜1cÔ²Ú¬Y³(óŒ3Ýb¥¬@„exmžZPPàïvöCvK4àø9ÏÉÑI<C391>™®Ý%±
¡<EFBFBD>îµk×:E=˜ä9ÏS#¬CIø••EiÉ=RN¹mÛ¶ÎM™ÝvâS£³Ïë FzzzBB ¥¥¥‡¤¤$G°Âà<C382>|šÚ<C5A1>
glÆåÉ%O³æüFÒÌ™3í¥‡¦ c!hëÖ­ Þ»º<C2BB>;wfC¹Ò  ŸÍíuZg†ïêÕ« ÞÛƒ ²çð„r»O¦²²-ŠŠB§öïßÏPÕæ¦OŸŽ²Øcýû÷_²dIHHHFFA‡¸‰Û1Ø%f!j,ØdXJJ
ËDF"¦M¤EGGøD ÅêÚ´iÃîÐ#Ö·a±ÍÚ¸ÙÜÎn^<5E>nCsÉ™L”«W¯ž;w.¦Hì?~DD„=vc·A+**s°âC±1{ZÎçe òòò졺öíÛsàhe·nÝ=z4{ölÒqJ:€œœ»knGàf}**88˜2Y°`éTRËáÓÙØ8žú¡z333M u
Ñüè\__OºÏSk0bÄB Ë—/g…yóæ±Îš5k6n܈6áyXšû…YûÝbÚu=yòd¤Ÿ3gŽÅF†Ž óˆ`“&M²§J¼O!;“|Naì¡Fž$ ¸Æ Ç'ZÚkd;wît¿¡ï0zôèäädÚOºPrb…Íý« !·ûp¬ßáâÅD®Í7àˆPYYY6·7dÈ[E#¨Ù]ƒÂÂBF™ö»Ç6ô´a11ñ÷ß<C39F>‰‰±—g¼ïŸŽ9)D˜ðHvqçÎÌÉîž<}ú466±oÏž=/]ºdÑ•<yò$!Û¬±ý© ÙÄâgÏž¿=þ\SSC¶%%%îc4‰DÑL.Y¡‰;5šÐÌQ0àúõë÷îÝCRí½<
Ã
6—IÜOLL´Ÿ³¢Ÿ°/¨««³[ÉmÛ¶ÅölŠŽœ©sÊ€ŒÒëèçI…øT·KMMõy¦²³³mþìþýû™]žÄ.†g\•çÎ<C3A7># 9OÃÙ³gûõëgíª$°ôîÝa¤ó$ ¡‰1wíÚ´ëšðE¸ó) !…ÀeÎÇj+W® %\Û-]`¬;eÊÿÃ!”9Ï:“ £>"ªBn÷ 0ÖlÓ¦<C393>Ý7„z/6ûåØénaL
(%î‡Øì¾ª½sÐôšÍ‡­>C†ØÊí36t´_‡ÁäœÜlÊ%ŽÛï#|ÁƒBÑY• „<>Û}2·oßfÜé#L¯_¿Žˆˆp~‘îó¸|ùrçÎ<C3A7>_¾|ùÓ´•ššš<C5A1>;wºëêÞ½{­[·¾{÷îˆ#—ërBn'„<>Ûý<C39B>Ý®1üÿ»ƒˆ~;^¹<>Bn÷¸<>BÈí„r;¹<>BÈí„r;¹<>BÈí„r;!„PtB¹<>ÑY!>¹<>B!Ä/ŠÜN!„Bn'·B!„<>ÛÉí„B!ävB!„Bn'„B!·“Û !„BÈíävB!„r;!„BB!„ß—Û !„Bˆ/ˆæí„B!4o'·B!„<>ÛÉí„B!ävB!„Bn'„B!·“Û !„BÈíävB!„r;!„BB!„<>ÉÉí„B!~x±“Û !„´b'·B!„øyÄNn'„Bñóˆ<C3B3>ÜN!„âÇ»¦?Êí„B!~$±“Û !„Büœb'·B!„øyÄNn'„Bñ³Y ÜN!„Bn'·B!„<>ÛÉí„B!ävB!„Bn'„B!·ûfn'„B!¾ ÿK·B!„ßr;!„B¹<>B!„<>Û !„B¹<>øÿvë@@<40>¿õ
Enàv¸n€Ûàvn€Ûàv¸€Ûàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸€Ûàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸€Ûàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸€Ûàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸€Ûàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸nàv¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸n€Û¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸n€Û¸n€Ûàvn€Ûàv¸nàv¸n€Û¸n€Ûàv¸€Ûàv¸n€Û¸n€Ûðè"P9
endstream
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F7 8 0 R
>>
/XObject <<
/I1 9 0 R
>>
/ExtGState <<
/GS0 7 0 R
>>
/ColorSpace <<
>>
/Properties <</OC1 5 0 R /OC2 6 0 R>>
>>
endobj
10 0 obj
<</Title <FEFF004E006500770020004D006F0063006B0075007000200031>
/Parent 11 0 R
/C [0 0 0]
/Dest [3 0 R /XYZ 0 585.28 null]
/Count 0>>
endobj
11 0 obj
<</Type /Outlines /First 10 0 R
/Last 10 0 R>>
endobj
12 0 obj
<<
/Producer (AlivePDF 0.1.5)
/CreationDate (D:202301231345)
>>
endobj
13 0 obj
<<
/Type /Catalog
/Pages 1 0 R
/OpenAction [3 0 R /Fit]
/PageLayout /SinglePage
/Outlines 11 0 R
/PageMode /UseOutlines
/OCProperties <</OCGs [5 0 R 6 0 R] /D <</ON [5 0 R] /OFF [6 0 R] /AS [<</Event /Print /OCGs [5 0 R 6 0 R] /Category [/Print]>> <</Event /View /OCGs [5 0 R 6 0 R] /Category [/View]>>]>>>>
>>
endobj
xref
0 14
0000000000 65535 f
0000000009 00000 n
0000025413 00000 n
0000000064 00000 n
0000000182 00000 n
0000000341 00000 n
0000000449 00000 n
0000000556 00000 n
0000000631 00000 n
0000000727 00000 n
0000025611 00000 n
0000025761 00000 n
0000025824 00000 n
0000025904 00000 n
trailer
<<
/Size 14
/Root 13 0 R
/Info 12 0 R
>>
startxref
26231
%%EOF

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

@ -1,194 +0,0 @@
ТЕХНИЧЕСКОЕ ЗАДАНИЕ на разработку утилиты **ubl-settings-info**
1. **ОПИСАНИЕ:**
Графическое средство вывода информации о программно аппаратной части в ОС UBLinux
1. **ЭТАПЫ И СРОКИ СОЗДАНИЯ ПРИЛОЖЕНИЯ:**
1. Общий срок работ по созданию приложения составляет N дней:
1. N дня - макет и дизайн приложения и его утверждение
1. N дней - разработка приложения
1. N дня - тестирование приложения и исправление ошибок
1. Перечень этапов разработки приложения:
1. Разработка макета и дизайна приложения
1. Утверждение и доработка макета
1. Создание работающего интерфейса, включая полную разработку действующих ярлыков, кнопок и т.д.
1. Проектирование алгоритма работы приложения
1. Написание работающего кода приложения, включая полноценно работающие элементы графического интерфейса, а также перевод (поддержка локализации En, Ru), самостоятельно
1. Тестирование и исправление ошибок, самостоятельно
1. Публикация
1. **ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ:**
1. Приложение разрабатывается под нужды операционной системы UBLinux
1. Использование фирменного логотипа компании
1. Название приложения, техническое: **ubl-settings-info** (далее **\${NAME_APPLICATION}**)
1. Название приложения, публичное: **Информация о системе**
1. Описание приложения: **Вывод общей информации о системе**
1. Стек технологий:
1. Язык программирования: Bash или C(++)
1. Приложение для разработки графического интерфейса: Glade 3
1. Графические библиотеки: GTK3
1. Операционная система разработки: UBLinux DB
1. Структура:
1. В исходных кодах использовать префикс корня **CMAKE_INSTALL_PREFIX** для сборки приложений. Например, `CMAKE_INSTALL_PREFIX/share`.
1. Bash/C(++): Весь функционал сосредоточен в графической части, вызовы и исполнение процедур написаны на языках Bash, C(++)
**/usr/bin/\${NAME_APPLICATION} (скомпилированный бинарный файл)**
1. Графическая часть, фронт
**/usr/share/\${NAME_APPLICATION}/ui/\${NAME_APPLICATION}.glade**
1. Стили виджетов GTK
**/usr/share/\${NAME_APPLICATION}/css/\${NAME_APPLICATION}.css**
1. Элементы изображений
1. Иконки:
**/usr/share/icons/hicolor/scalable/apps/\${NAME_APPLICATION}{\*.png,\*.svg}**
Файлы изображений png иконок должны иметь имена вида:
- ru.ublinux.\${NAME_APPLICATION}.svg
- ru.ublinux.\${NAME_APPLICATION}.\${NAME_ICONS}.svg
Где \${NAME_ICONS} - имя графического элемента, например: checked, warning, alert и т.д.
Файлы изображений png иконок должны генерироваться из svg файла в размеры 16, 32, 48, 64 пикселей сценарием make-файла.
1. Изображения:
**/usr/share/\${NAME_APPLICATION}/ui/{\*.png,\*.svg}**
1. Локализация En/Ru
1. Для локализации должен быть создан файл-шаблон ***\${NAME_APPLICATION}.pot***, на его основе должны быть созданы сами ***po-файлы*** переводов на необходимые языки, через файл сборки из po-файлов компилируются ***mo-файлы*** и размещаются сценарием установки по указанному пути:
**/usr/share/locale/\${LANG}/LC_MESSAGES/\${FILE_MO}**
где \${LANG} - каталог с именем локали, например, "ru" или "ru_RU",
\${FILE_MO} - файл локализации программы, например, "\${NAME_APPLICATION}.mo"
1. В файле локализации .pot и .po должна присутствовать строчка информационная, показывающая позицию локализации в коде
Пример:
```bash
#: source/${NAME_APPLICATION}.c:41
msgid "Example string for localization"
msgstr "Пример строки для локализации"
```
1. Вывод **всех** текстовых элементов осуществляется через средства локализации.
1. Версия ПО
1. Файл, в котором хранится версия - VERSION.md, находится в корне каталога проекта.
1. При компиляции (через сценарий make-файла) данные из файла VERSION.md передаются в значение переменной (-ых) version_application в файлах-исходниках ПО.
1. **ТЕХНИЧЕСКОЕ ЗАДАНИЕ:**
1. Ярлык (desktop-файл):
1. Type: Application
1. Exec: ubl-settings-info
1. Categories: X-UBL-SettingsManager;X-UBL-SystemSettings
1. Главное окно:
1. Требования к внешнему виду:
1. Адаптивный (резиновый) дизайн.
1. Наличие элементов интерфейса:
1. Статических - не меняют свою ширину при изменении размеров окна или родительского элемента.
1. Динамических - меняют свою ширину при изменении размеров окна или родительского элемента. Обычно занимают пространство от края до края окна или родительского элемента, либо пространство от рядом расположенного элемента до до края окна или родительского элемента.
1. Минимальный размер окна до прекращения масштабирования 800 на 600 пикселей.
1. Шапка в стиле приложений GTK3 с содержимым:
1. Иконка приложения. Статический элемент. Выравнивание по левому краю.
1. Заголовок окна, название приложения. Выравнивание по центру между элементами.
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении". Статический элемент. Выравнивание по правому краю.
1. Стандартные элементы окна, кнопки "Свернуть, Минимизировать/На весь экран, Закрыть"
1. В верхней части крупный логотип утилиты, справа от него имя (первая строка) и краткое описание утилиты (вторая строка). Фон заполнен изображением. Статические элементы. Выравнивание по левому краю.
1. Рабочая область.
1. Требования к «Рабочей области». Динамический элемент. От края до края по горизонтали и вертикали окна. Делится на два вертикальных блока (50 на 50 процентов), которые никак не обрамлены. Выводятся группы графического и текстового представления информации:
1. Левый блок:
- логотип текущей операционной системы (масштабируемый SVG-файл). Статический элемент. Выравнивание по центру родительского элемента.
1. Правый блок:
1. Список информации о программно-аппаратных характеристиках рабочей станции. Статический элемент. Выравнивание по левому краю.:
1. Имя пользователя и хоста, например: *miramax166@mmx166-pc*
1. Название ОС, билд, редакция, например: *Система: UBLinux 2204 Desktop Basic*
1. Информация о ядре ОС, например: *Ядро: x86_64 Linux 5.17.6-2-ublinux*
1. Аптайм системы, например, *Время работы: 2h 14m*
1. Информация о пакетах, например: *Установлено пакетов: 2306*
1. Информация об оболочке, например, *Оболочка: sh*
1. Разрешение эрана (-ов), например, *Разрешение: 5760x1080*
1. Информация о DE, например, *Среда рабочего стола: Xfce4*
1. Информация об оконном менеджере, например, *Оконный менеджер: Xfwm4*
1. Информация о теме системы, например, *Тема оконного менеджера: Numix-Archblue*
1. Информация о теме GTK-среды, например, *Тема GTK: Arc-Dark [GTK2]*
1. Информация о теме значков, например, *Тема значков: Faenza-Cupertino*
1. Информация о шрифте, например, *Шрифт: Ubuntu 10*
1. Информация о диске, например, *Диск: 394G / 960G (42%)*
1. Информация о процессоре, например, *CPU: Intel Core i3-9100 @ 4x 4.2GHz [38.0°C]*
1. Информация о видеокарте, например, *GPU: NVIDIA GeForce GT 710*
1. Информация об ОЗУ, например, *Оперативная память: 4406MiB / 15934MiB*.
1. **ОСОБЕННОСТИ**
1. Кнопка с иконкой с выпадающим списком -> "Справка, О приложении"
1. Справка - запуск окна с встроенным браузером (WebKitWebView) с переходом на ссылку:
1. локализованный (ru_RU) вариант:
https://wiki.ublinux.ru/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
1. локализованный (en_EN) вариант:
https://wiki.ublinux.com/ru/Программное_обеспечениерограммы_и_утилиты/Все/\${NAME_APPLICATION} (далее \${URLWIKI})
Если WebKitWebView не доступен, то запуск через `xdg-open ${URLWIKI}`.
1. О приложении. Открывается диалоговое окно с выводом информации о программе:
1. Заголовок окна по локализованному названию утилиты
1. Копирайты, порядок:
1. Иконка приложения
1. Название утилиты
1. Версия программы (переменная version_application)
1. Название утилиты, локализованное
1. Ссылка "Домашняя страница проекта" на https://ublinux.ru/
1. Авторские права © ООО "Юбисофт", 2022 - \$LASTYEAR
- локализованный (en_EN) вариант: "Copyright © UBSoft LLC, 2022 - \$LASTYEAR"
- где \$LASTYEAR - текущий год.
1. **КОМАНДЫ**
1. Справка, О приложении > Домашняя страница проекта:
`xdg-open \${URLWIKI} &`
1. Получить имя текущего пользователя
1. команда - ``
1. Получить имя хоста
1. команда - ``
1. Получить название ОС, билд, редакция
1. команда - ``
1. Поучить информацию о ядре ОС
1. команда - ``
1. Получить время работы системы
1. команда - ``
1. Получить информацию о пакете
1. команда - ``
1. Получить информацию об оболочке
1. команда - ``
1. Получить информацию об разрешение эрана (-ов)
1. команда - ``
1. Получить информацию о DE
1. команда - ``
1. Получить информацию об оконном менеджере
1. команда - ``
1. Получить информацию о теме системы
1. команда - ``
1. Получить информацию о теме GTK-среды
1. команда - ``
1. Получить информацию о теме значков
1. команда - ``
1. Получить информацию о шрифте
1. команда - ``
1. Получить информацию о диске
1. команда - ``
1. Получить информацию о процессоре
1. команда - ``
1. Получить информацию о видеокарте
1. команда - ``
1. Получить информацию об ОЗУ
1. команда - ``
1. **ПОМОЩЬ И ПАРАМЕТРЫ ЗАПУСКА**
1. Помощь
- Пример вывода:
> ${NAME_APPLICATION} version: \$VERSION
> Application Description for UBLinux
>
> Использование: ${NAME_APPLICATION} [OPTIONS...]
> Параметры приложения:
> \$OPTIONS
Где \$OPTIONS - параметры запуска, \$VERSION - версия программы (переменная version_application).
1. Параметры запуска:
1. *-h, --help* - Показать параметры справки
1. *-V, --version* - Показать текущую версию
1. *--lock-help* - Блокировка вызова справки
1. Действия при указанных параметрах:
1. *--lock-help* - делать неактивным пункт "Справка" в выпадающем списке кнопки с иконкой.
1. **ПРИБЛИЗИТЕЛЬНЫЙ МАКЕТ ПРИЛОЖЕНИЯ.**
1. Главное окно
![](https://gitea.ublinux.ru/miramax166/design-ubl-settings-apps/raw/branch/master/ubl-settings-info/pic/01%28ru_RU%29.png)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save