Migrate all repos into monorepo context folders

Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
      Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
      Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)

Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
2026-06-30 20:39:52 +02:00
parent 2f2b295531
commit a5f8fb49ab
1717 changed files with 447332 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
.venv/
venv/
# IDE / Editor
.idea/
.vscode/
*.swp
*~
# OS
.DS_Store
Thumbs.db
# Lokale Kiro-Workspace-Konfig (Skills selbst sind unter skills/)
.kiro/
+307
View File
@@ -0,0 +1,307 @@
DB Inner Source Lizenz Version 1.0
_Fachautoren: Cornelius Schumacher, Schlomo Schapiro (DB Systel GmbH)_
Diese Inner-Source-Lizenz für die Deutsche Bahn („DBISL“) gilt für Werke
(im Sinne der nachfolgenden Begriffsbestimmung), die unter
DBISL-Bedingungen zur Verfügung gestellt werden. Das Werk darf nur in
der durch diese Lizenz gestatteten Form genutzt werden (insoweit eine
solche Nutzung dem Urheber vorbehalten ist).
Das Werk wird unter den Bedingungen dieser Lizenz zur Verfügung
gestellt, wenn der Lizenzgeber (im Sinne der nachfolgenden
Begriffsbestimmung) den folgenden Hinweis unmittelbar hinter dem
Urheberrechtshinweis dieses Werks anbringt:
„Lizenziert unter der DBISL“ oder alternativ „Licensed under the DBISL“
oder in einer anderen Form zum Ausdruck bringt, dass er es unter der
DBISL lizenzieren möchte.
== 1. Begriffsbestimmungen
Für diese Lizenz gelten folgende Begriffsbestimmungen:
* „Lizenz“: diese Lizenz.
* „Originalwerk“: das Werk oder die Software, die vom Lizenzgeber unter
dieser Lizenz verbreitet oder zugänglich gemacht wird, und zwar als
Quellcode und gegebenenfalls auch als ausführbarer Code.
* „Bearbeitungen“: die Werke oder Software, die der Lizenznehmer auf der
Grundlage des Originalwerks oder seiner Bearbeitungen schaffen kann. In
dieser Lizenz wird nicht festgelegt, wie umfangreich die Änderung oder
wie stark die Abhängigkeit vom Originalwerk für eine Einstufung als
Bearbeitung sein muss; dies bestimmt sich nach dem anwendbaren
Urheberrecht
* „Werk“: das Originalwerk oder seine Bearbeitungen.
* „Quellcode“: diejenige Form des Werkes, die zur Auffassung durch den
Menschen bestimmt ist und die am besten geeignet ist, um vom Menschen
verstanden und verändert zu werden.
* „Ausführbarer Code“: die — üblicherweise — kompilierte Form des Werks,
die von einem Computer als Programm ausgeführt werden soll.
* „Lizenzgeber“: die juristische Person innerhalb des DB Konzerns, die
das Werk unter der Lizenz verbreitet oder zugänglich macht.
* „Urheberrechtsinhaber/Autor“: jeder, der bestimmte von ihm selbst
entwickelte oder von Dritten vorgegebene Aufgabenstellungen in ein
Originalwerk umsetzt oder am Originalwerk eine Bearbeitung vornimmt.
* „Bearbeiter“: jeder, der das Werk unter der Lizenz verändert oder auf
andere Weise zur Schaffung einer Bearbeitung beiträgt. Jeder Autor ist
auch Bearbeiter.
* „Lizenznehmer“ („Sie“, „Ihnen“): jede juristische Person innerhalb des
DB Konzerns, die das Werk unter den Lizenzbedingungen nutzt.
* „Verbreitung“ oder „Zugänglichmachung“: alle Formen von Verkauf,
Überlassung, Verleih, Vermietung, Verbreitung, Weitergabe, Übermittlung
oder anderweitiger Online- oder Offline-Bereitstellung von
Vervielfältigungen des Werks oder Zugänglichmachung seiner wesentlichen
Funktionen für dritte natürliche oder juristische Personen.
* „Beitrag“: jedes urheberrechtliche Werk, einschließlich des
Originalwerks sowie jeglicher Änderungen, die der Bearbeiter vornimmt,
und die dem Lizenzgeber bewusst zur Aufnahme in das Werk eingereicht
werden.
* „DB“ oder „DB Konzern“: die Deutsche Bahn AG und alle mit ihr nach §
15 AktG verbundenen Unternehmen.
== 2. Umfang der Lizenzrechte
Der Lizenzgeber erteilt Ihnen hiermit eine weltweite, unentgeltliche,
nicht ausschließliche, unterlizenzierbare Lizenz, die Sie für
Geschäftszwecke des DB Konzerns berechtigt:
* das Werk uneingeschränkt zu nutzen,
* das Werk zu vervielfältigen,
* das Werk zu verändern und Bearbeitungen auf der Grundlage des Werks zu
schaffen,
* das Werk oder Vervielfältigungen davon innerhalb der DB zu verbreiten,
Für die Wahrnehmung dieser Rechte können beliebige, derzeit bekannte
oder künftige Medien, Träger und Formate verwendet werden, soweit das
geltende Recht dem nicht entgegensteht.
Der Lizenzgeber erteilt dem Lizenznehmer ein nicht ausschließliches,
unentgeltliches Nutzungsrecht an seinen Patenten, sofern dies zur
Ausübung der durch die Lizenz erteilten Nutzungsrechte am Werk notwendig
ist.
== 3. Zugänglichmachung des Quellcodes
Der Lizenzgeber kann das Werk entweder als Quellcode oder als
ausführbaren Code zur Verfügung stellen. Stellt er es als ausführbaren
Code zur Verfügung, so stellt er darüber hinaus eine maschinenlesbare
Kopie des Quellcodes für jedes von ihm verbreitete
Vervielfältigungsstück des Werks zur Verfügung, oder er verweist in
einem Vermerk im Anschluss an den dem Werk beigefügten
Urheberrechtshinweis auf einen Speicherort, an dem problemlos und
unentgeltlich auf den Quellcode zugegriffen werden kann, solange der
Lizenzgeber das Werk verbreitet oder zugänglich macht.
== 4. Einschränkungen des Urheberrechts
Es ist nicht Zweck dieser Lizenz, Ausnahmen oder Schranken der
ausschließlichen Rechte des Urhebers am Werk, die dem Lizenznehmer
zugutekommen, einzuschränken. Auch die Erschöpfung dieser Rechte bleibt
von dieser Lizenz unberührt.
== 5. Pflichten des Lizenznehmers
Die Einräumung der oben genannten Rechte ist an mehrere Beschränkungen
und Pflichten für den Lizenznehmer gebunden:
* Inner Source: Der Lizenznehmer darf das Werk ausschließlich für
Geschäftszwecke des DB Konzerns nutzen.
* Urheberrechtshinweis, Lizenztext, Nennung des Bearbeiters: Der
Lizenznehmer muss alle Urheberrechts-, Patent- oder Markenrechtshinweise
und alle Hinweise auf die Lizenz und den Haftungsausschluss unverändert
lassen. Jedem von ihm verbreiteten oder zugänglich gemachten
Vervielfältigungsstück des Werks muss der Lizenznehmer diese Hinweise
sowie diese Lizenz beifügen. Der Lizenznehmer muss auf jedem
abgeleiteten Werk deutlich darauf hinweisen, dass das Werk geändert
wurde, und das Datum der Bearbeitung angeben.
* „Copyleft“-Klausel: Der Lizenznehmer darf Vervielfältigungen des
Originalwerks oder Bearbeitungen nur unter den Bedingungen dieser DBISL
oder einer neueren Version dieser Lizenz innerhalb der DB verbreiten
oder zugänglich machen. Der Lizenznehmer (der zum Lizenzgeber wird) darf
für das Werk oder die Bearbeitung keine zusätzlichen Bedingungen
anbieten oder vorschreiben, die die Bedingungen dieser Lizenz verändern
oder einschränken.
* Bereitstellung des Quellcodes: Wenn der Lizenznehmer
Vervielfältigungsstücke des Werks verbreitet oder zugänglich macht, muss
er eine maschinenlesbare Fassung des Quellcodes mitliefern oder einen
Speicherort angeben, über den problemlos und unentgeltlich so lange auf
diesen Quellcode zugegriffen werden kann, wie der Lizenznehmer das Werk
verbreitet oder zugänglich macht.
* Rechtsschutz: Diese Lizenz erlaubt nicht die Benutzung von
Kennzeichen, Marken oder geschützten Namensrechten des Lizenzgebers,
soweit dies nicht für die angemessene und übliche Beschreibung der
Herkunft des Werks und der inhaltlichen Wiedergabe des
Urheberrechtshinweises erforderlich ist.
== 6. Urheber und Bearbeiter
Der ursprüngliche Lizenzgeber gewährleistet, dass er das Urheberrecht am
Originalwerk innehat oder dieses an ihn lizenziert wurde und dass er
befugt ist, diese Lizenz zu erteilen.
Jeder Bearbeiter gewährleistet, dass er das Urheberrecht an den von ihm
vorgenommenen Änderungen des Werks besitzt und befugt ist, einen Beitrag
unter dieser Lizenz zu erstellen und beizutragen.
Für jeden Fall, in dem der Lizenznehmer die Lizenz annimmt, erteilt der
ursprüngliche Lizenzgeber und alle folgenden Bearbeiter eine Befugnis
zur Nutzung der Beiträge zum Werk unter den Bedingungen dieser Lizenz.
== 7. Gewährleistungsausschluss
Falls die konzerninternen Leistungsbedingungen keine Anwendung finden,
gelten die folgenden Regelungen.
Die Arbeit an diesem Werk wird laufend fortgeführt; es wird durch
unzählige Bearbeiter ständig verbessert. Das Werk ist nicht vollendet
und kann daher Fehler („Bugs“) enthalten, die dieser Art der Entwicklung
inhärent sind.
Aus den genannten Gründen wird das Werk unter dieser Lizenz „so, wie es
ist“ ohne jegliche Gewährleistung zur Verfügung gestellt. Dies gilt
unter anderem — aber nicht ausschließlich — für Marktreife,
Verwendbarkeit für einen bestimmten Zweck, Mängelfreiheit, Richtigkeit
sowie Nichtverletzung von anderen Immaterialgüterrechten als dem
Urheberrecht (vgl. dazu Artikel 6 dieser Lizenz).
Dieser Gewährleistungsausschluss ist wesentlicher Bestandteil der Lizenz
und Bedingung für die Einräumung von Rechten an dem Werk.
== 8. Haftungsausschluss/Haftungsbeschränkung
Falls die konzerninternen Leistungsbedingungen keine Anwendung finden,
gelten die folgenden Regelungen.
Außer in Fällen von Vorsatz oder der Verursachung von Personenschäden
haftet der Lizenzgeber nicht für direkte oder indirekte, materielle oder
immaterielle Schäden irgendwelcher Art, die aus der Lizenz oder der
Benutzung des Werks folgen; dies gilt unter anderem, aber nicht
ausschließlich, für Firmenwertverluste, Produktionsausfall,
Computerausfall oder Computerfehler, Datenverlust oder wirtschaftliche
Schäden, und zwar auch dann, wenn der Lizenzgeber auf die Möglichkeit
solcher Schäden hingewiesen wurde. Unabhängig davon haftet der
Lizenzgeber im Rahmen der gesetzlichen Produkthaftung, soweit die
entsprechenden Regelungen auf das Werk anwendbar sind.
== 9. Zusatzvereinbarungen
Wenn der Lizenznehmer das Werk verbreitet, kann er Zusatzvereinbarungen
schließen, in denen Verpflichtungen oder Dienstleistungen festgelegt
werden, die mit dieser Lizenz vereinbar sind.
Der Lizenznehmer darf Verpflichtungen nur in seinem eigenen Namen
eingehen, nicht jedoch im Namen des ursprünglichen Lizenzgebers oder
eines anderen Bearbeiters, und nur, wenn er sich gegenüber allen
Bearbeitern verpflichtet, sie zu entschädigen, zu verteidigen und von
der Haftung freizustellen, falls aufgrund der von ihm eingegangenen
Gewährleistungsverpflichtung oder Haftungsübernahme Forderungen gegen
sie geltend gemacht werden oder eine Haftungsverpflichtung entsteht.
== 10. Annahme der Lizenz
Der Lizenznehmer stimmt den Bestimmungen dieser Lizenz zu, indem er das
Symbol „Lizenz annehmen“ unter dem Fenster mit dem Lizenztext anklickt
oder indem er seine Zustimmung auf vergleichbare Weise gibt. Das
Anklicken des Symbols gilt als Anzeichen der eindeutigen und
unwiderruflichen Annahme der Lizenz und der darin enthaltenen Klauseln
und Bedingungen.
In gleicher Weise gilt als Zeichen der eindeutigen und unwiderruflichen
Zustimmung die Ausübung eines Rechtes, das in Artikel 2 dieser Lizenz
angeführt ist, wie das Erstellen einer Bearbeitung oder die Verbreitung
oder Zugänglichmachung des Werks oder dessen Vervielfältigungen.
== 11. Informationspflichten
Wenn der Lizenznehmer das Werk verbreitet oder zugänglich macht
(beispielsweise, indem er es zum Herunterladen von einer Website
anbietet), muss der Lizenznehmer über den Vertriebskanal oder das
benutzte Verbreitungsmedium dem Adressatenkreis bzw. der Öffentlichkeit
Mindest-Informationen bereitstellen, üblicherweise bezüglich der
Lizenzgeber, der Lizenz und ihrer Zugänglichkeit, des Abschlusses des
Lizenzvertrags sowie darüber, wie die Lizenz durch den Lizenznehmer
gespeichert und vervielfältigt werden kann.
== 12. Beendigung der Lizenz
Die Lizenz und die damit eingeräumten Rechte erlöschen automatisch, wenn
der Lizenznehmer gegen die Lizenzbedingungen verstößt.
Ein solches Erlöschen der Lizenz führt nicht zum Erlöschen der Lizenzen
von Dritten, denen das Werk vom Lizenznehmer unter dieser Lizenz zur
Verfügung gestellt worden ist, solange diese Personen die
Lizenzbedingungen erfüllen.
== 13. Einreichung von Beiträgen
Sofern nichts ausdrücklich anderes angegeben, unterliegt jeder Beitrag,
den der Lizenzgeber bewusst zur Aufnahme in das Werk eingereicht hat,
den Bedingungen dieser Lizenz, ohne dass zusätzliche Bedingungen gelten.
Ungeachtet des Vorstehenden ersetzt oder ändert keine der hierin
enthaltenen Bestimmungen die Bedingungen einer separaten
Lizenzvereinbarung, die der Auftraggeber möglicherweise mit dem
Auftragnehmer für solche Beiträge abgeschlossen hat.
Für die Länder, in denen Urheberpersönlichkeitsrechte an einem Werk
entstehen können, verzichtet der Urheberrechtsinhaber/Autor im
gesetzlich zulässigen Umfang auf seine Urheberpersönlichkeitsrechte, um
die Lizenzierung der oben aufgeführten Verwertungsrechte wirksam
durchführen zu können.
== 14. Sonstiges
Unbeschadet des Artikels 9 stellt diese Lizenz die vollständige
Vereinbarung der Parteien über das Werk dar.
Es gilt deutsches Recht. Sind einzelne Bestimmungen der Lizenz nach
geltendem Recht nichtig oder unwirksam, so berührt dies nicht die
Wirksamkeit oder Durchsetzbarkeit der Lizenz an sich. Solche
Bestimmungen werden vielmehr dergestalt ausgelegt oder modifiziert, dass
sie wirksam und durchsetzbar sind.
== 15. Gesellschaftsrechtliche Veränderungen
Bei gesellschaftsrechtlichen Veränderungen, z.B. dem Verkauf oder der
Abspaltung einer DB Gesellschaft, gilt folgende Regelungen in Anlehnung
an §12 Beendigungsunterstützung der konzerninternen
Leistungsbedingungen:
Eine weitere Nutzung der lizenzierten Software durch ein nicht mehr dem
DB Konzern angehöriges Unternehmen unterliegt der Zustimmung durch die
Urheber bzw. das CIO Board.
== 16. Lizenzänderungen
Die Urheber eines Werks können gemeinsam eine Änderung der Lizenz
entscheiden, z.B. um das Werk als Open Source Software zu
veröffentlichen. Falls die Urheber nicht verfügbar sind oder sich nicht
einigen können, so kann das CIO Board stellvertretend für alle Urheber
innerhalb der DB die Änderung der Lizenz für ein Werk beschließen.
== 17. Streitbeilegung
Unbeschadet der Regelungen in den konzerninternen Leistungsbedingungen
zwischen den Parteien gilt zwischen den Parteien Folgendes:
Bei Streitigkeiten im Zusammenhang mit der Auslegung und Anwendung
dieser Lizenz, bei denen mehr als ein Konzernunternehmen beteiligt ist,
dient das CIO Board des Konzerns als Entscheidungsgremium, welches von
jeder Partei angerufen werden kann.
== 18. Lizenz der Lizenz
Dieser Lizenztext ist lizenziert unter einer
„https://creativecommons.org/licenses/by/4.0/[Creative Commons
Namensnennung 4.0 International Lizenz]“ (CC-BY 4.0).
Sie dürfen diesen Lizenztext für sich kopieren und anpassen, solange Sie
dabei die Deutsche Bahn Marke und „DB“ nur innerhalb der DB benutzen.
Falls Sie das Material für die Verwendung außerhalb der DB anpassen, so
müssen Sie alle Nennungen der Deutschen Bahn und DB ersetzen bzw.
entfernen. Geänderte Versionen des Lizenztextes müssen klar als
geänderte Versionen kenntlich gemacht werden.
Teile des Textes dieser Lizenz basieren auf der EU Public License (EUPL)
v1.2.
+228
View File
@@ -0,0 +1,228 @@
# AI Support - Prompts, Steering Files & Skills
Sammlung von Prompts, Steering-Dateien und Skills für die Arbeit mit AI-Assistenten und LLMs.
## Inhaltsverzeichnis
- [Überblick](#überblick)
- [Struktur](#struktur)
- [Steering Files](#steering-files)
- [Prompts](#prompts)
- [Skills](#skills)
- [Verwendung](#verwendung)
- [Beitragen](#beitragen)
## Überblick
Dieses Repository enthält wiederverwendbare Bausteine für die effektive Nutzung von
AI-Assistenten wie Kiro:
- **Steering Files** — kontextuelle Anleitung, die in Sessions automatisch oder manuell eingebunden wird
- **Prompts** — fertige Prompt-Vorlagen für wiederkehrende Aufgaben
- **Skills** — abgeschlossene, ausführbare Pakete mit Workflow, Assets und Code (z. B. PowerPoint-Generator)
Alle Bausteine sind so strukturiert, dass sie einfach in verschiedene Projekte übernommen werden können.
## Struktur
```
.
├── steering/ # Steering-Dateien für AI-Assistenten
│ ├── agent-behaviour.md # Grundlegende Verhaltensregeln
│ ├── codebase-summary.sop.md # SOP für Codebase-Dokumentation
│ ├── einfachbahn-naming.md # Schreibweise #Einfachbahn (always)
│ └── onboarding-dokumentation.md # Onboarding-Dokumentation erstellen
├── powers/ # Kiro Powers (on-demand Plattformwissen)
│ ├── db-dxp-platform/ # DXP-Ökosystem-Nachschlagewerk
│ ├── db-openshift-deploy/ # Manuelles OpenShift-Deployment
│ ├── db-pipeship-onboarding/ # pipeship CI/CD Setup
│ └── db-scm-info-compliance/ # scm-info.yaml + Compliance Suite
├── prompts/ # Wiederverwendbare Prompts
│ └── unit-tests-motivation.md # Anleitung für Unit-Test-Erstellung
├── skills/ # Self-contained Skills (Workflow + Assets + Code)
│ └── pptx-infrago/ # PowerPoint im DB InfraGO Corporate Design
└── README.md
```
## Steering Files
Steering-Dateien bieten kontextuelle Anleitung für AI-Assistenten während der gesamten Interaktion.
### agent-behaviour.md
Grundlegende Verhaltensregeln für AI-Assistenten:
- Code-Überprüfung bei Unsicherheit
- Klärende Fragen stellen
**Verwendung:** Wird automatisch global eingebunden
### codebase-summary.sop.md
Standard Operating Procedure für die Erstellung umfassender Codebase-Dokumentation:
- Automatische Analyse von Architektur und Komponenten
- Generierung von AGENTS.md, README.md, CONTRIBUTING.md
- Update-Modus für inkrementelle Aktualisierungen
- Mermaid-Diagramme für Visualisierungen
**Verwendung:** Wird automatisch global eingebunden
### einfachbahn-naming.md
Schreibweise des Teamnamens `#Einfachbahn` — immer mit Hashtag, großem E, keine Leerzeichen.
**Verwendung:** Wird automatisch global eingebunden
### onboarding-dokumentation.md
Strukturierter Plan für die Erstellung von Onboarding-/Migrationsdokumentation:
- 7-Schritte-Prozess mit Fortschrittsverfolgung
- Fokus auf fachliche End-to-End-Flüsse
- Externe Schnittstellen und Datenmodelle
- Mermaid-Diagramme für alle Visualisierungen
**Verwendung:** `#onboarding-dokumentation` im Chat referenzieren
## Powers
Powers liefern gebündeltes Plattformwissen, das Kiro bei passenden Fragen on-demand aktiviert.
Quelle: [einfachbahn-lab/kiro_tools/power_skills_and_more](https://git.tech.rz.db.de/einfachbahn-lab/kiro_tools/power_skills_and_more)
| Power | Zweck |
|-------|-------|
| `db-openshift-deploy` | Manuelles Deployment: Docker → Artifactory → OpenShift |
| `db-pipeship-onboarding` | Repo mit pipeship aufsetzen (CI/CD, K8s, Trivy, Renovate) |
| `db-dxp-platform` | DXP-Ökosystem-Nachschlagewerk (pipeship, CDaaS, Portal) |
| `db-scm-info-compliance` | `scm-info.yaml` erstellen/validieren + Compliance-Checks |
**Installation:** Power-Ordner über Kiro Powers-UI als „Local Directory" hinzufügen.
Details: [`powers/README.md`](powers/README.md)
## Prompts
### unit-tests-motivation.md
Umfassende Anleitung für die Erstellung qualitativ hochwertiger Unit Tests:
- JUnit 5 + Mockito Guidelines
- AAA-Pattern (Arrange-Act-Assert)
- 80%+ Code Coverage Ziel
- Constraints und Best Practices
- Verifizierung und Troubleshooting
**Verwendung:** `#unit-tests-motivation` im Chat referenzieren
## Skills
Skills sind self-contained Pakete nach der [Agent Skills Specification](https://agentskills.io/specification):
ein `SKILL.md` mit Workflow plus mitgelieferte Assets und Code. Im Gegensatz zu Steering-Dateien
oder Prompts bringt ein Skill alles mit, was zur Ausführung gebraucht wird.
### pptx-infrago
PowerPoint-Präsentationen (`.pptx`) im DB InfraGO Corporate Design mit Python:
- Nutzt den offiziellen DB InfraGO Folienmaster (31 Layouts) — Logo, Footer, Foliennummer und Farben kommen automatisch vom Master
- Eine Funktion pro Layout im Helper-Modul `db_infrago_pptx.py`
- 10 mitgelieferte Hintergrundbilder mit thematischer Auswahl-Heuristik
- Geführter 5-Schritte-Workflow: Infos sammeln → Bild wählen → Gliederung → Skript generieren → ausführen und öffnen
**Verwendung:** Skill-Ordner nach `~/.kiro/skills/pptx-infrago/` (global) oder
`<projekt>/.kiro/skills/pptx-infrago/` (projektspezifisch) kopieren. Aktivierung
durch Keywords wie „PowerPoint", „PPTX", „Foliensatz" oder explizit per
`@pptx-infrago` im Chat.
Voraussetzung: `pip install python-pptx`
## Verwendung
### In Kiro
1. **Globale Steering Files:**
- Kopiere Dateien nach `~/.kiro/steering/` für projektübergreifende Nutzung
- Oder nach `.kiro/steering/` für projektspezifische Nutzung
2. **Manuelle Steering Files:**
- Referenziere mit `#dateiname` im Chat (z.B. `#onboarding-dokumentation`)
3. **Prompts:**
- Kopiere in dein Projekt und referenziere mit `#dateiname`
4. **Skills:**
- Kopiere den kompletten Skill-Ordner (z. B. `skills/pptx-infrago/`) nach
`~/.kiro/skills/<skill-name>/` für globale Verfügbarkeit
- Oder nach `<projekt>/.kiro/skills/<skill-name>/` für projektspezifische Nutzung
- Skills aktivieren sich automatisch über die Keywords im Frontmatter ihrer
`SKILL.md`, lassen sich aber auch explizit über den Skill-Namen ansprechen
### Beispiele
```
# Onboarding-Dokumentation erstellen
#onboarding-dokumentation
Erstelle eine Onboarding-Dokumentation für dieses Projekt anhand des Plans.
# Unit Tests schreiben
#unit-tests-motivation
Schreibe Unit Tests für die UserService Klasse nach diesem Leitfaden.
# Codebase-Dokumentation generieren
Erstelle eine AGENTS.md für dieses Projekt mit Fokus auf Architektur und Entwicklungspatterns.
```
### Von Steering zu Spec: Projektspezifische Dokumentation
Die Steering-Dateien in diesem Repository sind generische Vorlagen. Für konkrete Projekte empfiehlt es sich, daraus eine **projektspezifische Spec** zu erstellen:
**Warum eine Spec erstellen?**
- Specs ermöglichen strukturierte, schrittweise Umsetzung komplexer Aufgaben
- Fortschrittsverfolgung und Iterationen mit Feedback
- Anpassung der generischen Vorlage an projektspezifische Anforderungen
- Dokumentation des Prozesses und der Entscheidungen
**Workflow:**
1. **Steering-Datei als Basis nutzen:**
```
#onboarding-dokumentation
Erstelle eine Spec für dieses Projekt basierend auf dieser Steering-Datei.
Passe die Tasks an die spezifischen Anforderungen dieses Projekts an.
```
2. **Kiro erstellt eine projektspezifische Spec:**
- Analysiert das aktuelle Projekt
- Passt die 7 Tasks an die Projektstruktur an
- Erstellt eine `.kiro/specs/onboarding-dokumentation.md` Datei
- Ermöglicht schrittweise Umsetzung mit Fortschrittsverfolgung
3. **Spec ausführen:**
- Öffne die Spec-Datei in Kiro
- Arbeite Task für Task durch
- Kiro aktualisiert den Fortschritt automatisch
- Iteriere bei Bedarf einzelne Tasks
**Beispiel-Prompt:**
```
#onboarding-dokumentation
Analysiere dieses Projekt und erstelle eine projektspezifische Spec
für die Onboarding-Dokumentation. Berücksichtige dabei:
- Die tatsächliche Projektstruktur und Technologien
- Vorhandene Dokumentation, die erweitert werden soll
- Spezifische Anforderungen unseres Teams
Erstelle die Spec in .kiro/specs/onboarding-[projektname].md
```
## Beitragen
Neue Prompts, Steering-Dateien und Skills sind willkommen. Bitte beachte:
**Steering Files & Prompts:**
- Steering-Dateien sollten Front-matter mit `inclusion: manual` oder `inclusion: auto` enthalten
- Nutze Mermaid für Diagramme (kein PlantUML oder ASCII-Art)
- Füge Nutzungshinweise und Beispiele hinzu
- Dokumentiere Constraints klar und eindeutig
**Skills:**
- Folge der [Agent Skills Specification](https://agentskills.io/specification): `SKILL.md`
mit Frontmatter (`name`, `description`, ggf. `compatibility`/`metadata`)
- Skill ist self-contained — alle Assets und Code-Module unter `assets/`,
zusätzliche Referenzen unter `references/`
- Eigene `README.md` im Skill-Ordner mit Struktur, Voraussetzungen und Mini-Beispiel
- Keine Build-Artefakte (`__pycache__/`, `*.pyc`) committen — siehe `.gitignore`
## Lizenz
Siehe [LICENSE](LICENSE) Datei für Details.
+42
View File
@@ -0,0 +1,42 @@
# Analyse: Skills & Powers aus power_skills_and_more
Quelle: https://git.tech.rz.db.de/einfachbahn-lab/kiro_tools/power_skills_and_more
## Bewertung der vorhandenen Bausteine
### Übernommen (direkt nützlich)
| Baustein | Typ | Begründung |
|----------|-----|------------|
| `einfachbahn-naming.md` | Steering | Team-Konvention — gilt für alle unsere Repos |
| `db-scm-info-compliance` | Power | Wir haben selbst eine `scm-info.yaml`; hilft bei Validierung und Compliance |
| `db-openshift-deploy` | Power | AI-Orchestrator wird per Docker/OpenShift deployed — direkt relevant |
| `db-pipeship-onboarding` | Power | Nächster Schritt: Migration auf pipeship CI/CD |
| `db-dxp-platform` | Power | Generelles DXP-Plattformwissen für alle Deployment-Fragen |
### Nicht übernommen
| Baustein | Typ | Begründung |
|----------|-----|------------|
| `skills/` (leer) | Skills | Noch keine Skills im Quell-Repo vorhanden |
| `hooks/` (leer) | Hooks | Noch keine Hooks im Quell-Repo vorhanden |
| `mcp/` (Linksammlung) | MCP | Ist eine Linksammlung; unsere MCP-Config liegt bereits in `.kiro/settings/mcp.json` |
## Vorschlag: Weitere nützliche Skills für unser Repo
Basierend auf unserem Technologie-Stack (Python, pytest, Docker, OpenShift) und Workflow
wären folgende **zusätzliche Skills** sinnvoll:
| Skill-Idee | Zweck | Priorität |
|-------------|-------|-----------|
| `python-testing` | pytest + hypothesis Best Practices, Coverage-Ziele, Fixture-Patterns | Hoch |
| `docker-build-db` | Dockerfile-Erstellung mit DB-spezifischen Besonderheiten (Artifactory-Mirror, linux/amd64, non-root) | Hoch |
| `pat-rotation` | Anleitung zur PAT-Rotation und -Verwaltung (passend zum PAT-Manager im AI-Orchestrator) | Mittel |
| `python-packaging` | pyproject.toml, Hatch, Dependency-Management nach DB-Standards | Mittel |
| `mermaid-diagrams` | Architektur-Diagramme in Mermaid für Dokumentation (ergänzt codebase-summary SOP) | Niedrig |
## Empfehlung
1. Die übernommenen Powers sofort in Kiro installieren (über Powers-UI → Local Directory)
2. Das Steering `einfachbahn-naming.md` wird automatisch aktiv (inclusion: always)
3. Skills aus der Vorschlagsliste schrittweise erstellen, wenn der Bedarf konkret wird
+29
View File
@@ -0,0 +1,29 @@
# Powers
Dieser Ordner enthält **Kiro Powers**: gebündeltes Dokumentations-/Workflow-Wissen,
das Kiro bei passenden Anfragen automatisch aktiviert.
> Quelle: [einfachbahn-lab/kiro_tools/power_skills_and_more](https://git.tech.rz.db.de/einfachbahn-lab/kiro_tools/power_skills_and_more)
## Enthaltene Powers
| Power | Zweck | Aktiviert bei Themen wie |
|-------|-------|--------------------------|
| [`db-openshift-deploy`](db-openshift-deploy/) | Manuelles Deployment: Docker → Artifactory → OpenShift (`oc`) | openshift, oc, dbcs, artifactory, image pull |
| [`db-pipeship-onboarding`](db-pipeship-onboarding/) | Repo mit pipeship aufsetzen (CI/CD bis Prod, K8s, Trivy, Renovate) | pipeship, gitlab ci, deploy_k8s_generic, cdaas |
| [`db-dxp-platform`](db-dxp-platform/) | Nachschlagewerk DXP-Ökosystem (pipeship, CDaaS, Portal, Compliance) | dxp, developer portal, crossplane, flux, tenant |
| [`db-scm-info-compliance`](db-scm-info-compliance/) | `scm-info.yaml` erstellen/validieren + Compliance-Checks | scm-info, compliance suite, beam id, sbom |
## Installation (lokal)
Powers werden über die **Powers-UI** in Kiro installiert:
1. Powers-Panel öffnen (Sidebar oder Command Palette → *„Powers"*)
2. **„Add Custom Power"** → **„Local Directory"**
3. Absoluten Pfad zum Power-Ordner einfügen, z. B.:
```
<PFAD-ZUM-REPO>/powers/db-openshift-deploy
```
4. **„Add"** klicken.
> Der Pfad muss auf den einzelnen Power-Ordner zeigen (mit `POWER.md` direkt darin).
@@ -0,0 +1,100 @@
---
name: "db-dxp-platform"
displayName: "DB DXP Platform Guide"
description: "Nachschlagewerk zum DB Developer Experience Platform (DXP) Ökosystem: pipeship, CDaaS GitLab Runner, Developer Portal (Tenants, GitOps/Flux, Crossplane), Compliance Suite und DBCS/Kubernetes-Integration. Erklärt, was die Bausteine sind und wie sie zusammenspielen."
keywords: ["dxp", "developer portal", "pipeship", "cdaas", "compliance suite", "dbcs", "backstage", "crossplane", "flux gitops", "tenant"]
author: "einfachbahn-lab"
---
# DB DXP Platform Guide
## Overview
Diese Knowledge-Base-Power erklärt das Ökosystem der **Developer Experience Platform (DXP)**
der DB Systel (Teil von *build IT*). Sie beantwortet Fragen wie „Was ist pipeship/CDaaS?",
„Wofür brauche ich einen Tenant?", „Wie hängen Developer Portal, GitOps und Crossplane
zusammen?". Für die konkrete Repo-Initialisierung mit pipeship siehe die Power
**DB pipeship Onboarding**.
## Die Bausteine
| Produkt | Zweck |
|---------|-------|
| **pipeship** | Pipeline-as-a-Service: fertige, DB-konforme GitLab-CI/CD-Pipeline-Module (per `include` aus Artifactory) |
| **CDaaS** | Continuous-Delivery-as-a-Service: gehärtete GitLab Runner (Shared, Base/Multi-Tenant, selfhosted für AWS/k8s/OpenShift) |
| **Developer Portal** | Self-Service-Oberfläche (Backstage) für Tenants, Templates, Integrationen, Status, Compliance |
| **Compliance Suite** | Scannt Repos auf Secrets, Schwachstellen, Lizenzen; erstellt SBOMs |
| **DBCS** | DB Container Services: OpenShift-Cluster + KAS (Kubernetes-as-a-Service) |
Gemeinsame Tool-Basis: **GitLab, Artifactory, CDaaS, OpenShift (DBCS)**.
## Zentrale URLs
- Developer Portal: https://db.de/dxp · https://dp.dxc.comp.db.de
- pipeship: https://db.de/pipeship
- CDaaS: https://db.de/cdaas
- DBCS: https://db.de/dbcs
- Compliance Findings: https://dp.dxc.comp.db.de/compliance/repositories
- Kubernetes-UI Headlamp: https://headlamp.dxc.comp.db.de
- GitLab: https://git.tech.rz.db.de · Artifactory: https://bahnhub.tech.rz.db.de
- Digitalshop: https://dbdigitalshop.service-now.com/digitalshop
## Kernkonzepte
### DXP Mandant (Tenant)
Logische Einheit im Developer Portal, die alle Ressourcen einer **Anwendung** bündelt
(nicht teamorientiert). Verwaltet Rollen, Kostenstellen, Integrationen zentral; Repos erben
die Konfiguration. Jeder Tenant erhält den K8s-Namespace `p-{tenant-name}-tenant` mit
AGE-Key, Metadata/Environment-Ressourcen, ServiceAccount/RoleBinding und Crossplane-XRs.
Bestellung einmalig kostenfrei im Digitalshop (kostenpflichtig nur deployte Ressourcen).
### Provisionierung: Crossplane + FluxCD (GitOps)
- Zielzustand liegt als YAML im **GitOps-Repo** (`tenant-information`).
- **Flux** reconciled asynchron (kein direkter Effekt beim Push wie bei Pipelines).
- **Crossplane** provisioniert die Ressourcen (DBMC-Datenbanken, DBCS-Namespaces, Artifactory).
- **Software-Templates** (Backstage Scaffolder) scaffolden komplette App-Repos inkl.
pipeship-Pipeline, K8s-Namespace, DB und CDaaS-Runner.
```mermaid
flowchart TB
DP[Developer Portal<br/>Backstage] -->|Tenant + Templates| GR[GitOps-Repo<br/>tenant-information]
GR -->|Flux reconcile| CP[Crossplane]
CP --> NS[K8s-Namespace DBCS]
CP --> DB[(DBMC-Datenbank)]
CP --> AF[Artifactory-Registries]
```
### Rollen (Least Privilege)
`managers` (fachlich, entscheiden über Zugriff/Metadata), `owners` (technisch, Integrationen),
`developers` (i. d. R. Lese-, je Integration Schreibrechte), `readers` (nur einsehen).
Pro Rolle wird automatisch eine **ACAT-Gruppe im BKU AD** erzeugt. Besteller wird Manager.
### CDaaS Runner-Varianten
- **Shared Agent**: geteilte GitLab Shared Runner (Fair-Use, nur kleine Pipelines), Tag `cdaas-shared-agent`.
- **Base Runner (Beta)**: zentral, mandantenfähig, Pay-per-Use; Tags z. B. `build-base-runner`, `prod-base-runner`. Sicherheit über **Cred&Gator** (Berechtigung an Pipeline gebunden, nicht an Runner).
- **Selfhosted Agents**: Helm (k8s/OpenShift) oder CDK-Library (AWS), im eigenen Namespace/Account.
### Compliance Suite (Scanner)
- **Secrets (Betterleaks)**, **Dependencies (Syft+Grype)**, **DB Compliance** (Projekteinstellungen, README/LICENSE/scm-info.yaml), **Licenses (Grant)**.
- Wöchentliche Scans (Di/Do/Sa 18:00), Dependency-Checks alle 12 h. SBOM bei jedem Scan.
- Basisscans kostenlos; Ergebnisse im Developer Portal.
### DBCS/Kubernetes-Integration
- Namespaces (OpenShift „Projects") werden als `Project`-Ressource (`kas.dp.db.de/v1alpha1`) im GitOps-Repo beschrieben.
- `pipeshipSupport: true` legt automatisch Secrets an (`artifactory-stage/-read/-release`, `docker-pull-secret`, `gitlab-user`/`gitlab-test-user`).
- **OpenShift unterstützt keine Wildcards** in docker-pull-secrets → Registries explizit in `customDockerRepos` deklarieren.
- Cluster-Inspektion für Advanced User über **Headlamp** (SSO) oder das Kubernetes-Plugin im Portal.
## Häufige Fragen
- **„pipeship oder CDaaS?"** — pipeship liefert die Pipeline-Logik (Jobs/Module), CDaaS die Runner, auf denen sie läuft. pipeship baut auf CDaaS auf.
- **„Brauche ich einen Tenant?"** — Für GitOps-Provisionierung (DBMC/DBCS) und pipeship-Onboarding ja. Nur um Compliance-Findings zu sehen: nein.
- **„Wo liegt was?"** — Grundkonfiguration im Portal-UI; Infrastruktur-YAML im GitOps-Repo; Schnellstart über Software-Templates.
## Best Practices
- Updates zeitnah (Empfehlung ≤ 14 Tage), automatisiert via **Renovate** → bleibt compliant.
- Gruppennamen GitLab = Artifactory-Team-Name, nur Kleinbuchstaben/Zahlen.
- Vor `pipeshipSupport: true` vorhandene Secrets (`pipeship-secrets`, age/GPG-Keys) sichern — werden überschrieben.
## Weiterführend
Vollständige Wissensbasis im Repo `einfachbahn-lab/doku/deployment-doku`, Datei
`docs/08-dxp-plattform.md`. Doku-Quellen (DB-Login nötig): `git.tech.rz.db.de/pipeship/docs/docs-as-code`,
`.../devex-core/buildit-docu`, `.../cdaas/documentation`.
@@ -0,0 +1,130 @@
---
name: "db-openshift-deploy"
displayName: "DB OpenShift Deploy"
description: "Manuelles Deployment im DB-Konzern: Docker-Image bauen, ins Artifactory (jFrog/bahnhub) pushen und auf einem OpenShift-Cluster (DBCS) per oc deployen. Inklusive Secrets, Image-Pull-Secret und Troubleshooting."
keywords: ["openshift", "oc cli", "dbcs", "artifactory", "bahnhub", "docker image", "kubernetes deployment", "image pull secret", "imagepullbackoff"]
author: "einfachbahn-lab"
---
# DB OpenShift Deploy
## Overview
Diese Power bündelt das Wissen, um eine containerisierte Anwendung im DB-Konzern
**manuell** auf einem OpenShift-Cluster (DB Container Services, DBCS) zu betreiben:
Image mit Docker bauen, ins **Artifactory** (`bahnhub.tech.rz.db.de`) pushen und mit
`oc apply` deployen. Ideal für Prototypen, Labs und kleine Services. Für den
standardisierten, compliance-konformen Weg siehe die Power **DB pipeship Onboarding**.
## Onboarding
### Voraussetzungen
- **DeBi-Account** (SSO für Git, Artifactory, OpenShift). Für GitLab ist zusätzlich eine Bestellung im Digitalshop nötig.
- **Docker Desktop** (Image-Build)
- **`oc` CLI** (OpenShift-Client; aus der Console: `?`*Command Line Tools*)
- Ein **Docker-Repo im Artifactory** (einmalig über Self-Service https://bass.tech.db.de/welcome beantragen)
- **Artifactory-API-Key**: https://bahnhub.tech.rz.db.de → Profil → *Edit Profile* → API Key
### Wichtige Links
- Artifactory Self-Service: https://bass.tech.db.de/welcome
- jFrog Artifactory: https://bahnhub.tech.rz.db.de/ui/packages
- GitLab: https://git.tech.rz.db.de/
- OpenShift Console (Beispiel): https://console-openshift-console.apps.dbcs-riga.comp.db.de/
## Key Concepts
| Begriff | Bedeutung |
|---------|-----------|
| Image | Unveränderliches Paket aus App + Abhängigkeiten + Laufzeit |
| Registry | Image-Speicher — hier Artifactory `bahnhub.tech.rz.db.de` |
| OpenShift | Enterprise-Kubernetes von Red Hat (= k8s + Console, `oc`, `Route`, strenge SCC) |
| Deployment | Beschreibt den Pod (Image, Env, Ressourcen, Health-Checks) |
| Service | Cluster-interne stabile Adresse |
| Route | OpenShift-Objekt: HTTPS-Zugang von außen (TLS-Termination) |
| PVC | Persistenter Speicher, überlebt Pod-Neustarts |
## Common Workflows
### 1. Image bauen + pushen
**Immer `--platform linux/amd64`** (auch auf Apple Silicon), Base-Images aus dem
Artifactory-Mirror (kein Docker-Hub-Direktzugriff im Cluster).
```bash
docker login einfachbahnlab-docker-stage-local.bahnhub.tech.rz.db.de # User=DeBi, Pass=API-Key
docker build --platform linux/amd64 \
-t einfachbahnlab-docker-stage-local.bahnhub.tech.rz.db.de/api-viewer:0.8.0 .
docker push einfachbahnlab-docker-stage-local.bahnhub.tech.rz.db.de/api-viewer:0.8.0
```
### 2. Erst-Setup im Namespace
```bash
# Am Cluster anmelden (öffnet SSO im Browser)
oc login https://api.dbcs-riga.comp.db.de:6443
# Image-Pull-Secret (sonst ImagePullBackOff)
oc create secret docker-registry artifactory-pull -n einfachbahn-dev \
--docker-server=einfachbahnlab-docker-stage-local.bahnhub.tech.rz.db.de \
--docker-username=DEIN_USER --docker-password=DEIN_API_KEY
# App-Secret (vertrauliche Werte)
oc create secret generic babedas-api-viewer -n einfachbahn-dev \
--from-literal=AUTH_USER=... --from-literal=AUTH_PASS=...
```
### 3. Deployen
Manifeste mit Platzhaltern `<NAMESPACE>`, `<REGISTRY>`, `<TAG>` ersetzen und anwenden
(Reihenfolge: pvc → deployment → service → route):
```bash
for m in k8s/pvc.yaml k8s/deployment.yaml k8s/service.yaml k8s/route.yaml; do
sed -e "s|<NAMESPACE>|einfachbahn-dev|g" \
-e "s|<REGISTRY>|einfachbahnlab-docker-stage-local.bahnhub.tech.rz.db.de|g" \
-e "s|<TAG>|0.8.0|g" "$m" | oc apply -f -
done
oc rollout status deployment/api-viewer -n einfachbahn-dev
```
### 4. Betrieb / Diagnose
```bash
oc get pods -n einfachbahn-dev -l app=api-viewer
oc logs -f deployment/api-viewer -n einfachbahn-dev | grep -v "GET /"
oc exec -it deployment/api-viewer -n einfachbahn-dev -- sh
oc set env deployment/api-viewer -n einfachbahn-dev FETCH_ON_START=true
oc delete pod -l app=api-viewer -n einfachbahn-dev # Neustart nach Secret-Änderung
```
## OpenShift-Besonderheiten (wichtig)
- **Non-root**: Container laufen mit zufälliger UID. Schreib-Verzeichnisse weltbeschreibbar machen (`chmod 777 /app/data`), unter `/app` statt `/`.
- **`restricted` SCC**: `privileged: false`, `runAsNonRoot: true`. Kein Docker-in-Docker.
- **Kein Internet**: Images nur aus Artifactory-Mirror (`docker-hub-remote.bahnhub.tech.rz.db.de`).
- **`Route` statt `Ingress`** für externen HTTPS-Zugang.
## Troubleshooting
### Pod: `ImagePullBackOff`
Image-Pull-Secret `artifactory-pull` fehlt/falsch, oder Image-Tag existiert nicht. Secret neu anlegen, Tag prüfen.
### Pod: `CreateContainerConfigError`
App-Secret fehlt oder ein referenzierter Key existiert nicht.
### `exec format error` / sofortiger Crash
Falsche Architektur — mit `--platform linux/amd64` neu bauen.
### `docker push` → `unauthorized` / `denied`
Nicht eingeloggt (`docker login`) oder kein Push-Recht/Repo fehlt (Self-Service prüfen).
### 502 Bad Gateway
Pod noch nicht `ready` — Logs prüfen, warten.
### Daten weg nach Redeploy
PVC prüfen: `oc get pvc -n einfachbahn-dev` (sollte erhalten bleiben).
## Best Practices
- Feste, semantische Tags (`0.8.0`), kein `latest` für Deployments → nachvollziehbare Rollbacks.
- Health-Checks (`livenessProbe`/`readinessProbe` auf `/health`) im Deployment.
- Keine Secrets im Image oder Git — immer als OpenShift-Secret.
- PVC niemals beim Aufräumen mitlöschen, wenn Daten erhalten bleiben sollen.
## Weiterführend
Vollständige Doku, Scripts (`build-and-push.sh`, `deploy.sh`, `create-secret.sh`) und
k8s-Manifest-Templates im Repo `einfachbahn-lab/doku/deployment-doku` (`docs/01``docs/07`,
`scripts/`, `k8s/`).
@@ -0,0 +1,133 @@
---
name: "db-pipeship-onboarding"
displayName: "DB pipeship Onboarding"
description: "Schritt-für-Schritt-Anleitung, um ein GitLab-Repo im DB-Konzern mit pipeship aufzusetzen: Group- und Project-Onboarding, deploy_k8s_generic nach OpenShift/DBCS, CI/CD-Secrets (SOPS/age), Trivy-Container-Security, Container-Annotations und Renovate-Updates."
keywords: ["pipeship", "gitlab ci", "deploy_k8s_generic", "cdaas", "renovate", "sops age", "trivy", "dbcs onboarding", "cloud native buildpacks"]
author: "einfachbahn-lab"
---
# DB pipeship Onboarding
## Overview
Diese Power führt durch das Aufsetzen eines **Code-Repos** mit **pipeship**
(Pipeline-as-a-Service der DB Systel): vom Group-/Project-Onboarding über das
pipeship-Produkt `deploy_k8s_generic` (Build → Test → Deploy nach OpenShift/DBCS)
bis zu CI/CD-Secrets, Container-Security (Trivy) und automatischen Updates via Renovate.
Ergebnis ist eine vollautomatische, **compliance-konforme** CI/CD-Pipeline.
Für das Hintergrundwissen zum Ökosystem siehe die Power **DB DXP Platform Guide**.
Für `scm-info.yaml`-Details die Power **DB scm-info & Compliance**.
## Onboarding (Voraussetzungen)
- Zugriff auf GitLab (`git.tech.rz.db.de`), Artifactory (`bahnhub`), Cloud-/K8s-Provider
- **DXP Mandant** (Digitalshop), GitLab-Gruppe via **GroupTrust** verbunden, GitOps-Repo (`tenant-information`)
- **pipeship CLI**: `brew tap dbsystel/pipeship https://git.tech.rz.db.de/pipeship/toolbox/homebrew.git && brew install pipeship-cli`
- Zusätzlich `kubectl`, `oc`, `sops`, `age` → prüfen mit `pipeship dependency`
> Schnellster Weg: Im Developer Portal das Software-Template **„DBCS project with CDaaS agent"**
> (`dbcs-with-cdaas`) bzw. ein kombiniertes Template, das Repo + Pipeline + Namespace + Runner erzeugt.
## Prinzipien von pipeship
- **Reference instead of copy**: Pipelines per GitLab `include` einbinden (kein Copy&Paste).
- **Update at your own pace**: Updates kommen als Merge Requests (Renovate).
- **Convention over Configuration**: Standard-Pipeline pro Use-Case, anpassbar.
- Baut auf GitLab Auto DevOps + Buildpacks auf.
## Onboarding-Fluss
```
GROUP-ONBOARDING (einmal pro Top-Level-GitLab-Gruppe)
Artifactory-Registries (BASS) · CDaaS-Runner · (SonarQube) · CI/CD-Secrets → "pipeship it!"
PROJECT-ONBOARDING (pro Repo)
Compliance herstellen · Include injizieren · Renovate einrichten
```
## Common Workflows
### 1. Basis-Compliance herstellen
- `scm-info.yaml` (Endung **`.yaml`**, schema-valide, Beam-ID), `README.md`, `LICENSE` → Template `init-app-general`
- Default-Branch schützen: `Settings ➞ Repository ➞ Protected Branches`
- Tags per Wildcard `*.*` schützen (Format `major.minor`, z. B. `1.2`)
### 2. K8s-Namespace + CDaaS-Runner (GitOps)
Template `dbcs-with-cdaas` → MR ins `tenant-information`-Repo. Mit `pipeshipSupport: true`
werden alle nötigen Secrets automatisch im Namespace angelegt:
```yaml
apiVersion: kas.dp.db.de/v1alpha1
kind: Project
metadata:
name: myapp-prod
namespace: p-<tenant>-tenant
spec:
cluster: riga # prag für prod
environment: prod
pipeshipSupport: true
customDockerRepos: # OpenShift kennt keine Wildcards
- "myteam-docker-release-local.bahnhub.tech.rz.db.de"
```
### 3. CI/CD-Secrets verschlüsseln (falls nötig)
Secrets **nie im Klartext** in GitLab (ADR-18). age-/PGP-Keys liegen im Namespace (K8s) bzw. KMS (AWS).
Lokal mit **SOPS + age** verschlüsseln, verschlüsselt committen — pipeship entschlüsselt zur Laufzeit
und exportiert als Umgebungsvariablen. (Beim CDaaS Shared Agent stattdessen `secrets.yaml` mit GPG-`PGP MESSAGE` und Tag `cdaas-shared-agent`.)
### 4. pipeship-Pipeline injizieren
Template **pipeship Pipeline Onboarding** → Vendor `pipeship`, Produkt **`deploy_k8s_generic`**,
Release-Channel (z. B. `resolved/release` oder `baserunner/release`), Zielprojekt → MR mergen.
Ergebnis `.gitlab-ci.yml`:
```yaml
---
include:
- https://bahnhub.tech.rz.db.de/artifactory/pipeship-generic-release-local/release/products/deploy_k8s_generic/<version>.yaml
variables:
DK8G_K8S_TAG: "kubernetes"
DK8S_HELM_REMOTE_VALUES: |
https://bahnhub.tech.rz.db.de/artifactory/pipeship-generic-release-local/values-library/1.1.119/tmp-volume.yaml
run_unit_tests:
image: <image-mit-test-framework>
script:
- <test-script>
```
**Build-Verhalten:** Dockerfile vorhanden → wird genutzt; kein Dockerfile → **Cloud Native Buildpacks** (ADR-23).
Image wird in Artifactory promoted und in die K8s-Stages deployt.
### 5. Container-Security & Compliance
- **pipeship-Images** werden vom pipeship-Team per **Trivy/AquaSec** gescannt → du bist compliant, **solange du aktuell hältst** (≤ 14 Tage, Renovate).
- **Eigene/überschriebene Images** → Risikobewertung liegt bei dir (selbst scannen/Restrisikodeklaration).
- **SBOM**: Job `generate_image_sbom_syft`; Compliance Suite scannt Dependencies/Lizenzen.
- **read-only securityContext** per Default (Schreibpfade als Volume mounten).
- **Annotations** (Beam-ID, Contacts) automatisch aus `scm-info.yaml` (`GA_REFERENCE_ID`, `GA_CONTACT`).
### 6. Updates aktivieren (Renovate)
Template **pipeship Renovate Starter** + Preset:
```json
{ "extends": ["local>renovate/renovate-presets:pipeship", "local>renovate/renovate-presets:pipeship-group"] }
```
Release-Channels (über Include-URL bestimmt): `canary`, `release`, `resolved/...`, `baserunner/...`.
## Definition of Done (Code-Repo)
- [ ] `scm-info.yaml` (.yaml, valide, Beam-ID), `README.md`, `LICENSE`
- [ ] Default-Branch + Tags (`*.*`) protected
- [ ] DXP Mandant + GitLab-Gruppe (GroupTrust) + GitOps-Repo
- [ ] Artifactory-Registries (Naming-Konvention), CDaaS-Runner
- [ ] DBCS-Namespace mit `pipeshipSupport: true`
- [ ] `.gitlab-ci.yml` mit `deploy_k8s_generic` + Unit-Test-Job
- [ ] CI/CD-Secrets verschlüsselt (age/SOPS/KMS), nichts im Klartext
- [ ] read-only securityContext + Container-Annotations
- [ ] SBOM-Job aktiv, Findings geprüft
- [ ] Renovate-Preset aktiv
## Available Steering Files
- **repo-typen** Setup-Matrix für Code / Doku / Architektur / Konzept-Repos (welche Bausteine wann nötig sind, inkl. `deploy_pages_generic` für Doku/Architektur).
## Troubleshooting
- **Pipeline triggert nicht** → Tag matcht nicht das geschützte Wildcard (`*.*`, Format `major.minor`).
- **Include nicht auflösbar** → Registry-Naming/Anonymous-Scope prüfen; Channel-URL korrekt?
- **`pipeship dependency` schlägt fehl** → `sops`/`age`/`kubectl`/`oc` nachinstallieren.
- **Secret im Pipeline-Log sichtbar** → entschlüsselte env-Vars nie ungefiltert ausgeben.
- **Renovate erkennt Updates nicht** → pipeship-Preset (Regex-Manager) fehlt.
## Weiterführend
Vollständiger Praxis-Guide im Repo `einfachbahn-lab/doku/deployment-doku`, Datei
`docs/09-pipeship-setup-guide.md` (Teil AD).
@@ -0,0 +1,64 @@
# Repo-Typen — Setup-Matrix (Code / Doku / Architektur / Konzept)
Die **Basis-Compliance** gilt laut DB-Vorgabe für **alle** Repo-Typen. Pipeline-/
Runtime-Bausteine kommen je nach Typ hinzu. Diese Typisierung ist eine Empfehlung;
die DB-Doku kennt formal nur „Code-Repos" (mit Pipeline) und „Doku-/Pages-Repos".
## Pflicht-Basis für JEDES Repo
Prüft die Compliance Suite unabhängig vom Typ:
- `scm-info.yaml` (`.yaml`, schema-valide) → Template `init-app-general`
- `README.md`, `LICENSE`
- Protected default branch (repräsentiert prod)
- Korrekte Sichtbarkeit (visibility) gemäß Schutzbedarf
- Secret-Scan (Betterleaks) — keine Klartext-Secrets
- Dependency-/Lizenz-Scan (Syft+Grype / Grant), SBOM
## Vergleichsmatrix
| Baustein | Code | Doku | Architektur | Konzept |
|----------|:---:|:---:|:---:|:---:|
| scm-info / README / LICENSE | ✅ | ✅ | ✅ | ✅ |
| Protected branch + tags (`*.*`) | ✅ | ✅ (branch) | ✅ (branch) | ✅ (branch) |
| Compliance-Suite-Scans | ✅ | ✅ | ✅ | ✅ |
| pipeship-Pipeline | ✅ `deploy_k8s_generic`/`release_oci_image` | ✅ `deploy_pages_generic` | /✅ wenn publiziert | |
| CDaaS Runner | ✅ eigener/Base | ✅ `cdaas-shared-agent` | ✅ shared | |
| Kubernetes-Namespace (DBCS) | ✅ | | | |
| Container-Build + Trivy/AquaSec | ✅ | | | |
| CI/CD-Secrets (age/SOPS/KMS) | ✅ falls nötig | | | |
| Container-Annotations + read-only ctx | ✅ | | | |
| SonarQube (optional) | ✅ | | | |
| Renovate | ✅ | ✅ | ✅ | |
| Linkchecker | | ✅ | ✅ | |
Legende: ✅ empfohlen/nötig · i. d. R. nicht nötig
## Pro Typ konkret
### Code-Repo (Anwendung/Service)
Vollständige CI/CD bis Prod, K8s, Container-Security. → vollständige Anleitung im POWER.md
(`deploy_k8s_generic`, K8s-Namespace, CI/CD-Secrets, Trivy, Annotations, Renovate, optional SonarQube).
### Doku-Repo (docs-as-code)
Markdown/Static-Site auf GitLab Pages: Produkt **`deploy_pages_generic`** mit eigenem
`build_website`-Job (Hugo/MkDocs/Docusaurus), Tag `cdaas-shared-agent`, **Linkchecker** inklusive,
Renovate. **Kein** K8s/Container/Trivy/Secrets.
```yaml
build_website:
image: docker-hub-remote.bahnhub.tech.rz.db.de/monachus/hugo@sha256:...
variables:
HUGO_BASEURL: "${BW_ENV_URL}"
script:
- hugo # Output muss unter ${BW_OUTPUT_DIR} (Default public) liegen
```
### Architektur-Repo (ADRs, arc42, C4, Diagrams-as-Code)
Basis-Compliance + Inhalte (Markdown/PlantUML/Mermaid/Structurizr). Wenn publiziert → wie Doku-Repo
via `deploy_pages_generic`. Sonst reicht Basis-Compliance + Markdown-Lint. Kein Container/K8s/Trivy.
### Konzept-Repo (Fachkonzepte, Specs)
Nur Basis-Compliance (meist alles). Optional `deploy_pages_generic`. `confidentiality` in scm-info
ggf. höher setzen und Repo-Sichtbarkeit anpassen (Konzepte oft vertraulicher).
## Minimaler Init-Vergleich
- **Doku/Architektur (publiziert):** Basis-Compliance + `.gitlab-ci.yml` mit `deploy_pages_generic` + Renovate. Kein K8s/Secrets/Trivy.
- **Konzept (nicht publiziert):** nur Basis-Compliance. Optional `deploy_pages_generic`.
@@ -0,0 +1,106 @@
---
name: "db-scm-info-compliance"
displayName: "DB scm-info and Compliance"
description: "Erstellt und validiert die scm-info.yaml für DB-GitLab-Repos und erklärt die Checks der DXP Compliance Suite (Secrets, Dependencies, Lizenzen, DB Compliance). Liefert eine Compliance-Checkliste, damit ein Repo konform zur DB-Vorgabe Source-Control-Management ist."
keywords: ["scm-info.yaml", "compliance suite", "betterleaks", "beam id", "dbisl lizenz", "sbom", "syft grype", "source control management", "vmp export"]
author: "einfachbahn-lab"
---
# DB scm-info and Compliance
## Overview
Diese Power hilft, ein DB-GitLab-Repo **compliant** zu machen: die Pflichtdatei
`scm-info.yaml` korrekt zu erstellen/validieren und die Checks der **DXP Compliance Suite**
(Secrets, Dependencies, Lizenzen, DB Compliance) zu verstehen und zu bestehen. Grundlage ist
die DB-Vorgabe „Source-Control- und Software-Repositories".
## scm-info.yaml — harte Regeln
- **Dateiendung muss `.yaml` sein** — `.yml` wird **nicht** akzeptiert.
- Liegt im **Repo-Root**.
- Wird gegen das **scm-info JSON Schema** validiert (`git.tech.rz.db.de/db-inner-source/scm-info-json-schema`).
- Am einfachsten per Developer-Portal-Template **`init-app-general`** erzeugen (legt scm-info.yaml + README + LICENSE an).
## Vorlagen
### Minimal
```yaml
version: v3
license: LicenseRef-DBISL
contacts: DEINE_EMAIL_ADRESSE
confidentiality: internal
reference-ids: none
```
### Erweitert (pipeship-Kontext)
```yaml
---
version: v3
license: DBISL
contacts: team@deutschebahn.com
confidentiality: internal
reference-ids: A-123456 # eure echte Beam-ID
custom:
production-branch: main
integrity: normal
availability: normal
confidentiality: normal
it-service-id: itaps-service-id-1
```
## Felder
| Feld | Zweck |
|------|-------|
| `version` | Schema-Version (z. B. `v3`) |
| `license` | Lizenz (`DBISL`/`LicenseRef-DBISL`), geprüft gegen Open-Source-Lizenzkompass |
| `contacts` | Kontakt(e) — von pipeship als Container-Annotation `GA_CONTACT` genutzt |
| `confidentiality` | Vertraulichkeitsstufe (z. B. `internal`) |
| `reference-ids` | **Beam-/Referenz-ID** (Pflicht) — pipeship-Annotation `GA_REFERENCE_ID` |
| `custom.production-branch` | Produktions-Branch (z. B. `main`) |
| `custom.integrity/availability/confidentiality` | Schutzbedarf |
| `custom.it-service-id` | ITAPS-Service-ID |
## Warum sie wichtig ist
- Verknüpfung mit **Beam/LeanIX** (Anwendungskontext)
- Bessere Erreichbarkeit über Kontaktdaten
- **VMP-Export** von Security-Findings nur mit gültiger **Beam ID** möglich
- Compliance-Pflicht — fehlt sie, entstehen Findings
- pipeship liefert daraus automatisch die Container-Annotations
## Compliance Suite — die Scanner
| Scanner | Prüft |
|---------|-------|
| **Secrets (Betterleaks)** | Passwörter/API-Keys in Code, Job-Logs, Artefakten |
| **Dependencies (Syft + Grype)** | Syft erstellt SBOM, Grype scannt auf bekannte Schwachstellen |
| **DB Compliance** | Sichtbarkeit, protected Branches, Existenz README/LICENSE/scm-info.yaml + Schema-Validierung |
| **Licenses (Grant)** | Lizenzkonformität gemäß DB Open-Source-Lizenzkompass |
- Wöchentliche Scans (Di/Do/Sa 18:00), Dependency-Checks alle 12 h, SBOM je Scan.
- Findings im Developer Portal: https://dp.dxc.comp.db.de/compliance/repositories
- Sichtbarkeit: GitLab-Rolle ≥ `Developer`. Kein DXP Mandant nötig, nur um Findings zu sehen.
## Compliance-Checkliste (vor erstem Release)
- [ ] `scm-info.yaml` vorhanden, Endung `.yaml`, schema-valide
- [ ] `reference-ids` = echte Beam-ID gesetzt
- [ ] `license` korrekt (DBISL o. zulässige Open-Source-Lizenz)
- [ ] `contacts` gesetzt (Erreichbarkeit + Container-Annotation)
- [ ] `README.md` und `LICENSE` vorhanden
- [ ] Default-Branch protected; Sichtbarkeit gemäß Schutzbedarf
- [ ] keine Klartext-Secrets im Repo/Logs/Artefakten (Betterleaks grün)
- [ ] Dependency-/Lizenz-Findings gesichtet und behandelt
- [ ] (Container) SBOM-Job aktiv, Images aktuell gehalten (≤ 14 Tage / Renovate)
## Best Practices
- `confidentiality` und Repo-Sichtbarkeit am tatsächlichen Schutzbedarf ausrichten.
- Beam-ID früh setzen — ohne sie kein VMP-Export der Findings.
- Secrets nie im Klartext; verschlüsselt mit SOPS/age committen.
- Findings nicht ignorieren — patchen/mitigieren oder Restrisiko dokumentieren.
## Troubleshooting
- **Finding „scm-info invalid"** → Endung `.yaml`? Pflichtfelder (`version`, `reference-ids`) gesetzt? Gegen Schema prüfen.
- **VMP-Export geht nicht** → gültige Beam-ID in `reference-ids` fehlt.
- **Secret-Finding trotz Verschlüsselung** → false positive dokumentieren oder Wert wirklich entfernen/rotieren.
## Weiterführend
Repo `einfachbahn-lab/doku/deployment-doku`: `docs/09-pipeship-setup-guide.md` (Teil B) und
`docs/08-dxp-plattform.md` (Kap. 4, Compliance Suite).
@@ -0,0 +1,256 @@
---
inclusion: manual
---
# Unit Tests schreiben
> **Nutzung:** Referenziere diese Datei mit `#unit-tests-motivation` im Chat und sage:
> "Schreibe Unit Tests für [Komponente/Klasse/Funktion] nach diesem Leitfaden."
---
## Ziel
Effektive Anleitung für LLMs zur Erstellung qualitativ hochwertiger Unit Tests mit klaren Erwartungen und Best Practices.
## Motivation & Kontext
Erhöhe die Unit-Test-Abdeckung im Projekt.
- Ziel: Schreibe Unit-Tests (JUnit 5) für das Projekt, sodass die gesamte Code Coverage auf mindestens 80% steigt.
- Einschränkungen (nicht ändern):
- Verändere keinen Produktionscode unter `src/main/java`.
- Verändere keine vorhandenen Tests unter `src/test/java`.
- Verändere keine bestehenden Quell-Dateinamen oder APIs.
- Keine Netzwerke/DBs in Unit-Tests; externe Abhängigkeiten nur mocken.
- Erlaubt:
- Neue Testklassen und Test-Hilfsklassen unter `src/test/java` anlegen.
- Test-spezifische Ressourcen unter `src/test/resources`.
- Anforderungen an Tests:
- Nutze JUnit 5 (`@Test`), Moq/Mockito für Abhängigkeiten.
- Tests sollen deterministisch, schnell und isoliert sein.
- Jede getestete Klasse sollte sinnvolle Positive-/Negative-/Randfall-Tests bekommen.
- Benenne Tests nach der vorhandenen Nomenklatur.
- Verifizierung (Automatisierte Checks):
1. Build: Projekt baut erfolgreich (Exit-Code 0). Kommando: `mvn test`.
2. Tests: Alle Tests laufen grün (keine Failures/Errors).
3. Coverage: Generiere Coverage-Report (mvn jacoco:report). Akzeptanz: Gesamte Projekt-Coverage >= 80% (Line Coverage). Report-Pfad: `target/site/jacoco/index.html`.
- Zusätzliche Hinweise:
- Keine Refactorings am Produktionscode.
- Falls ein Test-only Helper oder Fixture nötig ist, lege diese ausschließlich unter `src/test/java` an.
## Constraints
**Du MUST:**
- Tests für alle öffentlichen Methoden/Funktionen schreiben
- Sowohl positive als auch negative Testfälle abdecken
- Aussagekräftige Testnamen verwenden, die das erwartete Verhalten beschreiben
- Arrange-Act-Assert (AAA) Pattern befolgen
- Tests isoliert und unabhängig voneinander halten
- Mocks/Stubs für externe Abhängigkeiten verwenden
**Du SHOULD:**
- Edge Cases und Grenzwerte testen
- Fehlerbehandlung und Exception-Szenarien abdecken
- Parametrisierte Tests für ähnliche Testfälle nutzen
- Test-Fixtures und Setup-Methoden sinnvoll einsetzen
**Du MUST NOT:**
- Tests schreiben, die von externen Ressourcen abhängen (Datenbank, Netzwerk, Dateisystem)
- Tests erstellen, die eine bestimmte Ausführungsreihenfolge erfordern
- Implementation Details testen statt Verhalten
- Produktionscode unter `src/main/java` verändern
- Bestehende Tests unter `src/test/java` modifizieren
## Test-Struktur
### Namenskonvention
```
[MethodName]_[Scenario]_[ExpectedBehavior]
```
Beispiele:
- `calculateTotal_WithValidItems_ReturnsCorrectSum`
- `processPayment_WithInsufficientFunds_ThrowsException`
- `getUserById_WhenUserNotFound_ReturnsNull`
### AAA Pattern
```java
@Test
void testMethodName_Scenario_ExpectedBehavior() {
// Arrange - Setup test data and dependencies
[Test-Setup]
// Act - Execute the method under test
[Methodenaufruf]
// Assert - Verify the expected outcome
[Assertions]
}
```
## Testabdeckung
### Prioritäten
1. **Kritische Geschäftslogik** - Kernfunktionalität mit hohem Risiko
2. **Komplexe Algorithmen** - Berechnungen, Transformationen, Validierungen
3. **Fehlerbehandlung** - Exception-Handling, Validierung
4. **Edge Cases** - Grenzwerte, null/empty, unerwartete Eingaben
5. **Integration Points** - Schnittstellen zu anderen Komponenten
### Mindestabdeckung
- **Gesamtprojekt:** 80%+ Line Coverage (Ziel)
- **Kritische Komponenten:** 90%+ Code Coverage
- **Standard-Komponenten:** 80%+ Code Coverage
## Technologie-spezifische Guidelines
### JUnit 5 + Mockito
```java
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
class ServiceTest {
@Mock
private Dependency mockDependency;
private Service service;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
service = new Service(mockDependency);
}
@Test
void methodName_Scenario_ExpectedBehavior() {
// Arrange
when(mockDependency.someMethod()).thenReturn(expectedValue);
// Act
Result result = service.methodUnderTest();
// Assert
assertNotNull(result);
assertEquals(expectedValue, result.getValue());
verify(mockDependency).someMethod();
}
}
```
## Beispiele
### Beispiel 1: Einfacher Unit Test
```java
@Test
void add_TwoPositiveNumbers_ReturnsSum() {
// Arrange
Calculator calculator = new Calculator();
// Act
int result = calculator.add(5, 3);
// Assert
assertEquals(8, result);
}
```
### Beispiel 2: Test mit Mocks
```java
@Test
void processOrder_ValidOrder_CallsPaymentService() {
// Arrange
Order order = new Order(100.0);
when(mockPaymentService.charge(100.0)).thenReturn(true);
// Act
boolean result = orderProcessor.process(order);
// Assert
assertTrue(result);
verify(mockPaymentService).charge(100.0);
}
```
### Beispiel 3: Exception Test
```java
@Test
void divide_ByZero_ThrowsArithmeticException() {
// Arrange
Calculator calculator = new Calculator();
// Act & Assert
assertThrows(ArithmeticException.class, () -> {
calculator.divide(10, 0);
});
}
```
## Häufige Fehler vermeiden
| Fehler | Lösung |
|--------|--------|
| Tests testen Implementation statt Verhalten | Fokus auf öffentliche API und erwartete Ergebnisse |
| Zu viele Assertions pro Test | Ein Test = Ein Konzept/Verhalten |
| Fragile Tests durch harte Abhängigkeiten | Dependency Injection und Mocking nutzen |
| Unklare Fehlermeldungen | Aussagekräftige Assert-Messages verwenden |
| Tests ohne Arrange-Phase | Immer explizites Setup, auch wenn minimal |
| Produktionscode ändern | Nur Tests unter `src/test/java` anlegen |
## Checkliste
Vor dem Abschluss prüfen:
- [ ] Alle öffentlichen Methoden haben Tests
- [ ] Positive und negative Szenarien abgedeckt
- [ ] Edge Cases berücksichtigt
- [ ] Testnamen sind selbsterklärend
- [ ] Tests sind unabhängig und isoliert
- [ ] Keine externen Abhängigkeiten
- [ ] AAA-Pattern konsequent angewendet
- [ ] Code Coverage Ziel (80%) erreicht
- [ ] `mvn test` läuft erfolgreich durch
- [ ] Kein Produktionscode verändert
## Verifizierung
### Build & Test ausführen
```bash
mvn test
```
### Coverage Report generieren
```bash
mvn jacoco:report
```
### Coverage Report prüfen
```bash
# Report-Pfad: target/site/jacoco/index.html
# Ziel: >= 80% Line Coverage
```
## Troubleshooting
### Tests schlagen fehl
- Prüfe ob Mocks korrekt konfiguriert sind
- Verifiziere Test-Daten und erwartete Werte
- Stelle sicher, dass Tests isoliert laufen
### Niedrige Code Coverage
- Identifiziere ungetestete Branches mit Jacoco-Report
- Füge Tests für Exception-Handling hinzu
- Teste Edge Cases und Grenzwerte
- Prüfe ob alle öffentlichen Methoden getestet sind
### Langsame Tests
- Ersetze echte Abhängigkeiten durch Mocks
- Vermeide Thread.sleep() und Timeouts
- Nutze In-Memory Implementierungen
+6
View File
@@ -0,0 +1,6 @@
---
version: v3
license: LicenseRef-DBISL
contacts: uwe.suelter@deutschebahn.com
confidentiality: internal
reference-ids: none
@@ -0,0 +1,140 @@
# pptx-infrago — PowerPoint-Präsentations-Skill
Kiro-Skill für `.pptx`-Präsentationen im DB InfraGO Corporate Design.
Folgt der [Agent Skills Specification](https://agentskills.io/specification).
## Struktur
```
pptx-infrago/
├── SKILL.md # Einstiegspunkt (Frontmatter + Workflow)
├── README.md # Diese Anleitung
├── references/
│ ├── layout-katalog.md # 31 Layouts mit Index, Name, Platzhaltern
│ ├── slide-typen.md # Funktions-API mit Code-Beispielen
│ ├── asset-katalog.md # Hintergrundbilder + Auswahl-Heuristik
│ └── ci-referenz.md # Farben, Schriften, CI-Regeln
└── assets/
├── InfraGo_master_vorlage.pptx # Offizieller DB InfraGO Folienmaster
├── db_infrago_pptx.py # Helper-Modul mit Funktion pro Layout
├── Ice_line_background.png # 10 Hintergrundbilder
└── bg-*.jpeg
```
## Voraussetzungen
```powershell
pip install python-pptx
```
Python 3.10+. `lxml` wird transitiv von `python-pptx` mitinstalliert und vom Helper
direkt für XML-Manipulationen genutzt (Footer- und Slide-Number-Platzhalter aus dem
Layout klonen, slidenum-Field setzen, Section-Liste entfernen).
Auf DB-Rechnern stehen die DB-Schriften (DB Head Black, DB Sans) automatisch zur
Verfügung. Auf anderen Systemen verwendet PowerPoint einen Fallback-Font.
## Funktionsweise
Der Skill arbeitet mit dem offiziellen DB InfraGO Folienmaster (31 Layouts) und einem
Helper-Modul. Statt Folien-Geometrie selbst zu zeichnen, wählt der Skill ein passendes
Layout aus und befüllt dessen Platzhalter. Logo, Footer-Slot, Foliennummer und Farben
werden vom Master geerbt (Footer und Foliennummer werden technisch aus dem Layout in
die Slide geklont, weil python-pptx das nicht von selbst übernimmt).
Workflow:
1. Skill fragt: Thema, Zielgruppe, Umfang, Footer, Ablageort
2. Skill schlägt ein Hintergrundbild für die Titelfolie vor (passend zum Thema)
3. Skill schlägt eine Gliederung vor (Folie + Layout-Funktion)
4. Skill generiert ein Python-Skript
5. Skill führt das Skript aus und öffnet die `.pptx`
## Nutzung
Im Kiro-Chat: "Erstelle eine PowerPoint-Präsentation über [Thema]"
Der Skill durchläuft die obigen 5 Schritte und legt am Ende eine fertige `.pptx`-Datei
am gewünschten Ablageort ab.
## Direkter Code-Aufruf (ohne Skill)
`SKILL_DIR` ist der Pfad zum `assets/`-Ordner deines Skill-Klons. Beispiele:
- Windows (user-level): `C:\Users\<dein-username>\.kiro\skills\pptx-infrago\assets`
- Windows (workspace): `<projekt>\.kiro\skills\pptx-infrago\assets`
- macOS / Linux (user-level): `~/.kiro/skills/pptx-infrago/assets`
- macOS / Linux (workspace): `<projekt>/.kiro/skills/pptx-infrago/assets`
```python
import sys
from pathlib import Path
# Pfad anpassen — siehe Beispiele oben
SKILL = Path.home() / ".kiro" / "skills" / "pptx-infrago" / "assets"
sys.path.insert(0, str(SKILL))
from db_infrago_pptx import (
open_deck, save, background_image_path,
add_titel_bild_schwarz, add_titel_und_inhalt, add_ende_bild,
)
prs = open_deck()
add_titel_bild_schwarz(
prs, "Mein Thema", "Untertitel",
bild=background_image_path("datenstroeme"),
kategorie="Architektur",
footer="DB InfraGO AG | Max Mustermann | Team | 2026",
)
add_titel_und_inhalt(prs, "Punkte", ["Eins", "Zwei", "Drei"])
add_ende_bild(prs, "Vielen Dank.", bild=background_image_path("ice_bahnsteig"))
save(prs, "output.pptx")
```
## Version
1.0.1 — Stand 11.05.2026
- Basiert auf dem offiziellen DB InfraGO Folienmaster (31 Layouts)
- Funktion pro Layout im Helper-Modul `db_infrago_pptx.py`
- 10 mitgelieferte Hintergrundbilder mit thematischer Auswahl-Heuristik
- Ergänzend zum bestehenden HTML-Skill `praesi-infrago` (Reveal.js)
### Changelog
**1.1.0** — Klassifizierung + Breaking Changes (18.05.2026):
- **NEU:** `klassifizierung`-Parameter auf allen Slide-Funktionen. Platziert
Vertraulichkeitsstufe (z.B. "DB Offen / DB Open") oben links in roter Schrift.
- **NEU:** `_set_klassifizierung()` Helper — Textbox mit DB Neo Office 11pt rot.
- **NEU:** SKILL.md erweitert um Klassifizierungs-Abfrage (Punkt 6) mit
Sicherheitshinweis (DB Streng Vertraulich wird abgelehnt).
- **NEU:** Logo-Assets: `logo_infrago.png`, `logo_infrago_schwarz.png`,
`logo_infrago_weiss.png`, `logo_infrago_rot_weiss.png` fuer manuelle Platzierung.
- **FIX:** `_set_kategorie()` prueft jetzt ob der Platzhalter ein Logo
(blipFill) enthaelt und fasst ihn dann NICHT an (statt ihn zu entfernen).
- **FIX:** `add_ende_logo()` platziert Text als separates Textfeld statt in
den Logo-Platzhalter zu schreiben.
- **BREAKING:** Entfernt: `add_titel_weiss`, `add_titel_rot`,
`add_titel_bild_schwarz_zentriert`, `add_titel_bild_weiss_zentriert`.
Diese Layouts (0, 1, 4, 5) sind im aktuellen Folienmaster nicht mehr relevant.
**1.1.0** — Klassifizierung + Breaking Changes (18.05.2026):
- NEU: klassifizierung-Parameter auf allen Slide-Funktionen
- NEU: _set_klassifizierung() Helper
- NEU: SKILL.md erweitert um Klassifizierungs-Abfrage (Punkt 6)
- NEU: Logo-Assets fuer manuelle Platzierung
- FIX: _set_kategorie() prueft blipFill (Logo-Schutz)
- FIX: add_ende_logo() nutzt separates Textfeld
- BREAKING: Entfernt: add_titel_weiss, add_titel_rot, add_titel_bild_schwarz_zentriert, add_titel_bild_weiss_zentriert
**1.0.1** — Bugfixes und Doku-Konsistenz nach erstem Review:
- Bugfix: Beispiel in „Kreative Folien" importierte fälschlich `FOOTER` aus dem Helper
- Helper: ungenutzte Imports entfernt (`os`, `Cm`, `Pt`)
- Helper: Slide-Number-Field-ID nun pro Slide eindeutig (UUID statt fixer ID)
- Helper: Imports zentralisiert; `lxml`-Nutzung explizit dokumentiert
- Helper: `_set_text` skipt bei Leerstring (Layout-Default bleibt erhalten)
- `__all__` vervollständigt um `DB_RED_DARK`, `DB_TURQUOISE_300/100`, `DB_GRAY_MED`
- Doku: Workflow-Schrittzahl angeglichen (5 statt 4), Pfad-Beispiele cross-platform,
„kommt vom Master"-Formulierung präzisiert, Layout-Katalog/Slide-Typen ergänzt
**1.0.0** — Initial-Release
+387
View File
@@ -0,0 +1,387 @@
---
name: pptx-infrago
description: >
Erstellt PowerPoint-Präsentationen (.pptx) im DB InfraGO Corporate Design mit Python.
Nutzt den offiziellen DB InfraGO Folienmaster (31 Layouts) und ein Helper-Modul.
Nutze diesen Skill wenn der User eine PowerPoint-Datei, .pptx, Foliensatz oder Vortrag
als PowerPoint-Datei (nicht HTML) erstellen möchte.
Keywords: PowerPoint, PPTX, Folien, Foliensatz, Vortrag, Folienmaster, python-pptx, Master.
compatibility: >
Benötigt Python 3.10+ mit python-pptx (>=1.0). DB-Rechner empfohlen für DB-Schriften
(DB Neo Office Head / DB Neo Office). Kein Internet nötig — Vorlage und Bilder liegen
im Skill.
metadata:
version: "1.3.0"
author: "Uwe Sülter"
theme: "DB InfraGO Folienmaster (offiziell)"
template: "InfraGo_master_vorlage.pptx"
---
# PowerPoint-Präsentationen im DB InfraGO Folienmaster
Self-contained Skill für `.pptx`-Dateien. Die offizielle Vorlage `InfraGo_master_vorlage.pptx`
und das Helper-Modul `db_infrago_pptx.py` liegen direkt im Skill-Ordner unter `assets/`.
**Grundprinzip:** Der Skill schreibt nicht selbst Folien-Geometrie, sondern nutzt die 31
fertigen Layouts des offiziellen Folienmasters. Pro Layout gibt es eine Funktion im
Helper-Modul. Logo, Footer-Slot, Foliennummer und Farben werden vom Master geerbt —
Python befüllt nur die Platzhalter (Footer und Foliennummer werden technisch aus dem
Layout in die Slide geklont, weil python-pptx das nicht von selbst tut).
## Ablauf
### Schritt 1: Infos sammeln
ALLE 6 Punkte MÜSSEN geklärt sein bevor es weitergeht. Auch wenn das Thema offensichtlich
scheint — Zielgruppe und Umfang IMMER nachfragen, NIEMALS selbst annehmen.
**Name ermitteln (Fallback-Kette):**
1. Steerings/Kontext prüfen — steht der Name schon im geladenen Kontext (z.B. kiro-umgebung.md)?
2. `git config user.name` ausführen
3. Wenn beides fehlschlägt: User fragen
1. **Thema** — Worum geht es?
2. **Zielgruppe** — Für wen? (Devs, POs, Management, Fachbereich?)
3. **Umfang** — Wie viele Folien / wie lang?
4. **Footer** — Default: "DB InfraGO AG | [Name] | [Team] | [Jahr]"
5. **Ablageort** — Wo soll die `.pptx`-Datei hin?
6. **Klassifizierung** — Welche Vertraulichkeitsstufe? Erlaubte Werte:
- `"DB Offen / DB Open"` — für öffentlich teilbare Inhalte
- `"DB Intern / DB internal"` — für konzerninterne Inhalte (häufigster Fall)
- `"DB Vertraulich / DB confidential"` — für vertrauliche Inhalte
- `""` (leer) — keine Klassifizierung anzeigen
**WICHTIG:** Dieser Skill darf NUR für die Stufen "DB Offen", "DB Intern" und
"DB Vertraulich" verwendet werden. Für höhere Stufen (z.B. "DB Streng Vertraulich")
ist die automatische Erstellung von Präsentationen NICHT zulässig — den User darauf
hinweisen und ablehnen.
Nachfrage-Template — IMMER komplett zeigen, KEINE Felder weglassen:
```
Bevor ich loslege, brauche ich noch ein paar Infos:
- **Thema:** [fehlt/vorhanden]
- **Zielgruppe:** [fehlt/vorhanden]
- **Umfang:** [fehlt/vorhanden]
- **Footer:** DB InfraGO AG | [git user.name] | [Team?] | [Jahr]
- **Ablageort:** [fehlt/vorhanden]
- **Klassifizierung:** [fehlt] — Erlaubt: "DB Offen / DB Open", "DB Intern / DB internal",
"DB Vertraulich / DB confidential", oder leer (keine Anzeige).
⚠️ Dieser Skill darf nur für DB Offen, DB Intern und DB Vertraulich genutzt werden.
Optional:
- Hintergrundbild für die Titelfolie? (Ich schlage selbst ein passendes Bild aus den
10 mitgelieferten Bildern vor — basierend auf dem Thema. Du kannst das Vorgeschlagene
bestätigen, ein anderes wählen oder einen eigenen Pfad angeben.)
- Bestimmte Inhalte die rein müssen? (Tabellen, Zitate, Statements, Bild-Folien?)
```
WICHTIG: NIEMALS "Laut Skill muss ich..." oder "Der Skill verlangt..." sagen. Natürlich
kommunizieren.
### Schritt 2: Hintergrundbild für Titelfolie auswählen
Ohne dass der User explizit ein Bild nennt: Schau ins Thema und schlage GENAU EIN Bild
aus `BACKGROUND_IMAGES` vor (siehe `assets/db_infrago_pptx.py` oder
[references/asset-katalog.md](references/asset-katalog.md)). Sag dem User welches Bild und
warum.
Beispielzuordnungen:
- Architektur, Datenflüsse, Migration → `datenstroeme`
- Innovation, neue Konzepte, Ideen → `gluehbirne`
- Strategie, Vision, Digitalisierung → `weltkugel` oder `digital_transformation`
- Infrastruktur, Bahnbetrieb, Wartung → `gleisarbeiter`
- Performance, Geschwindigkeit, Go-Live → `ice_bahnsteig`
- Teamwork, Onboarding, Integration → `puzzle`
- Demos, Abnahme, Qualitätssicherung → `laptop_checkmark`
- Daten, Code, Netzwerk → `binaercode`
- Neutral / kein klares Thema → `ice_line` (ICE-Silhouette mit Sand→Türkis Gradient)
### Schritt 3: Gliederung vorschlagen
Folien-Struktur als Markdown-Liste vorschlagen, jeweils mit dem Layout-Funktionsnamen
in Klammern. Beispiel:
```
1. Titelfolie (add_titel_bild_schwarz mit "datenstroeme")
2. Agenda (add_inhaltsverzeichnis_weiss)
3. Ausgangslage (add_titel_und_inhalt)
4. Lösung (add_titel_und_2_inhalte)
5. Beispiel (add_text_und_bild_links)
6. Statement (add_statement_rot)
7. Ausblick (add_titel_und_inhalt)
8. Schluss (add_ende_bild mit "ice_bahnsteig")
```
Auf Bestätigung warten, BEVOR Code geschrieben wird.
### Schritt 4: Python-Skript generieren
**Pfadberechnung:** Das Helper-Modul `db_infrago_pptx.py` und die Vorlage liegen im
Skill-Ordner. Python kann daraus importieren wenn der Skill-Ordner im `sys.path` ist
oder das Modul kopiert wird.
**Empfohlener Ansatz:** Im generierten Skript am Anfang den Skill-Ordner zum `sys.path`
hinzufügen — dann kein Kopieren, immer auf der aktuellen Helper-Version. `SKILL_DIR`
zeigt auf den `assets/`-Ordner deiner Skill-Installation:
- Windows (user-level): `C:\Users\<dein-username>\.kiro\skills\pptx-infrago\assets`
- Windows (workspace): `<projekt>\.kiro\skills\pptx-infrago\assets`
- macOS / Linux (user-level): `~/.kiro/skills/pptx-infrago/assets`
- macOS / Linux (workspace): `<projekt>/.kiro/skills/pptx-infrago/assets`
```python
# -*- coding: utf-8 -*-
import sys
from pathlib import Path
# Skill-Ordner zum sys.path hinzufügen — Pfad an deine Installation anpassen
SKILL_DIR = Path.home() / ".kiro" / "skills" / "pptx-infrago" / "assets"
sys.path.insert(0, str(SKILL_DIR))
from db_infrago_pptx import (
open_deck, save, add_notes, background_image_path,
add_titel_bild_schwarz, add_inhaltsverzeichnis_weiss,
add_titel_und_inhalt, add_titel_und_2_inhalte,
add_text_und_bild_links, add_statement_rot, add_ende_bild,
)
FOOTER = "DB InfraGO AG | Max Mustermann | Team | 2026"
KLASSIFIZIERUNG = "DB Intern / DB internal" # oder "" wenn keine Anzeige gewünscht
prs = open_deck()
# Folie 1: Titel mit Hintergrundbild
slide = add_titel_bild_schwarz(
prs,
titel="Mein Thema",
untertitel="Untertitel der Präsentation",
bild=background_image_path("datenstroeme"),
kategorie="Strategie",
footer=FOOTER,
klassifizierung=KLASSIFIZIERUNG,
)
add_notes(slide, "Begrüßung, Vorstellung des Themas, Motivation.")
# Folie 2: Agenda
add_inhaltsverzeichnis_weiss(
prs,
titel="Agenda",
eintraege=["Ausgangslage", "Lösung", "Beispiel", "Statement", "Ausblick"],
footer=FOOTER,
klassifizierung=KLASSIFIZIERUNG,
)
# … weitere Folien …
# Folie n: Schluss
add_ende_bild(prs, titel="Vielen Dank.", bild=background_image_path("ice_bahnsteig"))
out = save(prs, r"C:\BA\projekt\folien.pptx")
print(f"Datei erzeugt: {out}")
```
**Dateiname:** `YYYY-MM-DD_thema-kebab-case.py` für das Skript,
`YYYY-MM-DD_thema-kebab-case.pptx` als Output.
**Speaker Notes:** Für jeden Inhalts-Slide Speaker-Notes via `add_notes(slide, "...")`
schreiben. Notes enthalten Stichpunkte für den Vortragenden — Details die nicht auf den
Slide passen, Erklärungen, Überleitung zur nächsten Folie.
**Schreibstrategie:**
- fsWrite für Header + Imports + erste 12 Folien (max ~50 Zeilen)
- fsAppend in Blöcken à max 40 Zeilen
- Letzter fsAppend: Schlussfolie + `save()`-Aufruf
- Anzahl der Blöcke vorher abschätzen
- NIEMALS die Datei komplett neu schreiben weil ein Append fehlschlug — gezielt mit
strReplace patchen
### Schritt 5: Skript ausführen und PPTX öffnen — IN DERSELBEN ANTWORT
Direkt nach dem letzten fsAppend (mit `save()`) — OHNE vorher "fertig" zu sagen:
1. **Skript ausführen:** `python C:\BA\{Ablageort}\{Dateiname}.py`
2. **Datei öffnen:** `Invoke-Item "C:\BA\{Ablageort}\{Dateiname}.pptx"` — einfach machen,
nicht nachfragen.
3. **Kurzer Hinweis:** Dem User mitteilen, was generiert wurde und wie er die Datei
nachbearbeiten kann (PowerPoint öffnet automatisch).
## Slide-Funktionen Übersicht
Volle API-Doku siehe [references/slide-typen.md](references/slide-typen.md). Mapping
Layout-Index → Funktion siehe [references/layout-katalog.md](references/layout-katalog.md).
| Anlass | Funktion |
|---|---|
| Titel mit Bild | `add_titel_bild_schwarz` / `_weiss` |
| Titel im Rahmen | `add_titel_rahmen` |
| Agenda / Inhaltsverzeichnis | `add_inhaltsverzeichnis_weiss` / `_rot` / `_bild_*` |
| Kapiteltrenner | `add_kapiteltrenner_weiss` / `_bild_*` |
| Standard-Inhaltsfolie | `add_titel_und_inhalt` |
| Zwei-Spalten-Inhalt | `add_titel_und_2_inhalte` |
| Text + Bild | `add_text_und_bild_links` / `_rechts` |
| Vollbild mit Titelzeile | `add_bild_mit_titel_schwarz` / `_weiss` |
| Nur Titel (für eigenes Layout) | `add_nur_titel` / `_grau` |
| Komplett leer | `add_leer` |
| Aussage groß | `add_statement_rot` / `_weiss` |
| Zitat | `add_zitat_rot` / `_weiss` |
| Schlussfolie Bild | `add_ende_bild` |
| Schlussfolie Rot | `add_ende_rot` |
| Schlussfolie Logo | `add_ende_logo` |
| Bild-Agenda | `add_bild_agenda` |
| **Tabelle (Türkis-Header)** | `add_tabelle` |
| **Daten und Fakten (Kennzahl groß)** | `add_daten_und_fakten` |
| **Zeitstrahl (n Stationen)** | `add_zeitstrahl` |
| **Prozessablauf (n Schritte)** | `add_prozessablauf` |
| **Piktogramm einfügen** | `add_pictogram` (86 Icons aus DB-Master) |
## Kreative Folien — wenn die Templates nicht reichen
Die 31 Layouts decken die häufigsten Fälle ab, sind aber ausdrücklich KEIN Korsett.
Für Diagramme, eigene Skizzen, freie Visualisierungen, Roadmaps, BPMN-Skizzen,
Architektur-Bilder usw. gibt es zwei Layouts, die genau dafür gemacht sind:
| Funktion | Was du bekommst | Wann |
|---|---|---|
| `add_nur_titel(prs, titel, footer)` | Folientitel oben + komplett freier Inhaltsbereich | Diagramme mit Titelzeile |
| `add_nur_titel_grau(prs, titel, footer)` | Wie oben, aber grauer Hintergrund | Visuelle Abgrenzung im Foliensatz |
| `add_leer(prs, footer)` | Komplett freie Folie (nur Footer-Slot) | Vollbild-Visualisierung, eigene Header-Position |
Auf diesen Folien gilt: alles ist erlaubt. Logo, Foliennummer und Footer werden vom
Master geerbt — du sparst dir nur die starre Bullet-Liste.
Typische Erweiterungen mit `python-pptx`:
```python
from pptx.util import Cm, Pt
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from pptx.dml.color import RGBColor
from db_infrago_pptx import add_nur_titel, DB_TURQUOISE_500, DB_RED
FOOTER = "DB InfraGO AG | Max Mustermann | Team | 2026"
slide = add_nur_titel(prs, "Architektur-Skizze", FOOTER)
# Box
box = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
Cm(2), Cm(4), Cm(8), Cm(3))
box.fill.solid(); box.fill.fore_color.rgb = DB_TURQUOISE_500
box.text_frame.text = "Frontend"
# Pfeil zwischen Boxen
conn = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT,
Cm(10), Cm(5.5), Cm(14), Cm(5.5))
conn.line.color.rgb = DB_RED
# Eigenes Bild
slide.shapes.add_picture(r"C:\diagramme\flow.png",
left=Cm(2), top=Cm(8), width=Cm(20))
# Freies Textfeld
tb = slide.shapes.add_textbox(Cm(2), Cm(15), Cm(20), Cm(2))
tb.text_frame.text = "Hinweis: Skizze, kein finales Design."
```
Mehr Beispiele und Patterns: [references/slide-typen.md](references/slide-typen.md)
unter „Kreative Folien".
**Wichtig bei kreativen Folien:**
- DB-Farbpalette nutzen (`DB_TURQUOISE_500`, `DB_RED`, `DB_SAND` usw. aus dem Helper)
- Maße in `Cm()` oder `Emu()` — nicht in Pixeln
- Folie ist 33.87 × 19.05 cm groß
- Master-Elemente nicht überdecken (Logo oben rechts, Footer unten)
## Hintergrundbilder (10 Stück)
Verwendung:
```python
from db_infrago_pptx import background_image_path
add_titel_bild_weiss(prs, "Titel", bild=background_image_path("datenstroeme"))
```
Verfügbare Keys: `ice_line`, `laptop_checkmark`, `datenstroeme`, `gleisarbeiter`,
`weltkugel`, `ice_bahnsteig`, `gluehbirne`, `puzzle`, `digital_transformation`,
`binaercode`. Details in [references/asset-katalog.md](references/asset-katalog.md).
User kann auch eigene Bilder per Pfad angeben (statt `background_image_path("...")`
einfach `r"C:\pfad\zu\bild.jpg"`).
## Piktogrammbibliothek (86 SVG-Icons)
Aus dem DB InfraGO Master extrahiert — alle als monochrome SVG-Vektoren, die zur
Laufzeit in jede DB-Farbe eingefärbt werden können (Türkis, Rot, Schwarz, Weiß).
PowerPoint 2016+ rendert SVGs nativ — die Icons bleiben gestochen scharf bei jeder
Größe.
```python
from db_infrago_pptx import add_pictogram, list_pictograms, DB_TURQUOISE_500, DB_RED
from pptx.util import Cm
# Auf einer "Nur Titel"-Folie 4 Icons mit Beschriftung platzieren
slide = add_nur_titel(prs, "Vorteile", footer=FOOTER)
add_pictogram(slide, "haekchen", Cm(2), Cm(7), Cm(4), color=DB_TURQUOISE_500)
add_pictogram(slide, "uhr", Cm(9), Cm(7), Cm(4), color=DB_TURQUOISE_500)
add_pictogram(slide, "datenbank", Cm(16), Cm(7), Cm(4), color=DB_TURQUOISE_500)
add_pictogram(slide, "puzzleteile", Cm(23), Cm(7), Cm(4), color=DB_TURQUOISE_500)
# Verfügbare Keys auflisten
for key, descr in list_pictograms():
print(f" {key:30s} {descr}")
```
**Häufige Keys** (sortiert nach Anwendung):
- Bestätigung: `haekchen`, `volltreffer`, `pruefliste`, `klemmbrett`
- Negation: `schliessen`, `verbotsschild`, `nicht_zulaessig`
- Daten: `datenbank`, `cloud`, `cloudcomputing`, `balkendiagramm`,
`flussdiagramm`, `verzweigungsdiagramm`, `abwaertstrend-diagramm`
- Kommunikation: `chat`, `chatblase`, `e-mail`, `kommentar_like`, `kommentar_herz`
- Zeit: `uhr`, `tageskalender`, `flip-kalender`
- Aktionen: `wiedergabe`, `aktualisieren`, `herunterladen`, `uebertragen`
- Pfeile: `pfeil_nach_oben`, `pfeil_nach_unten`, `pfeil_nach_rechts`, `pfeil_kreis`,
diverse Drehpfeile
- Sonstiges: `puzzleteile`, `handschlag`, `aktenkoffer`, `lupe`, `informationen`,
`hilfe`, `fragezeichen`, `ausrufezeichen`, `management`, `vertrag`,
`gehaltsabrechnung`, `geschichte`, `blockchain`, `computer`, `browserfenster`
Vollständige Liste mit `list_pictograms()` oder direkt aus `PICTOGRAMS.keys()`.
**Farb-Override** ist optional — ohne `color`-Parameter bleibt das Icon in der
SVG-Default-Farbe (meist schwarz). Empfehlung für CI-konforme Slides:
`DB_TURQUOISE_500` als Akzent oder `DB_BLACK` für neutralen Look.
## Design-Guide (DB InfraGO)
Siehe [references/ci-referenz.md](references/ci-referenz.md). Wichtigste Regeln:
- Folienmaster nicht überschreiben — er bringt Logo, Footer-Slot, Foliennummer und
Farben automatisch mit.
- Schriften: `DB Neo Office Head` (Überschriften) und `DB Neo Office` (Fließtext) — auf
DB-Rechnern installiert. Der Helper setzt diese explizit, damit sie nicht über
System-Defaults wie Calibri ersetzt werden.
- DB Rot (#EC0016) = Akzentfarbe (Logo, Highlights), NICHT Hauptfarbe.
- Primärfarben: Türkis (#006E6B / #00A099) + Sand (#FCE3BA).
- Schriftfarbe: nur Schwarz oder Weiß.
- Max 57 Bullets pro Folie, max 2 Sätze pro Bullet (besser: Stichworte).
- Eine Kernaussage pro Folie — nicht mehrere Themen mischen.
- Tabellen: max 56 Zeilen sichtbar, sonst aufteilen.
- Speaker Notes für Details nutzen.
- Jede Folie muss in 3060 Sekunden erfassbar sein.
- 3-Akt-Struktur: Eröffnung → Hauptteil mit Trennern → Abschluss.
- NIEMALS nur Vorname im Footer — immer "DB InfraGO AG | Vollständiger Name | Team | Jahr".
## Voraussetzungen
`python-pptx` muss installiert sein:
```powershell
pip install python-pptx
```
## Referenz-Dateien
- [references/layout-katalog.md](references/layout-katalog.md) — alle 31 Layouts mit Index, Name, Platzhaltern, Geometrie
- [references/slide-typen.md](references/slide-typen.md) — Funktions-API mit Code-Beispielen
- [references/asset-katalog.md](references/asset-katalog.md) — Hintergrundbilder mit Empfehlungen
- [references/ci-referenz.md](references/ci-referenz.md) — Farben, Schriften, CI-Regeln
Binary file not shown.

After

Width:  |  Height:  |  Size: 781 KiB

@@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
"""Piktogramm-Bibliothek aus dem DB InfraGO Master (auto-generated).
Quelle: Slide 24 des Master-Templates ("Piktogrammbibliothek").
Wird vom Helper-Modul db_infrago_pptx geladen.
Nicht von Hand bearbeiten — bei Master-Updates extract_pictograms.py erneut laufen lassen.
"""
PICTOGRAMS: dict[str, dict[str, str]] = {
'abwaertstrend-diagramm': {"file": 'abwaertstrend-diagramm.svg', "descr": 'Abwärtstrend-Diagramm'},
'aktenkoffer': {"file": 'aktenkoffer.svg', "descr": 'Aktenkoffer'},
'aktualisieren': {"file": 'aktualisieren.svg', "descr": 'Aktualisieren'},
'aus_der_cloud_herunterladen': {"file": 'aus_der_cloud_herunterladen.svg', "descr": 'Aus der Cloud herunterladen'},
'ausrufezeichen': {"file": 'ausrufezeichen.svg', "descr": 'Ausrufezeichen'},
'balkendiagramm': {"file": 'balkendiagramm.svg', "descr": 'Balkendiagramm'},
'balkendiagramm_2': {"file": 'balkendiagramm_2.svg', "descr": 'Balkendiagramm'},
'balkendiagramm_mit_abwaertstrend': {"file": 'balkendiagramm_mit_abwaertstrend.svg', "descr": 'Balkendiagramm mit Abwärtstrend'},
'balkendiagramm_mit_abwaertstrend_2': {"file": 'balkendiagramm_mit_abwaertstrend_2.svg', "descr": 'Balkendiagramm mit Abwärtstrend'},
'blockchain': {"file": 'blockchain.svg', "descr": 'Blockchain'},
'browserfenster': {"file": 'browserfenster.svg', "descr": 'Browserfenster'},
'bueroklammer': {"file": 'bueroklammer.svg', "descr": 'Büroklammer'},
'caretzeichen_nach_links': {"file": 'caretzeichen_nach_links.svg', "descr": 'Caretzeichen nach links'},
'caretzeichen_nach_oben': {"file": 'caretzeichen_nach_oben.svg', "descr": 'Caretzeichen nach oben'},
'caretzeichen_nach_rechts': {"file": 'caretzeichen_nach_rechts.svg', "descr": 'Caretzeichen nach rechts'},
'caretzeichen_nach_unten': {"file": 'caretzeichen_nach_unten.svg', "descr": 'Caretzeichen nach unten'},
'chat': {"file": 'chat.svg', "descr": 'Chat'},
'chatblase': {"file": 'chatblase.svg', "descr": 'Chatblase'},
'chatblase_2': {"file": 'chatblase_2.svg', "descr": 'Chatblase'},
'cloud': {"file": 'cloud.svg', "descr": 'Cloud'},
'cloudcomputing': {"file": 'cloudcomputing.svg', "descr": 'Cloudcomputing'},
'computer': {"file": 'computer.svg', "descr": 'Computer'},
'datenbank': {"file": 'datenbank.svg', "descr": 'Datenbank'},
'e-mail': {"file": 'e-mail.svg', "descr": 'E-Mail'},
'einchecken': {"file": 'einchecken.svg', "descr": 'Einchecken'},
'fahrrad_mit_personen': {"file": 'fahrrad_mit_personen.svg', "descr": 'Fahrrad mit Personen'},
'flip-kalender': {"file": 'flip-kalender.svg', "descr": 'Flip-Kalender'},
'flussdiagramm': {"file": 'flussdiagramm.svg', "descr": 'Flussdiagramm'},
'folgen': {"file": 'folgen.svg', "descr": 'Folgen'},
'fragezeichen': {"file": 'fragezeichen.svg', "descr": 'Fragezeichen'},
'gehaltsabrechnung': {"file": 'gehaltsabrechnung.svg', "descr": 'Gehaltsabrechnung'},
'geschichte': {"file": 'geschichte.svg', "descr": 'Geschichte'},
'grinsendes_gesicht': {"file": 'grinsendes_gesicht.svg', "descr": 'Grinsendes Gesicht'},
'haekchen': {"file": 'haekchen.svg', "descr": 'Häkchen'},
'handschlag': {"file": 'handschlag.svg', "descr": 'Handschlag'},
'herunterladen': {"file": 'herunterladen.svg', "descr": 'Herunterladen'},
'hilfe': {"file": 'hilfe.svg', "descr": 'Hilfe'},
'informationen': {"file": 'informationen.svg', "descr": 'Informationen'},
'klemmbrett': {"file": 'klemmbrett.svg', "descr": 'Klemmbrett'},
'klemmbrett_marke': {"file": 'klemmbrett_marke.svg', "descr": 'Klemmbrett Marke'},
'klemmbrett_nur_kreuze': {"file": 'klemmbrett_nur_kreuze.svg', "descr": 'Klemmbrett nur Kreuze'},
'kommentar_gefaellt_nicht': {"file": 'kommentar_gefaellt_nicht.svg', "descr": 'Kommentar Gefällt nicht'},
'kommentar_herz': {"file": 'kommentar_herz.svg', "descr": 'Kommentar Herz'},
'kommentar_like': {"file": 'kommentar_like.svg', "descr": 'Kommentar Like'},
'kommentar_wichtig': {"file": 'kommentar_wichtig.svg', "descr": 'Kommentar (wichtig)'},
'lachendes_gesicht': {"file": 'lachendes_gesicht.svg', "descr": 'Lachendes Gesicht'},
'liste': {"file": 'liste.svg', "descr": 'Liste'},
'lupe': {"file": 'lupe.svg', "descr": 'Lupe'},
'management': {"file": 'management.svg', "descr": 'Management'},
'markierung': {"file": 'markierung.svg', "descr": 'Markierung'},
'maximieren': {"file": 'maximieren.svg', "descr": 'Maximieren'},
'nicht_zulaessig': {"file": 'nicht_zulaessig.svg', "descr": 'Nicht zulässig'},
'ordner': {"file": 'ordner.svg', "descr": 'Ordner'},
'ordnersuche': {"file": 'ordnersuche.svg', "descr": 'Ordnersuche'},
'papier': {"file": 'papier.svg', "descr": 'Papier'},
'pfeil_kreis': {"file": 'pfeil_kreis.svg', "descr": 'Pfeil Kreis'},
'pfeil_mit_einer_linie_gerade': {"file": 'pfeil_mit_einer_linie_gerade.svg', "descr": 'Pfeil mit einer Linie: Gerade'},
'pfeil_mit_einer_linie_kurve_gegen_den_uhrzeigersinn': {"file": 'pfeil_mit_einer_linie_kurve_gegen_den_uhrzeigersinn.svg', "descr": 'Pfeil mit einer Linie: Kurve gegen den Uhrzeigersinn'},
'pfeil_mit_einer_linie_kurve_im_uhrzeigersinn': {"file": 'pfeil_mit_einer_linie_kurve_im_uhrzeigersinn.svg', "descr": 'Pfeil mit einer Linie: Kurve im Uhrzeigersinn'},
'pfeil_mit_einer_linie_nach_links_drehen': {"file": 'pfeil_mit_einer_linie_nach_links_drehen.svg', "descr": 'Pfeil mit einer Linie: Nach links drehen'},
'pfeil_mit_einer_linie_nach_rechts_drehen': {"file": 'pfeil_mit_einer_linie_nach_rechts_drehen.svg', "descr": 'Pfeil mit einer Linie: Nach rechts drehen'},
'pfeil_nach_oben': {"file": 'pfeil_nach_oben.svg', "descr": 'Pfeil nach oben'},
'pfeil_nach_rechts': {"file": 'pfeil_nach_rechts.svg', "descr": 'Pfeil nach rechts'},
'pfeil_nach_unten': {"file": 'pfeil_nach_unten.svg', "descr": 'Pfeil nach unten'},
'posteingang': {"file": 'posteingang.svg', "descr": 'Posteingang'},
'prost': {"file": 'prost.svg', "descr": 'Prost'},
'pruefliste': {"file": 'pruefliste.svg', "descr": 'Prüfliste'},
'puzzleteile': {"file": 'puzzleteile.svg', "descr": 'Puzzleteile'},
'schliessen': {"file": 'schliessen.svg', "descr": 'Schließen'},
'schliessendes_anfuehrungszeichen': {"file": 'schliessendes_anfuehrungszeichen.svg', "descr": 'Schließendes Anführungszeichen'},
'schneller_vorlauf': {"file": 'schneller_vorlauf.svg', "descr": 'Schneller Vorlauf'},
'shuffle': {"file": 'shuffle.svg', "descr": 'Shuffle'},
'sortieren': {"file": 'sortieren.svg', "descr": 'Sortieren'},
'sperren': {"file": 'sperren.svg', "descr": 'Sperren'},
'tageskalender': {"file": 'tageskalender.svg', "descr": 'Tageskalender'},
'uebertragen': {"file": 'uebertragen.svg', "descr": 'Übertragen'},
'uhr': {"file": 'uhr.svg', "descr": 'Uhr'},
'umschaltflaeche': {"file": 'umschaltflaeche.svg', "descr": 'Umschaltfläche'},
'verbotsschild': {"file": 'verbotsschild.svg', "descr": 'Verbotsschild'},
'vertrag': {"file": 'vertrag.svg', "descr": 'Vertrag'},
'verzweigungsdiagramm': {"file": 'verzweigungsdiagramm.svg', "descr": 'Verzweigungsdiagramm'},
'volltreffer': {"file": 'volltreffer.svg', "descr": 'Volltreffer'},
'wiedergabe': {"file": 'wiedergabe.svg', "descr": 'Wiedergabe'},
'zurueck': {"file": 'zurueck.svg', "descr": 'Zurück'},
'zurueck_2': {"file": 'zurueck_2.svg', "descr": 'Zurück'},
'zurueckspulen': {"file": 'zurueckspulen.svg', "descr": 'Zurückspulen'},
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 317 70" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="DB_InfraGO_logo" xml:space="preserve" overflow="hidden"><g id="DB_Logo"><g><path d="M90 0 10 0C4.6 0 0 4.3 0 10L0 60C0 65.5 4.6 70 10 70L90 70C95.5 70 100 65.5 100 59.9L100 10C100 4.3 95.4 0 90 0Z" fill="#EC0016"/><path d="M92.7 59.9C92.7 61.5 91.5 62.8 90 62.8L10 62.8C8.4 62.8 7.3 61.5 7.3 59.9L7.3 10C7.3 8.4 8.5 7.1 10 7.1L90 7.1C91.6 7.1 92.7 8.4 92.7 10L92.7 59.9Z" fill="#FFFFFF"/></g><g><path d="M30.6 57.9 13.8 57.9 13.8 12.1 30.6 12.1C42.5 12.1 49 19.5 49 34.8 49 48 44.5 57.8 30.6 57.9ZM37.9 35.7C37.9 26.5 36.9 19.3 27 19.3L24.8 19.3 24.8 50.5 28.7 50.5C34.5 50.5 37.9 45.8 37.9 35.7Z" fill="#EC0016"/></g><path d="M78 33.9C81.2 33 86 29.3 86 23.2 86 22.2 85.8 12 72.9 12L53.8 12 53.8 57.8 70 57.8C74.3 57.8 87.7 57.8 87.7 44.9 87.7 41.8 86.3 35.8 78 33.9ZM64.7 19.2 68.2 19.2C73.1 19.2 75.1 20.9 75.1 24.7 75.1 27.7 72.9 30.2 69.1 30.2L64.7 30.2 64.7 19.2ZM69.2 50.5 64.7 50.5 64.7 38.7 69.5 38.7C75.2 38.7 76.6 42 76.6 44.6 76.6 50.5 71 50.5 69.2 50.5Z" fill="#EC0016"/></g><g id="InfraGo"><path d="M125 19.1 135 19.1 135 58 125 58 125 19.1Z" fill="#FFFFFF"/><path d="M148.3 28.5 150.5 28.5 150.5 33.7C153.6 30.2 156.7 28.6 160.4 28.6 165.3 28.6 168.1 31.9 168.1 37.6L168.1 57.9 158.8 57.9 158.8 39.7C158.8 37.3 157.7 36.2 155.4 36.2 153.8 36.2 152.6 36.6 150.5 37.7L150.5 57.9 141.2 57.9 141.2 30.3C144.9 30.2 147.2 29.6 148.3 28.5Z" fill="#FFFFFF"/><path d="M175 37.2 171.4 37.2 171.4 30.6 175 30.6 175 28.6C175 22.3 178.8 18.4 186.3 18.4 188.2 18.4 189.6 18.6 190.9 18.7L190.9 25.1C190.2 25 189.6 24.9 188.9 24.9 185.7 24.9 184.4 26.1 184.4 28.9L184.4 30.6 189.2 30.6 189.2 37.2 184.4 37.2 184.4 57.9 175 57.9 175 37.2Z" fill="#FFFFFF"/><path d="M199.3 28.6 201.5 28.6 201.5 34.3C203.9 30.5 206.4 28.7 209.1 28.7 209.4 28.7 209.6 28.8 209.8 28.8L209.8 37.1 209.2 37.2C206.7 37.4 203.9 38 201.5 39.1L201.5 58 192.2 58 192.2 30.4C195.8 30.3 198.1 29.7 199.3 28.6Z" fill="#FFFFFF"/><path d="M226.7 54.2C224.6 57.2 221.8 58.7 218.3 58.7 213 58.7 209.9 55.7 209.9 50.1 209.9 42 216.9 41.5 226.2 41.1L226.2 39.6C226.2 36.6 224.8 35.5 222 35.5 219.2 35.5 216.1 36 212.2 36.7L212.2 29.5C216.3 28.6 219.4 28.2 223 28.2 231.9 28.2 235.5 31.5 235.5 39.4L235.5 51.1C235.5 54.3 235.8 55.4 236.7 56.1L236.7 57.7 227.7 57.7 226.7 54.2ZM222.1 52.6C223.6 52.6 225 52.1 226.3 51L226.3 45.3C221 45.5 219.1 45.8 219.1 49.3 219 51.6 219.9 52.6 222.1 52.6Z" fill="#FFFFFF"/><path d="M240.1 39 240.1 38.8C240.1 25.2 247.3 18.5 260.5 18.5 264.8 18.5 268.1 19 272.1 20.2L272.1 28.1C268.2 26.8 264.8 26.2 261 26.2 253.1 26.2 251 30.2 251 38.8L251 39.1C251 47.9 253.4 51.3 260.4 51.3 262 51.3 263.1 51.1 264.6 50.7L264.6 44.2 258.4 44.2 258.4 36.8 274 36.8 274 55.8C269.2 57.6 265 58.6 260.1 58.6 246.5 58.6 240.1 53.6 240.1 39Z" fill="#FFFFFF"/><path d="M278.7 38.6 278.7 38.4C278.7 25.9 285.8 18.4 297.6 18.4 309.5 18.4 316.5 26 316.5 38.5L316.5 38.7C316.5 51.2 309.5 58.6 297.6 58.6 285.6 58.6 278.7 51.1 278.7 38.6ZM305.6 38.7 305.6 38.4C305.6 29.4 303.2 25.7 297.6 25.7 291.9 25.7 289.6 29.4 289.6 38.5L289.6 38.8C289.6 47.6 292 51.2 297.6 51.2 303.3 51.2 305.6 47.6 305.6 38.7Z" fill="#FFFFFF"/></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_DownwardTrend_LTR" overflow="hidden"><path d="M20 14 14 14 14 82 82 82 82 76 20 76Z"/><path d="M76.1 54.9 64 42.8 58 48.8 48 38.8 42 44.8 28.1 30.9 23.9 35.1 42 53.2 48 47.2 58 57.2 64 51.2 71.9 59.1 66 65 82 65 82 49Z"/></svg>

After

Width:  |  Height:  |  Size: 340 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Briefcase" overflow="hidden"><path d="M56 50.5C56 52.7 54.2 54.5 52 54.5L48 54.5C45.8 54.5 44 52.7 44 50.5L44 48.5 10 48.5 10 76.5C10 78.7 11.8 80.5 14 80.5L86 80.5C88.2 80.5 90 78.7 90 76.5L90 48.5 56 48.5 56 50.5Z"/><path d="M86 24.5 66 24.5 66 18C66 14.1 62.9 11 59 11L41 11C37.1 11 34 14.1 34 18L34 24.5 14 24.5C11.8 24.5 10 26.3 10 28.5L10 44.5 44 44.5 44 42.5 56 42.5 56 44.5 90 44.5 90 28.5C90 26.3 88.2 24.5 86 24.5M40 24.5 40 18C40 17.4 40.4 17 41 17L59 17C59.6 17 60 17.4 60 18L60 24.5 40 24.5Z"/></svg>

After

Width:  |  Height:  |  Size: 626 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Refresh_LTR" overflow="hidden"><path d="M80 34 80 13 73.3 19.7C66.6 13.7 57.7 10 48 10 27 10 10 27 10 48 10 69 27 86 48 86 58.5 86 68 81.7 74.9 74.9L66.4 66.4C61.7 71.1 55.2 74 48 74 33.7 74 22 62.3 22 48 22 33.7 33.7 22 48 22 54.4 22 60.3 24.3 64.8 28.2L59 34 80 34Z"/></svg>

After

Width:  |  Height:  |  Size: 389 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_DownloadFromCloud" overflow="hidden"><path d="M55.5 35 39.5 35 39.5 59 27 59 47.5 83 68 59 55.5 59Z"/><path d="M80.6 37.9C79.8 33 77.1 28.6 73.1 25.7 69 22.8 63.8 21.7 58.8 22.7 53.9 15.2 44.8 11.5 36.1 13.6 27.6 15.8 21.2 22.9 19.9 31.6 14.3 31.8 9 34.5 5.6 39 1.6 44.6 0.9 51.9 3.7 58.2 6.6 64.4 12.6 68.5 19.4 68.9L26.7 68.9 24 65.6 21.5 62.7 19.7 62.7C15.2 62.4 11.2 59.7 9.2 55.6 7.3 51.4 7.8 46.6 10.5 42.8 13.2 39.1 17.7 37.3 22.3 38L25.8 38.6 25.8 34.7C25.8 27.6 30.6 21.4 37.5 19.7 44.4 18 51.5 21.4 54.7 27.7L55.9 30.1 58.4 29.2C62.2 27.9 66.3 28.5 69.6 30.8 72.8 33.2 74.7 36.9 74.8 40.9L74.8 44 78.9 44C84 44.2 88 48.4 87.9 53.4 87.9 58.5 83.8 62.6 78.8 62.7L73.6 62.7 71 65.6 68.2 69 78.8 69C86.9 68.8 93.5 62.4 94 54.3 94.5 46.2 88.6 39.1 80.6 37.9Z"/></svg>

After

Width:  |  Height:  |  Size: 885 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ExclamationMark" overflow="hidden"><path d="M42.35 8 53.65 8 52.71 64.89 43.29 64.89 42.35 8Z"/><circle cx="48" cy="79" r="8"/></svg>

After

Width:  |  Height:  |  Size: 246 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_BarChart_LTR" overflow="hidden"><path d="M20 14 14 14 14 82 82 82 82 76 20 76Z"/><rect x="26" y="35" width="11" height="35"/><rect x="41" y="14" width="11" height="56"/><rect x="56" y="35" width="11" height="35"/><rect x="71" y="52" width="11" height="18"/></svg>

After

Width:  |  Height:  |  Size: 376 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_BarChart_RTL" overflow="hidden"><g><path d="M76 14 82 14 82 82 14 82 14 76 76 76Z"/><rect x="59" y="35" width="11" height="35"/><rect x="44" y="14" width="11" height="56"/><rect x="29" y="35" width="11" height="35"/><rect x="14" y="52" width="11" height="18"/></g></svg>

After

Width:  |  Height:  |  Size: 383 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_BarGraphDownwardTrend_LTR" overflow="hidden"><path d="M19 13 13 13 13 83 82 83 82 77 19 77 19 13Z"/><rect x="25" y="13" width="15" height="58"/><rect x="46" y="33" width="15" height="38"/><rect x="67" y="51" width="15" height="20"/><path d="M75.54 36.72 51.41 12.59 48.59 15.41 72.72 39.54 67.26 45 81 45 81 31.26 75.54 36.72Z"/></svg>

After

Width:  |  Height:  |  Size: 448 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_BarGraphDownwardTrend_RTL" overflow="hidden"><path d="M76 77 13 77 13 83 82 83 82 13 76 13 76 77Z"/><rect x="55" y="13" width="15" height="58"/><rect x="34" y="33" width="15" height="38"/><rect x="13" y="51" width="15" height="20"/><path d="M14 31.26 14 45 27.74 45 22.28 39.54 46.41 15.41 43.59 12.59 19.46 36.72 14 31.26Z"/></svg>

After

Width:  |  Height:  |  Size: 445 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Blockchain" overflow="hidden"><path d="M7 63.375 7 78.89 22.03 88 22.03 70.88 7 61.774 7 63.375Z"/><path d="M73.97 88 89 78.89 89 61.765 73.97 70.87 73.97 88Z"/><path d="M36.163 29.391C36.7008 29.1322 37.2902 28.9985 37.887 29 40.0961 28.9994 41.8875 30.7897 41.8881 32.9989 41.8886 34.5401 41.0035 35.9444 39.613 36.609L35.833 38.415 47.03 45.2 47.03 28.081 32 18.976 32 31.376Z"/><path d="M48.97 28.071 48.97 45.2 60.17 38.414 56.391 36.608C54.3984 35.6542 53.5562 33.2657 54.5099 31.2731 55.174 29.8856 56.5748 29.0019 58.113 29 58.7103 28.9991 59.3 29.1335 59.838 29.393L64 31.38 64 18.966Z"/><path d="M55.249 22.001 57.115 20.867 64 16.697 48 7 41.115 11.17 39.249 12.304 32 16.697 48 26.394 55.249 22.001Z"/><path d="M32.115 63.666 39 59.5 27 52.223 27 56.723C27 58.9321 25.2091 60.723 23 60.723 20.7909 60.723 19 58.9321 19 56.723L19 52.223 16.115 53.97 14.249 55.1 7 59.5 23 69.2 30.249 64.8Z"/><path d="M82.115 63.666 89 59.5 77 52.223 77 56.723C77 58.9321 75.2091 60.723 73 60.723 70.7909 60.723 69 58.9321 69 56.723L69 52.223 66.115 53.969 64.249 55.1 57 59.5 73 69.2 80.249 64.8Z"/><path d="M57 63.375 57 74.747 59.908 72.962C61.791 71.8063 64.2543 72.396 65.41 74.279 66.5657 76.162 65.976 78.6253 64.093 79.781L61.3 81.5 72.03 88 72.03 70.88 57 61.774Z"/><path d="M31.826 79.33C29.9808 78.1153 29.4697 75.6347 30.6844 73.7895 31.8861 71.9641 34.3305 71.4411 36.174 72.615L39 74.445 39 61.765 23.97 70.87 23.97 88 34.943 81.349Z"/><path d="M47.938 87C47.5523 87.0001 47.1748 86.8886 46.851 86.679L32.913 77.651C31.9762 77.0658 31.6911 75.832 32.2763 74.8952 32.8615 73.9584 34.0953 73.6733 35.0321 74.2585 35.0506 74.27 35.0689 74.2819 35.087 74.294L47.967 82.636 60.954 74.667C61.8956 74.0893 63.1273 74.3844 63.705 75.326 64.2827 76.2676 63.9876 77.4993 63.046 78.077L48.983 86.705C48.6685 86.8978 48.3069 86.9999 47.938 87Z"/><path d="M25 56.718 25 41.373 38.75 34.805C39.7469 34.3287 40.1688 33.1344 39.6925 32.1375 39.2162 31.1406 38.0219 30.7187 37.025 31.195L22.139 38.308C21.4435 38.6397 21.0005 39.3415 21 40.112L21 56.718C21 57.8226 21.8954 58.718 23 58.718L23 58.718C24.1046 58.718 25 57.8226 25 56.718Z"/><path d="M75 56.718 75 40.112C74.9982 39.3431 74.5558 38.6434 73.862 38.312L58.975 31.2C57.9781 30.7237 56.7838 31.1456 56.3075 32.1425 55.8312 33.1394 56.2531 34.3337 57.25 34.81L71 41.373 71 56.718C71 57.8226 71.8954 58.718 73 58.718 74.1046 58.718 75 57.8226 75 56.718Z"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_BrowserWindow" overflow="hidden"><path d="M8 17 8 79 88 79 88 17ZM77 23C78.1046 23 79 23.8954 79 25 79 26.1046 78.1046 27 77 27 75.8954 27 75 26.1046 75 25 75 23.8954 75.8954 23 77 23ZM70 23C71.1046 23 72 23.8954 72 25 72 26.1046 71.1046 27 70 27 68.8954 27 68 26.1046 68 25 68 23.8954 68.8954 23 70 23ZM63 23C64.1046 23 65 23.8954 65 25 65 26.1046 64.1046 27 63 27 61.8954 27 61 26.1046 61 25 61 23.8954 61.8954 23 63 23ZM82 73 14 73 14 33 82 33Z"/></svg>

After

Width:  |  Height:  |  Size: 569 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Paperclip" overflow="hidden"><path d="M48 90C37.5 90 29 81.5 29 71L29 20C29 12.3 35.3 6 43 6 50.7 6 57 12.3 57 20L57 67C57 72 53 76 48 76 43 76 39 72 39 67L39 43 45 43 45 67C45 68.7 46.3 70 48 70 49.7 70 51 68.7 51 67L51 20C51 15.6 47.4 12 43 12 38.6 12 35 15.6 35 20L35 71C35 78.2 40.8 84 48 84 55.2 84 61 78.2 61 71L61 50 67 50 67 71C67 81.5 58.5 90 48 90Z"/></svg>

After

Width:  |  Height:  |  Size: 480 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CarrotLeft" overflow="hidden"><path d="M59.947 76.191 31.697 47.935 59.947 19.684 64.19 23.926 40.181 47.935 64.191 71.949 59.947 76.191Z"/></svg>

After

Width:  |  Height:  |  Size: 259 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CarrotUp" overflow="hidden"><path d="M23.993 64.122 19.751 59.878 48.007 31.628 76.257 59.878 72.015 64.121 48.007 40.112 23.993 64.122Z"/></svg>

After

Width:  |  Height:  |  Size: 258 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CarrotRight" overflow="hidden"><path d="M36.06 76.187 31.817 71.945 55.825 47.937 31.816 23.922 36.059 19.68 64.31 47.937 36.06 76.187Z"/></svg>

After

Width:  |  Height:  |  Size: 257 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CarrotDown" overflow="hidden"><path d="M48.007 64.376 19.751 36.126 23.993 31.883 48.007 55.892 72.015 31.884 76.257 36.126 48.007 64.376Z"/></svg>

After

Width:  |  Height:  |  Size: 260 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Chat" overflow="hidden"><path d="M42 27 58 27 58 24C58 21.8 56.2 20 54 20L12 20C9.8 20 8 21.8 8 24L8 51C8 53.2 9.8 55 12 55L18 55 18 65 28 55 34 55 34 35C34 30.6 37.6 27 42 27Z"/><path d="M84 31 42 31C39.8 31 38 32.8 38 35L38 62C38 64.2 39.8 66 42 66L68 66 78 76 78 66 84 66C86.2 66 88 64.2 88 62L88 35C88 32.8 86.2 31 84 31Z"/></svg>

After

Width:  |  Height:  |  Size: 447 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ChatBubble_LTR" overflow="hidden"><path d="M78.6 17 17.4 17C15.5112 17.011 13.989 18.5511 14 20.4399 14 20.4399 14 20.44 14 20.44L14 61.78C13.9889 63.6688 15.5111 65.2089 17.3999 65.22 17.3999 65.22 17.4 65.22 17.4 65.22L54.8 65.22 68.4 79 68.4 65.22 78.6 65.22C80.4888 65.209 82.011 63.6689 82 61.7801 82 61.7801 82 61.78 82 61.78L82 20.44C82.0111 18.5512 80.4889 17.0111 78.6001 17 78.6001 17 78.6 17 78.6 17ZM32 46C29.2386 46 27 43.7614 27 41 27 38.2386 29.2386 36 32 36 34.7614 36 37 38.2386 37 41 37 43.7614 34.7614 46 32 46ZM48 46C45.2386 46 43 43.7614 43 41 43 38.2386 45.2386 36 48 36 50.7614 36 53 38.2386 53 41 53 43.7614 50.7614 46 48 46ZM64 46C61.2386 46 59 43.7614 59 41 59 38.2386 61.2386 36 64 36 66.7614 36 69 38.2386 69 41 69 43.7614 66.7614 46 64 46Z"/></svg>

After

Width:  |  Height:  |  Size: 890 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ChatBubble_RTL" overflow="hidden"><path d="M17.4 17C15.5112 17.011 13.989 18.5511 14 20.4399 14 20.4399 14 20.44 14 20.44L14 61.78 14 61.78C13.9889 63.6688 15.5111 65.2089 17.3999 65.22 17.3999 65.22 17.4 65.22 17.4 65.22L27.6 65.22 27.6 79 41.2 65.22 78.6 65.22C80.4888 65.209 82.011 63.6689 82 61.7801 82 61.7801 82 61.78 82 61.78L82 20.44 82 20.44C82.0111 18.5512 80.4889 17.0111 78.6001 17 78.6001 17 78.6 17 78.6 17ZM59 41C59 38.2386 61.2386 36 64 36 66.7614 36 69 38.2386 69 41 69 43.7614 66.7614 46 64 46 61.2386 46 59 43.7614 59 41ZM43 41C43 38.2386 45.2386 36 48 36 50.7614 36 53 38.2386 53 41 53 43.7614 50.7614 46 48 46 45.2386 46 43 43.7614 43 41ZM27 41C27 38.2386 29.2386 36 32 36 34.7614 36 37 38.2386 37 41 37 43.7614 34.7614 46 32 46 29.2386 46 27 43.7614 27 41Z"/></svg>

After

Width:  |  Height:  |  Size: 900 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Cloud" overflow="hidden"><g><path d="M78.2 47.9C77.9 47.9 77.5 47.9 77.2 47.9 77.2 47.9 77.2 47.9 77.2 47.9 77.2 43 74.8 38.5 70.9 35.7 66.9 32.9 61.8 32.2 57.2 33.8 53.4 26.4 45 22.6 37 24.5 29 26.4 23.2 33.6 23.2 41.9 23.2 41.9 23.2 42 23.2 42.1 17.7 41.2 12.2 43.5 8.8 47.9 5.5 52.4 4.9 58.3 7.2 63.3 9.6 68.3 14.6 71.6 20.1 71.9L20.1 72 78.1 72C84.7 72 90.1 66.6 90.1 60 90.1 53.4 84.8 47.9 78.2 47.9Z"/></g></svg>

After

Width:  |  Height:  |  Size: 531 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CloudComputing" overflow="hidden"><path d="M81.4 19.4C80.6 14.7 76.4 11.1 71.5 11.1 71 11.1 70.4 11.2 69.9 11.2 67.5 8.2 63.8 6.3 59.6 6.3 53.5 6.3 48.4 10.4 46.8 16 41.2 17.1 37 22 37 27.9 37 34.6 42.4 40 49 40L49 40C49 40 78.6 40 79 40 84.8 40 89.1 35.3 89.1 29.5 89.1 24.7 85.8 20.7 81.4 19.4ZM78.4 34 48.8 34C46.5 33.8 44.5 32.5 43.5 30.5 42.6 28.4 42.8 26 44.2 24.1 45.4 22.5 47.2 21.6 49.1 21.6 49.4 21.6 49.8 21.6 50.1 21.7L51.9 22 51.9 20C51.9 16.4 54.3 13.3 57.8 12.5 58.4 12.4 59 12.3 59.6 12.3 59.6 12.3 59.6 12.3 59.6 12.3L59.6 12.3C59.6 12.3 59.6 12.3 59.6 12.3 62.5 12.3 65.1 13.9 66.4 16.5L67 17.7 68.3 17.2C68.9 17 69.6 16.9 70.3 16.9 71.6 16.9 72.8 17.3 73.9 18 75.5 19.2 76.5 21.1 76.5 23.1L76.5 24.7 78.5 24.7C81.1 24.7 83.2 26.8 83.2 29.4 83.1 31.9 81 34 78.4 34Z"/><path d="M51.8 44 10.2 44C8.4 44 7 45.4 7 47.2L7 75.8C7 77.6 8.4 79 10.2 79 10.2 79 10.2 79 10.2 79L26 79 26 83 19 83 19 89 43 89 43 83 36 83 36 79 51.8 79C53.6 79 55 77.6 55 75.8L55 75.8 55 47.2C55 45.4 53.6 44 51.8 44ZM49 73 13 73 13 50 49 50 49 73Z"/><path d="M69.8 44C70.8 45.3 71.3 47 71.3 48.6 71.3 51.6 69.6 54.3 67 55.7L67 51.6 59.7 59 67 66.2 67 62.1C74.5 60.1 78.9 52.4 76.8 44.9 76.7 44.6 76.6 44.3 76.5 44L69.8 44Z"/><path d="M22.9 40C22.1 39 21.4 37 21.4 35.4 21.4 32.4 23.1 29.7 25.7 28.3L25.7 32.4 33 25 25.7 17.8 25.7 21.9C18.2 23.9 13.8 31.6 15.9 39.1 16 39.4 16.1 39.7 16.2 40L22.9 40Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Computer" overflow="hidden"><path d="M56 58 8 58 8 26 56 26 56 58ZM58 20 6 20C3.8 20 2 21.8 2 24L2 60C2 62.2 3.8 64 6 64L26 64 26 70 17 70 17 76 47 76 47 70 38 70 38 64 58 64C60.2 64 62 62.2 62 60L62 24C62 21.8 60.2 20 58 20Z"/><path d="M90 30 70 30 70 24 90 24 90 30ZM90 40 70 40 70 34 90 34 90 40ZM80 70C78.3 70 77 68.7 77 67 77 65.3 78.3 64 80 64 81.7 64 83 65.3 83 67 83 68.7 81.7 70 80 70ZM90 20 70 20C67.8 20 66 21.8 66 24L66 72C66 74.2 67.8 76 70 76L90 76C92.2 76 94 74.2 94 72L94 24C94 21.8 92.2 20 90 20Z"/></svg>

After

Width:  |  Height:  |  Size: 635 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Database" overflow="hidden"><g><ellipse cx="48" cy="18" rx="28" ry="8"/><path d="M68 38C66.8 38 66 37.2 66 36 66 34.8 66.8 34 68 34 69.2 34 70 34.8 70 36 70 37.2 69.2 38 68 38ZM48 30C32.6 30 20 26.4 20 22L20 38C20 42.4 32.6 46 48 46 63.4 46 76 42.4 76 38L76 22C76 26.4 63.4 30 48 30Z"/><path d="M68 58C66.8 58 66 57.2 66 56 66 54.8 66.8 54 68 54 69.2 54 70 54.8 70 56 70 57.2 69.2 58 68 58ZM48 50C32.6 50 20 46.4 20 42L20 58C20 62.4 32.6 66 48 66 63.4 66 76 62.4 76 58L76 42C76 46.4 63.4 50 48 50Z"/><path d="M68 78C66.8 78 66 77.2 66 76 66 74.8 66.8 74 68 74 69.2 74 70 74.8 70 76 70 77.2 69.2 78 68 78ZM48 70C32.6 70 20 66.4 20 62L20 78C20 82.4 32.6 86 48 86 63.4 86 76 82.4 76 78L76 62C76 66.4 63.4 70 48 70Z"/></g></svg>

After

Width:  |  Height:  |  Size: 837 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Email" overflow="hidden"><g><path d="M82 83.6 62 64.6 82 45.6 82 83.6ZM17.2 86 37 67.3 38.4 66C43.8 60.9 52.3 60.9 57.7 66L59.1 67.3 78.8 86 17.2 86ZM14 45.5 34 64.5 14 83.5 14 45.5ZM28 20 68 20 68 53.3 59 61.9C52.5 56.9 43.5 56.9 37 61.9L28 53.3 28 20ZM74 22.7 74 14 60 14 48 4 36 14 22 14 22 22.8 8 36.1 8 92 88 92 88 36.1 74 22.7Z"/><path d="M48 42.3C46.2 42.3 44.8 40.8 44.8 39.1 44.8 37.3 46.3 35.9 48 35.9 49.8 35.9 51.2 37.3 51.2 39.1 51.2 40.9 49.8 42.3 48 42.3ZM48 52C50.3 52 52.5 51.4 54.5 50.4 55.3 49.9 55.6 48.9 55.2 48.1 54.7 47.3 53.7 47 52.9 47.4 51.4 48.2 49.7 48.6 48 48.6 42.7 48.6 38.3 44.2 38.4 38.9 38.4 33.6 42.8 29.2 48.1 29.2 53.4 29.2 57.8 33.5 57.8 38.9L57.8 42.1C56 42.1 54.6 40.7 54.6 38.9 54.6 35.7 52.4 33 49.3 32.4 46.2 31.8 43.1 33.5 42 36.4 40.9 39.3 42 42.7 44.7 44.3 47.4 45.9 50.9 45.4 53 43 54.2 44.4 56 45.2 57.9 45.2 59.7 45.2 61.1 43.8 61.1 42L61.1 38.8C61.1 31.6 55.3 25.8 48.1 25.8 40.9 25.8 35.1 31.6 35.1 38.8 35 46.1 40.8 51.9 48 52Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CheckIn" overflow="hidden"><path d="M47.875 38C45.3897 38 43.375 35.9853 43.375 33.5 43.375 31.0147 45.3897 29 47.875 29 50.3603 29 52.375 31.0147 52.375 33.5 52.375 35.9853 50.3603 38 47.875 38ZM47.875 23C42.076 23.0019 37.3766 27.7045 37.3785 33.5035 37.379 34.8112 37.6236 36.1072 38.1 37.325L42.87 47.825 46.97 56.425C47.2107 56.9221 47.8088 57.1298 48.3059 56.8891 48.5084 56.791 48.6719 56.6275 48.77 56.425L52.87 47.825 57.64 37.325C59.7525 31.9245 57.087 25.834 51.6865 23.7215 50.4718 23.2463 49.1793 23.0017 47.875 23Z"/><path d="M70 2 26 2C23.7936 2.00659 22.0066 3.7936 22 6L22 90C22.0066 92.2064 23.7936 93.9934 26 94L70 94C72.2064 93.9934 73.9934 92.2064 74 90L74 6C73.9934 3.7936 72.2064 2.00659 70 2ZM44.5 6 51.5 6C52.3284 6 53 6.67157 53 7.5 53 8.32843 52.3284 9 51.5 9L44.5 9C43.6716 9 43 8.32843 43 7.5 43 6.67157 43.6716 6 44.5 6ZM70 83 26 83 26 13 70 13Z"/><rect x="33" y="62" width="30" height="3"/><rect x="33" y="69" width="30" height="3"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CycleWithPeople" overflow="hidden"><path d="M34.3 55 38.91 47C37.7107 46.4067 36.5749 45.6931 35.52 44.87L30.52 53.54C31.8368 53.8645 33.107 54.3551 34.3 55Z"/><path d="M53.21 72C53.0743 71.1735 53.0041 70.3376 53 69.5 53.0012 68.999 53.0279 68.4983 53.08 68L42.92 68C42.9721 68.4983 42.9988 68.999 43 69.5 42.9959 70.3376 42.9257 71.1735 42.79 72Z"/><path d="M61 55.41C62.1468 54.7052 63.3761 54.1444 64.66 53.74L59.53 44.85C58.4602 45.6829 57.3075 46.4034 56.09 47Z"/><path d="M26.5 57C19.5964 57 14 62.5964 14 69.5 14 76.4036 19.5964 82 26.5 82 33.4036 82 39 76.4036 39 69.5 39 62.5964 33.4036 57 26.5 57ZM26.5 61.87C28.4385 61.8645 30.0145 63.4315 30.02 65.37 30.0255 67.3085 28.4585 68.8845 26.52 68.89 24.5815 68.8955 23.0055 67.3285 23 65.39 23 65.3833 23 65.3767 23 65.37 23.0055 63.4393 24.5693 61.8755 26.5 61.87ZM33.5 75.93 19.5 75.93 19.5 73.26C19.5133 72.7124 19.7699 72.1992 20.2 71.86 21.2378 71.1146 22.3941 70.55 23.62 70.19 24.5598 69.9169 25.5315 69.769 26.51 69.75 27.4896 69.756 28.463 69.9042 29.4 70.19 30.6403 70.5121 31.8033 71.08 32.82 71.86 33.2501 72.1992 33.5067 72.7124 33.52 73.26Z"/><path d="M63 29.5C63 20.9396 56.0604 14 47.5 14 38.9396 14 32 20.9396 32 29.5 32 38.0604 38.9396 45 47.5 45 56.0604 45 63 38.0604 63 29.5ZM47.47 20C49.8724 20 51.82 21.9476 51.82 24.35 51.82 26.7524 49.8724 28.7 47.47 28.7 45.0676 28.7 43.12 26.7524 43.12 24.35 43.1255 21.9498 45.0698 20.0055 47.47 20ZM56.15 37.44 38.78 37.44 38.78 34.1C38.7928 33.4185 39.1124 32.7791 39.65 32.36 40.9313 31.4356 42.3622 30.7387 43.88 30.3 45.0469 29.9594 46.2545 29.7778 47.47 29.76 48.6835 29.762 49.8899 29.944 51.05 30.3 52.5856 30.6996 54.0268 31.3998 55.29 32.36 55.8216 32.7829 56.1368 33.4208 56.15 34.1Z"/><path d="M69.5 57C62.5964 57 57 62.5964 57 69.5 57 76.4036 62.5964 82 69.5 82 76.4036 82 82 76.4036 82 69.5 82 62.5964 76.4036 57 69.5 57ZM69.5 61.87C71.4385 61.8645 73.0145 63.4315 73.02 65.37 73.0255 67.3085 71.4585 68.8845 69.52 68.89 67.5815 68.8955 66.0055 67.3285 66 65.39 66 65.3833 66 65.3767 66 65.37 66.0055 63.4393 67.5693 61.8755 69.5 61.87ZM76.5 75.93 62.5 75.93 62.5 73.26C62.5133 72.7124 62.7699 72.1992 63.2 71.86 64.2378 71.1146 65.3941 70.55 66.62 70.19 67.5598 69.9169 68.5315 69.769 69.51 69.75 70.4896 69.756 71.463 69.9042 72.4 70.19 73.6403 70.5121 74.8033 71.08 75.82 71.86 76.2501 72.1992 76.5067 72.7124 76.52 73.26Z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_FlipCalendar" overflow="hidden"><g><path d="M29 26C30.7 26 32 24.7 32 23L32 17C32 15.3 30.7 14 29 14 27.3 14 26 15.3 26 17L26 23C26 24.7 27.3 26 29 26Z"/><path d="M20 44 76 44 76 76 20 76 20 44ZM14 82 82 82 82 38 14 38 14 82Z"/><path d="M67 26C68.7 26 70 24.7 70 23L70 17C70 15.3 68.7 14 67 14 65.3 14 64 15.3 64 17L64 23C64 24.7 65.3 26 67 26Z"/><path d="M74 20 74 23C74 26.9 70.9 30 67 30 63.1 30 60 26.9 60 23L60 20 36 20 36 23C36 26.9 32.9 30 29 30 25.1 30 22 26.9 22 23L22 20 14 20 14 34 82 34 82 20 74 20Z"/></g></svg>

After

Width:  |  Height:  |  Size: 637 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Flowchart" overflow="hidden"><rect x="31" y="16" width="34" height="14"/><circle cx="18" cy="75" r="6"/><circle cx="48" cy="75" r="6"/><circle cx="78" cy="75" r="6"/><path d="M54.5 48 50 43.5 50 34 46 34 46 43.5 41.5 48 16 48 16 66 20 66 20 52 41.5 52 46 56.5 46 66 50 66 50 56.5 54.5 52 76 52 76 66 80 66 80 48ZM48 55 43 50 48 45 53 50Z"/></svg>

After

Width:  |  Height:  |  Size: 459 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Follow" overflow="hidden"><circle cx="44" cy="27" r="16"/><path d="M50 71C50.0167 61.7134 56.7388 53.7973 65.9 52.276 63.0999 50.9351 60.1891 49.839 57.2 49 52.9217 47.6904 48.4742 47.0165 44 47 39.5307 47.0771 35.0916 47.7497 30.8 49 25.2073 50.6321 19.9323 53.2019 15.2 56.6 13.227 58.1451 12.0522 60.4946 12 63L12 79 51.79 79C50.6142 76.4968 50.0031 73.7656 50 71Z"/><path d="M69 56C60.7157 56 54 62.7157 54 71 54 79.2843 60.7157 86 69 86 77.2843 86 84 79.2843 84 71 84 62.7157 77.2843 56 69 56ZM76 72 70.5 72 70.5 77.5 67.5 77.5 67.5 72 62 72 62 69 67.5 69 67.5 63.5 70.5 63.5 70.5 69 76 69Z"/></svg>

After

Width:  |  Height:  |  Size: 717 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_QuestionMark1" overflow="hidden"><path d="M73.335 29.612C71.698 15.6242 59.0316 5.6119 45.0438 7.24889 32.2279 8.74875 22.552 19.5857 22.508 32.489L34.508 32.489C34.5077 25.0359 40.5494 18.9937 48.0024 18.9934 55.4555 18.9931 61.4977 25.0348 61.498 32.4879 61.4982 37.1349 59.1075 41.4551 55.17 43.923 47.0441 48.8948 42.0635 57.712 42 67.238L54 67.238C54.0765 61.841 56.9344 56.866 61.558 54.081 69.8821 48.8856 74.4673 39.3588 73.335 29.612Z"/><path d="M53.379 76.474 53.379 76.474C50.5194 73.6085 45.8784 73.6036 43.0128 76.4632 43.0092 76.4668 43.0056 76.4704 43.002 76.474 42.3314 77.1471 41.7975 77.9438 41.43 78.82 41.0474 79.7251 40.8525 80.6984 40.857 81.681 40.8515 82.6597 41.0472 83.6291 41.432 84.529 42.1798 86.2881 43.5849 87.6857 45.348 88.424 46.2529 88.8065 47.2256 89.0024 48.208 89 49.1866 89.0048 50.1559 88.8092 51.056 88.425 52.8066 87.6774 54.2009 86.2828 54.948 84.532 55.3326 83.632 55.5286 82.6627 55.524 81.684 55.5277 80.7014 55.3324 79.7282 54.95 78.823 54.5828 77.946 54.0493 77.1483 53.379 76.474Z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Payroll_RTL" overflow="hidden"><path d="M8 36.1 8 92 88 92 88 36.1 83 32.1 83 16 63 16 48 4 33 16 13 16 13 32.1 8 36.1ZM77 22 77 44.6 71.3 50 24.7 50 19 44.5 19 22 77 22ZM82 83.5 62 64.5 82 45.5 82 83.5ZM17.2 86 37 67.3 38.4 66C43.8 60.9 52.3 60.9 57.7 66L59.1 67.3 78.8 86 17.2 86ZM14 45.6 34 64.6 14 83.6 14 45.6Z"/><path d="M41.1 41.6C40.9 41.3 40.6 41.1 40.4 40.8 39.3 39.9 38 39.3 36.6 39.1 35.3 38.8 34.3 39.1 33.8 40 33.5 40.5 33.4 41.2 33.6 41.8 33.6 41.8 33.5 41.8 33.5 41.7 33.4 41.6 33.3 41.6 33.2 41.5 32.8 41.1 32.3 40.9 31.8 40.7 31 40.5 30.1 40.7 29.5 41.3L29.4 41.4C29.2 41.4 29 41.4 28.9 41.4L28.9 41.4C28.5 41.3 28 41.3 27.6 41.3L26.5 41.3C25.7 41.3 25 42 25 42.8 25 43.6 25.7 44.3 26.5 44.3L26.5 44.3C26.5 44.3 28.2 44.3 28.6 44.3 29.4 44.4 30.3 44.3 31 43.9 31.1 43.8 31.2 43.7 31.3 43.7 31.3 43.7 31.4 43.7 31.4 43.8 31.6 44 31.8 44.1 32 44.2 33 44.8 34.2 44.9 35.2 44.4 36.1 43.9 36.6 43.1 36.6 42.1 37.3 42.3 37.9 42.6 38.4 43 38.6 43.2 38.7 43.3 38.9 43.5 39.6 44.5 40.6 45.1 41.8 45.2 41.9 45.2 42 45.2 42.1 45.2 42.8 45.2 43.4 44.8 43.8 44.2L43.8 44.2C45.6 45 47.3 44.7 48.3 43.3 48.8 42.6 48.6 41.7 48 41.2 47.3 40.7 46.4 40.9 45.9 41.5 45.8 41.6 45.7 41.8 45 41.4 44 40.8 42.8 40.9 42 41.7 41.9 41.8 41.8 41.9 41.7 42 41.5 42 41.3 41.8 41.1 41.6Z"/><rect x="59" y="27.5" width="12" height="3"/><rect x="41" y="33.5" width="30" height="3"/><rect x="25" y="33.5" width="13" height="3"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_History1" overflow="hidden"><path d="M48 10C36.4374 9.98835 25.5014 15.2538 18.3 24.3L16.687 22.687 10 16 10 37 31 37 25.2 31.2 22.612 28.612C33.3568 14.6304 53.4014 12.0064 67.383 22.7512 81.3646 33.4959 83.9886 53.5406 73.2439 67.5222 62.4991 81.5038 42.4544 84.1278 28.4728 73.383 20.5902 67.3253 15.9791 57.9414 16 48L10 48C10 68.9868 27.0132 86 48 86 68.9868 86 86 68.9868 86 48 86 27.0132 68.9868 10 48 10Z"/><path d="M45 27 45 49.243 59.879 64.121 64.121 59.879 51 46.757 51 27 45 27Z"/></svg>

After

Width:  |  Height:  |  Size: 613 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_GrinningFace" overflow="hidden"><g><g><path d="M48 10C27 10 10 27 10 48 10 69 27 86 48 86 69 86 86 69 86 48 86 27 69 10 48 10ZM64 36C67.3 36 70 38.7 70 42 70 45.3 67.3 48 64 48 60.7 48 58 45.3 58 42 58 38.7 60.7 36 64 36ZM32 36C35.3 36 38 38.7 38 42 38 45.3 35.3 48 32 48 28.7 48 26 45.3 26 42 26 38.7 28.7 36 32 36ZM48 76C38.1 76 29.6 70.3 25.5 62L48 62 70.5 62C66.4 70.3 57.9 76 48 76Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 517 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Checkmark" overflow="hidden"><path d="M86.1 15.8 34.9 64.2 10.3 39 1.8 47.1 34.5 80.7 43.1 72.7 94.2 24.2Z"/></svg>

After

Width:  |  Height:  |  Size: 228 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Handshake" overflow="hidden"><path d="M44.9 72.4C44.4 72.4 43.8 72.3 43.4 71.9 42.6 71.2 42.5 69.9 43.2 69.1L47.1 64.6C47.8 63.8 49.1 63.7 49.9 64.4 50.7 65.1 50.8 66.4 50.1 67.2L46.2 71.7C45.9 72.1 45.4 72.3 44.9 72.4Z"/><path d="M38.8 70.1C38.1 70.2 37.5 70 36.9 69.5 35.9 68.6 35.8 67 36.7 66L41.3 60.7C42.2 59.7 43.8 59.6 44.8 60.5 45.8 61.4 45.9 63 45 64L40.4 69.3C40 69.8 39.4 70.1 38.8 70.1Z"/><path d="M32.5 66.4C31.7 66.5 30.9 66.2 30.3 65.7 29.1 64.6 28.9 62.7 30 61.5L34.6 56.2C35.7 55 37.6 54.8 38.8 55.9 40 57 40.2 58.9 39.1 60.1L34.5 65.4C34 66 33.2 66.4 32.5 66.4Z"/><path d="M25.2 62.7C24.4 62.8 23.6 62.5 23 62 21.8 60.9 21.6 59 22.7 57.8L28 51.8C29.1 50.6 31 50.4 32.2 51.5 33.4 52.6 33.6 54.5 32.5 55.7L27.2 61.7C26.6 62.3 25.9 62.6 25.2 62.7Z"/><path d="M4.6 40.7 12.3 45.4C13.2 46 14.5 45.7 15 44.7L24.3 29.3C24.9 28.4 24.6 27.1 23.6 26.6L16 21.9 4.6 40.7Z"/><path d="M69.4 53.8 53.3 40 52.2 39 45.3 46.9C44.3 48.1 42.9 48.8 41.3 48.9 41.1 48.9 40.9 48.9 40.8 48.9 39.3 48.9 37.9 48.4 36.9 47.4 34.4 45.2 34.2 41.4 36.3 38.9L42.2 32.1C37.6 31.5 31.7 33.9 25.6 30.9L16.9 45.3 23.7 53.2 26.3 50.2C27.2 49.1 28.6 48.5 30.1 48.5L30.1 48.5C31.3 48.5 32.5 48.9 33.4 49.7 34.5 50.6 35 51.9 35.1 53.3 35.6 53.1 36.2 53 36.8 53 38 53 39.2 53.4 40.1 54.2 41.2 55.2 41.8 56.5 41.8 57.9 42.2 57.8 42.7 57.7 43.1 57.7L43.1 57.7C44.2 57.7 45.2 58.1 46.1 58.8 47 59.6 47.5 60.7 47.6 61.9 47.9 61.8 48.3 61.7 48.7 61.7L48.7 61.7C49.7 61.7 50.6 62 51.3 62.7 52.1 63.4 52.6 64.4 52.7 65.4 52.8 66.5 52.4 67.5 51.7 68.3L48.3 72.2 49.7 73.3C50.4 73.7 51.2 74 52.1 73.9 54.3 73.7 55.9 71.8 55.7 69.6 55.7 69.6 55.7 69.5 55.7 69.5 56 69.6 56.4 69.6 56.7 69.6 58.9 69.4 60.5 67.5 60.3 65.3 60.3 65.3 60.3 65.2 60.3 65.2 60.6 65.3 61 65.3 61.3 65.3 63.5 65.1 65.1 63.2 64.9 61 64.9 60.8 64.8 60.6 64.8 60.4 65.4 60.7 66.1 60.9 66.9 60.8 69.1 60.6 70.7 58.7 70.5 56.5 70.6 55.4 70.1 54.5 69.4 53.8Z"/><path d="M91.4 40.7 83.7 45.4C82.8 46 81.5 45.7 81 44.7L71.7 29.3C71.1 28.4 71.4 27.1 72.4 26.6L80.1 21.9 91.4 40.7Z"/><path d="M70.5 31.3C62.2 34.3 56.2 31.4 49.5 30.1 49.4 30.1 49 30 49 30 47.8 29.9 46.5 30.3 45.6 31.3L37.7 40.3C36.2 42 36.4 44.5 38.1 45.9 39 46.6 40 47 41.1 46.9 42.1 46.8 43.1 46.4 43.8 45.5 43.8 45.5 52 36.1 52 36.1L70.7 52.2 70.7 52.2 70.7 52.2C71.2 52.7 71.4 52.9 71.8 53.5L79 45.2 70.5 31.3Z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Download" overflow="hidden"><path d="M68.5 44 56 44 56 16 40 16 40 44 27.5 44 48 68Z"/><path d="M73 56 73 74 23 74 23 56 17 56 17 80 79 80 79 56Z"/></svg>

After

Width:  |  Height:  |  Size: 267 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Help_LTR" overflow="hidden"><path d="M48 10C27 10 10 27 10 48 10 69 27 86 48 86 69 86 86 69 86 48 86 27 69 10 48 10ZM48 76C45.2 76 43 73.8 43 71 43 68.2 45.2 66 48 66 50.8 66 53 68.2 53 71 53 73.8 50.8 76 48 76ZM51 52.8C51 55.4 51 62 51 62L45 62 45 47 48 47C54.7 47 59 43.1 59 37 59 30.7 54.3 26 48 26 41.1 26 37 30.1 37 37L31 37C31 26.8 37.8 20 48 20 57.5 20 65 27.5 65 37 65 45.5 59.4 51.6 51 52.8Z"/></svg>

After

Width:  |  Height:  |  Size: 522 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Information" overflow="hidden"><path d="M48 10C27 10 10 27 10 48 10 69 27 86 48 86 69 86 86 69 86 48 86 27 69 10 48 10ZM46 20C48.8 20 51 22.2 51 25 51 27.8 48.8 30 46 30 43.2 30 41 27.8 41 25 41 22.2 43.2 20 46 20ZM58 76 38 76 38 70 45 70 45 40 39 40 39 34 51 34 51 40 51 70 58 70 58 76Z"/></svg>

After

Width:  |  Height:  |  Size: 409 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Clipboard1_LTR" overflow="hidden"><path d="M54.764 55.3C55.8901 56.3942 55.916 58.1941 54.8218 59.3202 54.8028 59.3397 54.7835 59.359 54.764 59.378L49.882 60.986 49.021 60.125 50.629 55.243C51.7949 54.138 53.629 54.1633 54.764 55.3ZM76.824 25.831 48.624 54.094 45 65.007 55.97 61.388 84.176 33.188Z"/><path d="M90.318 23.767 86.24 19.689C85.3564 18.7849 83.9072 18.7683 83.0031 19.6519 82.9906 19.6641 82.9782 19.6765 82.966 19.689L78.945 23.71 86.24 31 90.26 26.98C91.1619 26.1865 91.2497 24.8122 90.4563 23.9104 90.4124 23.8605 90.3663 23.8126 90.318 23.767Z"/><path d="M26 65 41.842 65 43.168 61 26 61 26 65Z"/><path d="M26 41 57.448 41 61.44 37 26 37 26 41Z"/><path d="M70 51.6 70 82 20 82 20 20 31 20 31 26 59 26 59 20 70 20 70 28.422 74.7 23.71 74.7 23.71 74.871 23.539 76 22.41 76 18C76 15.7909 74.2091 14 72 14L55 14 55 12C55 9.79086 53.2091 8 51 8L39 8C36.7909 8 35 9.79086 35 12L35 14 18 14C15.7909 14 14 15.7909 14 18L14 84C14 86.2091 15.7909 88 18 88L72 88C74.2091 88 76 86.2091 76 84L76 45.6ZM42.864 12.864C43.4291 12.2979 44.2002 11.986 45 12 46.6569 12 48 13.3431 48 15 48 16.6569 46.6569 18 45 18 43.3431 18 42 16.6569 42 15 41.986 14.2002 42.2979 13.4291 42.864 12.864Z"/><path d="M26 53 45.448 53 49.44 49 26 49 26 53Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ClipboardBadge_LTR" overflow="hidden"><path d="M73 82 23 82 23 20 34 20 34 26 62 26 62 20 73 20ZM48 12C49.6569 12 51 13.3431 51 15 51 16.6569 49.6569 18 48 18 46.3431 18 45 16.6569 45 15 44.9727 13.3704 46.2716 12.0273 47.9012 12 47.9341 11.9994 47.9671 11.9994 48 12ZM75 14 58 14 58 12C58 9.79086 56.2091 8 54 8L42 8C39.7909 8 38 9.79086 38 12L38 14 21 14C18.7909 14 17 15.7909 17 18L17 84C17 86.2091 18.7909 88 21 88L75 88C77.2091 88 79 86.2091 79 84L79 18C79 15.7909 77.2091 14 75 14Z"/><rect x="29" y="34" width="38" height="4"/><rect x="52" y="63" width="15" height="4"/><rect x="29" y="42" width="19" height="4"/><path d="M42.788 70.774C42.2955 70.9959 41.7612 71.1098 41.221 71.108 41.0019 71.1084 40.7832 71.0907 40.567 71.055 40.115 71.3386 39.6107 71.5287 39.084 71.614L43.074 78.808 44.737 76.089 48 76.633 44.158 69.733C43.784 70.1771 43.3161 70.5327 42.788 70.774Z"/><path d="M36.517 71.157C36.3254 71.1859 36.1318 71.2003 35.938 71.2 35.4468 71.2 34.9599 71.1088 34.502 70.931 33.7962 70.6623 33.1847 70.1926 32.743 69.58 32.706 69.573 32.671 69.558 32.634 69.549L29 76.7 32.231 75.964 33.862 79 37.662 71.584C37.2602 71.5029 36.8738 71.3588 36.517 71.157Z"/><path d="M38.308 66.4C35.2517 66.4 32.774 63.9223 32.774 60.866 32.774 57.8097 35.2517 55.332 38.308 55.332 41.3643 55.332 43.842 57.8097 43.842 60.866 43.842 60.8663 43.842 60.8667 43.842 60.867 43.8409 63.9227 41.3637 66.3995 38.308 66.4ZM47.744 60.867C47.7483 60.1889 47.47 59.5396 46.976 59.075 47.248 58.4531 47.248 57.7459 46.976 57.124 46.7361 56.5635 46.2895 56.1169 45.729 55.877 45.7014 55.2755 45.4521 54.7055 45.029 54.277 44.5508 53.7915 43.8862 53.5363 43.206 53.577 42.9688 52.9391 42.4652 52.4363 41.827 52.2 41.2617 51.9759 40.6323 51.9759 40.067 52.2 39.6196 51.7949 39.0395 51.5676 38.436 51.561 37.7583 51.5563 37.1092 51.8342 36.645 52.328 36.0231 52.056 35.3159 52.056 34.694 52.328 34.1333 52.5685 33.6865 53.0153 33.446 53.576 32.8445 53.6037 32.2745 53.853 31.846 54.276 31.3601 54.7543 31.1049 55.4194 31.146 56.1 30.5094 56.3364 30.0074 56.8384 29.771 57.475 29.547 58.0399 29.547 58.6691 29.771 59.234 29.3657 59.6817 29.1381 60.2621 29.131 60.866 29.1269 61.5438 29.4052 62.1927 29.899 62.657 29.6269 63.2789 29.6269 63.9861 29.899 64.608 30.1392 65.1686 30.5856 65.6154 31.146 65.856 31.1736 66.4575 31.4229 67.0275 31.846 67.456 32.3239 67.9418 32.9887 68.1971 33.669 68.156 33.9059 68.7922 34.4078 69.294 35.044 69.531 35.6093 69.7551 36.2387 69.7551 36.804 69.531 37.2513 69.9362 37.8314 70.1639 38.435 70.171 39.1128 70.1753 39.7618 69.897 40.226 69.403 40.8479 69.675 41.5551 69.675 42.177 69.403 42.7374 69.1626 43.1841 68.7162 43.425 68.156 44.0266 68.1286 44.5966 67.8792 45.025 67.456 45.5107 66.978 45.7659 66.3133 45.725 65.633 46.3623 65.3955 46.8644 64.892 47.1 64.254 47.324 63.6891 47.324 63.0599 47.1 62.495 47.5117 62.0514 47.7416 61.4692 47.744 60.864Z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ClipboardAllCrosses_LTR" overflow="hidden"><path d="M73 82 23 82 23 20 34 20 34 26 62 26 62 20 73 20ZM48 12C49.6569 12 51 13.3431 51 15 51 16.6569 49.6569 18 48 18 46.3431 18 45 16.6569 45 15 44.9721 13.371 46.2701 12.0279 47.8991 12 47.9328 11.9994 47.9664 11.9994 48 12ZM75 14 58 14 58 12C58 9.79086 56.2091 8 54 8L42 8C39.7909 8 38 9.79086 38 12L38 14 21 14C18.7909 14 17 15.7909 17 18L17 84C17 86.2091 18.7909 88 21 88L75 88C77.2091 88 79 86.2091 79 84L79 18C79 15.7909 77.2091 14 75 14Z"/><path d="M41.06 57.061 38.939 54.939 36 57.879 33.06 54.939 30.939 57.061 33.879 60 30.939 62.939 33.06 65.061 36 62.121 38.939 65.061 41.06 62.939 38.121 60 41.06 57.061Z"/><path d="M38.939 66.939 36 69.879 33.06 66.939 30.939 69.061 33.879 72 30.939 74.939 33.06 77.061 36 74.121 38.939 77.061 41.06 74.939 38.121 72 41.06 69.061 38.939 66.939Z"/><rect x="50" y="58" width="17" height="4"/><rect x="50" y="70" width="17" height="4"/><path d="M41.06 33.121 38.939 31 36 33.939 33.06 31 30.939 33.121 33.879 36.061 30.939 39 33.06 41.121 36 38.182 38.939 41.121 41.06 39 38.121 36.061 41.06 33.121Z"/><path d="M38.939 43 36 45.939 33.06 43 30.939 45.121 33.879 48.061 30.939 51 33.06 53.121 36 50.182 38.939 53.121 41.06 51 38.121 48.061 41.06 45.121 38.939 43Z"/><rect x="50" y="34.061" width="17" height="4"/><rect x="50" y="46.061" width="17" height="4"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CommentDislike" overflow="hidden"><path d="M78.6 17.005 17.4 17.005C15.5304 17.0245 14.0195 18.5354 14 20.405L14 61.717C13.9845 63.5792 15.4815 65.1015 17.3438 65.117 17.3625 65.1171 17.3813 65.1171 17.4 65.117L54.8 65.117 68.4 79.017 68.4 65.217 78.6 65.217C80.4696 65.1975 81.9805 63.6866 82 61.817L82 20.506C82.0239 18.6019 80.504 17.0368 78.6 17.005ZM40.716 45.746C40.7138 46.527 40.081 47.1594 39.3 47.161L34 47.161 34 32.31 39.3 32.31C40.0802 32.3127 40.7118 32.9448 40.714 33.725ZM60.159 46.1 53.442 46.1C52.8743 46.1103 52.4113 46.558 52.382 47.125 53.1594 49.289 53.5191 51.5809 53.442 53.879 53.442 55.0504 52.4924 56 51.321 56 50.1496 56 49.2 55.0504 49.2 53.879 49.2 48.504 42.943 45.463 42.837 45.393L42.837 34.078C45.347 34.078 45.524 31.25 50.261 31.25L56.624 31.25C57.794 31.2533 58.7417 32.201 58.745 33.371 58.7534 33.8991 58.5495 34.4085 58.179 34.785L58.391 34.785C59.5612 34.7888 60.5087 35.7368 60.512 36.907 60.5179 37.4622 60.3019 37.9967 59.912 38.392 61.0508 38.6394 61.7734 39.763 61.526 40.9018 61.4345 41.3232 61.216 41.7065 60.9 42 61.7354 42.2977 62.2894 43.0932 62.279 43.98 62.2746 45.149 61.328 46.0956 60.159 46.1Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CommentHeart" overflow="hidden"><path d="M78.6 17.005 17.4 17.005C15.5304 17.0245 14.0195 18.5354 14 20.405L14 61.717C13.9845 63.5792 15.4815 65.1015 17.3438 65.117 17.3625 65.1171 17.3813 65.1171 17.4 65.117L54.8 65.117 68.4 79.017 68.4 65.217 78.6 65.217C80.4696 65.1975 81.9805 63.6866 82 61.817L82 20.506C82.0239 18.6019 80.504 17.0368 78.6 17.005ZM48 54C48 54 34.81 43.912 34.81 35.763 34.81 30.331 43.11 24.511 48 34.211 52.888 24.511 61.189 30.331 61.189 35.763 61.189 43.912 48 54 48 54Z"/></svg>

After

Width:  |  Height:  |  Size: 617 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CommentLike" overflow="hidden"><path d="M78.6 17.005 17.4 17.005C15.5304 17.0245 14.0195 18.5354 14 20.405L14 61.717C13.9845 63.5792 15.4815 65.1015 17.3438 65.117 17.3625 65.1171 17.3813 65.1171 17.4 65.117L54.8 65.117 68.4 79.017 68.4 65.217 78.6 65.217C80.4696 65.1975 81.9805 63.6866 82 61.817L82 20.506C82.0239 18.6019 80.504 17.0368 78.6 17.005ZM40.716 48.525C40.7138 49.3058 40.0808 49.9379 39.3 49.939L34 49.939 34 35.089 39.3 35.089C40.0796 35.0901 40.7122 35.7204 40.716 36.5ZM61.573 41.807C61.5653 42.7947 60.8756 43.6457 59.911 43.858 60.3009 44.2533 60.5169 44.7878 60.511 45.343 60.5077 46.513 59.56 47.4607 58.39 47.464L58.178 47.464C58.5484 47.841 58.7522 48.3506 58.744 48.879 58.7402 50.0484 57.7934 50.9956 56.624 51L50.261 51C45.524 51 45.347 48.171 42.837 48.171L42.837 36.857C42.943 36.786 49.2 33.745 49.2 28.371 49.2 27.1996 50.1496 26.25 51.321 26.25 52.4924 26.25 53.442 27.1996 53.442 28.371 53.5193 30.6688 53.1596 32.9604 52.382 35.124 52.4108 35.6914 52.8739 36.1397 53.442 36.15L60.159 36.15C61.329 36.1533 62.2767 37.101 62.28 38.271 62.2908 39.1579 61.7366 39.9536 60.901 40.251 61.3324 40.6531 61.5761 41.2173 61.573 41.807Z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_CommentImportant" overflow="hidden"><path d="M78.565 16.991 17.4 16.991C15.5299 17.0094 14.0184 18.5209 14 20.391L14 61.666C13.9834 63.5271 15.4786 65.0494 17.3397 65.066 17.3598 65.0662 17.3799 65.0662 17.4 65.066L54.78 65.066 68.37 78.957 68.37 65.164 78.565 65.164C80.4351 65.1456 81.9466 63.6341 81.965 61.764L81.965 20.489C81.9884 18.5856 80.4683 17.0217 78.565 16.991ZM45.8 25 50.208 25 50.208 45.712 45.8 45.712ZM48 56C45.9709 56.0006 44.3256 54.3561 44.325 52.327 44.3244 50.2979 45.9689 48.6526 47.998 48.652 50.0271 48.6514 51.6724 50.2959 51.673 52.325 51.673 52.3253 51.673 52.3257 51.673 52.326 51.6924 54.3357 50.0789 55.9805 48.0693 55.9999 48.0488 56.0001 48.0284 56.0001 48.008 56Z"/></svg>

After

Width:  |  Height:  |  Size: 820 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_HappyFace" overflow="hidden"><g><g><path d="M48 10C27 10 10 27 10 48 10 69 27 86 48 86 69 86 86 69 86 48 86 27 69 10 48 10ZM26 42C26 38.7 28.7 36 32 36 35.3 36 38 38.7 38 42 38 45.3 35.3 48 32 48 28.7 48 26 45.3 26 42ZM67.8 64.2C63.2 70.2 56.1 74 48 74 39.9 74 32.8 70.2 28.2 64.2 28 63.9 27.8 63.5 27.8 63 27.8 61.9 28.7 61 29.8 61 30.5 61 31.1 61.3 31.4 61.8 35.2 66.8 41.2 69.9 48 69.9 54.8 69.9 60.7 66.8 64.6 61.8 65 61.3 65.6 61 66.2 61 67.3 61 68.2 61.9 68.2 63 68.2 63.5 68 63.9 67.8 64.2ZM64 48C60.7 48 58 45.3 58 42 58 38.7 60.7 36 64 36 67.3 36 70 38.7 70 42 70 45.3 67.3 48 64 48Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 722 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_List_LTR" overflow="hidden"><path d="M23 14 73 14 73 82 23 82 23 14ZM17 88 79 88 79 8 17 8 17 88Z"/><rect x="30" y="20" width="8" height="8"/><rect x="46" y="22" width="20" height="4"/><rect x="30" y="36" width="8" height="8"/><rect x="46" y="38" width="20" height="4"/><rect x="30" y="52" width="8" height="8"/><rect x="46" y="54" width="20" height="4"/><rect x="30" y="68" width="8" height="8"/><rect x="46" y="70" width="20" height="4"/></svg>

After

Width:  |  Height:  |  Size: 559 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_MagnifyingGlass" overflow="hidden"><path d="M85.5 75.6 73 63.1C71.3 61.4 69 60.8 66.8 61.2L62.4 56.8C66.3 51.8 68.6 45.4 68.6 38.6 68.6 22.1 55.1 8.6 38.6 8.6 22.1 8.6 8.6 22.1 8.6 38.6 8.6 55.1 22.1 68.6 38.6 68.6 45.4 68.6 51.7 66.3 56.8 62.4L61.2 66.8C60.8 69 61.4 71.3 63.1 73L75.6 85.5C77 86.9 78.8 87.6 80.6 87.6 82.4 87.6 84.2 86.9 85.6 85.5 88.2 82.7 88.2 78.3 85.5 75.6ZM38.5 62.5C25.3 62.5 14.5 51.7 14.5 38.5 14.5 25.3 25.3 14.5 38.5 14.5 51.7 14.5 62.5 25.3 62.5 38.5 62.5 51.7 51.7 62.5 38.5 62.5Z"/></svg>

After

Width:  |  Height:  |  Size: 632 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Management" overflow="hidden"><path d="M23 54 46 54 46 61 50 61 50 54 73 54 73 61 77 61 77 50 50 50 50 43 46 43 46 50 19 50 19 61 23 61 23 54Z"/><path d="M75 65C69.4771 65 65 69.4771 65 75 65 80.5229 69.4771 85 75 85 80.5229 85 85 80.5229 85 75 85 69.4771 80.5229 65 75 65ZM75 68.319C76.5806 68.3185 77.8624 69.5994 77.863 71.18 77.8635 72.7606 76.5826 74.0424 75.002 74.043 73.4214 74.0435 72.1395 72.7626 72.139 71.182 72.139 71.1813 72.139 71.1807 72.139 71.18 72.139 69.5999 73.4199 68.319 75 68.319ZM80.723 80.059 69.277 80.059 69.277 77.666C69.2793 77.2159 69.4911 76.7926 69.85 76.521 70.6963 75.9126 71.6445 75.4605 72.65 75.186 73.4085 74.9363 74.2015 74.8078 75 74.805 75.7976 74.8283 76.5888 74.9564 77.353 75.186 78.3729 75.4202 79.3289 75.876 80.153 76.521 80.5228 76.7834 80.7377 77.2127 80.726 77.666Z"/><path d="M48 65C42.4772 65 38 69.4771 38 75 38 80.5229 42.4772 85 48 85 53.5228 85 58 80.5229 58 75 58 69.4771 53.5228 65 48 65ZM48 68.319C49.5806 68.3185 50.8624 69.5994 50.863 71.18 50.8636 72.7606 49.5826 74.0424 48.002 74.043 46.4214 74.0435 45.1396 72.7626 45.139 71.182 45.139 71.1813 45.139 71.1807 45.139 71.18 45.139 69.5999 46.4199 68.319 48 68.319ZM53.723 80.059 42.277 80.059 42.277 77.666C42.2793 77.2159 42.4911 76.7926 42.85 76.521 43.6963 75.9126 44.6445 75.4605 45.65 75.186 46.4085 74.9363 47.2015 74.8078 48 74.805 48.7976 74.8283 49.5888 74.9564 50.353 75.186 51.373 75.4202 52.3289 75.876 53.153 76.521 53.5228 76.7834 53.7377 77.2127 53.726 77.666Z"/><path d="M21 65C15.4772 65 11 69.4771 11 75 11 80.5229 15.4772 85 21 85 26.5228 85 31 80.5229 31 75 31 69.4771 26.5228 65 21 65ZM21 68.319C22.5806 68.3185 23.8624 69.5994 23.863 71.18 23.8636 72.7606 22.5826 74.0424 21.002 74.043 19.4214 74.0435 18.1396 72.7626 18.139 71.182 18.139 71.1813 18.139 71.1807 18.139 71.18 18.139 69.5999 19.4199 68.319 21 68.319ZM26.723 80.059 15.277 80.059 15.277 77.666C15.2793 77.2159 15.4911 76.7926 15.85 76.521 16.6963 75.9126 17.6445 75.4605 18.65 75.186 19.4085 74.9363 20.2015 74.8078 21 74.805 21.7976 74.8283 22.5888 74.9564 23.353 75.186 24.373 75.4202 25.3289 75.876 26.153 76.521 26.5228 76.7834 26.7377 77.2127 26.726 77.666Z"/><path d="M48 39C55.732 39 62 32.732 62 25 62 17.268 55.732 11 48 11 40.268 11 34 17.268 34 25 34 32.732 40.268 39 48 39ZM48 15.646C50.2125 15.646 52.006 17.4395 52.006 19.652 52.006 21.8645 50.2125 23.658 48 23.658 45.7875 23.658 43.994 21.8645 43.994 19.652 43.9946 17.4398 45.7878 15.6466 48 15.646ZM39.988 28.732C39.9914 28.1033 40.2871 27.512 40.788 27.132 41.9721 26.281 43.2986 25.6481 44.705 25.263 45.7682 24.9119 46.8803 24.731 48 24.727 49.1166 24.76 50.2241 24.9395 51.294 25.261 52.7207 25.59 54.0578 26.228 55.211 27.13 55.7278 27.4966 56.0278 28.0966 56.011 28.73L56.011 32.336 39.988 32.336Z"/></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Marker" overflow="hidden"><g><path d="M48 44C43 44 39 40 39 35 39 30 43 26 48 26 53 26 57 30 57 35 57 40 53 44 48 44ZM48 14C41.1 14 34.6 17.4 30.7 23.2 26.8 28.9 26 36.2 28.5 42.7L38 63.7 46.2 80.9C46.5 81.6 47.2 82 48 82 48.8 82 49.5 81.6 49.8 80.9L58 63.7 67.5 42.7C70 36.2 69.2 28.9 65.3 23.2 61.4 17.4 54.9 14 48 14Z"/></g></svg>

After

Width:  |  Height:  |  Size: 446 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Maximize" overflow="hidden"><path d="M88 5 68.2 5C66.5431 5 65.2 6.34315 65.2 8 65.2 9.65685 66.5431 11 68.2 11L80.76 11 11 80.76 11 68.2C11 66.5431 9.65685 65.2 8 65.2 6.34315 65.2 5 66.5431 5 68.2L5 88C5 89.6569 6.34315 91 8 91L27.8 91C29.4569 91 30.8 89.6569 30.8 88 30.8 86.3431 29.4569 85 27.8 85L15.24 85 85 15.24 85 27.8C85 29.4569 86.3431 30.8 88 30.8 89.6569 30.8 91 29.4569 91 27.8L91 8C91 6.34315 89.6569 5 88 5Z"/></svg>

After

Width:  |  Height:  |  Size: 545 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Forbidden" overflow="hidden"><path d="M20 52 20 44 76 44 76 52 20 52ZM48 10C27 10 10 27 10 48 10 69 27 86 48 86 69 86 86 69 86 48 86 27 69 10 48 10Z"/></svg>

After

Width:  |  Height:  |  Size: 270 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Folder" overflow="hidden"><path d="M81 76 15 76C12.8 76 11 74.2 11 72L11 24C11 21.8 12.8 20 15 20L33.8 20C34.6 20 35.4 20.2 36 20.7L47 28 81 28C83.2 28 85 29.8 85 32L85 72C85 74.2 83.2 76 81 76Z"/></svg>

After

Width:  |  Height:  |  Size: 316 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_FolderSearch" overflow="hidden"><path d="M31.885 32.811 74.455 32.811 74.455 28.167C74.455 26.2892 72.9328 24.767 71.055 24.767L45.577 24.767 36.234 18.567C35.6753 18.2053 35.03 17.9998 34.365 17.972L18.4 17.972C16.5222 17.972 15 19.4942 15 21.372L15 63.766 15.034 63.766 26.284 36.435C27.2891 34.2421 29.4728 32.8292 31.885 32.811Z"/><path d="M56.959 50.947C62.3832 45.5255 70.7671 44.4101 77.42 48.225L80.91 40.725C81.1382 40.2507 81.2546 39.7303 81.25 39.204 81.2598 37.4579 79.9453 35.9883 78.209 35.804L31.9 35.804C30.6561 35.8124 29.5298 36.5409 29.012 37.672L17.548 65.538 52.19 65.538C51.367 60.1925 53.1378 54.7745 56.959 50.947Z"/><path d="M63.323 57.311C61.171 59.4655 60.4301 62.6555 61.412 65.538L69.359 65.538 73.595 56.438C70.4156 54.1892 66.0789 54.5565 63.323 57.308Z"/><path d="M78.879 53.068C73.418 47.5991 64.5574 47.5926 59.0885 53.0537 54.0827 58.0522 53.5945 66.0004 57.951 71.574L55.758 73.767C54.5559 73.4414 53.2715 73.7823 52.389 74.661L46.025 81.025C44.6581 82.3919 44.6581 84.6081 46.025 85.975 47.3919 87.3419 49.6081 87.3419 50.975 85.975L57.339 79.611C58.2177 78.7285 58.5586 77.4441 58.233 76.242L60.433 74.042C66.5434 78.7734 75.3325 77.6555 80.0639 71.5451 84.3826 65.9678 83.8747 58.048 78.879 53.068ZM76.758 70.746C72.4623 75.0419 65.4975 75.042 61.2017 70.7464 56.9058 66.4507 56.9056 59.4859 61.2013 55.19 65.497 50.8941 72.4618 50.894 76.7577 55.1897 76.7578 55.1898 76.7579 55.1899 76.758 55.19 81.0469 59.4885 81.0469 66.4475 76.758 70.746Z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Paper" overflow="hidden"><path d="M23 82 23 14 51 14 51 35 73 35 73 82 23 82ZM57 16.5 69.5 29 57 29 57 16.5ZM57 8 17 8 17 88 79 88 79 30 57 8Z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ArrowCircle" overflow="hidden"><path d="M45.22 72.81C32.676 70.7444 23.4835 59.8829 23.52 47.17 23.5389 45.5954 23.6995 44.0258 24 42.48L24.08 42.48 25.91 45.65C26.4623 46.6082 27.6868 46.9373 28.645 46.385 29.6032 45.8327 29.9323 44.6082 29.38 43.65L25.13 36.3C24.8654 35.8423 24.4304 35.5079 23.92 35.37 23.4069 35.2321 22.86 35.3041 22.4 35.57L15 39.84C14.0213 40.352 13.6429 41.5605 14.1549 42.5392 14.6669 43.518 15.8754 43.8963 16.8541 43.3843 16.9039 43.3583 16.9526 43.3302 17 43.3L20.06 41.53C19.7041 43.389 19.5233 45.2773 19.52 47.17 19.4746 61.8256 30.0618 74.3524 44.52 76.75L44.86 76.75C45.9646 76.8384 46.9316 76.0146 47.02 74.91 47.1084 73.8054 46.2846 72.8384 45.18 72.75Z"/><path d="M79.52 47.17C79.5241 43.5966 78.8909 40.0511 77.65 36.7 77.2634 35.6645 76.1105 35.1384 75.075 35.525 74.0395 35.9116 73.5134 37.0645 73.9 38.1 78.9073 51.558 72.0567 66.5272 58.5986 71.5345 58.5026 71.5703 58.4064 71.6054 58.31 71.64L58.31 71.64 60.13 68.46C60.6823 67.499 60.351 66.2723 59.39 65.72 58.429 65.1677 57.2023 65.499 56.65 66.46L52.45 73.83C51.9005 74.7882 52.2317 76.0104 53.1899 76.5599 53.1899 76.56 53.19 76.56 53.19 76.56L60.56 80.77C61.521 81.3223 62.7477 80.991 63.3 80.03 63.8523 79.069 63.521 77.8423 62.56 77.29L59.44 75.52C71.5057 71.3344 79.5755 59.9409 79.52 47.17Z"/><path d="M62.52 27.14C61.4154 27.14 60.52 28.0354 60.52 29.14 60.52 30.2446 61.4154 31.14 62.52 31.14L70.74 31.14C70.8166 31.1449 70.8934 31.1449 70.97 31.14 71.3549 31.1401 71.731 31.0252 72.05 30.81L72.19 30.72 72.25 30.67 72.25 30.67 72.38 30.57C72.7715 30.1968 72.9952 29.6809 73 29.14L73 20.66C73 19.5554 72.1046 18.66 71 18.66 69.8954 18.66 69 19.5554 69 20.66L69 24.31 69 24.31C56.389 13.5639 37.4543 15.0757 26.7082 27.6867 26.6619 27.7409 26.6159 27.7954 26.57 27.85 25.8576 28.695 25.965 29.9576 26.81 30.67 27.655 31.3824 28.9176 31.275 29.63 30.43 38.8139 19.4911 55.1023 18.0088 66.11 27.11Z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_LineStraight" overflow="hidden"><path d="M89 45 14.2 45 23.1 36.1C24.3 34.9 24.3 33 23.1 31.9 21.9 30.7 20 30.7 18.9 31.9L4.9 45.9C3.7 47.1 3.7 49 4.9 50.1L18.9 64.1C19.5 64.7 20.3 65 21 65 21.7 65 22.5 64.7 23.1 64.1 24.3 62.9 24.3 61 23.1 59.9L14.2 51 89 51C90.7 51 92 49.7 92 48 92 46.3 90.7 45 89 45Z"/></svg>

After

Width:  |  Height:  |  Size: 426 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_LineCurveCounterclockwise" overflow="hidden"><path d="M40.8 10.1 54 10.2C55.7 10.2 57 8.9 57 7.2 57 5.5 55.7 4.2 54 4.2L34 4C33.3 4 32.7 4.2 32.1 4.7 32 4.7 32 4.8 31.9 4.9 31.8 5 31.7 5 31.6 5.2 31.6 5.2 31.5 5.3 31.5 5.4 31.5 5.4 31.4 5.5 31.4 5.6 31.1 6 31 6.5 31 7L30.8 27C30.8 28.7 32.1 30 33.8 30 35.5 30 36.8 28.7 36.8 27L36.9 14.6C52.6 25.5 60.1 40.8 59.1 60.1 58.5 69.6 56.2 78.9 52.2 87.6 51.5 89.1 52.1 90.8 53.6 91.5 55 92.2 56.8 91.7 57.6 90.2 61.9 80.9 64.5 70.8 65.1 60.5 65.9 45.8 62.3 25.2 40.8 10.1Z"/></svg>

After

Width:  |  Height:  |  Size: 639 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_LineCurveClockwise" overflow="hidden"><path d="M31.4 18.2 22 27.3C20.8 28.5 18.9 28.4 17.8 27.3 16.6 26.1 16.7 24.2 17.8 23.1L32.1 9.1C32.6 8.6 33.2 8.3 33.9 8.3 34 8.3 34.1 8.3 34.2 8.3 34.3 8.3 34.4 8.3 34.6 8.3L34.8 8.3 35 8.3C35.5 8.4 36 8.7 36.3 9.1L50.3 23.4C51.5 24.6 51.4 26.5 50.3 27.6 49.1 28.8 47.2 28.7 46.1 27.6L37.5 18.8C33.8 37.6 39 53.8 53.1 66.9 60.1 73.3 68.2 78.4 77.1 81.9 78.7 82.5 79.5 84.2 78.9 85.7 78.3 87.3 76.6 88.1 75.1 87.5 65.5 83.8 56.7 78.3 49.1 71.3 38.2 61.3 26.5 44 31.4 18.2Z"/></svg>

After

Width:  |  Height:  |  Size: 633 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_LineRotateLeft" overflow="hidden"><path d="M55 15.1C35 15.1 18.5 30.9 17.5 50.9L8.6 42C7.4 40.9 5.6 40.9 4.4 42.1 3.3 43.2 3.2 45.1 4.3 46.3L18.4 60.4C18.7 60.7 19 60.9 19.4 61 19.5 61 19.6 61.1 19.8 61.1L20 61.2 20.3 61.2 20.6 61.2 20.8 61.2C21.5 61.2 22.2 60.8 22.7 60.3L36.8 46.2C38 45 38 43.1 36.8 42 35.6 40.8 33.7 40.8 32.6 42L23.5 51.1C24.2 36.9 34.3 25 48.2 21.9 62.1 18.8 76.3 25.4 82.9 38 89.5 50.6 86.9 66 76.5 75.7 75.3 76.8 75.2 78.7 76.4 79.9 77.5 81.1 79.4 81.2 80.6 80.1 91.9 69.6 95.6 53.3 89.9 38.9 84.3 24.5 70.4 15.1 55 15.1Z"/></svg>

After

Width:  |  Height:  |  Size: 667 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_LineRotateRight" overflow="hidden"><path d="M91.5 42.1C90.4 41 88.5 40.9 87.3 42L78.4 50.9C77.5 30.9 61 15.1 41 15.1 25.6 15.1 11.7 24.5 6.1 38.9 0.5 53.2 4.2 69.6 15.4 80.1 16.6 81.2 18.5 81.2 19.6 79.9 20.7 78.7 20.7 76.8 19.5 75.7 9.1 66 6.5 50.5 13.1 38 19.7 25.4 34 18.8 47.8 21.9 61.7 25 71.8 37 72.4 51.2L63.3 42C62.1 40.8 60.2 40.8 59.1 42 58 43.2 57.9 45.1 59.1 46.2L73.2 60.3C73.7 60.8 74.4 61.1 75.1 61.2L75.3 61.2 75.6 61.2 75.9 61.2 76.1 61.1C76.2 61.1 76.3 61 76.4 61L76.4 61C76.8 60.9 77.1 60.6 77.4 60.3L91.5 46.2C92.7 45.1 92.7 43.2 91.5 42.1Z"/></svg>

After

Width:  |  Height:  |  Size: 682 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ArrowUp" overflow="hidden"><path d="M51.031 88.951 51.031 14.192 59.931 23.092C61.0908 24.2518 62.9712 24.2518 64.131 23.092 65.2908 21.9322 65.2908 20.0518 64.131 18.892L50.131 4.9C49.0264 3.7402 47.1908 3.69543 46.031 4.8 45.9969 4.83252 45.9635 4.86586 45.931 4.9L31.941 18.89C30.7812 19.9946 30.7364 21.8302 31.841 22.99 31.8735 23.0241 31.9069 23.0575 31.941 23.09 33.0456 24.2498 34.8812 24.2946 36.041 23.19 36.0751 23.1575 36.1085 23.1241 36.141 23.09L45.036 14.195 45.036 88.951C45.036 90.6078 46.3791 91.951 48.036 91.951 49.6929 91.951 51.036 90.6078 51.036 88.951Z"/></svg>

After

Width:  |  Height:  |  Size: 698 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ArrowRight" overflow="hidden"><path d="M7.055 51.027 81.814 51.027 72.919 59.922C71.7592 61.0818 71.7592 62.9622 72.919 64.122 74.0788 65.2818 75.9592 65.2818 77.119 64.122L91.109 50.128C92.2688 49.0234 92.3136 47.1878 91.209 46.028 91.1765 45.9939 91.1431 45.9605 91.109 45.928L77.116 31.938C76.0114 30.7782 74.1758 30.7334 73.016 31.838 72.9819 31.8705 72.9485 31.9039 72.916 31.938 71.7562 33.0426 71.7114 34.8782 72.816 36.038 72.8485 36.0721 72.8819 36.1055 72.916 36.138L81.811 45.038 7.055 45.038C5.39815 45.038 4.055 46.3811 4.055 48.038 4.055 49.6949 5.39815 51.038 7.055 51.038Z"/></svg>

After

Width:  |  Height:  |  Size: 710 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_ArrowDown" overflow="hidden"><path d="M44.981 7.05 44.981 81.809 36.081 72.914C34.9212 71.7542 33.0408 71.7542 31.881 72.914 30.7212 74.0738 30.7212 75.9542 31.881 77.114L45.881 91.1C46.9856 92.2598 48.8212 92.3046 49.981 91.2 50.0151 91.1675 50.0485 91.1341 50.081 91.1L64.071 77.112C65.2308 76.0074 65.2756 74.1718 64.171 73.012 64.1385 72.9779 64.1051 72.9445 64.071 72.912 62.9664 71.7522 61.1308 71.7074 59.971 72.812 59.9369 72.8445 59.9035 72.8779 59.871 72.912L50.976 81.807 50.976 7.05C50.976 5.39315 49.6329 4.05 47.976 4.05 46.3191 4.05 44.976 5.39315 44.976 7.05Z"/></svg>

After

Width:  |  Height:  |  Size: 697 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Inbox1" overflow="hidden"><path d="M71.774 37.084 67.418 42.184 75.659 62.084 56.959 62.084C56.8851 67.0292 52.8163 70.9781 47.8712 70.9042 43.0302 70.8318 39.1234 66.925 39.051 62.084L20.332 62.084 28.58 42.17 24.227 37.07 14.005 62 14.005 84 82.005 84 82.005 62Z"/><path d="M68.505 34.753 56.005 34.753 56.005 12 40.005 12 40.005 34.753 27.505 34.753 48.005 58.753 68.505 34.753Z"/></svg>

After

Width:  |  Height:  |  Size: 503 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Cheers" overflow="hidden"><path d="M62.8 61.3C63.3 60.3 63 59.1 62 58.6 61 58.1 59.8 58.4 59.3 59.4L55.3 66.5 58 55.8C58.3 54.7 57.6 53.6 56.5 53.4 55.4 53.1 54.3 53.8 54.1 54.9L51.8 64.1 51.8 54.1C51.8 53 50.9 52.1 49.8 52.1 48.7 52.1 47.8 53 47.8 54.1L47.8 64.8 45.5 54.9C45.3 53.8 44.2 53.2 43.1 53.4 42 53.6 41.4 54.7 41.6 55.8L44.4 67.7C44.3 69.1 44 70.5 43.7 71.7 43.7 71.7 43.7 71.6 43.6 71.6 41.9 69 39.2 66.7 36.6 66 35.6 65.7 34.6 66.3 34.3 67.3 34 68.3 34.6 69.3 35.6 69.6 36.9 69.9 38.1 71.8 39.4 73.8 41 76.3 43 79.2 46 80.9L46 91.6 54.8 91.6 54.8 80.3C58.1 78.6 58.5 71.5 58.6 68.8L62.8 61.3Z"/><path d="M27.5 62.1 36.2 62.2C36.2 62.2 36.2 62.2 36.2 62.2 37.3 62.2 38.2 61.3 38.2 60.2 38.2 59.1 37.3 58.2 36.2 58.2L28.1 58.1 38.7 55.4C39.8 55.1 40.4 54 40.1 53 39.8 51.9 38.7 51.3 37.7 51.6L28.5 54 37.3 49.2C38.3 48.7 38.6 47.5 38.1 46.5 37.6 45.5 36.4 45.2 35.4 45.7L26 50.7 33.6 44C34.4 43.3 34.5 42 33.8 41.2 33.1 40.4 31.8 40.3 31 41L21.8 49C20.5 49.6 19.2 50 17.9 50.2 17.9 50.2 17.9 50.1 18 50.1 19.5 47.3 20.2 43.9 19.6 41.3 19.4 40.3 18.3 39.7 17.3 39.9 16.3 40.1 15.7 41.2 15.9 42.2 16.2 43.5 15.2 45.4 14.1 47.5 12.7 50.1 11.1 53.2 11 56.7L1.6 61.8 5.8 69.5 15.7 64.2C18.7 66.3 25.1 63.3 27.5 62.1Z"/><path d="M28.6 29.5 30.7 37.9C30.9 38.8 31.7 39.4 32.6 39.4 32.8 39.4 32.9 39.4 33.1 39.3 34.2 39 34.8 38 34.6 36.9L32.7 29 38 38.5C38.4 39.2 39 39.5 39.8 39.5 40.1 39.5 40.5 39.4 40.8 39.2 41.8 38.7 42.1 37.4 41.6 36.5L37 28.2 43.8 35.5C44.2 35.9 44.7 36.1 45.3 36.1 45.8 36.1 46.3 35.9 46.7 35.6 47.5 34.8 47.5 33.6 46.8 32.8L39.5 25 48 30.7C48.3 30.9 48.7 31 49.1 31 49.7 31 50.4 30.7 50.8 30.1 51.4 29.2 51.2 27.9 50.3 27.3L40.1 20.5C39.2 19.4 38.5 18.2 37.9 17.1 37.9 17.1 38 17.1 38 17.1 41 17.8 44.5 17.7 46.9 16.4 47.8 15.9 48.1 14.8 47.6 13.9 47.1 13 46 12.7 45.1 13.2 44 13.8 41.8 13.3 39.5 12.8 36.6 12.1 33.2 11.3 29.8 12.2L22.5 4.4 16.1 10.4 23.8 18.6C22.2 22.1 26.7 27.6 28.6 29.5Z"/><path d="M94.4 68.8 86.8 60.5C88.1 57 83.6 51.5 81.8 49.5L79.8 41.1C79.5 40 78.5 39.4 77.4 39.6 76.3 39.9 75.7 40.9 75.9 42L77.8 49.9 72.5 40.3C72 39.3 70.8 39 69.8 39.5 68.8 40 68.5 41.2 69 42.2L73.6 50.6 66.8 43.3C66 42.5 64.8 42.4 64 43.2 63.2 44 63.1 45.2 63.9 46L71.2 53.9 62.8 48.2C61.9 47.6 60.6 47.8 60 48.7 59.4 49.6 59.6 50.9 60.5 51.5L70.6 58.4C71.5 59.5 72.2 60.7 72.8 61.8 72.8 61.8 72.7 61.8 72.7 61.8 69.7 61.1 66.2 61.2 63.8 62.5 62.9 63 62.5 64.1 63 65 63.5 65.9 64.6 66.3 65.5 65.8 66.6 65.2 68.8 65.7 71.1 66.3 74 67 77.4 67.8 80.8 67L88 74.8 94.4 68.8Z"/><path d="M53.3 26C53.5 26 53.7 26 54 25.9L61.6 23.2 52.6 29.4C51.7 30 51.5 31.3 52.1 32.2 52.5 32.8 53.1 33.1 53.7 33.1 54.1 33.1 54.5 33 54.8 32.7L62.6 27.3 56 34.8C55.3 35.6 55.4 36.9 56.2 37.6 56.6 37.9 57 38.1 57.5 38.1 58.1 38.1 58.6 37.9 59 37.4L66.1 29.3 61.3 38.3C60.8 39.3 61.1 40.5 62.1 41 62.4 41.2 62.7 41.2 63 41.2 63.7 41.2 64.4 40.8 64.8 40.1L70.6 29.3C71.6 28.3 72.7 27.5 73.8 26.8 73.8 26.8 73.8 26.9 73.8 26.9 73.4 30 73.9 33.5 75.4 35.7 76 36.6 77.1 36.8 78 36.2 78.9 35.6 79.1 34.5 78.5 33.6 77.8 32.5 78.1 30.3 78.4 27.9 78.8 25 79.2 21.5 78.1 18.2L85.1 10.2 78.5 4.4 71.1 12.9C67.5 12 62.5 17.1 60.7 19L52.5 21.9C51.5 22.3 50.9 23.4 51.3 24.5 51.7 25.5 52.5 26 53.3 26Z"/></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_Checklist_LTR" overflow="hidden"><g><path d="M23 14 73 14 73 82 23 82 23 14ZM17 88 79 88 79 8 17 8 17 88Z"/><rect x="50" y="23" width="17" height="4"/><rect x="50" y="39" width="17" height="4"/><rect x="50" y="71" width="17" height="4"/><rect x="50" y="55" width="17" height="4"/><path d="M43.8 20.8 41 18 34.4 24.6 31.8 22 29 24.8 34.4 30.2Z"/><path d="M43.8 36.8 41 34 34.4 40.6 31.8 38 29 40.8 34.4 46.2Z"/><path d="M43.8 52.8 41 50 34.4 56.6 31.8 54 29 56.8 34.4 62.2Z"/><path d="M43.8 68.6 41 65.8 34.4 72.4 31.8 69.8 29 72.6 34.4 78Z"/></g></svg>

After

Width:  |  Height:  |  Size: 665 B

@@ -0,0 +1 @@
<svg viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Icons_PuzzlePieces" overflow="hidden"><path d="M49.15 37.13 49.15 37.13 54.78 39.46C54.9811 35.7652 58.1394 32.933 61.8343 33.1341 64.4082 33.2742 66.6735 34.8785 67.66 37.26 68.6145 39.6444 68.1635 42.3617 66.49 44.31L73.27 47.12 73.39 47.17 83.38 23 59.14 13 55.37 22.27 55.37 22.27 55.08 22.96 55 22.64C53.8993 19.9962 50.8682 18.7399 48.22 19.83 47.059 20.3313 46.113 21.2276 45.55 22.36 44.6136 25.0632 46.0458 28.0138 48.7491 28.9502 49.9481 29.3656 51.2579 29.3264 52.43 28.84L52.75 28.71 52.56 29.17 52.56 29.17Z"/><path d="M46.62 72.6C49.2416 71.7325 50.6637 68.904 49.7962 66.2824 48.9287 63.6608 46.1002 62.2388 43.4786 63.1062 42.4826 63.4358 41.6154 64.0703 41 64.92L41 55.92 34.93 55.92C34.9739 56.2516 34.9973 56.5855 35 56.92 35 61.3383 31.4183 64.92 27 64.92 22.5817 64.92 19 61.3383 19 56.92 19.0027 56.5855 19.0261 56.2516 19.07 55.92L13 55.92 13 81.92 41 81.92 41 70.92C41.1115 71.0735 41.2317 71.2204 41.36 71.36 41.4139 71.4625 41.4775 71.5596 41.55 71.65 42.732 72.7819 44.4176 73.2176 46 72.8 46.17 72.8 46.33 72.7 46.49 72.65Z"/><path d="M59 55.9C59.1552 55.7871 59.3022 55.6635 59.44 55.53 59.5492 55.4883 59.6482 55.4235 59.73 55.34 60.9592 54.0227 61.3662 52.1371 60.79 50.43L60.79 50.28C59.8608 47.6796 56.9995 46.3249 54.3991 47.2541 51.7987 48.1833 50.444 51.0446 51.3732 53.645 51.6913 54.5354 52.2554 55.3173 53 55.9L44 55.9 44 60C44.3318 59.9598 44.6658 59.9398 45 59.94 49.4183 59.94 53 63.5217 53 67.94 53 72.3583 49.4183 75.94 45 75.94 44.6656 75.9369 44.3316 75.9136 44 75.87L44 81.9 70 81.9 70 55.9Z"/><path d="M41 35.28 41 24.9 13 24.9 13 52.9 24 52.9C22.741 53.8443 22 55.3262 22 56.9 22 59.6614 24.2386 61.9 27 61.9 29.7614 61.9 32 59.6614 32 56.9 32 55.3262 31.259 53.8443 30 52.9L41 52.9 41 42.62C38.8493 44.6381 35.5007 44.6381 33.35 42.62 31.3231 40.6404 31.2848 37.3925 33.2644 35.3656 33.2926 35.3367 33.3211 35.3082 33.35 35.28 35.5007 33.2619 38.8493 33.2619 41 35.28Z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

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