package Ġkay ak . json Ċ Ċ import Ġkay ak . K ay ak Failure Ċ import Ġjava . io . Reader Ċ import Ġjava . io . String Reader Ċ Ċ /** Ċ Ġ* ĠAn Ġimmutable Ġobject Ġthat Ġrepresents Ġa Ġlocation Ġin Ġthe Ġparsed Ġtext . Ċ Ġ*/ Ċ data Ġclass ĠLocation ( ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġabsolute Ġcharacter Ġindex , Ġstarting Ġat Ġ 0 . ĊĠĠ Ġ*/ ĊĠ Ġval Ġoffset : ĠInt , ĊĠ Ġ/** ĊĠĠ Ġ* Ġthe Ġline Ġnumber , Ġstarting Ġat Ġ 1 ĊĠĠ Ġ*/ ĊĠ Ġval Ġline : ĠInt , ĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġcolumn Ġnumber , Ġstarting Ġat Ġ 1 . ĊĠĠ Ġ*/ ĊĠ Ġval Ġcolumn : ĠInt Ċ ) Ċ Ċ /** Ċ Ġ* ĠA Ġstreaming Ġparser Ġfor ĠJSON Ġtext , Ġbased Ġon Ġthe Ġone Ġdefined Ġat Ġ[ minimal - json ]( https :// github . com / ral fst x / minimal - json ), Ġwithout Ġevent Ġhandling . Ċ Ġ*/ Ċ internal Ġclass ĠJson Parser ( private Ġval Ġinput : ĠReader , Ġprivate Ġval Ġbuffer : ĠChar Array ) Ġ{ ĊĠ Ġ/* ĊĠĠ Ġ* Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Offset ĊĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ĊĠĠ Ġ* Ġ[ a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t ] ĠĠĠĠĠĠĠ Ġ< Ġinput ĊĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[ l | m | n | o | p | q | r | s | t | ?| ? ] ĠĠĠ Ġ< Ġbuffer ĊĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ^ ĊĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ Ġindex ĠĠĠĠĠĠĠĠĠĠ Ġfill ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġvar Ġbuffer Offset : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġindex : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġfill : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġline : ĠInt Ġ= Ġ 1 ĊĠ Ġprivate Ġvar Ġline Offset : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġcurrent : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġcapture Buffer Ġ= ĠStringBuilder () ĊĠ Ġprivate Ġvar Ġcapture Start : ĠInt Ġ= Ġ- 1 ĊĠ Ġprivate Ġvar Ġnesting Level : ĠInt Ġ= Ġ 0 ĊĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReads Ġthe Ġentire Ġinput Ġfrom Ġthe Ġgiven Ġreader Ġand Ġparses Ġit Ġas ĠJSON . ĠThe Ġinput Ġmust Ġcontain Ġa ĊĠĠ Ġ* Ġvalid ĠJSON Ġvalue , Ġoptionally Ġpadded Ġwith Ġwhitespace . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠChar acters Ġare Ġread Ġin Ġchunks Ġinto Ġa Ġdefault - sized Ġinput Ġbuffer . ĠHence , Ġwrapping Ġa Ġreader Ġin Ġan ĊĠĠ Ġ* Ġadditional Ġ` BufferedReader ` Ġlikely Ġwon 't Ġimprove Ġreading Ġperformance . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠIllegal Json Syntax Ġif Ġthe Ġinput Ġis Ġnot Ġvalid ĠJSON ĊĠĠ Ġ*/ ĊĠ Ġfun Ġparse (): ĠJson Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġval Ġjson Ġ= Ġread Value () ĊĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġif Ġ(! is EndOf Text ( current )) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġerror (" Unexpected Ġcharacter ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġjson ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread () Ġ{ ĊĠĠĠ Ġif Ġ( index Ġ== Ġfill ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( capture Start Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcapture Buffer . append ( buffer , Ġcapture Start , Ġfill Ġ- Ġcapture Start ) ĊĠĠĠĠĠĠĠ Ġcapture Start Ġ= Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbuffer Offset Ġ+= Ġfill ĊĠĠĠĠĠ Ġfill Ġ= Ġinput . read ( buffer , Ġ 0 , Ġbuffer . size ) ĊĠĠĠĠĠ Ġif Ġ( fill Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( current Ġ== Ġ'\ n '. code ) Ġ{ ĊĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠ Ġline Offset Ġ= Ġbuffer Offset Ġ+ Ġindex ĊĠĠĠ Ġ} ĊĠĠĠ Ġcurrent Ġ= Ġbuffer [ index ++ ]. code ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġskip WhiteSpace () Ġ{ ĊĠĠĠ Ġwhile Ġ( is Whitespace ( current )) Ġ{ ĊĠĠĠĠĠ Ġread () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Value (): ĠJson Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( current ) Ġ{ ĊĠĠĠĠĠ Ġ' n '. code Ġ-> Ġread Null () ĊĠĠĠĠĠ Ġ' t '. code Ġ-> Ġread True () ĊĠĠĠĠĠ Ġ' f '. code Ġ-> Ġread False () ĊĠĠĠĠĠ Ġ'" '. code Ġ-> Ġread String () ĊĠĠĠĠĠ Ġ'[' . code Ġ-> Ġread Array () ĊĠĠĠĠĠ Ġ'{ '. code Ġ-> Ġread Object () ĊĠĠĠĠĠ Ġ'- '. code , Ġin Ġ' 0 '. code .. ' 9 '. code Ġ-> Ġread Number () ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġexpected (" value ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Null (): ĠJson . Null Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġread Required Char (' u ') ĊĠĠĠ Ġread Required Char (' l ') ĊĠĠĠ Ġread Required Char (' l ') ĊĠĠĠ Ġreturn ĠJson . Null ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread True (): ĠJson Boolean Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġread Required Char (' r ') ĊĠĠĠ Ġread Required Char (' u ') ĊĠĠĠ Ġread Required Char (' e ') ĊĠĠĠ Ġreturn ĠJson Boolean . TRUE ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread False (): ĠJson Boolean Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġread Required Char (' a ') ĊĠĠĠ Ġread Required Char (' l ') ĊĠĠĠ Ġread Required Char (' s ') ĊĠĠĠ Ġread Required Char (' e ') ĊĠĠĠ Ġreturn ĠJson Boolean . FALSE ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Required Char ( ch : ĠChar ) Ġ{ ĊĠĠĠ Ġif Ġ(! read Char ( ch )) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected ("' $ ch '") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread String (): ĠJson String Ġ{ ĊĠĠĠ Ġreturn ĠJson String . make ( readString Internal ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Array (): ĠJson Ġ{ ĊĠĠĠ Ġif Ġ(++ nest ing Level Ġ> ĠMAX _ NE ST ING _ LEVEL ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġerror (" N esting Ġtoo Ġdeep ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġread () ĊĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġif Ġ( read Char (' ] ')) Ġ{ ĊĠĠĠĠĠ Ġnesting Level -- ĊĠĠĠĠĠ Ġreturn ĠJson Array . EMPTY _ ARRAY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġelements Ġ= ĠArrayList < Json >( 5 ) ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠĠĠ Ġelements . add ( readValue ()) ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġ} Ġwhile Ġ( read Char (',' )) ĊĠĠĠ Ġif Ġ(! read Char (' ] ')) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" ',' Ġor Ġ' ]' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġnesting Level -- ĊĠĠĠ Ġreturn ĠJson Array . make ( elements ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Object (): ĠJson Ġ{ ĊĠĠĠ Ġif Ġ(++ nest ing Level Ġ> ĠMAX _ NE ST ING _ LEVEL ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġerror (" N esting Ġtoo Ġdeep ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġread () ĊĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġif Ġ( read Char (' } ')) Ġ{ ĊĠĠĠĠĠ Ġnesting Level -- ĊĠĠĠĠĠ Ġreturn ĠJsonObject . EMPTY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproperties Ġ= ĠLinkedHashMap < String , ĠJson >() ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġread Name () ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠĠĠ Ġif Ġ(! read Char (': ')) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġexpected (" ':' ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠĠĠ Ġproperties [ name ] Ġ= Ġread Value () ĊĠĠĠĠĠ Ġskip WhiteSpace () ĊĠĠĠ Ġ} Ġwhile Ġ( read Char (',' )) ĊĊĠĠĠ Ġif Ġ(! read Char (' } ')) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" ',' Ġor Ġ' }' ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġnesting Level -- ĊĊĠĠĠ Ġreturn ĠJsonObject ( properties ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Name (): ĠString Ġ{ ĊĠĠĠ Ġif Ġ( current Ġ!= Ġ'" '. code ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" name ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġread String Internal () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread String Internal (): ĠString Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġstart Capture () ĊĠĠĠ Ġwhile Ġ( current Ġ!= Ġ'" '. code ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Ġ== Ġ'\\ '. code Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġpause Capture () ĊĠĠĠĠĠĠĠĠĠ Ġread Escape () ĊĠĠĠĠĠĠĠĠĠ Ġstart Capture () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Ġ< Ġ 0 x 2 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġexpected (" valid Ġstring Ġcharacter ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġread () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġvalue Ġ= Ġend Capture () ĊĠĠĠ Ġread () ĊĠĠĠ Ġreturn Ġvalue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Escape () Ġ{ ĊĠĠĠ Ġread () ĊĠĠĠ Ġwhen Ġ( current ) Ġ{ ĊĠĠĠĠĠ Ġ'" '. code , Ġ'/ '. code , Ġ'\\ '. code Ġ-> Ġcapture Buffer . append ( current . to Char ()) ĊĠĠĠĠĠ Ġ' b '. code Ġ-> Ġcapture Buffer . append ('\ b ') ĊĠĠĠĠĠ Ġ' f '. code Ġ-> Ġcapture Buffer . append ('\ u 0 0 0 C ') Ġ// Ġkotlin Ġneeds Ġunicode Ġfor Ġ\ f Ġchar Ġ: O ĊĠĠĠĠĠ Ġ' n '. code Ġ-> Ġcapture Buffer . append ('\ n ') ĊĠĠĠĠĠ Ġ' r '. code Ġ-> Ġcapture Buffer . append ('\ r ') ĊĠĠĠĠĠ Ġ' t '. code Ġ-> Ġcapture Buffer . append ('\ t ') ĊĠĠĠĠĠ Ġ' u '. code Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhex Chars Ġ= ĠChar Array ( 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġread () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Hex Digit ( current )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexpected (" hex adecimal Ġdigit ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġhex Chars [ i ] Ġ= Ġcurrent . to Char () ĊĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcapture Buffer . append ( String ( hex Chars ). toInt ( 1 6 ). to Char ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġexpected (" valid Ġescape Ġsequence ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġread () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Number (): ĠJson Number Ġ{ ĊĠĠĠ Ġstart Capture () ĊĠĠĠ Ġread Char ('- ') ĊĠĠĠ Ġval Ġfirst Digit Ġ= Ġcurrent ĊĠĠĠ Ġif Ġ(! read Digit ()) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" digit ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( first Digit Ġ!= Ġ' 0 '. code ) Ġ{ ĊĠĠĠĠĠ Ġwhile Ġ( read Digit ()) Ġ{ ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġread Fraction () ĊĠĠĠ Ġread Exponent () ĊĠĠĠ Ġreturn ĠJson Number . make ( end Capture ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Fraction (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! read Char ('. ')) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! read Digit ()) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" digit ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ( read Digit ()) Ġ{ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Exponent (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! read Char (' e ') Ġ&& Ġ! read Char (' E ')) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! read Char ('+ ')) Ġ{ ĊĠĠĠĠĠ Ġread Char ('- ') ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! read Digit ()) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġexpected (" digit ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ( read Digit ()) Ġ{ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Char ( ch : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( current Ġ!= Ġch . code ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġread () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Digit (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! is Digit ( current )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġread () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstart Capture () Ġ{ ĊĠĠĠ Ġcapture Start Ġ= Ġindex Ġ- Ġ 1 ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpause Capture () Ġ{ ĊĠĠĠ Ġval Ġend Ġ= Ġif Ġ( current Ġ== Ġ- 1 ) Ġindex Ġelse Ġindex Ġ- Ġ 1 ĊĠĠĠ Ġcapture Buffer . append ( buffer , Ġcapture Start , Ġend Ġ- Ġcapture Start ) ĊĠĠĠ Ġcapture Start Ġ= Ġ- 1 ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġend Capture (): ĠString Ġ{ ĊĠĠĠ Ġval Ġstart Ġ= Ġcapture Start ĊĠĠĠ Ġval Ġend Ġ= Ġindex Ġ- Ġ 1 ĊĠĠĠ Ġcapture Start Ġ= Ġ- 1 ĊĠĠĠ Ġif Ġ( capture Buffer . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġcapture Buffer . append ( buffer , Ġstart , Ġend Ġ- Ġstart ) ĊĠĠĠĠĠ Ġval Ġcaptured Ġ= Ġcapture Buffer . toString () ĊĠĠĠĠĠ Ġcapture Buffer . set Length ( 0 ) ĊĠĠĠĠĠ Ġreturn Ġcaptured ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠString ( buffer , Ġstart , Ġend Ġ- Ġstart ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġlocation (): ĠLocation Ġ{ ĊĠĠĠ Ġval Ġoffset Ġ= Ġbuffer Offset Ġ+ Ġindex Ġ- Ġ 1 ĊĠĠĠ Ġval Ġcolumn Ġ= Ġoffset Ġ- Ġline Offset Ġ+ Ġ 1 ĊĠĠĠ Ġreturn ĠLocation ( offset , Ġline , Ġcolumn ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġexpected ( expected : ĠString ): ĠIllegal Json Syntax Ġ{ ĊĠĠĠ Ġif Ġ( is EndOf Text ( current )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġerror (" Unexpected Ġend Ġof Ġinput ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġerror (" Expected Ġ$ expected ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġerror ( message : ĠString ): ĠIllegal Json Syntax Ġ{ ĊĠĠĠ Ġreturn ĠIllegal Json Syntax ( message , Ġlocation ()) ĊĠ Ġ} ĊĊĠ Ġclass ĠIllegal Json Syntax Ġinternal Ġconstructor ( message : ĠString , Ġlocation : ĠLocation ) Ġ: ĠK ay ak Failure ("${ location }: Ġ$ message ") ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ NE ST ING _ LEVEL : ĠInt Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠMIN _ BUFFER _ CAP ACITY : ĠInt Ġ= Ġ 1 0 ĊĠĠĠ Ġprivate Ġval ĠSTART Ġ= ĠLocation ( offset Ġ= Ġ 0 , Ġline Ġ= Ġ 1 , Ġcolumn Ġ= Ġ 1 ) ĊĠĠĠ Ġconst Ġval ĠDEFAULT _ BUFFER _ CAP ACITY : ĠInt Ġ= Ġ 1 0 2 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParses Ġthe Ġgiven Ġinput Ġstring . ĠThe Ġinput Ġmust Ġcontain Ġa Ġvalid ĠJSON Ġvalue , Ġoptionally Ġpadded ĊĠĠĠĠ Ġ* Ġwith Ġwhitespace . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĊĠĠĠĠ Ġ* Ġthe Ġinput Ġstring , Ġmust Ġbe Ġvalid ĠJSON ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegal Json Syntax ĊĠĠĠĠ Ġ* Ġif Ġthe Ġinput Ġis Ġnot Ġvalid ĠJSON ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġof ( input : ĠString , Ġdesired Buffer Capacity : ĠInt ): ĠJson Parser Ġ{ ĊĠĠĠĠĠ Ġif Ġ( input . isEmpty () Ġ|| Ġinput . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsim ulates Ġparsing , Ġavoid Ġreader Ġand Ġbuffer Ġcreation ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegal Json Syntax (" Unexpected Ġend Ġof Ġinput ", ĠSTART ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠJson Parser ( String Reader ( input ), Ġbuffer With ( desired Buffer Capacity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġof ( input : ĠReader , Ġdesired Buffer Capacity : ĠInt ) Ġ= ĠJson Parser ( input , Ġbuffer With ( desired Buffer Capacity )) ĊĊĠĠĠ Ġprivate Ġfun Ġbuffer With ( desired Buffer Capacity : ĠInt ) Ġ= ĠChar Array ( coerce Buffer Capacity ( desired Buffer Capacity )) ĊĊĠĠĠ Ġprivate Ġfun Ġco erce Buffer Capacity ( buffer Capacity : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġif Ġ( buffer Capacity Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" buffer Ġcapacity Ġmust Ġbe Ġgreater Ġthan Ġzero ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠMIN _ BUFFER _ CAP ACITY . coerce At Least ( DEFAULT _ BUFFER _ CAP ACITY . coerce At Most ( buffer Capacity )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Whitespace ( ch : ĠInt ): ĠBoolean Ġ= Ġ( Character . is Whitespace ( ch ) Ġ|| ĠCharacter . is Space Char ( ch )) ĊĊĠĠĠ Ġprivate Ġfun Ġis EndOf Text ( ch : ĠInt ): ĠBoolean Ġ= Ġch Ġ== Ġ- 1 ĊĊĠĠĠ Ġprivate Ġfun Ġis Digit ( ch : ĠInt ): ĠBoolean Ġ= Ġch Ġin Ġ' 0 '. code .. ' 9 '. code ĊĊĠĠĠ Ġprivate Ġfun Ġis Hex Digit ( ch : ĠInt ): ĠBoolean Ġ= Ġ( ch Ġin Ġ' 0 '. code .. ' 9 '. code ) Ġ|| Ġ( ch Ġin Ġ' a '. code .. ' f '. code ) Ġ|| Ġ( ch Ġin Ġ' A '. code .. ' F '. code ) ĊĠ Ġ} Ċ } Ċ