package Ġfr . ac in q . lightning . utils Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow ĊĊ Ċ @ Opt In ( Experimental Unsigned Types :: class ) Ċ fun Ġutf 8 Byte Count ( first Code Point : ĠByte ) Ġ= ĊĠĠĠ Ġwhen Ġ( first Code Point . to U Byte (). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Ġ 0 .. 0 x 7 F Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġin Ġ 0 xC 0 .. 0 x DF Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġin Ġ 0 xE 0 .. 0 xEF Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠ Ġin Ġ 0 xF 0 .. 0 xF 7 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Malformed ĠUTF - 8 Ġcharacter Ġ( bad Ġfirst Ġcode point Ġ 0 x ${ first Code Point . to U Byte (). toString ( 1 6 ). pad Start ( 2 , Ġ' 0 ') }) ") ĊĠĠĠ Ġ} Ċ Ċ fun ĠFlow < ByteArray >. decode ToString (): ĠFlow < String > Ġ= ĊĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Bytes Ġ= ĠByteArray ( 3 ) ĊĠĠĠĠĠĠĠ Ġvar Ġsplit Bytes Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcollect Ġ{ Ġreceived Bytes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġsplit Bytes . sub Array ( split Bytes Size ) Ġconcat Ġreceived Bytes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcorrect Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( correct Size Ġ< Ġbytes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġutf 8 Byte Count ( bytes [ correct Size ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( correct Size Ġ+ Ġcount Ġ> Ġbytes . size ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorrect Size Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( correct Size Ġ< Ġbytes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . copy Into ( split Bytes , Ġ 0 , Ġcorrect Size , Ġbytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Bytes Size Ġ= Ġbytes . size Ġ- Ġcorrect Size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( bytes . sub Array ( correct Size ). decode ToString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( split Bytes Size Ġ> Ġ 0 ) Ġerror (" Flow Ġended Ġwith Ġa Ġmalformed ĠUTF - 8 Ġcharacter ") ĊĠĠĠ Ġ} Ċ Ċ fun ĠFlow < String >. split By Lines (): ĠFlow < String > Ġ= ĊĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbuffer Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġline Ending Ġ= ĠRegex ("\\ n ") ĊĊĠĠĠĠĠĠĠ Ġcollect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġline Ending . find ( buffer ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( buffer . substring ( 0 , Ġmatch . range . first )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġbuffer . substring ( match . range . last Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( buffer . isNotEmpty ()) Ġemit ( buffer ) ĊĠĠĠ Ġ} Ċ