§

����¨ÞgÆ~��ã�������������������ó ��—�d�Z�ddlZddlZddlZddlZddlZddlmZ�ddlm	Z	m
Z
mZmZm
Z
mZmZ�ddlT�ddlmZmZ��ede¦��«��������Z�ede¦��«��������Ze
eef���������Zd	efd
„Zdede	e���������fd
„Zdedefd„Zdedefd„Zdeeef���������defd„Zdededefd„Zdede fd„Z!dedefd„Z"dedefd„Z#dedefd„Z$dedefd„Z%dede
e���������fd„Z&dedeeef���������fd„Z'dede fd „Z(d!ed"edefd#„Z)defd$„Z*d%efd&„Z+d	ede	e���������fd'„Z,dRd	ed)e-de	e���������fd*„Z.d+ed,ed-edefd.„Z/dSd+ed,ed-edefd0„Z0dTdefd1„Z1d2„�Z2d3ed4ede-fd5„Z3	�	�dUd:ed;ed<ed=e-def
d>„Z4d?„�Z5dVdA„Z6dBe7defdC„Z8�G�dD„�dEej9��������¦��«��������Z:�G�dF„�dGe:¦��«��������Z;�G�dH„�dI¦��«��������Z<�G�dJ„�dKe<¦��«��������Z=�G�dL„�dM¦��«��������Z>�G�dN„�dO¦��«��������Z?�G�dP„�dQ¦��«��������Z@dS�)Wz pySim: various utilities
é����N)ÚBytesIO)ÚOptionalÚListÚDictÚAnyÚTupleÚNewTypeÚUnion)Ú*)Úbertlv_encode_tagÚbertlv_encode_lenÚSwHexstrÚ
SwMatchstrÚimsic�����������	������óÄ���—�t����������t����������|�¦��«��������dz���¦��«��������}t����������|�¦��«��������dz��}d|z��t����������d|dz��dz��t����������|�d¦��«��������fz��¦��«��������z���}|S�)z7Converts a string IMSI into the encoded value of the EFé���ú%02xz%01x%sé���é���)Ú
half_round_upÚlenÚswap_nibblesÚrpad)r���ÚlÚoeÚeis���    ú;/home/jenkins/workspace/simtester-sanitize/./pySim/utils.pyÚenc_imsir���4���sb���€�å݈D‰	Œ	A‰
ñ	ô�	€Aå	ˆT‰ŒQ‰€BØ	!‰•l 8°°a±¸1©}½dÀ4ȹn¼nÐ.MÑ#MÑNÔNÑ	N€BØ
€Ió����ÚefÚreturnc�����������������óv��—�t����������|�¦��«��������dk�����rdS�t����������|�dd…���������d¦��«��������dz��}|dz
��}t����������|�dd…���������¦��«�������� ��������������������d¦��«��������}t����������|¦��«��������dk�����rdS�t����������|d���������¦��«��������dz	��dz��}|s|dz
��}|t����������|¦��«��������dz
��k����rdS�|dd…���������}|S�)	z6Converts an EF value to the IMSI string representationé���Nr���é���é���r���Úfr���)r���Úintr���Úrstrip)r ���r���Úswappedr���r���s���     r���Údec_imsir*���=���sË���€�å
ˆ2w„w‚{€{؈t݈BˆqˆsŒGRÑÔ˜1Ñ€AØ	ˆA‰€Aݘ2˜a˜b˜bœ6Ñ"Ô"×)Ò)¨#Ñ.Ô.€GÝ
ˆ7|„|aÒÐ؈tÝ

ˆgaŒj‰/Œ/˜QÑ
 !Ñ	#€BØ
ð�à
ˆa‰CˆØC‰LŒL˜1ÑÒÐ؈tؐ122Œ;€DØ€Kr���c�����������������óF���—�t����������|�¦��«�������� ��������������������d¦��«��������S�)Nr&���)r���Ústrip)r ���s��� r���Ú	dec_iccidr-���P���s���€�ݘÑÔ×!Ò! #Ñ&Ô&Ð&r���Úiccidc�����������������ó<���—�t����������t����������|�d¦��«��������¦��«��������S�)Né���)r���r���©r.���s��� r���Ú	enc_iccidr2���T���s���€�ݝ˜U B™œÑ(Ô(Ð(r���c�����������������óú��—�t����������|�¦��«��������}�t����������|�¦��«��������dk�����rt����������d¦��«��������‚t����������|�¦��«��������dk����rt����������d¦��«��������‚t����������|�¦��«��������dk����r|�t����������t����������|�¦��«��������¦��«��������z
��}�t����������|�¦��«��������dk����rt	����������|�¦��«���������t����������|�¦��«��������dk����r@	�t	����������|�¦��«���������n/#�t����������$�r"�|�t����������t����������|�¦��«��������¦��«��������z
��}�Y�nw�xY�w|�S�)Né���z,ICCID input value must be at least 18 digitsr0���z+ICCID input value must be at most 20 digitsé���)Ústrr���Ú
ValueErrorÚcalculate_luhnÚverify_luhnr1���s��� r���Úsanitize_iccidr:���W���sü���€�Ý‰JŒJ€EÝ
ˆ5z„zB‚€ÝÐGÑHÔHÐHÝ
ˆ5z„zB‚€ÝÐFÑGÔGÐGÝ
ˆ5z„zRÒÐà
••^ EÑ*Ô*Ñ+Ô+Ñ+ˆÝ
ˆ5z„zRÒÐõ�	EÑÔÐÝ
ˆ5z„zRÒÐð	0Ý˜ÑÔÐÐøÝð�	0ð�	0ð�	0à•S¨Ñ.Ô.Ñ/Ô/Ñ/ˆEˆEˆEð	0øøøð�€Ls���Â<C�Ã)C8Ã7C8ÚmccÚmncc�����������������óÞ��—�|� ���������������������¦���«���������}�| ���������������������¦���«���������}t����������|¦��«��������dk����rd}n4t����������|¦��«��������dk����r	d|z���dz���}nt����������|¦��«��������dk����r|dz
��}t����������|�¦��«��������dk����rd}�n1t����������|�¦��«��������dk����rd|�z���}�nt����������|�¦��«��������dk����rd|�z���}�|�d���������|�d���������z���|d���������|�d���������z���z���|d���������|d���������z���z���S�)z,Converts integer MCC/MNC into 3 bytes for EFr���ÚFFFr���Ú0ÚFr$���Ú00)r,���r���©r;���r<���s���  r���Úenc_plmnrC���p���sè���€�ð
�)Š)‰+Œ+€CØ

)Š)‰+Œ+€Cõ�ˆ3x„x1‚}€}؈ˆÝ	ˆS‰ŒQŠˆØC‰i˜#‰oˆˆÝ	ˆS‰ŒQŠˆØˆs‰
ˆå
ˆ3x„x1‚}€}؈ˆÝ	ˆS‰ŒQŠˆØS‰jˆˆÝ	ˆS‰ŒQŠˆØC‰iˆàŒFS˜”V‰O  A¤¨¨Q¬¡Ñ0°C¸´F¸SÀ¼V±OÑDÐDr���Ú
threehexbytesc�����������������óv���—�dddœ}t����������|�¦��«���������t����������|�¦��«��������|d<���t����������|�¦��«��������|d<���|S�)Nr?���rB���r;���r<���©Údec_mcc_from_plmn_strÚdec_mnc_from_plmn_str)rD���Úress���  r���Údec_plmnrJ���‹���sD���€�ؘcÐ
"Ð
"€Cݘ-Ñ(Ô(Ð(Ý& }Ñ5Ô5€CˆJÝ& }Ñ5Ô5€CˆJØ€Jr���Úplmnc�����������������ó²���—�t����������|�¦��«��������}|d���������dz��}|d���������dz��dz	��}|d���������dz��}|dk����r|dk����r|dk����rdS�t����������|||¦��«��������S�)Nr���r���éð���r#���r���éÿ��)Úh2iÚ
derive_mcc©rK���ÚiaÚdigit1Údigit2Údigit3s���     r���Údec_mcc_from_plmnrV���–���si���€�Ý	ˆT‰Œ€BØ
ŒUT‰\€FؐŒed‰l˜qÑ
 €FØ
ŒUT‰\€FØ
‚}€}˜ 3š˜¨6°Sª=¨=؈uݐf˜f fÑ-Ô-Ð-r���c�����������������ó���—�|�d���������}|�d���������}|�d���������}||z���|z���}| ���������������������¦���«��������� ��������������������d¦��«��������S�)Nr���r���r���r@���©Úupperr,���©rK���rS���rT���rU���rI���s���     r���rG���rG��� ���óG���€�Ø
!ŒW€FØ
!ŒW€FØ
!ŒW€FØ
6‰/˜FÑ
"€C؏9Š9‰;Œ;×Ò˜SÑ!Ô!Ð!r���c�����������������ó¸���—�t����������|�¦��«��������}|d���������dz��}|d���������dz��dz	��}|d���������dz��dz	��}|dk����r|dk����r|dk����rdS�t����������|||¦��«��������S�)Nr$���r���rM���r#���r���rN���)rO���Ú
derive_mncrQ���s���     r���Údec_mnc_from_plmnr^���¨���sn���€�Ý	ˆT‰Œ€BØ
ŒUT‰\€FؐŒed‰l˜qÑ
 €FؐŒed‰l˜qÑ
 €FØ
‚}€}˜ 3š˜¨6°Sª=¨=؈uݐf˜f fÑ-Ô-Ð-r���c�����������������ó���—�|�d���������}|�d���������}|�d���������}||z���|z���}| ���������������������¦���«��������� ��������������������d¦��«��������S�)Né���r#���r$���r@���rX���rZ���s���     r���rH���rH���²���r[���r���Útwohexbytesc�����������������óÜ��—�dddœdddœdddœdd	dœd
ddœg}t����������|�¦��«��������}|d���������d
z��|d���������z��}t����������¦���«���������}|D�]+}|d|d���������z��z��r| ��������������������|d���������¦��«���������Œ,|dz��}|dv�r+| ��������������������d¦��«���������| ��������������������d¦��«���������n7|dk����r| ��������������������d¦��«���������n|dk����r| ��������������������d¦��«���������|dz��}|dv�r+| ��������������������d¦��«���������| ��������������������d¦��«���������n=|dz��dk����r| ��������������������d¦��«���������n|dz��dk����r| ��������������������d¦��«���������t����������t	����������|¦��«��������¦��«��������S�)Nr���ÚUTRAN)ÚbitÚnameé���zNG-RANé���zGSM COMPACTr`���z
cdma2000 HRPDr#���zcdma2000 1xRTTr���é���r���rd���re���é�p��)i�@��ri���z
E-UTRAN WB-S1z
E-UTRAN NB-S1i�P��i�`��éŒ���)é€���rj���ÚGSMz
EC-GSM-IoTé„���é†���)rO���ÚsetÚaddÚsortedÚlist)ra���Úact_listrR���Úu16tÚselÚaÚeutran_bitsÚgsm_bitss���        r���Údec_actry���º���s±��€�à˜GÐ$Ð$ؘHÐ%Ð%ؘMÐ*Ð*ؘOÐ,Ð,ØÐ,Ð-Ð-ð€Hõ�

ˆ[Ñ	Ô	€BØˆqŒEQ‰J˜"˜Qœ%Ñ€DÝ

‰%Œ%€Cà
ð�ð�ˆØ1˜˜%œ‘=Ñ!ð�	ØGŠGAf”IÑÔÐøà˜‘-€KØÐ&Ð&Ð&؏ŠÑ Ô Ð ØŠÑ Ô Ð Ð Ø	˜Ò	Ð	؏ŠÑ Ô Ð Ð Ø	˜Ò	Ð	؏ŠÑ Ô Ð àf‰}€HØÐ#Ð#Ð#؏Š‰ŒˆØŠÑÔÐÐØ	
‰˜&Ò	 Ð	 ؏Š‰ŒˆˆØ	
‰˜&Ò	 Ð	 ؏ŠÑÔÐÝ•$s‘)”)ÑÔÐr���Úfivehexbytesc�����������������ó´���—�ddg�dœ}d}d}|�d�|…���������}|�|||z���…���������}t����������|¦��«��������|d<���t����������|¦��«��������|d<���t����������|¦��«��������|d<���|S�)Nr?���©r;���r<���Úactrg���r#���r;���r<���r}���)rG���rH���ry���)rz���rI���Ú
plmn_charsÚ	act_charsÚplmn_strÚact_strs���      r���Údec_xplmn_w_actr‚���Þ���su���€�ؘc¨"Ð
-Ð
-€CØ€JØ€Ià˜K˜Z˜KÔ(€Hà˜: j°9Ñ&<Ð<Ô=€GÝ& xÑ0Ô0€CˆJÝ& xÑ0Ô0€CˆJݘÑ!Ô!€CˆJØ€Jr���c�����������������ór���—�ddg�dœ}d}|�d�|…���������}t����������|¦��«��������|d<���t����������|¦��«��������|d<���|S�)Nr���r|���rg���r;���r<���rF���)rD���rI���r~���r€���s���    r���Ú	dec_xplmnr„���ì���sK���€�ؘA bÐ
)Ð
)€CØ€Jà˜[˜j˜[Ô)€HÝ& xÑ0Ô0€CˆJÝ& xÑ0Ô0€CˆJØ€Jr���Úki_hexÚop_hexc�����������������ó��—�ddl�m}�ddlm}�t	����������t����������|�¦��«��������¦��«��������}t	����������t����������|¦��«��������¦��«��������}| ��������������������||j��������¦��«��������}| ��������������������|¦��«��������}t�����������|||¦��«��������¦��«��������S�)zD
    Run the milenage algorithm to calculate OPC from Ki and OP
    r���)ÚAES)Ústrxor)
ÚCryptodome.Cipherrˆ���ÚCryptodome.Util.strxorr‰���ÚbytesÚh2bÚnewÚMODE_ECBÚencryptÚb2h)r…���r†���rˆ���r‰���Úki_bytesÚop_bytesÚaesÚ	opc_bytess���        r���Úderive_milenage_opcr–���ö���s���€�ð�&Ð%Ð%Ð%Ð%Ð%à-Ð-Ð-Ð-Ð-Ð-õ�•S˜‘[”[Ñ!Ô!€HÝ•S˜‘[”[Ñ!Ô!€HØ

'Š'(˜CœLÑ
)Ô
)€CØ—’˜HÑ%Ô%€I݈vˆvi Ñ*Ô*Ñ+Ô+Ð+r���c�����������	������óÜ���—�t����������t����������t����������t����������|�¦��«��������¦��«��������¦��«��������}dt	����������|ddd…���������d„�|ddd…���������D�¦���«���������z���¦��«��������dz��z
��}|dk����rdn|S�)z=
    Calculate Luhn checksum used in e.g. ICCID and IMEI
    é
���éþÿÿÿNc�����������������óN���—�g�|�]"}t����������t����������|d�z��d¦��«��������¦��«��������‘Œ#S�)r$���r˜���)ÚsumÚdivmod)Ú.0Úds���  r���ú
<listcomp>z"calculate_luhn.<locals>.<listcomp>��s>���€�ð�*/ð�*/ð�*/Ø õ�+.­f°Q¸±U¸BÑ.?Ô.?Ñ*@Ô*@ð�*/ð�*/ð�*/r���r���)rr���Úmapr'���r6���r›���)ÚccÚnumÚcheck_digits���   r���r8���r8�����sŠ���€�õ�s•3˜B™œÑ Ô Ñ
!Ô
!€CØ•s˜3˜r˜v 2˜vœ;ð�*/ð�*/Ø$'¨¨¨"¨¤Ið*/ñ�*/ô�*/ñ�/ñ�0ô�0Ø24ñ5ñ�5€Kà˜rÒ!Ð!ˆ1ˆ1 {Ð2r���Údigitsc�����������������ó¶���—�t����������|�dd…���������¦��«��������}t����������|¦��«��������|�d���������k����r(t����������dt����������|¦��«��������›d|�d���������›¦��«��������‚dS�)zBVerify the Luhn check digit; raises ValueError if it is incorrect.Néÿÿÿÿz%Luhn check digit mismatch: should be z but is )r8���r6���r7���)r¤���Úcds���  r���r9���r9�����sc���€�å	˜˜s ˜sœÑ	$Ô	$€BÝ
ˆ2w„w&˜”*ÒÐ݈jÕPSÐTVÑPWÔPWÐPWÐPWÐY_Ð`bÔYcÐYcÐdÑeÔeÐeð�Ðr���c�����������������óH���—�|�€dS�t����������|�¦��«��������dk����r
|�dd…���������S�dS�)zU
    Derive the MCC (Mobile Country Code) from the first three digits of an IMSI
    Nr���©r���)r���s��� r���Ú
mcc_from_imsirª�����s/���€�ð�€|؈tå
ˆ4y„y1‚}€}ؐBQBŒxˆàˆtr���FÚlongc�����������������ó`���—�|�€dS�t����������|�¦��«��������dk����r|r
|�dd…���������S�|�dd…���������S�dS�)zS
    Derive the MNC (Mobile Country Code) from the 4th to 6th digit of an IMSI
    Nr���rg���r`���r©���)r���r«���s���  r���Ú
mnc_from_imsir­���"��sF���€�ð�€|؈tå
ˆ4y„y1‚}€}Øð�	ؘ˜!˜”9Ðà˜˜!˜”9Ðàˆtr���rS���rT���rU���c�����������������óX���—�d}|�dk����r||�dz��z
��}|dk����r||dz��z
��}|dk����r||z
��}|S�)ze
    Derive decimal representation of the MCC (Mobile Country Code)
    from three given digits.
    r���r���éd���r˜���©�)rS���rT���rU���r;���s���    r���rP���rP���2��sN���€�ð�€Cà
‚~€~؈v˜‰|шØ
‚~€~؈v˜‰{шØ
‚~€~؈v‰
ˆà€Jr���r���c�����������������ój���—�d}|dk����rt����������|�||¦��«��������S�|�dk����r||�dz��z
��}|dk����r||z
��}|S�)zy
    Derive decimal representation of the MNC (Mobile Network Code)
    from two or (optionally) three given digits.
    r���r���r˜���)rP���)rS���rT���rU���r<���s���    r���r]���r]���D��sT���€�ð�€Cð�‚~€~ݘ& &¨&Ñ1Ô1Ð1à
‚~€~؈v˜‰{шØ
‚~€~؈v‰
ˆà€Jr���c�����������������ó`��—�|�Rt����������|�¦��«��������dk����r0d ��������������������d„�|�D�¦���«���������¦��«��������}�t����������|�d¦��«��������}�nt����������d¦��«��������‚|Wt����������|¦��«��������dk����r5|}�	�t	����������|�¦��«��������}n1#�t����������$�r}t����������d¦��«��������|‚d}~ww�xY�wt����������d¦��«��������‚|�S�)	a��
    The ADM pin can be supplied either in its hexadecimal form or as
    ascii string. This function checks the supplied opts parameter and
    returns the pin_adm as hex encoded string, regardless in which form
    it was originally supplied by the user
    Nrh���Ú�c�����������������ó2���—�g�|�]}d�t����������|¦��«��������z��‘ŒS�)r���)Úord©r���Úxs���  r���rŸ���z$sanitize_pin_adm.<locals>.<listcomp>b��s#���€�ÐBÐBÐB°Q˜v­¨Q©¬Ñ0ÐBÐBÐBr���r%���z&PIN-ADM needs to be <=8 digits (ascii)z1PIN-ADM needs to be hex encoded using this optionz3PIN-ADM needs to be exactly 16 digits (hex encoded))r���Újoinr���r7���r���)Úpin_admÚpin_adm_hexÚ
try_encodeÚexcs���    r���Úsanitize_pin_admr½���X��sÙ���€�ð�Ð݈w‰<Œ<˜1ÒÐØ—g’gÐBÐB¸'ÐBÑBÔBÑCÔCˆGݘ7 BÑ'Ô'ˆGˆGõ�ÐEÑFÔFÐFàÐ݈{ÑÔ˜rÒ!Ð!Ø!ˆGð
_Ý  ™\œ\

øÝð�
_ð�
_ð�
_Ý Ð!TÑUÔUÐ[^Ð^øøøøð
_øøøõ�ÐRÑSÔSÐSà€Ns���Á-A=�Á=
BÂBÂBc�����������������óŠ��—�t����������|�¦��«��������dk����rdS�|� ��������������������d¦��«��������}	�ddl}| ��������������������|�¦��«��������}|j��������dk����rdS�|j��������dk����rdS�n:#�t
����������$�r-�d}|D�] }ddl}| ��������������������d	|¦��«��������sd
}�nŒ!|rY�dS�Y�nw�xY�wd}|D�] }ddl}| ��������������������d|¦��«��������sd
}�nŒ!|rdS�dS�)z¾
    Validates the given address and returns it's type (FQDN or IPv4 or IPv6)
    Return: 0x00 (FQDN), 0x01 (IPv4), 0x02 (IPv6), None (Bad address argument given)

    TODO: Handle IPv6
    r���Nú.r#���r���rg���r$���Tz	^[0-9_]+$Fz ^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?$)r���ÚsplitÚ	ipaddressÚ
ip_addressÚversionÚ	ExceptionÚreÚmatch)ÚaddrÚ	addr_listrÁ���ÚipaÚinvalid_ipv4ÚirÅ���Ú	fqdn_flags���        r���Ú
get_addr_typerÍ���v��sG��€�õ�ˆ4y„yA‚~€~؈tà—
’
˜3‘”€IðØÐÐÐà×"Ò" 4Ñ(Ô(ˆàŒ;˜!ÒÐؐ4Ø
Œ[˜AÒ
Ð
ؐ4ð�øåð�ð�ð�؈Øð�	ð�	ˆAð�
ˆIˆIˆIØ—8’8˜K¨Ñ+Ô+ð�
Ø$ؐð
ð�ð�	ؐ44ð	ð�	ðøøøð�€IØ
ð�ð�ˆàˆ	ˆ	ˆ	؏xŠxÐ:¸AÑ>Ô>ð�	؈IØˆEð	ð
�ð�؈tàˆ4s���¬$A �ÁA �Á 1BÂBÚswÚpatternc�����������������ó¾���—�|� ���������������������¦���«���������}d}t����������dd¦��«��������D�]1}||���������dk����r|dz���}Œ||���������dk����r|dz���}Œ&|||���������z���}Œ2||k����S�)z%Match given SW against given pattern.r³���r���r#���ú?r·���)ÚlowerÚrange)rÎ���rÏ���Úsw_lowerÚ	sw_maskedrË���s���     r���Úsw_matchrÖ���ª��s|���€�ð�xŠx‰zŒz€HØ€IÝ
1a‰[Œ[ð�0ð�0ˆØ1Œ:˜ÒÐØ! C™ˆIˆIØ
QŒZ˜3Ò
Ð
Ø! C™ˆIˆIà! H¨Q¤KÑ/ˆIˆIà˜ÒÐr���éO���r$���r���TÚwidthÚhspaceÚlspaceÚ
align_leftc�����������������óÒ��—�|�€dS�t����������|�¦��«��������dk����rdS�t����������|�t�����������¬¦��«��������}t����������|¦��«��������|z���}||z��}t����������|�¦��«��������dz
��|z��dz���}g�}	t����������t����������|¦��«��������¦��«��������D�]V}
|�|
d|…���������}|rd}nd}||z��t����������|¦��«��������z��}
d|z��|
z���}
|	 ��������������������|
t����������|¦��«��������z��¦��«���������ŒWd	 ��������������������|	¦��«��������S�)
aZ��Pretty print a list of strings into a tabulated form.

    Args:
            width : total width in characters per line
            space : horizontal space between cells
            lspace : number of spaces before row
            align_lef : Align text to the left side
    Returns:
            multi-line string containing formatted table
    Nr³���r���)Úkeyr���z%%-%dsz%%%dsú ú
)r���ÚmaxÚiterrÓ���ÚappendÚtupler¸���)Ústr_listrØ���rÙ���rÚ���rÛ���Úlongest_strÚcellwithÚcolsÚrowsÚtablerË���Ústr_list_rowÚformat_str_cellÚformat_str_rows���              r���Útabulate_str_listrí���º��s��€�ð�Ð؈rÝ
ˆ8}„}˜ÒÐ؈rݐh¥CÐ(Ñ(Ô(€Kݐ;ÑÔ &Ñ(€HؐHÑ€DÝ‰MŒM˜AÑ $Ñ&¨Ñ*€DØ€EÝ
•%˜‘+”+Ñ
Ô
ð�;ð�;ˆØ   4 Ô(ˆØð�	&Ø&ˆOˆOà%ˆOØ)¨HÑ4½¸LÑ8IÔ8IÑIˆØ ™,¨.Ñ8ˆØ
Š^¥e¨LÑ&9Ô&9Ñ9Ñ:Ô:Ð:Ð:؏9Š9UÑÔÐr���c�����������������ó`��—�|� ���������������������d¦��«��������dk����rk|� ��������������������d¦��«��������}|dk����r|�|dz
�����������}n|�|dz������������}|dz��t����������|�¦��«��������dz
��z
��}|dk����r|�S�|� ��������������������d||z��¦��«��������S�|� ���������������������d¦��«��������dk����rt����������|�¦��«��������dz��r|�S�|� ��������������������d¦��«��������}|dz��r|�S�|dk����r|�|dz
��|…���������}n|�|dz���|dz���…���������}|dz��t����������|�¦��«��������dz
��z
��}|dk����r|�S�|� ��������������������d||dz��z��¦��«��������S�|�S�)ap��Expand a given hexstring to a specified length by replacing "." or ".."
       with a filler that is derived from the neighboring nibbles respective
       bytes. Usually this will be the nibble respective byte before "." or
       "..", execpt when the string begins with "." or "..", then the nibble
       respective byte after "." or ".." is used.". In case the string cannot
       be expanded for some reason, the input string is returned unmodified.

    Args:
            hexstring : hexstring to expand
            length : desired length of the resulting hexstring.
    Returns:
            expanded hexstring
    r¿���r���r���r$���z..r#���)ÚcountÚindexr���Úreplace)Ú	hexstringÚlengthÚposÚfillerÚmissings���     r���Ú
expand_hexr÷���Û��sm��€�ð �‡‚sÑÔ˜qÒ Ð ØoŠo˜cÑ"Ô"ˆØŠ7ˆ7ؘs Q™wÔ'ˆFˆFà˜s Q™wÔ'ˆFà˜1‘*¥ I¡¤°Ñ 2Ñ3ˆØaŠ<ˆ<ØÐà× Ò   f¨wÑ&6Ñ7Ô7Ð7ð�
Š˜Ñ	Ô	 !Ò	#Ð	#݈y‰>Œ>˜AÑð�	ØÐàoŠo˜dÑ#Ô#ˆà‰7ð�	ØÐàŠ7ˆ7ؘs Q™w s˜{Ô+ˆFˆFà˜s Q™w s¨1¡u˜}Ô-ˆFà˜1‘*¥ I¡¤°Ñ 2Ñ3ˆØaŠ<ˆ<ØÐà× Ò   v°¸A±Ñ'>Ñ?Ô?Ð?ð�Ðr���éP���c�����������������ó°���—�t����������|�¦��«��������|dz
��k����rt����������|�¦��«��������dz���}d|z��}dt����������|dz
��¦��«��������z���dz���}|||�z��z
��}|d|z��z
��}|S�)z0Generate a string that contains a boxed heading.r#���ú#z
# %-zs #
)r���r6���)ÚheadingrØ���rI���Úfstrs���    r���Úboxed_heading_strrý�����sm���€�õ�ˆ7|„|e˜a‘iÒÐݐG‘”˜qÑ ˆà

‰+€CØ•c˜% !™)‘n”nÑ$ wÑ.€D؈47ÑÑ€C؈3‰;Ñ€CØ€Jr���Úapduc�����������������óH��—�t����������|�¦��«��������dk����rd}d}d}d|||fS�t����������|�¦��«��������dk����rd}|�d���������}|dk����rd}d}d|||fS�t����������|�¦��«��������dk����r¥|�d���������}|dk����rd}|�d|dz���…���������}t����������|�¦��«��������d|z���k����rd}d|||fS�t����������|�¦��«��������d|z���dz���k����r|�d|z������������}|dk����rd}d|||fS�t����������d	t����������|�¦��«��������||t����������|�dd
…���������¦��«��������fz��¦��«��������‚t����������dt����������|�¦��«��������z��¦��«��������‚)a*��Parse a given command APDU and return case (see also ISO/IEC 7816-3, Table 12 and Figure 26),
    lc, le and the data field.

    Args:
            apdu : hexstring that contains the command APDU
    Returns:
            tuple containing case, lc and le values of the APDU (case, lc, le, data)
    r#���r���r���r���r`���é���r$���r���zRinvalid APDU (%s), Lc=0x%02x (%d) does not match the length (%d) of the data fieldNzinvalid APDU (%s), too short!)r���r7���r‘���)rþ���ÚlcÚleÚdatas���    r���Úparse_command_apdur����sm��€�õ�ˆ4y„yA‚~€~à
ˆØ
ˆØˆØ2r˜4Ð Ð Ý	ˆT‰ŒaŠˆà
ˆØ
!ŒWˆØ
Š7ˆ7؈B؈ؐ2r˜4Ð Ð Ý	ˆT‰ŒQŠˆØ
!ŒWˆØ
Š7ˆ7؈BؐAb˜‘dFŒ|ˆÝˆt‰9Œ9˜˜B™ÒÐàˆBؐr˜2˜tÐ$Ð$Ý
‰YŒY˜!˜b™& 1™*Ò
$Ð
$àa˜"‘f”ˆBؐQŠwˆwؐؐr˜2˜tÐ$Ð$åÐqÝ # D¡	¤	¨2¨rµ3°t¸A¸B¸B´x±=´=ÐAñBñ�Cô�Cð�
Cõ�Ð8½3¸t¹9¼9ÑDÑEÔEÐEr���c�������������������ó��—�e�Zd�ZdZddedee���������dee���������fd„Zd„�Zdefd	„Z	dd„Z
dd
„Zdefd„Zde
fd„Zej��������defd„¦���«���������Zej��������defd„¦���«���������Zdedefd„Zdefd„Zdedee
ef���������fd„Zdefd„ZdS�)Ú
DataObjecta_��A DataObject (DO) in the sense of ISO 7816-4.  Contrary to 'normal' TLVs where one
    simply has any number of different TLVs that may occur in any order at any point, ISO 7816
    has the habit of specifying TLV data but with very spcific ordering, or specific choices of
    tags at specific points in a stream.  This class tries to represent this.Nre���ÚdescÚtagc�����������������óL���—�||�_���������||�_��������||�_��������d|�_��������d|�_��������dS�)zä
        Args:
            name: A brief, all-lowercase, underscore separated string identifier
            desc: A human-readable description of what this DO represents
            tag : The tag associated with this DO
        N)re���r��r��ÚdecodedÚencoded)Úselfre���r��r��s���    r���Ú__init__zDataObject.__init__R��s+���€�ð�ˆŒ	؈Œ	؈ŒØˆŒ؈Œˆˆr���c�����������������ó���—�|�j���������S�©N©re���©r��s��� r���Ú__str__zDataObject.__str___��ó
���€�ØŒyÐr���r!���c�����������������ó&���—�|�j���������›d|�j��������›dS�)Nú(ú))Ú	__class__re���r��s��� r���Ú__repr__zDataObject.__repr__b��s���€�Øœ>˜>˜>¨4¬9¨9¨9Ð5Ð5r���ÚDataObjectChoicec�����������������ó`���—�t����������|t����������¦��«��������rt����������d|�|g¬¦��«��������S�t����������‚)z7OR-ing DataObjects together renders a DataObjectChoice.N©Úmembers)Ú
isinstancer��r��Ú	TypeError©r��Úothers���  r���Ú__or__zDataObject.__or__e��s0���€�åeZÑ(Ô(ð�	å# D°4¸°-Ð@Ñ@Ô@Ð@åˆOr���ÚDataObjectCollectionc�����������������ó`���—�t����������|t����������¦��«��������rt����������d|�|g¬¦��«��������S�t����������‚)z<ADD-ing DataObjects together renders a DataObjectCollection.Nr��)r��r��r"��r��r��s���  r���Ú__add__zDataObject.__add__m��s0���€�åeZÑ(Ô(ð�	å'¨°t¸U°mÐDÑDÔDÐDåˆOr���c�����������������ó���—�|�j���������S�)z>Compute the tag (sometimes the tag encodes part of the value).©r��r��s��� r���Ú_compute_tagzDataObject._compute_tagu��s	���€�àŒxˆr���c�����������������ó���—�|�j���������|�j��������iS�)z,Return a dict in form "name: decoded_value" )re���r
��r��s��� r���Úto_dictzDataObject.to_dicty��s���€�à”	˜4œ<Ð(Ð(r���Údoc�����������������ó���—�dS�)z…Parse the value part of the DO into the internal state of this instance.
        Args:
            do : binary encoded bytes
        Nr°���)r��r*��s���  r���Ú
from_byteszDataObject.from_bytes}��ó���€�€�€�r���c�����������������ó���—�dS�)z’Encode the internal state of this instance into the TLV value part.
        Returns:
            binary bytes encoding the internal state
        Nr°���r��s��� r���Úto_byteszDataObject.to_bytes„��r-��r���c�����������������óÄ���—�|d���������|�j���������k����rt����������d|�|�j���������fz��¦��«��������‚|d���������}|dd|z���…���������}|� ��������������������|¦��«���������|d|z���d…���������S�)aS��Parse binary TLV representation into internal state.  The resulting decoded
        representation is _not_ returned, but just internalized in the object instance!
        Args:
            do : input bytes containing TLV-encoded representation
        Returns:
            bytes remaining at end of 'do' after parsing one TLV/DO.
        r���z%s: Can only decode tag 0x%02xr���r$���N)r��r7���r,��)r��r*��ró���Úvals���    r���Úfrom_tlvzDataObject.from_tlv‹��sw���€�ð�ˆaŒ5D”HÒÐÝÐ=Ø" D¤HÐ-ñ.ñ�/ô�/ð�
/àA”ˆØ1V‘8ŒnˆØŠ˜ÑÔÐà!F‘())Œ}Ðr���c�����������������ó¬���—�|� ���������������������¦���«���������}t����������|� ��������������������¦���«���������¦��«��������t����������t	����������|¦��«��������¦��«��������z���|z���S�)zpEncode internal representation to binary TLV.
        Returns:
            bytes encoded in TLV format.
        )r/��r���r'��r
���r���)r��r1��s���  r���Úto_tlvzDataObject.to_tlvœ��sE���€�ð
�mŠm‰oŒoˆÝ  ×!2Ò!2Ñ!4Ô!4Ñ5Ô5Õ8IÍ#ÈcÉ(Ì(Ñ8SÔ8SÑSÐVYÑYÐYr���Úbinaryc�����������������ó´���—�|d���������}||�j���������k����rt����������d|�|||�j���������fz��¦��«��������‚|� ��������������������|¦��«��������}|� ��������������������¦���«���������|fS�)zºDecode a single DOs from the input data.
        Args:
            binary : binary bytes of encoded data
        Returns:
            tuple of (decoded_result, binary_remainder)
        r���z-%s: Unknown Tag 0x%02x in %s; expected 0x%02x)r��r7���r2��r)��)r��r5��r��Ú	remainders���    r���ÚdecodezDataObject.decode¥��sd���€�ð�QŒiˆØ$”(Š?ˆ?ÝÐLØ" C¨°´Ð:ñ;ñ�<ô�<ð�
<à—M’M &Ñ)Ô)ˆ	Ø—’‘” 	Ð*Ð*r���c�����������������ó*���—�|� ���������������������¦���«���������S�r��)r4��r��s��� r���ÚencodezDataObject.encode´��s���€�؏{Š{‰}Œ}Ðr���©NN©r!���r��©r!���r"��)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6���r���r'���r
��r��r��r!��r$��r'��Údictr)��ÚabcÚabstractmethodrŒ���r,��r/��r2��r4��r���r8��r:��r°���r���r���r��r��L��s¼��€�€�€�€�€�ðQð�Qð
ð�˜Sð�¨°¬
ð�À8ÈCÄ=ð�ð�ð�ð�ðð�ð�ð6˜#ð�6ð�6ð�6ð�6ðð�ð�ð�ðð�ð�ð�ð˜cð�ð�ð�ð�ð)˜ð�)ð�)ð�)ð�)ð�	Ôð˜Uð�ð�ð�ñ�Ôðð�	Ôð˜%ð�ð�ð�ñ�Ôðð˜5ð� Uð�ð�ð�ð�ð"Z˜ð�Zð�Zð�Zð�Zð+˜Uð�+ u¨T°5¨[Ô'9ð�+ð�+ð�+ð�+ð˜ð�ð�ð�ð�ð�ð�r���r��c�������������������óJ���‡�—�e�Zd�ZdZddededefˆ�fd„
Zdefd„Zd	efd
„Z	ˆ�xZ
S�)ÚTL0_DataObjectz2Data Object that has Tag, Len=0 and no Value part.Nre���r��r��c�����������������ó\���•—�t����������¦���«��������� ��������������������|||¦��«���������||�_��������d�S�r��)Úsuperr
��r1��)r��re���r��r��r1��r��s���     €r���r
��zTL0_DataObject.__init__»��s*���ø€�Ý
‰Œ×Ò˜˜t SÑ)Ô)Ð)؈Œˆˆr���r5��c�����������������óR���—�t����������|¦��«��������dk����rt����������‚|�j��������|�_��������d�S�©Nr���)r���r7���r1��r
��)r��r5��s���  r���r,��zTL0_DataObject.from_bytes¿��s&���€�݈v‰;Œ;˜!ÒÐÝÐØ”xˆŒˆˆr���r!���c�����������������ó���—�dS�)Nr���r°���r��s��� r���r/��zTL0_DataObject.to_bytesÄ��s���€�؈sr���r��)r>��r?��r@��rA��r6���r'���r
��rŒ���r,��r/��Ú
__classcell__)r��s���@r���rF��rF��¸��s“���ø€�€�€�€�€�Ø<Ð<ðð�˜Sð�¨ð�°#ð�ð�ð�ð�ð�ð�ð  ð� ð� ð� ð� ð
˜%ð�ð�ð�ð�ð�ð�ð�ð�r���rF��c�������������������ó|���—�e�Zd�ZdZd
dedee���������fd„Zdefd„Zdefd„Zdd	„Z	d
e
deee
f���������fd„Z
de
fd„ZdS�)r"��zÁA DataObjectCollection consits of multiple Data Objects identified by their tags.
    A given encoded DO may contain any of them in any order, and may contain multiple instances
    of each DO.Nre���r��c�����������������ó”���—�||�_���������||�_��������|pg�|�_��������i�|�_��������i�|�_��������d„�|D�¦���«���������|�_��������d„�|D�¦���«���������|�_��������d�S�)Nc�����������������ó���—�i�|�]
}|j���������|“ŒS�r°���r&��©r���Úms���  r���ú
<dictcomp>z1DataObjectCollection.__init__.<locals>.<dictcomp>Ó��s���€�Ð9Ð9Ð9¨A˜qœu aÐ9Ð9Ð9r���c�����������������ó���—�i�|�]
}|j���������|“ŒS�r°���r��rP��s���  r���rR��z1DataObjectCollection.__init__.<locals>.<dictcomp>Ô��s���€�Ð;Ð;Ð;¨a ¤¨Ð;Ð;Ð;r���)re���r��r��Úmembers_by_tagÚmembers_by_name)r��re���r��r��s���    r���r
��zDataObjectCollection.__init__Í��s]���€�؈Œ	؈Œ	ؐ} "ˆŒØ ˆÔØ!ˆÔØ9Ð9°Ð9Ñ9Ô9ˆÔØ;Ð;°7Ð;Ñ;Ô;ˆÔÐÐr���r!���c�����������������ód���—�d„�|�j���������D�¦���«���������}|�j��������›dd ��������������������|¦��«��������›dS�)Nc�����������������ó,���—�g�|�]}t����������|¦��«��������‘ŒS�r°���©r6���r¶���s���  r���rŸ���z0DataObjectCollection.__str__.<locals>.<listcomp>×��s���€�Ð4Ð4Ð4 !•s˜1‘v”vÐ4Ð4Ð4r���r��ú,r��)r��re���r¸���©r��Úmember_strss���  r���r��zDataObjectCollection.__str__Ö��s:���€�Ø4Ð4 t¤|Ð4Ñ4Ô4ˆØœ9˜9˜9 c§h¢h¨{Ñ&;Ô&;Ð&;Ð&;Ð<Ð<r���c�����������������ód���—�d„�|�j���������D�¦���«���������}|�j��������›dd ��������������������|¦��«��������›dS�)Nc�����������������ó,���—�g�|�]}t����������|¦��«��������‘ŒS�r°���©Úreprr¶���s���  r���rŸ���z1DataObjectCollection.__repr__.<locals>.<listcomp>Û��s���€�Ð5Ð5Ð5 1•t˜A‘w”wÐ5Ð5Ð5r���r��rY��r��)r��r��r¸���rZ��s���  r���r��zDataObjectCollection.__repr__Ú��s:���€�Ø5Ð5¨¬Ð5Ñ5Ô5ˆØœ>˜>˜>¨3¯8ª8°KÑ+@Ô+@Ð+@Ð+@ÐAÐAr���c�����������������ó���—�t����������|t����������¦��«��������r*|�j��������|j��������z���}t����������|�j��������|�j��������|¦��«��������S�t����������|t
����������¦��«��������r$t����������|�j��������|�j��������|�j��������|gz���¦��«��������S�t����������‚)zDExtending DataCollections with other DataCollections or DataObjects.)r��r"��r��re���r��r��r��©r��r ��r��s���   r���r$��zDataObjectCollection.__add__Þ��so���€�åeÕ1Ñ2Ô2ð�	à”l U¤]Ñ2ˆGÝ'¨¬	°4´9¸gÑFÔFÐFÝ
˜zÑ
*Ô
*ð�	å'¨¬	°4´9¸d¼lÈeÈWÑ>TÑUÔUÐUåˆOr���r5��c�����������������óp��—�g�}|}t����������|¦��«��������r |d���������}|dk����r||fS�||�j��������vr-t����������d|�|||�j�������� ��������������������¦���«���������fz��¦��«��������‚|�j��������|���������}| ��������������������|¦��«��������}| ��������������������| ��������������������¦���«���������¦��«���������t����������|¦��«��������° ||fS�)a��Decode any number of DOs from the collection until the end of the input data,
        or uninitialized memory (0xFF) is found.
        Args:
            binary : binary bytes of encoded data
        Returns:
            tuple of (decoded_result, binary_remainder)
        r���éÿ���ú)%s: Unknown Tag 0x%02x in %s; expected %s)r���rT��r7���Úkeysr2��râ���r)��)r��r5��rI���r7��r��Úobjs���      r���r8��zDataObjectCollection.decodeë��sÕ���€�ð�ˆØˆ	å)‰nŒnð�	&ؘA”,ˆCؐdŠ{ˆ{ؘYÐ'Ð'ؘ$Ô-Ð-Ð-Ý Ð!LØ"&¨¨Y¸Ô8K×8PÒ8PÑ8RÔ8RÐ!Sñ"Tñ�Uô�Uð�UàÔ% cÔ*ˆCàŸš YÑ/Ô/ˆIàJŠJs—{’{‘}”}Ñ%Ô%Ð%õ�)‰nŒnð�	&ð�YÐÐr���c�����������������ó°���—�t����������¦���«���������}|D�]D}|� ��������������������|d���������¦��«��������}| ��������������������| ��������������������¦���«���������¦��«���������ŒE|S�rJ��)Ú	bytearrayrU��râ���r4��)r��r
��rI���rË���rf��s���     r���r:��zDataObjectCollection.encode��sS���€�݉kŒkˆØð�	%ð�	%ˆAØ×&Ò& q¨¤tÑ,Ô,ˆCØJŠJs—z’z‘|”|Ñ$Ô$Ð$Ð$؈
r���r;��r=��)r>��r?��r@��rA��r6���r���r
��r��r��r$��rŒ���r���r���r8��r:��r°���r���r���r"��r"��È��sÞ���€�€�€�€�€�ðð�ð<ð�<˜Sð�<¨°¬
ð�<ð�<ð�<ð�<ð=˜ð�=ð�=ð�=ð�=ðB˜#ð�Bð�Bð�Bð�Bð
ð�
ð�
ð�
ð ˜Uð�  u¨T°5¨[Ô'9ð� ð� ð� ð� ð4 ð�ð�ð�ð�ð�ð�r���r"��c�������������������óL���—�e�Zd�ZdZd„�Zd	d„Zdedeeef���������fd„Z	defd„Z
dS�)
r��zªOne Data Object from within a choice, identified by its tag.
    This means that exactly one member of the choice must occur, and which one occurs depends
    on the tag.c�����������������ó���—�t�����������‚)zRWe overload the add operator here to avoid inheriting it from DataObjecCollection.)r��r��s���  r���r$��zDataObjectChoice.__add__��s���€�åˆr���r!���c�����������������ó���—�t����������|t����������¦��«��������r*|�j��������|j��������z���}t����������|�j��������|�j��������|¦��«��������S�t����������|t
����������¦��«��������r$t����������|�j��������|�j��������|�j��������|gz���¦��«��������S�t����������‚)zROR-ing a Choice to another choice extends the choice, as does OR-ing a DataObject.)r��r��r��re���r��r��r��ra��s���   r���r!��zDataObjectChoice.__or__��so���€�åeÕ-Ñ.Ô.ð�	à”l U¤]Ñ2ˆGÝ# D¤I¨t¬y¸'ÑBÔBÐBÝ
˜zÑ
*Ô
*ð�	å# D¤I¨t¬y¸$¼,È%ÈÑ:PÑQÔQÐQåˆOr���r5��c�����������������ó��—�|d���������}|dk����rd|fS�||�j���������vr-t����������d|�|||�j��������� ��������������������¦���«���������fz��¦��«��������‚|�j���������|���������}| ��������������������|¦��«��������}| ��������������������¦���«���������|fS�)zÇDecode a single DOs from the choice based on the tag.
        Args:
            binary : binary bytes of encoded data
        Returns:
            tuple of (decoded_result, binary_remainder)
        r���rc��Nrd��)rT��r7���re��r2��r)��)r��r5��r��rf��r7��s���     r���r8��zDataObjectChoice.decode#��s˜���€�ð�QŒiˆØ$Š;ˆ;ؘ&>Ð!ؐdÔ)Ð)Ð)ÝÐHØ" C¨°Ô1D×1IÒ1IÑ1KÔ1KÐLñMñ�Nô�Nð�
NàÔ! #Ô&ˆØ—L’L Ñ(Ô(ˆ	Ø—’‘
”
˜yÐ)Ð)r���c�����������������óÂ���—�|�j���������t����������|¦��«��������d������������������}t����������| ��������������������¦���«���������¦��«��������d���������|_��������| ��������������������¦���«���������S�rJ��)rU��rr���Úvaluesr
��r4��)r��r
��rf��s���   r���r:��zDataObjectChoice.encode5��sF���€�ØÔ"¥4¨¡=¤=°Ô#3Ô4ˆÝ˜7Ÿ>š>Ñ+Ô+Ñ,Ô,¨QÔ/ˆŒØzŠz‰|Œ|Ðr���Nr<��)r>��r?��r@��rA��r$��r!��rŒ���r���rB��r8��r:��r°���r���r���r��r��
��s‡���€�€�€�€�€�ðð�ðð�ð�ð
ð�
ð�
ð�
ð*˜Uð�* u¨T°5¨[Ô'9ð�*ð�*ð�*ð�*ð$ ð�ð�ð�ð�ð�ð�r���r��c�������������������ó¨���—�e�Zd�ZdZddedee���������fd„Zdefd„Zdefd„Zdd	„Z	d
e
deee
f���������fd„Z
de
deee
f���������fd
„Zde
fd„Zde
fd„ZdS�)ÚDataObjectSequenceaD��A sequence of DataObjects or DataObjectChoices. This allows us to express a certain
       ordered sequence of DOs or choices of DOs that have to appear as per the specification.
       By wrapping them into this formal DataObjectSequence, we can offer convenience methods
       for encoding or decoding an entire sequence.Nre���r��c�����������������ó4���—�|pg�|�_���������||�_��������||�_��������d�S�r��)Úsequencere���r��)r��re���r��rr��s���    r���r
��zDataObjectSequence.__init__A��s���€�Ø ˜ BˆŒ
؈Œ	؈Œ	ˆ	ˆ	r���r!���c�����������������ód���—�d„�|�j���������D�¦���«���������}|�j��������›dd ��������������������|¦��«��������›dS�)Nc�����������������ó,���—�g�|�]}t����������|¦��«��������‘ŒS�r°���rX��r¶���s���  r���rŸ���z.DataObjectSequence.__str__.<locals>.<listcomp>G��s���€�Ð5Ð5Ð5 !•s˜1‘v”vÐ5Ð5Ð5r���r��rY��r��)rr��re���r¸���rZ��s���  r���r��zDataObjectSequence.__str__F��s:���€�Ø5Ð5 t¤}Ð5Ñ5Ô5ˆØœ9˜9˜9 c§h¢h¨{Ñ&;Ô&;Ð&;Ð&;Ð<Ð<r���c�����������������ód���—�d„�|�j���������D�¦���«���������}|�j��������›dd ��������������������|¦��«��������›dS�)Nc�����������������ó,���—�g�|�]}t����������|¦��«��������‘ŒS�r°���r^��r¶���s���  r���rŸ���z/DataObjectSequence.__repr__.<locals>.<listcomp>K��s���€�Ð6Ð6Ð6 1•t˜A‘w”wÐ6Ð6Ð6r���r��rY��r��)rr��r��r¸���rZ��s���  r���r��zDataObjectSequence.__repr__J��s:���€�Ø6Ð6¨¬
Ð6Ñ6Ô6ˆØœ>˜>˜>¨3¯8ª8°KÑ+@Ô+@Ð+@Ð+@ÐAÐAr���c�����������������óF��—�t����������|d¦��«��������r$t����������|�j��������|�j��������|�j��������|gz���¦��«��������S�t����������|d¦��«��������r$t����������|�j��������|�j��������|�j��������|gz���¦��«��������S�t����������|d¦��«��������r(t����������|�j��������|�j��������|�j��������|j��������z���¦��«��������S�dS�)z>Add (append) a DataObject or DataObjectChoice to the sequence.r��r��rp��N)r��rp��re���r��rr��r��s���  r���r$��zDataObjectSequence.__add__N��s¦���€�åe˜\Ñ*Ô*ð�	\Ý% d¤i°´¸D¼MÈUÈGÑ<SÑTÔTÐTÝ
˜Ð1Ñ
2Ô
2ð�	\Ý% d¤i°´¸D¼MÈUÈGÑ<SÑTÔTÐTÝ
˜Ð3Ñ
4Ô
4ð�	\Ý% d¤i°´¸D¼MÈEÌNÑ<ZÑ[Ô[Ð[ð	\ð�	\r���r5��c�����������������ó„���—�|}g�}|�j���������D�]1}| ��������������������|¦��«��������\��}}|r| ��������������������|¦��«���������Œ2||fS�)zÛDecode a sequence by calling the decoder of each element in the sequence.
        Args:
            binary : binary bytes of encoded data
        Returns:
            tuple of (decoded_result, binary_remainder)
        )rr��r8��râ���)r��r5��r7��rI���ÚeÚrs���      r���r8��zDataObjectSequence.decodeX��sW���€�ð�ˆ	؈ؔð�	ð�	ˆAØŸXšX iÑ0Ô0‰NˆQ	Øð�
Ø—
’
˜1‘
”

øؐYÐÐr���r*��c�����������������óø���—�|}g�}t����������|¦��«��������rd|� ��������������������|¦��«��������\��}}|r| ��������������������|¦��«���������t����������|¦��«��������t����������|¦��«��������k�����r|}n|}nt����������|¦��«��������°d||fS�)zÝDecode multiple occurrences of the sequence from the binary input data.
        Args:
            do : binary input data to be decoded
        Returns:
            list of results of the decoder of this sequences
        )r���r8��râ���)r��r*��r7��rI���rz��Ú
remainder2s���      r���Údecode_multizDataObjectSequence.decode_multih��s‹���€�ð�ˆ	؈ݐ)‰nŒnð�	Ø"Ÿkšk¨)Ñ4Ô4‰OˆQ
Øð�
Ø—
’
˜1‘
”

ݐ:‰Œ¥ Y¡¤Ò/Ð/Ø&		à&	Øõ�)‰nŒnð�	ð�YÐÐr���c�����������������ó€���—�t����������¦���«���������}d}|�j��������D�]%}|| ��������������������||���������¦��«��������z
��}|dz
��}Œ&|S�)zIEncode a sequence by calling the encoder of each element in the sequence.r���r���)rh��rr��r:��)r��r
��r��rË���ry��s���     r���r:��zDataObjectSequence.encode}��sK���€�å‘+”+ˆØ
ˆØ”ð�	ð�	ˆAØq—x’x ¨¤
Ñ+Ô+Ñ+ˆGØ
‰FˆAˆA؈r���c�����������������ó\���—�t����������¦���«���������}|D�]}||� ��������������������|¦��«��������z
��}Œ|S�)zîEncode multiple occurrences of the sequence from the decoded input data.
        Args:
            decoded : list of json-serializable input data; one sequence per list item
        Returns:
            binary encoded output data
        )rh��r:��)r��r
��r��rž���s���    r���Úencode_multizDataObjectSequence.encode_multi†��s7���€�õ�‘+”+ˆØð�	&ð�	&ˆAØt—{’{ 1‘~”~Ñ%ˆGˆG؈r���r;��)r!���rp��)r>��r?��r@��rA��r6���r���r
��r��r��r$��rŒ���r���rr���r8��r}��r:��r€��r°���r���r���rp��rp��;��s(��€�€�€�€�€�ð7ð�7ð
ð�˜Sð�¨°¬
ð�ð�ð�ð�ð
=˜ð�=ð�=ð�=ð�=ðB˜#ð�Bð�Bð�Bð�Bð\ð�\ð�\ð�\ð
 ˜Uð�
  u¨T°5¨[Ô'9ð�
 ð�
 ð�
 ð�
 ð  ˜uð� ¨¨t°U¨{Ô);ð� ð� ð� ð� ð* ð�ð�ð�ð�ð
 uð�
ð�
ð�
ð�
ð�
ð�
r���rp��c�������������������ó,���—�e�Zd�ZdZdd„Zd„�Zd„�Zd„�ZdS�)ÚCardCommandz$A single card command / instruction.Nc�����������������ón���—�||�_���������||�_��������|pg�|�_��������d„�|�j��������D�¦���«���������|�_��������||�_��������d�S�)Nc�����������������ó6���—�g�|�]}| ���������������������¦���«���������‘ŒS�r°���)rÒ���r¶���s���  r���rŸ���z(CardCommand.__init__.<locals>.<listcomp>š��s ���€�Ð:Ð:Ð: q˜Ÿš™œÐ:Ð:Ð:r���)re���ÚinsÚcla_listr��)r��re���r…��r†��r��s���     r���r
��zCardCommand.__init__–��s=���€�؈Œ	؈ŒØ ˜ BˆŒ
Ø:Ð:¨D¬MÐ:Ñ:Ô:ˆŒ
؈Œ	ˆ	ˆ	r���c�����������������ó���—�|�j���������S�r��r��r��s��� r���r��zCardCommand.__str__��r��r���c�����������������ó0���—�d|�j���������|�j��������|�j��������fz��S�)Nz%s(INS=%02x,CLA=%s))re���r…��r†��r��s��� r���r��zCardCommand.__repr__ ��s���€�Ø$¨¬	°4´8¸T¼]Ð'KÑKÐKr���c�����������������óì���—�t����������|t����������¦��«��������sd|z��}| ��������������������¦���«���������}|�j��������D�]=}d}t	����������dd¦��«��������D�]}||���������dk����r|dz
��}Œ|||���������z
��}Œ ||k����r�dS�Œ>dS�)z6Does the given CLA match the CLA list of the command?.z%02ur³���r���r$���r·���TF)r��r6���rÒ���r†��rÓ���)r��ÚclaÚ	cla_matchÚ
cla_maskedrË���s���     r���Ú	match_clazCardCommand.match_cla£��sž���€�å˜#sÑ#Ô#ð�	ؘ3‘,ˆC؏iŠi‰kŒkˆØœð�	ð�	ˆI؈Jݘ1˜a‘[”[ð�
)ð�
)Ø˜Q”< 3Ò&Ð&Ø #Ñ%JJà # a¤&Ñ(JJؘYÒ&Ð&ؐttð�'àˆur���r;��)r>��r?��r@��rA��r
��r��r��r��r°���r���r���r‚��r‚��“��s^���€�€�€�€�€�Ø.Ð.ðð�ð�ð�ðð�ð�ðLð�Lð�Lðð�ð�ð�ð�r���r‚��c�������������������ó6���—�e�Zd�ZdZg�fd„Zd„�Zd„�Zd„�Zdd„ZdS�)	ÚCardCommandSetz@A set of card instructions, typically specified within one spec.c�����������������ó6���—�||�_���������d„�|D�¦���«���������|�_��������d�S�)Nc�����������������ó���—�i�|�]
}|j���������|“ŒS�r°���)r…��)r���Úcs���  r���rR��z+CardCommandSet.__init__.<locals>.<dictcomp>¹��s���€�Ð,Ð,Ð, !Q”U˜AÐ,Ð,Ð,r���)re���Úcmds)r��re���r“��s���   r���r
��zCardCommandSet.__init__·��s"���€�؈Œ	Ø,Ð, tÐ,Ñ,Ô,ˆŒ	ˆ	ˆ	r���c�����������������ó���—�|�j���������S�r��r��r��s��� r���r��zCardCommandSet.__str__»��r��r���c�����������������ó���—�|�j���������|���������S�r��)r“��)r��Úidxs���  r���Ú__getitem__zCardCommandSet.__getitem__¾��s���€�ØŒy˜Œ~Ðr���c�����������������óv��—�t����������|t����������¦��«��������rI|j��������|�j��������v�r*t	����������d|�|j��������|�j��������|j�����������������fz��¦��«��������‚||�j��������|j��������<���d�S�t����������|t
����������¦��«��������r3|j�������� ��������������������¦���«���������D�]}|j��������|���������|�j��������|<���Œd�S�t	����������|�›d|›¦��«��������‚)Nz"%s: INS 0x%02x already defined: %sz$: Unsupported type to add operator: )r��r‚��r…��r“��r7���r��re��)r��r ��r’��s���   r���r$��zCardCommandSet.__add__Á��sÛ���€�ݐe[Ñ)Ô)ð�
	LØŒy˜DœIÐ%Ð%Ý Ð!EØ"&¨¬	°4´9¸U¼YÔ3GÐ!Hñ"Iñ�Jô�Jð�Jà#(ˆDŒIe”iÑ Ð Ð Ý
˜~Ñ
.Ô
.ð�	LØ”Z—_’_Ñ&Ô&ð�
-ð�
-Ø$œz¨!œ}”	˜!‘ð
-ð�
-õ�Ø>B¸d¸dÀEÀEÐJñLô�Lð�
Lr���Nc�����������������ó†���—�t����������|¦��«��������}||�j��������vrdS�|�j��������|���������}|r| ��������������������|¦��«��������sdS�|S�)z*look-up the command within the CommandSet.N)r'���r“��r��)r��r…��rŠ��Úcmds���    r���ÚlookupzCardCommandSet.lookupÎ��sO���€�å#‰hŒhˆØd”iÐÐؐ4ØŒi˜ŒnˆØð�	s—}’} SÑ)Ô)ð�	ؐ4؈
r���r��)	r>��r?��r@��rA��r
��r��r—��r$��r›��r°���r���r���r��r��´��su���€�€�€�€�€�ØJÐJà"$ð�-ð�-ð�-ð�-ðð�ð�ðð�ð�ðLð�Lð�Lðð�ð�ð�ð�ð�r���r��)F)r���r��)r×���r$���r���T)rø���)ArA��ÚjsonrC��ÚstringÚdatetimeÚargparseÚior���Útypingr���r���r���r���r���r	���r
���Ú
osmocom.utilsÚosmocom.tlvr���r
���r6���r���r���ÚHexstrÚResTupler���r*���r-���r2���r'���r:���rC���rB��rJ���rV���rG���r^���rH���ry���r‚���r„���r–���r8���r9���rª���Úboolr­���rP���r]���r½���rÍ���rÖ���rí���r÷���rý���rŒ���r��ÚABCr��rF��r"��r��rp��r‚��r��r°���r���r���ú<module>r¨�����s2��ððð�ð�€€€Ø�
€
€
€
�
€
€
€
Ø�€€€Ø�€€€Ø�Ð�Ð�Ð�Ð�Ð�Ø�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CÐ�CØ�Ð�Ð�Ð�Ø�<Ð�<Ð�<Ð�<Ð�<Ð�<Ð�<Ð�<ðD�ˆ7:˜sÑ#Ô#€Ø
ˆW\ 3Ñ
'Ô
'€
ؐ˜Ð!Ô"€ð3ð�ð�ð�ð�ðð�˜H SœMð�ð�ð�ð�ð&'&ð�'˜Sð�'ð�'ð�'ð�'ð)Sð�)˜Vð�)ð�)ð�)ð�)ð˜%  S œ/ð�¨cð�ð�ð�ð�ð2E&ð�E˜vð�E¨&ð�Eð�Eð�Eð�Eð6˜Fð� tð�ð�ð�ð�ð.˜Fð�. sð�.ð�.ð�.ð�.ð" ð�"¨3ð�"ð�"ð�"ð�"ð.˜Fð�. sð�.ð�.ð�.ð�.ð" ð�"¨3ð�"ð�"ð�"ð�"ð!˜ð�! D¨¤Ið�!ð�!ð�!ð�!ðH &ð�¨T°#°s°(¬^ð�ð�ð�ð�ð˜Vð�¨ð�ð�ð�ð�ð
, ð�
,°ð�
,¸6ð�
,ð�
,ð�
,ð�
,ð 3˜#ð�3ð�3ð�3ð�3ðf˜ð�fð�fð�fð�fð
˜ð�
 ¨¤
ð�
ð�
ð�
ð�
ð
ð�
˜ð�
 4ð�
°H¸S´Mð�
ð�
ð�
ð�
ð sð� Cð�°ð�¸ð�ð�ð�ð�ð$ð�sð� Cð�°ð�Àð�ð�ð�ð�ð(ð�°6ð�ð�ð�ð�ð<1ð�1ð�1ðh
 ð�
 ˜sð�
  tð�
 ð�
 ð�
 ð�
 ð �QRØ)-ðð� sð�¸ð�È#ð�Ø"&ðØ25ðð�ð�ð�ðB3ð�3ð�3ðl
ð�
ð�
ð�
ð+F˜Uð�+F sð�+Fð�+Fð�+Fð�+Fð\ið�ið�ið�ið�i”ñ�iô�ið�iðX
ð�
ð�
ð�
ð�
Zñ�
ô�
ð�
ð Bð�Bð�Bð�Bð�Bñ�Bô�Bð�BðJ+ð�+ð�+ð�+ð�+Ð+ñ�+ô�+ð�+ð\Uð�Uð�Uð�Uð�Uñ�Uô�Uð�Uðpð�ð�ð�ð�ñ�ô�ð�ðB"ð�"ð�"ð�"ð�"ñ�"ô�"ð�"ð�"ð�"r���