/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 2 1 ĠJ ann ik ĠB amber ger Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġde . jb amber ger . ir remote . remote Ċ Ċ import Ġde . jb amber ger . ir remote . remote . Utils . hex ToBytes Ċ import Ġjava . util .* Ċ import Ġkotlin . experimental . inv Ċ Ċ /** Ċ Ġ* Ġ@ author ĠJ ann ik ĠB amber ger Ġ( dev . jb amber ger @ gmail . com ) Ċ Ġ*/ Ċ Ċ internal Ġclass ĠCode Translator Ċ /** Ċ Ġ* Ġone Ġand Ġzero Ġhave Ġto Ġhave Ġthe Ġsame Ġlength . Ċ Ġ* Ċ Ġ* Ġ@ param Ġinit Sequence ĠSequence Ġtransmitted Ġonly Ġonce Ġin Ġthe Ġbeginning Ċ Ġ* Ġ@ param Ġend Sequence Ġ ĠSequence Ġtransmitted Ġonly Ġonce Ġin Ġthe Ġend Ċ Ġ* Ġ@ param Ġzero ĠĠĠĠĠĠĠĠ ĠSequence Ġrepresenting Ġa Ġbinary Ġzero Ċ Ġ* Ġ@ param Ġone ĠĠĠĠĠĠĠĠĠ ĠSequence Ġrepresenting Ġa Ġbinary Ġone Ċ Ġ*/ Ċ private Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinit Sequence : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġend Sequence : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġzero : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġone : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfrequency : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransform : Ġ( String ) Ġ-> ĠByteArray ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturns Ġthe Ġon Ġoff Ġsequence Ġthat Ġis Ġrepresented Ġby Ġthe Ġcode String ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcode String Ġcode ĊĠĠĠĠ Ġ* Ġ@ return Ġon Ġoff Ġsequence Ġof Ġthe Ġcode String ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Code ( code String : ĠString ) Ġ= Ġbuild Raw Code ( transform . invoke ( code String )) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġint Ġarray , Ġwrites Ġthe Ġstart Ġsequence , Ġthen Ġthe Ġbytes Ġrepresented Ġby Ġone Ġand Ġzero ĊĠĠĠĠ Ġ* Ġand Ġfinally Ġthe Ġend Ġsequence . ĠTODO : Ġend i ann ess ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdata Ġthe Ġbytes Ġto Ġbe Ġs and wic hed Ġbetween Ġstart Ġand Ġend ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġencoded Ġsequence ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Raw Code ( data : ĠByteArray ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġinit Sequence . size Ġ+ Ġdata . size Ġ* Ġ( 8 Ġ* Ġzero . size ) Ġ+ Ġend Sequence . size ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠInt Array ( size ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( init Sequence , Ġ 0 , Ġcode , Ġ 0 , Ġinit Sequence . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġinit Sequence . size ĊĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 .. 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b . toInt () Ġand Ġ( 1 2 8 Ġshr Ġj ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( zero , Ġ 0 , Ġcode , Ġc , Ġzero . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( one , Ġ 0 , Ġcode , Ġc , Ġone . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( end Sequence , Ġ 0 , Ġcode , Ġc , Ġend Sequence . size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġenum Ġclass ĠIr Code Format Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EC , ĠPAN ASON IC ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġinject s Ġthe Ġinverse Ġof Ġevery Ġbyte Ġinto Ġthe Ġarray . Ġ{ a , Ġb } Ġbecomes Ġ{ a , Ġ~ a , Ġb , Ġ~ b }. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata Ġinput Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġdata Ġwith Ġinjected Ġin ver ses ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinject Inverse ( data : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠByteArray ( data . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres [ 2 Ġ* Ġi ] Ġ= Ġdata [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres [ 2 Ġ* Ġi Ġ+ Ġ 1 ] Ġ= Ġdata [ i ]. inv () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Translator ( format : ĠIr Code Format ) Ġ= Ġwhen Ġ( format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Code Format . NE C Ġ-> Ġget N ec Translator () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Code Format . PAN ASON IC Ġ-> Ġget Pan ason ic Translator () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Translator ( format : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Translator ( Ir Code Format . valueOf ( format . uppercase ( Locale . ROOT ))) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget N ec Translator () Ġ= ĠCode Translator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Sequence Ġ= Ġint ArrayOf ( 9 0 0 0 , Ġ 4 5 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Sequence Ġ= Ġint ArrayOf ( 5 6 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzero Ġ= Ġint ArrayOf ( 5 6 0 , Ġ 5 6 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Ġ= Ġint ArrayOf ( 5 6 0 , Ġ 1 6 9 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Ġ= Ġ 3 8 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= Ġ{ Ġinject Inverse ( hex ToBytes ( it )) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Pan ason ic Translator () Ġ= ĠCode Translator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Sequence Ġ= Ġint ArrayOf ( 3 4 5 6 , Ġ 1 7 2 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Sequence Ġ= Ġint ArrayOf ( 4 3 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzero Ġ= Ġint ArrayOf ( 4 3 2 , Ġ 4 3 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġone Ġ= Ġint ArrayOf ( 4 3 2 , Ġ 1 2 9 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Ġ= Ġ 3 7 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= ĠUtils :: hex ToBytes ) ĊĠĠĠ Ġ} Ċ } Ċ