* complete rewritten in Kotlin
