package Ġkotlin ext . string Ċ Ċ import Ġjava . text . Character Iterator Ċ import Ġjava . text . String Character Iterator Ċ Ċ /** Ċ Ġ* ĠEns ures Ġthat Ġthis Ġ[ String ] Ġends Ġwith Ġthe Ġprovided Ġ[ Char ]. Ċ Ġ* Ċ Ġ* ĠIf Ġthis Ġ[ String ] Ġalready Ġends Ġwith Ġthe Ġprovided Ġ[ Char ], Ġthen Ġthe Ġ[ String ] Ġis Ġreturned Ġun alter ed . Ċ Ġ* ĠOtherwise , Ġthe Ġ[ Char ] Ġis Ġappended Ġand Ġthe Ġresulting Ġ[ String ] Ġis Ġreturned . Ċ Ġ* Ċ Ġ* Ġ@ param Ġchar ĠThe Ġ[ Char ] Ġwhich Ġshould Ġoccur Ġat Ġthe Ġend Ġof Ġthis Ġ[ String ]. Ċ Ġ* Ġ@ return ĠThe Ġinput Ġ[ String ] Ġwhich Ġis Ġguaranteed Ġto Ġend Ġwith Ġthe Ġprovided Ġ[ Char ]. Ċ Ġ* Ċ Ġ*/ Ċ fun ĠString . ensure Trailing ( char : ĠChar ): ĠString Ġ= Ġif Ġ( endsWith ( char )) Ġthis Ġelse Ġ"$ this $ char " Ċ Ċ /** Ċ Ġ* ĠEns ures Ġthat Ġthis Ġ[ String ] Ġends Ġwith Ġthe Ġ'/' Ġ[ Char ]. Ċ Ġ* Ċ Ġ* ĠIf Ġthis Ġ[ String ] Ġalready Ġends Ġwith Ġ'/', Ġthen Ġthe Ġ[ String ] Ġis Ġreturned Ġun alter ed . Ċ Ġ* ĠOtherwise , Ġ'/' Ġis Ġappended Ġand Ġthe Ġresulting Ġ[ String ] Ġis Ġreturned . Ċ Ġ* Ċ Ġ* Ġ@ return ĠThe Ġinput Ġ[ String ] Ġwhich Ġis Ġguaranteed Ġto Ġend Ġwith Ġ'/ '. Ċ Ġ* Ċ Ġ*/ Ċ fun ĠString . ensure Trailing Slash (): ĠString Ġ= Ġthis . ensure Trailing ('/') Ċ Ċ /** Ċ Ġ* Ġ ĠDetermines Ġwhether Ġthis Ġ[ String ] Ġcontains Ġany Ġwhitespace Ġ[ Char ] Ġas Ġdefined Ġby Ġthe ĠUnicode Ġstandard . Ċ Ġ* Ċ Ġ* Ġ@ return ĠTrue Ġif Ġthis Ġ[ String ] Ġcontains Ġat Ġleast Ġone Ġwhitespace Ġcharacter , Ġfalse Ġif Ġnot . Ċ Ġ*/ Ċ fun ĠString . contains Whitespace (): ĠBoolean Ġ= Ġthis . any Ġ{ Ġit . is Whitespace () Ġ; Ġ} Ċ Ċ /** Ċ Ġ* ĠDetermines Ġwhether Ġthe Ġ[ String ] Ġstarts Ġand Ġend swith Ġwith Ġthe Ġspecified Ġ[ Char ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġchar ĠThe Ġ[ Char ] Ġto Ġcheck Ċ Ġ* Ġ@ return ĠWhether Ġthe Ġ[ String ] Ġstarts Ġand Ġends Ġwith s Ġthe Ġspecified Ġcharacter Ċ Ġ*/ Ċ fun ĠString . starts And EndsWith ( char : ĠChar ): ĠBoolean Ġ= Ġstart sWith ( char ) Ġ&& Ġend sWith ( char ) Ċ Ċ /** Ċ Ġ* ĠEns ures Ġthat Ġthe Ġ[ String ] Ġis Ġdouble - quoted . ĠReturns Ġthe Ġ[ String ] Ġun alter ed Ġif Ġit Ġis Ġalready Ġquoted Ċ Ġ* Ċ Ġ* Ġ@ return ĠThe Ġ[ String ] Ġdouble - quoted Ċ Ġ*/ Ċ fun ĠString . ensure Double Quoted (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( starts And EndsWith ( DOUBLE _ QUOTE ) Ġ&& Ġlength Ġ> Ġ 1 ) Ġthis Ġelse Ġ"$ DOUBLE _ QUOTE $ this $ DOUBLE _ QUOTE " Ċ Ċ /** Ċ Ġ* ĠEns ures Ġthat Ġthe Ġ[ String ] Ġis Ġsingle - quoted . ĠReturns Ġthe Ġ[ String ] Ġun alter ed Ġif Ġit Ġis Ġalready Ġquoted Ċ Ġ* Ċ Ġ* Ġ@ return ĠThe Ġ[ String ] Ġsingle - quoted Ċ Ġ*/ Ċ fun ĠString . ensure Single Quoted (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( starts And EndsWith ( SINGLE _ QUOTE ) Ġ&& Ġlength Ġ> Ġ 1 ) Ġthis Ġelse Ġ"$ SINGLE _ QUOTE $ this $ SINGLE _ QUOTE " Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġsuffix Ġof Ġthe Ġtrimmed Ġversion Ġof Ġthis Ġ[ String ] Ġthat Ġrepresent Ġa Ġvalid ĠJSON Ġobject . Ċ Ġ* ĠIf Ġnone Ġsuch Ġsuffix Ġexists Ġin Ġthe Ġ[ String ], Ġreturn Ġgarbage . Ċ Ġ* Ċ Ġ* ĠThe Ġbehavior Ġof Ġthis Ġfunction Ġdepends Ġon Ġwhether Ġone Ġsuffix Ġof Ġthe Ġ[ String ] Ġis Ġa Ġvalid ĠJSON Ġobject . ĠIf Ġso , Ċ Ġ* Ġthis Ġsuffix Ġis Ġun amb iguous Ġand Ġreturned Ġfrom Ġthis Ġfunction . ĠIf Ġnot , Ġthe Ġfunction Ġwill Ġreturn Ġan Ġarbitrary Ġ[ String ], Ċ Ġ* Ġwhich Ġwould Ġneed Ġto Ġbe Ġchecked Ġseparately Ġwhether Ġit Ġis Ġactually ĠJSON . ĠThis Ġfunction Ġdoes Ġnot Ġknow Ġthis . Ċ Ġ* Ċ Ġ*/ Ċ fun ĠString . maybe Trailing Json (): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġval Ġcharacter Iterator Ġ= ĠString Character Iterator ( this @ maybe Trailing Json ) ĊĠĠĠ Ġvar Ġc Ġ= Ġcharacter Iterator . last () ĊĠĠĠ Ġvar Ġbr ace Count Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġin String Ġ= Ġfalse ĊĠĠĠ Ġvar Ġstart Ġ= Ġtrue ĊĊĠĠĠ Ġ// ĠRead ĠString Ġeither Ġas Ġlong Ġas Ġwe Ġhave Ġnot Ġfully Ġparsed Ġthe ĠJSON Ġor Ġwe Ġread Ġthe Ġbeginning Ġof Ġthe ĠString ĊĠĠĠ Ġwhile Ġ(( brace Count Ġ> Ġ 0 Ġ|| Ġstart ) Ġ&& Ġc Ġ!= ĠCharacter Iterator . DONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdo Ġnot Ġcollect Ġwhitespace ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġc . is Whitespace ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn escaped ĠDouble ĠQuote Ġchanges Ġthe Ġin String Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== ĠDOUBLE _ QUOTE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( character Iterator . previous () Ġ!= ĠBACK SL ASH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin String Ġ= Ġ! in String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Iterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! in String Ġ&& Ġc Ġ== ĠRIGHT _ BRACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! in String Ġ&& Ġc Ġ== ĠLEFT _ BRACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbr ace Count -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġcharacter Iterator . previous () ĊĠĠĠ Ġ} Ċ }. reversed () Ċ Ċ // ĠCharacter ĠTokens Ġthat Ġwe Ġcare Ġabout Ċ private Ġconst Ġval ĠDOUBLE _ QUOTE Ġ= Ġ'"' Ċ private Ġconst Ġval ĠS INGLE _ QUOTE Ġ= Ġ'\'' Ċ private Ġconst Ġval ĠRIGHT _ BRACE Ġ= Ġ' }' Ċ private Ġconst Ġval ĠLEFT _ BRACE Ġ= Ġ'{ ' Ċ private Ġconst Ġval ĠBACK SL ASH Ġ= Ġ'\\ ' Ċ