Files
zz_app/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt
T

220 lines
27 KiB
Kotlin

package net.keinekekse.app
//import org.koin.plugin.module.dsl.startKoin
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import io.github.oshai.kotlinlogging.KotlinLogging
import net.keinekekse.app.books.di.KoinApp
import org.koin.plugin.module.dsl.startKoin
private val logger = KotlinLogging.logger {}
//@PropertyValue("kc_server")
//var keycloakServer: String = ""
//
//@PropertyValue("kc_realm")
//var keycloakRealm: String = ""
//
//@PropertyValue("kc_client")
//var keycloakClient: String = ""
fun main() = application {
startKoin<KoinApp>()
logger.info { "Koin started" }
logger.debug { "Debugging Koin start" }
// val config: ConfigProperties = koinInject()
// val settings: Settings = koinInject()
// val settings: Settings = PreferencesSettings(delegate)
//
// settings.putInt("intValue", 42)
// val sett = settings.export()
// settings.putInt("intValue", 4242)
// println("Properties: ${config["keycloakServer"]}")
// println("Settings: ${settings.get("kc_server", "default")}")
// println(settings.export())
// settings.import(sett)
// println("Settings: ${settings.getInt("intValue", -1)}")
// val inj = koinInject<String>(named("AppString"))
// val authResultState = remember { mutableStateOf<AuthResult?>(null) }
//
// val authenticator: Authenticator = koinInject()
// LaunchedEffect(Unit) {
// authResultState.value = withContext(Dispatchers.IO) {
// // TODO - (~) Verständnis für App-Aufbau und DI
// // - (x) das object muss global angelegt werden -> DI singleton
// // - (x) globale Speicherung der Tokens
// // - Tokens persistieren? Multiplatform! (evtl. library)
// // - (x) globaler httpClient mit Konfig für Tokens -> DI
// // - (x) Error-Handling: 401 -> refresh -> 401 -> reauth [implizit]
//
// val result = authenticator.authenticate()
//
// when (result) {
// is AuthResult.Success -> {
//// println("Access Token: ${result.tokens?.accessToken}")
//// println("Refresh Token: ${result.tokens?.refreshToken}")
//
//// delay(3000)
// /*
// // klappt, gibt aber nicht mehr her, als ohnehin im Token steht
// it.requestUserInfo(result.tokens!!.accessToken)
// */
// /*
// // funktioniert -> jetzt fehlt die DI-Mimik für die compose app
// when (val res = it.requestRefreshToken(result.tokens)) {
// is AuthResult.Success -> {
// println("Access Token: ${res.tokens?.accessToken}")
// println("Refresh Token: ${res.tokens?.refreshToken}")
// }
//
// is AuthResult.Error -> {
// println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
// }
//
// is AuthResult.Fatal -> {
// println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
//
// }
// }
// */
// }
//
// else -> {}
// }
//
// result
// // }
// }
// }
Window(
onCloseRequest = ::exitApplication,
title = "app",
) {
App()
// when (val result = authResultState.value) {
// null -> {
// Column(
// modifier = Modifier.fillMaxSize(),
// horizontalAlignment = Alignment.CenterHorizontally,
// verticalArrangement = Arrangement.Center
// ) {
// Text("Warten auf Anmeldung...")
//
//// Icon(
//// imageVector = Icons.Default.HourglassTop,
//// contentDescription = "Home",
//// modifier = Modifier.padding(top = 16.dp).size(32.dp)
//// )
// ProgressIndicator()
// }
// }
//
// is AuthResult.Error -> {
// // TODO show an error UI (and maybe a retry button)
// Text("Fehler bei der Anmeldung: ${result.message} (${result.code})")
// Text("Fehlerbeschreibung: ${result.details ?: ""}")
//// App()
// }
//
// is AuthResult.Fatal -> {
// Text("Fataler Fehler bei der Anmeldung: ${result.message} (${result.code})")
// Text("Fehlerbeschreibung: ${result.details ?: ""}")
// }
//
// is AuthResult.Success -> {
// val test = koinInject<TestAuth>()
// CoroutineScope(Dispatchers.Default).launch {
// println("requesting '/'")
// test.request("/")
// }
// App()
// }
// }
}
}
//
//@Composable
//fun ProgressIndicator(animationSize: Int = 48, paddingTop: Int = 16, strokeWidth: Int = 5) {
// val primaryColor = MaterialTheme.colorScheme.primary
// val backgroundColor = MaterialTheme.colorScheme.background
// val strokewidth = strokeWidth.dp
// CircularProgressIndicator(
// modifier =
// Modifier.padding(top = paddingTop.dp).size(animationSize.dp).drawBehind {
// drawCircle(
// primaryColor,
// radius = size.width / 2 - strokewidth.toPx() / 2,
// style = Stroke(strokewidth.toPx()),
//
// )
// },
// color = backgroundColor,
// strokeWidth = strokewidth
// )
//}
/*
System properties:
------------------
java.specification.version=21
sun.jnu.encoding=UTF-8
java.class.path=/Users/hb/Workspaces/Kotlin/app/books/build/classes/kotlin/jvm/main:/Users/hb/Workspaces/Kotlin/app/books/build/classes/java/jvmMain:/Users/hb/Workspaces/Kotlin/app/books/build/processedResources/jvm/main:/Users/hb/Workspaces/Kotlin/app/shared/build/libs/shared-jvm.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-cio-jvm/3.4.0/84786f75d08fe5042f17c246380eb8381d125a6b/ktor-client-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-auth-jvm/3.4.0/14d75d5e7552a8e26a2ad4dd511a76d4a0c5502f/ktor-client-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-logging-jvm/3.4.0/278d41697d9194d36290842bfdae03d674b3f365/ktor-client-logging-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-content-negotiation-jvm/3.4.0/266c1aef9d340c22cd859dd5c9174c2e1d86489f/ktor-client-content-negotiation-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-java-jvm/3.4.0/4fcb8ec3488c8529773562d45e475533ab46f8ee/ktor-client-java-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jwt-jvm/3.4.0/f9c667cf2b122debb0081d0d69edb4caaa047d09/ktor-server-auth-jwt-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jvm/3.4.0/6c5fd0cb490bc7efabda621873c07b30b2e7f686/ktor-server-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-core-jvm/3.4.0/1f017fc4dcf7e3ff5152a28923b7639a9ba82123/ktor-client-core-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-slf4j/1.10.2/1271f9d4a929150bb87ab8d1dc1e86d4bcf039f3/kotlinx-coroutines-slf4j-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.components/components-resources-desktop/1.10.0/c6115b607f77e9d033de360f989850d3824bf112/library-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material3/material3-desktop/1.10.0-alpha05/ebcf3065e9f7d408f8be2854b6542fb1dd51356f/material3-desktop-1.10.0-alpha05.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-viewmodel-jvm/4.2.0-RC1/635720e57068e85996de14fe99262210bd373bf9/koin-compose-viewmodel-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-jvm/4.2.0-RC1/f8d7e9c3bc6ab356961774f56a9e844158b1de42/koin-compose-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.desktop/desktop-jvm/1.10.0/42facd9840309ac4eb841a986c5d1b97d2780471/desktop-jvm-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-desktop/1.10.0/63e1c3c6705d111bf84e41110e7729df5b85163e/material-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-ripple-desktop/1.10.0/74a14824f086339703264689c5a7cf4ceb39ed40/material-ripple-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-desktop/1.10.0/439630673394b12a406fe398faaca548a13fdb72/foundation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-extended-desktop/1.7.0/c7c5465dd754043076875b32bce0dd7f5a354fe8/material-icons-extended-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.lifecycle/lifecycle-viewmodel-compose-desktop/2.9.6/5cf03bfbc0f7139a4d7081d5da78c97287f3c65f/lifecycle-viewmodel-compose-desktop-2.9.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-desktop/1.10.0/17f777e04f7fe5dff2fe7992d0c0bda81c3a3897/animation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-layout-desktop/1.10.0/263364f922ef14fb64f1313a384a0c31cd6f3fa5/foundation-layout-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-core-desktop/1.7.0/414b3096050fe647b0638832eace80f22c06b85c/material-icons-core-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-core-desktop/1.10.0/5dd98c5745e548644b7657901bbcc4c2c8f9ec59/animation-core-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-desktop/1.10.0/361220f423057a8dae48d6ba8a0294f0948caf8a/ui-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-kotlinx-json-jvm/3.4.0/2a09f17d70b6e61623fd8aff9bdce6d7877892/ktor-serialization-kotlinx-json-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-cio-jvm/3.4.0/16a50d239963841ae64e8e207f93ae7a5fdd7062/ktor-server-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-sessions-jvm/3.4.0/35d3bb0535b2a6429b1eb73390cd4de9c541e654/ktor-server-sessions-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-core-jvm/3.4.0/97aba0f5e3cd539679907382a3f5783b9a563165/ktor-server-core-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-external-protobuf/1.2.0/200a891fd29602b4bcff8e197d243a372fb026d5/datastore-preferences-external-protobuf-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-proto/1.2.0/5d062b556fb45141138c3d86284bbdcbe07cc770/datastore-preferences-proto-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-core-jvm/1.2.0/94895322815c85066329ef177d5ff9ef5790cd45/datastore-preferences-core-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-core-okio-jvm/1.2.0/16e01a0603ce8cf206b21a304ff1ded7a9bff1da/datastore-core-okio-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-core-jvm/1.2.0/f7598a3f1657299cbff7b2bb4c421785765255df/datastore-core-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-jvm/1.2.0/c8587c46d39af5cd10a413007b233b56ac468756/datastore-preferences-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-jvm/1.2.0/81090c9ee3c129bb55eadbb4c16918e461c3dc2f/datastore-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.skiko/skiko-awt-runtime-macos-arm64/0.9.37.3/471d5afdecd5011d7c883edd77e01a47cbf2e02d/skiko-awt-runtime-macos-arm64-0.9.37.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-text-desktop/1.10.0/611728d97ab985b99c5d1d4709faeadfceac14bd/ui-text-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-graphics-desktop/1.10.0/c0b9e89e8f5ac5b0253d32d8da2758643ca1e19b/ui-graphics-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.skiko/skiko-awt/0.9.37.3/60077d9cd37ed4acf98f7833bab211981576ab4d/skiko-awt-0.9.37.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-jdk8/1.10.2/809f71bf722bad7e78ebe8ec710c0327c23b7a31/kotlinx-coroutines-jdk8-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-tooling-preview-desktop/1.10.0/6d464d6c6d654d45aecdfaff7a08d64af62217e2/ui-tooling-preview-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-backhandler-desktop/1.10.0/ed725f86a0fdff73fb37561ffb606166725e4b6f/ui-backhandler-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.navigationevent/navigationevent-desktop/1.0.1/ddb1e7fe97ed51c3d35bba493f97fcf12398719/navigationevent-desktop-1.0.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-annotation-jvm/1.10.0/ea491da34ba40ae9bd340c393566753ddfd95a76/runtime-annotation-jvm-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-saveable-desktop/1.10.0/f6903c683c07ba479659ba4eb55bc7c80a7c433e/runtime-saveable-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.runtime/runtime-saveable-desktop/1.10.0/9b0e2a8ce3ae7d2b1a40307bc9271933b238cfd4/runtime-saveable-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.lifecycle/lifecycle-runtime-compose-desktop/2.9.6/7b6b6793f3c4c5996b20d1d99cf728e5fac00364/lifecycle-runtime-compose-desktop-2.9.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-unit-desktop/1.10.0/aeeb2f31358ab5abf0bafa0828de2faba7189db5/ui-unit-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-geometry-desktop/1.10.0/779ddaadbc03720f7bb2507f6ed6dc4ffc9e7f3e/ui-geometry-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.savedstate/savedstate-compose-desktop/1.3.6/63692375ffe667f12cb3ea8aa1e605d659ed2add/savedstate-compose-desktop-1.3.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.runtime/runtime-desktop/1.10.0/edbd39fc9691f4ba1e29c6690341148db4272752/runtime-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-viewmodel-jvm/4.2.0-RC1/d86bef157979fd8a01d7ebe40bb7cae64a7e3130/koin-core-viewmodel-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel-savedstate-desktop/2.9.4/72a1919b08c5a4da224d8a65ce1589aa69934e8a/lifecycle-viewmodel-savedstate-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel-desktop/2.9.4/93fee6d78f0df0e38f36e0fa2eff74f8da6d5481/lifecycle-viewmodel-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime-desktop/2.9.4/1cc820319ec0139e76b8a2fe4be0b356b4e624c4/lifecycle-runtime-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.savedstate/savedstate-compose-desktop/1.3.3/cd60b543d5722a8b5e6cea1e4ccdec8b4375a22b/savedstate-compose-desktop-1.3.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.savedstate/savedstate-desktop/1.3.3/1c5bfc3fb56614538528060a06f2c03e34fa5188/savedstate-desktop-1.3.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common-jvm/2.9.4/ab739bccdb3541983385af169565c7c035d897e7/lifecycle-common-jvm-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime-compose-desktop/2.9.4/86a4ffec845d4e488078118a0b5095bd1fabcafe/lifecycle-runtime-compose-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-desktop/1.10.0/b1705e2087f06395622b784aa88e2e738043459/runtime-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-retain-desktop/1.10.0/879812e3cd2c6151f5d91f515a35952b1be07a76/runtime-retain-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-http-cio-jvm/3.4.0/2c1f50d77b7d825175acf56f6cb494fc1145e23e/ktor-http-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-websocket-serialization-jvm/3.4.0/20093fc55064238930e96c8dd12a2d96af6ff81d/ktor-websocket-serialization-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-kotlinx-jvm/3.4.0/d001db47b2ebe8ad8b2cb1bb2a687688840f5887/ktor-serialization-kotlinx-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-jvm/3.4.0/406af3e14bc41086ac933c02c67bd7ee762cfb4b/ktor-serialization-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-websockets-jvm/3.4.0/5c8a9438372c7de912cf6da0e275ec17056d6451/ktor-websockets-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-network-tls-jvm/3.4.0/10bb3d46d3fba6ccfc27f03fbeec029a756358b1/ktor-network-tls-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-http-jvm/3.4.0/81e4323a06aa6751f59ffe6e35e61277af17fdb5/ktor-http-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-events-jvm/3.4.0/d6e6800119bf169c0559eeaf49477757e50a736/ktor-events-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-sse-jvm/3.4.0/3b4493bfb71b536fc0c055d645ceb1a44b318637/ktor-sse-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-network-jvm/3.4.0/8d6179be0155e1d34f844a8317b7f1950772a372/ktor-network-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-utils-jvm/3.4.0/ce54b074feee2cc3cdac2ba93420f18adc71061d/ktor-utils-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-io-jvm/3.4.0/16e3233d00797f77f2b918a65d40479c28dc2bde/ktor-io-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core-jvm/1.10.2/4a9f78ef49483748e2c129f3d124b8fa249dafbf/kotlinx-coroutines-core-jvm-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-swing/1.10.2/ccb5a2e7c83fa76da0ba4677f05678d3bd3eed57/kotlinx-coroutines-swing-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/net.keinekekse/util-jvm/0.3.0/34d1d3351568366f988f4a9e5e593801300ba2ea/util-jvm-0.3.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/2.3.0/a723c4fbeeb7b48910a0f82b8ea826da1b17dd0b/kotlin-reflect-2.3.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/2.2.20/57c4d839a6e5ad105d61ffc5cc0bf4de649c1714/kotlin-stdlib-jdk8-2.2.20.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-annotations-jvm/4.2.0-RC1/881a2e7fe719af2cba0eba0ebdd7f1c386faad71/koin-annotations-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-jvm/4.2.0-RC1/2f33e0b8ad4eca34f0af8b10756edbe00e392cf6/koin-core-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-core-jvm/1.9.0/91448df39c558f7c6147b8bd8db01debe16e0cc1/kotlinx-serialization-core-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-json-io-jvm/1.9.0/3a371942a591532d0d9245ca6787ee677853bebd/kotlinx-serialization-json-io-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-json-jvm/1.9.0/aea6f7d49fe5c458f8963ee6d4bdaf4a459ab3e7/kotlinx-serialization-json-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-util-desktop/1.10.0/fe41825dccacb792ded7df579736a0ed919ee270/ui-util-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/atomicfu-jvm/0.23.2/a4601dc42dceb031a586058e8356ff778a57dea0/atomicfu-jvm-0.23.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.graphics/graphics-shapes-desktop/1.1.0/a5d2198960bdc0915f74c6b2954d3323f35f40ea/graphics-shapes-desktop-1.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.collection/collection-jvm/1.5.0/7ba2c69414d46ebc2dd76598bdd0a75c54281a57/collection-jvm-1.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.2.0/5e1b8b81dfd5f52c56a8d53b18ca759c19a301f3/core-common-2.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation-jvm/1.9.1/b17951747e38bf3986a24431b9ba0d039958aa5f/annotation-jvm-1.9.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-datetime-jvm/0.7.1/81c2e0246bd28cc2dcbdf0ab53628322e66a9de9/kotlinx-datetime-jvm-0.7.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/2.2.20/bdbe3b5d872fa3b74d8fcd4e7ca3193f4abc9cc8/kotlin-stdlib-jdk7-2.2.20.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-annotations-jvm/4.2.0-RC1/3288fc54a9fcf84283054319faf13ab35ecf25f2/koin-core-annotations-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-concurrent-collections-jvm/2.1.0/5c03b644537d7926a8f77e5735a8bebb55dafdcd/stately-concurrent-collections-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-concurrency-jvm/2.1.0/6285428408c4d7e4a6d9a09511de877103effd81/stately-concurrency-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio-jvm/3.9.1/79696e3f4ff05d41ba2b3dc68adb5808a2e5dc53/okio-jvm-3.9.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-strict-jvm/2.1.0/3ae8369209065455f4630793bf6aca0fb88c8b6b/stately-strict-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-io-core-jvm/0.8.2/358a9f2ba2dc81c5dc84c3d1853f6e5efba63be1/kotlinx-io-core-jvm-0.8.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-io-bytestring-jvm/0.8.2/89c5399596250e71f2bba6d2415972a078a525c7/kotlinx-io-bytestring-jvm-0.8.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/2.3.20-Beta1/4747390fd8d9de1b004654c60ab80ddff4cc7da1/kotlin-stdlib-2.3.20-Beta1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/23.0.0/8cc20c07506ec18e0834947b84a864bfc094484e/annotations-23.0.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.17/d9e58ac9c7779ba3bf8142aff6c830617a7fe60f/slf4j-api-2.0.17.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.typesafe/config/1.4.5/cc25b497ded7068a861517a815546fb472f9e58/config-1.4.5.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.fusesource.jansi/jansi/2.4.2/ba7387c31622c6650b83edba1bbb115f1fe462ba/jansi-2.4.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.auth0/java-jwt/4.5.0/d7004155fe57a107cc40fb6be0132d8ad2530613/java-jwt-4.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.auth0/jwks-rsa/0.23.0/76b14c3f09a1edea16856ec500a18030fa192065/jwks-rsa-0.23.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.runtime/jbr-api/1.5.0/4158e485a7a4ecfd521e03095d81e0225529e8d2/jbr-api-1.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.15.4/5223ea5a9bf52cdc9c5e537a0e52f2432eaf208b/jackson-annotations-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.15.4/560309fc381f77d4d15c4a4cdaa0db5025c4fd13/jackson-databind-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.15.4/aebe84b45360debad94f692a4074c6aceb535fa0/jackson-core-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/32.1.2-jre/5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318/guava-32.1.2-jre.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.33.0/de2b60b62da487644fc11f734e73c8b0b431238f/checker-qual-3.33.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.18.0/89b684257096f548fa39a7df9fdaa409d4d4df91/error_prone_annotations-2.18.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jspecify/jspecify/1.0.0/7425a601c1c7ec76645a78d22b8c6a627edee507/jspecify-1.0.0.jar
sun.awt.enableExtraMouseButtons=true
java.vm.vendor=Eclipse Adoptium
sun.arch.data.model=64
user.variant=
java.vendor.url=https://adoptium.net/
java.vm.specification.version=21
os.name=Mac OS X
user.country=DE
sun.java.launcher=SUN_STANDARD
sun.boot.library.path=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/lib
sun.java.command=net.keinekekse.app.MainKt
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
jdk.debug=release
sun.cpu.endian=little
user.home=/Users/hb
user.language=de
java.specification.vendor=Oracle Corporation
java.version.date=2025-10-21
java.home=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
file.separator=/
java.vm.compressedOopsMode=Non-zero disjoint base
line.separator=
java.vm.specification.vendor=Oracle Corporation
java.specification.name=Java Platform API Specification
apple.awt.application.name=MainKt
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.runtime.version=21.0.9+10-LTS
user.name=hb
stdout.encoding=UTF-8
path.separator=:
os.version=26.2
java.runtime.name=OpenJDK Runtime Environment
file.encoding=UTF-8
java.vm.name=OpenJDK 64-Bit Server VM
java.vendor.version=Temurin-21.0.9+10
java.vendor.url.bug=https://github.com/adoptium/adoptium-support/issues
java.io.tmpdir=/var/folders/tb/nj4p1kpn1fn__rhr8k1gvfhw0000gn/T/
java.version=21.0.9
user.dir=/Users/hb/Workspaces/Kotlin/app/books
os.arch=aarch64
java.vm.specification.name=Java Virtual Machine Specification
native.encoding=UTF-8
java.library.path=/Users/hb/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.vm.info=mixed mode, sharing
stderr.encoding=UTF-8
java.vendor=Eclipse Adoptium
java.vm.version=21.0.9+10-LTS
sun.io.unicode.encoding=UnicodeBig
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.class.version=65.0
*/