+
    „WÝj>  ã                   óJ  € R t ^ RIt^ RIt^ RIt^ RIHt ]P                  ! R4      t]P                  ! R4      t	R(t
R R ltR R ltR	 tR
 R ltRRRRRRRR/R R lltR R ltR)R R lltR R ltR R ltR R ltR tR tR tR*tR  R! ltR" R# ltR$ R% ltR& R' ltR# )+zñMessaging-platform setup wizards (Telegram, webhooks) and the ``hermes setup
gateway`` flow. setup.py re-exports the public names, and tests monkeypatch prompt/print/env
helpers on hermes_cli.setup, so those are imported lazily per function.N)ÚPathzhermes_cli.setupz^\d+:[A-Za-z0-9_-]{30,}$c                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚtokenÚreturn©ÚstrÚbool)Úformats   "ÚNC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\setup_platforms.pyÚ__annotate__r      s   € ÷ 5ñ 5¬ð 5´ñ 5ó    c                 ó>   € \        \        P                  V 4      4      # ©N)r	   Ú_TELEGRAM_BOT_TOKEN_REÚmatch)r   s   &r   Ú_is_valid_telegram_bot_tokenr      s   € ÜÔ&×,Ñ,¨UÓ3Ó4Ð4r   c                ó2   € V ^8„  d   QhR\         R,          /# ©r   r   N©r   )r
   s   "r   r   r      s   € ÷ Oñ O´3¸µ:ñ Or   c                óT   € V P                   P                  R8X  d   V P                  # R# )zAReturn the active profile name when HERMES_HOME is a profile dir.ÚprofilesN)ÚparentÚname)Úhermes_homes   &r   Ú_profile_name_from_hermes_homer      s&   € à*×1Ñ1×6Ñ6¸*ÔDˆ;×ÑÐNÈ$ÐNr   c                 ó  € ^ RI Hp   ^ RIHp Rp\
        P                  ! \        4      ;_uu_ 4        \        \        T ! 4       4      4      pRRR4       T! TR7      #   \         d     R# i ; i  + '       g   i     L+; i)zBAttempt automatic Telegram bot creation via managed QR onboarding.)Úget_hermes_home)Úauto_setup_telegram_bot_resultN)Úprofile_name)
Úhermes_cli.setupr   Úhermes_cli.telegram_managed_botr   ÚImportErrorÚ
contextlibÚsuppressÚ	Exceptionr   r   )r   r   r   s      r   Ú_setup_telegram_auto_resultr&      sd   € å0ðÝRð  $€LÜ	×	Ò	œY×	'Õ	'Ü5´d¹?Ó;LÓ6MÓNˆ÷ 
(á)°|ÔDÐDøô ô Úðú÷ 
(×	'ús   ˆA ²A/ÁA,Á+A,Á/A?	c                óH   € V ^8„  d   QhR\         R\         R\         R\        /# )r   ÚlabelÚquestionÚenv_varsr   r   )r
   s   "r   r   r   &   s(   € ÷ 
.ñ 
.¤ð 
.¬sð 
.¼sð 
.Ätñ 
.r   c                óÎ   a€ ^ RI HoHpHp \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   R# V! V  R24       V! VR4      '       * # )züTrue when any of ``env_vars`` is already set and the user does NOT want to reconfigure.

Shared by the core wizards and every platform plugin's ``interactive_setup`` so the
"already configured? Reconfigure? [y/N]" gate has one wording and one default.
)Úget_env_valueÚ
print_infoÚprompt_yes_noc              3   ó4   <"  € T F  pS! V4      x € K  	  R # 5ir   © ©Ú.0Úvr,   s   & €r   Ú	<genexpr>Ú'declines_reconfigure.<locals>.<genexpr>-   s   øé € Ð2© A‰}˜Q×Ð«ùó   ƒTFz: already configured)r    r,   r-   r.   Úany)r(   r)   r*   r-   r.   r,   s   &&*  @r   Údeclines_reconfigurer8   &   sP   ø€ ÷ JÑIß‹3Ô2©Ó2�3�3Š3Ô2©Ó2×2Ò2ÙÙ�%�Ð,Ð-Ô.Ù˜X uÓ-Ô-Ð-r   ÚpasswordFÚsuccess_msgÚskip_msgÚ	transformc                ó|   € V ^8„  d   QhR\         R\         R\        R\         R,          R\         R,          R\         /# )r   Úenv_varr)   r9   r:   Nr;   r   r   )r
   s   "r   r   r   3   sC   € ÷ ñ œ3ð ¬#ð ¼Dð ÔWZÐ]aÕWað Ü  4�ZðÜCFñr   c               óÔ   € ^ RI HpHpHpHp	 V! WR7      p
V
'       d;   T	! Y'       d	   V! V
4      MT
4       V'       d   V! VP                  V
R7      4       V
# V'       d	   V! V4       V
# )z±Prompt, persist the (optionally transformed) answer when non-empty, and report either way.

``success_msg`` may reference ``{value}``. Returns the raw answer ("" when skipped).
)Úprint_successÚprint_warningÚpromptÚsave_env_value©r9   )Úvalue)r    r@   rA   rB   rC   r
   )r>   r)   r9   r:   r;   r<   r@   rA   rB   rC   rE   s   &&$$$$     r   Úsave_promptedrF   3   s]   € ÷ VÓUÙ�8Ô/€EßÙ�w¶I¡	¨%Ô 0À5ÔIßÙ˜+×,Ñ,°5Ð,Ó9Ô:ð €L÷ 
Ù�hÔØ€Lr   c                ó@   € V ^8„  d   QhR\         R\         R\         RR/# )r   r>   Úusersr:   r   Nr   )r
   s   "r   r   r   D   s(   € ÷ ñ œSð ¬ð ¼3ð À4ñ r   c                óV   € ^ RI HpHp V! WP                  RR4      4       V! V4       R# )z1Strip spaces, persist the allowlist, and confirm.)r@   rC   Ú Ú N)r    r@   rC   Úreplace)r>   rH   r:   r@   rC   s   &&&  r   Ú_save_allowlistrM   D   s    € ç>Ù�7ŸM™M¨#¨rÓ2Ô3Ù�+Ör   c                ón   € V ^8„  d   QhR\         R\         R\         R\         R\         R,          R\         /# )r   r>   r)   r:   Úopen_msgÚpresetNr   r   )r
   s   "r   r   r   K   s>   € ÷ "ñ "œsð "¬cð "Äð "Ìsð "Ô\_ÐbfÕ\fð "Ôruñ "r   c                óŒ   € ^ RI HpHp Vf	   V! V4      MTpV'       d   \        WV4       MV! V4       VP	                  RR4      # )zXPersist ``preset`` (or the prompted answer) as an allowlist, warning when it stays open.)r-   rB   rJ   rK   )r    r-   rB   rM   rL   )r>   r)   r:   rO   rP   r-   rB   rH   s   &&&&&   r   Ú_prompt_allowlistrR   K   s;   € ç3Ø &¢‰F�8Ô°F€EßÜ˜¨Õ4á�8ÔØ�=‰=˜˜bÓ!Ð!r   c                ó@   € V ^8„  d   QhR\         R\         R\         RR/# )r   r>   rE   Údefaultr   Nr   )r
   s   "r   r   r   V   s.   € ÷ 	Gñ 	Gœð 	G¤Cð 	G´#ð 	G¸$ñ 	Gr   c                ó¶   € ^ RI HpHpHp V'       g   R#  V! V \	        \        V4      4      4       V! RV 24       R#   \         d    T! RT 24        R# i ; i)zOPersist ``value`` as an int port; warn (keeping ``default``) when it isn't one.)r@   rA   rC   NzWebhook port set to z#Invalid port number, using default )r    r@   rA   rC   r   ÚintÚ
ValueError)r>   rE   rT   r@   rA   rC   s   &&&   r   Ú
_save_portrX   V   sW   € çMÑMßÙðGÙ�w¤¤C¨£J£Ô0ÙÐ,¨U¨GÐ4Ö5øÜô GÙÐ;¸G¸9ÐE×FðGús   –&> ¾AÁAc                ó2   € V ^8„  d   QhR\         R,          /# r   r   )r
   s   "r   r   r   b   s   € ÷ Eñ E¤C¨$¥Jñ Er   c                  óš   € ^ RI Hp HpHp V! R4        V! RRR7      pV'       d   \	        V4      '       d   T;'       g    R# V ! R4       K:  )é    )Úprint_errorr-   rB   z'Create a bot via @BotFather on TelegramTzTelegram bot tokenrD   NznInvalid token format. Expected: <numeric_id>:<alphanumeric_hash> (e.g., 123456789:ABCdefGHI-jklMNOpqrSTUvwxYZ))r    r\   r-   rB   r   )r\   r-   rB   r   s       r   Ú_prompt_telegram_bot_tokenr]   b   sJ   € ß@Ñ@ÙÐ8Ô9Ø
ÙÐ+°dÔ;ˆßÔ4°U×;Ò;Ø—=�=˜DÐ Ùð Dö 	Er   c                ó   € V ^8„  d   QhRR/# r   r0   )r
   s   "r   r   r   m   s   € ÷ 
fñ 
f 4ñ 
fr   c                 ó¾   € ^ RI Hp HpHpHp V ! R4      '       d   R# V! R4       V! RR4      '       d*   V! R4       V! R4      pV'       d   \        RVR	4       R# R# R# )
z?Existing config kept as-is: warn when it has no user allowlist.)r,   r-   rB   r.   ÚTELEGRAM_ALLOWED_USERSNuA   âš ï¸�  Telegram has no user allowlist - anyone can use your bot!zAdd allowed users now?Tz6   To find your Telegram user ID: message @userinfobotz"Allowed user IDs (comma-separated)zTelegram allowlist configured)r    r,   r-   rB   r.   rM   )r,   r-   rB   r.   Úallowed_userss        r   Ú_telegram_allowlist_nudgerb   m   s]   € çQÓQÙÐ-×.Ò.ÙÙÐRÔSÙÐ-¨t×4Ò4ÙÐKÔLÙÐCÓDˆßÜÐ4°mÐEdÖeñ ñ 5r   c                 ó8  € ^ RI Hp HpHp V ! RRRRRRRRR4	       R;r4V! R	R
R7      P	                  4       R
8X  dM   \        4       pV'       d)   VP                  p\        V4      '       g   V! R4       R;r4V'       g   V ! RRR4       V'       g   \        4       pW43# )zMReturn (token, setup_result); auto flow first when chosen, else manual paste.)Ú_infor\   rB   z/How would you like to create your Telegram bot?Nz  [1] Automatic (recommended)u6         Scan a QR code â†’ confirm in Telegram â†’ done.z!      No token copy-paste needed.z  [2] Manualz?      Create a bot via @BotFather yourself and paste the token.zChoice [1/2]Ú1)rT   z7Automatic setup returned an invalid Telegram bot token.zFalling back to manual setup...)	r    rd   r\   rB   Ústripr&   r   r   r]   )rd   r\   rB   r   Úsetup_results        r   Ú_obtain_telegram_tokenrh   z   s¡   € ç;Ñ;Ù	Ð
;¸TØ
)Ø
BØ
-¨tØ
Ø
KÈTôSð  Ð€EÙˆn cÔ*×0Ñ0Ó2°cÔ9Ü2Ó4ˆßØ ×&Ñ&ˆEÜ/°×6Ò6ÙÐUÔVØ'+Ð+�ßÙ�$Ð9¸4Ô@ßÜ*Ó,ˆØÐÐr   c                 óT  € ^ RI Hp HpHpHpHpHpHp V! R4       \        RRR4      '       d   \        4        R# \        4       w  rxV'       g   R# V! RV4       V! R4       V ! RRRR	R
R4       Rp	\        \        VRR4      ;'       g    R4      p
V
'       ds   V! RV
 24       V! RR4      '       dY   V! R4      pRP                  \        P                  V
.\!        RVP#                  RR4      P%                  R4      4      O4      4      p	\'        RRRRV	R7      p	V ! RRRR4       V	'       d'   V	P%                  R4      ^ ,          P)                  4       MRpV'       g   V! R4       \+        RR4       R# V! RV R2R4      '       d   V! RV4       V! R V 24       R# \+        RR!4       R# )"z1Configure Telegram bot credentials and allowlist.)rd   r-   Úprint_headerr@   rB   r.   rC   ÚTelegramzReconfigure Telegram?ÚTELEGRAM_BOT_TOKENNzTelegram token savedu,   ðŸ”’ Security: Restrict who can use your botz!   To find your Telegram user ID:z&   1. Message @userinfobot on Telegramz:   2. It will reply with your numeric ID (e.g., 123456789)Úowner_user_idrK   z Detected your Telegram user ID: z+Allow this Telegram account to use the bot?Tz7Additional allowed user IDs (comma-separated, optional)Ú,rJ   r`   z?Allowed user IDs (comma-separated, leave empty for open access)zATelegram allowlist configured - only listed users can use the botu@   âš ï¸�  No allowlist set - anyone who finds your bot can use it!)rP   u:   ðŸ“¬ Home Channel: where Hermes delivers cron job results,z.   cross-platform messages, and notifications.z:   For Telegram DMs, this is your user ID (same as above).zI   You can also set this later by typing /set-home in your Telegram chat.ÚTELEGRAM_HOME_CHANNELz*Home channel ID (leave empty to set later)zUse your user ID (z) as the home channel?zTelegram home channel set to zHHome channel ID (or leave empty to set later with /set-home in Telegram))r    rd   r-   rj   r@   rB   r.   rC   r8   rb   rh   r   ÚgetattrÚjoinÚdictÚfromkeysÚfilterrL   ÚsplitrR   rf   rF   )rd   r-   rj   r@   rB   r.   rC   r   rg   ra   Údetected_idÚextraÚfirst_user_ids                r   Ú_setup_telegramry   ’   s¥  € çv×vÑvÙ�ÔÜ˜JÐ(?ÐAU×VÒVÜ!Ô#ÙÜ0Ó2Ñ€EßÙÙÐ'¨Ô/ÙÐ(Ô)Ù	ˆ$Ð>Ø
-Ø
2Ø
FÈôNð €MÜ”g˜l¨O¸TÓB×HÐHÀbÓI€KßÙÐ8¸¸ÐFÔGÙÐFÈ×MÒMÙÐTÓUˆEØŸH™H¤T§]¡]°KÐ3rÄ&ÈÈuÏ}É}Ð]`ÐbdÓOe×OkÑOkÐloÓOpÓBqÐ3rÓ%sÓtˆMÜ%Ø Ð"cØKØJÐS`ôb€Mñ 
ˆ$ÐLØ
:Ø
FôH÷ <I�M×'Ñ'¨Ó,¨QÕ/×5Ñ5Ô7Èb€MßÙÐ^Ô_ÜÐ-Ð/[Ö\Ù	Ð+¨M¨?Ð:PÐQÐSW×	XÒ	XÙÐ.°Ô>ÙÐ5°m°_ÐEÖFäÐ-Ð/yÖzr   c                 ó„  € ^ RI Hp HpHpHpHpHp V! R4       \        RRR4      '       d   R# \        4        V! R4       V! R4       V! R4       \        4        V ! R	R4       \        R
V! R4      R4       \        RRRRRR7       V! RR4       \        4        V! R4       ^ RIHp V ! RV! 4        R2RRRRRRRR4	       R# )zConfigure webhook integration.)rd   rj   r@   rA   rB   rC   ÚWebhookszReconfigure webhooks?ÚWEBHOOK_ENABLEDNuD   âš   Webhook and SMS platforms require exposing gateway ports to thezE   internet. For security, run the gateway in a sandboxed environmentzB   (Docker, VM, etc.) to limit blast radius from prompt injection.zX   Full guide: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/webhooks/ÚWEBHOOK_PORTzWebhook port (default 8644)Ú8644ÚWEBHOOK_SECRETz-Global HMAC secret (shared across all routes)TzWebhook secret saveduE   No secret set â€” you must configure per-route secrets in config.yaml)r9   r:   r;   ÚtruezWebhooks enabled! Next steps:)Údisplay_hermes_homez   1. Define webhook routes in z/config.yamlz3   2. Point your service (GitHub, GitLab, etc.) at:z3      http://your-server:8644/webhooks/<route-name>z   Route configuration guide:z_   https://hermes-agent.nousresearch.com/docs/user-guide/messaging/webhooks/#configuring-routesz2   Open config in your editor:  hermes config edit)r    rd   rj   r@   rA   rB   rC   r8   ÚprintrX   rF   Úhermes_constantsr�   )rd   rj   r@   rA   rB   rC   Ú_dhhs          r   Ú_setup_webhooksr…   Á   sË   € çj×jÙ�ÔÜ˜JÐ(?ÐAR×SÒSÙÜ	„GÙÐXÔYÙÐYÔZÙÐVÔWÜ	„GÙ	Ð
dÐfjÔkÜˆ~™vÐ&CÓDÀfÔMÜÐ"Ð$SÐ^bØ5Øcõeñ Ð$ fÔ-Ü	„GÙÐ1Ô2Ý<Ù	Ð+©D«F¨8°<Ð
@Ø
?Ø
?ÀØ
)Ø
kØ
à
>Ø
>ö@r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Ústatusr   r   )r
   s   "r   r   r   è   s   € ÷ Yñ Yœð Y¤ñ Yr   c                óh   € V P                  4       pVR8H  ;'       g    VP                  R4      '       * # )zAA platform counts as configured unless its status says otherwise.znot configured)Ú	partiallyzplugin disabled)ÚlowerÚ
startswith)r‡   Úss   & r   Ú_is_progressr�   è   s.   € à�‰‹€AØÐ%Ñ%×WÐW¨¯©Ð6VÓ)WÔXÐXr   c                ó   € V ^8„  d   QhRR/# r   r0   )r
   s   "r   r   r   î   s   € ÷ jñ j Tñ jr   c            	     ó†  a€ ^ RI HoHp Hp \         UUUu. uFZ  w  r#pS! V4      '       g   K  \
        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   KX  VNK\  	  ppppV'       g   R# \        4        V! RRP                  V4       24       V ! . R	OR V 4       O5!   R# u upppi )
z+Platforms with a token but no home channel.)r,   rd   rA   c              3   ó4   <"  € T F  pS! V4      x € K  	  R # 5ir   r0   r1   s   & €r   r4   Ú._warn_missing_home_channels.<locals>.<genexpr>ó   s   øé € Ð/TÉ)ÀQ±¸a×0@Ð0@Ë)ùr6   TFNzNo home channel set for: z, c              3   óJ   "  € T F  pR VP                  4        R2x € K  	  R# 5i)z     hermes config set z_HOME_CHANNEL <channel_id>N)Úupper)r2   Úplats   & r   r4   r‘   û   s$   é € ÐhÑ[gÐSWÐ% d§j¡j£l ^Ð3MÕNÓ[gùs   ‚!#)z7   Without a home channel, cron jobs and cross-platformz2   messages can't be delivered to those platforms.z1   Set one later with /set-home in your chat, or:)r    r,   rd   rA   Ú_HOME_CHANNEL_CHECKSr7   r‚   rq   )rd   rA   r”   Ú	token_varÚ	home_varsÚmissing_homer,   s         @r   Ú_warn_missing_home_channelsr™   î   s¥   ø€ çDÑDå/CõVÙ/CÑ+� )Ù˜×#ô 	ß,/«CÔ/TÉ)Ó/T¯C¯CªCÔ/TÉ)Ó/T×,T÷ 	ˆÑ/Cð ò V÷ ÙÜ	„GÙÐ-¨d¯i©i¸Ó.EÐ-FÐGÔHÙ	ò jñ iÑ[gÓhöjùôVs   –B<®
B<¹B<ÁB<Á0B<c                ó4   € V ^8„  d   QhR\         R\         RR/# )r   Úany_messagingÚsupports_systemdr   N)r	   )r
   s   "r   r   r   þ   s!   € ÷  .ñ  .¬Dð  .ÄDð  .ÈTñ  .r   c                ó‚  € ^ RI HpHp ^ RIHpHpHpHpHpH	p	 ^ RI
p
V'       d   V! 4       '       d   V	! R4       R# V '       d   V! RR4      '       g   R#  V'       d
   V! 4        R# V
P                  4       R8X  d
   V! 4        R# V
P                  4       R8X  d   ^ R	IHp VP                  4        R# R#   T dB   pT! R
4       \        T4      P!                  4        F  p\#        RT 24       K  	   Rp?R# Rp?iT d   pT! RT 24       T	! R4        Rp?R# Rp?i\$         d   pT! RT 24        Rp?R# Rp?ii ; i)uŸ   Already running: offer a restart only when this pass may have changed platform config â€”
a restart interrupts any active session, so it stays behind a prompt.)r\   r.   )Úsystemd_restartÚlaunchd_restartÚUserSystemdUnavailableErrorÚSystemScopeRequiresRootErrorÚ$_system_scope_wizard_would_need_rootÚ_print_system_scope_remediationNÚrestartz)  Restart the gateway to pick up changes?TÚDarwinÚWindows)Úgateway_windowsu0     Restart failed â€” user systemd not reachable:z  z  Restart failed: )r    r\   r.   Úhermes_cli.gatewayrž   rŸ   r    r¡   r¢   r£   ÚplatformÚsystemÚ
hermes_clir§   r¤   r   Ú
splitlinesr‚   r%   )r›   rœ   r\   r.   rž   rŸ   r    r¡   r¢   r£   Ú	_platformr§   ÚeÚlines   &&            r   Ú_restart_running_gatewayr°   þ   s  € ÷ <÷÷ ó !ßÑ@×BÒBÙ'¨	Ô2Ùß™mÐ,WÐY]×^Ò^Ùð.ßÙÖØ×ÑÓ 8Ô+ÙÖØ×ÑÓ 9Ô,Ý2Ø×#Ñ#Ö%ñ -øð 'ô ÙÐFÔGÜ˜“F×%Ñ%Ö'ˆDÜ�B�t�f�+Ö÷ (ûà'ô 3ñ 	Ð(¨¨Ð,Ô-Ù'¨	×2Ò2ûÜô .ÙÐ(¨¨Ð,×-Ò-ûð.úsN   ÁB4 ÁB4 Á'B4 Â+B4 Â4D>Â;6C7Ã7D>Ä D>ÄDÄD>Ä'D>Ä(D9Ä9D>c                ó$   € V ^8„  d   QhR\         /# )r   Úconfig)rr   )r
   s   "r   r   r   !  s   € ÷ &ñ &œ$ñ &r   c           
     óp  a€ ^ RI HpHpHpHpHp ^ RIHpHoH	p V! R4       V! RRR4       V! 4       pV U	u. uF  p	S! V	4      NK  	  p
p	\        WŠ4       U	Uu. uF  w  r›V	R,           RV	R	,           R
V R2NK   	  pp	p\        V
4       UUu. uF  w  rÛVR8X  g   K  VNK  	  pppV! RWÎ4      pV'       g	   V! R4       T;'       g    R F  pV! VV,          4       K  	  \        ;QJ d$    V3R lV! 4        4       F  '       g   K   RM	  RM! V3R lV! 4        4       4      pV'       d)   \        4        V! \        4       V! R4       \        4        ^ RIHpHp ^ RIHp V! 4       p\        4        V! 4       '       d   \)        VV4       MV! RRV R7       V! \        4       R# u up	i u upp	i u uppi )z*Configure messaging platform integrations.)rd   rj   r-   r@   Úprompt_checklist)Ú_all_platformsÚ_platform_statusÚ_configure_platformzMessaging PlatformszAConnect to messaging platforms to chat with Hermes from anywhere.z&Toggle with Space, confirm with Enter.NÚemojirJ   r(   z  (Ú)Ú
configuredzSelect platforms to configure:zENo platforms selected. Run 'hermes setup gateway' later to configure.c              3   óF   <"  € T F  p\        S! V4      4      x € K  	  R # 5ir   )r�   )r2   Úpr¶   s   & €r   r4   Ú setup_gateway.<locals>.<genexpr>6  s!   øé € ÐTÑCS¸aœÑ%5°aÓ%8×9Ð9ÓCSùs   ƒ!TFzMessaging platforms configured!)Ú_is_service_runningÚsupports_systemd_services)Úensure_gateway_serviceÚsetup)ÚcontextÚinteractiver²   r0   )r    rd   rj   r-   r@   r´   r¨   rµ   r¶   r·   ÚzipÚ	enumerater7   r‚   Ú_RULEr™   r¾   r¿   Ú hermes_cli.gateway_setup_servicerÀ   r°   )r²   rd   rj   r-   r@   r´   rµ   r·   Ú	platformsr”   Ústatusesr‡   ÚitemsÚiÚpre_selectedÚselectedÚidxr›   r¾   r¿   rÀ   rœ   r¶   s   &                     @r   Úsetup_gatewayrÏ   !  su  ø€ çaÕaßXÑXÙÐ&Ô'Ù	Ð
MØ
2°Dô:áÓ €Iñ 4=Ó=±9¨4Ñ  Ö&±9€HÐ=ÜPSÐT]ÔPhÔiÑPhÁÀ��W•ˆ˜a  W¥˜¨c°&°¸Ó;ÑPh€EÑiÜ'0°Ô':ÔUÑ':™)˜!¸fÈÑ>T—A�AÑ':€LÑUÙÐ @À%ÓV€HßÙÐZÔ[Ø�~ˆ~˜2Š~ˆÙ˜I c�NÖ+ñ ÷
 “CÔTÁ>ÔCSÓT—C—C’CÔTÁ>ÔCSÓTÓT€MßÜŒÙ”5ÔÙÐ7Ô8Ü#Ô%÷ RÝGÙ0Ó2ÐÜ	„GÙ×ÒÜ  Ð0@ÕAñ 	 w¸DÈÕPÙŒuÖùò9 >ùÛiùÛUs   ·F'Á$F,ÂF2ÂF2u–   â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�â”�r   ))rk   rl   )ro   )ÚDiscordÚDISCORD_BOT_TOKEN)ÚDISCORD_HOME_CHANNEL)ÚSlackÚSLACK_BOT_TOKEN)ÚSLACK_HOME_CHANNEL)ÚBlueBubblesÚBLUEBUBBLES_SERVER_URL)ÚBLUEBUBBLES_HOME_CHANNEL)ÚQQBotÚ	QQ_APP_ID)ÚQQBOT_HOME_CHANNELÚQQ_HOME_CHANNEL)Ú__doc__r#   ÚloggingÚreÚpathlibr   Ú	getLoggerÚloggerÚcompiler   rÆ   r   r   r&   r8   rF   rM   rR   rX   r]   rb   rh   ry   r…   r•   r�   r™   r°   rÏ   r0   r   r   Ú<module>rä      sÇ   ðñKó Û Û 	Ý à	×	Ò	Ð-Ó	.€àŸšÐ$?Ó@Ð Ø€õ5õOò

Eõ
.ðÀ5ð Ðdhð Ø*.ðØ:>÷õ"÷"õ	GõEõ
fòò0&{ò^@ð@Ð õYõjõ  .÷F&r   