package Ġme . xx 2 bab . polyfill . ar sc . string pool Ċ Ċ import Ġme . xx 2 bab . polyfill . ar sc . base .* Ċ import Ġme . xx 2 bab . polyfill . ar sc . io . LittleEndian InputStream Ċ import Ġme . xx 2 bab . polyfill . ar sc . io . flip ToArray Ċ import Ġme . xx 2 bab . polyfill . ar sc . io . take LittleEndian Order Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ Ċ class ĠString Pool Ġ: ĠI Par s able Ġ{ ĊĊĠĠĠ Ġ// ĠCommon Ġheader ĊĠĠĠ Ġlateinit Ġvar Ġheader : ĠHeader ĊĊĠĠĠ Ġvar Ġstring Count : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġstyle Count : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġflag : ĠInt Ġ= ĠINVALID _ VALUE _ INT ĊĠĠĠ Ġvar Ġstring Start Position : ĠInt Ġ= ĠINVALID _ VALUE _ INT ĊĠĠĠ Ġvar Ġstyle Start Position : ĠInt Ġ= ĠINVALID _ VALUE _ INT ĊĊĠĠĠ Ġ// ĠThe Ġheader Ġhas Ġa Ġlittle Ġbit Ġpadding Ġbefore Ġmove Ġto Ġstring Ġoffset Ġarray Ċ // ĠĠĠ Ġvar Ġpadding Size : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġlateinit Ġvar Ġstring Offsets : ĠInt Array ĊĠĠĠ Ġlateinit Ġvar Ġstyle Offsets : ĠInt Array ĊĠĠĠ Ġlateinit Ġvar Ġstring Byte Arrays : ĠArray < ByteArray > ĊĠĠĠ Ġlateinit Ġvar Ġstyles Byte Arrays : ĠArray < ByteArray > ĊĠĠĠ Ġlateinit Ġvar Ġstrings : ĠArray < String ?> ĊĠĠĠ Ġlateinit Ġvar Ġstyles : ĠArray < String ?> ĊĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġparse ( input : ĠL ittle Endian InputStream , Ġstart : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . seek ( start ) ĊĠĠĠĠĠĠĠ Ġheader Ġ= ĠHeader () ĊĠĠĠĠĠĠĠ Ġheader . parse ( input , Ġstart ) ĊĊĠĠĠĠĠĠĠ Ġstring Count Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠ Ġstyle Count Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠ Ġflag Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠ Ġstring Start Position Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠ Ġstyle Start Position Ġ= Ġinput . readInt () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġblock Ġis Ġpopulated Ġat Ġvery Ġbeginning Ġplace , Ġso ĠInt Ġis Ġquite Ġenough Ġto Ġstore Ġand Ġlong Ġis Ġsafe Ġto Ġconvert Ċ // ĠĠĠĠĠĠĠ Ġpadding Size Ġ= Ġheader . start . toInt () Ġ+ Ġheader . head Size Ġ- Ġinput . file Pointer . toInt () ĊĠĠĠĠĠĠĠ Ġinput . seek ( header . start Ġ+ Ġheader . head Size ) ĊĊĠĠĠĠĠĠĠ Ġstring Offsets Ġ= Ġif Ġ( string Count Ġ> Ġ 0 ) ĠInt Array ( string Count ) Ġ{ Ġinput . readInt () Ġ} Ġelse ĠInt Array ( 0 ) ĊĠĠĠĠĠĠĠ Ġstyle Offsets Ġ= Ġif Ġ( style Count Ġ> Ġ 0 ) ĠInt Array ( style Count ) Ġ{ Ġinput . readInt () Ġ} Ġelse ĠInt Array ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġinput . seek ( header . start Ġ+ Ġstring Start Position ) ĊĊĠĠĠĠĠĠĠ Ġstrings Ġ= ĠArray ( string Count ) Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġstring Byte Arrays Ġ= Ġif Ġ( string Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( string Count ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġif Ġ( i Ġ< Ġstring Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( string Offsets [ i Ġ+ Ġ 1 ] Ġ- Ġstring Offsets [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( style Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( style Start Position Ġ- Ġstring Offsets [ i ] Ġ- Ġstring Start Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( header . chunk Size Ġ- Ġstring Start Position Ġ- Ġstring Offsets [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read ( array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrings [ i ] Ġ= Ġif Ġ( array . isEmpty ()) Ġnull Ġelse ĠUtf Util . byteArray ToString ( array , Ġflag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstyles Ġ= ĠArray ( style Count ) Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġstyles Byte Arrays Ġ= Ġif Ġ( style Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray ( style Count ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġif Ġ( i Ġ< Ġstyle Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( style Offsets [ i Ġ+ Ġ 1 ] Ġ- Ġstyle Offsets [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( header . chunk Size Ġ- Ġstyle Start Position Ġ- Ġstyle Offsets [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read ( array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyles [ i ] Ġ= Ġif Ġ( array . isEmpty ()) Ġnull Ġelse ĠUtf Util . byteArray ToString ( array , Ġflag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto ByteArray (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader Size Ġ= Ġheader . size () ĊĠĠĠĠĠĠĠ Ġval Ġstring Count Size Ġ= Ġsize Of ( string Count ) ĊĠĠĠĠĠĠĠ Ġval Ġstyle Count Size Ġ= Ġsize Of ( style Count ) ĊĠĠĠĠĠĠĠ Ġval Ġflag Size Ġ= Ġsize Of ( flag ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Start Position Size Ġ= Ġsize Of ( string Start Position ) ĊĠĠĠĠĠĠĠ Ġval Ġstyle Start Position Size Ġ= Ġsize Of ( style Start Position ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew String Byte Arrays Ġ= ĠArray ( strings . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġstrings [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ== Ġnull ) ĠByteArray ( 0 ) Ġelse ĠUtf Util . string To ByteArray ( s , Ġflag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstrings Size Ġ= Ġnew String Byte Arrays . sum By Ġ{ Ġit . size Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstrings Byte Aligned Supp lement Count Ġ= Ġ 4 Ġ- Ġstrings Size Ġ% Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġstring Offsets Size Ġ= Ġnew String Byte Arrays . size Ġ* ĠSIZE _ INT ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Style Byte Arrays Ġ= ĠArray ( styles . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġstyles [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ== Ġnull ) ĠByteArray ( 0 ) Ġelse ĠUtf Util . string To ByteArray ( s , Ġflag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstyles Size Ġ= Ġnew Style Byte Arrays . sum By Ġ{ Ġit . size Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstyles Byte Aligned Supp lement Count Ġ= Ġ 4 Ġ- Ġstyles Size Ġ% Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġstyle Offsets Size Ġ= Ġnew Style Byte Arrays . size Ġ* ĠSIZE _ INT ĊĊĠĠĠĠĠĠĠ Ġval Ġnew String Offsets Ġ= Ġcalculate Offsets ( new String Byte Arrays ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Style Offsets Ġ= Ġcalculate Offsets ( new Style Byte Arrays ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Chunk Size Ġ= Ġ( header Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstring Count Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyle Count Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġflag Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstring Start Position Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyle Start Position Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstrings Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstrings Byte Aligned Supp lement Count Ġ% Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstring Offsets Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyles Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyles Byte Aligned Supp lement Count Ġ% Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyle Offsets Size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew String Start Position Ġ= Ġnew Chunk Size Ġ- Ġstyles Size Ġ- Ġstrings Size Ġ- Ġstrings Byte Aligned Supp lement Count Ġ% Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġnew Style Start Position Ġ= Ġif Ġ( styles Size Ġ== Ġ 0 ) Ġ 0 Ġelse Ġnew Chunk Size Ġ- Ġstyles Size Ġ- Ġstyles Byte Aligned Supp lement Count Ġ% Ġ 4 ĊĊĊĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠByteBuffer . allocate ( new Chunk Size ) ĊĠĠĠĠĠĠĠ Ġbf . take LittleEndian Order () ĊĠĠĠĠĠĠĠ Ġbf . put Short ( header . type ) ĊĠĠĠĠĠĠĠ Ġbf . put Short (( header Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstring Count Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyle Count Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġflag Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstring Start Position Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġstyle Start Position Size ). to Short ()) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( new Chunk Size ) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( new String Byte Arrays . size ) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( new Style Byte Arrays . size ) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( flag ) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( new String Start Position ) ĊĠĠĠĠĠĠĠ Ġbf . put Int ( new Style Start Position ) ĊĠĠĠĠĠĠĠ Ġnew String Offsets . forEach Ġ{ Ġbf . put Int ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġnew Style Offsets . forEach Ġ{ Ġbf . put Int ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġnew String Byte Arrays . forEach Ġ{ Ġbf . put ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġzero In Byte : ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( strings Byte Aligned Supp lement Count Ġ!= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstrings Byte Aligned Supp lement Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . put ( zero In Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnew Style Byte Arrays . forEach Ġ{ Ġbf . put ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( styles Byte Aligned Supp lement Count Ġ!= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstyles Byte Aligned Supp lement Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . put ( zero In Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbf . flip ToArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Offsets ( array : ĠArray < ByteArray >): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffsets Ġ= ĠInt Array ( array . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Pointer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlast Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġarray . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġarray [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets [ i ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Size Ġ= Ġs . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pointer Ġ+= Ġlast Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Size Ġ= Ġs . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffsets [ i ] Ġ= Ġcurrent Pointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoffsets ĊĠĠĠ Ġ} Ċ Ċ }