Ë
    Ûvžj=  ã                   ó  — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	Z	ddl
mZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z" e	jF                  jI                  d	«      €	d
Z%ddl&m'Z' ndZ%ddl&m(Z(m)Z)m*Z*  G d„ d«      Z+d„ Z,d„ Z-e G d„ d«      «       Z.d&d„Z/e G d„ d«      «       Z0e G d„ de0«      «       Z1e G d„ de1«      «       Z2e G d„ de1«      «       Z3e G d„ de1«      «       Z4 G d„ d «      Z5e6d!k(  r[ ejn                  d"«      Z8e8js                  d#e:dd$¬%«       e8jw                  «       Z< e5e<jz                  «      Z>	 e>j                  «        yy# e@$ rZA eBeA«       Y dZA[AydZA[Aww xY w)'z!Python backend for the OCP Vieweré    N)ÚasdictÚ	dataclassÚfields)ÚdeserializeÚmake_compoundÚ	tq_to_locÚget_surfaceÚ	get_curve)Ú	get_edgesÚ	get_facesÚget_vertices)ÚTrace)Úlogo)
ÚCompoundÚEdgeÚFaceÚLocationÚPlaneÚShapeÚSolidÚVectorÚVertexÚdowncastÚJUPYTER_CADQUERYF)Úsend_responseT)ÚMessageTypeÚlistenerÚset_portc                   ó    — e Zd ZdZdZdZdZdZy)ÚSelectedCenterInfoz^
    Stores the information message about what as been used as center for the measurement
    z1Reference point has been taken as vertex locationzEReference point has been taken as the center of the circle or ellipsez<Reference point has been taken as the center of the geometryz<Reference point has been taken as the center of the cylinderN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚvertexÚcircularÚgeomÚcylinder© ó    úc/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/ocp_vscode/backend.pyr    r    /   s   „ ñð A€FØV€HØI€DØM�Hr*   r    c                  ó8   — t        | dt        j                  dœŽ y)z/
    Write the given message to the stdout
    T)ÚflushÚfileN)ÚprintÚsysÚstdout)Úmsgs    r+   Úprint_to_stdoutr3   :   s   € ô 
ˆ3�d¤§¡Ô,r*   c                 ó   ‡ — ˆ fd„}|S )zDecorator for error handlingc                  óÂ   •— 	  ‰| i |¤ŽS # t         $ rJ}t        |«       t        j                  t	        j
                  «       dt        j                  iŽ Y d }~y d }~ww xY w)Nr.   )Ú	Exceptionr3   Ú	tracebackÚprint_exceptionr0   Úexc_infor1   )ÚargsÚkwargsÚexcÚfuncs      €r+   Úwrapperzerror_handler.<locals>.wrapperD   sP   ø€ ð	HÙ˜Ð( Ñ(Ð(øÜò 	HÜ˜CÔ Ü×%Ñ%¤s§|¡|£~ÐG¼C¿J¹J×Gûð	Hús   ƒ ‹	A”A AÁAr)   )r=   r>   s   ` r+   Úerror_handlerr?   A   s   ø€ ôHð €Nr*   c                   ó   — e Zd ZdZdZdZdZy)ÚToolz!The tools available in the viewerÚDistanceMeasurementÚPropertiesMeasurementÚAngleMeasurementN)r!   r"   r#   r$   ÚDistanceÚ
PropertiesÚAngler)   r*   r+   rA   rA   N   s   „ á+à$€HØ(€JØ�Er*   rA   c           	      óŽ  ‡— t        | «      D ]¶  }|j                  t        k(  r;t        | |j                  «      }|€Œ/t        | |j                  t        |‰«      «       ŒQt        t        | |j                  «      t        «      sŒvt        | |j                  «      }t        ˆfd„|D «       «      }t        | |j                  |«       Œ¸ y)z`
    Set the precision of all float fields of the dataclass to the given number of decimals
    Nc              3   óZ   •K  — | ]"  }t        |t        «      rt        |‰«      n|–— Œ$ y ­w©N)Ú
isinstanceÚfloatÚround)Ú.0ÚelemÚdecimalss     €r+   Ú	<genexpr>z set_precision.<locals>.<genexpr>c   s.   øè ø€ ð á%�Dô *4°D¼%Ô)@”�d˜HÔ%ÀdÓJÙ%ùs   ƒ(+)	r   ÚtyperL   ÚgetattrÚnameÚsetattrrM   rK   Útuple)ÚinstancerP   ÚfieldÚvalueÚ	old_tupleÚ	new_tuples    `    r+   Úset_precisionr\   W   s›   ø€ ô ˜Ö!ˆØ�:‰:œÒÜ˜H e§j¡jÓ1ˆEØÑ Ü˜ %§*¡*¬e°E¸8Ó.DÕEÜœ ¨%¯*©*Ó5´uÕ=ä ¨%¯*©*Ó5ˆIÜó á%óó ˆIô �H˜eŸj™j¨)Õ4ñ "r*   c                   ó    — e Zd ZU dZdZeed<   y)ÚResponsezBase class for all responsesÚbackend_responserR   N)r!   r"   r#   r$   rR   ÚstrÚ__annotations__r)   r*   r+   r^   r^   j   s   … á&à"€Dˆ#Ô"r*   r^   c                   ó.   — e Zd ZU dZdZeed<   dZeed<   y)ÚMeasureReponsez(Base class for all measurement responsesÚ Úcenter_infoÚtool_responseÚsubtypeN)r!   r"   r#   r$   re   r`   ra   rg   r)   r*   r+   rc   rc   q   s   … á2ð €K�ÓØ"€GˆSÔ"r*   rc   c                   ó^   — e Zd ZU dZej
                  Zeed<   dZe	ed<   dZ
e	ed<   dZeed<   y)ÚDistanceResponsez'Response class for distance measurementÚ	tool_typeNÚpoint1Úpoint2Údistance)r!   r"   r#   r$   rA   rE   rj   ra   rk   rV   rl   rm   rL   r)   r*   r+   ri   ri   {   s1   … á1à—m‘m€IˆtÓ#Ø€FˆEÓØ€FˆEÓØ€HˆeÔr*   ri   c                   ó²   — e Zd ZU dZej
                  Zeed<   dZe	ed<   dZ
e	ed<   dZeed<   dZeed<   dZeed<   dZeed	<   dZeed
<   dZeed<   dZeed<   y)ÚPropertiesResponsez)Response class for properties measurementrj   NÚcenterÚvertex_coordsÚlengthÚwidthÚareaÚvolumeÚradiusÚradius2Ú	geom_type)r!   r"   r#   r$   rA   rF   rj   ra   rp   rV   rq   rr   rL   rs   rt   ru   rv   rw   rx   r`   r)   r*   r+   ro   ro   …   sm   … á3à—o‘o€IˆtÓ%Ø€FˆEÓØ€M�5ÓØ€FˆEÓØ€Eˆ5ÓØ€Dˆ%ÓØ€FˆEÓØ€FˆEÓØ€GˆUÓØ€IˆsÔr*   ro   c                   ó^   — e Zd ZU dZej
                  Zeed<   dZe	ed<   dZ
eed<   dZeed<   y)ÚAngleResponsez$Response class for angle measurementrj   NÚanglerk   rl   )r!   r"   r#   r$   rA   rG   rj   ra   r{   rL   rk   rV   rl   r)   r*   r+   rz   rz   •   s1   … á.à—j‘j€IˆtÓ Ø€Eˆ5ÓØ€FˆEÓØ€FˆEÔr*   rz   c                   óz   — e Zd ZdZddeddfd„Zd„ Zedefd„«       Z	d	„ Z
d
„ Zd„ Zd„ Z	 ddedeeef   fd„Zd„ Zy)ÚViewerBackenda  
    Represents the backend of the viewer, it listens to the websocket and handles the events
    It's job is to send responses to the vscode extension that goes through the three cad
    viewer view.
    The reponses holds all the data needed to display the measurements.
    NÚportÚreturnc                 ó`   — || _         d | _        d | _        d| _        || _        t        |«       y )NÚnone)r~   ÚmodelÚactivated_toolÚfilter_typeÚjcv_idr   )Úselfr~   r…   s      r+   Ú__init__zViewerBackend.__init__§   s.   € ØˆŒ	ØˆŒ
Ø"ˆÔØ!ˆÔØˆŒÜ��r*   c                 óŽ   — t        d«       | j                  t        «       t        d«        t        | j                  «      «        y)z#
        Start the backend
        zViewer backend startedzLogo model loadedN)r/   Ú
load_modelr   r   Úhandle_event)r†   s    r+   ÚstartzViewerBackend.start¯   s5   € ô 	Ð&Ô'Ø�‰œÔÜÐ!Ô"Ø#Œ�×"Ñ"Ó#Õ%r*   Ú
event_typec                 ó  — |t         j                  k(  r| j                  |«       y|t         j                  k(  rI|}d|v r%|j	                  d«      }|dk7  r|| _        nd| _        | j
                  �| j                  |«      S yy)zt
        Handle the event received from the websocket
        Dispatch the event to the appropriate handler
        Ú
activeToolÚNoneN)r   ÚDATAr‰   ÚUPDATESÚgetrƒ   Úhandle_activated_tool)r†   ÚmessagerŒ   ÚchangesÚactive_tools        r+   rŠ   zViewerBackend.handle_event¸   s†   € ð œ×)Ñ)Ò)Ø�O‰O˜GÕ$Øœ;×.Ñ.Ò.ØˆGà˜wÑ&Ø%Ÿk™k¨,Ó7�à &Ò(Ø*5�DÕ'à*.�DÔ'à×"Ñ"Ð.Ø×1Ñ1°'Ó:Ð:ð /ð /r*   c                 óÖ  — d|vry|d   }| j                   t        j                  k(  r0t        |«      dk(  r"|d   d   }|d   d   }| j	                  ||«      S | j                   t        j
                  k(  r't        |«      dk(  r|d   d   }| j                  |«      S | j                   t        j                  k(  r1t        |«      dk(  r"|d   d   }|d   d   }| j                  ||«      S yy)zV
        Handle the activated tool, there is a special behavior for each tool
        ÚselectedShapeIDsNé   r   é   )	rƒ   rA   rE   ÚlenÚhandle_distancerF   Úhandle_propertiesrG   Úhandle_angle)r†   r•   Úselected_objsÚ	shape_id1Ú	shape_id2Úshape_ids         r+   r“   z#ViewerBackend.handle_activated_toolÎ   s  € ð " WÑ,ØàÐ 2Ñ3ˆØ×Ñ¤$§-¡-Ò/´C¸Ó4FÈ!Ò4KØÐ 2Ñ3°AÑ6ˆIØÐ 2Ñ3°AÑ6ˆIØ×'Ñ'¨	°9Ó=Ð=à× Ñ ¤D§O¡OÒ3¼¸MÓ8JÈaÒ8OØÐ1Ñ2°1Ñ5ˆHØ×)Ñ)¨(Ó3Ð3à× Ñ ¤D§J¡JÒ.´3°}Ó3EÈÒ3JØÐ 2Ñ3°AÑ6ˆIØÐ 2Ñ3°AÑ6ˆIØ×$Ñ$ Y°	Ó:Ð:ð 4KÐ.r*   c                 ój   ‡ ‡— ˆ ˆfd„Ši ‰ _         t        d«      } ‰||«       |j                  «        y)z(Read the transfered model from websocketc                 óÎ  •— | d   D �]V  }|j                  d«      �
 ‰||«       Œ|d   }|d   €t        «       j                  n
t        |d   Ž }t	        |d   t
        «      r4t        t        j                  |d   d   j                  d«      «      «      }n[|d   D �cg c]/  }t        t        j                  |j                  d«      «      «      ‘Œ1 }}t        |«      dkD  rt        |«      n|d   }t        |j                  |«      «      ‰j                  |<   t        |«      }t!        |«      D ]H  \  }	}
|j#                  |› d	|	› �|
«       t%        |
j                  |«      «      ‰j                  |› d	|	› �<   ŒJ t'        |«      }t!        |«      D ]U  \  }	}|j)                  |› d
|	› �|«       |€t+        |«      nt+        |j                  |«      «      ‰j                  |› d
|	› �<   ŒW t-        |«      }t!        |«      D ]^  \  }	}|j/                  |› d|	› �|«       |€t1        |«      n"t1        t3        |j                  |«      «      «      ‰j                  |› d|	› �<   Œ` �ŒY y c c}w )NÚpartsÚidÚlocÚshapeÚobjzutf-8rš   r   z/faces/faces_z/edges/edges_z/vertices/vertexz/vertices/vertices)r’   r   Úwrappedr   rK   Údictr   Úbase64Ú	b64decodeÚencoder›   r   r   ÚMovedr‚   r   Ú	enumerateÚfacer   r   Úedger   r   r%   r   r   )r‚   ÚtraceÚvÚid_r§   ÚcompoundÚsr¨   ÚfacesÚir±   Úedgesr²   Úverticesr%   r†   Úwalks                  €€r+   r¼   z&ViewerBackend.load_model.<locals>.walkç   sQ  ø€ Ø˜7•^�Ø—5‘5˜“>Ð-Ù˜˜E•Nà˜D™'�Cà./°©hÐ.>œ›
×*Ò*ÄIÈqÐQVÉxÐDXð ô " ! G¡*¬dÔ3Ü#.Ü"×,Ñ,¨Q¨w©Z¸Ñ->×-EÑ-EÀgÓ-NÓOó$™ð &' w¢Zó!á%/ ô (¬×(8Ñ(8¸¿¹À'Ó9JÓ(KÕLØ%/ð ð !ô <?¸u»:Èº>¤=°Ô#7ÈuÐUVÉx˜Ü&.¨x¯~©~¸cÓ/BÓ&C�D—J‘J˜s‘OÜ% hÓ/�EÜ#,¨UÖ#3™˜˜4ØŸ
™
 c U¨-¸°sÐ#;¸TÔBä?CÀDÇJÁJÈsÃOÓ?T˜Ÿ
™
 c U¨-¸°sÐ#;Ò<ð $4ô & hÓ/�EÜ#,¨UÖ#3™˜˜4ØŸ
™
 c U¨-¸°sÐ#;¸TÔBð +.¨+œD œJ¼4ÀÇ
Á
È3ÃÓ;Pð Ÿ
™
 c U¨-¸°sÐ#;Ò<ð $4ô  ,¨HÓ5�HÜ%.¨xÖ%8™	˜˜6ØŸ™¨ uÐ,<¸Q¸CÐ%@À&ÔIð  #˜{ô # 6œNä!'¬°·±¸cÓ1BÓ(CÓ!Dð Ÿ
™
 c UÐ*<¸Q¸CÐ#@ÒAò &9ñA $ùò!s   Â4I"zocp-vscode-backend.logN)r‚   r   Úclose)r†   Ú	raw_modelr³   r¼   s   `  @r+   r‰   zViewerBackend.load_modelä   s0   ù€ õ(	ðT ˆŒ
ÜÐ.Ó/ˆÙˆY˜ÔØ�‰�r*   c                 ó  — t         st        d|› d�«       | j                  |   }t        «       }t	        |t
        «      r|j                  «       |_        �nƒt	        |t        «      rÃd|_	        d|_
        d|_        |j                  dk(  r|j                  |_	        n{|j                  dk(  rlt        |j                  «      j                  «       j!                  «       |_	        t        |j                  «      j                  «       j#                  «       |_        |j&                  |_        n°t	        |t(        «      ry|j                  dk(  r6t+        |j                  «      j-                  «       j/                  «       |_	        |j&                  |_        |j0                  |_        |j2                  |_        n't	        |t4        t6        f«      r|j8                  |_        t	        |t
        «      s|j                  nd|_        | j;                  |d«      \  }}|j                  «       |_        |j<                  |_        |› d|› �|_        tA        |«       t         rtC        |«      S tE        tC        |«      | jF                  «       t        d	|› �«       y)
zH
        Request the properties of the object with the given id
        zIdentifier received 'Ú'NÚCIRCLEÚELLIPSEÚCYLINDERFú : ú
Data sent )$Úis_jupter_cadqueryr3   r‚   ro   rK   r   Úto_tuplerq   r   rv   Úmajor_radiusÚminor_radiusrx   r
   rª   ÚEllipseÚMajorRadiusÚMinorRadiusrw   rr   r   r	   ÚCylinderÚRadiusrs   rt   r   r   ru   Ú
get_centerrp   re   r\   r   r   r~   )r†   r¢   r¨   Úresponserp   Úinfos         r+   r�   zViewerBackend.handle_properties  sà  € õ "ÜÐ3°H°:¸QÐ?Ô@à—
‘
˜8Ñ$ˆä%Ó'ˆä�eœVÔ$Ø%*§^¡^Ó%5ˆHÖ"ä˜œtÔ$Ø"ˆHŒOØ$(ˆHÔ!Ø$(ˆHÔ!Ø�‰ (Ò*Ø"'§,¡,�•Ø—‘ IÒ-Ü"+¨E¯M©MÓ":×"BÑ"BÓ"D×"PÑ"PÓ"R�”Ü#,¨U¯]©]Ó#;×#CÑ#CÓ#E×#QÑ#QÓ#S�Ô à#Ÿl™lˆH�Oä˜œtÔ$Ø�‰ *Ò,Ü"-¨e¯m©mÓ"<×"EÑ"EÓ"G×"NÑ"NÓ"P�”à#Ÿl™lˆHŒOØ"Ÿ[™[ˆHŒNØ!ŸJ™JˆH�Mä˜¤¤xÐ0Ô1Ø#Ÿl™lˆHŒOä4>¸uÄfÔ4M˜UŸ_š_ÐSWˆÔØ—‘ u¨eÓ4‰ˆ�Ø Ÿ/™/Ó+ˆŒØ!)§¡ˆÔØ"* ¨3¨t¨fÐ5ˆÔä�hÔåÜ˜(Ó#Ð#äœ& Ó*¨D¯I©IÔ6Ü˜j¨¨
Ð3Õ4r*   c                 óÈ  — t         st        d|› d|› d�«       | j                  |   }| j                  |   }t        |t        «      rt        |«      n@t        |t        «      r,|j                  dv rt        |dz  |j                  «       ¬«      n|dz  }t        |t        «      rt        |«      n@t        |t        «      r,|j                  dv rt        |dz  |j                  «       ¬«      n|dz  }t        |t
        «      r6t        |t
        «      r&|j                  j                  |j                  «      }nxt        |t        «      r"t        |t        «      r|j                  |«      }nFt        |t        «      r|n|}t        |t
        «      r|n|}	d|	j                  j                  |«      z
  }t        |«      }| j                  |d«      \  }
}| j                  |d«      \  }}|› d	|› d
|› d	|› �}t        |||
j                  «       |j                  «       ¬«      }t!        |«       t         rt#        |«      S t%        t#        |«      | j&                  «       t        d|› �«       y)zS
        Request the angle between the two objects that have the given ids
        úIdentifiers received 'ú', 'rÀ   ©rÁ   rÂ   r   )Úz_diréZ   TrÄ   Ú
)re   r{   rk   rl   rÅ   N)rÆ   r3   r‚   rK   r   r   r   rx   ÚnormalrÖ   Ú	get_angler   ÚabsrÏ   rz   rÇ   r\   r   r   r~   )r†   Úid1Úid2Úshape1Úshape2ÚfirstÚsecondr{   ÚvectorÚplanerk   Úinfo1rl   Úinfo2re   rÐ   s                   r+   rž   zViewerBackend.handle_angleI  s  € õ "ÜÐ4°S°E¸¸c¸UÀ!ÐDÔEàŸ
™
 3™ˆØŸ
™
 3™ˆô ˜&¤$Ô'ô �&ŒMô ˜f¤dÔ+Ø×$Ñ$Ð(=Ñ=ô �f˜q‘j¨¯©«Õ8ð ˜a‘Zð 	ô ˜&¤$Ô'ô �&ŒMô ˜f¤dÔ+Ø×$Ñ$Ð(=Ñ=ô �f˜q‘j¨¯©«Õ8ð ˜a‘Zð 	ô �eœUÔ#¬
°6¼5Ô(AØ—K‘K×)Ñ)¨&¯,©,Ó7‰EÜ˜œvÔ&¬:°f¼fÔ+EØ—O‘O FÓ+‰Eä(¨´Ô7‘U¸VˆFÜ'¨¬uÔ5‘E¸6ˆEà˜Ÿ™×.Ñ.¨vÓ6Ñ6ˆEÜ�E“
ˆØŸ™¨°Ó5‰ˆ�ØŸ™¨°Ó5‰ˆ�Ø˜˜S   r¨#¨¨c°%°Ð9ˆÜ Ø#ØØ—?‘?Ó$Ø—?‘?Ó$ô	
ˆô 	�hÔÝÜ˜(Ó#Ð#äœ& Ó*¨D¯I©IÔ6Ü˜j¨¨
Ð3Õ4r*   r¨   c                 ó  — t        |t        «      r |j                  «       t        j                  fS t        |t
        «      rM|j                  dv �r|r|j                  t        j                  fS |j                  «       t        j                  fS t        |t        «      r¿|j                  dv r±|s |j                  «       t        j                  fS |j                  «       j                  d«      }t        |«      dk(  rB|d   j                  |d   j                  |d   j                  z
  dz  z
  t        j                  fS 	 |d   j                  t        j                  fS |j                  «       t        j                  fS # t        $ r Y Œ+w xY w)a  
        Returns the center vector of the given shape
        Center of the shape depends on the type of the shape and the tool used
        For instance, circle edge center will be on the edge for properties tool
        but at the center of the circle for distance tool
        rÕ   )rÃ   rÁ   r™   r   éÿÿÿÿ)rK   r   rp   r    r%   r   rx   Ú
arc_centerr&   r'   r   rº   Ú	filter_byr›   r(   Ú
IndexError)r†   r¨   Úfor_distanceÚextremity_edgess       r+   rÏ   zViewerBackend.get_center€  ss  € ô �eœVÔ$Ø—<‘<“>Ô#5×#<Ñ#<Ð<Ð<Ü˜œtÔ$Ø�‰ð #ò ñ  Ø ×+Ñ+Ô-?×-HÑ-HÐHÐHà Ÿ<™<›>Ô+=×+BÑ+BÐBÐBä˜œtÔ$Ø�‰ ,Ñ.Ù#Ø Ÿ<™<›>Ô+=×+BÑ+BÐBÐBà"'§+¡+£-×"9Ñ"9¸(Ó"C�Ü�Ó'¨1Ò,à'¨Ñ*×5Ñ5à+¨AÑ.×9Ñ9Ø-¨bÑ1×<Ñ<ñ=ð ñ	ñô +×3Ñ3ðð ðà+¨AÑ.×9Ñ9Ü.×7Ñ7ð ð ð �|‰|‹~Ô1×6Ñ6Ð6Ð6øô &ò ñ ðús   Ä>E= Å=	F	ÆF	c                 óà  — t         st        d|› d|› d�«       | j                  |   }| j                  |   }| j                  |«      \  }}| j                  |«      \  }}|› d|› d|› d|› �}	||z
  j                  }
t        |	|j                  «       |j                  «       |
¬«      }t        |«       t         rt        |«      S t        t        |«      | j                  «       t        d|› �«       y)	zV
        Request the distance between the two objects that have the given ids
        rÓ   rÔ   rÀ   rÄ   rØ   )re   rk   rl   rm   rÅ   N)rÆ   r3   r‚   rÏ   rr   ri   rÇ   r\   r   r   r~   )r†   rÜ   rÝ   rÞ   rß   Úp1rä   Úp2rå   re   ÚdistrÐ   s               r+   rœ   zViewerBackend.handle_distance²  sä   € õ "ÜÐ4°S°E¸¸c¸UÀ!ÐDÔEàŸ
™
 3™ˆØŸ
™
 3™ˆØ—O‘O FÓ+‰	ˆˆEØ—O‘O FÓ+‰	ˆˆEØ˜˜S   r¨#¨¨c°%°Ð9ˆØ�R‘×ÑˆÜ#Ø#Ø—;‘;“=Ø—;‘;“=Øô	
ˆô 	�hÔÝÜ˜(Ó#Ð#äœ& Ó*¨D¯I©IÔ6Ü˜j¨¨
Ð3Õ4r*   rJ   )T)r!   r"   r#   r$   Úintr‡   r‹   r?   r   rŠ   r“   r‰   r�   rž   r   rV   r   r    rÏ   rœ   r)   r*   r+   r}   r}   Ÿ   s|   „ ññ˜Sð °$ó ò&ð ð;°ò ;ó ð;ò*;ò,0òd15òf55ðp *.ñ07Øð07à	ˆvÐ)Ð)Ñ	*ó07ód5r*   r}   Ú__main__zOCP Viewer Backendz--portzPort the viewer listens to)rR   ÚrequiredÚhelp)r™   )Cr$   Úargparser¬   r0   r7   Údataclassesr   r   r   ÚosÚocp_tessellate.ocp_utilsr   r   r   r	   r
   Úocp_tessellate.tessellatorr   r   r   Úocp_tessellate.tracer   Úocp_vscode.backend_logor   Úocp_vscode.build123dr   r   r   r   r   r   r   r   r   r   Úenvironr’   rÆ   Úocp_vscode.commsr   r   r   r   r    r3   r?   rA   r\   r^   rc   ri   ro   rz   r}   r!   ÚArgumentParserÚparserÚadd_argumentrñ   Ú
parse_argsr:   r~   Úbackendr‹   r6   Úexr/   r)   r*   r+   Ú<module>r     s¿  ðÙ 'ã Û Û 
Û ß 1Ñ 1Û 	÷õ ÷ñ õ
 'å (÷÷ ÷ ð ‡:�:‡>�>Ð$Ó%Ð-ØÐÞ.àÐç <Ñ <÷Nñ Nò-ò
ð ÷ð ó ðó5ð& ÷#ð #ó ð#ð ô#�Xó #ó ð#ð ô�~ó ó ðð ô˜ó ó ðð ô�Nó ó ð÷k5ñ k5ð\	 ˆzÒØ$ˆX×$Ñ$Ð%9Ó:€FØ
×ÑØ�s TÐ0Lð ô ð ×ÑÓ€DÙ˜DŸI™IÓ&€GðØ�‰�ð øð ò Ùˆb�	‰	ûðús   ÅE* Å*FÅ/E<Å<F