Ë
    &8Øj37  ã                   óÌ   — d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
mZ dZdZd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zedk(  r ej0                   e«       «       yy)u#  ç”Ÿæˆ� VMess é“¾æŽ¥ä¸Ž sing-box é…�ç½®ã€‚

ç”¨æ³•:
    ./gen-config.py <åŸŸå��> <è·¯å¾„> [é€‰é¡¹]

ç¤ºä¾‹:
    ./gen-config.py stargazer.org.cn /ray
    ./gen-config.py example.com /abc --uuid å·²æœ‰çš„UUID --name HK-WS-TLS
    ./gen-config.py example.com /abc --port 8443 --outdir /tmp/cfg
é    N)Údatez$https://cdn.jsdelivr.net/gh/SagerNet)z/var/www/htmlz/srv/wwwz/usr/share/nginx/htmlz/var/wwwz/var/www/htdocsc                 óZ  — t         j                  j                  | «      }t        D ]r  }||k(  s#|j	                  |t         j
                  z   «      sŒ+	 t        j                  «       d   }t        d|› d�d|› d�dd|› d	�d
ddddt        j                  ¬«
        y y# t        $ r d}Y Œ@w xY w)uF   outdir è�½åœ¨å¸¸è§� DocumentRoot æ—¶æ‰“ âš ï¼›ä¸�é˜»æ–­ï¼Œä»…æ��ç¤ºã€‚é   z<host>u   
âš ï¸�  outdir=u    å‘½ä¸­ Web DocumentRootã€‚u6   
    `vmess.md` å�«æ˜Žæ–‡ UUIDï¼Œç­‰ä»·äºŽåœ¨ https://u?   /share/v2ray/vmess.md å…¬ç½‘å�¯è¯»ï¼›UUID æ³„éœ²å�³è¢«ç™½ç”¨ã€‚u   
    ç«‹åˆ»å¤„ç�†ï¼šz

      mv u0   /vmess.md /root/    # æˆ–ä»»æ„� Web æ ¹å¤–ä½�ç½®u   
    é•¿æœŸæ–¹æ¡ˆï¼šu=   
      --outdir /etc/v2ray            # æœ�åŠ¡ç«¯ç‰‡æ®µè�½ç›˜u=   
      --outdir /root/v2ray-cfg       # å®¢æˆ·ç«¯ç‰‡æ®µè�½ç›˜Ú )ÚsepÚfileTF)ÚosÚpathÚabspathÚDOCUMENT_ROOTSÚ
startswithr   ÚunameÚ	ExceptionÚprintÚsysÚstderr)ÚoutdirÚabsoutÚrootÚhosts       ú'/var/www/html/share/v2ray/gen-config.pyÚwarn_if_public_webdirr   #   sÀ   € ä�W‰W�_‰_˜VÓ$€FÜò ˆØ�TŠ>˜V×.Ñ.¨t´b·f±f©}Õ=ð Ü—x‘x“z !‘}�ô Ø# F 8Ð+FÐGØIÈ$ÈØQðSà'Ø˜f˜XÐ%UÐVØ'ØPØPØØÜ—Z‘Zõñ ð'ð( øô! ò  Ø’ð ús   ÁBÂB*Â)B*c                  óÚ   — 	 t        d«      5 } | j                  «       j                  «       cddd«       S # 1 sw Y   yxY w# t        $ r  t	        t        j                  «       «      cY S w xY w)uP   ä¼˜å…ˆç”¨å†…æ ¸ CSPRNGï¼Œä¸Žæ–‡æ¡£ä¸­ cat /proc/sys/kernel/random/uuid ä¸€è‡´ã€‚z/proc/sys/kernel/random/uuidN)ÚopenÚreadÚstripÚOSErrorÚstrÚuuidlibÚuuid4)Úfs    r   Úgen_uuidr"   =   sV   € ð$ÜÐ0Ó1ð 	$°QØ—6‘6“8—>‘>Ó#÷	$÷ 	$ò 	$ûäò $Ü”7—=‘=“?Ó#Ò#ð$ús(   ‚A �5«	A µ>ºA ¾A Á&A*Á)A*c                 ó8  — d| d   | d   t        | d   «      | d   dddd	| d   | d
   d| d   | j                  dd«      | j                  dd«      dœ}t        j                  |d¬«      }dt	        j
                  |j                  «       «      j                  «       z   S )uB   vmess:// ä¸º base64(JSON)ï¼Œå­—æ®µå��æ˜¯ v2rayN çº¦å®šçš„ç¼©å†™ã€‚Ú2ÚnameÚdomainÚportÚuuidÚ0ÚautoÚwsÚnoner
   ÚtlsÚalpnr   Úfp)ÚvÚpsÚaddr'   ÚidÚaidÚscyÚnetÚtyper   r
   r-   Úsnir.   r/   )ú,ú:)Ú
separatorszvmess://)r   ÚgetÚjsonÚdumpsÚbase64Ú	b64encodeÚencodeÚdecode)ÚpÚcfgÚss      r   Ú
vmess_linkrF   F   s¤   € ð Ø�‰iØ�‰{Ü�A�f‘I“Ø�‰iØØØØØ�(‘Ø�&‘	ØØ�‰{Ø—‘�f˜bÓ!Ø�e‰e�D˜"‹oñ€Cô" 	�
‰
�3 :Ô.€AØœ×(Ñ(¨¯©«Ó4×;Ñ;Ó=Ñ=Ð=ó    c                  ób   — dD � �cg c]  \  } }d| dt         › d|› d| › d�ddid	œ‘Œ c}} S c c}} w )
N))ú
geosite-cnÚgeosite)úgeoip-cnÚgeoipÚremoteÚbinaryz/sing-z
@rule-set/z.srsÚdetourÚproxy)r7   ÚtagÚformatÚurlÚhttp_client)ÚGEO_BASE)rQ   Úrepos     r   Ú	rule_setsrW   ]   sT   € ð L÷	ñ ˆC�ð ØØÜ�Z˜v d V¨:°c°U¸$Ð?Ø$ gÐ.ó	
ó	ð 	ùó 	s   †!+c                 ó  — d| d   dœ}| j                  dd«      }|rA|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}|d<   | j                  dd«      }|rd|dœ|d	<   |S c c}w )
u3   sing-box tls å­—æ®µï¼›å�¯é€‰ utls æŒ‡çº¹ä¸Ž ALPNã€‚Tr&   )ÚenabledÚserver_namer.   r   r9   r/   )rY   ÚfingerprintÚutls)r<   Úsplitr   )rC   Úoutr.   Úar/   s        r   Úsingbox_tlsr`   j   sx   € à¨1¨X©;Ñ
7€CØ�5‰5�˜Ó€DÙØ*.¯*©*°S«/ÖG Q¸Q¿W¹W½Y�q—w‘w•yÒGˆˆF‰Ø	
�‰ˆt�R‹€BÙ	Ø"&°rÑ:ˆˆF‰Ø€Jùò	 Hs   °A<ÁA<c                 ób  — dddœ}| d   d| d   › �g}|r2dddd	d
œddddœgdddœ|ddœgdddœ}ddidddœdddœ|ddœddgddœg}nddddœgdddœ}ddidddœ|ddœg}|d	|ddœ}|rt        «       |d<   d dd!œ|d"d#d$gd%dd&d'œgd(d	| d   | d)   | d*   d+d,|t        | «      d-| d.   d/œd0œ
ddd1œg|d2œS )3uY   split=True å›½å†…ç›´è¿žåˆ†æµ�ç‰ˆï¼ŒFalse å…¨å±€ä»£ç�†ç‰ˆã€‚è¯­æ³•å¯¹åº” sing-box 1.14+ã€‚z
dns-directÚ	ipv4_only)ÚserverÚstrategyr&   zwww.Úhttpsz
dns-remotez1.1.1.1rP   )r7   rQ   rc   rO   Úudpz	223.5.5.5)r7   rQ   rc   rI   )Úrule_setrc   )r&   rc   )ÚserversÚrulesÚfinalrd   ÚactionÚsniffÚdnsz
hijack-dns)Úprotocolrk   TÚdirect)Úip_is_privateÚoutbound)r&   rq   rK   )rg   rq   )rh   rj   rd   )ri   rj   Údefault_domain_resolverÚauto_detect_interfacerg   Úinfo)ÚlevelÚ	timestampÚtunztun-inz172.19.0.1/30ix  F)r7   rQ   ÚaddressÚmtuÚ
auto_routeÚstrict_routeÚvmessr'   r(   r*   r   r+   r
   )r7   r
   )
r7   rQ   rc   Úserver_portr(   ÚsecurityÚalter_idÚdomain_resolverr-   Ú	transport)r7   rQ   )Úlogrm   ÚinboundsÚ	outboundsÚroute)rW   r`   )rC   r]   ÚresolverÚselfdomrm   ri   r…   s          r   Úsingboxrˆ   v   s”  € à&°KÑ@€HØ�‰{˜d 1 X¡; -Ð0Ð1€Gáð !¨Ø$°ñ9à |¸{ÑKðð *°\ÑBØ"¨lÑ;ðð "Ø#ñ
ˆð �wÐØ¨,Ñ7Ø"°Ñ9Ø¨HÑ5Ø&¨
Ð3ÀÑJð
‰ð "'¨|Ø#.ñ0ð 1à!Ø#ñ	
ˆð �wÐØ"°Ñ9Ø¨HÑ5ð
ˆð ØØ#+Ø!%ñ	€Eñ Ü%›KˆˆjÑð  ¨dÑ3ØàØØ'Ð(ØØØ!ñ
ð ð  ØØ˜H™+Ø  ™yØ˜&™	Ø"ØØ#+Ü" 1“~Ø&*°A°f±IÑ>ñð  hÑ/ð
ð ñ5ð rG   c                 ó>   — | d   ddd| d   dddœgid	d
| d
   idœddœS )uT   æœ�åŠ¡ç«¯ v2ray ws inbound ç‰‡æ®µï¼Œè¿½åŠ åˆ° /etc/v2ray/config.json çš„ inboundsã€‚Úinbound_portz0.0.0.0r|   Úclientsr(   r   r*   )r3   ÚalterIdr~   r+   r
   )ÚnetworkÚ
wsSettingszvmess-ws-in)r'   Úlistenrn   ÚsettingsÚstreamSettingsrQ   © )rC   s    r   Úserver_inboundr“   Å   sQ   € ð �.Ñ!ð Øà˜q ™y°QÀFÑKÐLð
ð Ø! 1 V¡9Ð-ñ
ð ñð rG   c                 ó”  — | d   }| d   }dj                  g d‘t        j                  «       j                  «       › ‘d‘|› ‘d‘| d   › ‘d‘|› ‘d	‘| d
   › ‘d‘| d   › ‘d‘|› ‘d‘| d   › ‘d‘|› ‘d‘|› ‘d‘| d   › ‘d‘| d
   › ‘d‘|› ‘d‘| d   › ‘d‘|› ‘d‘|› ‘d‘|› ‘d‘|› ‘d‘|› ‘d‘|› ‘d‘| d   › ‘d‘|› ‘| d   › ‘d‘«      S )Nr&   rŠ   r   u%   # VMess èŠ‚ç‚¹é…�ç½®

æ›´æ–°æ—¶é—´ï¼šuX   

## å¯¼å…¥é“¾æŽ¥

v2rayN ä¸­å¤�åˆ¶ä¸‹é�¢æ•´è¡Œï¼ŒæŒ‰ Ctrl+V ä»Žå‰ªè´´æ�¿å¯¼å…¥ï¼š

```
u=   
```

## å�‚æ•°æ˜Žç»†

| å­—æ®µ | å€¼ |
|---|---|
| åˆ«å�� | r%   u    |
| åœ°å�€ | u    |
| ç«¯å�£ | r'   z |
| UUID | r(   u|    |
| é¢�å¤–ID (alterId) | 0 |
| åŠ å¯†æ–¹å¼� | auto |
| ä¼ è¾“å��è®® | ws |
| ä¼ªè£…ç±»åž‹ | none |
| ä¼ªè£…åŸŸå�� (host) | u    |
| è·¯å¾„ | r
   u%    |
| ä¼ è¾“å±‚å®‰å…¨ | tls |
| SNI | uY    |
| è·³è¿‡è¯�ä¹¦éªŒè¯� | ä¸�å‹¾é€‰ |

## æ³¨æ„�äº‹é¡¹

- ä¼ªè£…åŸŸå�� (host) å¿…é¡»å¡« `uy   `ã€‚ç•™ç©ºä¼šå¯¼è‡´è¯·æ±‚ä¸�å¸¦ Host å¤´ï¼ŒApache vhost åŒ¹é…�å¤±è´¥ï¼Œè¡¨çŽ°ä¸ºè¿žæŽ¥æˆ�åŠŸä½†æ— æ³•ä¸Šç½‘ã€‚
- è·¯å¾„ `u“   ` å¸¦æ–œæ� ï¼ŒåŒºåˆ†å¤§å°�å†™ã€‚
- ä¸�è¦�å‹¾é€‰"è·³è¿‡è¯�ä¹¦éªŒè¯�"ï¼Œè¯�ä¹¦ä¸ºæ­£å¼� Let's Encrypt è¯�ä¹¦ã€‚

## æœ�åŠ¡ç«¯æž¶æž„

```
å®¢æˆ·ç«¯ --z/TLS--> Apache (z)
                      |- z  --ws--> 127.0.0.1:u—     v2ray vmess+ws
                      |- å…¶ä»–         /var/www/html ç½‘ç«™å†…å®¹
```

## sing-box é…�ç½®

- åˆ†æµ�ç‰ˆï¼ˆå›½å†…ç›´è¿žï¼ŒæŽ¨è��ï¼‰ï¼š`u   -split.json`
- å…¨å±€ç‰ˆï¼š`uô   -global.json`

å¯¼å…¥æ–¹å¼�ï¼šsing-box â†’ Profiles â†’ `+` â†’ Remote â†’ å¡« URLã€‚

## æœ�åŠ¡ç«¯éƒ¨ç½²ç‰‡æ®µ

`server-inbound.json` è¿½åŠ åˆ° `/etc/v2ray/config.json` çš„ `inbounds` æ•°ç»„ï¼Œç„¶å�Žï¼š

```bash
docker restart v2ray
```

è‹¥ `u÷   ` ä¸ºæ–°ç«¯å�£ï¼Œéœ€é‡�å»ºå®¹å™¨åŠ æ˜ å°„ï¼ˆDocker ä¸�æ”¯æŒ�çƒ­åŠ ç«¯å�£ï¼‰ï¼š

```bash
docker stop v2ray && docker rm v2ray
docker run -d --name v2ray --restart unless-stopped \
  -v /etc/v2ray/config.json:/etc/v2ray/config.json \
  -p 127.0.0.1:r:   uµ    \
  v2fly/v2fly-core:latest run -config /etc/v2ray/config.json
```

Apache 443 vhost éœ€æœ‰ï¼š

```apache
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^z$ ws://127.0.0.1:z  [P,L]
ProxyPreserveHost On
```
)Újoinr   ÚtodayÚ	isoformat)rC   ÚlinkÚslugÚdÚips        r   Úmarkdownrœ   Ø   s·  € Ø	ˆ(‰€AØ	
ˆ>Ñ	€B÷Mó Mð ð Mä—
‘
“×&Ñ&Ó(Ð)ðMð*ðMð €ðMððMð  ˆf‰Iˆ;ð!Mð ð!Mð" ˆ3ð#Mð"ð#Mð$ ˆf‰Iˆ;ð%Mð$
ð%Mð& ˆF‰)ˆð'Mð&ð'Mð0 ˜ð1Mð0ð1Mð2 ˆf‰Iˆ;ð3Mð2	ð3Mð6 
ˆð7Mð6"ð7Mð@ #$ ðAMð@%ðAMðB ˆV‰9ˆ+ðCMðBðCMðN ˆv‰YˆKðOMðN (ðOMðN )* sðOMðN+ðOMðP ˜F™)˜ðQMðP %9ðQMðP :<¸ðQMðP=+ðQMð\ ,0¨&ð]Mð\1ð]Mð^ ˆvð_Mð^ð_Mðv 	€TðwMðv
ðwMðB ˆtðCMðB ðCMðB �DðCMðB	ðCMðT �‰iˆ[ðUMðT *ðUMðT +-¨ðUMðT /0°©i¨[ðUMðT9ôUMð MrG   c            	      óÊ  — t        j                  dt         j                  d¬«      } | j                  dd¬«       | j                  dd¬«       | j                  d	d
¬«       | j                  dd¬«       | j                  dt        dd¬«       | j                  dt        dd¬«       | j                  dt
        j                  j                  t
        j                  j                  t        «      «      d¬«       | j                  dd¬«       | j                  ddg d¢d¬«       | j                  ddd ¬«       | j                  d!d"d#¬$«       | j                  d%d&d'¬(«       | j                  «       }|j                  j                  d)«      r|j                  nd)|j                  z   }|j                  ||j                  |j                  |j                  xs
 t!        «       |j"                  xs/ |j                  j%                  d*«      d+   j'                  «       › d,�|j(                  |j*                  d-œ}|j,                  xs d.t/        j0                  d/«      › �}|j2                  rd0}t        j4                  |d1¬2«       n|j6                  }t9        |j6                  «       |j2                  st        j4                  |d1¬2«       t;        |«      }|› d3�t=        |d1«      |› d4�t=        |d5«      d6t?        |«      i}|j2                  �rˆtA        d7|d8   › d9|j6                  › d:�tB        jD                  ¬;«       |jG                  «       D ]Á  \  }}	tI        jJ                  |	d<d5¬=«      jM                  «       }
tA        d>t
        j                  jO                  |j6                  |«      › d?tQ        |
«      › d@�tB        jD                  ¬;«       |
d d/ D ]   }tA        dA|› �tB        jD                  ¬;«       Œ" tA        dBtB        jD                  ¬;«       ŒÃ tA        d>t
        j                  jO                  |j6                  dC«      › dD�tB        jD                  ¬;«       tA        dE|d8   › dF�tB        jD                  ¬;«       tA        dGtB        jD                  ¬;«       y+g }|jG                  «       D ]w  \  }}	t
        j                  jO                  ||«      }tS        |dHdI¬J«      5 }tI        jT                  |	|d<d5¬=«       |jW                  dK«       d d d «       |jY                  |«       Œy t
        j                  jO                  |dC«      }tS        |dHdI¬J«      5 }|jW                  t[        |||«      «       d d d «       |jY                  |«       tA        dL|d   › dM|dN   › |d   › �«       tA        dO|d8   › �«       tA        dP|dQ   › �«       tA        dK|› dK�«       |D ]  }tA        dA|› �«       Œ |j\                  ràtA        «        d1}|D ]Á  }|j                  |«      sŒt
        j                  jO                  ||«      }t_        j`                  |j\                  dRdS|gd1d1¬T«      }|jb                  d+k(  rdUndV}tA        dW|› dX|› �«       |jb                  d+k7  sŒ�d5}tA        |jD                  xs |jd                  jg                  «       «       ŒÃ |syYtA        dZ«       y+# 1 sw Y   �ŒÐxY w# 1 sw Y   �ŒwxY w)[Nu&   ç”Ÿæˆ� VMess é“¾æŽ¥ä¸Ž sing-box é…�ç½®ug   ç¤ºä¾‹:
  %(prog)s stargazer.org.cn /ray
  %(prog)s example.com /abc --uuid å·²æœ‰UUID --name HK-WS-TLS)ÚdescriptionÚformatter_classÚepilogr&   u   åŸŸå��ï¼Œå¦‚ stargazer.org.cn)Úhelpr
   u   WebSocket è·¯å¾„ï¼Œå¦‚ /rayz--uuidu   æŒ‡å®š UUIDï¼Œé»˜è®¤æ–°ç”Ÿæˆ�z--nameu+   èŠ‚ç‚¹åˆ«å��ï¼Œé»˜è®¤ <åŸŸå��é¦–æ®µ>-WS-TLSz--porti»  u   å¯¹å¤–ç«¯å�£ï¼Œé»˜è®¤ 443)r7   Údefaultr¡   z--inbound-portig'  u+   v2ray æœ¬æœº ws ç›‘å�¬ç«¯å�£ï¼Œé»˜è®¤ 10087z--outdiru'   è¾“å‡ºç›®å½•ï¼Œé»˜è®¤è„šæœ¬æ‰€åœ¨ç›®å½•)r¢   r¡   z--slugu-   è¾“å‡ºæ–‡ä»¶å��å‰�ç¼€ï¼Œé»˜è®¤ sb-<éš�æœºhex>z--fpr   )r   ÚchromeÚchrome_rÚfirefoxÚ	firefox_rÚsafariÚsafari_rÚedgeÚedge_rÚiosÚandroidÚrandomÚ
randomizedu-   TLS å®¢æˆ·ç«¯æŒ‡çº¹ (utls)ï¼›ç©º=ä¸�å�¯ç”¨ã€‚)r¢   Úchoicesr¡   z--alpnzh2,http/1.1u8   ALPN é€—å�·åˆ—è¡¨ï¼Œé»˜è®¤ h2,http/1.1ï¼›ä¼ ç©ºä¸²å…³é—­z
--no-writeÚ
store_trueu.   dry-runï¼šä»…æ‰“å�°é¢„è§ˆï¼Œä¸�å®žé™…å†™æ–‡ä»¶)rk   r¡   z--checkÚSING_BOXu4   ç”¨æŒ‡å®šçš„ sing-box äºŒè¿›åˆ¶æ ¡éªŒç”Ÿæˆ�çš„é…�ç½®)Úmetavarr¡   ú/ú.r   z-WS-TLS)r&   r
   r'   rŠ   r(   r%   r.   r/   zsb-é   z/tmp/gen-config-dryrunT)Úexist_okz-split.jsonz-global.jsonFzserver-inbound.jsonu   
[dry-run] é¢„è§ˆï¼ˆUUID=r(   u   ï¼Œè·¯å¾„å®žé™…ä¼šåœ¨ uM    ä¸‹ç”Ÿæˆ�ï¼Œæ­¤å¤„ä»…æ‰“å�°åˆ° /tmp/gen-config-dryrun/ é˜²æ­¢è¯¯è¦†ç›–ï¼‰ï¼š)r   é   )ÚindentÚensure_asciiz
--- z (u	    è¡Œ) ---z  z  ...zvmess.mdz ---u     (å°†å�« UUID u#    + vmess:// é“¾æŽ¥ï¼Œè§�ä¸Š stdout)uE   
[dry-run] æœªå†™ä»»ä½•æ–‡ä»¶ã€‚åŽ»æŽ‰ --no-write é‡�è·‘å�³è�½ç›˜ã€‚
Úwzutf-8)Úencodingú
u   åŸŸå��   : r:   r'   z	UUID   : u   åˆ«å��   : r%   Úcheckz-c)Úcapture_outputÚtextÚOKÚFAILz  check z: r   uP     æ³¨æ„�: check ä¸�è¦†ç›–å¼ƒç”¨è­¦å‘Šï¼Œå»ºè®®æŒ‰ v2ray.md ç¬¬äº”èŠ‚å®žè·‘éªŒè¯�)4ÚargparseÚArgumentParserÚRawDescriptionHelpFormatterÚadd_argumentÚintr	   r
   Údirnamer   Ú__file__Ú
parse_argsr   r&   r'   rŠ   r(   r"   r%   r]   Úupperr.   r/   r™   ÚsecretsÚ	token_hexÚno_writeÚmakedirsr   r   rF   rˆ   r“   r   r   r   Úitemsr=   r>   Ú
splitlinesr•   Úlenr   ÚdumpÚwriteÚappendrœ   r½   Ú
subprocessÚrunÚ
returncodeÚstdoutr   )ÚapÚargsr
   rC   r™   r^   r˜   Úfilesr%   ÚdataÚpreviewÚlineÚwrittenr/   r!   ÚmdÚokÚrrQ   s                      r   Úmainrã   +  sù  € Ü	×	 Ñ	 Ø<Ü ×<Ñ<ðPô
€Bð ‡O�O�HÐ#B€OÔCØ‡O�O�FÐ!>€OÔ?Ø‡O�O�HÐ#B€OÔCØ‡O�O�HÐ#P€OÔQØ‡O�O�H¤3°Ð:U€OÔVØ‡O�OÐ$¬3¸ØFð ô Hà‡O�O�J¬¯©¯©¼¿¹¿¹ÌÓ8QÓ(RØBð ô Dà‡O�O�HÐ#R€OÔSØ‡O�O�F BòGð Ið	 ô Jð
 ‡O�O�H mØSð ô Uà‡O�O�L¨ØIð ô Kà‡O�O�I zØOð ô Qà�=‰=‹?€DàŸ	™	×,Ñ,¨SÔ1ˆ4�9Š9°s¸T¿Y¹Y±€Dà—+‘+ØØ—	‘	Ø×)Ñ)Ø—	‘	Ò'œX›ZØ—	‘	ÒJ §¡× 1Ñ 1°#Ó 6°qÑ 9× ?Ñ ?Ó AÐBÀ'ÐJØ—	‘	Ø�g‰gñ		€Að �9‰9Ò4˜#œg×/Ñ/°Ó2Ð3Ð4€Dð ‡}‚}Ø&ˆÜ
�‰�C $Ö'à�k‰kˆÜ˜$Ÿ+™+Ô&Ø�=Š=Ü
�‰�C $Õ'ä�a‹=€Dàˆ&�Ðœg a¨Ó.Øˆ&�Ðœw q¨%Ó0Øœ~¨aÓ0ð€Eð ‡}ƒ}äØ(¨¨6©¨Ð3IÈ$Ï+É+Èð WOð Pä—‘õ	
ð
  Ÿ+™+›-ò 	,‰JˆD�$Ü—j‘j ¨a¸eÔD×OÑOÓQˆGÜ�Fœ2Ÿ7™7Ÿ<™<¨¯©°TÓ:Ð;¸2¼cÀ'»l¸^È9ÐUÜ—z‘zõ#à  ˜ò 4�Ü˜˜4˜&�k¬¯
©
Ö3ð4ä�'¤§
¡
Ö+ð	,ô 	�”r—w‘w—|‘| D§K¡K°Ó<Ð=¸TÐBÌÏÉÕTÜ�  &¡	˜{Ð*MÐNÔUX×U_ÑU_Õ`ÜÐWÜ—:‘:õ	àà€GØ—k‘k“mò ‰
ˆˆdÜ�W‰W�\‰\˜#˜tÓ$ˆÜ�"�c GÔ,ð 	°Ü�I‰I�d˜A a°eÕ<Ø�G‰G�DŒM÷	ð 	�‰�rÕðô 
�‰�‰�c˜:Ó	&€BÜ	ˆb�# Ô	(ð )¨AØ	�‰”˜˜D $Ó'Ô(÷)à‡N�N�2Ôä	ˆK˜˜(™�} A a¨¡i [°°6±°Ð
<Ô=Ü	ˆI�a˜‘i�[Ð
!Ô"Ü	ˆK˜˜&™	�{Ð
#Ô$Ü	ˆBˆtˆf�Bˆ-ÔØò ˆÜ��2�$ˆiÕðð ‡z‚zÜŒØˆØò 
	6ˆDØ—?‘? 4Ô(ØÜ—‘—‘˜c 4Ó(ˆBÜ—‘ §
¡
¨G°T¸2Ð>Ø.2¸ô?ˆAàŸ,™,¨!Ò+‘$°ˆCÜ�H˜T˜F " S EÐ*Ô+Ø�|‰|˜qÓ Ø�Ü�q—x‘xÒ+ 1§8¡8×2Ñ2Ó4Õ5ð
	6ñ ØäÐ`ÔaØ÷G	ñ 	ú÷)ñ )ús   Ó+[Õ[Û[	Û["Ú__main__)Ú__doc__rÂ   r?   r=   r	   rË   rÕ   r   r(   r   Údatetimer   rU   r   r   r"   rF   rW   r`   rˆ   r“   rœ   rã   Ú__name__Úexitr’   rG   r   ú<module>ré      s…   ðñ	ó Û Û Û 	Û Û Û 
Û Ý à1€ð€òò4$ò>ò.
ò	òLò^ò&Pòfwðt ˆzÒØ€C‡H�H‰T‹VÕð rG   