package Ġio . github . an v ell . kot pass . database . header Ċ Ċ import Ġio . github . an v ell . kot pass . constants . C rs Algorithm Ċ import Ġio . github . an v ell . kot pass . errors . Format Error Ċ import Ġio . github . an v ell . kot pass . extensions . b Ċ import Ġio . github . an v ell . kot pass . extensions . next ByteString Ċ import Ġio . github . an v ell . kot pass . models . Binary Data Ċ import Ġok io . Buffered Sink Ċ import Ġok io . Buffered Source Ċ import Ġok io . ByteString Ċ import Ġjava . security . Secure Random Ċ Ċ private Ġobject ĠInner Header Field Id Ġ{ ĊĠĠĠ Ġconst Ġval ĠTermin ator Ġ= Ġ 0 x 0 0 ĊĠĠĠ Ġconst Ġval ĠStream Id Ġ= Ġ 0 x 0 1 ĊĠĠĠ Ġconst Ġval ĠStream Key Ġ= Ġ 0 x 0 2 ĊĠĠĠ Ġconst Ġval ĠBinary Ġ= Ġ 0 x 0 3 Ċ } Ċ Ċ private Ġconst Ġval ĠBinary Flags Size Ġ= Ġ 1 Ċ Ċ data Ġclass ĠDatabase Inner Header ( ĊĠĠĠ Ġval Ġrandom Stream Id : ĠC rs Algorithm , ĊĠĠĠ Ġval Ġrandom Stream Key : ĠByte String , ĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġval Ġbinaries : ĠMap < ByteString , ĠBinary Data > Ġ= Ġlinked Map Of () Ċ ) Ġ{ ĊĊĠĠĠ Ġinternal Ġfun ĠwriteTo ( sink : ĠBuffered Sink ) Ġ= Ġwith ( sink ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Byte ( Inner Header Field Id . Stream Id ) ĊĠĠĠĠĠĠĠ Ġwrite Int Le ( Int . SIZE _ BYTES ) ĊĠĠĠĠĠĠĠ Ġwrite Int Le ( random Stream Id . ordinal ) ĊĊĠĠĠĠĠĠĠ Ġwrite Byte ( Inner Header Field Id . Stream Key ) ĊĠĠĠĠĠĠĠ Ġwrite Int Le ( random Stream Key . size ) ĊĠĠĠĠĠĠĠ Ġwrite ( random Stream Key ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġbinary ) Ġin Ġbinaries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġbinary . getContent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( Inner Header Field Id . Binary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int Le ( data . size Ġ+ ĠBinary Flags Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( if Ġ( binary . memory Protection ) Ġ 0 x 1 Ġelse Ġ 0 x 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite Byte ( Inner Header Field Id . Termin ator ) ĊĠĠĠĠĠĠĠ Ġwrite Int Le ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate () Ġ= Ġwith ( Secure Random ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Inner Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Id Ġ= ĠC rs Algorithm . Ch a Ch a 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Key Ġ= Ġnext ByteString ( 6 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinaries Ġ= Ġlinked Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġread From ( source : ĠBuffered Source ): ĠDatabase Inner Header Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinaries Ġ= Ġlinked Map Of < ByteString , ĠBinary Data >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrandom Stream Id : ĠC rs Algorithm ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrandom Stream Key : ĠByte String ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġsource . read Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġsource . readInt Le (). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( id . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInner Header Field Id . Termin ator Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . read ByteArray ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInner Header Field Id . Stream Id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Id Ġ= ĠC rs Algorithm . values ()[ source . readInt Le ()] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInner Header Field Id . Stream Key Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Key Ġ= Ġsource . read ByteString ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInner Header Field Id . Binary Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmemory Protection Ġ= Ġsource . read Byte () Ġ!= Ġ 0 x 0 . b ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġsource . read ByteArray ( length Ġ- ĠBinary Flags Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinary Ġ= ĠBinary Data . Un compressed ( memory Protection , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinaries [ binary . hash ] Ġ= Ġbinary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠFormat Error . Invalid Content (" Unknown Ġinner Ġheader Ġid : Ġ$ id .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDatabase Inner Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Id Ġ= Ġrandom Stream Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠFormat Error . Invalid Content (" No Ġrandom Ġstream Ġid Ġfound Ġin Ġinner Ġheader "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom Stream Key Ġ= Ġrandom Stream Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠFormat Error . Invalid Content (" No Ġrandom Ġstream Ġkey Ġfound Ġin Ġinner Ġheader "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinaries Ġ= Ġbinaries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ