
    i\k                    |   d Z ddlmZ ddlm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mZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlm Z  h d	Z!d.dZ"d/dZ#d0dZ$d0dZ%d1dZ&d2dZ'd3dZ(d4dZ)d5dZ*d6dZ+d6dZ,d6d Z-d6d!Z.d6d"Z/d6d#Z0d6d$Z1d6d%Z2d7d8d(Z3d6d)Z4d6d*Z5d6d+Z6d6d,Z7d6d-Z8dS )9z!Credential-pool auth subcommands.    )annotations)getpassN)SimpleNamespace)AUTH_TYPE_API_KEYAUTH_TYPE_OAUTHCUSTOM_POOL_PREFIXSOURCE_MANUALSTATUS_EXHAUSTEDSTRATEGY_FILL_FIRSTSTRATEGY_ROUND_ROBINSTRATEGY_RANDOMSTRATEGY_LEAST_USEDPooledCredential_exhausted_until_normalize_custom_pool_nameget_pool_strategylabel_from_tokenlist_custom_pool_providers	load_pool)PROVIDER_REGISTRY)OPENROUTER_BASE_URL>   nous	anthropic
qwen-oauthopenai-codexminimax-oauthgoogle-gemini-clireturnlistc                    	 ddl m} m}  |            }n# t          $ r g cY S w xY wg } | |          D ]}t	          |t
                    s|                    d          }t	          |t                    r|                                sWt           t          |           }t          |                    dd          pd                                          }|                    |                                ||f           |S )z=Return list of (display_name, pool_key, provider_key) tuples.r   )get_compatible_custom_providersload_confignameprovider_key )hermes_cli.configr!   r"   	Exception
isinstancedictgetstrstripr   r   append)r!   r"   configresultentryr#   pool_keyr$   s           =/home/piyush/.hermes/hermes-agent/hermes_cli/auth_commands.py_get_custom_provider_namesr3   '   s'   RRRRRRRR   			F0088 > >%&& 	yy  $$$ 	DJJLL 	(M*Ed*K*KMM599^R88>B??EEGGtzz||X|<====Ms    $$rawr+   
str | Nonec                v   | pd                                                                                     dd          }|sdS |                    t                    r|S t                      D ]M\  }}}t          |          |k    r|c S |r.|                                                                 |k    r|c S NdS )z[If raw input matches a custom_providers entry name (case-insensitive), return its pool key.r%    -N)r,   lowerreplace
startswithr   r3   r   )r4   
normalizeddisplay_namer1   r$   s        r2   _resolve_custom_provider_inputr>   <   s    )""$$**,,44S#>>J t/00 0J0L0L  ,h&|44
BBOOO 	L..006688JFFOOO4    providerc                    | pd                                                                 }|dv rdS t          |          }|r|S |S )Nr%   >   open-routeror
openrouter)r,   r9   r>   )r@   r<   
custom_keys      r2   _normalize_providerrF   L   sU    .b''))//11J***|/
;;J r?   c                $   | dk    rt           S |                     t                    rKddlm}  ||           }|r6t          |                    d          pd                                          S dS t          j        |           }|r|j	        ndS )NrD   r   )_get_custom_provider_configbase_urlr%   )
r   r;   r   agent.credential_poolrH   r+   r*   r,   r   inference_base_url)r@   rH   	cp_configpconfigs       r2   _provider_base_urlrN   W   s    <""-.. EEEEEE//99	 	@y}}Z006B77==???r#H--G)087%%b8r?   countintc                    |  d| S )Nz-oauth- )r@   rO   s     r2   _oauth_default_labelrS   e   s    &&u&&&r?   c                    d|  S )Nzapi-key-rR   )rO   s    r2   _api_key_default_labelrU   i   s    er?   sourcec                h    |                      d          r|                     dd          d         n| S )Nzmanual::   )r;   split)rV   s    r2   _display_sourcer[   m   s3    &,&7&7	&B&BN6<<Q""Nr?   tuple[str, bool]c                0   t          | dd           }t          t          | dd          pd                                                                          t          t          | dd          pd                                                                          |dk    s6t	          fddD                       st	          fdd	D                       rd
S |dv s6t	          fddD                       st	          fddD                       rdS dS )Nlast_error_codelast_error_reasonr%   last_error_messagei  c              3      K   | ]}|v V  	d S NrR   .0tokenreasons     r2   	<genexpr>z-_classify_exhausted_status.<locals>.<genexpr>v   s'      kke%6/kkkkkkr?   )
rate_limitusage_limitquota	exhaustedc              3      K   | ]}|v V  	d S rb   rR   rd   re   messages     r2   rg   z-_classify_exhausted_status.<locals>.<genexpr>v   sA       s s"s s s s s sr?   )z
rate limitzusage limitrj   ztoo many requests)zrate-limitedT>       c              3      K   | ]}|v V  	d S rb   rR   rc   s     r2   rg   z-_classify_exhausted_status.<locals>.<genexpr>{   s?        !G  !GU&  !G  !G  !G  !G  !G  !Gr?   )invalid_tokeninvalid_grantunauthorized	forbiddenauthc              3      K   | ]}|v V  	d S rb   rR   rm   s     r2   rg   z-_classify_exhausted_status.<locals>.<genexpr>{   sA       N N"N N N N N Nr?   )rt   ru   expiredrevokedzinvalid tokenauthentication)zauth failedF)rk   T)getattrr+   r,   r9   any)r0   codern   rf   s     @@r2   _classify_exhausted_statusr~   q   s   5+T22D 3R88>B??EEGGMMOOF'%!5r::@bAAGGIIOOQQGs{{ckkkk7jkkkkk{or s s s s&as s s p p{ $#zS  !G  !G  !G  !G  ?F  !G  !G  !G  G  G  KN N N N N&|N N N K K $#r?   c           
        | j         t          k    rdS t          |           \  }}t          | dd           }t	          |t
                    r|                                rd| nd}| j        rd| j         dnd}|s
d| | | dS t          |           }|	d| | | S t          dt          t          j        |t          j                    z
                                }|dk    r
d| | | dS t          |d	          \  }}	t          |d	          \  }
}t          |
d
          \  }}
|r	| d|
 d}n|
r	|
 d| d}n|r	| d|	 d}n|	 d}d| | | d| dS )Nr%   r_   r7    ()z (re-auth may be required)r   z (ready to retry)<      zd hzh mzm sz left))last_statusr
   r~   r{   r(   r+   r,   r^   r   maxrP   mathceiltimedivmod)r0   labelshow_retry_windowrf   reason_textr}   exhausted_until	remainingminutessecondshoursdayswaits                r2   _format_exhausted_statusr      s   ,,,r9%@@EU/66F",VS"9"9TfllnnT,f,,,RTK,1,AI(%((((rD HG5G+GtGGGG&u--O-5-+-t---As49_ty{{%BCCDDEEIA~~>5>+>t>>>>i,,GWGR((NE7##KD% ""%"""	 %%7%%%	 ''W'''}}}7u7k747747777r?   Nonec                   t          t          | dd                    }|t          vr2|dk    r,|                    t                    st          d|           t          t          | dd          pd                                                                          }|t          dhv rt          }|s4|                    t                    rt          }n|dv rt          nt          }t          |          }|                    t                    sl	 dd	lm}m}  |                                d
i           }t!          |                    |g           pg           D ]} |||           n# t"          $ r Y nw xY w|t          k    rt          | dd           pd                                }|s!t%          d                                          }|st          d          t'          t)          |                                          dz             }	t          | dd           pd                                }
|
sHt,          j                                        r(t3          d|	 d                                          p|	}
n|	}
t5          |t7          j                    j        d d         |
t          dt<          |t?          |                    }|                     |           tC          d| dt)          |                                           d|
 d           d S |dk    rgddl"m#} |$                                }|st          d          t          | dd           pd                                pEtK          |d         tM          |t)          |                                          dz                       }
t5          |t7          j                    j        d d         |
t          dt<           d|d         |                    d          |                    d          t?          |          
  
        }|                     |           tC          d| d t)          |                                           d|j'         d           d S |d!k    r"tQ          j)                    }|r	 tQ          j*                    }n# tV          $ r d }Y nw xY wtC                       |rtC          d"|            ntC          d#           	 t3          d$                                                                          }n# tX          tZ          f$ r d%}Y nw xY w|d&v rtC          d'           tQ          j.        t          | d(d           pd)t_          d*ta          t          | d+d,                              -          }|t          | dd           pd                                pd }tQ          j1        ||.          }||j'        n1tK          |                    dd          tM          |d                    }tC          d/| d0| d           d S tC          d1           tQ          j2        t          | d2d           t          | d3d           t          | d4d           t          | d5d           t          | d6d7           t          | d(d           pd)tg          t          | d8d7                    t          | d9d           t_          d*ta          t          | d+d,                              :	  	        }t          | dd           pd                                pd }tQ          j1        ||.          }||j'        n1tK          |                    dd          tM          |d                    }tC          d;| d<| d           d S |d=k    r|tQ          j        |d>           tQ          j4                    }t          | dd           pd                                pKtK          |d?         d         tM          |t)          |                                          dz                       }
t5          |t7          j                    j        d d         |
t          dt<           d@|d?         d         |d?                             d          |                    dA          |                    dB          C
  
        }|                     |           tC          d| d t)          |                                           d|j'         d           d S |dDk    r+ddEl5m6}  |            }t          | dd           pd                                pF|                    dF          p1tM          |t)          |                                          dz             }
t5          |t7          j                    j        d d         |
t          dt<           dG|d         |                    d          H          }|                     |           tC          d| d t)          |                                           d|j'         d           d S |dIk    r/tQ          j7        d7J          }t          | dd           pd                                pEtK          |d         tM          |t)          |                                          dz                       }
t5          |t7          j                    j        d d         |
t          dt<           dK|d         |                    dA                    }|                     |           tC          d| d t)          |                                           d|j'         d           d S |dLk    r*ddMlm8}  |            }t          | dd           pd                                pEtK          |d         tM          |t)          |                                          dz                       }
t5          |t7          j                    j        d d         |
t          dt<           dN|d         |                    dA                    }|                     |           tC          d| d t)          |                                           d|j'         d           d S t          dO| dP| dQ          )RNr@   r%   rD   Unknown provider: 	auth_typezapi-key>   r   r   r   r   r   r   r   )_load_auth_storeunsuppress_credential_sourcesuppressed_sourcesapi_keyzPaste your API key: zNo API key provided.rY   r   zLabel (optional, default: z):    )r@   idr   r   priorityrV   access_tokenrI   zAdded  credential #z: ""r   )anthropic_adapterz1Anthropic OAuth login did not return credentials.r   z:hermes_pkcerefresh_tokenexpires_at_ms)
r@   r   r   r   r   rV   r   r   r   rI   z OAuth credential #r   z)Found existing Nous OAuth credentials at z,Found existing shared Nous OAuth credentialsz!Import these credentials? [Y/n]: y)r%   r   yesz3Rehydrating Nous session from shared credentials...timeoutg      .@r   min_key_ttl_secondsi,  )timeout_secondsr   )r   z	Imported z OAuth credentials: "uK   Could not refresh shared credentials — falling back to device-code login.
portal_urlinference_url	client_idscope
no_browserFinsecure	ca_bundle)	portal_base_urlrK   r   r   open_browserr   r   r   r   zSaved z! OAuth device-code credentials: "r   device_codetokensz:device_coderI   last_refresh)
r@   r   r   r   r   rV   r   r   rI   r   r   )run_gemini_oauth_login_pureemailz:google_pkce)r@   r   r   r   r   rV   r   r   r   )refresh_if_expiringz	:qwen_clir   ))resolve_minimax_oauth_runtime_credentialsz:minimax_oauthz`hermes auth add z#` is not implemented for auth type z yet.)9rF   r{   r   r;   r   
SystemExitr+   r,   r9   r   r   r   hermes_cli.authr   r   r*   r   r'   r   rU   lenentriessysstdinisattyinputr   uuiduuid4hexr	   rN   	add_entryprintagentr   run_hermes_oauth_login_purer   rS   r   auth_mod_read_shared_nous_state_nous_shared_store_pathRuntimeErrorEOFErrorKeyboardInterrupt_try_import_shared_nous_stater   rP   persist_nous_credentials_nous_device_code_loginbool_codex_device_code_loginagent.google_oauthr    resolve_qwen_runtime_credentialsr   )argsr@   requested_typepoolr   r   
suppressedsrcre   default_labelr   r0   anthropic_modcredssharedpath	do_import
rehydratedcustom_labelshown_labelr   r   s                         r2   auth_add_commandr      sx   "74R#@#@AAH(((X-E-EhNaNabtNuNu-E8h88999{B77=2>>DDFFLLNNN+Y777* m122 	m.NN08  =V  1V  1V__  \mNXD 122 
		        *)++//0DbIIJJNN8R88>B?? < <,,Xs;;;;< 	 	 	D	 ***y$//52<<>> 	<23399;;E 	53444.s4<<>>/B/BQ/FGGw--3::<< 	&y!! &M=MMMNNTTVVgZg% z||#' '11	
 	
 	
 	uNxNNc$,,...A.ANNeNNNOOO;<<<<<<99;; 	RPQQQw--3::<< 
@P.! 3t||~~+>+>+BCCA
 A
 !z||#%#111~.))O44))O44'11
 
 
 	uZxZZC4G4GZZEKZZZ[[[6 133  	e799   GGG FH$HHIIIIDEEE !"EFFLLNNTTVV		/0      			 ,,,KLLL%C$+D)T$B$B$Jd(+C.CV L LMM) )  
 )$+D'4$@$@$FB#M#M#O#O#WSWL$=jP\]]]E161B%++HX"~r::<PQY[\<]<]I IK ShSS[SSSTTTF cddd0#D,==&t_dCCdK66$..$T<???#D)T::Bd'$
E::;;dK66 #BGD:OQW,X,X(Y(Y Z Z

 

 

  gt44:AACCKt1%|LLL%*%6ekk<LIInb))+?!+L+L=
 =
 	PxPP+PPPQQQ>!! 	-hFFF133w--3::<< 
@P(ON+ 3t||~~+>+>+BCCA
 A
 !z||#%#111x8/--o>>YYz**>22
 
 
 	uZxZZC4G4GZZEKZZZ[[[&&&BBBBBB++--w--3::<< 
IIgY"6xT\\^^ATATWXAX"Y"Y 	 !z||#%#111~.))O44	
 	
 	
 	uZxZZC4G4GZZEKZZZ[[[<9eTTTw--3::<< 
@P) 3t||~~+>+>+BCCA
 A
 !z||#%#...y)YYz**	
 	
 	
 	uZxZZC4G4GZZEKZZZ[[[?""MMMMMM99;;w--3::<< 
@P) 3t||~~+>+>+BCCA
 A
 !z||#%#333y)YYz**	
 	
 	
 	uZxZZC4G4GZZEKZZZ[[[
kkkVdkkk
l
lls7   AE+ +
E87E8'R; ;S
	S
 3T4 4U
	U
c                   t          t          | dd          pd          }|r|g}n2t          h t          j                    dt                                }|D ]}t          |          }|                                }|s(|                                }t          | dt          |           d           t          |d          D ]|\  }}d}	||j        |j        k    rd	}	t          |          }
t          |j                  }t          d
| d|j        dd|j        dd| |
 d|	                                            }t                       d S )Nr@   r%   rD   r   z credentials):rY   )start  u   ←   #z<20r7   z<7)rF   r{   sortedr   keysr   r   r   peekr   r   	enumerater   r   r[   rV   r   r   rstrip)r   provider_filter	providersr@   r   r   currentidxr0   markerstatusrV   s               r2   auth_list_commandr     s   )'$
B*G*G*M2NNO $%		 
#%%

 ())
  	
   "",,.. 	))++99S\\999:::#G1555 	j 	jJCF"ux7:'='=-e44F$U\22F___u{______f_f__W]__ffhhiiii r?   c           	        t          t          | dd                    }t          | dd           }|t          | dd           }t          |          }|                    |          \  }}}||t	          | d| d          |                    |          }|t	          d| d| d          t          d	| d
| d|j         d           ddlm	} ddl
m}	  |||j                  }
|
d S |
                    ||          }|j        D ]}t          |           |j        r |	||j                   |j        D ]}t          |           d S )Nr@   r%   targetindexz Provider: .zNo credential matching "z" for provider zRemoved r   r   r   r   )find_removal_step)suppress_credential_source)rF   r{   r   resolve_targetr   remove_indexr   r   agent.credential_sourcesr   r   r   rV   	remove_fncleanedsuppresshints)r   r@   r   r   r   matchederrorremovedr   r   stepr/   lines                r2   auth_remove_commandr    s   "74R#@#@AAHT8T**F~w--XD //77E7E%-E99h999:::&&GVFVV8VVVWWW	
EX
E
EE
E
EW]
E
E
EFFF ;:::::::::::Xw~66D| 	^^Hg..F  d =""8W^<<<  d r?   c                    t          t          | dd                    }t          |          }|                                }t	          d| d| d           d S )Nr@   r%   zReset status on r7   z credentials)rF   r{   r   reset_statusesr   )r   r@   r   rO   s       r2   auth_reset_commandr    sa    "74R#@#@AAHXD!!E	
;U
;
;X
;
;
;<<<<<r?   c                   t          t          | dd          pd          }|st          d          t          j        |          }|                    d          sA|                    d          }|rt          | d| d           nt          | d           d S t          | d	           d
D ].}|                    |          }|rt          d| d|            /d S )Nr@   r%   z<Provider is required. Example: `hermes auth status spotify`.	logged_inr  z: logged out (r   z: logged outz: logged in)r   r   redirect_urir   
expires_atapi_base_urlr   : )rF   r{   r   r   get_auth_statusr*   r   )r   r@   r   rf   keyvalues         r2   auth_status_commandr    s   "74R#@#@#FBGGH YWXXX%h//F::k"" G$$ 	-X66V6667777X+++,,,	X
"
"
"###` ' '

3 	'%s%%e%%&&&' 'r?   c           	     h    t          j        t          t          | dd                                d S )Nr@   r@   )r   logout_commandr   r{   )r   s    r2   auth_logout_commandr    s0    OWT:t5T5TUUUVVVVVr?   c                v   t          t          | dd          pd                                                                          }|dv rt	          j        |            d S |dk    rt          t          d                     d S |dk    rt          t          d                     d S t          d	|           )
Nspotify_actionr%   login>   r%   r  r   spotifyr  logoutzUnknown Spotify auth action: )
r+   r{   r,   r9   r   login_spotify_commandr  r   r  r   r   actions     r2   auth_spotify_commandr%    s    /44?@@FFHHNNPPF&t,,,OY???@@@OY???@@@
=V==
>
>>r?   c                 l   t          d           t          d           t          t          d                     	 ddlm} m}m}  |             r |            pd} |            }t          d           t          d	|            t          d
|            	 ddl}|                    d|          }|	                                }|
                    dd          }t          d|            n# t          $ r t          d           Y nw xY wt                       n# t          $ r Y nw xY wt                       g d}	t          d           t          |	d          D ]\  }
}t          d|
 d|            	 t          d                                          }n# t           t"          f$ r Y dS w xY w|r |t%          t'          |	                    k    rdS |dk    rt)                       dS |dk    rt+                       dS |dk    rt-                       dS |dk    rt/                       dS dS )zIInteractive credential pool management when `hermes auth` is called bare.zCredential Pool Statusz2==================================================Nr  r   )has_aws_credentialsresolve_aws_auth_env_varresolve_bedrock_regionunknownz#bedrock (AWS SDK credential chain):z  Auth: z
  Region: sts)region_nameArnz  Identity: u9     Identity: (could not resolve — boto3 STS call failed))zAdd a credentialzRemove a credentialzReset cooldowns for a providerz$Set rotation strategy for a providerExitzWhat would you like to do?rY   r   . z	
Choice: 1234)r   r   r   agent.bedrock_adapterr'  r(  r)  boto3clientget_caller_identityr*   r'   ImportErrorr   r   r,   r   r   r+   r   _interactive_add_interactive_remove_interactive_reset_interactive_strategy)r'  r(  r)  auth_sourceregionr5  r+  identityarnchoicesichoicer4   s                r2   _interactive_authrD    s    

"###	(OOOot444555oooooooooo   	2244A	K++--F8999*[**+++'v''(((Tll5fl==2244ll5)44*S**++++ T T TRSSSSSTGGG   	GGG  G 

&'''w** " "	6 1    !!!!L!!''))'(     #S\\****
czz			 
sI   AD! AC3 2D! 3DD! DD! !
D.-D.>!F   F54F5Providerpromptc                F   t          t          t          t          j                              dgz                       }t                      }|rWd |D             }t          dd                    |                      t          dd                    |                      n%t          dd                    |                      	 t          |  d          	                                }n## t          t          f$ r t                      w xY wt          |          S )z4Prompt for a provider name with auto-complete hints.rD   c                    g | ]\  }}}|	S rR   rR   )rd   r#   _key_provider_keys       r2   
<listcomp>z"_pick_provider.<locals>.<listcomp>@  s    MMM#<4}$MMMr?   z
Known providers: z, zCustom endpoints: r  )r   setr   r   r   r3   r   joinr   r,   r   r   r   rF   )rF  knowncustom_namescustom_displayr4   s        r2   _pick_providerrQ  ;  s!   3t-24455FGGHHE-//L 8MMMMM6DIIe$4$466777>499^#<#<>>????6DIIe$4$466777vMMM""((**'(   lls###s   $C1 1 Dc                 r   t          d          } | t          vr2| dk    r,|                     t                    st	          d|            | t
          v rxt          d|  d           t          d           t          d           	 t          d                                          }n# t          t          f$ r Y d S w xY w|d	k    rd
}nd}nd}d }	 t          d                                          }n# t          t          f$ r Y d S w xY w|r|}t          t          | ||d d d d d dd dd                      d S )NzProvider to add credential forrD   r   
z( supports both API keys and OAuth login.z6  1. API key (paste a key from the provider dashboard)z+  2. OAuth login (authenticate via browser)zType [1/2]: r1  oauthr   z!Label / account name (optional): F)r@   r   r   r   r   r   r   r   r   r   r   r   )rQ  r   r;   r   r   _OAUTH_CAPABLE_PROVIDERSr   r   r,   r   r   r   r   )r@   type_choicer   r   typed_labels        r2   r9  r9  L  s   >??H(((X-E-EhNaNabtNuNu-E8h88999 +++E8EEEFFFFGGG;<<<	//5577KK+, 	 	 	FF	#II!II	E?@@FFHH'(    _YeTtt4$$       s$   !B( (B=<B=!C3 3DDc                 *   t          d          } t          |           }|                                st          d|  d           d S t	          |                                d          D ]K\  }}t          |          }t          d| d|j        dd|j        d	d|j	         | d
|j
         d           L	 t          d                                          }n# t          t          f$ r Y d S w xY w|sd S t          t!          | |                     d S )Nz"Provider to remove credential fromzNo credentials for r   rY   r   r   25sr7   10sz [id:]z*Remove #, id, or label (blank to cancel): )r@   r   )rQ  r   has_credentialsr   r   r   r   r   r   rV   r   r   r,   r   r   r  r   )r@   r   rB  erk   r4   s         r2   r:  r:  p  sO   BCCHXD!! /H///000 $,,..!,, \ \1,Q//	ZAZZZZZq{ZZZZ9ZZSTSWZZZ[[[[@AAGGII'(    #FFFGGGGGs   7!C C.-C.c                 ^    t          d          } t          t          |                      d S )NzProvider to reset cooldowns forr  )rQ  r  r   r  s    r2   r;  r;    s/    ?@@H999:::::r?   c                 n   t          d          } t          |           }t          t          t          t
          g}t          d|  d|            t                       t          dt          dt          dt
          di}t          |d          D ]>\  }}||k    rd	nd
}t          d| d|dd|                    |d
           |            ?	 t          d          
                                }n# t          t          f$ r Y d S w xY w|sd S 	 t          |          dz
  }||         }	n'# t          t          f$ r t          d           Y d S w xY wddlm}
m}  |
            }|                    d          pi }t'          |t(                    si }|	|| <   ||d<    ||           t          d|  d|	            d S )NzProvider to set strategy forz
Current strategy for r  z(Use first key until exhausted, then nextzCycle through keys evenlyzAlways pick the least-used keyzRandom selectionrY   u    ←r%   r   r/  15su    — z
Strategy [1-4]: zInvalid choice.r   )r"   save_configcredential_pool_strategieszSet z strategy to: )rQ  r   r   r   r   r   r   r   r*   r   r,   r   r   rP   
ValueError
IndexErrorr&   r"   ra  r(   r)   )r@   r   
strategiesdescriptionsrB  r   r   r4   r   strategyr"   ra  cfgpool_strategiess                 r2   r<  r<    s1   <==H))G%';=PRabJ	
9H
9
9
9
9:::	GGGG9=+	L *a(( G G1<<RE1EEEEEL$4$4Q$;$;EVEEFFFF())//11'(    #hhlc?
#       ;:::::::
+--Cgg:;;ArOot,,  (OH(7C$%K	
3
3
3
3
344444s$   
!C, ,D D	D$ $ EEc                   t          | dd          }|dk    rt          |            d S |dk    rt          |            d S |dk    rt          |            d S |dk    rt	          |            d S |dk    rt          |            d S |dk    rt          |            d S |d	k    rt          |            d S t                       d S )
Nauth_actionr%   addr   removeresetr   r!  r   )	r{   r   r   r  r  r  r  r%  rD  r#  s     r2   auth_commandro    s    T="--F$D!!!4   D!!!D!!!T"""r?   )r   r   )r4   r+   r   r5   )r@   r+   r   r+   )r@   r+   rO   rP   r   r+   )rO   rP   r   r+   )rV   r+   r   r+   )r   r\   )r   r+   )r   r   )rE  )rF  r+   r   r+   )9__doc__
__future__r   r   r   r   r   typesr   r   rJ   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rv   r   r   hermes_constantsr   rU  r3   r>   rF   rN   rS   rU   r[   r~   r   r   r   r  r  r  r  r%  rD  rQ  r9  r:  r;  r<  ro  rR   r?   r2   <module>rt     sT   ' ' " " " " " "        



  ! ! ! ! ! !                                    $ # " " " " " - - - - - - 0 0 0 0 0 0 utt    *       9 9 9 9' ' ' '   O O O O   &8 8 8 8:mm mm mm mm`   6# # # #L= = = =' ' ' '(W W W W? ? ? ?9  9  9  9 x$ $ $ $ $"! ! ! !HH H H H,; ; ; ;'5 '5 '5 '5T     r?   