package Ġio . github . binary foo . tl v Ċ Ċ import Ġio . github . binary foo . Tag Info Ċ import Ġio . github . binary foo . Tag MetaData Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* ĠThe Ġtag Ġin ĠT - L - V . ĠSometimes Ġcalled ĠType Ġbut ĠE MV Ġ 4 . 3 ĠBook Ġ 3 Ġ- ĠB 3 ĠCoding Ġof Ġthe ĠValue ĠField Ġof ĠData ĠObjects Ġuses Ġthe Ġterm . Ċ Ġ*/ Ċ data Ġclass ĠTag Ġconstructor ( val Ġbytes : ĠList < Byte >, Ġval Ġcompliant : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠ Ġconstructor ( bytes : ĠByteArray , Ġcompliant : ĠBoolean Ġ= Ġtrue ) Ġ: Ġthis ( bytes . to Mutable List (), Ġcompliant ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ( comp liant ) Ġ{ ĊĠĠĠĠĠ Ġvalidate ( bytes ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvalidate ( b : ĠList < Byte >) Ġ{ ĊĠĠĠ Ġif Ġ( b . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Tag Ġmust Ġbe Ġconstructed Ġwith Ġa Ġnon - empty Ġbyte Ġarray ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( b . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(( b [ 0 ]. toInt () Ġand Ġ 0 x 1 F ) Ġ== Ġ 0 x 1 F ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" If Ġbit Ġ 6 Ġto Ġbit Ġ 1 Ġare Ġset Ġtag Ġmust Ġnot Ġbe Ġonly Ġone Ġbyte Ġlong ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ(( b [ b . size Ġ- Ġ 1 ]. toInt () Ġand Ġ 0 x 8 0 ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" For Ġmult ib yte Ġtag Ġbit Ġ 8 Ġof Ġthe Ġfinal Ġbyte Ġmust Ġbe Ġ 0 : Ġ" Ġ+ ĠInteger . to HexString ( b [ b . size Ġ- Ġ 1 ]. toInt ())) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( b . size Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. b . size Ġ- Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(( b [ i ]. toInt () Ġand Ġ 0 x 8 0 ) Ġ!= Ġ 0 x 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" For Ġmult ib yte Ġtag Ġbit Ġ 8 Ġof Ġthe Ġinternal Ġbytes Ġmust Ġbe Ġ 1 : Ġ" Ġ+ ĠInteger . to HexString ( b [ i ]. toInt ())) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġhex String : ĠString ĊĠĠĠ Ġget () Ġ= ĠISO Util . hex String ( bytes ) ĊĊĠ Ġval Ġconstructed : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġ( bytes [ 0 ]. toInt () Ġand Ġ 0 x 2 0 ) Ġ== Ġ 0 x 2 0 ĊĊĠ Ġval ĠbyteArray : ĠByteArray ĊĠĠĠ Ġget () Ġ= Ġbytes . toByteArray () ĊĊĠ Ġfun Ġis Construct ed (): ĠBoolean Ġ= Ġconstructed ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠISO Util . hex String ( bytes ) ĊĠ Ġ} ĊĊĠ Ġfun ĠtoString ( tag MetaData : ĠTag MetaData ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠtoString ( tag MetaData . get ( this )) ĊĠ Ġ} ĊĊĠ Ġfun ĠtoString ( tag Info : ĠTag Info ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ"${ ISO Util . hex String ( bytes )} Ġ(${ tag Info . fullName })" ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġfrom Hex ( hex String : ĠString ): ĠTag Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTag ( ISO Util . hex 2 byte ( hex String )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġparse ( buffer : ĠByteBuffer ): ĠTag Ġ= Ġparse ( buffer , ĠComp liant Tag Mode ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġparse ( buffer : ĠByteBuffer , Ġrecognition Mode : ĠTag Recognition Mode ): ĠTag Ġ{ ĊĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠ Ġvar Ġb Ġ= Ġbuffer . get () ĊĠĠĠĠĠ Ġout . write ( b . toInt ()) ĊĠĠĠĠĠ Ġif Ġ(( b . toInt () Ġand Ġ 0 x 1 F ) Ġ== Ġ 0 x 1 F ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġbuffer . get () ĊĠĠĠĠĠĠĠĠĠ Ġout . write ( b . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( recognition Mode . keep Reading ( b , Ġout )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠTag ( out . toByteArray (), Ġrecognition Mode Ġ== ĠComp liant Tag Mode ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ interface ĠTag Recognition Mode Ġ{ ĊĠ Ġfun Ġkeep Reading ( current : ĠByte , Ġall : ĠByteArrayOutputStream ): ĠBoolean Ċ } Ċ Ċ /** Ċ Ġ* ĠFollow s ĠE MV Ġ 4 . 3 ĠBook Ġ 3 , ĠAn nex ĠB ĠRules Ġfor ĠB ER - TL V ĠData ĠObjects Ġto Ġthe Ġletter . Ċ Ġ*/ Ċ object ĠComp liant Tag Mode Ġ: ĠTag Recognition Mode Ġ{ ĊĠ Ġoverride Ġfun Ġkeep Reading ( current : ĠByte , Ġall : ĠByteArrayOutputStream ): ĠBoolean Ġ= Ġ( current . toInt () Ġand Ġ 0 x 8 0 ) Ġ== Ġ 0 x 8 0 Ċ } Ċ Ċ /** Ċ Ġ* ĠE MV Ġ 4 . 3 ĠBook Ġ 3 , ĠAn nex ĠB ĠRules Ġfor ĠB ER - TL V ĠData ĠObjects Ġunless Ġit 's Ġin Ġa Ġlist Ġof Ġspecial Ġcases . Ċ Ġ*/ Ċ class ĠQu irk List Tag Mode ( val Ġnon Standard : ĠSet < String >) Ġ: ĠTag Recognition Mode Ġ{ ĊĠ Ġoverride Ġfun Ġkeep Reading ( current : ĠByte , Ġall : ĠByteArrayOutputStream ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠComp liant Tag Mode . keep Reading ( current , Ġall ) Ġ&& Ġ! non Standard . contains ( all . toByteArray (). to HexString ()) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSeems Ġat Ġleast Ġone Ġvendor Ġread Ġthe Ġfollowing Ġand Ġthought ĠI 'll Ġpick Ġ 9 F 8 0 Ġas Ġthe Ġstart Ġof Ġmy Ġprivate Ġtag Ġrange . Ċ Ġ* ĠAccording Ġto ĠBook Ġ 3 Ġanything Ġgreater Ġthan Ġ 7 F Ġin Ġbyte Ġtwo Ġmeans Ġthe Ġtag Ġis Ġat Ġleast Ġ 3 Ġthree Ġbytes Ġlong , Ġnot Ġtwo . Ċ Ġ* Ċ Ġ* Ġ< blockquote > Ċ Ġ* ĠĠĠĠ ĠThe Ġcoding Ġof Ġprimitive Ġcontext - specific Ġclass Ġdata Ġobjects Ġin Ġthe Ġrange Ġ' 9 F 5 0 ' Ġto Ġ' 9 F 7 F ' Ġis Ġreserved Ġfor Ġthe Ġpayment Ġsystems . Ċ Ġ* ĠĠĠĠ Ġ< footer > Ċ Ġ* ĠĠĠĠ Ġ< cite > EM V Ġ 4 . 3 ĠBook Ġ 3 , ĠAn nex ĠB ĠRules Ġfor ĠB ER - TL V ĠData ĠObjects </ cite > Ċ Ġ* ĠĠĠĠ Ġ</ footer > Ċ Ġ* Ġ</ blockquote > Ċ Ġ*/ Ċ object ĠCommon Vendor Error Mode Ġ: ĠTag Recognition Mode Ġ{ ĊĠ Ġoverride Ġfun Ġkeep Reading ( current : ĠByte , Ġall : ĠByteArrayOutputStream ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠComp liant Tag Mode . keep Reading ( current , Ġall ) Ġ&& Ġ( all . size () Ġ!= Ġ 2 Ġ|| Ġ! is Common Error ( all . toByteArray ())) ĊĠ Ġ} ĊĊĠ Ġfun Ġis Common Error ( tag : ĠByteArray ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Common Error ( tag . to Mutable List ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġis Common Error ( tag : ĠList < Byte >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtag . size Ġ> Ġ 1 Ġ&& Ġ( tag [ 0 ] Ġ== Ġ 0 x 9 F . to Byte () Ġ&& Ġ( tag [ 1 ]. toInt () Ġand Ġ 0 xF 0 ) Ġ== Ġ 0 x 8 0 ) ĊĠ Ġ} Ċ } Ċ Ċ fun Ġhas Common Vendor Error Tag ( tl v : ĠBer T lv ): ĠBoolean Ġ= ĠCommon Vendor Error Mode . is Common Error ( tl v . tag . bytes ) Ċ