Ë
    ›7šhKl  ã            	       ó$  — d Z ddlZddlZddlZddlZddlmZ 	 ddlZddlm	Z	m
Z
 ddlmZmZ d	gZ ej                  e«      Zd
ddddddddœZdddddddddœZd„ Zd„ Zd%d„Zd„ Zd%d„Zd„ Zd „ Zd!„ Zd"„ Zd#„ Zd$„ Zy# e$ r  G d„ d«      ZY Œpw xY w)&z;
This module contains all function used in parsing packets
é    N)Údatetimec                   ó   — e Zd Zed„ «       Zy)Úchardetc                 ó   — dddœS )Ng        zwindows-1252)Ú
confidenceÚencoding© )Úxs    úT/var/www/html/w1hd-tracker/send/venv/lib/python3.12/site-packages/aprslib/parsing.pyÚdetectzchardet.detect!   s   € à"%°>ÑBÐBó    N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r	   r   r   r   r       s   „ Ø	ñ	Có 
ñ	Cr   r   é   )ÚUnknownFormatÚ
ParseError)Úbase91Ústring_type_parseÚparsezM0: Off DutyzM1: En RoutezM2: In ServicezM3: ReturningzM4: CommittedzM5: SpecialzM6: PriorityÚ	Emergency)Ú111Ú110Ú101Ú100Ú011Ú010Ú001Ú000zC0: Custom-0zC1: Custom-1zC2: Custom-2zC3: Custom-3zC4: Custom-4zC5: Custom-5zC6: Custom-6c                 ó  — 	 | j                  d«      S # t        $ r Y nw xY wt        j                  | j	                  dd«      d   «      }|d   dkD  r$	 | j                  |d   «      S # t        $ r Y nw xY w| j                  d«      S )	Nzutf-8ó   :r   éÿÿÿÿr   gffffffæ?r   zlatin-1)ÚdecodeÚUnicodeDecodeErrorr   r   Úsplit)ÚpacketÚress     r   Ú_unicode_packetr)   D   s�   € ðØ�}‰}˜WÓ%Ð%øÜò Ùðúô �.‰.˜Ÿ™ d¨AÓ.¨rÑ2Ó
3€CØ
ˆ<Ñ˜3Òð	Ø—=‘=  Z¡Ó1Ð1øÜ!ò 	Ùð	úð �=‰=˜Ó#Ð#s   ‚ “	žÁA' Á'	A3Á2A3c                 óš  — t        | t        «      st        dt        | «      «      ‚t        | t        «      rt        | «      } | j                  d«      } t        j                  d| «       t        | «      dk(  rt        d| «      ‚	 | j                  dd«      \  }}t        |«      dk(  rt        d	| «      ‚d
| i}	 |j                  t        |«      «       |d   }|dd }t        |«      dk(  r|dk7  rt        d| «      ‚	 |dv rt        d| «      ‚|dk(  rZt        j                  d«       t!        ||«      \  }}|j                  |«       |j                  d|j#                  d«      dœ«       �n<|dv r:t        j                  d«       t%        |d   |«      \  }}|j                  |«       �nþ|dk(  r6t        j                  d«       t'        |«      \  }}|j                  |«       �nÃ|dv sd|j)                  d«      cxk  rdk  �r¤n �n |dvr|j                  dd«      \  }}d}|dk(  r]t        j                  d«       t+        j,                  d|«      }|r%|d   \  }	}
|j                  |	|
dk(  dœ«       |d d }n t        d!«      ‚|j                  d"|d#v i«       |d$v r t!        ||«      \  }}|j                  |«       t        |«      dk(  rd%|v rt        d&| «      ‚t/        |«      \  }}|j                  |«       t        |«      dkD  rt        j                  d'«       nNt1        |«      \  }}|j                  |«       t        |«      dkD  rt        j                  d(«       nt        d!«      ‚t3        |«      \  }}|j                  |«       |dk(  r|j                  |d)   d*d+œ«       d)|vr<t+        j6                  d,|d   «      st        d| «      ‚|j                  d-||z   d.œ«       t        j                  d/«       |S #  t        d| «      ‚xY w# t        $ r}t        t        |«      | «      ‚d}~ww xY w# t        $ r}| |_        ‚ d}~ww xY w)0aK  
    Parses an APRS packet and returns a dict with decoded data

     - All attributes are in metric units

     Supports:
      * normal/compressed/mic-e position reports
        - including comment extentions for altitude and telemetry
      * messages including bulletins, announcements and telemetry
      * status message
    z/Expected packet to be str/unicode/bytes, got %sz
zParsing: %sr   zpacket is emptyú:r   zpacket has no bodyzpacket body is emptyÚrawNú>z0packet body is empty after packet type characterz#$%)*,<?T[_{}zformat is not supportedzPacket is just a status messageÚstatusú )Úformatr.   z`'z#Attempting to parse as mic-e packetÚtoz%Attempting to parse as message packetz!=/@;ú!é(   ú;z(Attempting to parse object report formatz^([ -~]{9})(\*|_)Ú*)Úobject_nameÚaliveé
   zinvalid formatÚmessagecapablez@=z/@;Ú	timestampzinvalid position report formatz$Parsed as compressed position reportz Parsed as normal position reportr0   Úobject)Úobject_formatr0   z«^(AIR.*|ALL.*|AP.*|BEACON|CQ.*|GPS.*|DF.*|DGPS.*|DRILL.*|DX.*|ID.*|JAVA.*|MAIL.*|MICE.*|QST.*|QTH.*|RTCM.*|SKY.*|SPACE.*|SPC.*|SYM.*|TEL.*|TEST.*|TLM.*|WX.*|ZIP.*|UIDIGI)$Úbeacon)r0   Útextz
Parsed ok.)Ú
isinstancer   Ú	TypeErrorÚtypeÚbytesr)   ÚrstripÚloggerÚdebugÚlenr   r&   ÚupdateÚ_parse_headerÚstrr   Ú_parse_timestampÚstripÚ_parse_miceÚ_parse_messageÚfindÚreÚfindallÚ_parse_compressedÚ_parse_normalÚ_parse_commentr'   Úmatch)r'   ÚheadÚbodyÚparsedÚmsgÚpacket_typeÚresultÚprefixrT   ÚnameÚflagÚexps               r   r   r   W   sD  € ô �fÔ/Ô0ÜÐIÌ4ÐPVË<ÓXÐXô �&œ%Ô Ü  Ó(ˆà�]‰]˜6Ó"€FÜ
‡L�L� Ô'ä
ˆ6ƒ{�aÒÜÐ*¨FÓ3Ð3ð7Ø—|‘| C¨Ó+‰ˆˆtô ˆ4ƒy�A‚~ÜÐ/°Ó8Ð8ð 	ˆvð
€Fð+Ø�‰”m DÓ)Ô*ð �q‘'€KØ��ˆ8€Dä
ˆ4ƒy�A‚~˜+¨Ò,ÜÐKÈVÓTÐTð
tð0 ˜/Ñ)ÜÐ 9¸6ÓBÐBð ˜CÒÜ�L‰LÐ:Ô;ä+¨D°+Ó>‰LˆD�&à�M‰M˜&Ô!Ø�M‰MØ"ØŸ*™* S›/ñö ð ˜DÑ Ü�L‰LÐ>Ô?ä& v¨d¡|°TÓ:‰LˆD�&Ø�M‰M˜&Ö!ð ˜CÒÜ�L‰LÐ@ÔAä)¨$Ó/‰LˆD�&Ø�M‰M˜&Ö!ð ˜WÑ$Ø�4—9‘9˜S“>Ô& B×&à 'Ñ)Ø#Ÿz™z¨#¨qÓ1‘�˜Ø!�à˜cÒ!Ü—‘ÐGÔHÜŸ
™
Ð#7¸Ó>�ÙØ!& q¡‘J�D˜$Ø—M‘MØ'+Ø!%¨¡ñ#ô ð
    ˜9‘Dä$Ð%5Ó6Ð6à—‘Ð/°ÀÐ1DÐEÔFð ˜eÑ#Ü/°°kÓB‘��fØ—‘˜fÔ%ä�4‹y˜AŠ~ +°Ñ"7Ü Ð!AÀ6ÓJÐJô -¨TÓ2‰LˆD�&Ø�M‰M˜&Ô!ä�6‹{˜QŠÜ—‘ÐCÕDä,¨TÓ2‘��fØ—‘˜fÔ%ä�v“; ’?Ü—L‘LÐ!CÕDä$Ð%5Ó6Ð6ô *¨$Ó/‰LˆD�&Ø�M‰M˜&Ô!à˜cÒ!Ø—‘Ø%+¨HÑ%5Ø&ñô ð �vÑÜ�x‰xð .ð 06°d©|ô=ô  Ð 9¸6ÓBÐBà�‰ØØ $Ñ&ñô 	ô
 ‡L�L�ÔØ€Møðy7ÜÐ-¨vÓ6Ð6ûô ò +Üœ˜S› 6Ó*Ð*ûð+ûô| ò ØˆŒ
Øûðús=   ÂO= Â7P Ã;J+P4 Ï=PÐ	P1ÐP,Ð,P1Ð4	Q
Ð=QÑQ
c                 óÖ   — t        |«      rd|z  nd}t        j                  d| «      }|st        d|z  «      ‚|d   \  } }}t        |«      rt	        |«      dkD  rt        d|z  «      ‚y y )Nz%s: Ú z^([A-Z0-9]{1,6})(-(\d{1,2}))?$z%sinvalid callsignr   é   z%sssid not in 0-15 range)ÚboolrO   rP   r   Úint)Úcallsignr[   rT   r
   Ússids        r   Ú_validate_callsignrf     sq   € Ü $ V¤ˆV�fŠ_°"€Fä�J‰JÐ8¸(ÓC€EáÜÐ-°Ñ6Ó7Ð7à˜a™Ñ€Hˆa�äˆD„z”c˜$“i "’nÜÐ3°fÑ<Ó=Ð=ð %€zr   c                 ó’  — 	 | j                  dd«      \  }}dt        |«      cxk  rdk  r2n t        d«      ‚t        j                  d|t        j
                  «      st        d«      ‚|j                  d«      }t        |«      dk  st        |d   «      dk(  rt        d	«      ‚|d   }|dd
 }t        |d«       |D ]2  }t        j                  d|t        j
                  «      rŒ)t        d«      ‚ |||dœ}d}t        |«      dk\  rt        j                  d|d   «      r|d   }|j                  d|i«       |S #  t        d«      ‚xY w)z=
    Parses the header part of packet
    Returns a dict
    r-   r   zinvalid packet headeré	   z!^[a-z0-9]{0,9}(\-[a-z0-9]{1,8})?$zfromcallsign is invalidú,r   zno tocallsign in headerNÚ
tocallsignz^[A-Z0-9\-]{1,9}\*?$zinvalid callsign in path)Úfromr1   Úpathr`   é   z^q..$éþÿÿÿr#   Úvia)	r&   r   rF   rO   rP   ÚIrf   rT   rG   )rU   Úfromcallrl   ÚtocallÚdigirW   Úviacalls          r   rH   rH   )  sI  € ð2ØŸ:™: c¨1Ó-Ñˆ�4ð ”�X“Ô# !Ô#ô Ð2Ó3Ð3ô �:‰:Ð:¸HÄbÇdÁdÔKäÐ2Ó3Ð3à�:‰:�c‹?€Dä
ˆ4ƒy�1‚}œ˜D ™G›¨Ò)ÜÐ2Ó3Ð3à�!‰W€FØ��ˆ8€Dä�v˜|Ô,àò 9ˆÜ�z‰zÐ1°4¼¿¹Õ>ÜÐ7Ó8Ð8ð9ð
 ØØñ
€Fð €GÜ
ˆ4ƒy�A‚~œ"Ÿ(™( 8¨T°"©XÔ6Ø�r‘(ˆà
‡M�M�5˜'Ð"Ô#à€Møða2ÜÐ0Ó1Ð1ús   ‚D9 Ä9Ec                 óh  — i }t        j                  d| dd «      }|rå|d   \  }}}t        j                  «       }d}|dk(  r|dk7  rnŸ| dd  } 	 |dk(  r(d|j                  |j
                  |j                  |fz  }n$|dv rd	|j                  |j
                  |dfz  }nd
}|j                  |d«      }t        j                  |j                  «       «      }|j                  d|i«       |j                  dt        |«      i«       | |fS # t        $ r!}	d}t        j                  |	«       Y d }	~	ŒEd }	~	ww xY w)Nz^((\d{6})(.))$r   é   r-   ÚzÚhz%d%02d%02d%szz/z%d%02d%s%02dÚ19700101000000z%Y%m%d%H%M%SÚraw_timestampr:   )rO   rP   r   ÚutcnowÚyearÚmonthÚdayÚstrptimeÚtimeÚmktimeÚ	timetuplerG   Ú	ExceptionrD   rE   rc   )
rV   rY   rW   rT   ÚrawtsÚtsÚformÚutcr:   r^   s
             r   rJ   rJ   f  s1  € Ø€Fä�J‰JÐ(¨$¨q°¨)Ó4€EÙØ ™(‰ˆˆr�4Ü�o‰oÓˆàˆ	à˜#Ò $¨#¢+Øà˜˜�8ˆDð"à˜3’;Ø .°#·(±(¸C¿I¹IÀsÇwÁwÐPRÐ1SÑ S‘Ið ˜T‘\Ø .°#·(±(¸C¿I¹IÀrÈ1Ð1MÑ M‘Ià 0�IàŸL™L¨°NÓC�	Ü ŸK™K¨	×(;Ñ(;Ó(=Ó>�	à—‘˜°Ð6Ô7ð
 	�‰�{¤C¨	£NÐ3Ô4à�&ˆ>Ðøô ò "Ø�	Ü—‘˜S×!Ñ!ûð"ús   ÁBD Ä	D1ÄD,Ä,D1c                 ó¢  — i }t        j                  d| «      }|r‚|d   \  }}| dd  } |j                  t        |«      t        |«      dz  dœ«       t        j                  d| «      }|rÃ|d   \  }}| dd  } |j                  t        |«      t        |«      dœ«       n�t        j                  d| «      }|r*|d   \  }}| t	        |«      d  } |j                  d|i«       nMt        j                  d	| «      }|r5|d   \  }}	| t	        |«      d  } |j                  d
t        |	«      dz  i«       t        j                  d| «      }|r-|d   \  } }
}| |z  } |j                  dt        |
«      dz  i«       t        | «      \  } }|j                  |«       t	        | «      dkD  r| d   dk(  r| dd  } |j                  d| j                  d«      i«       d|fS )Nz^([0-9]{3})/([0-9]{3})r   rv   çoƒÀÊ¡ý?)ÚcourseÚspeed)ÚbearingÚnrqz$^(PHG(\d[\x30-\x7e]\d\d[0-9A-Z]?))\/Úphgz^(RNG(\d{4}))\/Úrngç 8€~ß¿ù?z^(.*?)/A=(\-\d{5}|\d{6})(.*)$Úaltitudeçý‡ôÛ×�Ó?ú/r   Úcommentr/   r`   )rO   rP   rG   rc   rF   Ú_parse_comment_telemetryrK   )rV   rW   rT   ÚcseÚspdÚbrgr�   ÚextrŽ   r�   r‘   ÚpostÚ	telemetrys                r   rS   rS   �  sÏ  € Ø€Fô �J‰JÐ0°$Ó7€EÙØ˜‘8‰ˆˆSØ�A�BˆxˆØ�‰Ü˜#“hÜ˜“X˜e‘^ñô 	ô —
‘
Ð4°dÓ;ˆÙØ˜Q‘x‰HˆC�Ø˜˜�8ˆDØ�M‰M¤c¨#£h´s¸3³xÑ@ÕAä—
‘
ÐBÀDÓIˆÙØ˜Q‘x‰HˆC�Øœ˜C›˜	�?ˆDØ�M‰M˜5 #˜,Õ'ä—J‘JÐ1°4Ó8ˆEÙØ  ™8‘��SØœC ›H˜I��Ø—‘˜u¤c¨#£h°Ñ&9Ð:Ô;ô �J‰JÐ7¸Ó>€EáØ$ Q™xÑˆˆh˜Ø�‰ˆà�‰�z¤3 x£=°Ñ#7Ð8Ô9ä.¨tÓ4�O€Dˆ)Ø
‡M�M�)Ôä
ˆ4ƒy�1‚}˜˜a™ CšØ�A�Bˆxˆà
‡M�M�9˜dŸj™j¨›oÐ.Ô/à�ˆ<Ðr   c                 ó¦  — i }t        j                  d| «      }|r´t        |d   d   «      dz  dk(  r�|d   \  } }}| |z  } dgdz  }t        d«      D ]&  }t	        j
                  ||dz  |dz  dz    «      ||<   Œ( |j                  d|d   |dd dœi«       |d   d	k7  r1|d   j                  d
dj                  |d   dz  «      ddd…   i«       | |fS )zc
    Looks for base91 telemetry found in comment field
    Returns [remaining_text, telemetry]
    z^(.*?)\|([!-{]{4,14})\|(.*)$r   r   rm   rv   r›   é   )ÚseqÚvalsr`   Úbitsz{0:08b}éÿ   Nr#   )rO   rP   rF   Úranger   Ú
to_decimalrG   r0   )r>   rW   rT   r›   rš   ÚtempÚis          r   r•   r•   Â  s  € ð
 €FÜ�J‰JÐ6¸Ó=€Eá”�U˜1‘X˜a‘[Ó! AÑ%¨Ò*Ø % a¡Ñˆˆi˜Ø�‰ˆàˆs�Q‰wˆÜ�q“ò 	>ˆAÜ×'Ñ'¨	°!°A±#°a¸±c¸!±eÐ(<Ó=ˆD�ŠGð	>ð 	�‰ØØ˜A‘wØ˜Q˜q˜	ñðô 	ð �‰7�bŠ=Ø�;Ñ×&Ñ&Ø˜	×(Ñ(¨¨a©°4©Ó8¹¸2¸Ñ>ð(ô ð �&ˆ>Ðr   c           	      ó  — ddi}| j                  d«      d   } t        | «      dk7  rt        d«      ‚t        |«      dk  rt        d«      ‚t        j                  d	| «      st        d
«      ‚t        j                  d|«      st        d«      ‚|j                  |d   |d   dœ«       d}| D ]c  }|dv r|dz  }Œt        |«      dkD  r|t        t        |«      dz
  «      z  }Œ6t        |«      dkD  r|t        t        |«      dz
  «      z  }Œ_||z  }Œe t        j                  d|«      }|st        d«      ‚t        |d   «      }|j                  d|i«       t        |«      }|dkD  r|dk\  rd|d<   nd|d|z
  <   dj                  |«      }t        |dd ›d|dd ›�j                  dd«      «      }t        |dd «      |dz  z   }t        | d    «      dk  r| n|}|j                  d!|i«       t        j                  d"d| dd  «      }	t        j                  d#d$|	«      }	t        j                  d%d&|	«      }	|j                  d'|	i«       |	j                  d&«      d(kD  r+|j                  d)t         |	j                  d&d$«         i«       n|j                  d)t"        |	   i«       t        |d   «      d*z
  }
|
t        | d   «      d+k\  rd,ndz  }
|
|
d-k\  r|
d.k  rd/ndz  }
|
|
d0k\  r|
d1k  rd2ndz  }
t        |d3   «      d4z
  }||d5k\  rd6ndz  }|t        |d   «      d4z
  d7z  z  }|du rd8}nu|d u rt%        j&                  |d9z  «      d:z   d9z  }nR|du rt%        j&                  |«      d:z   }n5|d3u rt%        j&                  |d9z  «      d:z   d;z  }n|durt        d<|z  «      ‚|
|dz  z  }
t        | d=   «      d+k\  rd|
z
  n|
}
|j                  d>|
i«       t        |d    «      d*z
  d9z  }t        |d   «      d*z
  }t        |d;z  «      }||d9z   z  }|d,z  t        |d=   «      z   d*z
  }||z  }||d?k\  rd@ndz  }||dAk\  rdBndz  }|dCz  }|j                  ||dDœ«       t        |«      dkD  �r|dd  }t        j                  dE|«      }|rp|d   \  }}|d3d  }t        |«      dz  }t        |dF«      }g }t)        |«      D ]&  }|j+                  dt        |d|z  z	  dGz  «      «       Œ( |j                  dH|i«       t        j                  dI|«      }|r9|d   \  }}}t-        j.                  |«      dJz
  }|j                  dK|i«       ||z   }t1        |«      \  }}|j                  |«       |j                  dL|j3                  d«      i«       d|fS )MNr0   zmic-eú-r   r�   zdstcall has to be 6 charactersé   zpacket data field is too shortz^[0-9A-Z]{3}[0-9L-Z]{3}$zinvalid dstcallzI^[&-\x7f][&-a][\x1c-\x7f]{2}[\x1c-\x7d][\x1c-\x7f][\x21-\x7e][\/\\0-9A-Z]zinvalid data formatrv   )ÚsymbolÚsymbol_tabler`   ÚKLZr/   éL   é    é9   é   z	^\d+( *)$zinvalid latitude ambiguityÚposambiguityé   Ú3rm   Ú5ú.Ú0ç      N@é   Úlatitudez[0-9L]z[P-Z]Ú1z[A-K]Ú2Úmbitsr#   Úmtypeé   éP   éd   é´   é½   i°ÿÿÿé¾   éÇ   iBÿÿÿr   g      <@é<   iÄÿÿÿg      Y@é   r8   g      à?g      $@z"Unsupported position ambiguity: %dé   Ú	longitudei   iàüÿÿi�  ipþÿÿr‰   )r‹   rŠ   z"^('[0-9a-f]{10}|`[0-9a-f]{4})(.*)$é   r¡   r›   z^(.*)([!-{]{3})\}(.*)$i'  r‘   r”   )r&   rF   r   rO   rT   rG   ÚordÚchrrP   ÚlistÚjoinÚfloatÚreplacerc   ÚsubrN   ÚMTYPE_TABLE_CUSTOMÚMTYPE_TABLE_STDÚmathÚfloorr¢   Úinsertr   r£   r•   rK   )ÚdstcallrV   rW   Ú
tmpdstcallr¥   rT   r°   Ú
latminutesr¸   r»   rÇ   Ú
lngminutesr‹   rŠ   ÚquotientÚhexdataÚchannelsr›   r‘   Úextras                       r   rL   rL   æ  s.  € Ø˜Ð €Fà�m‰m˜CÓ  Ñ#€Gô ˆ7ƒ|�qÒÜÐ9Ó:Ð:Ü
ˆ4ƒy�1‚}ÜÐ9Ó:Ð:Ü�8‰8Ð/°Ô9ÜÐ*Ó+Ð+Ü�8‰8ð :Ø;?ôAäÐ.Ó/Ð/ð ‡M�MØ�q‘'Ø˜Q™ñ
ô ð €JØò ˆØ�‰:Ø˜#Ñ‰JÜ�‹V�bŠ[Øœ#œc !›f r™kÓ*Ñ*‰JÜ�‹V�bŠ[Øœ#œc !›f r™kÓ*Ñ*‰Jà˜!‰O‰Jðô �J‰J�| ZÓ0€EÙÜÐ5Ó6Ð6ä�u˜Q‘x“=€LØ
‡M�MØ˜ð
ô ô
 �jÓ!€JØ�aÒØ˜1ÒØˆJ�qŠMà+.ˆJ�q˜<Ñ'Ñ(à—‘˜Ó$€Jä :¨a°¢?°J¸qÀ±OÐD×MÑMÈcÐSVÓWÓX€JÜ�:˜a �?Ó# z°DÑ'8Ñ9€Hô   ¨¡
›O¨tÒ3�‰y¸€Hà
‡M�MØ�Hð
ô ô �F‰F�9˜c 7¨1¨Q <Ó0€EÜ�F‰F�8˜S %Ó(€EÜ�F‰F�8˜S %Ó(€Eà
‡M�MØ�ð
ô ð ‡z�z�#ƒ˜ÒØ�‰ØÔ'¨¯©°c¸3Ó(?Ñ@ðõ 	ð 	�‰Ø”_ UÑ+ðô 	ô �D˜‘G“˜rÑ!€IØœ˜G A™J›¨4Ò/‘°QÑ6€IØ˜	 SÒ(¨Y¸#Ò-=‘À1ÑD€IØ˜ cÒ)¨i¸3Ò.>‘ÀAÑE€Iô �T˜!‘W“ Ñ$€JØ˜ rÒ)‘#¨qÑ0€Jð ”C˜˜Q™“L 4Ñ'¨5Ñ0Ñ1€Jð �qÑØ‰
Ø	˜Ñ	Ü—j‘j ¨B¡Ó/°#Ñ5¸Ñ;‰
Ø	˜Ñ	Ü—Z‘Z 
Ó+¨cÑ1‰
Ø	˜Ñ	Ü—j‘j ¨B¡Ó/°#Ñ5¸Ñ=‰
Ø	˜QÑ	ÜÐ=ÀÑLÓMÐMà�˜dÑ"Ñ"€Iô "% W¨Q¡Z£°DÒ!8��I’¸i€Ià
‡M�MØ�Yð
ô ô
 ��a‘‹\˜BÑ "Ñ$€EÜ��a‘‹\˜BÑ€FÜ�6˜D‘=Ó!€HØ
�˜2‘ÐÑ€FØ�C‰Zœ#˜d 1™g›,Ñ&¨Ñ+€FØ	ˆXÑ€Eà	�U˜c’\‰T qÑ(€EØ
�f ’m‰d¨Ñ*€Fà	ˆU�N€EØ
‡M�MØØñ
ô ô ˆ4ƒy�1ƒ}Ø�A�Bˆxˆô —
‘
Ð@À$ÓGˆÙØ! !™H‰MˆG�Tà˜a˜b�kˆGÜ˜7“| aÑ'ˆHÜ˜' 2Ó&ˆGàˆIÜ˜8“_ò ?�Ø× Ñ  ¤C¨°1°Q±3©¸Ñ(<Ó$=Õ>ð?ð �M‰M˜;¨	Ð2Ô3ô —
‘
Ð4°dÓ;ˆÙØ$)¨!¡HÑ!ˆD�(˜Eä×(Ñ(¨Ó2°UÑ:ˆHØ�M‰M˜: xÐ0Ô1à˜%‘<ˆDô 3°4Ó8‰ˆˆiØ�‰�iÔ ð
 	�‰�y $§*¡*¨S£/Ð2Ô3à�ˆ<Ðr   c                 ó¬  — i }	 t        j                  d| t         j                  «      }|rM|d   \  }}}|j                  d«      }|dk(  rdnd}|j	                  ||j                  d«      ||dœ«       	 d|fS t        j                  d| «      }|rD|d   \  }}}|j                  d«      }|j	                  d	|j                  d«      ||d
œ«       	 d|fS t        j                  d| «      }|s	 d|fS |d   \  }} |j	                  d|j                  d«      i«       t        j                  d| «      }|�r¤t        j                  d«       |d   \  }	} |j	                  ddi«       |	dv rk| j                  d«      d d }
|
D ]&  }t        j                  d|«      rŒt        d|	z  «      ‚ dgdz  }|
|d t        |
«       |j	                  d|	z  |i«       �nß|	dk(  r¤| j                  d«      d d }g d¢dz  }t        |«      D ]?  \  }}t        j                  d|«      st        d|dz   |	fz  «      ‚	 t        |«      }|||<   ŒA t        d«      D �cg c]  }||dz  |dz   dz   ‘Œ }}|j	                  d|	z  |i«       �n6|	dk(  �r0t        j                  d | «      }|st        d!|	z  «      ‚|d   \  }}|j	                  d|	z  |d"|j                  d«      i«       nÚt        j                  d#«       |j	                  dd$i«       t        j                  d%| «      }|r|d   \  }}|j	                  ||d&œ«       n}| dd' } t        j                  d(| «      }|r>|d   }| d t        | «      dz
  t        |«      z
   } |j	                  d)t        |«      i«       |j	                  d*| j                  d«      i«       	 d|fS #  |dk7  rt        |«      nd}Y �Œ•xY wc c}w )+Nz&^BLN([0-9])([a-z0-9_ \-]{5}):(.{0,67})r   r/   r`   Úbulletinzgroup-bulletin)r0   Úmessage_textÚbidÚ
identifierz)^BLN([A-Z])([a-zA-Z0-9_ \-]{5}):(.{0,67})Úannouncement)r0   rß   Úaidrá   z^([a-zA-Z0-9_ \-]{9}):(.*)$Úaddressez^(PARM|UNIT|EQNS|BITS)\.(.*)$z,Attempting to parse telemetry-message packetr0   ztelemetry-message)ÚPARMÚUNITri   é   z^(.{1,20}|)$z'incorrect format of %s (name too long?)zt%sÚEQNSra   )r   r   r   rÆ   z^([-]?\d*\.?\d+|)$z!value at %d is not a number in %sr   r·   ÚBITSz^([01]{8}),(.{0,23})$z(incorrect format of %s (title too long?)Útitlez Packet is just a regular messageÚmessagez^(ack|rej)\{([0-9]{1,5})$)ÚresponseÚmsgNoéF   z\{([0-9]{1,5})$rí   rß   )rO   rP   rp   rC   rG   rK   rD   rE   r&   rT   r   rF   Ú	enumeraterc   rÍ   r¢   )rV   rW   rT   rà   rá   r>   Úmformatrã   rä   r†   rŸ   ÚvalÚdefvalsÚeqnsÚteqnsÚidxr¥   r    rê   rì   ÚnumberÚmsgids                         r   rM   rM   ¨  s9  € Ø€Fð ä—
‘
ÐDÀdÌBÏDÉDÓQˆÙØ$)¨!¡HÑ!ˆC�˜TØ#×*Ñ*¨3Ó/ˆJà$.°"Ò$4‘jÐ:JˆGà�M‰MØ!Ø $§
¡
¨3£ØØ(ñ	ô ð ðT �ˆ<ÐôO —
‘
ÐGÈÓNˆÙØ$)¨!¡HÑ!ˆC�˜TØ#×*Ñ*¨3Ó/ˆJà�M‰MØ(Ø $§
¡
¨3£ØØ(ñ	ô ð ðx �ˆ<Ðôs —
‘
Ð9¸4Ó@ˆÙØðn �ˆ<Ððk ˜q™‰ˆ�$à�‰�z 8§?¡?°3Ó#7Ð8Ô9ô —
‘
Ð;¸TÓBˆÚÜ�L‰LÐGÔHØ˜q™‰JˆD�$à�M‰M˜8Ð%8Ð9Ô:àÐ'Ñ'Ø—z‘z #“ s¨Ð+�àò [�CÜŸ8™8 O°SÕ9Ü(Ð)RÐUYÑ)YÓZÐZð[ð ˜$ ™)�Ø&*�˜
œ˜T›Ð#à—‘Ø˜D‘L 'ðö ð ˜’Ø—z‘z #“ s¨Ð+�Ú! A™�ä )¨$£ò 	)‘H�C˜ÜŸ8™8Ð$9¸3Ô?Ü(Ð)LÐPSÐTUÑPUÐW[È}Ñ)\Ó]Ð]ðAÜ"% c£(˜Cð &)˜˜cš
ð	)ô 6;¸1³XÖ>°˜˜q ™s A a¡C¨¡7Ò+Ð>�Ð>à—‘Ø˜D‘L %ðö ð ˜“ÜŸ
™
Ð#;¸TÓB�ÙÜ$Ð%OÐRVÑ%VÓWÐWà# A™h‘��eà—‘Ø˜D‘L $Ø˜UŸ[™[¨Ó-ðõ ô �L‰LÐ;Ô<Ø�M‰M˜8 YÐ/Ô0ä—J‘JÐ;¸TÓBˆEÙØ#(¨¡8Ñ �˜&à—‘Ø (Ø#ñõ ð
 ˜A˜b�z�äŸ
™
Ð#5°tÓ<�ÙØ! !™H�EØÐ ;¤ T£¨Q¡´°U³Ñ!;Ð<�Dà—M‘M 7¬C°«JÐ"7Ô8à—‘˜~¨t¯z©z¸#«Ð?Ô@àà�ˆ<ÐøðeAØ03°r²	¤%¨¤*¸q›Cüò
 ?s   È.N7ÉOÎ7Oc                 óx  — i }t        j                  d| «      �r�t        j                  d«       t	        | «      dk  rt        d«      ‚|j                  ddi«       | d d }| dd  } |d   }|d   }	 d	t        j                  |d
d «      dz  z
  }dt        j                  |dd «      dz  z   }|dd D �cg c]  }t        |«      dz
  ‘Œ c}\  }}	}
|dk(  r|j                  d|
dz  dk(  rd
ndi«       d||	fv rn�|
dz  dk(  r |j                  dd|dz  |	z   z  dz  i«       ne|dk\  r?|dk  r:|j                  d|dk(  rdn|dz  i«       |j                  dd |	z  d
z
  d!z  i«       n!|d	k(  r|j                  d"d#d |	z  z  d$z  i«       |j                  ||||d%œ«       | |fS # t        $ r t        d«      ‚w xY wc c}w )&Nz#^[\/\\A-Za-j][!-|]{8}[!-{}][ -|]{3}z1Attempting to parse as compressed position reportrç   z3Invalid compressed packet (less than 13 characters)r0   Ú
compressedr   rh   éZ   r   rÆ   g    ø?AiLÿÿÿg    ø?Az1invalid characters in latitude/longitude encodingr8   é!   r#   Úgpsfixstatusr­   é   rÈ   r‘   gÕxé&1ð?é[   r’   éY   rŠ   ih  r±   r‹   gHáz®Gñ?r‰   Ú
radiorangerm   r�   ©r©   rª   r¸   rÇ   )rO   rT   rD   rE   rF   r   rG   r   r£   Ú
ValueErrorrÉ   )rV   rW   rù   rª   r©   r¸   rÇ   r
   Úc1Ús1Úctypes              r   rQ   rQ   (  sü  € Ø€Fä	‡x�xÐ6¸Õ=Ü�‰ÐHÔIäˆt‹9�rŠ>ÜÐRÓSÐSà�‰�x Ð.Ô/à˜#˜2�Yˆ
Ø�B�Cˆyˆà! !‘}ˆØ˜A‘ˆð	RØœV×.Ñ.¨z¸!¸A¨Ó?À(ÑJÑKˆHØ¤× 1Ñ 1°*¸Q¸q°/Ó BÀXÑ MÑNˆIð /9¸¸BÐ.?Ö@¨œ˜Q› "›Ò@‰ˆˆB�à�Š8Ø�M‰M˜>°¸±ÀÒ0D©1È!ÐLÔMà�"�b�‰>ØØ�T‰\˜TÒ!Ø�M‰M˜:¨°"°r±'¸B±,Ñ(?À6Ñ'IÐJÕKØ�1ŠW˜˜ršØ�M‰M˜8¨B°!ªG¡S¸¸a¹Ð@ÔAØ�M‰M˜7 T¨R¡Z°!¡^°uÑ$<Ð=Õ>Ø�2ŠXØ�M‰M˜<¨!¨d°b©j©.¸HÑ)DÐEÔFà�‰ØØ(Ø Ø"ñ	ô 	ð �&ˆ>Ðøô9 ò 	RÜÐPÓQÐQð	Rüò As   Á0<F Â3F7ÆF4c           	      óÈ  — i }t        j                  d| «      }|�rD|j                  ddi«       |d   \	  }}}}}}}	}
} |j                  d«      }||j                  d«      k7  rt	        d«      ‚|j                  d|i«       |dk\  rd	}d	}n&|j                  dd
d«      }|j                  dd
d«      }t        |«      dkD  st        |«      dk  rt	        d«      ‚t        |«      dkD  st        |«      dk  rt	        d«      ‚	 t        |«      t        |«      dz  z   }t        |«      t        |«      dz  z   }||dv rdndz  }||	dv rdndz  }|j                  |
|||dœ«       | |fS )Nzk^(\d{2})([0-9 ]{2}\.[0-9 ]{2})([NnSs])([\/\\0-9A-Z])(\d{3})([0-9 ]{2}\.[0-9 ]{2})([EeWw])([\x21-\x7e])(.*)$r0   Úuncompressedr   r/   z)latitude and longitude ambiguity mismatchr°   r±   Ú30r³   r   rÿ   z'latitude is out of range (0-90 degrees)é³   z*longitutde is out of range (0-180 degrees)r¶   ÚSsr#   ÚWwr  )rO   rP   rG   Úcountr   rÎ   rc   rÍ   )rV   rW   rT   Úlat_degÚlat_minÚlat_dirrª   Úlon_degÚlon_minÚlon_dirr©   r°   r¸   rÇ   s                 r   rR   rR   [  sž  € Ø€Fä�J‰Jð RØSWóY€Eò Ø�‰�x Ð0Ô1ð �!‰Hñ
	
ØØØØØØØØØð —}‘} SÓ)ˆà˜7Ÿ=™=¨Ó-Ò-ÜÐHÓIÐIà�‰�~ |Ð4Ô5ð ˜1ÒØˆGØ‰Gà—o‘o c¨3°Ó2ˆGØ—o‘o c¨3°Ó2ˆGô ˆw‹<˜"Ò¤ G£¨qÒ 0ÜÐFÓGÐGÜˆw‹<˜#Ò¤ W£°Ò!1ÜÐIÓJÐJð
	ô �w“<¤5¨£>°DÑ#8Ñ9ˆÜ˜“L¤E¨'£N°TÑ$9Ñ:ˆ	à˜' T™/‘B¨qÑ0ˆØ˜7 d™?‘R°Ñ1ˆ	à�‰ØØ(Ø Ø"ñ	ô 	ð �&ˆ>Ðr   )r`   )Ú__doc__r€   rO   rÒ   Úloggingr   r   ÚImportErrorÚ
exceptionsr   r   r`   r   r   Ú__all__Ú	getLoggerr   rD   rÑ   rÐ   r)   r   rf   rH   rJ   rS   r•   rL   rM   rQ   rR   r	   r   r   ú<module>r     së   ðñ$ó Û 	Û Û Ý ðCÛ÷ 4ß 'àˆ)€à	ˆ×	Ñ	˜8Ó	$€ð
 ØØØØØØØñ	€ð ØØØØØØØñ	Ð ò$ò&}óH>ò:óz$òN2òjòHsòD}ò@0ófEøð} ò C÷Có CðCús   šA= Á=BÂB