Auto-generated API doc: doxygen → custom Python emitter → doc/api/.

`cmake --build build --target doc` runs Doxygen to produce XML, then
`doc/gen_api_md.py` (~330 lines, stdlib-only) emits a Markdown tree
under `doc/api/` that gitea renders directly in its file browser.

- 24 class/struct pages + 51 source-file pages + indices, with source
  links of the form `../../../../src/...#L42` that gitea turns into
  clickable line-anchored links.
- Doxyfile.in templated by CMake (XML-only output to build/doc/xml/).
- Pure Python emitter, zero external deps — no doxybook2 (not packaged
  on Arch) and no moxygen (avoids Node).
- Target gracefully disabled if Doxygen or Python 3 is missing at
  configure time; regular build target unaffected.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-12 08:13:15 +02:00
parent fe2dc13c89
commit 66460262af
83 changed files with 2845 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
# DESIGN.md
Source: [DESIGN.md](../../../../DESIGN.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# README.md
Source: [README.md](../../../../README.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# commands.cpp
Source: [commands.cpp](../../../../src/tui/commands.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# completion.cpp
Source: [completion.cpp](../../../../src/tui/completion.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# component_kind.cpp
Source: [component_kind.cpp](../../../../src/system/component_kind.cpp)
## Free Functions
### `const char * component_kind_name(ComponentKind k)`
📍 [component_kind.cpp:6](../../../../src/system/component_kind.cpp#L6)
### `bool component_kind_from_name(const std::string &s, ComponentKind &out)`
📍 [component_kind.cpp:21](../../../../src/system/component_kind.cpp#L21)
### `ComponentKind infer_component_kind(const std::string &part_name)`
📍 [component_kind.cpp:37](../../../../src/system/component_kind.cpp#L37)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,27 @@
# component_kind.hpp
Source: [component_kind.hpp](../../../../src/system/component_kind.hpp)
## Enums
### `enum ComponentKind`
📍 [component_kind.hpp:10](../../../../src/system/component_kind.hpp#L10)
## Free Functions
### `const char * component_kind_name(ComponentKind k)`
📍 [component_kind.hpp:22](../../../../src/system/component_kind.hpp#L22)
### `bool component_kind_from_name(const std::string &s, ComponentKind &out)`
📍 [component_kind.hpp:23](../../../../src/system/component_kind.hpp#L23)
### `ComponentKind infer_component_kind(const std::string &part_name)`
📍 [component_kind.hpp:24](../../../../src/system/component_kind.hpp#L24)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# connect.cpp
Source: [connect.cpp](../../../../src/system/connect.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,12 @@
# connect.hpp
Source: [connect.hpp](../../../../src/system/connect.hpp)
## Defines
- [Connection](../classes/Connection.md)
- [Connections](../classes/Connections.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# import_altium.cpp
Source: [import_altium.cpp](../../../../src/imports/import_altium.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,11 @@
# import_altium.hpp
Source: [import_altium.hpp](../../../../src/imports/import_altium.hpp)
## Defines
- [ImportAltium](../classes/ImportAltium.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,11 @@
# import_base.hpp
Source: [import_base.hpp](../../../../src/imports/import_base.hpp)
## Defines
- [ImportBase](../classes/ImportBase.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,18 @@
# import_mentor.cpp
Source: [import_mentor.cpp](../../../../src/imports/import_mentor.cpp)
## Enums
### `enum State`
📍 [import_mentor.cpp:17](../../../../src/imports/import_mentor.cpp#L17)
Enum representing the parsing state.
- NO_PART: No part is currently being processed.
- IS_PART: A part is currently being processed.
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,11 @@
# import_mentor.hpp
Source: [import_mentor.hpp](../../../../src/imports/import_mentor.hpp)
## Defines
- [ImportMentor](../classes/ImportMentor.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# import_ods.cpp
Source: [import_ods.cpp](../../../../src/imports/import_ods.cpp)
## Free Functions
### `std::string read_content_xml(const std::string &filename)`
📍 [import_ods.cpp:17](../../../../src/imports/import_ods.cpp#L17)
### `std::string cell_text(pugi::xml_node cell)`
📍 [import_ods.cpp:45](../../../../src/imports/import_ods.cpp#L45)
### `std::vector< std::string > expand_row(pugi::xml_node row)`
📍 [import_ods.cpp:57](../../../../src/imports/import_ods.cpp#L57)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,11 @@
# import_ods.hpp
Source: [import_ods.hpp](../../../../src/imports/import_ods.hpp)
## Defines
- [ImportOds](../classes/ImportOds.md)
---
← [Back to files](index.md) · [Top](../index.md)

57
doc/api/files/index.md Normal file
View File

@@ -0,0 +1,57 @@
# Source Files
| Path | Brief |
|---|---|
| [`commands.cpp`](commands_8cpp.md) | — |
| [`completion.cpp`](completion_8cpp.md) | — |
| [`component_kind.cpp`](component__kind_8cpp.md) | — |
| [`component_kind.hpp`](component__kind_8hpp.md) | — |
| [`connect.cpp`](connect_8cpp.md) | — |
| [`connect.hpp`](connect_8hpp.md) | — |
| [`DESIGN.md`](DESIGN_8md.md) | — |
| [`import_altium.cpp`](import__altium_8cpp.md) | — |
| [`import_altium.hpp`](import__altium_8hpp.md) | — |
| [`import_base.hpp`](import__base_8hpp.md) | — |
| [`import_mentor.cpp`](import__mentor_8cpp.md) | — |
| [`import_mentor.hpp`](import__mentor_8hpp.md) | — |
| [`import_ods.cpp`](import__ods_8cpp.md) | — |
| [`import_ods.hpp`](import__ods_8hpp.md) | — |
| [`main.cpp`](main_8cpp.md) | — |
| [`modules.cpp`](modules_8cpp.md) | — |
| [`modules.hpp`](modules_8hpp.md) | — |
| [`nets.cpp`](nets_8cpp.md) | — |
| [`nets.hpp`](nets_8hpp.md) | — |
| [`parts.cpp`](parts_8cpp.md) | — |
| [`parts.hpp`](parts_8hpp.md) | — |
| [`persist.cpp`](persist_8cpp.md) | — |
| [`persist.hpp`](persist_8hpp.md) | — |
| [`pin_name.cpp`](pin__name_8cpp.md) | — |
| [`pin_name.hpp`](pin__name_8hpp.md) | — |
| [`pin_role.cpp`](pin__role_8cpp.md) | — |
| [`pin_role.hpp`](pin__role_8hpp.md) | — |
| [`pins.cpp`](pins_8cpp.md) | — |
| [`pins.hpp`](pins_8hpp.md) | — |
| [`README.md`](README_8md.md) | — |
| [`screen_connect.cpp`](screen__connect_8cpp.md) | — |
| [`screen_explore.cpp`](screen__explore_8cpp.md) | — |
| [`screen_main.cpp`](screen__main_8cpp.md) | — |
| [`screen_net.cpp`](screen__net_8cpp.md) | — |
| [`screen_search.cpp`](screen__search_8cpp.md) | — |
| [`screen_settype.cpp`](screen__settype_8cpp.md) | — |
| [`shell.cpp`](shell_8cpp.md) | — |
| [`signal_type.hpp`](signal__type_8hpp.md) | — |
| [`signals.cpp`](signals_8cpp.md) | — |
| [`signals.hpp`](signals_8hpp.md) | — |
| [`syselmts.hpp`](syselmts_8hpp.md) | — |
| [`system.cpp`](system_8cpp.md) | — |
| [`system.hpp`](system_8hpp.md) | — |
| [`transform.cpp`](transform_8cpp.md) | — |
| [`transform.hpp`](transform_8hpp.md) | — |
| [`transform_vpx.cpp`](transform__vpx_8cpp.md) | — |
| [`transform_vpx.hpp`](transform__vpx_8hpp.md) | — |
| [`tui.cpp`](tui_8cpp.md) | — |
| [`tui.hpp`](tui_8hpp.md) | — |
| [`tui_helpers.cpp`](tui__helpers_8cpp.md) | — |
| [`tui_helpers.hpp`](tui__helpers_8hpp.md) | — |
← [Top](../index.md)

View File

@@ -0,0 +1,13 @@
# main.cpp
Source: [main.cpp](../../../../src/main.cpp)
## Free Functions
### `int main()`
📍 [main.cpp:3](../../../../src/main.cpp#L3)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# modules.cpp
Source: [modules.cpp](../../../../src/system/modules.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,12 @@
# modules.hpp
Source: [modules.hpp](../../../../src/system/modules.hpp)
## Defines
- [Module](../classes/Module.md)
- [Modules](../classes/Modules.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,25 @@
# nets.cpp
Source: [nets.cpp](../../../../src/system/nets.cpp)
## Free Functions
### `Net find_net(System *sys, Module *m, Signal *s)`
📍 [nets.cpp:69](../../../../src/system/nets.cpp#L69)
### `Net find_net(System *sys, Pin *pin)`
📍 [nets.cpp:78](../../../../src/system/nets.cpp#L78)
### `std::vector< Net > compute_all_nets(System *sys)`
📍 [nets.cpp:83](../../../../src/system/nets.cpp#L83)
### `bool net_type_consistent(const Net &net, SignalType &dominant)`
📍 [nets.cpp:102](../../../../src/system/nets.cpp#L102)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,29 @@
# nets.hpp
Source: [nets.hpp](../../../../src/system/nets.hpp)
## Defines
- [Net](../classes/Net.md)
## Free Functions
### `Net find_net(System *sys, Module *m, Signal *s)`
📍 [nets.hpp:21](../../../../src/system/nets.hpp#L21)
### `Net find_net(System *sys, Pin *pin)`
📍 [nets.hpp:24](../../../../src/system/nets.hpp#L24)
### `std::vector< Net > compute_all_nets(System *sys)`
📍 [nets.hpp:28](../../../../src/system/nets.hpp#L28)
### `bool net_type_consistent(const Net &net, SignalType &dominant)`
📍 [nets.hpp:32](../../../../src/system/nets.hpp#L32)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# parts.cpp
Source: [parts.cpp](../../../../src/system/parts.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,12 @@
# parts.hpp
Source: [parts.hpp](../../../../src/system/parts.hpp)
## Defines
- [Part](../classes/Part.md)
- [Parts](../classes/Parts.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,17 @@
# persist.cpp
Source: [persist.cpp](../../../../src/system/persist.cpp)
## Free Functions
### `bool save_system(const System *sys, const std::string &filename, std::string &error)`
📍 [persist.cpp:32](../../../../src/system/persist.cpp#L32)
### `System * restore_system(const std::string &filename, std::string &error)`
📍 [persist.cpp:84](../../../../src/system/persist.cpp#L84)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,17 @@
# persist.hpp
Source: [persist.hpp](../../../../src/system/persist.hpp)
## Free Functions
### `bool save_system(const System *sys, const std::string &filename, std::string &error)`
📍 [persist.hpp:10](../../../../src/system/persist.hpp#L10)
### `System * restore_system(const std::string &filename, std::string &error)`
📍 [persist.hpp:14](../../../../src/system/persist.hpp#L14)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,13 @@
# pin_name.cpp
Source: [pin_name.cpp](../../../../src/system/pin_name.cpp)
## Free Functions
### `std::string canonical_pin_name(const std::string &name)`
📍 [pin_name.cpp:7](../../../../src/system/pin_name.cpp#L7)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,13 @@
# pin_name.hpp
Source: [pin_name.hpp](../../../../src/system/pin_name.hpp)
## Free Functions
### `std::string canonical_pin_name(const std::string &name)`
📍 [pin_name.hpp:23](../../../../src/system/pin_name.hpp#L23)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# pin_role.cpp
Source: [pin_role.cpp](../../../../src/system/pin_role.cpp)
## Free Functions
### `SignalType pin_role(const std::string &kind, const std::string &pin_name)`
📍 [pin_role.cpp:43](../../../../src/system/pin_role.cpp#L43)
### `std::vector< std::string > pin_layout(const std::string &kind)`
📍 [pin_role.cpp:63](../../../../src/system/pin_role.cpp#L63)
### `int FillPartFromLayout(Part *p, const std::string &kind)`
📍 [pin_role.cpp:73](../../../../src/system/pin_role.cpp#L73)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# pin_role.hpp
Source: [pin_role.hpp](../../../../src/system/pin_role.hpp)
## Free Functions
### `SignalType pin_role(const std::string &connector_type, const std::string &pin_name)`
📍 [pin_role.hpp:18](../../../../src/system/pin_role.hpp#L18)
### `std::vector< std::string > pin_layout(const std::string &connector_type)`
📍 [pin_role.hpp:29](../../../../src/system/pin_role.hpp#L29)
### `int FillPartFromLayout(Part *p, const std::string &connector_type)`
📍 [pin_role.hpp:34](../../../../src/system/pin_role.hpp#L34)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# pins.cpp
Source: [pins.cpp](../../../../src/system/pins.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# pins.hpp
Source: [pins.hpp](../../../../src/system/pins.hpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_connect.cpp
Source: [screen_connect.cpp](../../../../src/tui/screen_connect.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_explore.cpp
Source: [screen_explore.cpp](../../../../src/tui/screen_explore.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_main.cpp
Source: [screen_main.cpp](../../../../src/tui/screen_main.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_net.cpp
Source: [screen_net.cpp](../../../../src/tui/screen_net.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_search.cpp
Source: [screen_search.cpp](../../../../src/tui/screen_search.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# screen_settype.cpp
Source: [screen_settype.cpp](../../../../src/tui/screen_settype.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# shell.cpp
Source: [shell.cpp](../../../../src/tui/shell.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,27 @@
# signal_type.hpp
Source: [signal_type.hpp](../../../../src/system/signal_type.hpp)
## Enums
### `enum SignalType`
📍 [signal_type.hpp:6](../../../../src/system/signal_type.hpp#L6)
## Free Functions
### `const char * signal_type_name(SignalType t)`
📍 [signal_type.hpp:8](../../../../src/system/signal_type.hpp#L8)
### `bool signal_type_from_name(const std::string &s, SignalType &out)`
📍 [signal_type.hpp:9](../../../../src/system/signal_type.hpp#L9)
### `SignalType infer_signal_type(const std::string &signal_name)`
📍 [signal_type.hpp:10](../../../../src/system/signal_type.hpp#L10)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# signals.cpp
Source: [signals.cpp](../../../../src/system/signals.cpp)
## Free Functions
### `const char * signal_type_name(SignalType t)`
📍 [signals.cpp:9](../../../../src/system/signals.cpp#L9)
### `bool signal_type_from_name(const std::string &s, SignalType &out)`
📍 [signals.cpp:18](../../../../src/system/signals.cpp#L18)
### `SignalType infer_signal_type(const std::string &name)`
📍 [signals.cpp:33](../../../../src/system/signals.cpp#L33)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,12 @@
# signals.hpp
Source: [signals.hpp](../../../../src/system/signals.hpp)
## Defines
- [Signal](../classes/Signal.md)
- [Signals](../classes/Signals.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,12 @@
# syselmts.hpp
Source: [syselmts.hpp](../../../../src/system/syselmts.hpp)
## Defines
- [SystemElement](../classes/SystemElement.md)
- [SystemElementContainer](../classes/SystemElementContainer.md)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# system.cpp
Source: [system.cpp](../../../../src/system/system.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,19 @@
# system.hpp
Source: [system.hpp](../../../../src/system/system.hpp)
## Defines
- [System](../classes/System.md)
## Enums
### `enum ImportType`
📍 [system.hpp:11](../../../../src/system/system.hpp#L11)
Forward declaration of the [Connections](../classes/Connections.md) class. class.
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,17 @@
# transform.cpp
Source: [transform.cpp](../../../../src/system/transform.cpp)
## Free Functions
### `std::string CheckIdentityCompatible(const Part *a, const Part *b, std::string *info)`
📍 [transform.cpp:17](../../../../src/system/transform.cpp#L17)
### `int FillIdentityNCs(Part *a, Part *b)`
📍 [transform.cpp:59](../../../../src/system/transform.cpp#L59)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,23 @@
# transform.hpp
Source: [transform.hpp](../../../../src/system/transform.hpp)
## Defines
- [Transform](../classes/Transform.md)
- [IdentityTransform](../classes/IdentityTransform.md)
- [TransformRegistry](../classes/TransformRegistry.md)
## Free Functions
### `std::string CheckIdentityCompatible(const Part *a, const Part *b, std::string *info=nullptr)`
📍 [transform.hpp:22](../../../../src/system/transform.hpp#L22)
### `int FillIdentityNCs(Part *a, Part *b)`
📍 [transform.hpp:29](../../../../src/system/transform.hpp#L29)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,17 @@
# transform_vpx.cpp
Source: [transform_vpx.cpp](../../../../src/system/transform_vpx.cpp)
## Free Functions
### `std::string ValidatePartForKind(const Part *p, const std::string &kind)`
📍 [transform_vpx.cpp:159](../../../../src/system/transform_vpx.cpp#L159)
### `void RegisterVpxTransforms(TransformRegistry &reg)`
📍 [transform_vpx.cpp:190](../../../../src/system/transform_vpx.cpp#L190)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,21 @@
# transform_vpx.hpp
Source: [transform_vpx.hpp](../../../../src/system/transform_vpx.hpp)
## Defines
- [VpxTransform](../classes/VpxTransform.md)
## Free Functions
### `void RegisterVpxTransforms(TransformRegistry &reg)`
📍 [transform_vpx.hpp:43](../../../../src/system/transform_vpx.hpp#L43)
### `std::string ValidatePartForKind(const Part *p, const std::string &kind)`
📍 [transform_vpx.hpp:50](../../../../src/system/transform_vpx.hpp#L50)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,7 @@
# tui.cpp
Source: [tui.cpp](../../../../src/tui/tui.cpp)
---
← [Back to files](index.md) · [Top](../index.md)

14
doc/api/files/tui_8hpp.md Normal file
View File

@@ -0,0 +1,14 @@
# tui.hpp
Source: [tui.hpp](../../../../src/tui/tui.hpp)
## Defines
- [Tui](../classes/Tui.md)
- `Tui::Prompt`
- `Tui::CommandSpec`
- `Tui::CommandSpec::Param`
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,25 @@
# tui_helpers.cpp
Source: [tui_helpers.cpp](../../../../src/tui/tui_helpers.cpp)
## Free Functions
### `std::string ToLower(std::string s)`
📍 [tui_helpers.cpp:6](../../../../src/tui/tui_helpers.cpp#L6)
### `bool NaturalLess(const std::string &a, const std::string &b)`
📍 [tui_helpers.cpp:12](../../../../src/tui/tui_helpers.cpp#L12)
### `std::string LongestCommonPrefix(const std::vector< std::string > &v)`
📍 [tui_helpers.cpp:45](../../../../src/tui/tui_helpers.cpp#L45)
### `std::vector< std::string > Tokenize(const std::string &s)`
📍 [tui_helpers.cpp:56](../../../../src/tui/tui_helpers.cpp#L56)
---
← [Back to files](index.md) · [Top](../index.md)

View File

@@ -0,0 +1,29 @@
# tui_helpers.hpp
Source: [tui_helpers.hpp](../../../../src/tui/tui_helpers.hpp)
## Free Functions
### `ftxui::Element FocusLabel(ftxui::Element e, bool focused)`
📍 [tui_helpers.hpp:13](../../../../src/tui/tui_helpers.hpp#L13)
### `std::string ToLower(std::string s)`
📍 [tui_helpers.hpp:17](../../../../src/tui/tui_helpers.hpp#L17)
### `bool NaturalLess(const std::string &a, const std::string &b)`
📍 [tui_helpers.hpp:21](../../../../src/tui/tui_helpers.hpp#L21)
### `std::string LongestCommonPrefix(const std::vector< std::string > &v)`
📍 [tui_helpers.hpp:23](../../../../src/tui/tui_helpers.hpp#L23)
### `std::vector< std::string > Tokenize(const std::string &s)`
📍 [tui_helpers.hpp:26](../../../../src/tui/tui_helpers.hpp#L26)
---
← [Back to files](index.md) · [Top](../index.md)