+
    4O|j:·  ã                  óJ  € 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	t	^ RI
t
^ RIt^ RIHt ^ RIHtHtHtHtHtHt ^ RIHtHtHtHt ^ RIHtHtHtHtHtH t H!t!H"t"H#t# ^ RI$H%t% ^ RI&H't'H(t(H)t) ^ R	I*H+t+H,t,H-t-H.t.H/t/ ^ R
I0H1t1 ^ RI2H3t3 ^ RI4H5t5H6t6H7t7H8t8H9t9 ^ RI:H;t;H<t< ^ RI=H>t>H?t? ^ RI@HAtA ^ RIBHCtC ^ RIDHEtEHFtFHGtGHHtHHItI ]'       d   ^ RIJHKtK ^ RILHMtM ^ RINHOtOHPtP RtQ]R! ]! ]S4      P¨                  4      tUR R ltV ! R R4      tW ! R R4      tXR R ltYR R ltZR# ) z<Internal class to monitor a topology of one or more servers.)ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallableÚMappingÚOptionalÚcast)Ú_csotÚcommonÚhelpers_sharedÚperiodic_executor)	ÚConnectionFailureÚInvalidOperationÚNetworkTimeoutÚNotPrimaryErrorÚOperationFailureÚPyMongoErrorÚServerSelectionTimeoutErrorÚWaitQueueTimeoutErrorÚ
WriteError)ÚHello)Ú
_cond_waitÚ_create_conditionÚ_create_lock)Ú_SDAM_LOGGERÚ_SERVER_SELECTION_LOGGERÚ
_debug_logÚ_SDAMStatusMessageÚ_ServerSelectionStatusMessage)ÚPoolOptions)ÚServerDescription)Ú	SelectionÚany_server_selectorÚarbiter_server_selectorÚsecondary_server_selectorÚwritable_server_selector)Ú_ServerSessionÚ_ServerSessionPool)ÚMonitorBaseÚ
SrvMonitor)ÚPool)ÚServer)ÚSRV_POLLING_TOPOLOGIESÚTOPOLOGY_TYPEÚTopologyDescriptionÚ)_updated_topology_description_srv_pollingÚupdated_topology_description)ÚObjectId)ÚTopologySettings)ÚClusterTimeÚ_AddressTc               ó    € V ^8„  d   QhRRRR/# )é   Ú	queue_refz"weakref.ReferenceType[queue.Queue]ÚreturnÚbool© )Úformats   "ÚUC:\Users\alokc\chatbot\backend\venv\Lib\site-packages\pymongo/synchronous/topology.pyÚ__annotate__r>   W   s   € ÷ ñ Ð$Fð È4ñ ó    c                ó˜   € V ! 4       pV'       g   R #   VP                  4       pVw  r4V! V!   K    \        P                   d     R# i ; i)FT)Ú
get_nowaitÚqueueÚEmpty)r8   ÚqÚeventÚfnÚargss   &    r=   Úprocess_events_queuerH   W   sO   € Ù‹€AßÙà
ð	Ø—L‘L“NˆEð ‰HˆBÙ�ŒIøô	 �{‰{ô 	Øñ
 ð	ús   ”0 °A	ÁA	c                  óT  € ] tR t^htR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 R llt
R\R R lltR^R R lltR_R R lltR_R R l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( ltR) R* ltR+ R, ltR`R- R. lltR/ R0 ltR1 R2 ltR3 R4 lt]R5 R6 l4       tR7 R8 lt R9 R: lt!R; R< lt"R= R> lt#R? R@ lt$RA RB lt%RC RD lt&RE RF lt'RG RH lt(RI RJ lt)RK RL lt*RM RN lt+RO RP lt,RQ RR lt-RS RT lt.RU RV lt/RW RX lt0RY RZ lt1R[t2R# )aÚTopologyz*Monitor a topology of one or more servers.c               ó   € V ^8„  d   QhRR/# )r7   Útopology_settingsr3   r;   )r<   s   "r=   r>   ÚTopology.__annotate__k   s   € ÷ m4ñ m4Ð*:ñ m4r?   c           	     	ó  a€ VP                   V n         VP                  P                  V n        V P                  R J;'       d    V P                  P                  V n        V P                  R J;'       d    V P                  P                  V n        R V n        R V n	        V P
                  '       g   V P                  '       d   \        P                  ! ^dR7      V n        \        P                  ! \        P                  4      '       d+   \!        \        \"        P$                  V P                   R7       V P                  '       d]   V P                  f   Q hV P                  f   Q hV P                  P'                  V P                  P(                  V P                   334       Wn        \-        VP/                  4       VP1                  4       VP2                  R R V4      pW n        \-        \6        P8                  / R R R V P*                  4      pV P                  '       dh   V P                  f   Q hV P                  f   Q hV P                  P'                  V P                  P:                  W0P4                  V P                   334       \        P                  ! \        P                  4      '       dI   \!        \        \"        P<                  V P                   \?        V4      \?        V P4                  4      R7       VP@                   F×  pV P
                  '       d]   V P                  f   Q hV P                  f   Q hV P                  P'                  V P                  PB                  W@P                   334       \        P                  ! \        P                  4      '       g   K�  \!        \        \"        PD                  V P                   V^ ,          V^,          R7       KÙ  	  \G        VPI                  4       4      V n%        RV n&        RV n'        \Q        4       V n)        \U        V PR                  \V        '       d   V P*                  PX                  MR 4      V n-        / V n.        R V n/        R V n0        \c        4       V n2        V P
                  '       g   V P                  '       d‘   V P                  f   Q hR V3R llp\f        Ph                  ! \j        Pl                  \j        Pn                  VRR	7      p\p        Pr                  ! V P                  VPt                  4      oW`n	        VPw                  4        R V n<        V P*                  Pz                  e7   V P*                  P|                  '       g   \        W P*                  4      V n<        . V n@        R # )
N)Úmaxsize©ÚmessageÚ
topologyId©rQ   rR   ÚpreviousDescriptionÚnewDescription)rQ   rR   Ú
serverHostÚ
serverPortFc               ó   € V ^8„  d   QhRR/# )r7   r9   r:   r;   )r<   s   "r=   r>   Ú'Topology.__init__.<locals>.__annotate__Â   s   € ÷ 2ñ 2˜Dñ 2r?   c                 ó   <€ \        S 4      # ©N)rH   )Úweaks   €r=   ÚtargetÚ!Topology.__init__.<locals>.targetÂ   s   ø€ Ü+¨DÓ1Ð1r?   Úpymongo_events_thread)ÚintervalÚmin_intervalr]   Úname)AÚ_topology_idÚ_pool_optionsÚ_event_listenersÚ
_listenersÚenabled_for_serverÚ_publish_serverÚenabled_for_topologyÚ_publish_tpÚ_eventsÚ_Topology__events_executorrB   ÚQueuer   ÚisEnabledForÚloggingÚDEBUGr   r   ÚSTART_TOPOLOGYÚputÚpublish_topology_openedÚ	_settingsr/   Úget_topology_typeÚget_server_descriptionsÚreplica_set_nameÚ_descriptionr.   ÚUnknownÚ$publish_topology_description_changedÚTOPOLOGY_CHANGEÚreprÚseedsÚpublish_server_openedÚSTART_SERVERÚlistÚserver_descriptionsÚ_seed_addressesÚ_openedÚ_closedr   Ú_lockr   Ú_IS_SYNCÚcondition_classÚ
_conditionÚ_serversÚ_pidÚ_max_cluster_timer(   Ú_session_poolr   ÚPeriodicExecutorr   ÚEVENTS_QUEUE_FREQUENCYÚMIN_HEARTBEAT_INTERVALÚweakrefÚrefÚcloseÚopenÚ_srv_monitorÚfqdnÚload_balancedr*   Ú_monitor_tasks)ÚselfrL   Útopology_descriptionÚ
initial_tdÚseedr]   Úexecutorr\   s   &&     @r=   Ú__init__ÚTopology.__init__k   s%  ø€ Ø-×:Ñ:ˆÔØ+×9Ñ9×JÑJˆŒØ#Ÿ™°dÐ:×aÐa¸t¿¹×?aÑ?aˆÔØŸ?™?°$Ð6×_Ð_¸4¿?¹?×;_Ñ;_ˆÔð 15ˆŒØ&*ˆÔà××Ð 4×#3×#3Ð#3Ü Ÿ;š;¨sÔ3ˆDŒLä×$Ò$¤W§]¡]×3Ò3ÜÜÜ*×9Ñ9Ø×,Ñ,õð ××ÐØ—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ø�L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ø*ŒÜ2Ø×/Ñ/Ó1Ø×5Ñ5Ó7Ø×.Ñ.ØØØó 
Ðð 1ÔÜ(Ü×!Ñ! 2 t¨T°4¸¿¹ó
ˆ
ð ××ÐØ—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ×!2Ñ!2°D×4EÑ4EÐFðôô ×$Ò$¤W§]¡]×3Ò3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨Ó$4Ü# D×$5Ñ$5Ó6õð &×+Ô+ˆDØ×#×#Ð#Ø—|‘|Ò/Ð/Ð/Ø—‘Ò2Ð2Ð2Ø—‘× Ñ  $§/¡/×"GÑ"GÈ$×PaÑPaÐIbÐ!cÔdÜ×(Ò(¬¯©×7Ô7ÜÜ Ü.×;Ñ;Ø#×0Ñ0Ø# A�wØ# A�w÷ñ ,ô  $Ð$8×$LÑ$LÓ$NÓOˆÔØˆŒØˆŒÜ!“^ˆŒ
Ü+Ø�J‰J¿(»(˜Ÿ™×6Ò6Èó
ˆŒð 13ˆŒØ#'ˆŒ	Ø8<ˆÔÜ/Ó1ˆÔà××Ð 4×#3×#3Ð#3Ø—<‘<Ò+Ð+Ð+÷2ð 2ô )×9Ò9Ü×6Ñ6Ü#×:Ñ:ØØ,ô	ˆHô —;’;˜tŸ|™|¨X¯^©^Ó<ˆDØ%-Ô"Ø�M‰MŒOà ˆÔØ�>‰>×ÑÒ*°4·>±>×3O×3OÐ3OÜ *¨4·±Ó @ˆDÔð 24ˆÖr?   c               ó   € V ^8„  d   QhRR/# ©r7   r9   ÚNoner;   )r<   s   "r=   r>   rM   Ú   s   € ÷ %"ñ %"�dñ %"r?   c                ó~  € \         P                  ! 4       pV P                  f   Wn        M¾WP                  8w  d¯   Wn        \        P                  R,          R8¼  d   R\
        3/pMR^/p\        P                  ! R/ VB  V P                  ;_uu_ 4        V P                  P                  4        F  pVP                  4        K  	  V P                  P                  4        RRR4       V P                  ;_uu_ 4        V P                  4        RRR4       R#   + '       g   i     L?; i  + '       g   i     R# ; i)a{  Start monitoring, or restart after a fork.

No effect if called multiple times.

.. warning:: Topology is shared among multiple threads and is protected
  by mutual exclusion. Using Topology from a process other than the one
  that initialized it will emit a warning and may result in deadlock. To
  prevent this from happening, MongoClient must be created after any
  forking.

N:Nr7   NÚskip_file_prefixesÚ
stacklevel)é   é   )z³MongoClient opened before fork. May not be entirely fork-safe, proceed with caution. See PyMongo's documentation for details: https://dochub.mongodb.org/core/pymongo-fork-deadlock)ÚosÚgetpidrŠ   ÚsysÚversion_infoÚ_pymongo_dirÚwarningsÚwarnr…   r‰   Úvaluesr’   rŒ   ÚresetÚ_ensure_opened)r˜   ÚpidÚkwargsÚservers   &   r=   r“   ÚTopology.openÚ   sà   € ô �iŠi‹kˆØ�9‰9ÒØ�IØ—I‘IÔØŒIÜ×Ñ Õ# wÔ.Ø.´°Ð@‘à&¨Ð*�ä�MŠMñ ð ò	ð ——“à"Ÿm™m×2Ñ2Ö4�FØ—L‘L–Nñ 5ð ×"Ñ"×(Ñ(Ô*÷ ð �Z�Z‹ZØ×ÑÔ!÷ ‰Z÷ —ú÷ �ZˆZús   ÂADÃ=D+ÄD(	Ä+D<	c               ó   € V ^8„  d   QhRR/# )r7   r9   Úfloatr;   )r<   s   "r=   r>   rM     s   € ÷ ñ ¨eñ r?   c                	ód   € \         P                  ! 4       pVf   V P                  P                  # V# r[   )r
   Ú	remainingrt   Úserver_selection_timeout)r˜   Útimeouts   & r=   Úget_server_selection_timeoutÚ%Topology.get_server_selection_timeout  s(   € ä—/’/Ó#ˆØŠ?Ø—>‘>×:Ñ:Ð:Øˆr?   Nc               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r7   Úselectorú Callable[[Selection], Selection]Ú	operationÚstrr¹   úOptional[float]ÚaddressúOptional[_Address]Úoperation_idúOptional[int]Údeprioritized_serversúOptional[list[Server]]r9   zlist[Server]r;   )r<   s   "r=   r>   rM     sP   € ÷ -ñ -à2ð-ð ð-ð #2ð	-ð
 $ð-ð $ð-ð  6ð-ð 
ñ-r?   c                óœ  € Vf   V P                  4       pMTp\        '       g#   V P                  '       d   V P                  4        V P                  ;_uu_ 4        V P                  VVVVVVR7      pV U	u. uF,  p	\        \        V P                  V	P                  4      4      NK.  	  up	uuRRR4       # u up	i   + '       g   i     R# ; i)a2  Return a list of Servers matching selector, or time out.

:param selector: function that takes a list of Servers and returns
    a subset of them.
:param operation: The name of the operation that the server is being selected for.
:param server_selection_timeout: maximum seconds to wait.
    If not provided, the default value common.SERVER_SELECTION_TIMEOUT
    is used.
:param address: optional server address to select.

Calls self.open() if needed.

Raises exc:`ServerSelectionTimeoutError` after
`server_selection_timeout` if no matching servers are found.
N)rÇ   )
r»   r†   r—   Úcleanup_monitorsr…   Ú_select_servers_loopr	   r,   Úget_server_by_addressrÃ   )
r˜   r¾   rÀ   r¹   rÃ   rÅ   rÇ   Úserver_timeoutr�   Úsds
   &&&&&&&   r=   Úselect_serversÚTopology.select_servers  s´   € ð0 $Ò+Ø!×>Ñ>Ó@‰Nà5ˆN÷ ‹x˜D×/×/Ð/Ø×!Ñ!Ô#à�Z�Z‹ZØ"&×";Ñ";ØØØØØØ&;ð #<ó #Ðñ PcóÙObÈ””V˜T×7Ñ7¸¿
¹
ÓCÖDÑObñ÷ ŠZùò÷ �ZˆZús   ÁB:Á62B5Â(B:Â5B:Â:C	c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r7   r¾   r¿   rº   r¶   rÀ   rÁ   rÅ   rÆ   rÃ   rÄ   rÇ   rÈ   r9   úlist[ServerDescription]r;   )r<   s   "r=   r>   rM   7  sY   € ÷ P#ñ P#à2ðP#ð ðP#ð ð	P#ð
 $ðP#ð $ðP#ð  6ðP#ð 
!ñP#r?   c                óü  € \         P                  ! 4       pWr,           pRp	\        P                  ! \        P
                  4      '       dM   \        \        \        P                  VVVV P                  V P                  P                  P                  R7       V P                  P                  TTV P                  P                  V'       d   V U
u. uF  qªP                  NK  	  up
MRR7      pV'       Egé   V^ 8X  g   Wx8”  d´   \        P                  ! \        P
                  4      '       d]   \        \        \        P                   VVVV P                  V P                  P                  P                  V P#                  V4      R7       \%        V P#                  V4       RV RV P                  : 24      hV	'       gz   \        \        \        P&                  VVVV P                  V P                  P                  P                  \)        RV\         P                  ! 4       ,
          ,          4      R	7       R
p	V P+                  4        V P-                  4        \/        V P0                  \2        P4                  4       V P                  P7                  4        \         P                  ! 4       pV P                  P                  WV P                  P                  R7      pEKñ  V P                  P7                  4        V# u up
i )z7select_servers() guts. Hold the lock when calling this.F)rQ   r¾   rÀ   ÚoperationIdÚtopologyDescriptionÚclientIdN)Úcustom_selectorrÇ   )rQ   r¾   rÀ   rÔ   rÕ   rÖ   Úfailurez, Timeout: zs, Topology Description: iè  )rQ   r¾   rÀ   rÔ   rÕ   rÖ   ÚremainingTimeMST)r×   )ÚtimeÚ	monotonicr   rn   ro   rp   r   r   ÚSTARTEDÚdescriptionÚ_topology_settingsrc   rx   Úapply_selectorrt   Úserver_selectorÚFAILEDÚ_error_messager   ÚWAITINGÚintr°   Ú_request_check_allr   rˆ   r   r�   Úcheck_compatible)r˜   r¾   rº   rÀ   rÅ   rÃ   rÇ   ÚnowÚend_timeÚlogged_waitingr³   r�   s   &&&&&&&     r=   rË   ÚTopology._select_servers_loop7  sa  € ô �nŠnÓˆØ•=ˆØˆä#×0Ò0´·±×?Ò?ÜÜ(Ü5×=Ñ=Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIõð #×/Ñ/×>Ñ>ØØØ ŸN™N×:Ñ:ç$ñ EZÓ"ZÑDY¸&×#5Ô#5ÑDYÒ"Zàð ?ó 
Ð÷ &Ð%à˜!Œ|˜sœ~Ü+×8Ò8¼¿¹×GÒGÜÜ0Ü =× DÑ DØ!)Ø"+Ø$0Ø,0×,<Ñ,<Ø!%×!1Ñ!1×!DÑ!D×!QÑ!QØ $× 3Ñ 3°HÓ =õ	ô 2Ø×*Ñ*¨8Ó4Ð5°[ÀÀ	ÐIbÐcg×csÑcsÑbvÐwóð ÷ "ÜÜ,Ü9×AÑAØ%Ø'Ø ,Ø(,×(8Ñ(8Ø!×-Ñ-×@Ñ@×MÑMÜ$'¨°¼4¿>º>Ó;KÕ0KÕ(LÓ$Mõ	ð "&�à×ÑÔ!Ø×#Ñ#Ô%ô �t—‘¬×(EÑ(EÔFØ×Ñ×.Ñ.Ô0Ü—.’.Ó"ˆCØ"&×"3Ñ"3×"BÑ"BØ°4·>±>×3QÑ3Qð #Có #Óð 	×Ñ×*Ñ*Ô,Ø"Ð"ùòg #[s   ÃK9c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# ©r7   r¾   r¿   rÀ   rÁ   r¹   rÂ   rÃ   rÄ   rÇ   rÈ   rÅ   rÆ   r9   r,   r;   )r<   s   "r=   r>   rM   ‰  sP   € ÷ ñ à2ðð ðð #2ð	ð
 $ðð  6ðð $ðð 
ñr?   c                	óø   € V P                  VVVVVV4      p\        V4      ^8X  d
   V^ ,          # \        P                  ! V^4      w  r‰VP                  P
                  V	P                  P
                  8:  d   V# V	# )é   )rÏ   ÚlenÚrandomÚsampleÚpoolÚoperation_count)
r˜   r¾   rÀ   r¹   rÃ   rÇ   rÅ   ÚserversÚserver1Úserver2s
   &&&&&&&   r=   Ú_select_serverÚTopology._select_server‰  sw   € ð ×%Ñ%ØØØ$ØØØ!ó
ˆô ˆw‹<˜1ÔØ˜1•:ÐÜ!Ÿ=š=¨°!Ó4ÑˆØ�<‰<×'Ñ'¨7¯<©<×+GÑ+GÔGØˆNàˆNr?   c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# rì   r;   )r<   s   "r=   r>   rM   ¢  sP   € ÷  ñ  à2ð ð ð ð #2ð	 ð
 $ð ð  6ð ð $ð ð 
ñ r?   c                ó  € V P                  VVVVVVR7      p\        P                  ! 4       '       d+   \        P                  ! VP                  P
                  4       \        P                  ! \        P                  4      '       d…   \        \        \        P                  VVVV P                  V P                  P                  P                  VP                  P                  ^ ,          VP                  P                  ^,          R7	       V# )zALike select_servers, but choose a random server if several match.©rÅ   )rQ   r¾   rÀ   rÔ   rÕ   rÖ   rV   rW   )r÷   r
   Úget_timeoutÚset_rttrÝ   Úmin_round_trip_timer   rn   ro   rp   r   r   Ú	SUCCEEDEDrÞ   rc   rÃ   )r˜   r¾   rÀ   r¹   rÃ   rÇ   rÅ   r³   s   &&&&&&& r=   Úselect_serverÚTopology.select_server¢  sÓ   € ð ×$Ñ$ØØØ$ØØ!Ø%ð %ó 
ˆô ×Ò×ÒÜ�MŠM˜&×,Ñ,×@Ñ@ÔAÜ#×0Ò0´·±×?Ò?ÜÜ(Ü5×?Ñ?Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIØ!×-Ñ-×5Ñ5°aÕ8Ø!×-Ñ-×5Ñ5°aÕ8õ
ð ˆr?   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r7   rÃ   r5   rÀ   rÁ   r¹   rÆ   rÅ   r9   r,   r;   )r<   s   "r=   r>   rM   Ä  s<   € ÷ 
ñ 
àð
ð ð
ð #0ð	
ð
 $ð
ð 
ñ
r?   c                ó6   € V P                  \        VVVVR7      # )aÕ  Return a Server for "address", reconnecting if necessary.

If the server's type is not known, request an immediate check of all
servers. Time out after "server_selection_timeout" if the server
cannot be reached.

:param address: A (host, port) pair.
:param operation: The name of the operation that the server is being selected for.
:param server_selection_timeout: maximum seconds to wait.
    If not provided, the default value
    common.SERVER_SELECTION_TIMEOUT is used.
:param operation_id: The unique id of the current operation being performed. Defaults to None if not provided.

Calls self.open() if needed.

Raises exc:`ServerSelectionTimeoutError` after
`server_selection_timeout` if no matching servers are found.
rû   )r   r#   )r˜   rÃ   rÀ   r¹   rÅ   s   &&&&&r=   Úselect_server_by_addressÚ!Topology.select_server_by_addressÄ  s+   € ð2 ×!Ñ!ÜØØ$ØØ%ð "ó 
ð 	
r?   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r7   Úserver_descriptionr!   Ú
reset_poolr:   Úinterrupt_connectionsr9   r¡   r;   )r<   s   "r=   r>   rM   å  s8   € ÷ E%ñ E%à-ðE%ð ðE%ð  $ð	E%ð
 
ñE%r?   c           	     óV  € V P                   pVP                  VP                  ,          p\        WQ4      '       d   R# \	        V P                   V4      pVP
                  '       g2   VP                  '       dg   VP                  \        P                  8X  dH   V P                  P                  VP                  4      pV'       d   VP                  P                  4        WQ8H  pV P                  '       dq   V'       gi   V P                  f   Q hV P                   f   Q hV P                  P#                  V P                   P$                  WQVP                  V P&                  334       W`n         V P)                  4        V P*                  '       dp   V'       gh   V P                  f   Q hV P                   f   Q hV P                  P#                  V P                   P,                  W@P                   V P&                  334       \.        P0                  ! \2        P4                  4      '       dQ   V'       gI   \7        \.        \8        P:                  V P&                  \=        V4      \=        V P                   4      R7       V P>                  '       dŠ   VP                  \        P@                  8X  dk   V P                   P                  \B        9  dL   V P>                  PE                  4        \F        '       g&   V PH                  PK                  V P>                  4       V PL                  PO                  4        R# )zYProcess a new ServerDescription on an opened topology.

Hold the lock when calling this.
NrS   )(rx   Ú_server_descriptionsrÃ   Ú_is_stale_server_descriptionr1   Úis_readableÚis_server_type_knownÚtopology_typer.   ÚSingler‰   Úgetrò   Úreadyrh   rk   rf   rr   Ú"publish_server_description_changedrc   Ú_update_serversrj   rz   r   rn   ro   rp   r   r   r{   r|   r”   ry   r-   r’   r†   r—   Úappendrˆ   Ú
notify_all)	r˜   r  r	  r
  Útd_oldÚsd_oldÚnew_tdr³   Úsuppress_events	   &&&&     r=   Ú_process_changeÚTopology._process_changeå  sQ  € ð ×"Ñ"ˆØ×,Ñ,Ð-?×-GÑ-GÕHˆÜ'¨×CÒCáä-¨d×.?Ñ.?ÐASÓTˆà×)×)Ð)Ø×3×3Ð3¸×8LÑ8LÔP]×PdÑPdÔ8dà—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFßØ—‘×!Ñ!Ô#àÑ5ˆØ××Ð¯Ø—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ø�L‰L×Ñà—O‘O×FÑFØÐ1C×1KÑ1KÈT×M^ÑM^Ð_ðôð #ÔØ×ÑÔà××Ð§NØ—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ×.Ñ.°×0AÑ0AÐBðôô ×$Ò$¤W§]¡]×3Ò3¿NÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õð ××ÐØ× Ñ ¤M×$9Ñ$9Ô9Ø×!Ñ!×/Ñ/Ô7MÔMà×Ñ×#Ñ#Ô%ß“8Ø×#Ñ#×*Ñ*¨4×+<Ñ+<Ô=ð 	�‰×"Ñ"Ö$r?   c               ó(   € V ^8„  d   QhRRRRRRRR/# r  r;   )r<   s   "r=   r>   rM   ,  s8   € ÷ Oñ Oà-ðOð ðOð  $ð	Oð
 
ñOr?   c                ó®  € V P                   ;_uu_ 4        V P                  '       d>   V P                  P                  VP                  4      '       d   V P                  WV4       RRR4       V'       dN   V P                  P                  VP                  4      pV'       d   VP                  P                  VR7       R# R# R#   + '       g   i     Lg; i)z>Process a new ServerDescription after an hello call completes.N)r
  )
r…   rƒ   rx   Ú
has_serverrÃ   r  r‰   r  rò   r¯   )r˜   r  r	  r
  r³   s   &&&& r=   Ú	on_changeÚTopology.on_change,  s—   € ð �Z�Z‹Zð �|�|ˆ| × 1Ñ 1× <Ñ <Ð=O×=WÑ=W× XÒ XØ×$Ñ$Ð%7ÐEZÔ[÷ ÷ Ø—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFßØ—‘×!Ñ!Ð8MÐ!ÖNñ ñ ÷ �Zús   •=CÁCÃC	c               ó    € V ^8„  d   QhRRRR/# ©r7   Úseedlistzlist[tuple[str, Any]]r9   r¡   r;   )r<   s   "r=   r>   rM   E  s   € ÷ ñ Ð,Að Àdñ r?   c           	     ó|  € V P                   pVP                  \        9  d   R# \        V P                   V4      V n         V P	                  4        V P
                  '       dh   V P                  f   Q hV P                  f   Q hV P                  P                  V P                  P                  W P                   V P                  334       \        P                  ! \        P                  4      '       dK   \        \        \         P"                  V P                  \%        V4      \%        V P                   4      R7       R# R# )zOProcess a new seedlist on an opened topology.
Hold the lock when calling this.
NrS   )rx   r  r-   r0   r  rj   rk   rf   rr   rz   rc   r   rn   ro   rp   r   r   r{   r|   )r˜   r%  r  s   && r=   Ú_process_srv_updateÚTopology._process_srv_updateE  sõ   € ð ×"Ñ"ˆØ×ÑÔ'=Ô=ÙÜEÀd×FWÑFWÐYaÓbˆÔà×ÑÔà××ÐØ—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ×.Ñ.°×0AÑ0AÐBðôô ×$Ò$¤W§]¡]×3Ò3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6÷ñ 4r?   c               ó    € V ^8„  d   QhRRRR/# r$  r;   )r<   s   "r=   r>   rM   b  s   € ÷ 3ñ 3Ð&;ð 3Àñ 3r?   c                ó®   € V P                   ;_uu_ 4        V P                  '       d   V P                  V4       RRR4       R#   + '       g   i     R# ; i)z?Process a new list of nodes obtained from scanning SRV records.N)r…   rƒ   r'  )r˜   r%  s   &&r=   Úon_srv_updateÚTopology.on_srv_updateb  s0   € ð �Z�Z‹ZØ�|�|ˆ|Ø×(Ñ(¨Ô2÷ �Z�ZŠZús   •$AÁA	c               ó    € V ^8„  d   QhRRRR/# )r7   rÃ   r5   r9   zOptional[Server]r;   )r<   s   "r=   r>   rM   i  s   € ÷ *ñ *¨Xð *Ð:Jñ *r?   c                ó8   € V P                   P                  V4      # )a"  Get a Server or None.

Returns the current version of the server immediately, even if it's
Unknown or absent from the topology. Only use this in unittests.
In driver code, use select_server_by_address, since then you're
assured a recent view of the server's type and wire protocol version.
)r‰   r  ©r˜   rÃ   s   &&r=   rÌ   ÚTopology.get_server_by_addressi  s   € ð �}‰}× Ñ  Ó)Ð)r?   c               ó    € V ^8„  d   QhRRRR/# )r7   rÃ   r5   r9   r:   r;   )r<   s   "r=   r>   rM   s  s   € ÷ (ñ ( (ð (¨tñ (r?   c                	ó   € WP                   9   # r[   )r‰   r/  s   &&r=   r   ÚTopology.has_servers  s   € ØŸ-™-Ñ'Ð'r?   c               ó   € V ^8„  d   QhRR/# )r7   r9   rÄ   r;   )r<   s   "r=   r>   rM   v  s   € ÷ Nñ NÐ/ñ Nr?   c                ó(  € V P                   ;_uu_ 4        V P                  P                  pV\        P                  8w  d    RRR4       R# \        V P                  4       4      ^ ,          P                  uuRRR4       #   + '       g   i     R# ; i)z!Return primary's address or None.N)r…   rx   r  r.   ÚReplicaSetWithPrimaryr&   Ú_new_selectionrÃ   )r˜   r  s   & r=   Úget_primaryÚTopology.get_primaryv  s`   € ð �Z�Z‹ZØ ×-Ñ-×;Ñ;ˆMØ¤× CÑ CÔCØ÷ ‰Zô
 ,¨D×,?Ñ,?Ó,AÓBÀ1ÕE×MÑM÷ �Z�Z‹Zús   •-B Á)B Â B	c               ó    € V ^8„  d   QhRRRR/# )r7   r¾   r¿   r9   úset[_Address]r;   )r<   s   "r=   r>   rM   €  s    € ÷ Pñ PÐ1Qð PÐVcñ Pr?   c                ó€  € V P                   ;_uu_ 4        V P                  P                  pV\        P                  \        P
                  39  d   \        4       uuRRR4       # \        V! V P                  4       4      4       Uu0 uF  q3P                  kK  	  upuuRRR4       # u upi   + '       g   i     R# ; i)z+Return set of replica set member addresses.N)
r…   rx   r  r.   r6  ÚReplicaSetNoPrimaryÚsetÚiterr7  rÃ   )r˜   r¾   r  rÎ   s   &&  r=   Ú_get_replica_set_membersÚ!Topology._get_replica_set_members€  s�   € ð �Z�Z‹ZØ ×-Ñ-×;Ñ;ˆMØÜ×3Ñ3Ü×1Ñ1ð%ô ô “u÷ ŠZô *.©h°t×7JÑ7JÓ7LÓ.MÔ)NÓOÑ)N 2—J”JÑ)NÑO÷ ŠZùò P÷ �ZˆZús$   •AB,Á%!B,ÂB'ÂB,Â'B,Â,B=	c               ó   € V ^8„  d   QhRR/# ©r7   r9   r;  r;   )r<   s   "r=   r>   rM   �  s   € ÷ Hñ H ñ Hr?   c                ó,   € V P                  \        4      # )z"Return set of secondary addresses.)r@  r%   ©r˜   s   &r=   Úget_secondariesÚTopology.get_secondaries�  s   € à×,Ñ,Ô-FÓGÐGr?   c               ó   € V ^8„  d   QhRR/# rC  r;   )r<   s   "r=   r>   rM   ‘  s   € ÷ Fñ F˜mñ Fr?   c                ó,   € V P                  \        4      # )z Return set of arbiter addresses.)r@  r$   rE  s   &r=   Úget_arbitersÚTopology.get_arbiters‘  s   € à×,Ñ,Ô-DÓEÐEr?   c               ó   € V ^8„  d   QhRR/# )r7   r9   zOptional[ClusterTime]r;   )r<   s   "r=   r>   rM   •  s   € ÷ &ñ &Ð"7ñ &r?   c                ó   € V P                   # )z1Return a document, the highest seen $clusterTime.©r‹   rE  s   &r=   Úmax_cluster_timeÚTopology.max_cluster_time•  s   € à×%Ñ%Ð%r?   c               ó    € V ^8„  d   QhRRRR/# ©r7   Úcluster_timeúOptional[Mapping[str, Any]]r9   r¡   r;   )r<   s   "r=   r>   rM   ™  s   € ÷ 6ñ 6Ð:Uð 6ÐZ^ñ 6r?   c                	óŒ   € V'       d<   V P                   '       d    VR ,          V P                   R ,          8”  d	   Wn         R# R# R# )ÚclusterTimeNrN  ©r˜   rS  s   &&r=   Ú_receive_cluster_time_no_lockÚ&Topology._receive_cluster_time_no_lock™  s>   € ÷ ð ×*×*Ð*Ø Õ.°×1GÑ1GÈÕ1VÔVà)5Ö&ñ Wñ	 r?   c               ó    € V ^8„  d   QhRRRR/# rR  r;   )r<   s   "r=   r>   rM   ¨  s   € ÷ =ñ =Ð1Lð =ÐQUñ =r?   c                	óŠ   € V P                   ;_uu_ 4        V P                  V4       R R R 4       R #   + '       g   i     R # ; ir[   )r…   rX  rW  s   &&r=   Úreceive_cluster_timeÚTopology.receive_cluster_time¨  s%   € Ø�Z�Z‹ZØ×.Ñ.¨|Ô<÷ �Z�ZŠZúó	   •1±A	c               ó    € V ^8„  d   QhRRRR/# )r7   Ú	wait_timerä   r9   r¡   r;   )r<   s   "r=   r>   rM   ¬  s   € ÷ 3ñ 3¨3ð 3°tñ 3r?   c                ó´   € V P                   ;_uu_ 4        V P                  4        \        V P                  V4       RRR4       R#   + '       g   i     R# ; i)z=Wake all monitors, wait for at least one to check its server.N)r…   rå   r   rˆ   )r˜   r`  s   &&r=   Úrequest_check_allÚTopology.request_check_all¬  s1   € à�Z�Z‹ZØ×#Ñ#Ô%Ü�t—‘¨	Ô2÷ �Z�ZŠZús   •'AÁA	c               ó   € V ^8„  d   QhRR/# )r7   r9   rÒ   r;   )r<   s   "r=   r>   rM   ²  s   € ÷ 2ñ 2Ð&=ñ 2r?   c                ó¬   € V P                   P                  \        P                  8X  d   V P                   P                  # V P                   P
                  # )znReturn a list of all data-bearing servers.

This includes any server that might be selected for an operation.
)rx   r  r.   r  Úknown_serversÚreadable_serversrE  s   &r=   Údata_bearing_serversÚTopology.data_bearing_servers²  sB   € ð
 ×Ñ×*Ñ*¬m×.BÑ.BÔBØ×$Ñ$×2Ñ2Ð2Ø× Ñ ×1Ñ1Ð1r?   c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   »  s   € ÷ ñ ˜Tñ r?   c           	     	ó  € . pV P                   ;_uu_ 4        V P                  4        FT  pV P                  VP                  ,          pVP	                  W3P
                  P                  P                  4       34       KV  	  R R R 4       V F!  w  r4 VP
                  P                  V4       K#  	  R #   + '       g   i     L9; i  \         d<   p\        T^ TRR 4      pT P                  TP                  P                  T4       h R p?ii ; i)NF)r…   rh  r‰   rÃ   r  rò   ÚgenÚget_overallÚremove_stale_socketsr   Ú_ErrorContextÚhandle_errorrÝ   )r˜   rô   rÎ   r³   Ú
generationÚexcÚctxs   &      r=   Úupdate_poolÚTopology.update_pool»  sÊ   € àˆØ�Z�Z‹Zà×/Ñ/Ö1�ØŸ™ r§z¡zÕ2�Ø—‘ ¯©¯©×(CÑ(CÓ(EÐFÖGñ 2÷ ó #*ÑˆFðØ—‘×0Ñ0°Ö<ó #*÷ �Zûô  ô Ü# C¨¨J¸¸tÓD�Ø×!Ñ! &×"4Ñ"4×"<Ñ"<¸cÔBØûðús$   —A)B1ÂCÂ1C	ÃD
Ã6DÄD
c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   Ì  s   € ÷ B<ñ B<�tñ B<r?   c           	     ó¤  € V P                   ;_uu_ 4        V P                  pV P                  P                  4        FF  pVP	                  4        \
        '       d   K!  V P                  P                  VP                  4       KH  	  V P                  P                  4       V n        V P                  P                  4       P                  4        F.  w  r4W0P                  9   g   K  W@P                  V,          n        K0  	  V P                  '       dL   V P                  P	                  4        \
        '       g&   V P                  P                  V P                  4       RV n        RV n        RRR4       V P                   '       Ed   V P"                  f   Q hV P$                  f   Q h\'        \(        P*                  / V P                  P,                  V P                  P.                  V P                  P0                  V P                  P2                  4      V n        V P"                  P5                  V P$                  P6                  XV P                  V P8                  334       V P"                  P5                  V P$                  P:                  V P8                  334       \<        P>                  ! \@        PB                  4      '       ds   \E        \<        \F        PH                  V P8                  \K        X4      \K        V P                  4      R7       \E        \<        \F        PL                  V P8                  R7       V PN                  '       g   V P                   '       da   V PP                  P	                  4        V PP                  PS                  ^4       \U        \V        PX                  ! V P"                  4      4       R# R#   + '       g   i     EL]; i)zŒClear pools and terminate monitors. Topology does not reopen on
demand. Any further operations will raise
:exc:`~.errors.InvalidOperation`.
FTNrS   rP   )-r…   rx   r‰   r®   r’   r†   r—   r  Ú_monitorr¯   r�   ÚitemsrÝ   r”   rƒ   r„   rj   rk   rf   r/   r.   ry   rw   Úmax_set_versionÚmax_election_idrÞ   rr   rz   rc   Úpublish_topology_closedr   rn   ro   rp   r   r   r{   r|   ÚSTOP_TOPOLOGYrh   rl   ÚjoinrH   r�   r‘   )r˜   Úold_tdr³   rÃ   rÎ   s   &    r=   r’   ÚTopology.closeÌ  s·  € ð
 �Z�Z‹ZØ×&Ñ&ˆFØŸ-™-×.Ñ.Ö0�Ø—‘”ß•xØ×'Ñ'×.Ñ.¨v¯©Ö?ñ 1ð !%× 1Ñ 1× 7Ñ 7Ó 9ˆDÔØ#×0Ñ0×DÑDÓF×LÑLÖN‘�ØŸm™mÖ+Ø9;—M‘M 'Õ*Ö6ñ  Oð
 × × Ð Ø×!Ñ!×'Ñ'Ô)ß“xØ×'Ñ'×.Ñ.¨t×/@Ñ/@ÔAà ˆDŒLØˆDŒL÷) ð. ××ÑØ—<‘<Ò+Ð+Ð+Ø—?‘?Ò.Ð.Ð.Ü 3Ü×%Ñ%ØØ×!Ñ!×2Ñ2Ø×!Ñ!×1Ñ1Ø×!Ñ!×1Ñ1Ø×!Ñ!×4Ñ4ó!ˆDÔð �L‰L×Ñà—O‘O×HÑHàØ×)Ñ)Ø×)Ñ)ððô	ð �L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ü×$Ò$¤W§]¡]×3Ò3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õô ÜÔ&8×&FÑ&FÐSW×SdÑSdõð ××Ð 4×#3×#3Ð#3à×"Ñ"×(Ñ(Ô*Ø×"Ñ"×'Ñ'¨Ô*Ü ¤§¢¨T¯\©\Ó!:Ö;ñ	 $4÷s �ZˆZús%   •AN>ÁBN>Ã$,N>Ä%N>Ä73N>Î>O	c               ó   € V ^8„  d   QhRR/# )r7   r9   r/   r;   )r<   s   "r=   r>   rM     s   € ÷ !ñ !Ð0ñ !r?   c                	ó   € V P                   # r[   )rx   rE  s   &r=   rÝ   ÚTopology.description  s   € à× Ñ Ð r?   c               ó   € V ^8„  d   QhRR/# )r7   r9   zlist[_ServerSession]r;   )r<   s   "r=   r>   rM     s   € ÷ ,ñ ,Ð"6ñ ,r?   c                ó6   € V P                   P                  4       # )z"Pop all session ids from the pool.)rŒ   Úpop_allrE  s   &r=   Úpop_all_sessionsÚTopology.pop_all_sessions  s   € à×!Ñ!×)Ñ)Ó+Ð+r?   c               ó    € V ^8„  d   QhRRRR/# )r7   Úsession_timeout_minutesrÆ   r9   r'   r;   )r<   s   "r=   r>   rM     s   € ÷ Nñ N¸-ð NÈNñ Nr?   c                ó8   € V P                   P                  V4      # )z>Start or resume a server session, or raise ConfigurationError.)rŒ   Úget_server_session)r˜   rŠ  s   &&r=   rŒ  ÚTopology.get_server_session  s   € à×!Ñ!×4Ñ4Ð5LÓMÐMr?   c               ó    € V ^8„  d   QhRRRR/# )r7   Úserver_sessionr'   r9   r¡   r;   )r<   s   "r=   r>   rM     s   € ÷ Añ A°Nð AÀtñ Ar?   c                	ó<   € V P                   P                  V4       R # r[   )rŒ   Úreturn_server_session)r˜   r�  s   &&r=   r‘  ÚTopology.return_server_session  s   € Ø×Ñ×0Ñ0°Ö@r?   c               ó   € V ^8„  d   QhRR/# )r7   r9   r"   r;   )r<   s   "r=   r>   rM     s   € ÷ Fñ F 	ñ Fr?   c                óB   € \         P                  ! V P                  4      # )z]A Selection object, initially including all known servers.

Hold the lock when calling this.
)r"   Úfrom_topology_descriptionrx   rE  s   &r=   r7  ÚTopology._new_selection  s   € ô
 ×2Ò2°4×3DÑ3DÓEÐEr?   c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   &  s   € ÷ ñ  ñ r?   c                óÊ  € V P                   '       d   \        R4      hV P                  '       Eg   RV n        V P                  4        V P                  '       g   V P
                  '       d   V P                  P                  4        V P                  '       d:   V P                  P                  \        9   d   V P                  P                  4        V P                  P                  '       dF   V P                  \        V P                   ^ ,          \#        R^RV P$                  R^/4      4      4       V P&                  P)                  4        F  pVP                  4        K  	  R# )zKStart monitors, or restart after a fork.

Hold the lock when calling this.
z"Cannot use MongoClient after closeTÚokÚ	serviceIdÚmaxWireVersionN)r„   r   rƒ   r  rj   rh   rl   r“   r”   rÝ   r  r-   rt   r–   r  r!   r‚   r   rc   r‰   r®   ©r˜   r³   s   & r=   r°   ÚTopology._ensure_opened&  s  € ð
 �<�<ˆ<Ü"Ð#GÓHÐHà�|�|‰|ØˆDŒLØ× Ñ Ô"ð ××Ð 4×#7×#7Ð#7Ø×&Ñ&×+Ñ+Ô-ð × × Ð  d×&6Ñ&6×&DÑ&DÔH^Ô&^Ø×!Ñ!×&Ñ&Ô(à�~‰~×+×+Ð+à×$Ñ$Ü%Ø×,Ñ,¨QÕ/Ü˜t Q¨°T×5FÑ5FÐHXÐZ\Ð]Ó^óôð —m‘m×*Ñ*Ö,ˆFØ�K‰KŽMó -r?   c               ó$   € V ^8„  d   QhRRRRRR/# )r7   rÃ   r5   Úerr_ctxro  r9   r:   r;   )r<   s   "r=   r>   rM   G  s&   € ÷ Bñ B xð B¸-ð BÈDñ Br?   c                	ó¼  € V P                   P                  V4      pVf   R# VP                  P                  VP                  VP
                  4      '       d   R# VP                  P                  pVP                  pR pV'       dN   \        VR4      '       d<   \        VP                  \        4      '       d   VP                  P                  R4      p\        WF4      # )NTÚdetailsÚtopologyVersion)r‰   r  Ú_poolÚstale_generationÚsock_generationÚ
service_idrÝ   Útopology_versionÚerrorÚhasattrÚ
isinstancer¡  ÚdictÚ _is_stale_error_topology_version)r˜   rÃ   rŸ  r³   Úcur_tvr¨  Úerror_tvs   &&&    r=   Ú_is_stale_errorÚTopology._is_stale_errorG  s¥   € Ø—‘×"Ñ" 7Ó+ˆØŠ>áà�<‰<×(Ñ(¨×)@Ñ)@À'×BTÑBT×UÒUáð ×#Ñ#×4Ñ4ˆØ—‘ˆØˆß”W˜U I×.Ò.Ü˜%Ÿ-™-¬×.Ò.Ø Ÿ=™=×,Ñ,Ð->Ó?�ä/°ÓAÐAr?   c               ó$   € V ^8„  d   QhRRRRRR/# ©r7   rÃ   r5   rŸ  ro  r9   r¡   r;   )r<   s   "r=   r>   rM   [  s&   € ÷ D+ñ D+ Xð D+¸ð D+È$ñ D+r?   c                	óª  € V P                  W4      '       d   R # V P                  V,          pVP                  pVP                  pV P                  P
                  '       d   V'       g   VP                  '       g   R # \        V\        4      '       d   VP                  '       d   R # \        V\        4      '       d   R # \        V\        \        34      '       EdO   \        VR4      '       d   VP                  pM6\        V\        4      '       d   RMR pVP                  P                  RV4      pV\         P"                  9   d‡   V\         P$                  9   pV P                  P
                  '       g   V P'                  \)        WR7      4       V'       g   VP*                  ^8:  d   VP-                  V4       VP/                  4        R # VP                  '       gK   V P                  P
                  '       g   V P'                  \)        WR7      4       VP-                  V4       R # R # \        V\0        4      '       d”   \        V\2        4      '       g   VP5                  R4      '       d   R # V P                  P
                  '       g   V P'                  \)        WR7      4       VP-                  V4       VP6                  P9                  4        R # R # )NÚcodei{'  ©r¨  ÚSystemOverloadedError)r¯  r‰   r¨  r¦  rt   r–   Úcompleted_handshakerª  r   r   r   r   r©  r´  r¡  r  r   Ú_NOT_PRIMARY_CODESÚ_SHUTDOWN_CODESr  r!   Úmax_wire_versionr¯   Úrequest_checkr   r   Úhas_error_labelrx  Úcancel_check)	r˜   rÃ   rŸ  r³   r¨  r¦  Úerr_codeÚdefaultÚis_shutting_downs	   &&&      r=   Ú_handle_errorÚTopology._handle_error[  s  € Ø×Ñ ×1Ò1Ùà—‘˜wÕ'ˆØ—‘ˆØ×'Ñ'ˆ
ð �>‰>×'×'Ð'·
À7×C^×C^ÐC^Ùä�eœ^×,Ò,°×1L×1LÐ1Lñ
 Ü˜œz×*Ò*áÜ˜¤Ô1AÐB×CÓCô �u˜f×%Ò%Ø Ÿ:™:‘ô $.¨e´_×#EÒ#E™%È4�Ø Ÿ=™=×,Ñ,¨V°WÓ=�Øœ>×<Ñ<Ô<Ø#+¬~×/MÑ/MÑ#MÐ à—~‘~×3×3Ð3Ø×(Ñ(Ô):¸7Ô)PÔQß#¨×(@Ñ(@ÀAÔ(Eà—L‘L Ô,Ø×$Ñ$Ö&Ø×0×0Ð0à—~‘~×3×3Ð3Ø×(Ñ(Ô):¸7Ô)PÔQà—‘˜ZÖ(ñ 1ô ˜Ô0×1Ò1Ü˜%Ô!6×7Ò7Ø×%Ñ%Ð&=×>Ò>áð —>‘>×/×/Ð/Ø×$Ñ$Ô%6°wÔ%LÔMà�L‰L˜Ô$ð �O‰O×(Ñ(Ö*ñ 2r?   c               ó$   € V ^8„  d   QhRRRRRR/# r²  r;   )r<   s   "r=   r>   rM   ¡  s!   € ÷ 1ñ 1 Hð 1°}ð 1Èñ 1r?   c                óŠ   € V P                   ;_uu_ 4        V P                  W4       RRR4       R#   + '       g   i     R# ; i)z–Handle an application error.

May reset the server to Unknown, clear the pool, and request an
immediate check depending on the error and the context.
N)r…   rÁ  )r˜   rÃ   rŸ  s   &&&r=   rp  ÚTopology.handle_error¡  s'   € ð �Z�Z‹ZØ×Ñ˜wÔ0÷ �Z�ZŠZúr^  c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   ª  s   € ÷ #ñ # Dñ #r?   c                óh   € V P                   P                  4        F  pVP                  4        K  	  R# )z3Wake all monitors. Hold the lock when calling this.N)r‰   r®   r»  rœ  s   & r=   rå   ÚTopology._request_check_allª  s%   € à—m‘m×*Ñ*Ö,ˆFØ× Ñ Ö"ó -r?   c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   ¯  s   € ÷ *+ñ *+ ñ *+r?   c           
     óŒ  € V P                   P                  4       P                  4        EFk  w  rWP                  9  dÏ   V P                  P                  VV V P                  V4      V P                  R7      pRpV P                  '       d/   V P                  e!   \        P                  ! V P                  4      p\        VV P                  V4      VV P                  V P                  VR7      pWPP                  V&   VP                  4        Kä  V P                  V,          P                   P"                  pW P                  V,          n        WbP"                  8w  g   EK5  V P                  V,          P$                  P'                  VP"                  4       EKn  	  \)        V P                  P                  4       4       F„  w  rV P                   P+                  V4      '       d   K(  VP-                  4        \.        '       g&   V P0                  P3                  VP4                  4       V P                  P7                  V4       K†  	  R# )zbSync our Servers from TopologyDescription.server_descriptions.

Hold the lock while calling this.
)r  Útopologyrò   rL   N)r  rò   ÚmonitorÚtopology_idÚ	listenersÚevents)rx   r�   ry  r‰   rt   Úmonitor_classÚ_create_pool_for_monitorrh   rk   r�   r‘   r,   Ú_create_pool_for_serverrc   rf   r“   rÝ   Úis_writablerò   Úupdate_is_writabler€   r   r’   r†   r—   r  rx  Úpop)r˜   rÃ   rÎ   rÌ  r\   r³   Úwas_writables   &      r=   r  ÚTopology._update_servers¯  s£  € ð
  ×,Ñ,×@Ñ@ÓB×HÑH×J‰KˆGØŸm™mÔ+ØŸ.™.×6Ñ6Ø')Ø!Ø×6Ñ6°wÓ?Ø&*§n¡nð	 7ó �ð �Ø×'×'Ð'¨D¯L©LÒ,DÜ"Ÿ;š; t§|¡|Ó4�DÜØ')Ø×5Ñ5°gÓ>Ø#Ø $× 1Ñ 1Ø"Ÿo™oØô�ð *0—‘˜gÑ&Ø—‘–ð  $Ÿ}™}¨WÕ5×AÑA×MÑM�à57—‘˜gÕ&Ô2à§>¡>×1Ø—M‘M 'Õ*×/Ñ/×BÑBÀ2Ç>Á>×Rñ= Kô@  $ D§M¡M×$7Ñ$7Ó$9Ö:‰OˆGØ×$Ñ$×/Ñ/°×8Ô8Ø—‘”ß“xØ×'Ñ'×.Ñ.¨v¯©Ô?Ø—‘×!Ñ! 'Ö*ó  ;r?   c               ó    € V ^8„  d   QhRRRR/# ©r7   rÃ   r5   r9   r+   r;   )r<   s   "r=   r>   rM   Û  s   € ÷ 
ñ 
¨xð 
¸Dñ 
r?   c                	óx   € V P                   P                  WP                   P                  V P                  R 7      # ))Ú	client_id)rt   Ú
pool_classÚpool_optionsrc   r/  s   &&r=   rÒ  Ú Topology._create_pool_for_serverÛ  s3   € Ø�~‰~×(Ñ(Ø—^‘^×0Ñ0¸D×<MÑ<Mð )ó 
ð 	
r?   c               ó    € V ^8„  d   QhRRRR/# rÙ  r;   )r<   s   "r=   r>   rM   à  s   € ÷ 
ñ 
°ð 
¸Tñ 
r?   c                	óF  € V P                   P                  p\        VP                  VP                  VP                  VP
                  VP                  VP                  VP                  R VP                  R7	      pV P                   P                  WRV P                  R7      # )F)	Úconnect_timeoutÚsocket_timeoutÚssl_contextÚtls_allow_invalid_hostnamesÚevent_listenersÚappnameÚdriverÚpause_enabledÚ
server_apiT)Úis_sdamrÛ  )rt   rÝ  r    rá  Ú_ssl_contexträ  re   ræ  rç  ré  rÜ  rc   )r˜   rÃ   ÚoptionsÚmonitor_pool_optionss   &&  r=   rÑ  Ú!Topology._create_pool_for_monitorà  s�   € Ø—.‘.×-Ñ-ˆô
  +Ø#×3Ñ3Ø"×2Ñ2Ø×,Ñ,Ø(/×(KÑ(KØ#×4Ñ4Ø—O‘OØ—>‘>ØØ×)Ñ)ô
 
Ðð �~‰~×(Ñ(Ø°4À4×CTÑCTð )ó 
ð 	
r?   c               ó    € V ^8„  d   QhRRRR/# )r7   r¾   r¿   r9   rÁ   r;   )r<   s   "r=   r>   rM   ö  s   € ÷ 8Yñ 8YÐ'Gð 8YÈCñ 8Yr?   c                ó*  a€ V P                   P                  \        P                  \        P                  39   pV'       d   RpM.V P                   P                  \        P
                  8X  d   RpMRpV P                   P                  '       d'   V\        J d   V'       d   R# RV,          # RV RV R2# \        V P                   P                  4       4      p\        V P                   P                  4       P                  4       4      pV'       g8   V'       d'   R	P                  VV P                  P                  4      # R
V,          # V^ ,          P                  o\        ;QJ d&    V3R lVR,           4       F  '       d   K   RM	  RM! V3R lVR,           4       4      pV'       dT   Sf
   RV,          # V'       d4   \!        V4      P#                  V P$                  4      '       g
   RV,          # \'        S4      # RP)                  R V 4       4      # )zUFormat an error message if server selection fails.

Hold the lock when calling this.
zreplica set membersÚmongosesrô   zNo primary available for writeszNo %s available for writeszNo z match selector "Ú"z)No {} available for replica set name "{}"zNo %s availablec              3  ó@   <"  € T F  qP                   S8H  x € K  	  R # 5ir[   rµ  )Ú.0r³   r¨  s   & €r=   Ú	<genexpr>Ú*Topology._error_message.<locals>.<genexpr>  s   øé € ÐG¹;°—|‘| uÖ,»;ùs   ƒ:rî   NNFTzNo %s found yetz\Could not reach any servers in %s. Replica set is configured with internal hostnames or IPs?Ú,c              3  ór   "  € T F-  qP                   '       g   K  \        VP                   4      x € K/  	  R # 5ir[   )r¨  rÁ   )rô  r³   s   & r=   rõ  rö  .  s#   é € ÐXÁ°fÏ<Í<Ô 1¤ F§L¡L× 1Ð 1Ãùs   ‚7š7)rx   r  r.   r6  r=  ÚShardedrf  r&   r€   r�   r®   r<   rt   rw   r¨  Úallr>  Úintersectionr‚   rÁ   r~  )r˜   r¾   Úis_replica_setÚserver_pluralÚ	addressesrô   Úsamer¨  s   &&     @r=   râ   ÚTopology._error_messageö  s±  ø€ ð
 ×*Ñ*×8Ñ8Ü×/Ñ/Ü×-Ñ-ð=
ñ 
ˆ÷
 Ø1‰MØ×Ñ×,Ñ,´×0EÑ0EÔEØ&‰Mà%ˆMà×Ñ×*×*Ð*àÔ3Ó3ß!Ù<à7¸-ÕGÐGà˜]˜OÐ+<¸X¸JÀaÐHÐHä˜T×.Ñ.×BÑBÓDÓEˆIÜ˜4×,Ñ,×@Ñ@ÓB×IÑIÓKÓLˆGßß!àF×MÑMØ%ØŸ™×7Ñ7óð ð
 -¨}Õ<Ð<ð ˜A•J×$Ñ$ˆEß“3ÔG¸7À2¾;ÓG—3—3’3ÔG¸7À2¾;ÓGÓGˆDßØ’=à,¨}Õ<Ð<ç!¬#¨i«.×*EÑ*EÀd×FZÑFZ×*[Ò*[ðFØHQõRðô
 ˜5“zÐ!à—x‘xÑXÁÓXÓXÐXr?   c               ó   € V ^8„  d   QhRR/# r    r;   )r<   s   "r=   r>   rM   0  s   € ÷ Kñ K $ñ Kr?   c                	ó  € . p V P                   '       d,   VP                  V P                   P                  4       4       K=   \        P
                  ! V Uu. uF  q"P                  4       NK  	  upR R/  R#   \         d     LBi ; iu upi )Úreturn_exceptionsTN)r—   r  rÕ  Ú
IndexErrorÚasyncioÚgatherr~  )r˜   ÚtasksÚts   &  r=   rÊ   ÚTopology.cleanup_monitors0  st   € Øˆð	Ø×%×%Ð%Ø—‘˜T×0Ñ0×4Ñ4Ó6Ö7ð &ô 	�Š©5Ó1©5 aŸ™ž©5Ñ1ÐJÀTÔJøô ô 	Ùð	üâ1s   „A7 –+A7 ÁBÁ7BÂBc               ó   € V ^8„  d   QhRR/# )r7   r9   rÁ   r;   )r<   s   "r=   r>   rM   9  s   € ÷ Iñ I˜#ñ Ir?   c                	ó‚   € R pV P                   '       g   RpRV P                  P                   RV V P                  : R2# )Ú zCLOSED Ú<Ú Ú>)rƒ   Ú	__class__Ú__name__rx   )r˜   Úmsgs   & r=   Ú__repr__ÚTopology.__repr__9  s@   € ØˆØ�|�|ˆ|ØˆCØ�4—>‘>×*Ñ*Ð+¨1¨S¨E°$×2CÑ2CÑ1FÀaÐHÐHr?   c               ó   € V ^8„  d   QhRR/# )r7   r9   z>tuple[tuple[_Address, ...], Optional[str], Optional[str], str]r;   )r<   s   "r=   r>   rM   ?  s   € ÷ \ñ \ÐXñ \r?   c                óš   € V P                   p\        \        VP                  4      4      VP                  VP
                  VP                  3# )z?The properties to use for MongoClient/Topology equality checks.)rt   ÚtupleÚsortedr}   rw   r•   Úsrv_service_name)r˜   Útss   & r=   Úeq_propsÚTopology.eq_props?  s8   € à�^‰^ˆÜ”f˜RŸX™XÓ&Ó'¨×)<Ñ)<¸b¿g¹gÀr×GZÑGZÐ[Ð[r?   c               ó    € V ^8„  d   QhRRRR/# )r7   ÚotherÚobjectr9   r:   r;   )r<   s   "r=   r>   rM   D  s   € ÷ ñ ˜Fð  tñ r?   c                	ó†   € \        WP                  4      '       d"   V P                  4       VP                  4       8H  # \        # r[   )rª  r  r  ÚNotImplemented)r˜   r  s   &&r=   Ú__eq__ÚTopology.__eq__D  s/   € Ü�eŸ^™^×,Ò,Ø—=‘=“? e§n¡nÓ&6Ñ6Ð6ÜÐr?   c               ó   € V ^8„  d   QhRR/# )r7   r9   rä   r;   )r<   s   "r=   r>   rM   I  s   € ÷ %ñ %˜#ñ %r?   c                	ó4   € \        V P                  4       4      # r[   )Úhashr  rE  s   &r=   Ú__hash__ÚTopology.__hash__I  s   € Ü�D—M‘M“OÓ$Ð$r?   )Ú__events_executorr„   rˆ   rx   rk   rf   r…   r‹   r—   rƒ   rŠ   rh   rj   r‚   r‰   rŒ   rt   r”   rc   )NNNNr[   )NN)FF)é   )3r  Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r�   r“   r»   rÏ   rË   r÷   r   r  r  r!  r'  r+  rÌ   r   r8  r@  rF  rJ  rO  rX  r\  rb  rh  rt  r’   ÚpropertyrÝ   r‡  rŒ  r‘  r7  r°   r¯  rÁ  rp  rå   r  rÒ  rÑ  râ   rÊ   r  r  r"  r'  Ú__static_attributes__r;   r?   r=   rJ   rJ   h   s  † Ù4õm4õ^%"õN÷-÷^P#÷d÷2 ÷D
÷BE%÷NOõ2õ:3õ*õ(õNõPõHõFõ&õ6õ=÷3õ2õõ"B<ðH ô!ó ð!õ,õNõAõFõõBBõ(D+õL1õ#õ
*+õX
õ

õ,8YõtKõIõ\õ
÷
%ñ %r?   rJ   c                  ó&   € ] tR tRtRtR R ltRtR# )ro  iM  z.An error with context for SDAM error handling.c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r7   r¨  ÚBaseExceptionrº  rä   r¥  r·  r:   r¦  zOptional[ObjectId]r;   )r<   s   "r=   r>   Ú_ErrorContext.__annotate__P  s<   € ÷ %ñ %àð%ð ð%ð ð	%ð
 "ð%ð 'ñ%r?   c                	óB   € Wn         W n        W0n        W@n        WPn        R # r[   )r¨  rº  r¥  r·  r¦  )r˜   r¨  rº  r¥  r·  r¦  s   &&&&&&r=   r�   Ú_ErrorContext.__init__P  s    € ð Œ
Ø 0ÔØ.ÔØ#6Ô Ø$Žr?   )r·  r¨  rº  r¦  r¥  N)r  r+  r,  r-  r.  r�   r0  r;   r?   r=   ro  ro  M  s   † Ù8÷%ñ %r?   ro  c               ó$   € V ^8„  d   QhRRRRRR/# )r7   Ú
current_tvrT  r®  r9   r:   r;   )r<   s   "r=   r>   r>   _  s$   € ÷ 8ñ 8Ø+ð8Ø7Rð8à	ñ8r?   c                ój   € V e   Vf   R# V R,          VR,          8w  d   R# V R,          VR,          8¬  # )z9Return True if the error's topologyVersion is <= current.FÚ	processIdÚcounterr;   )r8  r®  s   &&r=   r¬  r¬  _  s<   € ð Ò˜XÒ-ÙØ�+Õ (¨;Õ"7Ô7ÙØ�iÕ  H¨YÕ$7Ñ7Ð7r?   c               ó$   € V ^8„  d   QhRRRRRR/# )r7   Ú
current_sdr!   Únew_sdr9   r:   r;   )r<   s   "r=   r>   r>   j  s$   € ÷ 5ñ 5Ð->ð 5ÐHYð 5Ð^bñ 5r?   c                ó˜   € V P                   VP                   r2Ve   Vf   R# VR,          VR,          8w  d   R# VR,          VR,          8„  # )z4Return True if the new topologyVersion is < current.Fr:  r;  )r§  )r=  r>  r8  Únew_tvs   &&  r=   r  r  j  sL   € à#×4Ñ4°f×6MÑ6M�ØÒ˜Vš^ÙØ�+Õ &¨Õ"5Ô5ÙØ�iÕ  6¨)Õ#4Ñ4Ð4r?   )[r.  Ú
__future__r   r  ro   r§   rB   rð   r©   rÚ   r¬   r�   Úpathlibr   Útypingr   r   r   r   r   r	   Úpymongor
   r   r   r   Úpymongo.errorsr   r   r   r   r   r   r   r   r   Úpymongo.hellor   Úpymongo.lockr   r   r   Úpymongo.loggerr   r   r   r   r   Úpymongo.pool_optionsr    Úpymongo.server_descriptionr!   Úpymongo.server_selectorsr"   r#   r$   r%   r&   Ú"pymongo.synchronous.client_sessionr'   r(   Úpymongo.synchronous.monitorr)   r*   Úpymongo.synchronous.poolr+   Úpymongo.synchronous.serverr,   Úpymongo.topology_descriptionr-   r.   r/   r0   r1   Úbsonr2   Úpymongo.synchronous.settingsr3   Úpymongo.typingsr4   r5   r†   rÁ   Ú__file__Úparentr«   rH   rJ   ro  r¬  r  r;   r?   r=   Ú<module>rV     sØ   ðñ Cå "ã Û Û 	Û Û Û 
Û Û Û Ý ß H× Hç DÓ D÷
÷ 
õ 
õ  ÷ñ ÷
õ õ -Ý 8÷õ ÷ Rß ?Ý )Ý -÷õ ÷ ÝÝ=ß5à€á‘4˜“>×(Ñ(Ó)€õ÷"b%ñ b%÷J%ñ %õ$8÷5r?   