Ë
    µŒjþ?  ã                   óŽ  — d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZ ddlZddlmZ ddlmZ ddlmZmZ ddlmZmZ dd	lm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+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 dZ5	 e
d   Z6dedefd„Z7dedeg ef   fd„Z8 G d„ de2e«      Z9 G d„ de2e«      Z: G d„ de2e«      Z; G d„ de2e«      Z< G d„ de2e«      Z=de.d edefd!„Z>d"e?d#e?d$e4d ed%e@d&ee6   defd'„ZAde.d$e4d ed%e@d&ee6   defd(„ZB	 	 	 	 	 	 d/de.d$e4d ed)ee   d*ee   d+e@d,eee?ef      d%e@d&ee6   d-edefd.„ZCy)0zLAgent that interacts with OpenAPI APIs via a hierarchical planning approach.é    N)Úpartial)ÚAnyÚCallableÚDictÚListÚLiteralÚOptionalÚSequenceÚcast)ÚBaseCallbackManager)ÚBaseLanguageModel)ÚBasePromptTemplateÚPromptTemplate)ÚBaseToolÚTool)ÚField)ÚAPI_CONTROLLER_PROMPTÚAPI_CONTROLLER_TOOL_DESCRIPTIONÚAPI_CONTROLLER_TOOL_NAMEÚAPI_ORCHESTRATOR_PROMPTÚAPI_PLANNER_PROMPTÚAPI_PLANNER_TOOL_DESCRIPTIONÚAPI_PLANNER_TOOL_NAMEÚPARSING_DELETE_PROMPTÚPARSING_GET_PROMPTÚPARSING_PATCH_PROMPTÚPARSING_POST_PROMPTÚPARSING_PUT_PROMPTÚ REQUESTS_DELETE_TOOL_DESCRIPTIONÚREQUESTS_GET_TOOL_DESCRIPTIONÚREQUESTS_PATCH_TOOL_DESCRIPTIONÚREQUESTS_POST_TOOL_DESCRIPTIONÚREQUESTS_PUT_TOOL_DESCRIPTION)ÚReducedOpenAPISpec)ÚOpenAI)ÚBaseRequestsTool)ÚRequestsWrapperiˆ  )ÚGETÚPOSTÚPUTÚDELETEÚPATCHÚpromptÚreturnc                 ó2   — ddl m}  |t        «       | ¬«      S )Nr   ©ÚLLMChain©Úllmr-   )Úlangchain.chains.llmr1   r%   )r-   r1   s     ú|/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/agent_toolkits/openapi/planner.pyÚ_get_default_llm_chainr6   3   s   € Ý-áÜ‹HØôð ó    c                 ó"   — t        t        | «      S )z#Returns a default LLMChain factory.)r   r6   )r-   s    r5   Ú_get_default_llm_chain_factoryr9   <   s   € ô Ô)¨6Ó2Ð2r7   c                   óŒ   — e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee«      ¬«      Zeed<   	 ded	efd
„Zded	efd„Zy)ÚRequestsGetToolWithParsingzHRequests GET tool with LLM-instructed extraction of truncated responses.Úrequests_getÚnameÚdescriptionÚresponse_length©Údefault_factoryÚ	llm_chainÚtextr.   c                 óR  — ddl m} 	  ||«      }|j	                  d«      }t        t        | j                  j	                  |d   |¬«      «      }|d | j                   }| j                  j                  ||d   ¬«      j                  «       S # t        j                  $ r}|‚d }~ww xY w)Nr   ©Úparse_json_markdownÚparamsÚurl)rG   Úoutput_instructions©ÚresponseÚinstructions)Úlangchain.output_parsers.jsonrF   ÚjsonÚJSONDecodeErrorÚgetr   ÚstrÚrequests_wrapperr?   rB   ÚpredictÚstrip)ÚselfrC   rF   ÚdataÚeÚdata_paramsrK   s          r5   Ú_runzRequestsGetToolWithParsing._runQ   s­   € ÝEð	Ù& tÓ,ˆDð —h‘h˜xÓ(ˆÜÜ�×&Ñ&×*Ñ*¨4°©;¸{Ð*ÓKó
ˆð Ð2˜d×2Ñ2Ð3ˆØ�~‰~×%Ñ%Ø¨DÐ1FÑ,Gð &ó 
ç
‰%‹'ð	øô ×#Ñ#ò 	ØˆGûð	ús   ˆB ÂB&ÂB!Â!B&c              ƒ   ó   K  — t        «       ‚­w©N©ÚNotImplementedError©rU   rC   s     r5   Ú_arunz RequestsGetToolWithParsing._aruna   ó   è ø€ Ü!Ó#Ð#ùó   ‚N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   rQ   Ú__annotations__r    r>   ÚMAX_RESPONSE_LENGTHr?   Úintr   r9   r   rB   r   rY   r_   © r7   r5   r;   r;   C   sq   … ÙRà€Dˆ#ÓØØ4€K�Ó4ØØ.€O�SÓ.Ø8ÙÙ6Ð7IÓJô€Iˆsó ð 1ð˜ð  ó ð $ ð $¨ô $r7   r;   c                   óŒ   — e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee«      ¬«      Zeed<   	 ded	efd
„Zded	efd„Zy)ÚRequestsPostToolWithParsingzIRequests POST tool with LLM-instructed extraction of truncated responses.Úrequests_postr=   r>   r?   r@   rB   rC   r.   c                 ó4  — ddl m} 	  ||«      }t	        t
        | j                  j                  |d   |d   «      «      }|d | j                   }| j                  j                  ||d   ¬«      j                  «       S # t        j                  $ r}|‚d }~ww xY w©Nr   rE   rH   rV   rI   rJ   )rM   rF   rN   rO   r   rQ   rR   Úpostr?   rB   rS   rT   ©rU   rC   rF   rV   rW   rK   s         r5   rY   z RequestsPostToolWithParsing._runs   s›   € ÝEð	Ù& tÓ,ˆDô œS $×"7Ñ"7×"<Ñ"<¸TÀ%¹[È$ÈvÉ,Ó"WÓXˆØÐ2˜d×2Ñ2Ð3ˆØ�~‰~×%Ñ%Ø¨DÐ1FÑ,Gð &ó 
ç
‰%‹'ð	øô	 ×#Ñ#ò 	ØˆGûð	úó   ˆA= Á=BÂBÂBc              ƒ   ó   K  — t        «       ‚­wr[   r\   r^   s     r5   r_   z!RequestsPostToolWithParsing._arun€   r`   ra   N)rb   rc   rd   re   r=   rQ   rf   r"   r>   rg   r?   rh   r   r9   r   rB   r   rY   r_   ri   r7   r5   rk   rk   e   sq   … ÙSà€Dˆ#ÓØØ5€K�Ó5ØØ.€O�SÓ.Ø8ÙÙ6Ð7JÓKô€Iˆsó ð 1ð˜ð  ó ð$ ð $¨ô $r7   rk   c                   óŒ   — e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee«      ¬«      Zeed<   	 ded	efd
„Zded	efd„Zy)ÚRequestsPatchToolWithParsingzJRequests PATCH tool with LLM-instructed extraction of truncated responses.Úrequests_patchr=   r>   r?   r@   rB   rC   r.   c                 ó4  — ddl m} 	  ||«      }t	        t
        | j                  j                  |d   |d   «      «      }|d | j                   }| j                  j                  ||d   ¬«      j                  «       S # t        j                  $ r}|‚d }~ww xY wrn   )rM   rF   rN   rO   r   rQ   rR   Úpatchr?   rB   rS   rT   rp   s         r5   rY   z!RequestsPatchToolWithParsing._run’   s    € ÝEð	Ù& tÓ,ˆDô Ü�×&Ñ&×,Ñ,¨T°%©[¸$¸v¹,ÓGó
ˆð Ð2˜d×2Ñ2Ð3ˆØ�~‰~×%Ñ%Ø¨DÐ1FÑ,Gð &ó 
ç
‰%‹'ð	øô ×#Ñ#ò 	ØˆGûð	úrq   c              ƒ   ó   K  — t        «       ‚­wr[   r\   r^   s     r5   r_   z"RequestsPatchToolWithParsing._arun¡   r`   ra   N)rb   rc   rd   re   r=   rQ   rf   r!   r>   rg   r?   rh   r   r9   r   rB   r   rY   r_   ri   r7   r5   rt   rt   „   sq   … ÙTà €Dˆ#Ó ØØ6€K�Ó6ØØ.€O�SÓ.Ø8ÙÙ6Ð7KÓLô€Iˆsó ð 1ð˜ð  ó ð$ ð $¨ô $r7   rt   c                   óŒ   — e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee«      ¬«      Zeed<   	 ded	efd
„Zded	efd„Zy)ÚRequestsPutToolWithParsingzHRequests PUT tool with LLM-instructed extraction of truncated responses.Úrequests_putr=   r>   r?   r@   rB   rC   r.   c                 ó4  — ddl m} 	  ||«      }t	        t
        | j                  j                  |d   |d   «      «      }|d | j                   }| j                  j                  ||d   ¬«      j                  «       S # t        j                  $ r}|‚d }~ww xY wrn   )rM   rF   rN   rO   r   rQ   rR   Úputr?   rB   rS   rT   rp   s         r5   rY   zRequestsPutToolWithParsing._run³   s›   € ÝEð	Ù& tÓ,ˆDô œS $×"7Ñ"7×";Ñ";¸DÀ¹KÈÈfÉÓ"VÓWˆØÐ2˜d×2Ñ2Ð3ˆØ�~‰~×%Ñ%Ø¨DÐ1FÑ,Gð &ó 
ç
‰%‹'ð	øô	 ×#Ñ#ò 	ØˆGûð	úrq   c              ƒ   ó   K  — t        «       ‚­wr[   r\   r^   s     r5   r_   z RequestsPutToolWithParsing._arunÀ   r`   ra   N)rb   rc   rd   re   r=   rQ   rf   r#   r>   rg   r?   rh   r   r9   r   rB   r   rY   r_   ri   r7   r5   rz   rz   ¥   sq   … ÙRà€Dˆ#ÓØØ4€K�Ó4ØØ.€O�SÓ.Ø8ÙÙ6Ð7IÓJô€Iˆsó ð 1ð˜ð  ó ð$ ð $¨ô $r7   rz   c                   ó’   — e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
ee   ed<   	  e ee«      ¬«      Zeed<   	 ded	efd
„Zded	efd„Zy)ÚRequestsDeleteToolWithParsingz9Tool that sends a DELETE request and parses the response.Úrequests_deleter=   r>   r?   r@   rB   rC   r.   c                 ó,  — ddl m} 	  ||«      }t	        t
        | j                  j                  |d   «      «      }|d | j                   }| j                  j                  ||d   ¬«      j                  «       S # t        j                  $ r}|‚d }~ww xY w)Nr   rE   rH   rI   rJ   )rM   rF   rN   rO   r   rQ   rR   Údeleter?   rB   rS   rT   rp   s         r5   rY   z"RequestsDeleteToolWithParsing._runÓ   s•   € ÝEð	Ù& tÓ,ˆDô œS $×"7Ñ"7×">Ñ">¸tÀE¹{Ó"KÓLˆØÐ2˜d×2Ñ2Ð3ˆØ�~‰~×%Ñ%Ø¨DÐ1FÑ,Gð &ó 
ç
‰%‹'ð	øô	 ×#Ñ#ò 	ØˆGûð	ús   ˆA9 Á9BÂBÂBc              ƒ   ó   K  — t        «       ‚­wr[   r\   r^   s     r5   r_   z#RequestsDeleteToolWithParsing._arunà   r`   ra   N)rb   rc   rd   re   r=   rQ   rf   r   r>   rg   r?   r	   rh   r   r9   r   rB   r   rY   r_   ri   r7   r5   r€   r€   Ä   su   … ÙCà!€Dˆ#Ó!ØØ7€K�Ó7Ø&à%8€O�X˜c‘]Ó8Ø-ÙÙ6Ð7LÓMô€Iˆsó ð 4ð˜ð  ó ð$ ð $¨ô $r7   r€   Úapi_specr3   c           	      ó  — ddl m} | j                  D ���cg c]  \  }}}|› d|› �‘Œ }}}}t        t        dgdddj                  |«      z   i¬«      } |||¬«      }t        t        t        |j                  ¬	«      }	|	S c c}}}w )
Nr   r0   Ú ÚqueryÚ	endpointsz- ©ÚtemplateÚinput_variablesÚpartial_variablesr2   )r=   r>   Úfunc)
r4   r1   r‰   r   r   Újoinr   r   r   Úrun)
r…   r3   r1   r=   r>   Ú_Úendpoint_descriptionsr-   ÚchainÚtools
             r5   Ú_create_api_planner_toolr•   ç   s›   € õ .ð =E×<NÒ<NõÙ<NÑ$8 D¨+°qˆ4ˆ&��+�ÒÐ<Nð ò ô Ü#Ø ˜	Ø&¨¨t¯y©yÐ9NÓ/OÑ(OÐPô€Fñ
 ˜ VÔ,€EÜÜ"Ü0Ø�Y‰Yô€Dð
 €Kùôs   —B Úapi_urlÚapi_docsrR   Úallow_dangerous_requestsÚallowed_operationsc                 ó   — ddl m} ddlm} ddlm} g }	d|v r+ ||t        ¬«      }
|	j                  t        ||
|¬«      «       d|v r+ ||t        ¬«      }|	j                  t        |||¬«      «       d	|v r+ ||t        ¬«      }|	j                  t        |||¬«      «       d
|v r+ ||t        ¬«      }|	j                  t        |||¬«      «       d|v r+ ||t        ¬«      }|	j                  t!        |||¬«      «       |	st#        d«      ‚t%        t&        ddg| |dj)                  |	D �cg c]  }|j*                  ‘Œ c}«      dj)                  |	D �cg c]  }|j*                  › d|j,                  › �‘Œ c}«      dœ¬«      } | |||¬«      |	D �cg c]  }|j*                  ‘Œ c}¬«      }|j/                  ||	d¬«      S c c}w c c}w c c}w )Nr   ©ÚAgentExecutor©ÚZeroShotAgentr0   r(   r2   )rR   rB   r˜   r)   r*   r+   r,   zTools not foundÚinputÚagent_scratchpadú, Ú
ú: )r–   r—   Ú
tool_namesÚtool_descriptionsrŠ   ©rB   Úallowed_toolsT)ÚagentÚtoolsÚverbose)Úlangchain.agents.agentrœ   Úlangchain.agents.mrkl.baserž   r4   r1   r   Úappendr;   r   rk   r   rz   r   r€   r   rt   Ú
ValueErrorr   r   r�   r=   r>   Úfrom_agent_and_tools)r–   r—   rR   r3   r˜   r™   rœ   rž   r1   r©   Úget_llm_chainÚpost_llm_chainÚput_llm_chainÚdelete_llm_chainÚpatch_llm_chainr”   r-   r¨   s                     r5   Ú_create_api_controller_agentrµ   ý   sô  € õ 5Ý8Ý-à€EØÐ"Ñ"Ù  SÔ1CÔDˆØ�‰Ü&Ø!1Ø'Ø)Aôô	
ð Ð#Ñ#Ù! cÔ2EÔFˆØ�‰Ü'Ø!1Ø(Ø)Aôô	
ð Ð"Ñ"Ù  SÔ1CÔDˆØ�‰Ü&Ø!1Ø'Ø)Aôô	
ð Ð%Ñ%Ù#¨Ô4IÔJÐØ�‰Ü)Ø!1Ø*Ø)Aôô	
ð Ð$Ñ$Ù" sÔ3GÔHˆØ�‰Ü(Ø!1Ø)Ø)Aôô	
ñ ÜÐ*Ó+Ð+ÜÜ&Ø Ð"4Ð5àØ ØŸ)™)¹5Ó$A¹5°4 T§Y£Y¸5Ñ$AÓBØ!%§¡Ù@EÓFÁ¸�D—I‘I�;˜b ×!1Ñ!1Ð 2Ò3ÀÑFó"ñ	
ô€Fñ Ù˜s¨6Ô2Ù-2Ó3©U T�t—y“y¨UÑ3ô€Eð ×-Ñ-°EÀÐPTÐ-ÓUÐUùò %BùâFùò 4s   Ä+GÅ"GÆG
c                 óŒ   ‡ ‡‡‡‡‡— ‰ j                   d   d   Šdt        dt        fˆˆˆ ˆˆˆfd„}t        t        |t        ¬«      S )zÆExpose controller as a tool.

    The tool is invoked with a plan from the planner, and dynamically
    creates a controller agent with relevant documentation only to
    constrain the context.
    r   rH   Úplan_strr.   c           
      ó
  •— d}t        j                  || «      }|D ��cg c]*  \  }}dj                  ||j                  d«      d   ¬«      ‘Œ, }}}d}|D ]†  }d}‰j                  D ]c  \  }	}
}t        j
                  t        j                  dd	|	«      «      }|j                  |«      sŒCd
}|d|› dt        j                  |«      › d�z  }Œe |rŒzt        |› d�«      ‚ t        ‰|‰‰‰‰«      }|j                  | «      S c c}}w )Nz'\b(GET|POST|PATCH|DELETE|PUT)\s+(/\S+)*z{method} {route}Ú?r   )ÚmethodÚrouteÚ Fz\{.*?\}z.*Tz== Docs for z == 
r¢   z endpoint does not exist.)ÚreÚfindallÚformatÚsplitr‰   ÚcompileÚsubÚmatchÚyamlÚdumpr®   rµ   r�   )r·   ÚpatternÚmatchesrº   r»   Úendpoint_namesÚdocs_strÚendpoint_nameÚfound_matchr=   r‘   ÚdocsÚ
regex_namer¨   r˜   r™   r…   Úbase_urlr3   rR   s                 €€€€€€r5   Ú$_create_and_run_api_controller_agentzI_create_api_controller_tool.<locals>._create_and_run_api_controller_agent\  s%  ø€ Ø<ˆÜ—*‘*˜W hÓ/ˆñ ")ô
á!(‘�˜ð ×%Ñ%¨V¸5¿;¹;ÀsÓ;KÈAÑ;NÐ%ÕOØ!(ð 	ñ 
ð ˆÛ+ˆMØˆKØ!)×!3Ô!3‘��a˜ÜŸZ™Z¬¯©¨{¸DÀ$Ó(GÓH�
Ø×#Ñ# MÕ2Ø"&�KØ ,¨}¨o¸VÄDÇIÁIÈdÃOÐCTÐTVÐ WÑW‘Hð	 "4ò
 Ü  M ?Ð2KÐ!LÓMÐMð ,ô -ØØØØØ$Øó
ˆð �y‰y˜Ó"Ð"ùó/
s   Ÿ/C?)r=   rŽ   r>   )ÚserversrQ   r   r   r   )r…   rR   r3   r˜   r™   rÏ   rÎ   s   ````` @r5   Ú_create_api_controller_toolrÑ   L  sJ   ý€ ð ×Ñ Ñ" 5Ñ)€Hð#´sð #¼s÷ #ò #ô8 Ü%Ø1Ü3ôð r7   Úshared_memoryÚcallback_managerrª   Úagent_executor_kwargsÚkwargsc	                 óð  — ddl m}
 ddlm} ddlm} t        | |«      t        | ||||«      g}t        t        ddgdj                  |D �cg c]  }|j                  ‘Œ c}«      dj                  |D �cg c]  }|j                  › d	|j                  › �‘Œ c}«      d
œ¬«      } |d ||||¬«      |D �cg c]  }|j                  ‘Œ c}dœ|	¤Ž} |
j                  d||||dœ|xs i ¤ŽS c c}w c c}w c c}w )a  Construct an OpenAI API planner and controller for a given spec.

    Inject credentials via requests_wrapper.

    We use a top-level "orchestrator" agent to invoke the planner and controller,
    rather than a top-level planner
    that invokes a controller with its plan. This is to keep the planner simple.

    You need to set allow_dangerous_requests to True to use Agent with BaseRequestsTool.
    Requests can be dangerous and can lead to security vulnerabilities.
    For example, users can ask a server to make a request to an internal
    server. It's recommended to use requests through a proxy server
    and avoid accepting inputs from untrusted sources without proper sandboxing.
    Please see: https://python.langchain.com/docs/security
    for further security information.

    Args:
        api_spec: The OpenAPI spec.
        requests_wrapper: The requests wrapper.
        llm: The language model.
        shared_memory: Optional. The shared memory. Default is None.
        callback_manager: Optional. The callback manager. Default is None.
        verbose: Optional. Whether to print verbose output. Default is True.
        agent_executor_kwargs: Optional. Additional keyword arguments
            for the agent executor.
        allow_dangerous_requests: Optional. Whether to allow dangerous requests.
            Default is False.
        allowed_operations: Optional. The allowed operations.
            Default is ("GET", "POST").
        kwargs: Additional arguments.

    Returns:
        The agent executor.
    r   r›   r�   r0   rŸ   r    r¡   r¢   r£   )r¤   r¥   rŠ   )r3   r-   Úmemoryr¦   )r¨   r©   rÓ   rª   ri   )r«   rœ   r¬   rž   r4   r1   r•   rÑ   r   r   r�   r=   r>   r¯   )r…   rR   r3   rÒ   rÓ   rª   rÔ   r˜   r™   rÕ   rœ   rž   r1   r©   r”   r-   r¨   s                    r5   Úcreate_openapi_agentrØ     s*  € õ\ 5Ý8Ý-ô 	! ¨3Ó/Ü#ØØØØ$Øó	
ð	€Eô Ü(Ø Ð"4Ð5àŸ)™)¹5Ó$A¹5°4 T§Y£Y¸5Ñ$AÓBØ!%§¡Ù@EÓFÁ¸�D—I‘I�;˜b ×!1Ñ!1Ð 2Ò3ÀÑFó"ñ
ô	€Fñ ð Ù˜s¨6¸-ÔHÙ-2Ó3©U T�t—y“y¨UÑ3ñð ñ€Eð
 .ˆ=×-Ñ-ð ØØØ)Øñ	ð
 !Ò& Bñð ùò %BùâFùò 4s   Á
C)Á2"C.Â3C3)NNTNF)r(   r)   )Dre   rN   r½   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   r   rÄ   Úlangchain_core.callbacksr   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr   r   Úlangchain_core.toolsr   r   Úpydanticr   Ú9langchain_community.agent_toolkits.openapi.planner_promptr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   Ú/langchain_community.agent_toolkits.openapi.specr$   Úlangchain_community.llmsr%   Ú'langchain_community.tools.requests.toolr&   Ú&langchain_community.utilities.requestsr'   rg   Ú	Operationr6   r9   r;   rk   rt   rz   r€   r•   rQ   Úboolrµ   rÑ   rØ   ri   r7   r5   Ú<module>rç      sR  ðÙ Rã Û 	Ý ß O× OÓ Oã Ý 8Ý <ß Eß /Ý ÷÷ ÷ ÷ õ õ& OÝ +Ý DÝ Bð Ð Ø 4àÐ;Ñ<€	ðÐ#5ð ¸#ó ð3Øð3àˆb�#ˆgÑó3ô$Ð!1°8ô $ôD$Ð"2°Hô $ô>$Ð#3°Xô $ôB$Ð!1°8ô $ô>$Ð$4°hô $ðFØ ðØ'8ðà	óð,LVØðLVàðLVð &ðLVð 
ð	LVð
 #ðLVð ! Ñ+ðLVð 	óLVð^0Ø ð0à%ð0ð 
ð0ð #ð	0ð
 ! Ñ+ð0ð 
ó0ðn $(Ø6:ØØ6:Ø%*Ø.=ñQØ ðQà%ðQð 
ðQð ˜C‘=ð	Qð
 Ð2Ñ3ðQð ðQð $ D¨¨c¨¡NÑ3ðQð #ðQð ! Ñ+ðQð ðQð 	ôQr7   