package Ġio . da h gan . stream Ċ Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠWrap s Ġthe Ġgiven Ġbyte Ġarrays , Ġdetect s Ġits Ġencoding Ġand Ġfinally Ġconverts Ġit Ġto Ġcharacters . Ċ Ġ*/ Ċ class ĠByte Stream ( private Ġval Ġinput : ĠByteArray , Ġprivate Ġval Ġoffset : ĠInt Ġ= Ġ 0 ) Ġ: ĠStream Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX 0 0 Ġ= Ġ 0 x 0 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX FE Ġ= Ġ 0 xFE . to Byte () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX FF Ġ= Ġ 0 xFF . to Byte () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX EF Ġ= Ġ 0 xEF . to Byte () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX BB Ġ= Ġ 0 xBB . to Byte () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX BF Ġ= Ġ 0 xB F . to Byte () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġde coders Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncoding . UTF 8 Ġto ĠUTF 8 Decoder (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncoding . UTF 1 6 LE Ġto ĠUTF 1 6 Decoder . le (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncoding . UTF 1 6 BE Ġto ĠUTF 1 6 Decoder . be (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncoding . UTF 3 2 LE Ġto ĠUTF 3 2 Decoder . le (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEncoding . UTF 3 2 BE Ġto ĠUTF 3 2 Decoder . be () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġencoding : ĠEncoding Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 4 Ġ&& Ġinput [ 0 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 1 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 2 ] Ġ== ĠX FE Ġ&& Ġinput [ 3 ] Ġ== ĠX FF Ġ-> ĠEncoding . UTF 3 2 BE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 4 Ġ&& Ġinput [ 0 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 1 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 2 ] Ġ== ĠX 0 0 Ġ-> ĠEncoding . UTF 3 2 BE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 4 Ġ&& Ġinput [ 0 ] Ġ== ĠX FF Ġ&& Ġinput [ 1 ] Ġ== ĠX FE Ġ&& Ġinput [ 2 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 3 ] Ġ== ĠX 0 0 Ġ-> ĠEncoding . UTF 3 2 LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 4 Ġ&& Ġinput [ 1 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 2 ] Ġ== ĠX 0 0 Ġ&& Ġinput [ 3 ] Ġ== ĠX 0 0 Ġ-> ĠEncoding . UTF 3 2 LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 2 Ġ&& Ġinput [ 0 ] Ġ== ĠX FE Ġ&& Ġinput [ 1 ] Ġ== ĠX FF Ġ-> ĠEncoding . UTF 1 6 BE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 1 Ġ&& Ġinput [ 0 ] Ġ== ĠX 0 0 Ġ-> ĠEncoding . UTF 1 6 BE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 2 Ġ&& Ġinput [ 0 ] Ġ== ĠX FF Ġ&& Ġinput [ 1 ] Ġ== ĠX FE Ġ-> ĠEncoding . UTF 1 6 LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 2 Ġ&& Ġinput [ 1 ] Ġ== ĠX 0 0 Ġ-> ĠEncoding . UTF 1 6 LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . size Ġ>= Ġ 4 Ġ&& Ġinput [ 0 ] Ġ== ĠX EF Ġ&& Ġinput [ 1 ] Ġ== ĠX BB Ġ&& Ġinput [ 2 ] Ġ== ĠX BF Ġ-> ĠEncoding . UTF 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠEncoding . UTF 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhead : ĠUni Char Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġde coders [ encoding ] !!. decode ( input , Ġoffset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # encoding () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġencoding () Ġ= Ġencoding ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # head () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġhead () Ġ= Ġhead ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # tail () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtail () Ġ= ĠByte Stream ( this . input , Ġhead . offset ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # isEmpty () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġinput . size Ġ<= Ġoffset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # isNotEmpty () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis NotEmpty () Ġ= Ġ! isEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # push ( head ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġpush ( head : ĠUni Char ) Ġ= ĠP ushed Stream ( head , Ġthis ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # codes () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcodes () Ġ= ĠArrayList < Int >(). apply Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġthis @ Byte Stream ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( current . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( current . head . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . tail () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ}. to IntArray () Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠP ushed Stream Ġadds Ġthe Ġgiven Ġdecoded Ġcharacter Ġas Ġhead Ġto Ġthe Ġgiven ĠStream . Ċ Ġ*/ Ċ class ĠP ushed Stream ( private Ġval Ġhead : ĠUni Char , Ġprivate Ġval Ġtail : ĠStream ) Ġ: ĠStream Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # encoding () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġencoding () Ġ= Ġtail . encoding () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # head () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġhead () Ġ= Ġhead ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # tail () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtail () Ġ= Ġtail ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # isEmpty () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # isNotEmpty () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis NotEmpty () Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # push ( head ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġpush ( head : ĠUni Char ) Ġ= ĠP ushed Stream ( head , Ġthis ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see ĠStream # codes () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcodes () Ġ= Ġint ArrayOf ( head . code , Ġ* tail . codes ()) Ċ } Ċ