Add Siemens software catalog

This commit is contained in:
2026-08-17 22:07:35 +03:00
parent 6597f56e48
commit 2cc7a4c0d4
121 changed files with 2670 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
# Store archives in Git LFS.
*.7z filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.cab filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.rar filter=lfs diff=lfs merge=lfs -text
*.tar filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
+2
View File
@@ -0,0 +1,2 @@
node_modules/
.pnpm-store/
+138
View File
@@ -0,0 +1,138 @@
# Правила ведения каталога
Эти правила действуют для всего репозитория. Перед изменением метаданных сверяйся
с `schema/index.schema.json`. Не добавляй поля, которых нет в схеме.
## Структура
- Корень репозитория является корнем каталога; папку `catalog` создавать не
нужно.
- Каждая категория и каждая программа находятся в собственной папке и содержат
ровно один файл `index.yaml`.
- Вложенность категорий не ограничена. Дочерние категории и программы
определяются по файловой структуре и не перечисляются в индексе категории.
- Имя папки — стабильный идентификатор. Используй строчные латинские буквы,
цифры, дефис и подчёркивание.
- В папке программы все загружаемые файлы находятся в `files`, а скриншоты — в
`img`.
- Не создавай отдельные YAML-файлы или папки метаданных для версий. Все версии
описываются в `versions` единственного `index.yaml` программы.
- Папки без `index.yaml`, например `schema`, `files` и `img`, не являются
категориями.
## YAML категории
Используй только следующие обязательные поля и сохраняй их порядок:
```yaml
format: 1
type: category
name: Русское название категории
description: Описание категории на русском языке.
```
## YAML программы
Поля программы располагай в следующем порядке:
1. `format: 1` — обязательное поле.
2. `type: program` — обязательное поле.
3. `name` — обязательное официальное название программы.
4. `description` — обязательное подробное описание на русском языке в формате
Markdown.
5. `homepage` — необязательный URL домашней страницы.
6. `source` — необязательный URL исходного кода.
7. `screenshots` — обязательный массив путей; используй `[]`, если изображений
нет.
8. `versions` — обязательный непустой массив версий.
9. `additional_files` — необязательный массив файлов, не привязанных к версии.
Новые версии добавляй в начало `versions`, от новых к старым. Каждая версия
имеет такой вид:
```yaml
- version: "1.2.0"
status: current
released: "2007-08-14"
files:
- path: files/program-1.2.0.zip
description: Назначение файла на русском языке
platform: win32
sha256: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
```
Поля версии располагай в порядке `version`, `status`, `released`, `description`,
`files`. Обязательны только `version` и непустой массив `files`. Необязательный
`status` принимает `current` для актуальной версии и `archived` для устаревшей,
сохранённой ради архива. Если статусы используются у программы, указывай их у
всех её версий. Поле `released` добавляй только при наличии достоверной даты.
Не переноси changelog в `description` версии и не добавляй это поле для полноты.
Оно допустимо только в особом случае, когда нужно зафиксировать существенное
ограничение, которое нельзя выразить номером версии или описанием конкретного
файла.
Необязательное поле файла `platform` принимает одно из значений: `win32`,
`win64`, `dos`, `java` или `j2me`. Для Windows разрядность входит в название
платформы; отдельное поле `architecture` не используется.
Файлы, которые подходят ко всем версиям или существуют отдельно от релиза,
помещай в `additional_files`, а не внутрь случайной версии:
```yaml
additional_files:
- path: files/manual.pdf
description: Руководство пользователя
```
## Текст и достоверность
- Названия категорий, описания программ, версий и файлов пиши на русском языке.
Официальные названия продуктов и технологий не переводи.
- Сохраняй полноту исходного описания. Не сокращай перечень возможностей до
общего пересказа и не удаляй значимые технические подробности.
- Содержимое каждого `description` интерпретируется как Markdown. Для длинного
описания со списком используй литеральный блок `|-` и Markdown-списки; для
обычного абзаца, перенесённого на несколько строк, используй `>-`. Не вставляй
HTML-разметку.
- Не выдумывай даты, ссылки, возможности или платформы. Неизвестное
необязательное поле лучше не добавлять.
- Сначала пытайся определить версию по странице, имени файла, README и
метаданным бинарника. Если номер версии нигде не указан и достоверно получить
его невозможно, используй каталоговое значение `version: "1.0"`. Не выводи
номер версии из даты сборки.
- Если источник содержит только текущую версию, добавляй только её. Не ищи
более ранние архивы в Wayback Machine без отдельного указания пользователя.
## Пути и файлы
- Все пути относительны папке программы и используют `/`.
- Путь загружаемого файла начинается с `files/`; путь скриншота — с `img/`.
- Абсолютные пути, `..` и обратная косая черта запрещены.
- Каждый путь из YAML должен указывать на существующий файл.
- Один файл нельзя одновременно указывать в `versions` и `additional_files`.
- Для каждого добавленного файла вычисляй и указывай SHA-256 в нижнем регистре.
- Архивы должны проходить через Git LFS согласно `.gitattributes`. Остальные
файлы хранятся в обычном Git.
## Стиль YAML
- Кодировка — UTF-8, окончания строк — LF, отступ — два пробела, табуляция
запрещена.
- Версии и даты всегда заключай в двойные кавычки.
- Дата имеет формат `YYYY-MM-DD`, SHA-256 — ровно 64 шестнадцатеричных символа.
- Не используй YAML-теги, anchors, aliases и merge keys.
- Не допускай неизвестных полей и дубликатов в массивах.
## Проверка
Перед завершением изменения:
1. Проверь синтаксис всех затронутых `index.yaml` безопасным YAML-парсером.
2. Проверь их по `schema/index.schema.json` валидатором JSON Schema Draft 2020-12,
если он доступен.
3. Убедись, что все пути существуют и их SHA-256 совпадает с метаданными.
Для заполнения и обновления сумм используй `pnpm sha256 [путь]`, для проверки
без изменения файлов — `pnpm sha256:check [путь]`.
4. Для каждого нового архива выполни `git check-attr filter -- <путь>` и
убедись, что значение равно `lfs`.
5. Выполни `git diff --check`.
+182
View File
@@ -0,0 +1,182 @@
# Каталог программ
Репозиторий хранит дистрибутивы программ и их метаданные. Все пользовательские
названия и описания пишутся на русском языке. Официальные названия программ,
версии, имена платформ и другие технические значения переводить не нужно.
## Структура
Корень репозитория одновременно является корнем каталога программ. Вложенность
категорий не ограничена. Имя папки служит стабильным машиночитаемым
идентификатором: используйте строчные латинские буквы, цифры, дефис и
подчёркивание.
```text
./
├── index.yaml
├── schema/
│ └── index.schema.json
└── system/
├── index.yaml
└── file-managers/
├── index.yaml
└── example-program/
├── index.yaml
├── img/
│ └── screenshot.png
└── files/
├── example-program-1.0.0.zip
├── example-program-1.1.0.zip
└── manual.pdf
```
Каждая категория и каждая программа содержит ровно один `index.yaml`:
- `type: category` означает категорию; рядом могут находиться подкатегории и
программы;
- `type: program` означает программу; все её версии описываются в этом же
файле;
- `img` и `files` — зарезервированные папки внутри программы.
Папки без `index.yaml`, например корневая `schema`, не входят в дерево
категорий.
Список дочерних элементов категории не дублируется в YAML: он определяется по
вложенным папкам. Благодаря этому перемещение программы не требует правки
родительских индексов.
## Категория
```yaml
format: 1
type: category
name: Системные программы
description: Утилиты для настройки и обслуживания устройства.
```
## Программа
```yaml
format: 1
type: program
name: Пример программы
description: |-
Краткое описание назначения и возможностей программы.
Возможности:
- первая возможность;
- вторая возможность.
homepage: https://example.org/program
source: https://github.com/example/program
screenshots:
- img/screenshot.png
versions:
- version: "1.1.0"
status: current
released: "2007-08-14"
files:
- path: files/example-program-1.1.0.zip
description: Дистрибутив программы
platform: win32
sha256: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
- version: "1.0.0"
files:
- path: files/example-program-1.0.0.zip
additional_files:
- path: files/manual.pdf
description: Руководство пользователя
```
Обязательные поля программы: `format`, `type`, `name`, `description`,
`screenshots`, `versions`. Поля `homepage`, `source` и `additional_files`
необязательны.
Поле `description` содержит Markdown. Для содержательного описания используйте
абзацы и списки внутри литерального YAML-блока `|-`.
Все файлы программы хранятся в её папке `files`. Версионные файлы перечислены
в `versions[].files`, а не зависящие от версии — в `additional_files`. Один и
тот же файл не следует указывать в обоих местах. Новые версии добавляются в
начало массива `versions`, от новых к старым.
Необязательное поле файла `platform` использует короткие машиночитаемые
значения: `win32`, `win64`, `dos`, `java` или `j2me`. Отдельного поля
архитектуры нет: разрядность Windows уже включена в `win32` или `win64`.
Необязательное поле `status` принимает значение `current` для актуальной версии
или `archived` для версии, оставленной в каталоге как архивная. Если программа
использует статусы, они указываются у всех её версий.
`description` версии используется только для существенных исключений, которые
нельзя выразить номером версии или описанием файла. Обычный список изменений в
индекс не переносится.
Скриншоты хранятся в `img`; пути всегда начинаются с `img/`. Если скриншотов
нет, указывается пустой массив: `screenshots: []`.
## Правила формата
- Кодировка всех YAML-файлов — UTF-8, окончания строк — LF.
- `format` — версия формата метаданных. Текущее значение: `1`.
- Неизвестные поля запрещены: расширение формата требует изменения схемы.
- Все пути задаются относительно папки программы. Абсолютные пути, `..` и
обратная косая черта запрещены.
- Даты записываются строкой `YYYY-MM-DD` и берутся в кавычки.
- URL используют только `http` или `https`.
- `sha256`, если указан, содержит 64 шестнадцатеричных символа в нижнем
регистре.
- Массивы не должны содержать дубликаты.
- Описания программы, версии и файла пишутся на русском языке.
Архивы хранятся через Git LFS, остальные файлы — как обычные объекты Git.
## Заполнение SHA-256
Для установки зависимостей используется pnpm:
```shell
pnpm install
```
Команда вычисляет контрольные суммы всех файлов из `versions` и
`additional_files`, после чего добавляет или обновляет поля `sha256`:
```shell
pnpm sha256
```
Можно ограничить обход одной программой, категорией или конкретным индексом:
```shell
pnpm sha256 service/repair-tools/joker
pnpm sha256 service/repair-tools/joker/index.yaml
```
Для проверки без изменения YAML используется отдельная команда:
```shell
pnpm sha256:check
```
## Дерево каталога
Дерево категорий и программ строится по файловой структуре и названиям из
`index.yaml`:
```shell
pnpm tree
```
Можно вывести только выбранную ветку, добавить пути каталогов или версии
программ:
```shell
pnpm tree service/repair-tools
pnpm tree --paths
pnpm tree --versions
```
Формальная JSON Schema находится в
[`schema/index.schema.json`](schema/index.schema.json). Она проверяет структуру
и значения `index.yaml`; соответствие русского текста проверяется при ревью,
поскольку название продукта может состоять из латинских символов.
@@ -0,0 +1,29 @@
format: 1
type: program
name: ArmDebugger
description: |-
Отладчик для телефонов Siemens 65/70/75-й серии.
Возможности:
- автоматическая генерация CGSN-патча по слитому фулфлешу;
- просмотр содержимого памяти телефона в HEX-дампе;
- ARM/Thumb-дизассемблер с inline-ассемблером;
- пошаговая трассировка программы или процесса;
- установка точек мониторинга на любой адрес флеш-памяти и на запись в
диапазон RAM;
- редактирование памяти, в том числе флеш-области, с использованием замещения
flash-страниц;
- поиск байтов, строк и ссылок в памяти;
- интеграция с Keil ARM Tools;
- дамп памяти в файл, вызов функций flash с параметрами и hex/bin/dec
калькулятор.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "0.7.9"
released: "2006-12-28"
files:
- path: files/ArmDebugger-079.rar
description: Отладчик, краткое руководство и примеры для Keil ARM Tools
platform: win32
sha256: 94e089e35a4733c97890c34c14d065007332057f5b11693a7f94cca7245251ad
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Отладчики
description: Программы для анализа памяти, машинного кода и выполнения программ.
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Средства разработки
description: Инструменты для исследования и разработки программного обеспечения телефонов.
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Инструменты Java ME
description: Программы для разработки, настройки и подготовки приложений Java ME.
Binary file not shown.
@@ -0,0 +1,30 @@
format: 1
type: program
name: MidletSigner
description: |-
Программа для самостоятельного создания сертификата и подписывания
Java-мидлетов на телефонах Siemens 65-й и 75-й серий.
Подписанный мидлет может работать без постоянных запросов подтверждения при
чтении и записи файлов, выходе в интернет, отправке SMS и MMS, доступе к
COM-порту, Bluetooth, адресной книге, органайзеру и мультимедийным функциям.
Подпись также позволяет автоматически запускать мидлет по времени или
событию.
Программа работает из командной строки с JAD- и JAR-файлами. Для работы
требуется JRE версии 1.3 или новее. Для телефонов 65-й серии нужен OpenDisc
2.0, а для телефонов 75-й серии в телефон должен быть введён SKEY.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "5"
files:
- path: files/MidletSigner5.rar
description: MidletSigner 5 с русским и английским руководствами
platform: java
sha256: ad81aebd58ddf45a57c42123d708214aa2cd1297cf1c871c95b8808f70939046
additional_files:
- path: files/JRE131L.rar
description: Минимальный JRE 1.3.1 только для запуска MidletSigner
platform: win32
sha256: 0236f9e6fd71537d878792b7aa4cf6b20c2a729ae9672c81d6e69289f1afcf89
Binary file not shown.
@@ -0,0 +1,23 @@
format: 1
type: program
name: FFPatch
description: |-
Программа для сравнения двух файлов fullflash, сохранения найденных отличий
в виде патча VKP и поиска уже установленных патчей в образе flash-памяти.
Возможности:
- сравнение оригинального и текущего fullflash;
- формирование файла различий в формате VKP;
- поиск одного или нескольких патчей VKP в fullflash;
- добавление патчей отдельными файлами или целым каталогом;
- исключение заданных диапазонов адресов из поиска и сравнения;
- сохранение настроек фильтрации адресов.
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
screenshots: []
versions:
- version: "0.4.2"
files:
- path: files/ffpatch.rar
description: Программа FFPatch и руководство пользователя
platform: win32
sha256: 6fef324ef0e22d97dc550e6bb20acd1a5edb4c6d773784f1edb2ad3ad854aac6
Binary file not shown.
@@ -0,0 +1,21 @@
format: 1
type: program
name: FilesComparer
description: |-
Программа для сравнения файлов и образов flash-памяти.
Возможности:
- сравнение файлов одинакового и разного размера;
- ограничение сравнения начальным и конечным адресами;
- передача параметров через командную строку;
- выравнивание результатов по байтам;
- работа под DOS и Windows.
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
screenshots: []
versions:
- version: "1.2"
files:
- path: files/fc_v1.2.rar
description: Программа FilesComparer 1.2
platform: win32
sha256: 1e2416941803cf80c9a56a859b0cc2e714388e5f907d89403c0d3f05c7520cc4
Binary file not shown.
@@ -0,0 +1,20 @@
format: 1
type: program
name: Hex2VKP
description: |-
Консольный конвертер из формата Intel HEX в формат патчей VKP программы
V_KLay.
Intel HEX применяется для загрузки данных в микроконтроллеры и может быть
создан компиляторами для C166, включая Keil и Tasking C. Hex2VKP преобразует
результат компиляции в патч VKP для последующей записи через V_KLay. Ключ
`-F` создаёт секцию отмены патча `UNDO PATCH`.
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
screenshots: []
versions:
- version: "0.1a"
files:
- path: files/hex2vkp.zip
description: Программа Hex2VKP, исходный код, настройки и руководство
platform: win32
sha256: 10149c6770337551f18f5ff948acf9e3fbd025fca3e97a1f0f1cab9702301786
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Средства создания патчей
description: Программы для сравнения прошивок, поиска изменений и создания патчей VKP.
Binary file not shown.
Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
format: 1
type: program
name: SLFC
description: |-
Консольная программа для сравнения двух файлов fullflash и создания патча в
формате VKP.
Совпадающие байты можно учитывать по правилу: если их не больше трёх, они
включаются в патч; более длинная совпадающая последовательность считается
окончанием блока изменений.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "1.0"
files:
- path: files/slfc-chaos.exe
description: Сборка SLFC со страницы автора Chaos
platform: win32
sha256: 6b77b967ab44dccb4d3038df9d95cebbcdf9f3162183990d9516c32cd2d450e6
- path: files/slfc-vi-soft.exe
description: Сборка SLFC со страницы vi-soft.com.ua
platform: win32
sha256: 3ec3143bc70f6ad7d0efaa41e0c666a9213c5e8c4163b11c05dfa999335600e4
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Каталог программ
description: Программы и утилиты для мобильных устройств Siemens.
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Работа со звуком
description: Инструменты для преобразования и обработки звуковых файлов телефонов.
Binary file not shown.
+17
View File
@@ -0,0 +1,17 @@
format: 1
type: program
name: vmo2wav
description: |-
Консольный конвертер диктофонных записей Siemens SL45 из формата VMO в WAV.
По умолчанию программа нормализует уровень сигнала. Нормализацию можно
отключить параметром `-n`.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "1.0"
files:
- path: files/vmo2wav.zip
description: Конвертер vmo2wav и руководство пользователя
platform: win32
sha256: fb89b2df0dc483a7a418002aee7e3d070a7613c16142246f815d08e5b527dd6c
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Мультимедиа
description: Программы для обработки звука, изображений и других мультимедийных данных.
+18
View File
@@ -0,0 +1,18 @@
{
"name": "siemens-software-catalog",
"private": true,
"type": "module",
"packageManager": "pnpm@11.3.0",
"scripts": {
"sha256": "tsx scripts/fillSha256.ts",
"sha256:check": "tsx scripts/fillSha256.ts --check",
"tree": "tsx scripts/printTree.ts",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@types/node": "^26.2.0",
"tsx": "^4.23.12",
"typescript": "^7.0.2",
"yaml": "^2.9.0"
}
}
+540
View File
@@ -0,0 +1,540 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
devDependencies:
'@types/node':
specifier: ^26.2.0
version: 26.2.0
tsx:
specifier: ^4.23.12
version: 4.23.12
typescript:
specifier: ^7.0.2
version: 7.0.2
yaml:
specifier: ^2.9.0
version: 2.9.0
packages:
'@esbuild/aix-ppc64@0.28.2':
resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.28.2':
resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.28.2':
resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.28.2':
resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.28.2':
resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.28.2':
resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.28.2':
resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.28.2':
resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.28.2':
resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.28.2':
resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.28.2':
resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.28.2':
resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.28.2':
resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.28.2':
resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.28.2':
resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.28.2':
resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.28.2':
resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.28.2':
resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.28.2':
resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.28.2':
resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.28.2':
resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.28.2':
resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.28.2':
resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.28.2':
resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.28.2':
resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.28.2':
resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@types/node@26.2.0':
resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==}
'@typescript/typescript-aix-ppc64@7.0.2':
resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
engines: {node: '>=16.20.0'}
cpu: [ppc64]
os: [aix]
'@typescript/typescript-darwin-arm64@7.0.2':
resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [darwin]
'@typescript/typescript-darwin-x64@7.0.2':
resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [darwin]
'@typescript/typescript-freebsd-arm64@7.0.2':
resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [freebsd]
'@typescript/typescript-freebsd-x64@7.0.2':
resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [freebsd]
'@typescript/typescript-linux-arm64@7.0.2':
resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [linux]
'@typescript/typescript-linux-arm@7.0.2':
resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
engines: {node: '>=16.20.0'}
cpu: [arm]
os: [linux]
'@typescript/typescript-linux-loong64@7.0.2':
resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
engines: {node: '>=16.20.0'}
cpu: [loong64]
os: [linux]
'@typescript/typescript-linux-mips64el@7.0.2':
resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
engines: {node: '>=16.20.0'}
cpu: [mips64el]
os: [linux]
'@typescript/typescript-linux-ppc64@7.0.2':
resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
engines: {node: '>=16.20.0'}
cpu: [ppc64]
os: [linux]
'@typescript/typescript-linux-riscv64@7.0.2':
resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
engines: {node: '>=16.20.0'}
cpu: [riscv64]
os: [linux]
'@typescript/typescript-linux-s390x@7.0.2':
resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
engines: {node: '>=16.20.0'}
cpu: [s390x]
os: [linux]
'@typescript/typescript-linux-x64@7.0.2':
resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [linux]
'@typescript/typescript-netbsd-arm64@7.0.2':
resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [netbsd]
'@typescript/typescript-netbsd-x64@7.0.2':
resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [netbsd]
'@typescript/typescript-openbsd-arm64@7.0.2':
resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [openbsd]
'@typescript/typescript-openbsd-x64@7.0.2':
resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [openbsd]
'@typescript/typescript-sunos-x64@7.0.2':
resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [sunos]
'@typescript/typescript-win32-arm64@7.0.2':
resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [win32]
'@typescript/typescript-win32-x64@7.0.2':
resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [win32]
esbuild@0.28.2:
resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
engines: {node: '>=18'}
hasBin: true
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
tsx@4.23.12:
resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==}
engines: {node: '>=18.0.0'}
hasBin: true
typescript@7.0.2:
resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
engines: {node: '>=16.20.0'}
hasBin: true
undici-types@8.3.0:
resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
yaml@2.9.0:
resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
engines: {node: '>= 14.6'}
hasBin: true
snapshots:
'@esbuild/aix-ppc64@0.28.2':
optional: true
'@esbuild/android-arm64@0.28.2':
optional: true
'@esbuild/android-arm@0.28.2':
optional: true
'@esbuild/android-x64@0.28.2':
optional: true
'@esbuild/darwin-arm64@0.28.2':
optional: true
'@esbuild/darwin-x64@0.28.2':
optional: true
'@esbuild/freebsd-arm64@0.28.2':
optional: true
'@esbuild/freebsd-x64@0.28.2':
optional: true
'@esbuild/linux-arm64@0.28.2':
optional: true
'@esbuild/linux-arm@0.28.2':
optional: true
'@esbuild/linux-ia32@0.28.2':
optional: true
'@esbuild/linux-loong64@0.28.2':
optional: true
'@esbuild/linux-mips64el@0.28.2':
optional: true
'@esbuild/linux-ppc64@0.28.2':
optional: true
'@esbuild/linux-riscv64@0.28.2':
optional: true
'@esbuild/linux-s390x@0.28.2':
optional: true
'@esbuild/linux-x64@0.28.2':
optional: true
'@esbuild/netbsd-arm64@0.28.2':
optional: true
'@esbuild/netbsd-x64@0.28.2':
optional: true
'@esbuild/openbsd-arm64@0.28.2':
optional: true
'@esbuild/openbsd-x64@0.28.2':
optional: true
'@esbuild/openharmony-arm64@0.28.2':
optional: true
'@esbuild/sunos-x64@0.28.2':
optional: true
'@esbuild/win32-arm64@0.28.2':
optional: true
'@esbuild/win32-ia32@0.28.2':
optional: true
'@esbuild/win32-x64@0.28.2':
optional: true
'@types/node@26.2.0':
dependencies:
undici-types: 8.3.0
'@typescript/typescript-aix-ppc64@7.0.2':
optional: true
'@typescript/typescript-darwin-arm64@7.0.2':
optional: true
'@typescript/typescript-darwin-x64@7.0.2':
optional: true
'@typescript/typescript-freebsd-arm64@7.0.2':
optional: true
'@typescript/typescript-freebsd-x64@7.0.2':
optional: true
'@typescript/typescript-linux-arm64@7.0.2':
optional: true
'@typescript/typescript-linux-arm@7.0.2':
optional: true
'@typescript/typescript-linux-loong64@7.0.2':
optional: true
'@typescript/typescript-linux-mips64el@7.0.2':
optional: true
'@typescript/typescript-linux-ppc64@7.0.2':
optional: true
'@typescript/typescript-linux-riscv64@7.0.2':
optional: true
'@typescript/typescript-linux-s390x@7.0.2':
optional: true
'@typescript/typescript-linux-x64@7.0.2':
optional: true
'@typescript/typescript-netbsd-arm64@7.0.2':
optional: true
'@typescript/typescript-netbsd-x64@7.0.2':
optional: true
'@typescript/typescript-openbsd-arm64@7.0.2':
optional: true
'@typescript/typescript-openbsd-x64@7.0.2':
optional: true
'@typescript/typescript-sunos-x64@7.0.2':
optional: true
'@typescript/typescript-win32-arm64@7.0.2':
optional: true
'@typescript/typescript-win32-x64@7.0.2':
optional: true
esbuild@0.28.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.28.2
'@esbuild/android-arm': 0.28.2
'@esbuild/android-arm64': 0.28.2
'@esbuild/android-x64': 0.28.2
'@esbuild/darwin-arm64': 0.28.2
'@esbuild/darwin-x64': 0.28.2
'@esbuild/freebsd-arm64': 0.28.2
'@esbuild/freebsd-x64': 0.28.2
'@esbuild/linux-arm': 0.28.2
'@esbuild/linux-arm64': 0.28.2
'@esbuild/linux-ia32': 0.28.2
'@esbuild/linux-loong64': 0.28.2
'@esbuild/linux-mips64el': 0.28.2
'@esbuild/linux-ppc64': 0.28.2
'@esbuild/linux-riscv64': 0.28.2
'@esbuild/linux-s390x': 0.28.2
'@esbuild/linux-x64': 0.28.2
'@esbuild/netbsd-arm64': 0.28.2
'@esbuild/netbsd-x64': 0.28.2
'@esbuild/openbsd-arm64': 0.28.2
'@esbuild/openbsd-x64': 0.28.2
'@esbuild/openharmony-arm64': 0.28.2
'@esbuild/sunos-x64': 0.28.2
'@esbuild/win32-arm64': 0.28.2
'@esbuild/win32-ia32': 0.28.2
'@esbuild/win32-x64': 0.28.2
fsevents@2.3.3:
optional: true
tsx@4.23.12:
dependencies:
esbuild: 0.28.2
optionalDependencies:
fsevents: 2.3.3
typescript@7.0.2:
optionalDependencies:
'@typescript/typescript-aix-ppc64': 7.0.2
'@typescript/typescript-darwin-arm64': 7.0.2
'@typescript/typescript-darwin-x64': 7.0.2
'@typescript/typescript-freebsd-arm64': 7.0.2
'@typescript/typescript-freebsd-x64': 7.0.2
'@typescript/typescript-linux-arm': 7.0.2
'@typescript/typescript-linux-arm64': 7.0.2
'@typescript/typescript-linux-loong64': 7.0.2
'@typescript/typescript-linux-mips64el': 7.0.2
'@typescript/typescript-linux-ppc64': 7.0.2
'@typescript/typescript-linux-riscv64': 7.0.2
'@typescript/typescript-linux-s390x': 7.0.2
'@typescript/typescript-linux-x64': 7.0.2
'@typescript/typescript-netbsd-arm64': 7.0.2
'@typescript/typescript-netbsd-x64': 7.0.2
'@typescript/typescript-openbsd-arm64': 7.0.2
'@typescript/typescript-openbsd-x64': 7.0.2
'@typescript/typescript-sunos-x64': 7.0.2
'@typescript/typescript-win32-arm64': 7.0.2
'@typescript/typescript-win32-x64': 7.0.2
undici-types@8.3.0: {}
yaml@2.9.0: {}
+2
View File
@@ -0,0 +1,2 @@
allowBuilds:
esbuild: true
+189
View File
@@ -0,0 +1,189 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Индекс каталога программ",
"description": "Схема index.yaml для категории или программы.",
"oneOf": [
{
"$ref": "#/$defs/category"
},
{
"$ref": "#/$defs/program"
}
],
"$defs": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"contentMediaType": "text/markdown"
},
"url": {
"type": "string",
"format": "uri",
"pattern": "^https?://"
},
"filePath": {
"type": "string",
"pattern": "^(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)files/.+$"
},
"screenshotPath": {
"type": "string",
"pattern": "^(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)img/.+\\.(?:png|jpe?g|webp|gif)$"
},
"file": {
"title": "Файл программы",
"type": "object",
"additionalProperties": false,
"required": [
"path"
],
"properties": {
"path": {
"$ref": "#/$defs/filePath"
},
"description": {
"$ref": "#/$defs/description"
},
"platform": {
"type": "string",
"enum": [
"win32",
"win64",
"dos",
"java",
"j2me"
]
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
}
}
},
"version": {
"title": "Версия программы",
"type": "object",
"additionalProperties": false,
"required": [
"version",
"files"
],
"properties": {
"version": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"pattern": "^[^/\\\\]+$"
},
"status": {
"type": "string",
"enum": [
"current",
"archived"
]
},
"released": {
"type": "string",
"format": "date"
},
"description": {
"$ref": "#/$defs/description"
},
"files": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/$defs/file"
}
}
}
},
"category": {
"title": "Категория",
"type": "object",
"additionalProperties": false,
"required": [
"format",
"type",
"name",
"description"
],
"properties": {
"format": {
"const": 1
},
"type": {
"const": "category"
},
"name": {
"$ref": "#/$defs/name"
},
"description": {
"$ref": "#/$defs/description"
}
}
},
"program": {
"title": "Программа",
"type": "object",
"additionalProperties": false,
"required": [
"format",
"type",
"name",
"description",
"screenshots",
"versions"
],
"properties": {
"format": {
"const": 1
},
"type": {
"const": "program"
},
"name": {
"$ref": "#/$defs/name"
},
"description": {
"$ref": "#/$defs/description"
},
"homepage": {
"$ref": "#/$defs/url"
},
"source": {
"$ref": "#/$defs/url"
},
"screenshots": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/$defs/screenshotPath"
}
},
"versions": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/$defs/version"
}
},
"additional_files": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/$defs/file"
}
}
}
}
}
}
+272
View File
@@ -0,0 +1,272 @@
#!/usr/bin/env node
import { createHash } from "node:crypto";
import { createReadStream } from "node:fs";
import {
lstat,
mkdir,
readdir,
readFile,
realpath,
rename,
rm,
stat,
writeFile,
} from "node:fs/promises";
import path from "node:path";
import process from "node:process";
import { parseDocument } from "yaml";
type CatalogFile = {
path?: unknown;
sha256?: unknown;
};
type ProgramIndex = {
type?: unknown;
versions?: Array<{ files?: CatalogFile[] }>;
additional_files?: CatalogFile[];
};
type Options = {
check: boolean;
targets: string[];
};
type FileReference = {
data: CatalogFile;
yamlPath: Array<string | number>;
};
const ignoredDirectories = new Set([".git", "node_modules", "files", "img"]);
function usage(): void {
console.log(`Использование: pnpm sha256 [--check] [путь ...]
Без путей скрипт обходит текущий каталог. Путь может указывать на index.yaml
или на папку, внутри которой нужно найти index.yaml.
--check только проверить суммы, не изменяя YAML
--help показать эту справку`);
}
function parseArguments(args: string[]): Options {
const targets: string[] = [];
let check = false;
for (const argument of args) {
if (argument === "--check") {
check = true;
} else if (argument === "--help" || argument === "-h") {
usage();
process.exit(0);
} else if (argument.startsWith("-")) {
throw new Error(`Неизвестный параметр: ${argument}`);
} else {
targets.push(argument);
}
}
return { check, targets: targets.length > 0 ? targets : ["."] };
}
async function findIndexes(target: string, result: Set<string>): Promise<void> {
const absoluteTarget = path.resolve(target);
const targetStat = await lstat(absoluteTarget);
if (targetStat.isFile()) {
if (path.basename(absoluteTarget) !== "index.yaml") {
throw new Error(`Ожидался index.yaml: ${target}`);
}
result.add(absoluteTarget);
return;
}
if (!targetStat.isDirectory()) {
throw new Error(`Путь не является файлом или каталогом: ${target}`);
}
const entries = await readdir(absoluteTarget, { withFileTypes: true });
for (const entry of entries) {
const entryPath = path.join(absoluteTarget, entry.name);
if (entry.isFile() && entry.name === "index.yaml") {
result.add(entryPath);
} else if (entry.isDirectory() && !ignoredDirectories.has(entry.name)) {
await findIndexes(entryPath, result);
}
}
}
function collectFileReferences(data: ProgramIndex): FileReference[] {
const references: FileReference[] = [];
for (const [versionIndex, version] of (data.versions ?? []).entries()) {
for (const [fileIndex, file] of (version.files ?? []).entries()) {
references.push({
data: file,
yamlPath: ["versions", versionIndex, "files", fileIndex],
});
}
}
for (const [fileIndex, file] of (data.additional_files ?? []).entries()) {
references.push({
data: file,
yamlPath: ["additional_files", fileIndex],
});
}
return references;
}
async function resolveCatalogFile(indexPath: string, value: unknown): Promise<string> {
if (typeof value !== "string" || value.length === 0) {
throw new Error("поле path отсутствует или не является строкой");
}
if (path.isAbsolute(value) || value.includes("\\")) {
throw new Error(`недопустимый путь: ${value}`);
}
const parts = value.split("/");
if (parts[0] !== "files" || parts.some((part) => part === ".." || part === "")) {
throw new Error(`путь должен находиться внутри files/: ${value}`);
}
const programDirectory = path.dirname(indexPath);
const filesDirectory = path.resolve(programDirectory, "files");
const filePath = path.resolve(programDirectory, ...parts);
const relativePath = path.relative(filesDirectory, filePath);
if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
throw new Error(`путь выходит за пределы files/: ${value}`);
}
const [realFilesDirectory, realFilePath] = await Promise.all([
realpath(filesDirectory),
realpath(filePath),
]);
const realRelativePath = path.relative(realFilesDirectory, realFilePath);
if (realRelativePath.startsWith("..") || path.isAbsolute(realRelativePath)) {
throw new Error(`символическая ссылка выходит за пределы files/: ${value}`);
}
if (!(await stat(realFilePath)).isFile()) {
throw new Error(`путь не указывает на обычный файл: ${value}`);
}
return realFilePath;
}
async function calculateSha256(filePath: string): Promise<string> {
const hash = createHash("sha256");
for await (const chunk of createReadStream(filePath)) {
hash.update(chunk);
}
return hash.digest("hex");
}
async function writeAtomically(filePath: string, contents: string): Promise<void> {
const directory = path.dirname(filePath);
const temporaryPath = path.join(
directory,
`.${path.basename(filePath)}.${process.pid}.tmp`,
);
await mkdir(directory, { recursive: true });
try {
await writeFile(temporaryPath, contents, "utf8");
await rename(temporaryPath, filePath);
} finally {
await rm(temporaryPath, { force: true });
}
}
async function processIndex(indexPath: string, check: boolean): Promise<number> {
const source = await readFile(indexPath, "utf8");
const document = parseDocument(source, { prettyErrors: true });
if (document.errors.length > 0) {
throw new Error(document.errors.map((error) => error.message).join("; "));
}
const data = document.toJS() as ProgramIndex;
if (data.type !== "program") {
return 0;
}
let changed = 0;
const errors: string[] = [];
const references = collectFileReferences(data);
const results = await Promise.all(
references.map(async (reference) => {
try {
const filePath = await resolveCatalogFile(indexPath, reference.data.path);
return { reference, digest: await calculateSha256(filePath) };
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
errors.push(`${String(reference.data.path)}: ${message}`);
return undefined;
}
}),
);
if (errors.length > 0) {
throw new Error(errors.join("; "));
}
for (const result of results) {
if (result === undefined || result.reference.data.sha256 === result.digest) {
continue;
}
changed += 1;
if (!check) {
document.setIn([...result.reference.yamlPath, "sha256"], result.digest);
}
}
const displayPath = path.relative(process.cwd(), indexPath) || indexPath;
if (changed > 0 && check) {
console.error(`${displayPath}: требуется обновить SHA-256 (${changed})`);
} else if (changed > 0) {
await writeAtomically(indexPath, document.toString());
console.log(`${displayPath}: обновлено SHA-256 (${changed})`);
}
return changed;
}
async function main(): Promise<void> {
const options = parseArguments(process.argv.slice(2));
const indexes = new Set<string>();
for (const target of options.targets) {
await findIndexes(target, indexes);
}
let changed = 0;
let failed = 0;
for (const indexPath of [...indexes].sort()) {
try {
changed += await processIndex(indexPath, options.check);
} catch (error) {
failed += 1;
const displayPath = path.relative(process.cwd(), indexPath) || indexPath;
const message = error instanceof Error ? error.message : String(error);
console.error(`${displayPath}: ${message}`);
}
}
if (failed > 0) {
console.error(`Ошибок: ${failed}`);
process.exitCode = 1;
} else if (options.check && changed > 0) {
console.error(`Файлов с несовпадениями: ${changed}`);
process.exitCode = 1;
} else {
console.log(
changed > 0
? `Готово, обновлено полей: ${changed}`
: `Готово, все SHA-256 актуальны. Проверено index.yaml: ${indexes.size}`,
);
}
}
await main();
+222
View File
@@ -0,0 +1,222 @@
#!/usr/bin/env node
import { lstat, readdir, readFile } from "node:fs/promises";
import path from "node:path";
import process from "node:process";
import { parseDocument } from "yaml";
type CatalogType = "category" | "program";
type CatalogIndex = {
type?: unknown;
name?: unknown;
versions?: Array<{ version?: unknown; status?: unknown }>;
};
type CatalogVersion = {
version: string;
status?: "current" | "archived";
};
type CatalogNode = {
type: CatalogType;
name: string;
directory: string;
versions: CatalogVersion[];
children: CatalogNode[];
};
type Options = {
showPaths: boolean;
showVersions: boolean;
target: string;
};
const collator = new Intl.Collator("ru", {
numeric: true,
sensitivity: "base",
});
function usage(): void {
console.log(`Использование: pnpm tree [параметры] [путь]
Без пути выводится всё дерево каталога. Путь может указывать на папку категории,
программы или на её index.yaml.
--versions вывести версии под каждой программой
--paths вывести относительные пути каталогов
--help показать эту справку`);
}
function parseArguments(args: string[]): Options {
const targets: string[] = [];
let showPaths = false;
let showVersions = false;
for (const argument of args) {
if (argument === "--paths") {
showPaths = true;
} else if (argument === "--versions") {
showVersions = true;
} else if (argument === "--help" || argument === "-h") {
usage();
process.exit(0);
} else if (argument.startsWith("-")) {
throw new Error(`Неизвестный параметр: ${argument}`);
} else {
targets.push(argument);
}
}
if (targets.length > 1) {
throw new Error("Можно указать только один путь");
}
return {
showPaths,
showVersions,
target: targets[0] ?? ".",
};
}
function compareNodes(left: CatalogNode, right: CatalogNode): number {
if (left.type !== right.type) {
return left.type === "category" ? -1 : 1;
}
return collator.compare(left.name, right.name);
}
async function resolveDirectory(target: string): Promise<string> {
const absoluteTarget = path.resolve(target);
const targetStat = await lstat(absoluteTarget);
if (targetStat.isDirectory()) {
return absoluteTarget;
}
if (targetStat.isFile() && path.basename(absoluteTarget) === "index.yaml") {
return path.dirname(absoluteTarget);
}
throw new Error(`Ожидалась папка каталога или index.yaml: ${target}`);
}
async function readCatalogNode(directory: string): Promise<CatalogNode> {
const indexPath = path.join(directory, "index.yaml");
let source: string;
try {
source = await readFile(indexPath, "utf8");
} catch (error) {
const reason = error instanceof Error ? error.message : String(error);
throw new Error(`${indexPath}: не удалось прочитать index.yaml: ${reason}`);
}
const document = parseDocument(source, { prettyErrors: true });
if (document.errors.length > 0) {
const errors = document.errors.map((error) => error.message).join("; ");
throw new Error(`${indexPath}: ${errors}`);
}
const data = document.toJS() as CatalogIndex;
if (data.type !== "category" && data.type !== "program") {
throw new Error(`${indexPath}: неизвестный type`);
}
if (typeof data.name !== "string" || data.name.length === 0) {
throw new Error(`${indexPath}: отсутствует название`);
}
const versions =
data.type === "program"
? (data.versions ?? []).map((entry, index) => {
if (typeof entry.version !== "string" || entry.version.length === 0) {
throw new Error(`${indexPath}: некорректная версия с индексом ${index}`);
}
if (
entry.status !== undefined &&
entry.status !== "current" &&
entry.status !== "archived"
) {
throw new Error(`${indexPath}: неизвестный статус версии ${entry.version}`);
}
return { version: entry.version, status: entry.status } as CatalogVersion;
})
: [];
const children: CatalogNode[] = [];
if (data.type === "category") {
const entries = await readdir(directory, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory()) {
continue;
}
const childDirectory = path.join(directory, entry.name);
try {
const childIndexStat = await lstat(path.join(childDirectory, "index.yaml"));
if (childIndexStat.isFile()) {
children.push(await readCatalogNode(childDirectory));
}
} catch (error) {
const code = (error as NodeJS.ErrnoException).code;
if (code !== "ENOENT") {
throw error;
}
}
}
}
children.sort(compareNodes);
return { type: data.type, name: data.name, directory, versions, children };
}
function formatNode(node: CatalogNode, showPaths: boolean): string {
const categorySuffix = node.type === "category" ? "/" : "";
if (!showPaths) {
return `${node.name}${categorySuffix}`;
}
const relativePath = path.relative(process.cwd(), node.directory) || ".";
return `${node.name}${categorySuffix} [${relativePath}]`;
}
function printChildren(
node: CatalogNode,
prefix: string,
options: Pick<Options, "showPaths" | "showVersions">,
): void {
const entries: Array<{ label: string; node?: CatalogNode }> = node.children.map(
(child) => ({ label: formatNode(child, options.showPaths), node: child }),
);
if (options.showVersions && node.type === "program") {
entries.push(
...node.versions.map(({ version, status }) => ({
label: `версия ${version}${status === undefined ? "" : ` [${status}]`}`,
})),
);
}
entries.forEach((entry, index) => {
const last = index === entries.length - 1;
console.log(`${prefix}${last ? "└── " : "├── "}${entry.label}`);
if (entry.node !== undefined) {
printChildren(entry.node, `${prefix}${last ? " " : "│ "}`, options);
}
});
}
async function main(): Promise<void> {
const options = parseArguments(process.argv.slice(2));
const directory = await resolveDirectory(options.target);
const root = await readCatalogNode(directory);
console.log(formatNode(root, options.showPaths));
printChildren(root, "", options);
}
try {
await main();
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
console.error(`Ошибка: ${message}`);
process.exitCode = 1;
}
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Драйверы
description: Драйверы устройств и кабелей для работы с мобильными телефонами.
Binary file not shown.
+16
View File
@@ -0,0 +1,16 @@
format: 1
type: program
name: PL-2303 Driver
description: >-
Модифицированный Chaos драйвер для дата-кабелей на чипсете Prolific PL-2303.
В отличие от штатного драйвера он позволяет флешерам обмениваться данными с
телефоном на скорости до 1625000 бит/с.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "2.0.5.26"
files:
- path: files/PL-2303_patched.rar
description: Драйвер PL-2303 с поддержкой скорости до 1625000 бит/с
platform: win32
sha256: ce4c19231e2e051a80267487c37062df0161569edc0f43013df7f6d1fa0565e6
+6
View File
@@ -0,0 +1,6 @@
format: 1
type: category
name: Инструменты прошивок
description: >-
Вспомогательные программы для анализа, распаковки и изменения файлов прошивок
и сервисных обновлений.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+186
View File
@@ -0,0 +1,186 @@
format: 1
type: program
name: WinSwup
description: |-
Сервисная программа Siemens для обновления программного обеспечения
телефонов. В каталоге представлены исполняемые комплекты и developer-пакеты
с Update DLL, загрузчиками, библиотеками, заголовочными файлами, примерами и
документацией.
screenshots: []
versions:
- version: "4.20-pre1"
status: current
released: "2006-05-08"
files:
- path: files/winswup-4.20.7z
description: Полный developer-пакет WinSwup 4.20 prerelease 1 с SDK,
документацией и утилитами
platform: win32
sha256: d317695a4ab32856167370d3f7cd527bf09c9f34db13530e23de34700d6c3efe
- version: "4.14p3"
status: archived
files:
- path: files/winswup-4.14p3.7z
description: Developer-пакет WinSwup 4.14p3 для SL75 Escada
platform: win32
sha256: 99a33142bb9b008a051bd6fe3212ffa3ccd9e38be3472059d5125dcd9783c21e
- version: "4.07"
status: archived
released: "2004-09-08"
files:
- path: files/winswup-4.07.7z
description: Полный developer-пакет WinSwup 4.07 с SDK и документацией
platform: win32
sha256: e27536eb975c6127ca7d61ac39d9edceb142fb3e4eaf91348992ea214f30d8f5
- version: "3.20"
status: current
files:
- path: files/winswup-3.20.rar
description: Прошивальщик для телефонов Siemens EGold и EGoldLite с
поддержкой XBI, XBZ и XFS
platform: win32
sha256: d497519b7f6c4bd95aacd93828f12d977110da86f612d7f55c3bcc2dc40e3677
- version: "3.19"
status: archived
files:
- path: files/winswup-3.19.7z
description: Полный developer-пакет WinSwup 3.19 для AL21
platform: win32
sha256: a797f2097ae96c678cc987b08fafd0b11b0c929e550751f8190b793f564dbc55
- version: "3.17"
status: archived
files:
- path: files/winswup-3.17.7z
description: Полный developer-пакет WinSwup 3.17 с SDK и документацией
platform: win32
sha256: 4a1e770a3f0f8c77108f6841b7d1fc605c41052f21cd734c3d5684bbdbdd1877
- version: "3.05"
status: archived
files:
- path: files/winswup-3.05.7z
description: Полный предварительный пакет WinSwup 3.05 с SDK и документацией
platform: win32
sha256: 613b329574723539cc5ec38630977dc5ca0db14718330f4d1e09f73c8e8016e3
- version: "3.002"
status: archived
files:
- path: files/winswup-3.002.7z
description: Компактный исполняемый комплект WinSwup 3.002
platform: win32
sha256: 20dc66b4b95651633ed5a5ea9d55cda430bce7ed089ca4031626b60e86b88d41
- version: "1.44"
status: archived
files:
- path: files/winswup-1.44.7z
description: Полный developer-пакет WinSwup 1.44 с SDK
platform: win32
sha256: 810f8f7b24ea27bd2c7e6746ea13ff8be4b7117fec46989a07c522d9eb60ef21
- version: "1.40"
status: archived
files:
- path: files/winswup-1.40.7z
description: Полный developer-пакет WinSwup 1.40 с SDK и документацией
platform: win32
sha256: 19e6d4ff841c00445fc953268efbe98d69aba261f9204ee896917a4d28472a95
- version: "1.35"
status: archived
files:
- path: files/winswup-1.35.7z
description: Исполняемый комплект WinSwup 1.35 с загрузчиком SGOLD
platform: win32
sha256: 4a947c38253e40502cee5019f62a5e9868a1f8e3661105a8a3a753187b5f92cc
- version: "1.34"
status: archived
files:
- path: files/winswup-1.34.7z
description: Исполняемый комплект WinSwup 1.34
platform: win32
sha256: 15ee3c94cb31c01d877898456d8aceababd4e5f7cd1313b4adb9e1afed3d2af5
- version: "1.30"
status: archived
files:
- path: files/winswup-1.30.7z
description: Полный developer-пакет WinSwup 1.30 с SDK
platform: win32
sha256: c12b5563409d9ff356299b5f7277ebeaaefe564b1cb71a7856636daf0156f690
- version: "1.28"
status: archived
files:
- path: files/winswup-1.28.7z
description: Полный developer-пакет WinSwup 1.28 с SDK
platform: win32
sha256: 783d123f2ce62253dd3c697efc8a622d027dd34388db6165b6a682ecf44246d0
- version: "1.27"
status: archived
files:
- path: files/winswup-1.27.7z
description: Полный developer-пакет WinSwup 1.27 с SDK
platform: win32
sha256: 986eb13ce887f77ed5b15d29fd587edbdf4b6bc3f41a510ad540dc385ef9ee95
- version: "1.23"
status: archived
files:
- path: files/winswup-1.23.7z
description: Исполняемый комплект WinSwup 1.23
platform: win32
sha256: d2c65b13d9e88f0a7bcbfc44b25b9b1b2901c8c5186c617acbd849b6cab8f76c
- version: "1.04"
status: archived
files:
- path: files/winswup-1.04.7z
description: Комплект WinSwup 1.04 с пакетами WC3I 2001 и 2008
platform: win32
sha256: cea1c7c0b1db441a1d35e364716d71d64e30710b6165b980e7f883a2f7fb4343
- version: "0.98"
status: archived
files:
- path: files/winswup-0.98.7z
platform: win32
sha256: 754d3e84d6653c1ef69713e7de3163dc87cc9bef0a5427fe5c792d51a3a3e263
- version: "0.98-pre"
status: archived
files:
- path: files/winswup-0.98-pre.7z
platform: win32
sha256: cd0e8b50fa2fdb33208eb0b73d69b04a94fbb8bc102fb99548fae0e98e83075f
- version: "0.97"
status: archived
files:
- path: files/winswup-0.97.7z
description: Комплект WinSwup 0.97 «Alle Produkte» с исходным ZIP-пакетом
platform: win32
sha256: cace85ee4ef5085b645855c502f74f18b11d8301c135c0f34442fc27c4b149c3
- version: "0.95"
status: archived
files:
- path: files/winswup-0.95.7z
description: Обычная сборка WinSwup 0.95
platform: win32
sha256: a1792894d1a1efa7e95de3f747a86c1e5eefc00c8914a7e78859dabeac57c2a3
- path: files/winswup-0.95-amd32.7z
description: Сборка WinSwup 0.95 с комплектом DLL AMD32
platform: win32
sha256: 5df6de4c09f872f2175dd7fe26d456ce7cb1dba254bfe6e2b41bd47e6acc9482
- version: "0.91"
status: archived
files:
- path: files/winswup-0.91.7z
platform: win32
sha256: 7ae4a7be7abc7f17fc6f0dd55d601da56226571aa8634dae38ba16f5f65b47ad
- version: "0.91-pre2"
status: archived
files:
- path: files/winswup-0.91-pre2.7z
platform: win32
sha256: c0c19ca1f49ab76f2c544adf0291d82172f1024c44606a1443bb365c588eced1
- version: "0.91-pre1"
status: archived
files:
- path: files/winswup-0.91-pre1.7z
platform: win32
sha256: 9254f44bc15d6e1027d96112860eb2b392d83de20b15a680037534704e460a9e
additional_files:
- path: files/WSMPlus2.rar
description: WinSwup Menu Plus 2 для включения дополнительных меню в сервисных SWUP
platform: win32
sha256: b1eb247567a4b5b66b8f796e6e3012481d819c825f400693fb26eae8b79f785f
Binary file not shown.
+16
View File
@@ -0,0 +1,16 @@
format: 1
type: program
name: WSFF
description: |-
Утилита для анализа структуры и распаковки баз сервисных прошивок Siemens
WinSwup.
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/
screenshots: []
versions:
- version: "4"
released: "2006-02-10"
files:
- path: files/WSFF4.rar
description: Программа WSFF4
platform: win32
sha256: e63fe5b665dad8322dbfab081b7c41bc0e40520d922d9a7d8166c5b53fe1b2c1
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Флешеры
description: Программы для чтения, записи и восстановления флеш-памяти телефонов.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+54
View File
@@ -0,0 +1,54 @@
format: 1
type: program
name: V_KLay
description: |-
Патчер, флешер и редактор раскладки клавиатуры для мобильных телефонов
Siemens.
Возможности:
- чтение и запись flash-памяти телефона;
- установка и отмена патчей в формате VKP;
- изменение раскладки клавиатуры;
- подключение через Password Boot, Chaos BootPatch, Bootcore bug, Patched
bootcore и Test point;
- работа с телефоном без выключения в режиме online, если модель и прошивка
поддерживают такой способ;
- многоязычный интерфейс, включая русский и украинский языки.
Версия 3.3 поддерживает Siemens 1168, 2118, 2128, 3118, 3618, 6618, 6688,
A35, A36, A40, A50, A52, A55, A60, A65, C30, C35, C45, C55, C60, C65,
CF62, CX65, M35, M50, M55, M65, MC60, ME45, MT50, S35, S40, S45, S55,
S65, SL42, SL45, SL55, SL65 и SX1.
homepage: https://web.archive.org/web/20130813164842/http://vi-soft.com.ua/
screenshots: []
versions:
- version: "3.3"
files:
- path: files/v_klay_setup.zip
description: Установочный пакет V_KLay 3.3
platform: win32
sha256: 9ef29148ea0a6f9c0ef2cb9a09da992bd1063920d891878709b066b22707b80f
- version: "2.7.2"
files:
- path: files/v_klay_setup_v272.zip
description: Установочный пакет V_KLay 2.7.2
platform: win32
sha256: f4e31a5fd9cdfb6b5f3b2612116ad0ca575d281dc5e4c0c4f85bba6226985cde
- version: "2.5"
files:
- path: files/v_klay_setup_v25.zip
description: Установочный пакет V_KLay 2.5
platform: win32
sha256: d78f69d0750a8e0d93349049d4dac3361202ad8fedb9f5479ca9f95505d250db
- version: "2.1.12"
files:
- path: files/v_klay_update_v2112.rar
description: Обновление до V_KLay 2.1.12
platform: win32
sha256: 5b6e4fe30ea81ef3a07892b297772aba811d04b15e2a93c482eb3da7d74e3b72
- version: "2.1.5.2"
files:
- path: files/v_klay_setup_v2152.rar
description: Англоязычный установочный пакет V_KLay 2.1.5.2
platform: win32
sha256: bc7c32ed37b9e75aa5316cef46661eb78240dd2911b89ba26ab30d88fff6d9a9
Binary file not shown.
Binary file not shown.
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
format: 1
type: program
name: x65flasher
description: |-
Флешер для телефонов Siemens 65–75-й серии и мидлеты для поиска boot-ключей.
Возможности:
- чтение и запись flash-памяти телефона;
- резервное копирование и восстановление как всего fullflash, так и отдельных
частей: файловой системы, прошивки и EEPROM;
- просмотр карты flash-памяти;
- работа на скорости от 57600 до 1600000 бит/с;
- генерация загрузчиков для V_Klay.
homepage: https://web.archive.org/web/20130813164842/http://chaos.allsiemens.com/software.html
screenshots: []
versions:
- version: "2.103"
released: "2006-12-06"
files:
- path: files/x65flasher-2103.rar
description: Флешер, документация и вспомогательные мидлеты
platform: win32
sha256: ad5ba3574b1f5a774948a8d62dc7fb51ef05b762d27e3000c0e5ba38360d4f41
additional_files:
- path: files/px75v1.rar
description: Мидлет для получения HASH и ESN на младших моделях телефонов
platform: j2me
sha256: 64fd3cca1fcb253a43f1c2101256a0050731598c6c35a0805d6a874c5893ce5c
- path: files/bsReader.zip
description: Мидлет для получения HASH и ESN на S75, SL75 и BenQ-Siemens
platform: j2me
sha256: e7c38947a9e042b0a9107760d79b3f5f6daa95a71b33c26d219453c80d943f55
+4
View File
@@ -0,0 +1,4 @@
format: 1
type: category
name: Сервисные программы
description: Программы для диагностики, обслуживания и восстановления телефонов.
+6
View File
@@ -0,0 +1,6 @@
format: 1
type: category
name: Ремонт и восстановление
description: >-
Сервисные программы для диагностики, восстановления и ремонта программной
части телефонов.
Binary file not shown.
Binary file not shown.
+38
View File
@@ -0,0 +1,38 @@
format: 1
type: program
name: Joker
description: |-
Сервисная программа для восстановления программных неисправностей телефонов
Siemens на платформе EGOLD с помощью обычного кабеля с минимальными
доработками. Поддерживаются A50A75, AX72/AX75, C55/C56/C60, CF62/CF110,
M55, MC60, S55/S56, SL55, SX1 и совместимые модели.
Возможности:
- чтение информации о телефоне и работа в режимах BFB и Service mode;
- чтение и запись FullFlash и отдельных flash-сегментов;
- резервное копирование и восстановление EEPROM и секретных блоков;
- вычисление и сохранение SKEY, BKEY, ESN, HASH и мастер-кодов;
- пересчёт ключей после записи FullFlash от другого аппарата;
- подготовка BCORE, устранение Freeze и дефрагментация EEPROM;
- автоматическое определение flash-памяти и контроль CRC при операциях записи.
Перед записью автор рекомендует обязательно сохранить ESN, HASH и полный
FullFlash рабочего телефона. Программа создавалась как экспериментальный
ремонтный инструмент; часть операций требует TestPoint.
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/Joker.htm
screenshots: []
versions:
- version: "0.3.4.1"
released: "2006-01-25"
files:
- path: files/JokerSorceV0341.rar
description: Исходный код Joker 0.3.4.1 для Borland Delphi
platform: win32
sha256: b6e539597dbe6d8af1e6a813a305ea30322e561ec5a9786aadba520d9c1963c5
- version: "0.2.9.5"
released: "2005-11-25"
files:
- path: files/JokerV0295.rar
description: Исполняемая программа Joker 0.2.9.5
platform: win32
sha256: 37a8805c5731ce74aa99b11c5f90580bce39b96c95b36cbd8adb72008df25e30
@@ -0,0 +1,20 @@
format: 1
type: program
name: Siemens EEPROM Tool
description: |-
Редактор файлов EEPROM телефонов Siemens. Используется совместно с
x65PapuaUtils и Joker для восстановления программно неисправных аппаратов,
работы с резервными копиями блоков EEPROM и исправления их содержимого.
Номер `3.01.0005` получен из ресурса версии исполняемого файла; имя исходного
архива — `SiemensEEPROMtool315plus.rar`.
homepage: https://web.archive.org/web/20130825050857/http://papuas.allsiemens.com/
screenshots: []
versions:
- version: "3.01.0005"
released: "2004-12-26"
files:
- path: files/SiemensEEPROMtool315plus.rar
description: Программа Siemens EEPROM Tool
platform: win32
sha256: 75249994aceab0836cfe26820f110dcaf61f411986b7d600d51ca57496d83e16
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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