package Ġfr . jav atic . kotlin Sdk Extensions Ċ Ċ import Ġfr . jav atic . jdk like . io . ByteArray OutputStream Ċ import Ġfr . jav atic . jdk like . util . Bit Set Ċ Ċ enum Ġclass ĠUri Context Ġ{ ĊĠĠĠ ĠHEADER _ VALUE _ ITEM , ĊĠĠĠ ĠQUERY _ PARAM Ċ } Ċ Ċ fun ĠString . uri Component Encoded ( ctx : ĠUri Context ?, Ġoptim istic : ĠBoolean Ġ= Ġtrue ): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( isEmpty ()) Ġreturn Ġthis ĊĊĠĠĠ Ġval Ġp char Ġ= Ġallowed Chars ( ctx ) ĊĊĠĠĠ Ġval Ġchars Ġ= Ġto CharArray () ĊĠĠĠ Ġif Ġ( optim istic ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmis spl aced Optim ism Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġchars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! p char . get ( c . code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmis spl aced Optim ism Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! mis spl aced Optim ism ) Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream ( 2 Ġ* Ġchars . size ) ĊĠĠĠ Ġfor Ġ( c Ġin Ġchars ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchar Code Ġ= Ġc . code ĊĠĠĠĠĠĠĠ Ġif Ġ( p char . get ( charCode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( charCode ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( percent Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( Char . for Digit ( charCode Ġshr Ġ 4 Ġand Ġ 0 xF , Ġ 1 6 ). uppercase Char (). code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( Char . for Digit ( charCode Ġand Ġ 0 xF , Ġ 1 6 ). uppercase Char (). code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġba os . toString () Ċ } Ċ Ċ fun ĠString . uri Component Decoded (): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( isEmpty ()) Ġreturn Ġthis ĊĊĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream ( length ) ĊĠĠĠ Ġvar Ġshortcut Possible Ġ= Ġtrue ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġget ( i ). code ĊĠĠĠĠĠĠĠ Ġif Ġ( ch Ġ== Ġpercent Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġ 2 Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhex 1 Ġ= Ġget ( i Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhex 2 Ġ= Ġget ( i Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Ġ= Ġhex 1 . digit ToInt OrNull ( 1 6 ) Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġhex 2 . digit ToInt OrNull ( 1 6 ) Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (!( u Ġ== Ġ- 1 Ġ|| Ġl Ġ== Ġ- 1 )) Ġ{ Ġ" Invalid Ġencoded Ġsequence Ġ\"" Ġ+ Ġsubstring ( i ) Ġ+ Ġ"\"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ((( u Ġshl Ġ 4 ) Ġ+ Ġl ). to Char (). code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshortcut Possible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġencoded Ġsequence Ġ\"" Ġ+ Ġsubstring ( i ) Ġ+ Ġ"\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġba os . write ( ch ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( shortcut Possible ) Ġreturn Ġthis ĊĊĠĠĠ Ġreturn Ġba os . toString () Ċ } Ċ Ċ private Ġfun Ġallowed Chars ( ctx : ĠUri Context ?): ĠBit Set Ġ= Ġwhen Ġ( ctx ) Ġ{ ĊĠĠĠ ĠUri Context . HEADER _ VALUE _ ITEM Ġ-> ĠBit Set (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġor ( BASE _ ALLOW ) ĊĠĠĠĠĠĠĠ Ġor ( AMP ERS AND ) ĊĠĠĠĠĠĠĠ Ġor ( EQUAL S ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠUri Context . QUERY _ PARAM Ġ-> ĠBit Set (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġor ( BASE _ ALLOW ) ĊĠĠĠĠĠĠĠ Ġor ( COMMA ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġnull Ġ-> ĠBit Set (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġor ( BASE _ ALLOW ) ĊĠĠĠĠĠĠĠ Ġor ( COMMA ) ĊĠĠĠĠĠĠĠ Ġor ( AMP ERS AND ) ĊĠĠĠĠĠĠĠ Ġor ( EQUAL S ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval Ġpercent Code Ġ= Ġ'% '. code Ċ Ċ private Ġval ĠCOM MA Ġ= ĠBit Set (). apply Ġ{ ĊĠĠĠ Ġset (',' . code ) Ċ } Ċ private Ġval ĠAMP ERS AND Ġ= ĠBit Set (). apply Ġ{ ĊĠĠĠ Ġset ('& '. code ) Ċ } Ċ private Ġval ĠEQUAL S Ġ= ĠBit Set (). apply Ġ{ ĊĠĠĠ Ġset (' =' . code ) Ċ } Ċ private Ġval ĠBASE _ ALLOW Ġ= ĠBit Set (). apply Ġ{ ĊĠĠĠ Ġset (' a '. code , Ġ' z '. code ) ĊĠĠĠ Ġset (' A '. code , Ġ' Z '. code ) ĊĠĠĠ Ġset (' 0 '. code , Ġ' 9 '. code ) ĊĠĠĠ Ġset (' ; '. code ) ĊĠĠĠ Ġ// Ġset (',' . code ) ĊĠĠĠ Ġ// Ġset ('/ '. code ) ĊĠĠĠ Ġ// Ġset (' ? '. code ) ĊĠĠĠ Ġset (': '. code ) ĊĠĠĠ Ġset ('@ '. code ) ĊĠĠĠ Ġ// Ġset ('& '. code ) ĊĠĠĠ Ġ// Ġset (' =' . code ) ĊĠĠĠ Ġset ('+ '. code ) ĊĠĠĠ Ġset ('$ '. code ) ĊĠĠĠ Ġset ('- '. code ) ĊĠĠĠ Ġset ('_ '. code ) ĊĠĠĠ Ġset ('. '. code ) ĊĠĠĠ Ġset (' ! '. code ) ĊĠĠĠ Ġset (' ~ '. code ) ĊĠĠĠ Ġset ('* '. code ) ĊĠĠĠ Ġset (' \' '. code ) ĊĠĠĠ Ġset (' ('. code ) ĊĠĠĠ Ġset (' ) '. code ) ĊĠĠĠ Ġ// Ġset ('# '. code ) Ċ } ĊĊ