+
    kHàjÚ   ã                  óš  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHtHtHtHtHt ^ RIHtHtHtHtHtHtHt ^ RIHtHtHtHt ]P>                  ! ] 4      t!Rt"Rt#]"]#3t$]"^ ]#^/t%R	R
RRRR/t&^t'Rt(]"RRRR/]#RRRR//t)R�t*Rt+Rt,]t-Rt.Rt/Rt0/ t1R]2R&   R�t3R‘t4R’t5R“t6RR”RR”RR”RR R!R /t7R" R# lt8R$]8! R%R&]3R•^^R'7      R(]8! R)R*]3R–^^R'7      R+]8! R,R-R—]6R˜R.^
^R/7      R0]8! R1R2R™]6RšR.^
^R/7      R3]8! R4R5]4^^R67      R7]8! R8R9]4^^R67      R:]8! R;R<R›Rœ^^R'7      R=]8! R>R?]5R•R.^^R@7      RA]8! RBRC]5R•R.^^R@7      RD]8! RERFR�RœR.^^R@7      /
t9RG]2RH&   ]8! RIRIR”^^R67      t:];! 0 Ržm4      t<RRŸRR R	R¡/t=RJ]2RK&   RLRMRNRORPRORQRRRSRTRURV/t>];! 0 R¢m4      t?];! ]"]#04      t@R£tAR¤tBRWRRX 3R!R!RY 33tCRZR[R\R]R^R_/tDR` Ra ltERb Rc ltFRd Re ltGRf Rg ltHRh Ri ltIRj Rk ltJRl Rm ltKRn Ro ltLRp Rq ltMRr Rs ltNRt Ru ltORv Rw ltPRx Ry ltQRzR/R{ R| lltRR} R~ ltSR R€ ltTR¥R� R‚ lltURƒ R„ ltVR… R† ltWR‡ Rˆ ltX ! R‰ RŠ]4      tYR‹ RŒ ltZR� RŽ lt[R# )¦u  OpenRouter-compatible image generation backend (OpenRouter + Nous Portal).

Both speak the OpenAI-style ``/chat/completions`` image protocol (``modalities:
["image","text"]``, references as ``image_url`` parts, output in
``choices[0].message.images[].image_url.url``); only ``(base_url, api_key)`` differs,
via :func:`hermes_cli.runtime_provider.resolve_runtime_provider`. OpenRouter alone also
has the Dedicated Image API (``POST /images/generations``, own catalog, exact ratios,
up to 16 references) â€” see :func:`_select_surface`.
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)ÚDEFAULT_ASPECT_RATIOÚImageGenProviderÚerror_responseÚresolve_aspect_ratioÚsave_b64_imageÚsave_url_imageÚsuccess_response)Úerror_factoryÚload_image_gen_configÚ	post_jsonÚrecord_token_usagezopenai/gpt-5.4-image-2zgoogle/gemini-3-pro-imageÚsquareú1:1Ú	landscapeú16:9Úportraitú9:16g     Àr@ÚdisplayzOpenAI GPT-5.4 Image 2Ú	strengthsz=Highest fidelity; best prompt adherence; slower on OpenRouterzGemini 3 Pro Imagez2Fast, reliable fallback with good layout adherenceg      $@ÚOPENROUTER_IMAGE_API_g      4@g      Œ@z8dict[tuple[str, Optional[str]], tuple[float, frozenset]]Ú_CATALOG_CACHEÚqualityÚ
backgroundÚoutput_formatÚcompressionFÚseedc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   r   Ústrr   Úspecr   Úreturnúdict[str, Any]© )Úformats   "ÚJ/home/ubuntu/.hermes/hermes-agent/plugins/image_gen/openrouter/__init__.pyÚ__annotate__r,   P   s.   € ÷ `ñ `˜cð `¨cð `¸3ð `À>ñ `ó    c                ó&   € RV RV/\         CRR/CVC# )zLCurated Image API model entry; unspecified knobs default to "not supported".r   r   Úresolutionsr)   )Ú	_NO_KNOBS)r   r   r&   s   &&,r+   Ú_image_api_modelr1   P   s$   € à�w ¨YÐ_¼)Ð_À]ÐTVÑ_ÐZ^Ð_Ð_r-   z"google/gemini-3.1-flash-lite-imagez0Nano Banana 2 Lite (Gemini 3.1 Flash Lite Image)z;Cheap and fast; 14 exact aspect ratios; 14 reference images)Úaspect_ratiosr/   Úmax_nÚmax_refszgoogle/gemini-3.1-flash-imagez&Nano Banana 2 (Gemini 3.1 Flash Image)z:Same ratios as Lite plus resolution control (512/1K/2K/4K)zopenai/gpt-image-2zOpenAI GPT Image 2zFBest editing fidelity; up to 16 references; strongest prompt adherenceT)r2   r   r   r!   r3   r4   zopenai/gpt-image-1-minizOpenAI GPT Image 1 Miniz=The only model here with background=transparent (cut-out PNG)zmicrosoft/mai-image-2.5zMicrosoft MAI-Image-2.5z5Standard ratios; a good second opinion next to Gemini)r2   r3   r4   zmicrosoft/mai-image-2.5-prozMicrosoft MAI-Image-2.5 Proz.Reach for it when gpt-image-2 misses the briefzx-ai/grok-imagine-image-qualityzGrok Imagine (Image Quality)uA   Photoreal; widest exotic-ratio set (9:19.5, 20:9, 2:1 â€¦); 1K/2Kzkrea/krea-2-mediumzKrea 2 Mediumz4Realistic, expressive styles; deterministic via seed)r2   r/   r"   r3   r4   zkrea/krea-2-medium-turbozKrea 2 Medium Turbou?   Cheapest here â€” bulk content, cards, thumbnails; seed supportzqwen/qwen-image-3-prozQwen Image 3 Proz?Precise small text and detail rendering; n up to 6; 1K/2K; seedúdict[str, dict[str, Any]]Ú_IMAGE_API_MODELSÚ zdict[str, tuple[str, ...]]Ú_ASPECT_PREFERENCESú	image/pngÚpngz
image/jpegÚjpgz	image/jpgz
image/webpÚwebpz	image/gifÚgifzimage/svg+xmlÚsvgÚoutput_compressionc                ó.   € \        ^ \        ^dV 4      4      # ©é    )ÚmaxÚmin©Úvs   &r+   Ú<lambda>rG   ©   s   € ´C¸¼3¸sÀA»;Ô4Gr-   c                ó   € V # ©Nr)   rE   s   &r+   rG   rG   ©   s   € Ñefr-   zContent-Typezapplication/jsonzHTTP-Refererz,https://github.com/NousResearch/hermes-agentzX-TitlezHermes Agentc               ó    € V ^8„  d   QhRRRR/# )r$   Úrefr%   r'   úOptional[str]r)   )r*   s   "r+   r,   r,   ´   s   € ÷ Iñ I˜Cð I Mñ Ir-   c                óø  € \        T ;'       g    R4      P                  4       p V '       g   R# V P                  R	4      '       d   V # \        V 4      p^ RIHp V! V 4        VP                  4       p\        P                  ! TP                  4      ^ ,          ;'       g    RpRT R\        P                  ! T4      P                  R4       2#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)
zUURLs pass through; local files inline as base64 data URIs (``None`` when unreadable).r7   Núdata:)Úraise_if_read_blockedz%could not read reference image %s: %sr9   z;base64,Úascii)zhttp://zhttps://rN   )r%   ÚstripÚ
startswithr   Úagent.file_safetyrO   Ú
read_bytesÚOSErrorÚloggerÚdebugÚ	mimetypesÚ
guess_typeÚnameÚbase64Ú	b64encodeÚdecode)rK   ÚpathrO   ÚrawÚexcÚmimes   &     r+   Ú_to_image_url_partrb   ´   sË   € ä
ˆc�iˆi�R‹.×
Ñ
Ó
 €CßÙØ
‡~�~Ð6×7Ò7Øˆ
Ü�‹9€DÝ7á˜#ÔðØ�o‰oÓˆô ×Ò §	¡	Ó*¨1Õ-×<Ð<°€DØ�4�&˜¤×!1Ò!1°#Ó!6×!=Ñ!=¸gÓ!FÐ GÐHÐHøô	 ô Ü�‰Ð<¸cÔGÝûðús   Á!C ÃC9ÃC4Ã4C9c               ó$   € V ^8„  d   QhRRRRRR/# )r$   Únoder   Úkeyr%   r'   r(   r)   )r*   s   "r+   r,   r,   È   s!   € ÷ 4ñ 4�3ð 4˜Sð 4 ^ñ 4r-   c                óˆ   € \        V \        4      '       d   V P                  V4      MR p\        V\        4      '       d   V# / # rI   )Ú
isinstanceÚdictÚget©rd   re   Úvalues   && r+   Ú_dict_atrl   È   ó4   € Ü'¨¬d×3Ò3ˆD�H‰H�SŒM¸€EÜ˜u¤d×+Ò+ˆ5Ð3°Ð3r-   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   rd   r   re   r%   r'   z	list[Any]r)   )r*   s   "r+   r,   r,   Í   s!   € ÷ 4ñ 4�3ð 4˜Sð 4 Yñ 4r-   c                óˆ   € \        V \        4      '       d   V P                  V4      MR p\        V\        4      '       d   V# . # rI   )rg   rh   ri   Úlistrj   s   && r+   Ú_list_atrq   Í   rm   r-   c               ó    € V ^8„  d   QhRRRR/# )r$   Úpayloadr(   r'   ú	list[str]r)   )r*   s   "r+   r,   r,   Ò   s   € ÷ ñ ˜^ð °	ñ r-   c                ó>  € . p\        V R4       FŠ  p\        \        VR4      R4       Fm  p\        VR4      P                  R4      p\        V\        4      '       g   K6  VP                  4       '       g   KN  VP                  VP                  4       4       Ko  	  KŒ  	  V# )zGGenerated image URLs from ``choices[].message.images[].image_url.url``.ÚchoicesÚmessageÚimagesÚ	image_urlÚurl)rq   rl   ri   rg   r%   rQ   Úappend)rs   ÚoutÚchoiceÚimagerz   s   &    r+   Ú_extract_imagesr   Ò   sx   € à€CÜ˜7 IÖ.ˆÜœh v¨yÓ9¸8ÖDˆEÜ˜5 +Ó.×2Ñ2°5Ó9ˆCÜ˜#œs×#Ô#¨¯	©	¯¬Ø—
‘
˜3Ÿ9™9›;Ö'ó Eñ /ð
 €Jr-   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r$   r   r%   Úmodel_idÚenv_varÚstatusÚintÚerr_msgr'   rL   r)   )r*   s   "r+   r,   r,   Ý   s@   € ÷ Xñ X ð X¨sð X¸Sð XÈ#ð XÐX[ð XÐ`mñ Xr-   c                ó<  a€ VP                  R4      '       g   R# T;'       g    RP                  4       oVR9   ;'       g;    \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      pV'       g   R# V  RV RV R	V  R
V R\         R2# )z Hint for an access-gated OpenAI image model (valid key, but the *model* needs account
enablement / BYOK, so "check your key" would mislead). ``None`` otherwise.zopenai/Nr7   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irI   r)   )Ú.0ÚsÚlows   & €r+   Ú	<genexpr>Ú%_access_error_hint.<locals>.<genexpr>ã   s   øé € ð -^Ù\�QˆSŽÓ\ùs   ƒTFz can't reach image model 'z' (u)   ) â€” enable OpenAI image access in your z account, or set Ú=Ú.)é’  é“  é”  )zno endpointsz
no allowedznot a valid modelzdata policy)rR   ÚlowerÚanyÚ_FALLBACK_MODEL)r   r�   r‚   rƒ   r…   ÚgatedrŠ   s   &&&&& @r+   Ú_access_error_hintr–   Ý   s±   ø€ ð ×Ñ˜y×)Ò)ÙØ�=ˆ=�b×
Ñ
Ó
!€CØ�oÑ%÷ ^ð ^¯«ô -^Ù\ó-^¯¯ªô -^Ù\ó-^ó *^€EçÙàˆ)Ð-¨h¨Z°s¸6¸(ð C Ø '˜yÐ(9¸'¸À!ÄOÐCTÐTUð	WðXr-   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r$   Úbase_urlr%   r^   Úapi_keyÚtimeoutr   r'   z list[tuple[str, dict[str, Any]]]r)   )r*   s   "r+   r,   r,   ì   s0   € ÷ ñ ˜3ð  cð °Cð À#ð ÐJjñ r-   c                ó¶  € ^ RI pTP                  V  V 2V'       d   RRV 2/M/ VR7      pVP                  4        . p\        VP	                  4       R4       F}  p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   KD  VP                  4       '       g   K\  VP                  VP                  4       V34       K  	  V# )z_``(model_id, entry)`` pairs from ``GET {base_url}{path}``'s ``data[]``; raises on HTTP failure.NÚAuthorizationúBearer )Úheadersrš   ÚdataÚid)
Úrequestsri   Úraise_for_statusrq   Újsonrg   rh   r%   rQ   r{   )	r˜   r^   r™   rš   r¡   Úresponser|   Úentryr�   s	   &&&&     r+   Ú_get_catalogr¦   ì   s·   € ãà�|‰|Øˆ*�T�FÐÏw o¸ÀÀ	Ð7JÑ%KÐ\^Ðhoð ó €Hð ×ÑÔØ,.€CÜ˜(Ÿ-™-›/¨6Ö2ˆÜ&0°¼×&=Ò&=�5—9‘9˜T”?À4ˆÜ�h¤×$Ô$¨¯©×)9Ô)9Ø�J‰J˜Ÿ™Ó(¨%Ð0Ö1ñ 3ð €Jr-   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r$   r˜   r%   r™   r^   Úmetar5   ÚgenericÚimage_output_onlyÚboolr'   úlist[dict[str, Any]]r)   )r*   s   "r+   r,   r,   ü   sF   € ÷ ñ ØðØðØ*-ðØ5NðØY\ðàðð ñr-   c               óÚ  € . p\        WV\        4       FÓ  w  rx\        VR4      p	V'       d>   VP                  \        4      '       g!   RV	P                  R4      ;'       g    . 9  d   KV  VP                  V/ 4      p
TP                  RTRT
P                  RVP                  R4      ;'       g    T4      RV
P                  RV4      RV	P                  R4      ;'       g    . /4       KÕ  	  V# )	z®Picker rows from ``GET {base_url}{path}``; raises on failure. ``image_output_only`` keeps
image-output models minus router pseudo-models; curated ``meta`` wins for known ids.Úarchitecturer~   Úoutput_modalitiesr    r   rZ   r   Úinput_modalities)r¦   Ú_LIVE_TIMEOUTrl   rR   Ú_EXCLUDED_MODEL_PREFIXESri   r{   )r˜   r™   r^   r¨   r©   rª   r|   r�   r¥   ÚarchÚknowns   &&$$$$     r+   Ú_fetch_catalogrµ   ü   sÒ   € ð !#€CÜ'¨¸ÄÖO‰ˆÜ˜˜~Ó.ˆßØ×ÑÔ 8×9Ò9¸WÈTÏXÉXÐViÓMj×MpÐMpÐnpÔ=qáØ—‘˜ 2Ó&ˆØ�
‰
Ø�(Ø�u—y‘y ¨E¯I©I°fÓ,=×,IÐ,IÀÓJØ˜Ÿ™ ;°Ó8Ø §¡Ð);Ó <× BÐ BÀð	
ö 	ñ Pð €Jr-   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r˜   r%   r™   r'   Ú	frozensetr)   )r*   s   "r+   r,   r,     s!   € ÷ ñ  sð °Sð ¸Yñ r-   c                óê  € ^ RI Hp W! V4      3p\        P                  V4      pV'       d6   \        P
                  ! 4       V^ ,          ,
          \        8  d
   V^,          # \        4       p \        V RV\        R34      pV UUu0 uF  w  rxVkK	  	  ppp\        V4      p
\        P
                  ! 4       V
3\        V&   V
# u uppi   \         d!   p	\        P                  RY	4        Rp	?	LWRp	?	ii ; i)u¶   Model ids from ``GET {base_url}/images/models``, cached per (base URL, key). Any failure caches
an empty set (â†’ chat-completions): guessing "images" would 404 a working chat setup.)Úfingerprint_secret_valueú/images/modelsg      >@z)image API catalog probe failed for %s: %sN)Úagent.credential_persistencer¹   r   ri   ÚtimeÚ	monotonicÚ_CATALOG_TTL_SECONDSÚsetr¦   Ú_IMAGE_API_CONNECT_TIMEOUTÚ	ExceptionrV   rW   r·   )r˜   r™   r¹   Ú	cache_keyÚcachedÚidsÚcatalogr�   Ú_entryr`   Úresolveds   &&         r+   Ú_fetch_image_api_catalogrÈ     sØ   € õ FàÐ3°GÓ<Ð=€IÜ×Ñ 	Ó*€Fß”4—>’>Ó# f¨Q¥iÕ/Ô3GÔGØ�a�yÐÜ‹u€CðQÜ˜xÐ)9¸7ÔE_ÐaeÐDfÓgˆÙ07Ô8±Ñ,˜H‹x±ˆÑ8ô ˜‹~€HÜ!%§¢Ó!1°8Ð <„N�9ÑØ€Oùó 9øÜô QÜ�‰Ð@À(×PÑPûðQús*   Á-C ÂCÂC ÃC ÃC2ÃC-Ã-C2c               ó    € V ^8„  d   QhRRRR/# )r$   r�   r%   r'   r(   r)   )r*   s   "r+   r,   r,   '  s   € ÷ Eñ E Cð E¨Nñ Er-   c                ó6   € \         P                  V \        4      # )zECatalog metadata for *model_id*, or permissive defaults when unknown.)r6   ri   Ú_UNKNOWN_IMAGE_API_MODEL©r�   s   &r+   Ú_image_api_model_metarÍ   '  s   € ä× Ñ  Ô+CÓDÐDr-   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r$   r�   r%   r˜   r™   Ú
config_keyr'   r)   )r*   s   "r+   r,   r,   ,  s0   € ÷ ñ ˜cð ¨Sð ¸3ð ÈCð ÐTWñ r-   c                ó6  € V '       g   R# \        RRV4      p\        V\        4      '       dB   VP                  4       P	                  4       R9   d   VP                  4       P	                  4       # V \
        9   d   R# V \        9   g   V \        W4      9   d   R# R# )a  ``"images"`` or ``"chat"``: config/env ``surface`` forces it; curated ids are offline and
deterministic; unknown ids consult the cached live catalog (a positive probe must route there
or a model the live picker offered would 404; offline they stay on chat).ÚchatÚsurfaceNrx   >   rÑ   rx   )Ú_image_api_settingrg   r%   rQ   r’   Ú_CHAT_ONLY_MODELSr6   rÈ   )r�   r˜   r™   rÏ   Úforceds   &&&& r+   Ú_select_surfacerÖ   ,  sy   € ÷ ÙÜ 	¨4°Ó<€FÜ�&œ#×Ò 6§<¡<£>×#7Ñ#7Ó#9Ð=OÔ#OØ�|‰|‹~×#Ñ#Ó%Ð%ØÔ$Ô$ÙØÔ$Ô$¨Ô4LÈXÓ4_Ô(_ÙÙr-   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   rZ   r%   Úexplicitr   rÏ   r'   r)   )r*   s   "r+   r,   r,   <  s.   € ÷ Hñ H˜Sð H¨Cð H¸Sð HÀSñ Hr-   c                ó¬  € Ve/   \        V\        4      '       d   VP                  4       '       d   V# \        P                  P                  \         V P                  4        2R4      P                  4       pV'       d   V# \        \        4       V4      P                  V 4      p\        V\        4      '       d   VP                  4       ;'       g    R# T# )u]   Knob: call kwarg â†’ ``OPENROUTER_IMAGE_API_<NAME>`` env â†’ scoped config; blanks are unset.Nr7   )
rg   r%   rQ   ÚosÚenvironri   Ú_IMAGE_API_ENV_PREFIXÚupperrl   Ú_load_image_gen_config)rZ   rØ   rÏ   Ú	env_valuerk   s   &&&  r+   rÓ   rÓ   <  sœ   € àÒ¤Z°¼#×%>Ò%>ÀxÇ~Á~×GWÒGWØˆÜ—
‘
—‘Ô"7Ð!8¸¿¹»¸ÐGÈÓL×RÑRÓT€IßØÐÜÔ+Ó-¨zÓ:×>Ñ>¸tÓD€EÜ&0°¼×&<Ò&<ˆE�K‰K‹M×!Ð!˜TÐGÀ%ÐGr-   c               ó    € V ^8„  d   QhRRRR/# )r$   rk   r   r'   zOptional[int]r)   )r*   s   "r+   r,   r,   G  s   € ÷ 	ñ 	�sð 	˜}ñ 	r-   c                ó  € \        V \        4      '       d   R# \        V \        \        34      '       d   \        V 4      #  \        V \        4      '       d   \        V P                  4       4      # R#   \         d     R# i ; i)zHBest-effort int (env vars arrive as strings); ``None`` when not numeric.N)rg   r«   r„   Úfloatr%   rQ   Ú
ValueError)rk   s   &r+   Ú_coerce_inträ   G  sf   € ä�%œ×ÒÙÜ�%œ#œu˜×&Ò&Ü�5‹zÐðÜ%/°´s×%;Ò%;Œs�5—;‘;“=Ó!ÐEÀÐEøÜô Úðús   Á.A2 Á0A2 Á2BÂ Bc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r$   Úsemanticr%   r¨   r(   rÕ   rL   Únotesrt   r'   r)   )r*   s   "r+   r,   r,   S  s4   € ÷ ;ñ ;Øð;Ø'ð;Ø1>ð;ØGPð;àñ;r-   c                óè  € \        VP                  R4      ;'       g    R	4      p\        V\        4      '       db   VP	                  4       '       dL   VP	                  4       pV'       d   WT9   g   V'       g   V\
        9   d   V# VP                  RV RV  R24       V'       g   VP                  RV  R24       R# \        P                  V R	4       F  pWd9   g   K  Vu # 	  RV9   d   R# V^ ,          # )
z›Exact ``aspect_ratio`` or ``None`` to omit. *forced* wins when supported; otherwise the
downgrade is noted and the per-model mapping of *semantic* applies.r2   zrequested aspect_ratio 'z*' is unsupported by this model; used the 'z' mapping insteadzhmodel is not in this backend's catalog, so its aspect_ratio enum is unknown; the field was omitted and 'z' was not appliedNÚautor)   )Útupleri   rg   r%   rQ   Ú_ENDPOINT_ASPECT_RATIOSr{   r8   )ræ   r¨   rÕ   rç   Ú	supportedrk   Ú	candidates   &&&&   r+   Ú_pick_exact_aspect_ratiorî   S  sâ   € ô
 "' t§x¡x°Ó'@×'FÐ'FÀBÓ!G€IÜ�&œ#×Ò 6§<¡<§>¢>Ø—‘“ˆß˜%Ô,·iÀEÔMdÔDdØˆLØ�‰Ø& u gð .Ø!˜
Ð"3ð5ô	6÷ à�‰ð3Ø3;°*Ð<MðOô	Pñ Ü(×,Ñ,¨X°rÖ:ˆ	ØÖ!ØÒñ ;ð ˜yÔ(ˆ6Ð:¨i¸­lÐ:r-   Úmeta_keyc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r$   rZ   r%   rØ   r   r¨   r(   rÏ   rç   rt   rï   rL   r'   r)   )r*   s   "r+   r,   r,   l  sF   € ÷ ñ Ø
ðØðØ$2ðØ@CðØLUðàðð ñr-   c          
     ó˜  € \        WV4      p\        V\        4      '       d   VP                  4       '       g   R# VP                  4       p\	        TP                  T;'       g    T 4      ;'       g    R4      pV'       g   VP                  RV  R24       R# Wg9  d-   VP                  RV  RV RRP                  V4       R24       R# V# )	zCResolve an enum knob and drop it when this model doesn't accept it.NÚ'ú)' is not supported by this model; droppedr�   z'' is not valid for this model (accepts ú, z
); droppedr)   )rÓ   rg   r%   rQ   rê   ri   r{   Újoin)rZ   rØ   r¨   rÏ   rç   rï   rk   Úalloweds   &&&&&$  r+   Ú_image_api_enumr÷   l  s°   € ô
 ˜t¨zÓ:€EÜ�eœS×!Ò!¨¯©¯ªÙØ�K‰K‹M€EÜ$ T§X¡X¨h×.>Ð.>¸$Ó%?×%EÐ%EÀ2ÓF€GßØ�‰�q˜˜ÐGÐHÔIÙØÔØ�‰�q˜˜˜a ˜wÐ&MÈdÏiÉiÐX_ÓN`ÐMaÐakÐlÔmÙØ€Lr-   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r$   r�   r%   ÚpromptÚsemantic_aspectÚ
referencesrt   rÏ   Úkwargsr(   r'   z tuple[dict[str, Any], list[str]]r)   )r*   s   "r+   r,   r,     sF   € ÷ *ñ *Øð*Ø!ð*Ø47ð*ØENð*Ø\_ð*àð*ð &ñ*r-   c           
     ó>  € \        V 4      p. pRV RV/p\        RVP                  R4      V4      p	\        W&W—4      p
V
'       d   W¨R&   \         F0  w  r¼\        WµP                  V4      WdW|R7      pV'       g   K,  WØV&   K2  	  \         Fh  w  rïp\        \        WåP                  V4      V4      4      pVf   K0  VP                  V4      '       d   V! V4      WŽ&   KS  VP                  RV R24       Kj  	  \        \        R	VP                  R	4      V4      4      pVed   V^8”  d]   \        VP                  R
4      ;'       g    ^4      pVV8”  d   VP                  RV RV R24       \        ^\        VV4      4      VR	&   V'       d�   \        VP                  R4      ;'       g    ^ 4      pV'       d   VRV M. p\        V4      \        V4      8”  d!   VP                  \        V4       RV R24       V'       d   V Uu. uF  pRRRRV//NK  	  upVR&   W‡3# u upi )zþ``/images/generations`` body: ``(payload, notes)``. Every knob is filtered against what the
model declares: the endpoint silently *ignores* unknown parameters, which would let a caller
believe ``background=transparent`` took effect on a model without it.Úmodelrù   Úaspect_ratioÚaspect_ratio_exact)rï   Nrò   ró   Únr3   z'n=z' exceeds this model's cap of z	; clampedr4   z4 reference image(s) supplied but this model accepts z; extras droppedÚtypery   rz   Úinput_references)rÍ   rÓ   ri   rî   Ú_IMAGE_API_ENUMSr÷   Ú_IMAGE_API_INTSrä   r{   r„   rC   rD   Úlen)r�   rù   rú   rû   rÏ   rü   r¨   rç   rs   Úforced_ratioÚratioÚ	enum_namerï   rk   rZ   ÚgateÚclampÚcountr3   r4   Úusablerz   s   $$$$$$                r+   Ú_build_image_api_payloadr    s  € ô ! Ó*€DØ€EØ&¨°(¸FÐC€Gä% n°f·j±jÐAUÓ6VÐXbÓc€LÜ$ _¸LÓP€EßØ"'�Ñß/Ñˆ	Ü 	¯:©:°iÓ+@À$ÐTYÔmˆß‰5Ø!&�IÓñ  0÷ -Ñˆ�EÜÔ.¨t·Z±ZÀÓ5EÀzÓRÓSˆØŠ=ÙØ�8‰8�D�>Š>Ù! %›LˆG‹Mà�L‰L˜1˜T˜FÐ"KÐLÖMñ -ô Ô*¨3°·
±
¸3³ÀÓLÓM€EØÒ˜U QœYÜ�D—H‘H˜WÓ%×*Ð*¨Ó+ˆØ�5Œ=Ø�L‰L˜3˜u˜gÐ%CÀEÀ7È)ÐTÔUÜ˜1œc %¨Ó/Ó0ˆ�‰ßÜ�t—x‘x 
Ó+×0Ð0¨qÓ1ˆß*2�˜I˜XÑ&¸ˆÜˆz‹?œS ›[Ô(Ø�L‰LÜ�z“?Ð#ð $Ø#˜*Ð$4ð6ô7÷ ÙgmÓ*nÑgmÐ`c¨F°KÀÈuÐVYÈlÓ+[ÑgmÑ*nˆGÐ&Ñ'Øˆ>Ðùò +os   È Hc               ó$   € V ^8„  d   QhRRRRRR/# )r$   r¤   r   Úfallbackr%   r'   r)   )r*   s   "r+   r,   r,   ¬  s!   € ÷ #ñ # sð #°cð #¸cñ #r-   c           	     ó  € V f   V#  V P                  4       p\        T\        4      '       d   TP                  R4      MRp\        T\        4      '       d'   TP                  4       '       d   TP                  4       # \        T\        4      '       g(   T'       d   \         P                  ! T4      R,          # T# TP                  R4      pTP                  R4      R8X  dï   \        T\        4      '       dÙ    \         P                  ! T4      p\        T\        4      '       d   TM.  Uu. uFt  p\        T\        4      '       g   K  R	P                  R
 TP                  R4      ;'       g    .  4       4      ;'       g    R RTP                  R4      ;'       g    R 2NKv  	  ppRP                  T4      R,          ;'       g
    TR,          # \        T\        4      '       d.   TP                  4       '       d   TP                  4       R,          # \         P                  ! T4      R,          #   \         d,    \        T RR4      ;'       g    RR,          ;'       g    Tu # i ; i  \         d    TR,          u # i ; iu upi )z¦One-line error from ``{"error": {"message"}}`` (routing/auth) or the ZodError shape
``{"error": {"name": "ZodError", "message": "<json issue array>"}}`` (validation).NÚtextr7   :Ni,  NÚerrorrw   rZ   ÚZodErrorrŽ   c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irI   ©r%   )rˆ   Úps   & r+   r‹   Ú+_extract_image_api_error.<locals>.<genexpr>Â  s   é € ÐBÑ)@ 1œ˜AŸ˜Ó)@ùó   ‚r^   Úrequestz: Úinvalidz; :Ni�  N)r£   rÁ   Úgetattrrg   rh   ri   r%   rQ   ÚdumpsÚloadsrp   rõ   )r¤   r  Úbodyr  rw   ÚissuesÚissueÚpartss   &&      r+   Ú_extract_image_api_errorr#  ¬  s
  € ð ÒØˆðGØ�}‰}‹ˆô ",¨D´$×!7Ò!7ˆD�H‰H�WÔ¸T€EÜ�%œ×Ò %§+¡+§-¢-Ø�{‰{‹}ÐÜ�eœT×"Ò"ß)-Œt�zŠz˜$Ó Õ%Ð;°8Ð;Ø�i‰i˜	Ó"€GØ‡y�y�Ó˜JÔ&¬:°g¼s×+CÒ+Cð	!Ü—Z’Z Ó(ˆFô %/¨v´t×$<Ò$<™&À"ÐDó
ñ E�ÌÐTYÔ[_×I`ô3ˆs�x‰xÑB¨¯©°6Ó):×)@Ð)@¸bÐ)@ÓBÓB×OÐOÀiÐPÐPRØ�y‰y˜Ó#×0Ð0 yÐ1ó3áDð 	ð 
ð
 �y‰y˜Ó Õ%×6Ð6¨°­Ð6Ü�'œ3×Ò G§M¡M§O¢OØ�}‰}‹˜tÕ$Ð$Ü�:Š:�eÓ˜TÕ"Ð"øô- ô GÜ˜ &¨"Ó-×3Ð3°°TÕ:×FÐF¸hÒFðGûô ô 	!Ø˜4•=Ò ð	!üò
sM   ˆH/ Ã8I( Ä*JÅ$JÅ,JÅ?JÆ	JÈ/I%ÉI%ÉI%É$I%É(I?É>I?c               ó$   € V ^8„  d   QhRRRRRR/# )r$   Ú
media_typerL   r  r%   r'   r)   )r*   s   "r+   r,   r,   Ì  s!   € ÷ ñ ˜}ð ¸ð Èñ r-   c                óÄ   € \        V \        4      '       dJ   \        P                  V P	                  R ^4      ^ ,          P                  4       P                  4       V4      # V# )Ú;)rg   r%   Ú_MEDIA_TYPE_EXTENSIONSri   ÚsplitrQ   r’   )r%  r  s   &&r+   Ú_extension_forr*  Ì  sL   € Ü�*œc×"Ò"Ü%×)Ñ)¨*×*:Ñ*:¸3ÀÓ*BÀ1Õ*E×*KÑ*KÓ*M×*SÑ*SÓ*UÐW_Ó`Ð`Ø€Or-   c               ó    € V ^8„  d   QhRRRR/# )r$   r�   r%   r'   r)   )r*   s   "r+   r,   r,   Ò  s   € ÷ Qñ Q˜#ð Q #ñ Qr-   c                ó2   € RP                  R V  4       4      # )uI   Filename-safe fragment for the cache prefix (``openai/gpt-image-2`` â€¦).r7   c              3  ób   "  € T F%  qP                  4       '       g   VR 9   d   TMRx € K'  	  R# 5i)z-_Ú_N)Úisalnum)rˆ   Úchs   & r+   r‹   Ú_model_slug.<locals>.<genexpr>Ô  s#   é € ÐPÁxÀŸ™Ÿš¨¨t¬‘2¸Ô<Ãxùs   ‚-/)rõ   rÌ   s   &r+   Ú_model_slugr2  Ò  s   € à�7‰7ÑPÁxÓPÓPÐPr-   c               ó$   € V ^8„  d   QhRRRRRR/# )r$   r¥   r(   Úprefixr%   r'   rL   r)   )r*   s   "r+   r,   r,   ×  s!   € ÷ ñ  ð ¸ð Àñ r-   c                óž  € V P                  R4      p\        V\        4      '       dE   VP                  4       '       d/   \        \	        W!\        V P                  R4      4      R7      4      # V P                  R4      p\        V\        4      '       d;   VP                  4       '       d%   \        \        VP                  4       VR7      4      # R# )zNCache one ``data[]`` entry; ``None`` without b64/URL. Raises on write failure.Úb64_jsonr%  )r4  Ú	extensionrz   ©r4  N)ri   rg   r%   rQ   r   r*  r   )r¥   r4  Úb64rz   s   &&  r+   Ú_save_image_api_entryr:  ×  sˆ   € à
�)‰)�JÓ
€CÜ�#”s×Ò §	¡	§¢Ü”> #ÄÈuÏyÉyÐYeÓOfÓ@gÔhÓiÐiØ
�)‰)�EÓ
€CÜ�#”s×Ò §	¡	§¢Ü”> #§)¡)£+°fÔ=Ó>Ð>Ùr-   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r$   rs   r(   Úsavedrt   Úusable_refsrç   r  r   r'   r)   )r*   s   "r+   r,   r,   â  s<   € ÷ ñ ØðØ$-ðØ<EðØNWðØ_bðàñr-   c                ó8  € RRRV P                  R4      /pTP                  \         Uu/ uF  qfV 9   g   K  W`V,          bK  	  up4       \        V4      ^8”  d   VR,          VR&   V'       d(   \        V P                  R4      ;'       g    . 4      VR&   V'       d   W5R	&   \	        VR
4      p\        VP                  R4      \        \        34      '       d   VR,          VR&   \        VP                  R4      \        4      '       d   VR,          VR&   V# u upi )zLSuccess ``extra`` for an Image API result (knobs sent, extra images, usage).Úendpointzimages/generationsÚexact_aspect_ratiorÿ   :é   NNÚadditional_imagesr  Úreference_images_usedrç   ÚusageÚcostÚcost_usdÚtotal_tokens)ri   ÚupdateÚ_IMAGE_API_EXTRA_KEYSr  rl   rg   r„   râ   )rs   r<  r=  rç   r  Úextrare   rD  s   &&&&&   r+   Ú_image_api_extrarK  â  sû   € ð (Ð)=Ð?SÐU\×U`ÑU`ÐaoÓUpÐq€EØ	‡L�LÕ/DÓWÑ/D¨ÈwÉÔ#�#˜s•|Ò#Ñ/DÑWÔXÜ
ˆ5ƒz�A„~Ø%*¨2¥YˆÐ!Ñ"ßÜ),¨W¯[©[Ð9KÓ-L×-RÐ-RÐPRÓ)SˆÐ%Ñ&ßØˆg‰Ü�T˜7Ó#€EÜ�%—)‘)˜FÓ#¤c¬5 \×2Ò2Ø! &�MˆˆjÑÜ�%—)‘)˜NÓ+¬S×1Ò1Ø % nÕ 5ˆˆnÑØ€Lùò Xs
   ©D¶Dc                  ó  € ] tR tRtRtRR/R R llt]R R l4       t]R	 R
 l4       tR R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR+R R lltR+R  R! lltR" R# ltR$ R% lt]3R&RR'R/R( R) llltR*tR# ),ÚOpenRouterCompatImageProvideréö  z¬One instance per backend (OpenRouter, Nous Portal); they differ only in the runtime
provider supplying ``(base_url, api_key)``, the config namespace, and Image API support.Úsupports_image_apiFc               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )r$   Úprovider_namer%   Údisplay_nameÚruntime_namerÏ   Úmodel_env_varÚsetup_schemaúOptional[dict[str, Any]]rO  r«   r'   ÚNoner)   )r*   s   "r+   r,   Ú*OpenRouterCompatImageProvider.__annotate__ú  sN   € ÷ 6ñ 6Ø #ð6Ø36ð6ØFIð6ØWZð6àð6à*Bð6àX\ð6ð 
ñ6r-   c               	óv   € Wn         W n        W0n        W@n        WPn        W`n        R V n        R V n        Wpn        R # rI   )	Ú_nameÚ_displayÚ_runtime_nameÚ_config_keyÚ_model_env_varÚ_setup_schemaÚ_live_models_cacheÚ_image_api_models_cacheÚ_supports_image_api)ÚselfrQ  rR  rS  rÏ   rT  rU  rO  s   &$$$$$$$r+   Ú__init__Ú&OpenRouterCompatImageProvider.__init__ú  s<   € ð #Œ
Ø$ŒØ)ÔØ%ÔØ+ÔØ)ÔØ37ˆÔØ8<ˆÔ$Ø#5Ö r-   c               ó   € V ^8„  d   QhRR/# ©r$   r'   r%   r)   )r*   s   "r+   r,   rX  	  s   € ÷ ñ �cñ r-   c                	ó   € V P                   # rI   )rZ  ©rc  s   &r+   rZ   Ú"OpenRouterCompatImageProvider.name  s   € à�z‰zÐr-   c               ó   € V ^8„  d   QhRR/# rg  r)   )r*   s   "r+   r,   rX    s   € ÷ ñ ˜cñ r-   c                	ó   € V P                   # rI   )r[  ri  s   &r+   rR  Ú*OpenRouterCompatImageProvider.display_name  s   € à�}‰}Ðr-   c               ó   € V ^8„  d   QhRR/# )r$   r'   ztuple[str, str]r)   )r*   s   "r+   r,   rX    s   € ÷ 
ñ 
˜oñ 
r-   c                ó  € ^ RI Hp V! V P                  R7      p\        VP	                  R4      ;'       g    R4      P                  4       \        VP	                  R4      ;'       g    R4      P                  4       P                  R4      3# )uO   ``(api_key, base_url)`` â€” either may be ``""``; raises on resolution failure.)Úresolve_runtime_provider)Ú	requestedr™   r7   r˜   Ú/)Úhermes_cli.runtime_providerrp  r\  r%   ri   rQ   Úrstrip)rc  rp  Úruntimes   &  r+   Ú_credentialsÚ*OpenRouterCompatImageProvider._credentials  so   € åHá*°T×5GÑ5GÔHˆä�—‘˜IÓ&×,Ð,¨"Ó-×3Ñ3Ó5´s¸7¿;¹;ÀzÓ;R×;XÐ;XÐVXÓ7Y×7_Ñ7_Ó7a×7hÑ7hÐilÓ7mð
ð 	
r-   c               ó   € V ^8„  d   QhRR/# )r$   r'   r«   r)   )r*   s   "r+   r,   rX    s   € ÷ ñ ˜dñ r-   c                	ó¸   €  \        V P                  4       ^ ,          4      #   \         d-   p\        P	                  RT P
                  T4        Rp?R# Rp?ii ; i)rB   z %s runtime resolution failed: %sNF)r«   rv  rÁ   rV   rW   rZ  )rc  r`   s   & r+   Úis_availableÚ*OpenRouterCompatImageProvider.is_available  sH   € ð	Ü˜×)Ñ)Ó+¨AÕ.Ó/Ð/øÜô 	Ü�L‰LÐ;¸T¿Z¹ZÈÔMÝûð	ús   ‚" ¢A­!AÁAc               ó   € V ^8„  d   QhRR/# )r$   r'   r(   r)   )r*   s   "r+   r,   rX     s   € ÷ Sñ S˜nñ Sr-   c                	óä   € \         pV P                  '       dR   V P                  4       ^ ,          pV\        9   d0   \	        \        V,          P                  R4      ;'       g    T4      pRRR.RV/# )rB   r4   Ú
modalitiesr  r~   Úmax_reference_images)Ú_MAX_REFERENCE_IMAGESrb  Ú_resolve_model_chainr6   r„   ri   )rc  r4   rÇ   s   &  r+   ÚcapabilitiesÚ*OpenRouterCompatImageProvider.capabilities   sg   € ä(ˆØ×#×#Ð#Ø×0Ñ0Ó2°1Õ5ˆHØÔ,Ô,ÜÔ0°Õ:×>Ñ>¸zÓJ×VÐVÈhÓW�Ø˜v wÐ/Ð1GÈÐRÐRr-   c               ó   € V ^8„  d   QhRR/# ©r$   r'   r¬   r)   )r*   s   "r+   r,   rX  )  s   € ÷ ñ Ð1ñ r-   c                ó  € / pV P                   '       d'   V P                  4        Uu/ uF  q"R,          VbK  	  ppV P                  4        F  pVP                  VR,          V4       K  	  V'       d   \	        VP                  4       R R7      # \        P                  4        UUu. uF  w  r4RV/VCNK  	  pppV P                   '       d+   VP                  R \        P                  4        4       4       V# u upi u uppi )u¶   Live catalog: OpenRouter = ``GET /images/models`` âˆª chat-completions image models (new
releases selectable); Nous Portal = chat-completions only. Offline: default chain + snapshot.r    c                óN   € \         P                  V R ,          ^4      V R ,          3# )r    )Ú_MODEL_PRIORITYri   )Úms   &r+   rG   Ú;OpenRouterCompatImageProvider.list_models.<locals>.<lambda>2  s#   € ¼/×:MÑ:MÈaÐPTÍgÐWXÓ:YÐ[\Ð]aÕ[bÑ9cr-   )re   c              3  óX   "  € T F   w  rR VRVR,          RVR,           R2/x € K"  	  R# 5i)r    r   r   z (Image API)Nr)   )rˆ   r�   r¨   s   &  r+   r‹   Ú<OpenRouterCompatImageProvider.list_models.<locals>.<genexpr>5  s:   é € ð Aá&?‘N�Hð �x ¨D°­O¸[ÈTÐR]ÕM^ÐL_Ð_kÐJlÕmÛ&?ùs   ‚(*)
rb  Ú_image_api_live_modelsÚ_live_modelsÚ
setdefaultÚsortedÚvaluesÚ_KNOWN_MODEL_METAÚitemsÚextendr6   )rc  Úmergedr¥   r�   r¨   Úmodelss   &     r+   Úlist_modelsÚ)OpenRouterCompatImageProvider.list_models)  sè   € ð -/ˆØ×#×#Ð#Ø6:×6QÑ6QÔ6SÓTÑ6S¨U˜D•k 5Ò(Ñ6SˆFÐTØ×&Ñ&Ö(ˆEØ×Ñ˜e D�k¨5Ö1ñ )çÜ˜&Ÿ-™-›/Ñ/cÔdÐdÜAR×AXÑAXÔAZÔ[ÑAZ©~¨x�4˜Ð* TÓ*ÑAZˆÑ[Ø×#×#Ð#Ø�M‰Mñ Aä&7×&=Ñ&=Ô&?óAô Að ˆùò Uùó
 \s   §C8Â&C=c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   Úattrr%   ÚlabelÚfetchr   r'   r¬   r)   )r*   s   "r+   r,   rX  :  s)   € ÷ ñ  Cð °ð ¸cð ÐFZñ r-   c                ó˜  € \        W4      pVe6   \        P                  ! 4       V^,          ,
          \        8  d
   V^ ,          # . p V P	                  4       w  rgV'       d   \        Wv3/ VB p\        YT\        P                  ! 4       34       T#   \         d.   p\        P                  RT P                  Y(4       . p Rp?LVRp?ii ; i)zMCached (per TTL) live catalog rows for this backend; ``[]`` when unreachable.Nz%s live %s unavailable: %s)r  r¼   r½   Ú_LIVE_CACHE_TTLrv  rµ   rÁ   rV   rW   rZ  Úsetattr)	rc  rš  r›  rœ  rÃ   r–  r™   r˜   r`   s	   &&&,     r+   Ú_cached_catalogÚ-OpenRouterCompatImageProvider._cached_catalog:  s©   € ä˜Ó$ˆØÒ¤$§.¢.Ó"2°V¸AµYÕ">ÄÔ"PØ˜!•9ÐØ')ˆð	Ø $× 1Ñ 1Ó 3ÑˆGßÜ'¨ÑC¸UÑC�ô 	�˜V¤T§^¢^Ó%5Ð6Ô7Øˆøô	 ô 	Ü�L‰LÐ5°t·z±zÀ5ÔNØ�Fûð	ús   Á&B ÂC	Â#CÃC	c               ó   € V ^8„  d   QhRR/# r…  r)   )r*   s   "r+   r,   rX  J  s   € ÷ _ñ _Ð(<ñ _r-   c           	     	ó8   € V P                  R RR\        RRR7      # )ra  zImage API catalogrº   z.Image API model (from live OpenRouter catalog)F©r^   r¨   r©   rª   )r   r6   ri  s   &r+   r�  Ú4OpenRouterCompatImageProvider._image_api_live_modelsJ  s.   € Ø×#Ñ#Ø%Ð':ÐAQÔXiØDÐX]ð $ó _ð 	_r-   c               ó   € V ^8„  d   QhRR/# r…  r)   )r*   s   "r+   r,   rX  O  s   € ÷ añ aÐ2ñ ar-   c           	     	ó8   € V P                  R RR\        RRR7      # )r`  zimage model catalogz/modelsz1Image-output model (from live OpenRouter catalog)Tr¤  )r   r’  ri  s   &r+   rŽ  Ú*OpenRouterCompatImageProvider._live_modelsO  s-   € Ø×#Ñ#Ø Ð"7¸iÔN_ØGÐ[_ð $ó að 	ar-   c               ó   € V ^8„  d   QhRR/# )r$   r'   rL   r)   )r*   s   "r+   r,   rX  T  s   € ÷ ñ ˜}ñ r-   c                	ó   € \         # rI   )ÚDEFAULT_MODELri  s   &r+   Údefault_modelÚ+OpenRouterCompatImageProvider.default_modelT  s   € äÐr-   c               ó   € V ^8„  d   QhRR/# )r$   r'   rV  r)   )r*   s   "r+   r,   rX  X  s   € ÷ Hñ HÐ":ñ Hr-   c                	óT   € V P                   '       d   \        V P                   4      # R # rI   )r_  rh   ri  s   &r+   Úget_setup_schemaÚ.OpenRouterCompatImageProvider.get_setup_schemaX  s#   € Ø+/×+=×+=Ð+=Œt�D×&Ñ&Ó'ÐGÀ4ÐGr-   Nc               ó    € V ^8„  d   QhRRRR/# )r$   rØ   rL   r'   r%   r)   )r*   s   "r+   r,   rX  [  s   € ÷ 6ñ 6 }ð 6Àñ 6r-   c                	ó2   € V P                  V4      ^ ,          # rA   )r�  )rc  rØ   s   &&r+   Ú_resolve_modelÚ,OpenRouterCompatImageProvider._resolve_model[  s   € Ø×(Ñ(¨Ó2°1Õ5Ð5r-   c               ó    € V ^8„  d   QhRRRR/# )r$   rØ   rL   r'   rt   r)   )r*   s   "r+   r,   rX  ^  s   € ÷ 
*ñ 
*¨]ð 
*Àiñ 
*r-   c                ó  € V\         P                  P                  V P                  4      3 FD  p\	        V\
        4      '       g   K  VP                  4       '       g   K3  VP                  4       .u # 	  \        4       p\        W0P                  4      P                  R4      VP                  R4      3 FD  p\	        V\
        4      '       g   K  VP                  4       '       g   K3  VP                  4       .u # 	  \        \        4      # )u§   ``model`` kwarg â†’ ``*_IMAGE_MODEL`` env â†’ ``image_gen.<provider>.model`` â†’
``image_gen.model`` â†’ default chain. Only the bare default chain carries a fallback.rþ   )rÚ   rÛ   ri   r^  rg   r%   rQ   rÞ   rl   r]  rp   Ú_DEFAULT_MODEL_CHAIN)rc  rØ   rí   Úcfgs   &&  r+   r�  Ú2OpenRouterCompatImageProvider._resolve_model_chain^  sÁ   € ð #¤B§J¡J§N¡N°4×3FÑ3FÓ$GÓHˆIÜ˜)¤S×)Ô)¨i¯o©o×.?Ô.?Ø!Ÿ™Ó)Ð*Ò*ñ Iô %Ó&ˆÜ" 3×(8Ñ(8Ó9×=Ñ=¸gÓFÈÏÉÐPWÓHXÓYˆIÜ˜)¤S×)Ô)¨i¯o©o×.?Ô.?Ø!Ÿ™Ó)Ð*Ò*ñ Zô Ô(Ó)Ð)r-   c               ó8   € V ^8„  d   QhRRRRRRRRRRRR	R
RRR/# )r$   r�   r%   rù   rú   rû   rt   r˜   rž   údict[str, str]rü   r(   r'   r)   )r*   s   "r+   r,   rX  j  sb   € ÷ RNñ RNØðRNØ(+ðRNØ>AðRNØOXðRNàðRNà .ðRNà8FðRNð 
ñRNr-   c               óš  aa€ \        V P                  W1VR7      oR,R V3R lllp. p	. p
 V F<  p\        V4      pV'       d   T	MT
P                  T;'       g    \	        V4      4       K>  	  T
'       d/   T	'       g'   T! RRP                  T
4      ,           R	,           R4      # \        YTY�P                  TR
7      w  rïT
'       d%   TP                  ^ RRP                  T
4       24       \        p\        RTP                  R4      T P                  4      p Te   \        R\        T4      4      p\'        T R2Yn\)        \*        T4      T3T P,                  R RR7      w  ppTeÐ   TP.                  R8w  d-   T! TP0                  TP2                  TP.                  R8H  R7      # TP4                  TP6                  pp\"        P1                  RT P                  TTT4       TR-9   d   T! T P,                   RT RT 2R4      # TR8X  d   T! RT RT R2RRR7      # T! TP0                  RT\8        9   R7      # \;        \=        TR4      YP                  TR 7       \?        TR!4       Uu. uF  p\A        T\B        4      '       g   K  TNK  	  ppT'       g   T! T P,                   R"T R#2R$RR7      # T P                   R%\E        T4       2o T3R& lT 4        Uu. uF  pT'       g   K  TNK  	  ppT'       g   T! T P,                   R(2R$4      # \G        T^ ,          YY0P                  T	'       d   R)MR*\I        TTYŸT4      R+7      #   \
         d   pT! RT 2R4      u Rp?# Rp?ii ; i  \        \         3 d&    \"        P%                  RT P                  T4        ELki ; iu upi u upi   \
         d   pT! R'T 2R4      u Rp?# Rp?ii ; i).z‘One ``POST {base_url}/images/generations`` attempt; a chain-retryable failure carries a
private ``_retryable`` flag that :meth:`generate` strips.©rþ   rù   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r$   r  r%   Ú
error_typeÚ	retryabler«   r'   r(   r)   )r*   s   "r+   r,   ÚKOpenRouterCompatImageProvider._generate_via_image_api.<locals>.__annotate__r  s(   € ÷ 	ñ 	˜ð 	¨#ð 	¸$ð 	È>ñ 	r-   c                ó2   <€ S! W4      pV'       d   R VR&   V# )TÚ
_retryabler)   )r  rÀ  rÁ  r¤   Ú	base_fails   &&& €r+   Ú_failÚDOpenRouterCompatImageProvider._generate_via_image_api.<locals>._failr  s   ø€ Ù  Ó3ˆHßØ)-�˜Ñ&ØˆOr-   z Could not load reference image: Úio_errorNz=Could not read the reference image(s) requested for editing: rô   z2. Refusing to silently fall back to text-to-image.)r�   rù   rú   rû   rÏ   rü   z'dropped unreadable reference image(s): rš   g      ð?z-%s: ignoring non-numeric image API timeout %rz/images/generationsc                ó,   € \        V \        V4      4      # rI   )r#  r%   )Úrespr`   s   &&r+   rG   ÚGOpenRouterCompatImageProvider._generate_via_image_api.<locals>.<lambda>™  s   € Ô,DÀTÌ3ÈsË8Ô,Tr-   T)rž   rs   rš   r›  Úerror_messageÚcatch_request_exceptionÚhttp)rÁ  z-%s image API generation failed (%s) on %s: %sz rejected the API key (z): Ú
auth_errorr‘   zModel 'uj   ' does not exist on the OpenRouter Image API (its catalog is separate from chat-completions â€” check GET z/images/models).Úmodel_accessÚ	api_errorrD  ©rþ   Úproviderr˜   rŸ   z returned no image data for 'z'.Úempty_responser.  c              3  ó<   <"  € T F  p\        VS4      x € K  	  R # 5irI   )r:  )rˆ   Úer4  s   & €r+   r‹   ÚHOpenRouterCompatImageProvider._generate_via_image_api.<locals>.<genexpr>´  s   øé € Ð SÉ7ÀaÔ!6°q¸&×!AÐ!AË7ùs   ƒú Could not save generated image: z+ response carried neither b64_json nor url.r~   r  )r~   rþ   rù   rÿ   rÓ  ÚmodalityrJ  )F)i‘  r�   )%r   rZ  rb   r{   r%   rÁ   rõ   r  r]  ÚinsertÚ_REQUEST_TIMEOUTrÓ   ri   rC   râ   Ú	TypeErrorrã   rV   rW   r   rD   rÀ   r[  Úkindr  rÀ  rƒ   rw   Ú_IMAGE_API_FALLBACK_STATUSESr   rl   rq   rg   rh   r2  r   rK  )rc  r�   rù   rú   rû   r˜   rž   rü   rÆ  r=  Ú
unreadablerK   Úpartr`   rs   rç   rš   Ú
configuredr  Úfailurerƒ   rw   rÖ  Úentriesr  r<  rÅ  r4  s   &$$$$$$$                  @@r+   Ú_generate_via_image_apiÚ5OpenRouterCompatImageProvider._generate_via_image_apij  sÄ  ù€ ô " $§*¡*¨oÐV\Ô]ˆ	÷	ò 	ð "$ˆØ "ˆ
ð	OÛ!�Ü)¨#Ó.�ß $‘¨*×<Ñ<¸T×=MÐ=MÄSÈÃXÖNñ "÷ ŸkÙØOØ—)‘)˜JÓ'õ(Ø*^õ_àóð ô 2Ø¸oØ"×/?Ñ/?ÈôP‰ˆ÷ Ø�L‰L˜ÐEÀdÇiÁiÐPZÓF[ÐE\Ð]Ô^ä"ˆÜ'¨	°6·:±:¸iÓ3HÈ$×JZÑJZÓ[ˆ
ð	bØÒ%Ü˜c¤5¨Ó#4Ó5�ô
 "ØˆjÐ+Ð,°gÜÔ3°WÓ=¸wÐGÈtÏ}É}ÙTØ$(ô	*‰ˆˆgð
 ÒØ�|‰|˜vÔ%Ù˜WŸ]™]¨G×,>Ñ,>È'Ï,É,ÐZcÑJcÔdÐdØ%Ÿn™n¨g¯o©o�GˆFÜ�L‰LÐHÈ$Ï*É*ÐV\Ð^fÐhoÔpà˜Ô#Ù §¡˜Ð.EÀfÀXÈSÐQXÐPYÐZÐ\hÓiÐiØ˜Œ}ÙØ˜h˜Zð (à#˜*Ð$4ð6ð #¨dô	4ð 4ñ
 ˜Ÿ™¨¸vÔIeÑ?eÔfÐfô 	œ8 D¨'Ó2¸(ÏZÉZÐbjÕkÜ& t¨VÔ4ÓLÑ4˜¼
À1Äd×8K—1�1Ñ4ˆÐLßÙØ—=‘=�/Ð!>¸x¸jÈÐKÐM]Ðimôð ð —J‘J�<˜q¤¨XÓ!6Ð 7Ð8ˆð	OÜ SÉ7Ô SÓYÑ S˜1ÔWX—Q�QÑ SˆEÐY÷ Ù˜DŸM™M˜?Ð*UÐVÐXhÓiÐiÜØ˜•( (È×blÑblß +‘W°Ü" 7¨E°;ÀtÓLôNð 	Nøôu ô 	OÙÐ;¸C¸5ÐAÀ:ÓNÕNûð	Oûô& œ:Ð&ô 	bÜ�L‰LÐHÈ$Ï*É*ÐV`×að	büò6 Mùò ZøÜô 	OÙÐ;¸C¸5ÐAÀ:ÓNÕNûð	Oúsw   «-M ÁM ÄM& É%NÊNËN) Ë
N$Ë%N$Ë+N) ÍM#ÍMÍM#ÍM#Í&2NÎNÎ$N) Î)O
Î4OÎ?O
ÏO
c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r$   r�   r%   rù   ÚaspectÚcontentr¬   r˜   rž   r¼  r'   z$tuple[dict[str, Any], Optional[str]]r)   )r*   s   "r+   r,   rX  ¾  sF   € ÷ /ñ /Øð/Ø(+ð/Ø58ð/ØCWð/àð/à .ð/ð 
.ñ/r-   c               ó~  € \        V P                  W1VR7      pRVRRR.RRRR	V/.R
R\        P                  VR4      //p\	        V R2Wh\
        V P                  R7      w  ršV
eÈ   V
P                  R8w  d5   V
P                  R8X  d   RMRpV! V
P                  V
P                  4      V3# V
P                  V
P                  rÜ\        P                  RV P                  WÁV4       \        V P                  WP                  WÍ4      pV'       d   V! VR4      R3# V! V
P                  R4      R3# \        \!        V	R4      WP                  VR7       \#        V	4      pV'       g   V! V P                   RV R2R4      R3# V^ ,          p VP%                  R4      '       d>   RV9   d   VP'                  R^4      ^,          MRp\)        VV P                   R 2R!7      pM\+        VV P                   R 2R!7      p \/        \1        V4      WW0P                  R$7      R3#   \,         d   pT! R"T 2R#4      R3u Rp?# Rp?ii ; i)%z~One ``/chat/completions`` attempt: ``(result, retry_reason)``; reason set when the
chain may continue with the fallback model.r¾  rþ   r~  r~   r  ÚmessagesÚroleÚuserrè  Úimage_configrÿ   r   z/chat/completions)rž   rs   rš   r›  NrÎ  rš   z	timed outz"%s image gen failed (%d) on %s: %srÐ  ÚunavailablerÑ  rD  rÒ  z& returned no image. Ensure the model 'z' supports image output.rÔ  zreturned no imagerN   Ú,r7   Ú_genr8  rØ  rÈ  )r~   rþ   rù   rÿ   rÓ  )r   rZ  Ú_ASPECT_RATIOSri   r   rÛ  r[  rÝ  r  rÀ  rƒ   rw   rV   r–   r^  r   rl   r   rR   r)  r   r   rÁ   r   r%   )rc  r�   rù   rç  rè  r˜   rž   Úfailrs   Úresultrâ  Úreasonrƒ   rw   Úhintrx   Úfirstr9  Ú
saved_pathr`   s   &$$$$$$             r+   Ú_generate_via_chatÚ0OpenRouterCompatImageProvider._generate_via_chat¾  s@  € ô ˜TŸZ™Z¨ÈÔOˆà�XØ˜7 FÐ+Ø˜& &¨)°WÐ=Ð>Ø˜^¬^×-?Ñ-?ÀÈÓ-NÐOð	#
ˆô $ØˆjÐ)Ð*°GÔVfØ—-‘-ô!‰ˆð ÒØ�|‰|˜vÔ%Ø(/¯©¸	Ô(A™Àt�Ù˜GŸM™M¨7×+=Ñ+=Ó>ÀÐFÐFØ%Ÿn™n¨g¯o©o�GÜ�L‰LÐ=¸t¿z¹zÈ6Ð]dÔeÜ% d§m¡m°X×?RÑ?RÐTZÓdˆDßÙ˜D .Ó1°=Ð@Ð@Ù˜Ÿ™ {Ó3°TÐ9Ð9ô 	œ8 F¨GÓ4¸HÏzÉzÐdlÕmÜ  Ó(ˆßáØ—=‘=�/Ð!GÈÀzÐQiÐjØ óð #ð#ð #ð �q•	ˆð	TØ×Ñ ×(Ò(Ø03°u´�e—k‘k # qÓ)¨!Ö,À"�Ü+¨C¸4¿:¹:¸,ÀdÐ8KÔL‘
ä+¨E¸T¿Z¹Z¸LÈÐ:MÔN‘
ô  Ü�j“/¨Èv×`jÑ`jô
àðð 	øô ô 	TÙÐ:¸3¸%Ð@À*ÓMÈtÐSÕSûð	Tús*   ÆH Æ<H ÇH ÈH<È$H7È1H<È7H<ry   Úreference_image_urlsc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r$   rù   r%   rÿ   ry   rL   rú  zOptional[list[str]]rü   r   r'   r(   r)   )r*   s   "r+   r,   rX  ï  sH   € ÷ 7^ñ 7^Øð7^Ø),ð7^à ð7^à?Rð7^ð ð7^ð 
ñ	7^r-   c               	óŒ  € \        V P                  V4      p V P                  4       w  rxT'       d	   T'       g%   T! RT P                   RT P                   R2R4      # T P                  TP                  R4      4      p
\        T4      pTP                  R4      ;'       g    .  Uu. uF  p\        T4      NK  	  ppT'       d   TP                  \        T4      4       TP                  R	 T;'       g    .  4       4       R
RRT/.pTR\          F/  p\        T4      pT'       g   K  TP                  R
RRRT//4       K1  	  RRT 2/\        CpRp\        T
4       Fí  w  ppRpT P                  '       d   \!        TY‡T P"                  4      pTR8X  d4   T P%                  TYYØTTR7      pTP'                  RR4      '       d   RMRpMT P)                  TYTTTR7      w  ppTP                  R4      '       g   Te   T\+        T
4      ^,
          8X  d   Tu # \,        P/                  RT P                  TTT
T^,           ,          4       TpKï  	  T;'       g9    \1        T P                   R2RT P                  T
'       d
   T
R,          MRYR7      #   \         d$   p	T! R T P                   RT	 2R4      u Rp	?	# Rp	?	ii ; iu upi )zCould not resolve z credentials: Úmissing_api_keyNzNo z credentials found. Configure u(    in `hermes tools` â†’ Image Generation.rþ   Úreference_imagesc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irI   r  )rˆ   rK   s   & r+   r‹   Ú9OpenRouterCompatImageProvider.generate.<locals>.<genexpr>  s   é € ÐIÑ.H sœ#˜cŸ(˜(Ó.Hùr  r  r  ry   rz   rœ   r�   rÑ   rx   )r�   rù   rú   rû   r˜   rž   rü   rÄ  Fzfailed on the image API)r�   rù   rç  rè  r˜   rž   Úsuccessz)%s model %s %s; retrying with fallback %sz; image generation failed after trying all candidate models.rÑ  r7   )r  rÀ  rÓ  rþ   rù   rÿ   éÿÿÿÿ)r   rZ  rv  rÁ   r[  r�  ri   r   r%   r{   r”  r€  rb   Ú_ATTRIBUTION_HEADERSÚ	enumeraterb  rÖ   r]  rä  Úpoprø  r  rV   Úinfor   )rc  rù   rÿ   ry   rú  rü   rò  r™   r˜   r`   Úmodel_chainrç  rK   rû   rè  rà  rž   Ú
last_errorÚir�   rÒ   Úoutcomerô  s   &&&$$,                 r+   ÚgenerateÚ&OpenRouterCompatImageProvider.generateï  sÕ  € ô
 ˜TŸZ™Z¨Ó6ˆð	dØ $× 1Ñ 1Ó 3ÑˆG÷ ŸhÙØ�d—m‘m�_ð %Ø!Ÿ]™]˜OÐ+SðUà!ó#ð #ð
 ×/Ñ/°·
±
¸7Ó0CÓDˆÜ% lÓ3ˆà*0¯*©*Ð5GÓ*H×*NÐ*NÈBÐ*NÓOÑ*N 3”c˜#–hÑ*Nˆ
ÐOßØ×Ñœc )›nÔ-Ø×ÑÑIÐ.B×.HÐ.HÀbÐ.HÓIÔIØ*0°&¸&À&Ð)IÐ(JˆØÐ4Ô4Ó5ˆCÜ% cÓ*ˆDß‰tØ—‘ ¨°[À5È$À-ÐPÖQñ 6ð # g¨g¨YÐ$7ÐPÔ;OÐPˆà/3ˆ
Ü$ [Ö1‰KˆAˆxàˆGØ×'×'Ð'Ü)¨(°HÀt×GWÑGWÓX�Ø˜(Ô"Ø×6Ñ6Ø%¨fØ)ÀgÐV\ð 7ó ^�ð 7>·k±kÀ,ÐPU×6VÒ6VÑ2Ð\`‘à"&×"9Ñ"9Ø%¨fÈWØ%¨wð #:ó #8‘�˜ð �{‰{˜9×%Ò%¨ª¸1ÄÀKÓ@PÐSTÕ@TÔ;TØ’Ü�K‰KØ;¸T¿Z¹ZÈÐSYÐ[fÐghÐklÕglÕ[môð !ŠJñ' 2ð* ÷ ^ð ^œ^Ø—]‘]�OÐ#^Ð_Ø"¨T¯Z©Zß%0�+˜b–/°bÀô^ð 	^øôY ô 	dÙÐ,¨T¯]©]¨O¸>È#ÈÐOÐQbÓcÕcûð	düò Ps#   ˜J Â&KÊJ>ÊJ9Ê3J>Ê9J>)	r]  r[  ra  r`  r^  rZ  r\  r_  rb  rI   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rd  ÚpropertyrZ   rR  rv  rz  r‚  r—  r   r�  rŽ  r¬  r°  r´  r�  rä  rø  r	   r  Ú__static_attributes__r)   r-   r+   rM  rM  ö  sª   † ñ`ð6à_d÷6ð ôó ðð ôó ðõ
õõSõõ"õ _õ
aõ
õH÷6÷
*õRNõh/ðd 0Dñ7^à#'ð7^àUY÷7^ô 7^r-   rM  c               ó   € V ^8„  d   QhRR/# )r$   r'   z#list[OpenRouterCompatImageProvider]r)   )r*   s   "r+   r,   r,   )  s   € ÷ ñ Ð=ñ r-   c                 óf   € \        R RR R RRRRRRRR	R
RRRRRR/./R7      \        RRRRRRR7      .# )Ú
openrouterÚ
OpenRouterÚOPENROUTER_IMAGE_MODELTrZ   zOpenRouter (image)ÚbadgeÚpaidÚtagzdGemini Flash Image, gpt-image-2, Krea 2, Qwen Image 3 & more via OpenRouter; uses OPENROUTER_API_KEYÚenv_varsre   ÚOPENROUTER_API_KEYrù   zOpenRouter API keyrz   zhttps://openrouter.ai/keys)rQ  rR  rS  rÏ   rT  rO  rU  ÚnouszNous PortalÚNOUS_IMAGE_MODELN)rQ  rR  rS  rÏ   rT  rU  )rM  r)   r-   r+   Ú_build_providersr   )  ss   € ä%Ø&°\ÐP\Ø#Ð3KÐ`dàÐ,Ø˜ØÐ}ØØÐ/°Ð;OÐQVÐXtðð ð	ô
	ô 	&Ø ¨}È6Ð^dØ,¸4ô	Aðð r-   c               ó    € V ^8„  d   QhRRRR/# )r$   Úctxr   r'   rW  r)   )r*   s   "r+   r,   r,   ?  s   € ÷ 2ñ 2�#ð 2˜$ñ 2r-   c                óJ   € \        4        F  pV P                  V4       K  	  R# )z:Register the OpenRouter + Nous Portal image gen providers.N)r   Úregister_image_gen_provider)r"  rÓ  s   & r+   Úregisterr%  ?  s   € ä$Ö&ˆØ×'Ñ'¨Ö1ó 'r-   )zopenrouter/auto)r   ú1:4ú1:8ú2:3ú3:2ú3:4ú4:1ú4:3ú4:5ú5:4ú8:1r   r   ú21:9)r   r,  r*  r   r   r)  r(  ré   )r   r,  r)  r   r-  r(  r   )ré   rŠ   ÚmediumÚhighr)   )Ú1K)Ú512r3  Ú2KÚ4K)	r   r)  r(  r,  r*  r   r   r0  ré   )ré   Úopaque)r   r)  r(  ré   )ré   Útransparentr7  )r   r*  r,  r   r   r(  r)  ú9:19.5ú19.5:9ú9:20ú20:9ú1:2ú2:1ré   )r3  r5  )r   r=  r&  r>  r(  r)  r*  r+  r,  r-  r.  r   r   >   ré   r   r=  r&  r'  r>  r(  r)  r*  r+  r,  r-  r.  r/  r   r<  r0  r   r;  ú9:21r:  r9  )
r   r)  r,  r.  r0  r>  r:  r<  r+  r/  )
r   r(  r*  r-  r?  r=  r9  r;  r&  r'  )r   >
   r�   r‘   é˜  é™  é©  é­  éô  rN  é÷  éø  )Ú
resolutionr   r   r    r"   r  ))rG  r/   )r   N)r   N)r    N)r:   )\Ú__conditional_annotations__r  Ú
__future__r   r[   r£   ÚloggingrX   rÚ   r¼   Úpathlibr   Útypingr   r   r   r   r   Úagent.image_gen_providerr	   r
   r   r   r   r   r   Úplugins.image_gen._commonr   r   r   r   Ú	getLoggerr  rV   r«  r”   r¸  rˆ  rñ  r€  rÛ  r’  r²   rž  r±   rÞ   rÜ   rÀ   r¾   r   Ú__annotations__Ú_GEMINI_RATIOSÚ_MAI_RATIOSÚ_KREA_RATIOSÚ_OPENAI_QUALITYr0   r1   r6   rË   r·   rë   r8   r(  rÞ  rÔ   rI  r  r  r  rb   rl   rq   r   r–   r¦   rµ   rÈ   rÍ   rÖ   rÓ   rä   rî   r÷   r  r#  r*  r2  r:  rK  rM  r   r%  )rH  s   @r+   Ú<module>rU     sö  øðôõ #ã Û Û Û Û 	Û Ý ß 3Õ 3÷&÷ &ñ &÷ jÓ ià	×	Ò	˜8Ó	$€ð )€Ø-€Ø% Ð7Ð Ø  ! _°aÐ8€ð ˜E ;°¸
ÀFÐK€ØÐ ØÐ ð ØÐ+ØÐTðð ØÐ'ØÐIðð	Ð ð 0Ð Ø€Ø€Ø.Ð ð 0Ð à!Ð ð Ð ØKM€ÐHÓ Mð€ð J€ØB€Ø3€Ø˜˜L¨"¨o¸rÀ=ÐRWÐY_ÐafÐg€	õ`ð )Ñ*:Ø:ØEØ$°'ÀÈRô+Qð $Ñ%5Ø0ØDØ$Ð2KÐSTÐ_aô&cð Ñ*ØØPØYØÐ,>ÈDÐXZÐegô	ð Ñ/Ø!ØGØ3ØÐ,MÐ[_Ø˜2ô ð Ñ/Ø!Ð#ZØ!¨°Qô 8ð "Ñ#3Ø%Ð'WØ!¨°Qô$8ð &Ñ'7Ø&ØKðð !¨°Aô(7ð Ñ*ØÐOØ"°¸dÈ!ÐVWôYð Ñ 0ØÐ`Ø"°¸dÈ!ÐVWô!Yð Ñ-ØÐ]ØsØ  t°1¸qôBðQ,0Ð Ð,ó ,ñ^ ,¨B°À"ÈAÐXZÔ[Ð ñ $ò %ó Ð ð Ð]ØÐ\Øˆhð3Ð Ð/ó ð �˜ e¨[¸%ÀÈvÐWbÐdiØ�UðÐ ñ  )Ò)[Ó\Ð ñ ˜}¨oÐ>Ó?Ð à]Ð ðeÐ ð ˜=Ñ*GÐHÈ6ÐSYÑ[fÐJgð€ð
 Ð&àÐBØˆ~ð	Ð õIõ(4õ
4õ
õXõõ õ.õ(Eõ
õ Hõ	õ;ð2à"÷õ&*õZ#÷@õQõ
õô(p^Ð$4ô p^õf	÷,2r-   