§
    ž¿jx9  ã                   ó  — 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	Z	ddl
Z
ddlZ ee
j        d¦  «        re
j                             d¬¦  «          ee¦  «                             ¦   «         j        j        Zedz  dz  Zedz  d	z  Z ee¦  «        e
j        vr$e
j                             d ee¦  «        ¦  «         	 dd
lmZmZ n# e$ r dZdZY nw xY w	 ddlmZ ddlm Z  n# e$ r dZdZ Y nw xY wdefd„Z! G d„ d¦  «        Z" G d„ dej#        j$        e"¦  «        Z%dde&fd„Z'e(dk    �rUdZ) e*e
j+        ¦  «        dk    �r0e
j+        d         dk    r9 e*e
j+        ¦  «        dk    r%	  e&e
j+        d         ¦  «        Z)nó# e,$ r dZ)Y nêw xY wde
j+        v rZe
j+         -                    d¦  «        Z.e.dz    e*e
j+        ¦  «        k     r(	  e&e
j+        e.dz            ¦  «        Z)n‘# e,$ r dZ)Y nˆw xY wnƒe
j+        d          /                    d¦  «        r>	  e&e
j+        d          0                    d¦  «        d         ¦  «        Z)n2# e,$ r dZ)Y n)w xY w	  e&e
j+        d         ¦  «        Z)n# e,$ r dZ)Y nw xY w e'e)¬¦  «         dS dS )zä
FreeExile PC Desktop Web Client Local Testing Server.
Serves the dedicated full-screen PC client (client/web_pc) at root / on port 8089,
while seamlessly routing shared assets, templates, and engine modules from client/webapp.
é    N)ÚPathÚreconfigureúutf-8)ÚencodingÚclientÚweb_pcÚwebapp)ÚFeedbackServiceÚSystemDiagnosticsDTO)ÚWildernessMapGenerator)Úserialize_map_gridÚreturnc                  ó:  — t          j         t           j        t           j        ¦  «        } 	 |                      d¦  «         |                      ¦   «         d         }n# t
          $ r d}Y nw xY w|                      ¦   «          n# |                      ¦   «          w xY w|S )z1Detects local LAN IPv4 address for local testing.)z8.8.8.8éP   r   z	127.0.0.1)ÚsocketÚAF_INETÚ
SOCK_DGRAMÚconnectÚgetsocknameÚ	ExceptionÚclose)ÚsÚips     ú+C:\Projects\FreeExile\tools\serve_web_pc.pyÚget_local_ipr   )   s�   € åŒ•f”n¥fÔ&7Ñ8Ô8€AðØ	�	Š	�/Ñ"Ô"Ð"Ø�]Š]‰_Œ_˜QÔˆˆøÝð ð ð Øˆˆˆðøøøð 	
�Š‰	Œ	ˆ	ˆ	øˆ�Š‰	Œ	ˆ	ˆ	øøøØ€Is)   «/A ÁB ÁA*Á'B Á)A*Á*B ÂBc                   ó   — e Zd ZdZdd„ZdS )ÚFreeExilePCHTTPOptionsMixinz7Handles CORS headers, options, and dev caching headers.r   Nc                 ó¶   — |                       dd¦  «         |                       dd¦  «         |                       dd¦  «         |                       dd¦  «         d S )	NzAccess-Control-Allow-OriginÚ*zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-HeadersúContent-TypezCache-Controlz#no-cache, no-store, must-revalidate)Úsend_header©Úselfs    r   Úsend_cors_headersz-FreeExilePCHTTPOptionsMixin.send_cors_headers9   se   € Ø×ÒÐ6¸Ñ<Ô<Ð<Ø×ÒÐ7Ð9MÑNÔNÐNØ×ÒÐ7¸ÑHÔHÐHØ×Ò˜Ð*OÑPÔPÐPÐPÐPó    ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   © r%   r   r   r   6   s4   € € € € € ØAÐAðQð Qð Qð Qð Qð Qr%   r   c                   ó¼   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ fd„Zˆ fd„Zd„ Ze	de
de
d	efd
„¦   «         Zde
d	dfd„Zded	dfd„Zdd„Zded	e
dz  fd„Zd„ Zd„ Zdd„Zˆ xZS )ÚFreeExilePCRequestHandlerzLCustom HTTP handler serving PC Desktop Web Client with shared asset routing.c                 ób   •—  t          ¦   «         j        |dt          t          ¦  «        i|¤Ž d S )NÚ	directory)ÚsuperÚ__init__ÚstrÚPROJECT_ROOT)r#   ÚargsÚkwargsÚ	__class__s      €r   r1   z"FreeExilePCRequestHandler.__init__C   s2   ø€ Ø�‰ŒÔ˜$ÐF­#­lÑ*;Ô*;ÐF¸vÐFÐFÐFÐFÐFr%   c                 óp   •— |                       ¦   «          t          ¦   «                              ¦   «          d S ©N)r$   r0   Úend_headers©r#   r6   s    €r   r9   z%FreeExilePCRequestHandler.end_headersF   s1   ø€ Ø×ÒÑ Ô Ð Ý‰Œ×ÒÑÔÐÐÐr%   c                 ó†   •— 	 t          ¦   «                              ¦   «          d S # t          t          t          f$ r Y d S w xY wr8   )r0   ÚhandleÚConnectionResetErrorÚBrokenPipeErrorÚOSErrorr:   s    €r   r<   z FreeExilePCRequestHandler.handleJ   óK   ø€ ð	Ý‰GŒG�NŠNÑÔÐÐÐøÝ$¥oµwÐ?ð 	ð 	ð 	ØˆDˆDð	øøøó   ƒ % ¥A ¿A c                 ó†   •— 	 t          ¦   «                              ¦   «          d S # t          t          t          f$ r Y d S w xY wr8   )r0   Úfinishr=   r>   r?   r:   s    €r   rC   z FreeExilePCRequestHandler.finishP   r@   rA   c                 óX   — |                       d¦  «         |                      ¦   «          d S )NéÈ   )Úsend_responser9   r"   s    r   Ú
do_OPTIONSz$FreeExilePCRequestHandler.do_OPTIONSV   s.   € Ø×Ò˜3ÑÔÐØ×ÒÑÔÐÐÐr%   ÚbaseÚtargetr   c                 ó   — 	 |                      ¦   «         }|                       ¦   «         }t          |d¦  «        r|                     |¦  «        n||k    p||j        v o|                     ¦   «         S # t
          t          t          f$ r Y dS w xY w)zSVerifies that target resolves strictly within base directory and is a regular file.Úis_relative_toF)ÚresolveÚhasattrrK   ÚparentsÚis_fileÚ
ValueErrorÚRuntimeErrorr?   )rH   rI   Útarget_resolvedÚbase_resolveds       r   Ú_is_safe_childz(FreeExilePCRequestHandler._is_safe_childZ   s£   € ð		Ø$ŸnšnÑ.Ô.ˆOØ ŸLšL™NœNˆMåBIÈ/Ð[kÑBlÔBlð e�×/Ò/°Ñ>Ô>Ð>Ø&¨-Ò7Ðc¸=ÈOÔLcÐ;cð.à#×+Ò+Ñ-Ô-ðøõ
 �L­'Ð2ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚A/A2 Á2BÂBÚ	file_pathNc                 ó  — |                      ¦   «         s |                      dd|j        › �¦  «         d S t          j        t          |¦  «        ¦  «        \  }}|€d}|j        dk    rd}n|j        dk    rd}n|j        dk    rd	}	 t          |d
¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |  	                    d¦  «         |  
                    d|¦  «         |  
                    dt          t          |¦  «        ¦  «        ¦  «         |                      ¦   «          | j                             |¦  «         d S # t          t           f$ r Y d S t"          $ rX}t%          |dd ¦  «        dk    rn+	 |                      dd|› �¦  «         n# t&          $ r Y nw xY wY d }~d S Y d }~d S Y d }~d S d }~wt&          $ r<}	 |                      dd|› �¦  «         n# t&          $ r Y n
w xY wY d }~d S Y d }~d S d }~ww xY w)Né”  zFile not found: úapplication/octet-streamz.jsz%application/javascript; charset=utf-8z.cssztext/css; charset=utf-8z.htmlztext/html; charset=utf-8ÚrbrE   r    úContent-LengthÚwinerroriF'  éô  zError reading file: )rO   Ú
send_errorÚnameÚ	mimetypesÚ
guess_typer2   ÚsuffixÚopenÚreadrF   r!   Úlenr9   ÚwfileÚwriter=   r>   r?   Úgetattrr   )r#   rU   Úcontent_typeÚ_ÚfÚdataÚes          r   Ú_serve_filez%FreeExilePCRequestHandler._serve_fileh   sÕ  € Ø× Ò Ñ"Ô"ð 	Ø�OŠO˜CÐ!D°I´NÐ!DÐ!DÑEÔEÐEØˆFÝ#Ô.­s°9©~¬~Ñ>Ô>‰ˆ�aØÐØ5ˆLØÔ˜uÒ$Ð$ØBˆLˆLØÔ Ò'Ð'Ø4ˆLˆLØÔ Ò(Ð(Ø5ˆLð	Ý�i Ñ&Ô&ð  ¨!Ø—v’v‘x”x�ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  à×Ò˜sÑ#Ô#Ð#Ø×Ò˜^¨\Ñ:Ô:Ð:Ø×ÒÐ-­sµ3°t±9´9©~¬~Ñ>Ô>Ð>Ø×ÒÑÔÐØŒJ×Ò˜TÑ"Ô"Ð"Ð"Ð"øÝ$¥oÐ6ð 	ð 	ð 	ØˆDˆDÝð 	ð 	ð 	Ý�q˜* dÑ+Ô+¨uÒ4Ð4ØðØ—O’O CÐ)CÀÐ)CÐ)CÑDÔDÐDÐDøÝ ð ð ð Ø�Dðøøøð	 �����ð EÐDÐDÐDÐDÐDà�D�D�D�D�DøøøøÝð 	ð 	ð 	ðØ—’ Ð%?¸AÐ%?Ð%?Ñ@Ô@Ð@Ð@øÝð ð ð Ø�ðøøøð AÐ@Ð@Ð@Ð@Ð@à�����øøøøð		øøøs‘   ÂE ÂB8Â,E Â8B<Â<E Â?B<Ã BE ÅHÅ"	HÅ+F>ÆFÆF>Æ
F)Æ&F>Æ(F)Æ)F>Æ>HÇG&Ç%HÇ&
G3Ç0HÇ2G3Ç3HÈHÚqueryc           	      ó’  — 	 t           j                             |¦  «        }|                     ddg¦  «        d         }t	          |                     ddg¦  «        d         ¦  «        }|                     dd g¦  «        d         }t
          rÎt          rÇt          j        ||¬¦  «        }|                     ||¬¦  «        }t          |¦  «        }|  	                    d	¦  «         |  
                    d
d¦  «         |  
                    dt          t          |¦  «        ¦  «        ¦  «         |                      ¦   «          | j                             |¦  «         d S |                      dd¦  «         d S # t"          $ rÊ}	t%          j        dt          |	¦  «        i¦  «                             d¦  «        }
|  	                    d¦  «         |  
                    d
d¦  «         |  
                    dt          t          |
¦  «        ¦  «        ¦  «         |                      ¦   «          | j                             |
¦  «         Y d }	~	d S d }	~	ww xY w)NÚzone_idÚzone_tang_kiem_nhair   Úseedé*   Úbiome)Úbiome_id)rr   rp   rE   r    rX   rZ   r\   z$WildernessMapGenerator not availableÚerrorr   úapplication/json; charset=utf-8)ÚurllibÚparseÚparse_qsÚgetÚintr   r   Úfor_zoneÚgeneraterF   r!   r2   rd   r9   re   rf   r]   r   ÚjsonÚdumpsÚencode)r#   rn   Úparamsrp   rr   Úbiome_paramÚgenÚ	grid_dataÚpayloadrl   Úerrs              r   Ú_handle_map_apiz)FreeExilePCRequestHandler._handle_map_apiŽ   s%  € ð	"Ý”\×*Ò*¨5Ñ1Ô1ˆFØ—j’j Ð-BÐ,CÑDÔDÀQÔGˆGÝ�v—z’z &¨2¨$Ñ/Ô/°Ô2Ñ3Ô3ˆDØ Ÿ*š* W¨t¨fÑ5Ô5°aÔ8ˆKÝ%ð 
MÕ*<ð 
MÝ,Ô5°gÈÐTÑTÔT�ØŸLšL¨d¸G˜LÑDÔD�	Ý,¨YÑ7Ô7�Ø×"Ò" 3Ñ'Ô'Ð'Ø× Ò  Ð1KÑLÔLÐLØ× Ò Ð!1µ3µs¸7±|´|Ñ3DÔ3DÑEÔEÐEØ× Ò Ñ"Ô"Ð"Ø”
× Ò  Ñ)Ô)Ð)Ð)Ð)à—’ Ð%KÑLÔLÐLÐLÐLøÝð 	"ð 	"ð 	"Ý”*˜g¥s¨1¡v¤vÐ.Ñ/Ô/×6Ò6°wÑ?Ô?ˆCØ×Ò˜sÑ#Ô#Ð#Ø×Ò˜^Ð-NÑOÔOÐOØ×ÒÐ-­sµ3°s±8´8©}¬}Ñ=Ô=Ð=Ø×ÒÑÔÐØŒJ×Ò˜SÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøs   ‚EE2 ÅE2 Å2
IÅ<B?IÉIc           	      ó�  — 	 g }t           r0t          ¦   «         }|                     d¬¦  «        }d„ |D ¦   «         }t          j        d|id¬¦  «                             d¦  «        }|                      d¦  «         |                      d	d
¦  «         |                      dt          t          |¦  «        ¦  «        ¦  «         |  	                    ¦   «          | j
                             |¦  «         d S # t          $ rÊ}t          j        dt          |¦  «        i¦  «                             d¦  «        }|                      d¦  «         |                      d	d
¦  «         |                      dt          t          |¦  «        ¦  «        ¦  «         |  	                    ¦   «          | j
                             |¦  «         Y d }~d S d }~ww xY w)Né   )Úlimitc                 ó€   — g | ];}|j         |j        |j        |j        |j        |j        |j        |j        |j        d œ	‘Œ<S )©	Úfeedback_idÚ	player_idÚplayer_nameÚcategoryÚtitleÚcontentÚstatusÚadmin_responseÚcreated_at_msr�   )Ú.0rj   s     r   ú
<listcomp>zBFreeExilePCRequestHandler._handle_feedback_get.<locals>.<listcomp>­   s_   € ð ð ð ð ð ()¤}Ø%&¤[Ø'(¤}Ø$%¤JØ!"¤Ø#$¤9Ø"#¤(Ø*+Ô*:Ø)*¬ð
ð 
ðð ð r%   Ú	feedbacksF)Úensure_asciir   rE   r    rw   rZ   rv   r\   )r
   Úlist_feedbacksr   r€   r�   rF   r!   r2   rd   r9   re   rf   r   )r#   ÚrecordsÚsvcr™   Úresrl   r‡   s          r   Ú_handle_feedback_getz.FreeExilePCRequestHandler._handle_feedback_get§   sÊ  € ð	"ØˆGÝð Ý%Ñ'Ô'�Ø×.Ò.°RÐ.Ñ8Ô8�	ðð ð 'ðñ ô �õ ”*˜k¨7Ð3À%ÐHÑHÔH×OÒOÐPWÑXÔXˆCØ×Ò˜sÑ#Ô#Ð#Ø×Ò˜^Ð-NÑOÔOÐOØ×ÒÐ-­sµ3°s±8´8©}¬}Ñ=Ô=Ð=Ø×ÒÑÔÐØŒJ×Ò˜SÑ!Ô!Ð!Ð!Ð!øÝð 	"ð 	"ð 	"Ý”*˜g¥s¨1¡v¤vÐ.Ñ/Ô/×6Ò6°wÑ?Ô?ˆCØ×Ò˜sÑ#Ô#Ð#Ø×Ò˜^Ð-NÑOÔOÐOØ×ÒÐ-­sµ3°s±8´8©}¬}Ñ=Ô=Ð=Ø×ÒÑÔÐØŒJ×Ò˜SÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøs   ‚C-C1 Ã1
GÃ;B?G Ç GÚ
clean_pathc                 óJ  — |dv r)t           dz  }|                      t           |¦  «        r|ndS t          j                             |¦  «                             dd¦  «        }d„ |                     d¦  «        D ¦   «         }d|v st          d„ |D ¦   «         ¦  «        rdS |                     d¦  «        }|                     d¦  «        }d	D ]c}||fD ]\}| 	                    |¦  «        rE|t          |¦  «        d…         }	t          d
z  |	z  }
|                      t          |
¦  «        r|
c c S Œ]Œd| 	                    d¦  «        r>|t          d¦  «        d…         }	t           |	z  }
|                      t           |
¦  «        r|
S | 	                    d¦  «        r>|t          d¦  «        d…         }	t          |	z  }
|                      t          |
¦  «        r|
S t           |z  }|                      t           |¦  «        r|S t          |z  }|                      t          |¦  «        r|S dS )zTResolves URL paths across PC directory and WebApp directory with strict containment.)Ú ú
index.htmlú/r£   Nú\r¤   c                 ó   — g | ]}|¯|‘ŒS r+   r+   ©r—   r   s     r   r˜   zBFreeExilePCRequestHandler._resolve_static_path.<locals>.<listcomp>Ó   s   € Ð8Ð8Ð8˜!°aÐ8�AÐ8Ð8Ð8r%   z..c              3   ó   K  — | ]}d |v V — Œ	dS )ú:Nr+   r§   s     r   ú	<genexpr>zAFreeExilePCRequestHandler._resolve_static_path.<locals>.<genexpr>Ô   s&   è è € Ð">Ð">° 3¨! 8Ð">Ð">Ð">Ð">Ð">Ð">r%   )zweb_pc/css/assets/zweb_pc/assets/zassets/Úassetszweb_pc/zwebapp/)ÚPC_DIRrT   rx   ry   ÚunquoteÚreplaceÚsplitÚanyÚlstripÚ
startswithrd   Ú
WEBAPP_DIR)r#   r    Úindex_pÚunquotedÚsegmentsÚstrippedÚunquoted_strippedÚprefixr   ÚsubÚpÚcandidate_pcÚcandidate_webapps                r   Ú_resolve_static_pathz.FreeExilePCRequestHandler._resolve_static_pathÉ   sV  € àÐ0Ð0Ð0Ý˜|Ñ+ˆGØ"×1Ò1µ&¸'ÑBÔBÐL�7�7ÈÐLõ ”<×'Ò'¨
Ñ3Ô3×;Ò;¸DÀ#ÑFÔFˆð 9Ð8˜xŸ~š~¨cÑ2Ô2Ð8Ñ8Ô8ˆØ�8ÐÐ�sÐ">Ð">°XÐ">Ñ">Ô">Ñ>Ô>ÐØ�4à×$Ò$ SÑ)Ô)ˆØ$ŸOšO¨CÑ0Ô0Ðð Jð 	!ð 	!ˆFØÐ 1Ð2ð !ð !�Ø—<’< Ñ'Ô'ð !Ø�C ™KœK˜L˜Lœ/�CÝ" XÑ-°Ñ3�AØ×*Ò*­:°qÑ9Ô9ð !Ø ˜˜˜˜˜øð!ð ×Ò˜yÑ)Ô)ð 	Ø�3˜y™>œ>˜?˜?Ô+ˆCÝ˜‘ˆAØ×"Ò"¥6¨1Ñ-Ô-ð Ø�à×Ò˜yÑ)Ô)ð 	Ø�3˜y™>œ>˜?˜?Ô+ˆCÝ˜SÑ ˆAØ×"Ò"¥:¨qÑ1Ô1ð Ø�õ  Ñ(ˆØ×Ò�v |Ñ4Ô4ð 	 ØÐõ &¨Ñ0ÐØ×Ò�zÐ+;Ñ<Ô<ð 	$Ø#Ð#àˆtr%   c                 óÊ  — t           j                             | j        ¦  «        }|j        }|                     d¦  «        r|                      |j        ¦  «         d S |                     d¦  «        r|                      ¦   «          d S |                      |¦  «        }|r+| 	                    ¦   «         r|  
                    |¦  «         d S |                      dd|› �¦  «         d S )Nz/api/mapú/api/feedbackrW   zPath not found: )rx   ry   ÚurlparseÚpathr²   rˆ   rn   rŸ   r¾   rO   rm   r]   )r#   Úparsedr    Úresolveds       r   Údo_GETz FreeExilePCRequestHandler.do_GETû   së   € Ý”×&Ò& t¤yÑ1Ô1ˆØ”[ˆ
à× Ò  Ñ,Ô,ð 	Ø× Ò  ¤Ñ.Ô.Ð.ØˆFØ× Ò  Ñ1Ô1ð 	Ø×%Ò%Ñ'Ô'Ð'ØˆFà×,Ò,¨ZÑ8Ô8ˆØð 	B˜×(Ò(Ñ*Ô*ð 	BØ×Ò˜XÑ&Ô&Ð&Ð&Ð&à�OŠO˜CÐ!@°JÐ!@Ð!@ÑAÔAÐAÐAÐAr%   c                 ót   — | j         dk    r|                      ¦   «          d S |                      dd¦  «         d S )NrÀ   rW   zEndpoint not found)rÂ   Ú_handle_feedback_postr]   r"   s    r   Údo_POSTz!FreeExilePCRequestHandler.do_POST  sB   € ØŒ9˜Ò'Ð'Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(à�OŠO˜CÐ!5Ñ6Ô6Ð6Ð6Ð6r%   c                 ó   — 	 t          | j                             dd¦  «        ¦  «        }| j                             |¦  «        }t          j        |                     d¦  «        ¦  «        }|                     di ¦  «        }d }t          rÖt          |                     dd¦  «        |                     dd¦  «        |                     d	d
¦  «        t          |                     dd¦  «        ¦  «        t          |                     dd¦  «        ¦  «        |                     dd¦  «        |                     dd¦  «        | j                             dd¦  «        ¬¦  «        }d}d}d}t          r‘t          ¦   «         }	|	                     |                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |                     dd ¦  «        |                     d!d"¦  «        |¬#¦  «        \  }}}t          j        |||d$œ¦  «                             d¦  «        }
|                      |rd%nd&¦  «         |                      d'd(¦  «         |                      dt!          t#          |
¦  «        ¦  «        ¦  «         |                      ¦   «          | j                             |
¦  «         d S # t*          $ rË}t          j        d)t!          |¦  «        d*œ¦  «                             d¦  «        }|                      d+¦  «         |                      d'd(¦  «         |                      dt!          t#          |¦  «        ¦  «        ¦  «         |                      ¦   «          | j                             |¦  «         Y d }~d S d }~ww xY w),NrZ   r   r   ÚdiagnosticsÚclient_platformÚPCÚ
os_versionz
Windows 11Údevice_modelÚDesktopÚcurrent_fpsg      ^@Úcurrent_ping_msé   Úactive_zonerq   Úplayer_coordsz0.0,0.0z
User-Agentz
PC Browser)rË   rÍ   rÎ   rÐ   rÑ   rÓ   rÔ   Ú
browser_uaTÚ
fb_pc_mockzFeedback received successfullyr�   Úpc_exiler�   z	PC Playerr‘   Úbugr’   zPC Feedbackr“   r¢   )r�   r�   r‘   r’   r“   rÊ   )ÚsuccessrŽ   ÚmessagerE   i�  r    rw   F)rÙ   rv   r\   )r|   Úheadersr{   Úrfilerc   r   ÚloadsÚdecoder   Úfloatr
   Úsubmit_feedbackr€   r�   rF   r!   r2   rd   r9   re   rf   r   )r#   ÚlengthÚbodyrk   Ú	diag_dataÚdiagrÙ   Úfb_idÚmsgr�   rž   rl   r‡   s                r   rÇ   z/FreeExilePCRequestHandler._handle_feedback_post  sG  € ð*	"Ý˜œ×)Ò)Ð*:¸AÑ>Ô>Ñ?Ô?ˆFØ”:—?’? 6Ñ*Ô*ˆDÝ”:˜dŸkšk¨'Ñ2Ô2Ñ3Ô3ˆDØŸš °Ñ3Ô3ˆIØˆDÝ#ð 
Ý+Ø$-§M¢MÐ2CÀTÑ$JÔ$JØ(Ÿ}š}¨\¸<ÑHÔHØ!*§¢¨~¸yÑ!IÔ!IÝ % i§m¢m°MÀ5Ñ&IÔ&IÑ JÔ JÝ$'¨	¯ªÐ6GÈÑ(LÔ(LÑ$MÔ$MØ )§¢¨mÐ=RÑ SÔ SØ"+§-¢-°ÀÑ"KÔ"KØ#œ|×/Ò/°¸lÑKÔKð	ñ 	ô 	�ð ˆGØ ˆEØ2ˆCÝð 	Ý%Ñ'Ô'�Ø&)×&9Ò&9Ø"Ÿhšh {°JÑ?Ô?Ø $§¢¨¸Ñ DÔ DØ!ŸXšX j°%Ñ8Ô8ØŸ(š( 7¨MÑ:Ô:Ø ŸHšH Y°Ñ3Ô3Ø $ð ':ñ 'ô 'Ñ#�˜ õ ”*¨ÀÐSVÐWÐWÑXÔX×_Ò_Ð`gÑhÔhˆCØ×Ò gÐ6˜s˜s°3Ñ7Ô7Ð7Ø×Ò˜^Ð-NÑOÔOÐOØ×ÒÐ-­sµ3°s±8´8©}¬}Ñ=Ô=Ð=Ø×ÒÑÔÐØŒJ×Ò˜SÑ!Ô!Ð!Ð!Ð!øÝð 	"ð 	"ð 	"Ý”*¨½¸Q¹¼Ð@Ð@ÑAÔA×HÒHÈÑQÔQˆCØ×Ò˜sÑ#Ô#Ð#Ø×Ò˜^Ð-NÑOÔOÐOØ×ÒÐ-­sµ3°s±8´8©}¬}Ñ=Ô=Ð=Ø×ÒÑÔÐØŒJ×Ò˜SÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøs   ‚J4J8 Ê8
NËC NÎNr&   )r'   r(   r)   r*   r1   r9   r<   rC   rG   Ústaticmethodr   ÚboolrT   rm   r2   rˆ   rŸ   r¾   rÅ   rÈ   rÇ   Ú__classcell__)r6   s   @r   r-   r-   @   sˆ  ø€ € € € € ØVÐVðGð Gð Gð Gð Gðð ð ð ð ðð ð ð ð ðð ð ð ð ðð ð ð ð˜Tð ¨4ð °Dð ð ð ñ „\ðð$ Tð $¨dð $ð $ð $ð $ðL" Sð "¨Tð "ð "ð "ð "ð2 "ð  "ð  "ð  "ðD0¨sð 0°t¸d±{ð 0ð 0ð 0ð 0ðdBð Bð Bð"7ð 7ð 7ð+"ð +"ð +"ð +"ð +"ð +"ð +"ð +"r%   r-   é™  Úportc                 óÖ  — t          ¦   «         } G d„ dt          j        t          j        ¦  «        } |d| ft          ¦  «        5 }t          d¦  «         t          d| › d�¦  «         t          d¦  «         t          d| › d�¦  «         t          d	|› d
| › d�¦  «         t          dt          › �¦  «         t          d¦  «         t          d¦  «         	 	 |                     ¦   «          nc# t          $ r& t          d¦  «         | 	                    ¦   «          Y n5t          $ r(}t          d|› �t          j        ¬¦  «         Y d}~nd}~ww xY wŒz	 ddd¦  «         dS # 1 swxY w Y   dS )z/Starts the FreeExile PC Web Client HTTP server.c                   ó   — e Zd ZdZdZdZdS )ú)start_server.<locals>.ThreadingHTTPServerTé@   N)r'   r(   r)   Údaemon_threadsÚallow_reuse_addressÚrequest_queue_sizer+   r%   r   ÚThreadingHTTPServerrî   C  s!   € € € € € ØˆØ"ÐØÐÐÐr%   ró   z0.0.0.0zB==================================================================z-  FREEEXILE PC DESKTOP ARPG WEB CLIENT (PORT z)             z   Local Host : http://localhost:r¤   z  LAN Access : http://r©   z  Serving    : z"  Press Ctrl+C to stop the server.Tz
Shutting down PC web server...z[!] Server transient warning: )ÚfileN)r   ÚsocketserverÚThreadingMixInÚ	TCPServerr-   Úprintr¬   Úserve_foreverÚKeyboardInterruptÚshutdownr   ÚsysÚstderr)rë   Úlocal_ipró   Úhttpdrl   s        r   Ústart_serverr   @  s'  € å‰~Œ~€Hð ð  ð  ð  ð  �lÔ9½<Ô;Qñ  ô  ð  ð
 
Ð	˜i¨Ð.Õ0IÑ	JÔ	Jð MÈeÝÐRÑSÔSÐSÝÐR¸dÐRÐRÐRÑSÔSÐSÝÐRÑSÔSÐSÝÐ8°Ð8Ð8Ð8Ñ9Ô9Ð9ÝÐ9 xÐ9Ð9°$Ð9Ð9Ð9Ñ:Ô:Ð:ÝÐ(¥Ð(Ð(Ñ)Ô)Ð)ÝÐ2Ñ3Ô3Ð3ÝÐRÑSÔSÐSð	MðMØ×#Ò#Ñ%Ô%Ð%Ð%øÝ$ð ð ð ÝÐ8Ñ9Ô9Ð9Ø—’Ñ Ô Ð Ø�Ýð Mð Mð MÝÐ:°qÐ:Ð:ÅÄÐLÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð	Mð ðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mð Mð MsI   ÁBEÃC,Ã+EÃ,-EÄEÄ	EÄ$EÅEÅEÅEÅE"Å%E"Ú__main__é   z--porté   z--port=ú=)rë   )rê   )1r*   Úhttp.serverÚhttpr   r_   ÚosÚpathlibr   r   rõ   rü   Úurllib.parserx   rM   Ústdoutr   Ú__file__rL   Úparentr3   r¬   r³   r2   rÂ   ÚinsertÚ server.feedback.feedback_servicer
   r   ÚImportErrorÚ%server.world.wilderness_map_generatorr   Ú"server.world.map_binary_serializerr   r   r   ÚserverÚSimpleHTTPRequestHandlerr-   r|   r   r'   r»   rd   ÚargvrP   ÚindexÚidxr²   r¯   r+   r%   r   ú<module>r     sL  ððð ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø	˜Ñ	  8Ñ	+€Ø˜HÑ$ xÑ/€
à€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)ð ØVÐVÐVÐVÐVÐVÐVÐVÐVøØð  ð  ð  Ø€OØÐÐÐð øøøðØLÐLÐLÐLÐLÐLØEÐEÐEÐEÐEÐEÐEøØð ð ð Ø!ÐØÐÐÐðøøøð

�cð 
ð 
ð 
ð 
ðQð Qð Qð Qð Qñ Qô Qð Qð}"ð }"ð }"ð }"ð }" ¤Ô DÐFañ }"ô }"ð }"ð@Mð M�sð Mð Mð Mð Mð8 ˆzÒÑØ€AØ
€sˆ3Œ8�}„}�qÒÑØŒ8�AŒ;˜(Ò"Ð" s s¨3¬8¡}¤}°qÒ'8Ð'8ðØ�C˜œ œÑ$Ô$��øØð ð ð Ø���ðøøøà˜œÐ!Ð!Ø”(—.’. Ñ*Ô*ˆCØ�Q‰w˜˜˜SœX™œÒ&Ð&ðØ˜˜CœH S¨1¡WÔ-Ñ.Ô.�A�AøØ!ð ð ð Ø�A�A�Aðøøøð 'ð
 ŒX�aŒ[×#Ò# IÑ.Ô.ð 		ðØ�C˜œ œ×)Ò)¨#Ñ.Ô.¨qÔ1Ñ2Ô2��øØð ð ð Ø���ðøøøðØ�C˜œ œÑ$Ô$��øØð ð ð Ø���ðøøøà€L�aÐÑÔÐÐÐð3 Ðsl   ÃC Ã	CÃCÃC) Ã)	C5Ã4C5Å/F ÆFÆFÇG( Ç(G2Ç1G2È/I ÉIÉIÉI, É,I6É5I6