Files
boc/rust-service/target/debug/deps/libtokio_util-ad7489e38a767212.rmeta
T

2007 lines
718 KiB
Plaintext
Raw Normal View History

rust
y6 #rustc 1.96.0 (ac68faa20 2026-05-25)ÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁ futures_sinkÁ_Z㢮`]×Â6~ÚíñÜ7-4180835ec126556aÁtokioÁâYH+ÄS£ü4§…>ˆº$-886576ce57e45364Á parking_lotÁ,kÞÖGϹ˾ϷxwOÜ-5fc2c3fdec45feedÁlock_apiÁEcÓŽ/ÅS}sw‡A$P-0e8055cd433fa267Á
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁparking_lot_coreÁªôqu´<Üb3 Èn~É-385dbf21a0d1611bÁsmallvecÁØNôCt€ïAGV­Â–-97fd81655f68edefÁ®f©¾/ô)c§{õa“â‘-a3906971a93fd1b8Á?A©ú¡E2¯ëäu-8e0657b9e365f274ÁmioÁU»"‘¦Ï¹Ç8³<u½-325017fc6dce34b0ÁbytesÁz"ˆ9äš
2s÷ "X"“-f60c5f60586b21edÁ tokio_macrosÁ€§)£Í‰ÔœxðÁŠ–ü´-a4c6e56303f3349dÁsocket2Áüß<ÁyðUe-fe803a4340fa19d8Ásignal_hook_registryÁ{lz…<Bžš;ë®
å-cb4f4a08e32ec862ÁerrnoÁðšÿçNš&^
:Ón­-ef17a36a98ab2a47Á futures_coreÁÍ©û4ù†ŽNx¼ -a28fb4b6ab5a68eeÁ KÊ ¤ ¥$&taskÁ$æ»rtÁtÍtestsÁ,ö´ä,“/$ü. memchr_innerÁdÙú»„Áĺì¶äudpÁÊ»netÁxFãêÛ»êcompatÁ4ý»ŒG˜šread_arcÁDŠ»io-utilÁ˜U¬šread_exact_arcÁt°»¾& sync_bridgeÁ\É»¾F SyncIoBridgeÁdõ»¾gicontextÁ<»»ØpVŠ timeÁ$…»Ò€W× ð poll_proceedÁd±»ØŠ Àâ cfg_codecÁ
cfg_compatÁcfg_netÁcfg_ioÁcfg_rtÁ
cfg_not_rtÁcfg_timeÁloomÁ ç    çcancellation_tokenÁ£tokenÁdisarmÁã guard_refÁ'aÁãï ã tree_nodeÁ"""""TreeNodeÁ'innerÁ'wakerÁ"*æ *notifiedÁ"InnerÁ-parentÁ-
parent_idxÁ-childrenÁ- is_cancelledÁ- num_handlesÁ"Û"
child_nodeÁ"disconnect_childrenÁ"with_locked_node_and_parentÁ66RetÁ6"move_children_to_parentÁ" remove_childÁ"increase_handle_refcountÁ"decrease_handle_refcountÁ= "cancelÁ CancellationTokenÁJðN×PƒRU§VXãZ> \æ \ child_tokenÁ\Ü\Û\ cancelledÁ\cancelled_ownedÁ\
drop_guardÁ\drop_guard_refÁ\run_until_cancelledÁeee \run_until_cancelled_ownedÁiii 
mŸm× pŸp°pŠ  t×
væ v
new_futureÁy°yŠ |Ÿ||æ Ÿ°Š °Š æ mpscÁ 
¡¥¡
into_innerÁ¤¥¤×§¥make_acquire_futureÁ©¥©© ¬  InnerFutureÁ®Ÿ®¥±¥±emptyÁ³ µ¥µæ µŠ µsetÁº¥ºæ º
take_stateÁº poll_reserveÁº send_itemÁº is_closedÁºget_refÁºcloseÁº
abort_sendÁĥăǥÇErrorÁÇ
poll_readyÁÇ
poll_flushÁÇ
start_sendÁÇ
poll_closeÁ 
 poll_semaphoreÁÑÑÑÑÑÑÑÑÑÑ Ñ
Ñ Ñ Ñ
Ñ
PollSemaphoreÁà semaphoreÁà
permit_futÁÑãæ ãÔã clone_innerÁã˜ã poll_acquireÁãpoll_acquire_manyÁãavailable_permitsÁã add_permitsÁÑìì poll_nextÁÑïƒÑñ×ÑóÉ  reusable_boxÁöööööööööö ö
ö ö öReusableBoxFutureÁŸ¥boxedÁöˆŸˆ¥ˆæ ˆÝˆtry_setÁ real_try_setÁŸ ˆget_pinÁˆŠ ö¥°Š ö¥ö¥×ö
reuse_pin_boxÁ ¥ ¦     ö
CallOnDropÁ¦ ¦¦±öª ªªæ ªÑö¯ ¯¯ã
eitherÁ´´´´´´´´´´ ´
´ ´ ´
´
delegate_callÁ´ÄģĠİĊ ´ÊÊ£Ê poll_readÁ´ÎΣÎ
poll_fill_bufÁÎconsumeÁ´ÓÓ£Ó
start_seekÁÓ
poll_completeÁ´ØØ£Ø
poll_writeÁØ´ Ø
poll_shutdownÁØpoll_write_vectoredÁØis_write_vectoredÁ´àà£ààŸ#´åå£åååå¢ åÆ å´ åØ utilÁðéñññññññ
MaybeDanglingÁø
ø¥øˆñü¥üãñÿ¥ÿæ ñ°Š  ðììðpoll_bufÁŠŠŠŠŠŠŠŠŠŠ Š
Š Š Š
ŠŠ
poll_read_bufÁš¥šŠpoll_write_bufÁ¥MAX_BUFSÁ ððððfutureÁ¦with_cancellation_tokenÁ§§§§§§§§§§ §
§³Ÿ³³æ  §¸Ÿ¸¸°¸Š §½½æ ¿ §ÁÁ°ÁŠ ¦¦¦¦¦¦ FutureExtÁÊ“/Êwith_cancellation_token_ownedÁ¦Í¥ cfg_io_utilÁtracingÁÐtraceÁcodecÁÒ bytes_codecÁÓÓÓÓÓÓÓÓÛæ ÓÝÝÝdecodeÁÓááencodeÁÓää÷2ÒÒdecoderÁèèèèèèèDecoderÁïïïÜ2ï
decode_eofÁïframedÁô¥ÒÒencoderÁ÷÷÷EncoderÁúúú÷2ÒÒ framed_implÁÿÿÿÿÿÿÿÿÿÿ ÿ
ÿ ÿ ÿ
ÿÿÿÿÿINITIAL_CAPACITYÁÿ
WriteFrameÁbufferÁbackpressure_boundaryÁÿ>ÿ˜>ÿš÷ÿœ÷ÿžborrowÁÿ 
borrow_mutÁÿ¢Þ6ÿ¤ñ6ÿ¦¥¦¦¦£¦¦Ÿ#«« « « ÿ °¥°š°¦°¨°°¢ °Æ °´ ¸°Ø ÒÒÒÒÒÒ…4ÀÀÀÀÀÀÀÀÀÀ À
À À À
ÀÀÀÀÀÀÀÕ¥Õ¦Õæ Õ
with_capacityÁÕ
from_partsÁÕÅÕget_mutÁÕ get_pin_mutÁÕ÷1Õ codec_mutÁÕ map_codecÁààÕ
codec_pin_mutÁÕ read_bufferÁÕread_buffer_mutÁÕ write_bufferÁÕwrite_buffer_mutÁÕŠ6Õset_backpressure_boundaryÁÕ˜Õ
into_partsÁÀì¥ì¦ììŸ#Àñ¥ñšñ¦ññ¢ ñÆ ñ´ ñØ Àú¥ú¦ú×Àþ¥þ¦þæ šÒÒ Ò
Ò framed_readÁ 
  
¥æ Ò9Å::˜Ÿ3 decoder_mutÁ map_decoderÁ¡¡decoder_pin_mutÁò:…;ù;¨¥¨¨¨Ÿ#­¥­š­­­¢ ­Æ ­´ ­Ø ¥×Ò Ò framed_writeÁ»»»»»»»»»» »
» » »
»»»Ì¥ÌÌæ ÌÒ9ÌÅÌ:Ì:̘̠4Ì encoder_mutÁÌ map_encoderÁ××Ìencoder_pin_mutÁÌœ;̰;ÌŠ6ÌÐ;Ìù;»à¥àšààà¢ àÆ à´ àØ »é¥éééŸ#»î¥î¦î×Ò Òlength_delimitedÁóóóóóóóóóó ó
ó ó ó
óóóóóóóóóLengthDelimitedCodecErrorÁŠ_privÁóŒæ ŒbuilderÁŒmax_frame_lengthÁŒset_max_frame_lengthÁŒ decode_headÁŒ decode_dataÁóÜ2ó÷2 ó>óÕELengthFieldTypeÁó¤æ ¤
big_endianÁ¤
little_endianÁ¤
native_endianÁ¤äE¤length_field_typeÁª¥¤length_field_lengthÁ¤length_field_offsetÁ¤length_adjustmentÁ¤num_skipÁ¤ new_codecÁ¤new_readÁ±¥¤ new_writeÁ³¥¤
new_framedÁµ¥¤num_head_bytesÁ¤ get_num_skipÁ¤adjust_max_frame_lenÁóº>ó¼×ó¾×óÒ
ÒÒÒ lines_codecÁÄÄÄÄÄÄÄÄÄÄ Ä
ÄÐæ Ðnew_with_max_lengthÁÐ
max_lengthÁÄutf8ÁÔ Äwithout_carriage_returnÁÄ×××Ü2×ó3ÄÜ¥ÜÜ÷2Äà>Äâ×Ää÷ÄÒÒÒÒany_delimiter_codecÁêêêêêêêêêê ê
ê êDEFAULT_SEEK_DELIMITERSÁêDEFAULT_SEQUENCE_WRITERÁêùæ ù½KùØKêýýýÜ2 ýó3ꃥƒƒ÷2ê>ê×ê÷êÒÒÒÓ
BytesCodecÁ
ˆÓÓÓƒÓ˜×ÓšÖÓ Ó
Ó ŸÓ ¡ï
Ó
£§¤ùÓ¦>ÿ ReadFrameÁ¨eofÁ¨ is_readableÁ¨ü5¨ has_erroredÁÿ
­×ÿRWFramesÁ¯readÁ¯writeÁÿ ²>À FramedPartsÁ´¥´¦´ioÁ´÷1´read_bufÁ´ write_bufÁ´»EÀ¼¥¼¦¼×óBuilderÁÀ
max_frame_lenÁÀlength_field_lenÁÀÆHÀáHÀúHÀlength_field_is_big_endianÁó Ç×ó
ó ʃó óLengthDelimitedCodecÁÍÕEͺó
Ð×óÒƒó DecodeStateÁÔHeadÁÕ
ÔDataÁ×
׈óÚ×óó݃óÄ
LinesCodecÁà
next_indexÁàØKà
is_discardingÁÄäƒÄæ×Ä èÖÄ
Ä ëÄ íÄ
ïï
Äñ§òùÄLinesCodecErrorÁôMaxLineLengthExceededÁõ
ôIoÁ÷
÷ˆÄú×êAnyDelimiterCodecÁüÀUüØKüÚUüseek_delimitersÁüsequence_writerÁêƒê×ê Öê
ê ê ê
ï
ê§ùêAnyDelimiterCodecErrorÁMaxChunkLengthExceededÁ
W
ˆê˜×•Rš
copy_to_bytesÁ¤¤¤æ ¤Å¤:¤˜ªŸª¤ªª¢ ªÆ ª´ ªØ ²¤²²Ÿ#šinspectÁ 
  Ä£ÄÄæ ĘɣÉÉ„)Í£ÍÍŸ*Í´ ͹*ÍÎ*Íé*Õ¨ÕÕæ Õ˜Ú¨ÚÚŸ*Ú´ Ú¹*ÚÎ*Úé*â¨ââ„)š§Rææææææ§Rì£ììì ð š
reader_streamÁòòòòòòòòòò òDEFAULT_CAPACITYÁòþ£þæ þÒ9ò£Ÿ#šsimplexÁ 
  
IoResultÁ ¥CLOSED_ERROR_MSGÁž Ò9ž register_receiver_wakerÁž register_sender_wakerÁž take_receiver_wakerÁž take_sender_wakerÁž ´ž close_receiverÁž  close_senderÁ§ ã© „)« ã­ Ÿ*­ ´ ­ ¹*­ é*­ Î*æ š sink_writerÁ´ ´ ´ ´ ´ ´ ´ ´ ´ ´  ´ 
´  ´ Á ¤Á æ Á ÅÁ :Á ˜´ Ç ¤Ç Ç ŸÇ Ÿ*Ç ´ Ç ¹*´ Î ¤Î Î Ÿ#´ Ò ¤Ò „)š
stream_readerÁÕ Õ Õ Õ Õ Õ Õ Õ Õ Õ  Õ 
Õ  Õ â ¤â â â æ â  has_chunkÁâ into_inner_with_chunkÁÕ é ¤é é Åé :é :é ˜Õ ð ¤ð ð ð „)Õ õ ¤õ õ õ ª)õ ¿)Õ û ¤û Õ StreamReaderProjectÁþ Ÿþ ¤þ þ ðþ chunkÁÕ 
¤

projectÁÕ ˆ
¤ˆ
ˆ
ˆ
¥ˆ
ˆ
¢ ˆ
Æ ˆ
´ ˆ
Ø šwrite_all_vectoredÁ









 


 
 


âh¡
Ÿ¡
'bÁ¡
¨
¥
¨¥
°¥
Š ¨

advance_slicesÁª
Ÿšššššššššš š
š š š
¢º
Š6º
´º
receiver_wakerÁº
 sender_wakerÁº
bufÁÀ
×ReceiverÁÂ
ðÄ
×SenderÁÆ
ðÈ
×Õ  StreamReaderÁÊ
¤Ê
Ê
ðÊ
ägÕ Ï
¤Ï
Ï
× DropGuardÁÓ
ðÕ
× DropGuardRefÁ×
Ÿ×
ðÚ
ŸÚ
×WaitForCancellationFutureÁÝ
ŸÝ
»Ý
…/á
â
Ÿá
__assert_not_repr_packedÁä
Ÿá

ProjectionÁæ
'__pinÁæ
Ÿæ
Ⱦ
…/á

ProjectionRefÁë
½në
Ÿë
ȑ
…/â
†hð
½nâ
 project_refÁò
½ná
__OriginÁô
½nô
Ÿô
__dummy_lifetimeÁô
»ô
…/á
ú
½nú
Ÿá
MustNotImplDropÁá
þ
¥á
 ŸWaitForCancellationFutureOwnedÁ …/ »  ƒn «nˆ ½nˆ …/ˆ » ãnŒ ½nŒ …/Œ » †h ½n ¨o ½n Ão ½n ão …/ »  ½n  p œ ¥ RunUntilCancelledFutureÁŸ ŸŸ Ÿ  cancellationÁŸ …/¤ ¥ Ÿ¥ ¤ ƒn¨ Ÿ¨ ¤ «n« ½n« Ÿ« « ör« …/¤ ãn± ½n± Ÿ± ± ör± …/¥ †h· ½n¥ ¨o¹ ½n¤ Ão» ½n» Ÿ» » ão» ör» …/¤  ½n Ÿ ¤  p¤ Ç ¥¤ É ŸÉ RunUntilCancelledFutureOwnedÁÌ Ì örÌ …/Ð Ñ Ð ƒnÓ Ð «nÕ ½nÕ Õ örÕ …/Ð ãnÚ ½nÚ Ú örÚ …/Ñ †hß ½nÑ ¨oá ½nÐ Ãoã ½nã ã ãoã örã …/Ð é ½né Ð  pÐ í ¥Ð ï 
PollSendErrorÁñ
ñ ¥ñ ˆõ ¥õ ×StateÁø ¥ø IdleÁú
ú ˆø  AcquiringÁý
ø  ReadyToSendÁÿ
ÿ ˆø ClosedÁ
  ¥ ×
PollSenderÁ ¥ senderÁ º acquireÁ
Œ ¥Œ ×PollSenderFutureÁ
 ¥ ˆ  ¥ ×´EitherÁ  £ LeftÁ
 ˆ RightÁœ
œ ˆ´Ÿ Ÿ £Ÿ ×´£ £ ££ ƒððððRestoreOnPendingÁª
ð¬ 
made_progressÁðî§WithCancellationTokenFutureÁ¯ Ÿ¯ ¯ û§³ ´ Ÿ´ ³ ƒn· Ÿ· ³ «nº ½nº Ÿº º û³ ãn¿ ½n¿ Ÿ¿ ¿ û´ †hÄ ½n´ ¨oÆ ½n³ ÃoÈ ½nÈ ŸÈ È ãoÈ û³ Î ½nÎ ŸÎ ³  p³ Ó ¥³ Õ ŸÕ § WithCancellationTokenFutureOwnedÁØ Ø û§Û Ü Û ƒnÞ Û «nà ½nà à ûÛ ãnä ½nä ä ûÜ †hè ½nÜ ¨oê ½nÛ Ãoì ½nì ì ãoì ûÛ ñ ½nñ Û  pÛ õ ¥Û ÷ 
WriteAllVectoredÁù Ÿù Òiù ¨ù writerÁù bufsÁù _pinÁ

Ÿ
Òi
¨
×


Ÿ
Òi
¨
ƒnŠ
ŸŠ
ÒiŠ
¨
«nŽ
½nŽ
ŸŽ
ÒiŽ
¨Ž
ÔŽ
âŽ
î
ãn
½n
Ÿ
Òi
¨
Ô
â
î
†hž
½n
¨o 
½n
Ão¢
½n¢
Ÿ¢
Òi¢
¨¢
ão¢
Ô¢
â¢
î
«
½n«
Ÿ«
Òi«
¨
 p
±
¥
³
Ÿ³
Òi³
¨´ 
SinkWriterÁ·
¤·
ð´ º
¤º
×´ ½
¾
¤½
ƒnÀ
¤½
«nÂ
½nÂ
¤Â
ð½
ãnÆ
½nÆ
¤Æ
ð¾
†hÊ
½n¾
¨oÌ
½n½
ÃoÎ
½nÎ
¤Î
ãoÎ
ð½
Ó
½nÓ
¤½
 p½
×
¥½
Ù
¤ò ReaderStreamÁÛ
£Û
readerÁÛ
¬kÛ
capacityÁòà
£à
×òã
ä
£ã
ƒnæ
£ã
«nè
½nè
£è
á‡è
¬kè
÷‡ã
ãnî
½nî
£î
á‡î
¬kî
÷‡ä
†hô
½nä
¨oö
½nã
Ãoø
½nø
£ø
ãoø
á‡ø
¬kø
÷‡ã
ÿ
½nÿ
£ã
 pã
ƒ¥ã
£
InspectWriterÁ¨Ô±Œ¨Œƒn¨Œ«n½n¨Ô±Œãn½n¨Ô±†hŸ½n¨o¡½nŒÃo£½n£¨££ão£Ô£±Œª½nª¨ªŒ pŒ¯¥Œ±¨±
InspectReaderÁ´£´´á‡´±¹º£º¹ƒn½£½¹«nÀ½nÀ£ÀÀá‡À±¹ãnƽnÆ£ÆÆá‡Æ±º†h̽nº¨oνn¹ÃoнnУÐÐãoÐá‡Ð±¹×½n×£×¹ p¹Ü¥¹Þ£Þ CopyToBytesÁá¤áðä¤ä×çè¤çƒnê¤ç«nì½nì¤ìðçãnð½nð¤ððè†hô½nè¨oö½nçÃoø½nø¤øãoøðçý½ný¤ç pç¥çƒ¤» FramedWriteÁ¥ð»Š¥Šƒn¥«n½n¥ðãn½n¥ðІhš½nЍoœ½nÃož½nž¥žžãožð¤½n¤¥¤ p©¥«¥«
FramedReadÁ®¥®®ð²³¥³²ƒn¥²«n¹½n¹¥¹¹ð²ãn¾½n¾¥¾¾ð³†hýn³¨oŽn²ÃoǽnÇ¥ÇÇãoÇð²Í½nͥͲ p²Ò¥²Ô¥ÔÀFramedÁץצ×ðÀÛܥܦۃnߥߦ۫nâ½nâ¥â¦âðÛãnç½nç¥ç¦çð܆hì½nܨoî½nÛÃoð½nð¥ð¦ðãoððÛö½nö¥ö¦Û pÛû¥Ûý¥ý¦ÿ
FramedImplÁ¥¦¸xðº÷1ÿ ¥¦¸x×ÿŒ¥¦¸xŒƒn¥¦¸xŒ«n½n¥¦¸xðº÷1Œãn½n¥¦¸xðº÷1†h¥½n¨o§½nŒÃo©½n©¥©¦©¸x©ão©ð©º©÷1Œ²½n²¥²¦²¸xŒ pŒ¸¥Œº¥º¦º¸x



!
,
3
4
5
6
6
6
:
:
;
;
<
=
?
O
O
O
Q
S
S
V
V
Y
^
_
`
a
d
e
o
o
o
s
s
s
u
u
u
x
{
{
{



ˆ
ˆ
ˆ
¦
¦
¦
¸
¸
¸
¹
½
¾
¾
¾
¿
À
Á
Â
Ã
Æ
Ê
Ê
Ê
Ë
Ë
Ë
Ì
Í
Í
Í
å
æ
è
è
è
é
é
é
ê
ë
î
î
î
ð
ò
ò
ò
ô








š
š
š


Ÿ
Ÿ
Ÿ
²
É
É
É
Í
Í
Í
Í
Í
Ñ
Ñ
Ñ
Ò
Ö
×
×
×
Û
Û
Û
Û
Ü
Ü
Ü
Ý
Ý
Ý
Þ
Þ
Þ
Þ
Þ
ß
ä
ä
ä
ë
ë
ë
ì
í
í
í
î
î
î
þ



ˆ

š
š
š
š




¼
¼
¼
Ä
Ä
Ä
Ë
à
à
ã
ã
æ
æ
ò
ò
ó
ó
ý
ý
Ÿ
¡
£
¥
«
«
«



·
¸
¸
¸
º
º
º
Û
Ü
Ý
Þ
ß
ã
ä
å
æ
ç
è
é
ð
ð
ð
ö
ö
ö
÷
ø
ø
ø
ù
ù
ù
ý
ý
ý

œ

Ÿ
 
¤
¥
¦
¬
¬
¬
²
²
²
³
´
´
´
µ
µ
µ
¹
¹
¹
Ñ
Ò
Ó
Õ
Ö
Ú
Û
Ü
Ý
Þ
å
å
å
æ
ç
ç
ç
è
è
è
í
í
í
ñ
ñ
ñ










¦
§
¨
©
ª
¬
­
®
¯
°
±
³
µ
·
¸
¹
½
½
½
¿
¿
¿
Ó
Ô
Ö
Ú
Ú
Û
Û
ß
ß
ã
ã
ã
ü






Š
Š
Š





ž
ž
 
 
¢
¢
¤
¤
®
®
®
¿
¿
¿
È
È
È
Ë
Ñ
Ñ
Ñ
Ó
Û
Û
Û
Þ
å
ç
ç
ç
é
ì
ì
î
î
ð
ð
ò
ò
û
û
û
ƒ




Š
Š
Œ
Œ
Ž
Ž





§
¨
®
®
®
¯
°
°
°
±
±
±
µ
µ
µ
Ç
É
Ì
Ì
Ì
Ì
Ì
Ð
Ð
Ð
Ð
Ñ
Ñ
Ñ
Ò
Ò
Ò
Ó
Ó
Ó
Ó
Ó
Ô
Ø
Ú
Ý
Ý
Ý
Ý
Þ
Þ
Þ
ß
ß
ß
à
à
à
à
à
á
å
å
å
å
å
ì
ì



 
 
¡
¡
¢
£
¤
¥
¦
¨
ª
ª
ª
ª
ª
¬
®
®
®
®
¯
¯
¯
°
°
°
±
²
²
²
²
²
Ä
Å
Ë
Ë
Ë
Ë
Ì
Ì
Ì
Í
Í
Í
Ñ
Ñ
Ñ
Ô
Ô
Ô
Ô
Ô
ç
ì
í
î
ô
ô
ô
ô
ô
ù
ù
ù
ú

Ž
Ž
Ž







¥
¥
¨
¨
¨
ª
ª
Á
Á
Á
Å
Å
Å
É
É
É
Ò
Ò
Ò
Ö
Ö
Ö
Ü
Ü
Ü
ä

¨
Ó
÷
÷
÷



Ž
Ž
Ž



¢
¢
¢
¦
­
®
®
·
Þ



Š
¼
¼
¼
À
â
â
â
æ

½
æ
æ
æ
ê


ß




ï8ï8g8ïú·úѨžÛ®Ö
°
ý
Æ ì Ò ô ÊŠ ÉOˆÓ ¹ÞÍÁ•î0Û‘·Ø‘·¿c‘·‘·Ðì‘·µß‘·‘·º‘·íß‘·‘·še‘·³‘·ï‘·ú‘·ÃÃBytesÁĵ £Å£ÆdataÁ£ÇvtableÁ£î ”«ó0…`ú‘·ÂÂBytesMutÁõ œÄœÅcapÁœÆ‚¸œGî—y™ï¼¿cô™ðº÷1ýDns¶qZ–¥¦¸x“íô™ðº÷1ýDns¶qZ–¥¦¸x·çº·£º¿c¨¨æP©÷Pª‚Q«ü5¬QZÔn°—Nêb³¯¯½Q°ÍQ±ÙQ§R8µ¥¥ ³ô»³ê5ü5Š6+¸zŠÅ<‰éô»¾¹é“½¾¹ ɼô»£ɼô» ɼ“½£ɼ“½$Eô™ðº÷1ýDns¶qZ–çºíº£
ô™ðº÷1ýDns¶qZ–çºË»¨š“í×׳—ÚðÀßð$.ï}¤Å»Ë»úçºú×׳—ÚðÀßð$.ï}¤çºíº$E¬À
×׳—ÚðÀßð$.ï}¤çºË»Õ¿¿c¬À¿c´´òQ·•R¸÷1¹§Rº·R»»EÖ"#òEçºíº“í®®î”±ðŒˆÓÅ´˜áéÅ»ÑçºÑ®®î”±ðŒˆÓÅ´˜áéçº$EìÂ
®®î”±ðŒˆÓÅ´˜áéçºÔÂÕ¿¿cìÂ“í¨’ˆð»¤…ÉŠª|9ÙÅ»¨çº¨¨’ˆð»¤…ÉŠª|9Ùçº
¨’ˆð»¤…ÉŠª|9Ù纶ÄÕ¿$E¨’ˆð»¤…ÉŠª|9Ù纟ÿc¨’ˆð»¤…ÉŠª|9Ùçºíº¿cÀÀíRÁüRó‘SóÃÆHóÄáHóÅúHóÆÁSóf\
ãv?,ÛÊÆØÊÆŠ ÊÆ¿cÍ͇TÎÕEóϺóú,QŸ—Æ…ØÜÇ¿cÔÕÖàTרñTÙˆó[9ìMºÎÆ™Û¨ÈØ¨ÈŠ ¨ÈïÜÇúÜÇÒ¸³ÜÇžžžžž³ÊÆ¿cŠŠšE»Eó¼Ú„f˜IÉÄcôɾôÉØàà®UáÀUÄâØKÄãÚUÄåØ`.ó¿c¿Ê¿ÊÐì¿Êµß¿Ê¿Êº¿Êí߿ʿʚe¿Êï¿Êú¿Ê纳¿Ê¿côõöîV÷øWùˆjV>0,|Äc‰Ìé‰Ìßßà ¬
ÑøÿËO Ÿ¾‰ÌØüü´WýÀUêþØKêÿÚUêåWêüWêÛE¥(ƒð¿cžÍžÍÐìžÍµßžÍžÍºžÍíߞ͚͞ežÍïžÍúžÍ纳žÍ¿c™YWˆÁŠz@ ccÄc€Ïé€ÏÞ̾€Ï¿cááãðÿO"ÍÄPË
¤“íááãðÿO"ÍÄPË
¤çºëÏ
¨Ð Ÿ
$EëÏ“í´´¡·á‡¸±:ËÕ<ë¡£ÛçºÛ´´¡·á‡¸±:ËÕ<ë¡£ôÑÅôÑ“íµŠŠÔ±D™EV?c¨ÜѮ纮µŠŠÔ±D™EV?c¨¶ÒŲӲӿcÛ
Û
ŇÝ
á‡òÞ
¬kòß
÷‡ò³¡š£HÔ˜°Ò“íÛ
Û
ŇÝ
á‡òÞ
¬kòß
÷‡ò³¡š£HÔ˜ÖÑ纕Ô$E•Ô¿cº
º
¢»
Š6¼
´½
k¾
˜k¿
¬kE+ªjb¿cÂ
Â
ÄkÃ
ð‹·×µ¶©†Œ"ÃÖÃÖ¿cÆ
Æ
ékÇ
ð 4V¹ÛYÙªŒ"Ž×Ŏ׿c·
·
«…¹
ð´ !Û‰¢ô (šÐ“í·
·
«…¹
ð´ !Û‰¢ô (×ÐÖ
çºÖ
Ù×ÅÙ×$EÙ×Ù׿cÊ
Ê
ŒlÍ
ðÕ Î
ägÕ ôèÚö™þ šÐ„Ùv„Ù“í„Ù
„Ù¥¿cù ù ¤ý Ô
þ â
ÿ î
—ýõõ(ÏG­ŸÒi¨“íù ù ¤ý Ô
þ â
ÿ î
—ýõõ(ÏG­ŸÒiÏ¿°
纰
€Ú‚Øù ù ¤ý Ô
þ â
ÿ î
—ýõõ(ÏG­88ÖÚ¿cÓ
Ó
ÜlÔ
ð„ù®f{ð<Œ"»Ü¿c×
×
€mÙ
ð°wØýòk៌"×
×
€mÙ
ð°wØýòká8«½JJKð|¯-Yñ‚
x¬½îÝ“íÝ
Ý
·mß
Ȉ
…/ רƄkUóŸý
çºý
Ý
Ý
·mß
Ȉ
…/ רƄkUóŸ“í  Ðpƒ …/ »¨wÞI´£ çº Âß¿cîÝØîݵßîÝîÝîÝšeîÝŒ"îݳîÝ¿cüÞ‚ØüÞ¿cÂß‚ØÂß“íŸ Ÿ Çr¢ ör£ …/¢³qÞƒÿdŸÜÑÆ çºÆ Ÿ Ÿ Çr¢ ör£ …/¢³qÞƒÿdŸ¶Ò‚Øìá“íÌ Ì ÃuÎ örÏ …/|ùÿOijÊõ¶Òì çºì Ì Ì ÃuÎ örÏ …/|ùÿOijÊõ‚Øã¿cñ ñ ò ùwô ˆ y×é¾ÀÉSnçºÄcáã¾áã¿cø ú û Íxü ˆý þ æxÿ  üx ˆ ƒ œyQŠts:ÄO线c  Äy ÞyŠ º ôy£œÔ\YLL线c   ˜z ˆ ý×+˜^¢ßçºØ­å
­åçº$EààÑ!áæ!Ñâ÷!Ñçµ÷>²KØÓæ¿cÓæàÓæÔ^Ô^ SemaphoreÁÕ^ll_semÁùU.#hý±ës‚د$Ø$öGgïkÆ)8Å» óç¿cóçŒ"¦¦ê&©±ö(ƒìÍesX ¶Ò¿c  š øz ˆœ  ‘{ž ˆ
cçþ(<¨YÖÑØ†é‚؆é†év†é«†éņé$E†é
†éŒ"øøù©,ûˆñ lj«?¡Pçº‚Øøøù©,ûˆñ lj«?¡PÈã“í¯ ¯ ³|² û§´õk <cÃ<ŸÜÑÒ çºÒ ¯ ¯ ³|² û§´õk <cÃ<Ÿ¶Ò‚Øì“íØ Ø Ú û§G¾ê¬¶Òô çºô Ø Ø Ú û§G¾ê¬Èã‚Ø‘íÊçºÌÀßÔÉÀÜÔÊÀÒÍÝÔäàüP ï࣠ ˜­¨ú×¼´®îÇÀÐÍÚÔ¼Šæàúôü˜äáà
Û
À
º
Ä
Â
È
Æ
º
·
Ï
Ê
ù Õ
Ó
Ú
×
NJmÝ
t õ ñ ø Œ   ñàŸ  šèàüTêàˆüëàüRíàü¡ïàü£ñàüU²¯¨˜ÍºÀààüZÍ×àýüáäÍÜàƒü²ö×Í®¤ýá×´ªÿ
Û
Ó
·
û Ê
«
ù ú
Ý
  Ÿ é Ì Î ¯ ñ Ø ¸ºš¨œäôž¯¢¯ ¯¤¯¦ìר®é²áÛ
Î ·
ìàà °ñ×­®àªáˆ
Ê
Ç å ûý×ÒÔ®©«Ÿ ¡¢£¾Šâô¤ñ ÀŠæô§ñ ƒáÜÞ´É´â© Â
Ò ·
ð Ê
Ê Í´Ú­ Æ
Ç ·
Ø ¯±ƒÛ
§ Â
« Æ
Ó
×
X¦üø×
Ù
·
õ Ê
Î ±
³
ù ¥
ù pÝ
y Ÿ Ì Ä ø¸¯ ÁØ LJM
Ý
œ ž  Ç É Ÿ í ï Ì óàÓ Ó Õ ¯ õ ÷ Ø ÍŠ í
ÛØ
¿c#DñÐìµßºíßše³ ï=ú“í#·wé
 £$E 
?ú8Ñ
¨
ž
Äc¾Û

Å*®#
Œ"
Ö
-v
°
‚Ø
«½D¬½ý
 
Æ 
ì 
à
 «Ò ô 
Ê
 ±5 86jü‘)£/  5B ƒÑ  ü“1 ÷ûü ÍüÍü6 b",;\n\r"Á  5Bûü ï üÅ, øûü …þŠ…þ6b","ÁüŒ O
 ð°ÒÂٓؓؔØÎ•؈ä o
³΢½Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÞÌ °Ò ÂÙÀÍ
 ¿­
ä€À»
ê€üš 8
 ñ°ÒÂÙ ÌÌkÎü¸Ï local_wakerÁ¸ÐextÁ¸Ñ_markerÁ¸Ò_marker2Á¸f'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãâ€ü’ A
<

Ç€ñ°ÒÂÙØâ€E
@Ô
 
ˆØÊ€Ê€PollFnÁÌ€±À€¡Ab«SÁh惚
]øÃ G
§„|ƒ
§„ 
öX §„
µ 
¾Â ÏÔ
„ا„ ç 
õù    œØ4@æ
ÈÛ
ϯ
&éõü¨  & ; A
ð\øÄŒ O
 
   ÂØ

@ Ú
ÄÚ

èñú7
#*1:D
®ÃÿWû
!~ Ãÿ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åä€
ꀻ
§„½§„ æƒ$ä€-ê€6§„Rúó‚„¾„¾PinÁ†¾ ˜X$]È=„kt•½…@½…I½…RÀŠúÀŠÀŠmu$ÀŠŽX`hpx/7þBÍQE䀬kMê€ÍQi¬kkûɧ„ Þ¨¹Ç œØÝè
ð÷¢«²œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃdÃÿmÀŠv~§„ÍûŒ
çëL󂽄¾„¾¦‹†¾ ˜X$]È=„kt•ÁÿøÀŠ ä€ê€§„¼§„ æƒ#ó‚ךŒà½…éÀŠòú¢ÀŠ t Áÿ} þˆ ÍQ䀬kê€ÍQ¯¬k±û§„ $
î ۃߠ„ ·…§ë…®ÍQ¬k§„`ûy}Þ§„Šû½£§4096Á "simplex has been closed"Áü¨Pè  hÈãÔÿÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÈãƒØ îÝÈãƒ
,ãO ãO ‹–ÛêO È㜵P dºP 
`$µP tºP )$×P  Û¼ý•ü²PØ 
„±Q L¶Q 
a$±Q \¶Q ÛQ  üùPt  Ÿ Èã ûQ  
ˆØŸ Ÿ Çr¢ ör£ …/¢³qÞƒÿdÈãx_øÞùP‡ ù˜ ù˜ž£
öX ù˜ ¸ ÁÅ
Ò×
„Øù˜ ê
Œ
 øü

U
" œØ¸•9Eé
ȸ•ÿÝÿQ ù˜
ßR (R œØ¸•&}ù˜y޼Ì7r[ av |høß¨Pè  ÝäÂ#Ð#¡¨Z »ù˜Ó  ‰R  ÕÝíøÿ ox? l sy?
GWbir
| ÷
Èã)07>ELU_
®¥•rÜãµ¼$𠥕¥ÀŠ®‹–ÈãêO Ä‹–·ù˜ ù˜4Ý
Ý
·mß
Ȉ
…/ רƄkUóÀ‹–³Èã«ù˜ E|œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¸•Ê„¾„¾¦‹†¾ ˜X$]È=„kt•’š’š’šÀнÀŠÆÀŠ2:¸•àçÀŠS[Öû #¸•ltþ$äO ‹–futÁàÈã
®¥þûù˜ «èù œØ ( 
h6  §yÎ_ ¥•h ÀŠq y ù˜U2û¨P Þå£Á „¾„¾¦‹†¾ ˜X$]È=„kt•£•ü ÀŠ
‹–j ÈãW ù˜Vù˜û¢×Èã¹å£z³¤ƒ’šŒÀЏ•CÀН¸•

£•š
þ¥
&‹–®¥Èã0
®¥!û¹ù˜ Î  ¥—
ƒ˜» ò˜S ŒšZ Àša ù˜ùù˜ÈãêÈãñ®¥ù˜- ûÐçë­ ù˜W ûú× ü¦X3  lÈãÔÿ¸•îÝÈã2? áâW îÝîÝâèW Èã$°X îÝì°X œµX 
eÈã3ÉX 
ĵX ÎX  
ˆØ¥•N
%øå°X# ¥•DK ¥•ch
öX£• z ƒ

„Ø¥•¬
ˆ º¾ Ê  È㠜ظ•ùâ ȸ•äÒX ¥•

æØX îÝ ÙX œØ¸• &f¥•
bîÝŠ
Ø
æÁ ÇÜ âlüøæ¦X3  BI'5RYql¥•   ØX  ˆîÝ © ±ÌÕè d
kâ êóîÝ   '
1;E`is}ÈãÈã«îÝÀÇÎÕÞè
®Ö¬ûÿ>E # Ö¬.ÀŠ7îÝ$âW ÈãèW ¥•ƒ¥•¾‹–àÈã±¥•~·å£À٨ɣ•Ò£•ÛÀŠ»ÀŠÄÀŠöþ¸•ÞåÀŠ $,¸•)1þ<îÝ®¥Èã+îÝ®¥7û¥• ¨«¼Ê œØàë
lùý<CÎ"Ö¬+ÀŠ4<îÝ ¥•Zû¦X BF¥å£ˆ„¾„¾¦‹†¾ ˜X$]È=„kt•Ô¬ÃÀŠÌÈ㥕
¥•H‹–jå£(Ù¨1£•:ÀŠCK¸•+ÀŠ]6Ô¬?þJîÝ®¥Èã9îÝ®¥Eû¡¥•  ¹ò­%¤®úƒ¯´¯¥•ìîÝÖ¥•úîÝ䮥îÝÈÈãgûÄ hîÝÒ¾Uûû<@Ÿüö ê  ¬çºÔÿÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¸M¸M OwnedPermitÁºMchanÁMãº:%U 4çºáãÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ©M©Mék«Mæ¿›Mi x‹–4Ѓçº4B ê¯ ÁÁ$‚
Á JùÜž"#ùïž"#
°cù×µ.#ZÆ”94
ÁÛÔÁü¡
# 

ôMçº

Ò
 
ˆØöMçºÔÿÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÈÀÛ\Û\Ü\ SendErrorÁÞ\ˆ Ò*¬û¥?QhÔÁîÈøí¡
6 ¡Äçî ¡Ä 
öX ¡Ä ",1
?E
„Ø¡ÄY
 hm z 
 œØú¿¢®é ȵÄìÖ
¡Ä ¼í
 ­çº‡Åáãü¡
d 

ç[ÈÀ‡Åáã­çºŠÈ ü¡
6 k
üå
à œØú¿&ùÛ@#áÛ#
ÜW>'ñ¡Ä
 
ô
D J_ e¬øðö ê ü‘
t cj¯,½,ÉЈ"ã¡Ä û  
 ðß   $[df ks
z ipx 
¤
«'ÁÀ'ÐÙâ ë ò*Á*PYcmÁž§±
®æ¿ÄD? §-ì æ¿÷ÀŠÁ d‘
ÔÁ6µÄ¢¡Äö¡Ä.ÔÁ¡ÄEQ!œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃµÄo„¾„¾¦‹†¾ ˜X$]È=„kt•¤Æª¤Æ³¤Æ¼ÀŠùÀŠÀŠ×ßµÄ#ÀŠøÀÈ!ùÛÜì#ŒäÈäÈ ArgumentsÁæÈtemplateÁ `çÈÀ `üöMõô]Tdµ½ÅÍÕݼÄÌÔÜäìú¿#
+
þ6
‚¸:Á‚¸MÁÞyûs¡Ä ˆ
¦
´
œØÊ
Õ

Š
d_ÀÇÎ
æ¿ ÀŠ ' Á.¡Ä;‚¸ûö ÀÄ+ œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ãú¿º „¾„¾¦‹†¾ ˜X$]È=„kt•ä¿õ ÀŠþ ôÔÁ)
¡Äà ¡Ä
²Ðò €Ñû ¤Æ
ÀŠ

µÄR ÀŠ'
ÀÈH¦®ÒÏ
ú¿  ä¿ þ ‚¸¡Á‚¸´ÁÞyì
ûÚ ¡Ä ï  ü  ”Ã^ ìà šÄÝ
žÆä
ׯë
¡Ä% ®Èæ²Éo¡Ä: ‚¸ÁGçºõM[
‚¸û ßãJ Á©Ú
‚¸ûY  ƒ IJ  ´çºÔÿú¿,9ùá½D#Áá½#
àWùáÖ*#(Æ”4ƒŽ ¯´½ÈÕåíöÿ
®ªÛ ªÛ(ÀŠ1íú¿@HþS\m{ œØœ
´«Î¸ªÛÁÀŠÊÒ² Ê ÅÖþ„¾„¾¦‹†¾ ˜X$]È=„kt•¨Û9ÀŠBþQ¨ÛZþenúÛ.¤¢¥¸¹@64Á@MAX_BUFSÁ¬÷
%‘·18?$û~ ÔØ%¨È18?Ý; ôø%‰Ì1ÞÌ9@½F %€Ï1ÞÌ9@Ü— ñ çºò )áã5Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙçº ø çºû )´ä5ÔÁ=D ø çº )´ä5ÈÀ=DÔº  çº )þå5¯$Ø$öGgïkÆ)ú¿mt$¿  ÎéÖÑ š -†é9ÎéAH  ÎéÖÑ  -†é9ÖÑAHüº " øçºù*»ê6ÑÛÑÛ MaybeUninitÁÓÛuninitÁÝÔÛ»ÝÍõƒ«%9çº ´ð¦ÐÒšÀà ïüØü±%" Utilities for working with Tokio.Á×úüÛ96 This crate is not versioned in lockstep with the coreÁü•@= [`tokio`] crate. However, `tokio-util` _will_ respect Rust'sÁüÖKH semantic versioning policy, especially with regard to breaking changes.Áü¿ üá" ´ð¦ÐÒšÀ|à }ïš ´´L
  Ä  ,,   *, 8÷$!& %8÷$&
+*. 1 Â, ; < »+ J K b8âL O a8»<P X7÷1<Z+ p q Ÿ8äDr z ž8docsrsÁ4{$ 8Óƒ  8â Š œ8»< 7÷1<•, ­8÷
¼¼Ç ß Ž å ô, æ ç ò, è8÷& í8÷
ó*ö ù Œ, ƒ  +   «8â  ª8»<˜  7Œ+ ¹ º é8ä à è8ìí$ Ê8ÓÌ Ï ç8âÐ Ó æ8» Ü7Œ, ÷8÷
¤‘ ¦ ÿ ¬ », ­ ® ¹, ¯8÷& ´8÷
º*½ À ý, Ê Ë ö+ Ù Ú 8âÛ Þ 8£ß â 8» ë7ê$ ò8» ü7÷1+   Ú8äD— Ÿ Ù8ìí$ ¦8Ó¨ « Ø8⬠¯ ×8£° ³ Ö8»<´ ¼7ê$ Ã8» Í7÷1, è8÷
÷œ‚4  ½ œ «,  ž ©, Ÿ8÷$ & ¤8÷
ª*­ ° », º » ´+ É Ê Þ8âË Î Ý8» ×7•R+ ì í ˜8ä ö 8ìí$ ý8Óÿ  8⃠ 8»<‡ 7•R$, ¦8÷
µœ½ Ñ ø  × æ, Ø Ù ä, Ú8÷& ß8÷
å*è ë ö , õ ö ï +   8â  ˜ 8» 7Ø$” + §  ¨  Ó 8ä ±  Ò 8ìí$ ¸ 8Óº  ½  Ñ 8â¾  Á  Ð 8» Ê 7Ø, á 8÷
ð ¼û Tˆ

 
 ¨
, š

 ¦
, œ
8÷$
& ¡
8÷

§
*ª
 ­
 ƒ , ·
 ¸
 ü
+ Æ
 Ç
 à
8âÈ
 Ë
 ß
8
Ì
 Ï
 Þ
8»
 Ø
7Ø
, î
8÷

ý
¬ˆ D•  ž  É  ¤  ³ , ¥  ¦  ± , § 8÷ & ¬ 8÷$­ 
² *µ  ¸  Ç ,   à  À + Ñ  Ò  è 8âÓ  Ö  ç 8»<×  ß 7Ò + ö  ÷  ¤ 8ä   £ 8ìí4 $ 8Ó  Œ  ¢ 8â   ¡ 8»<  7Ò4› , ² 8÷ 
Á  œx$‡K£†J¤µ>¥½TL—:<+-ô Synchronization primitivesÁ$ÑöÜlLaÓ
€mdw×
ŽŒ…J·m̘Ý
Ðpô· Çr¼þŸ Ãuä—Ì ùwlÐñ ÏÄyTß ÐÑ!l™àõ¯$ŒÑ³´ ”$"JÝ
Ÿ Ì á
¤ Ð KÚ †J@©,lð øA¢FutureÁ4 ‚ØB¦‹¨ „¾Ck<¾ ÌE· œØFÜlLÚ Ó
G€mdô ×
H pin_projectÁ\˜ I¤ƒ ,’ Ó
ŒJô»Üü²)üåHE Returns a reference to the cancellation token wrapped by this guard.Á,¹¾ ¾»Ü ¾îÝ ¿
ü†,üÒJG Returns stored cancellation token and removes this drop guard instanceÁü¡FC (i.e. it will no longer cancel token). Other guards for this tokenÁ¬ì are not affected.Á4»ÜîÝ
¼¥»Ü"”ÿ ¿»Ü Ë
Ä™  ×
ŒJôÌÀŸúÜÅü­)üàHÍ…À ÀúÜ ÀîÝ º
Ÿü0üÍJû†üœFχ¬çžˆúÜ ŸîÝ
Ÿ$“ô¤8ÁÁ´Ý!"!”ÉÂ Â´Ý  Ñ
!8  '-3456:;<=?K£†J"$¤µ>"%¥½T"&ŒCE13!Ô»''á(ð")ü"g/4¬Š7ÉÜg/4¬Š7ÉÜ()œÜ"''µ>µ>¤·>ð£>¸>poisonÁ£>¹>‚¸£>Ë»™z™g—--¢.®"/»"0Ì"1Û"2î"‰££’¢!k Ôõ"''Ï]Ï]NotifyÁÐ]º™SÑ]waitersÁ™SõÑÆl“+,ܧµ**
+üòCD€Ã Ãû]û]NotifiedÁý]notifyÁ™Sþ]º™Sÿ]notify_waiters_callsÁ™S€^waiterÁ™S€‘F¦”åùÃ* *
,"²‰££’¢!k ./012ìõ"--Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ†J†JK‰Jµ 7ŠJphantomÁ7J¤7·0ØQdèçEçEèEGlobalÁ ¿±‡§í#Œ˜T˜"--ä¯"--ªBªBö­B¬k÷<®B÷<9)
-ÜnL‡•ו”Ñ"--”é"--ü±8d¿Ä ć• Ò
3nodeÁ$Ìü´AŠŇ•‡• Õ
4®üÕ"(œØ""Æ Æ² ò"
5è–$ì"üÑ+žÜÔ+"É É‡•ÈãÛ7Û887 þ+ÍìÈã ð+ÍìÊ™ó+ÇÈ–"Èã½T½T¥ÀTlockÁ£>ÁT£>0ªk¥aDzۼݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ½T½T¥ÀTÅ™£>ÁT£>0ªk¥aȲü«,CÇÈÈã°š˜"Ê™ë,
6ÈãÊ™è–$ø+funcÁ$Ž,MPKN¼ú,d…-ü¡=@¼¤="ÊË Ê² ˲ Â=
:è–$¼=®4Î=ü BDd£B"ÌÍ Ì²½T½T¥ÀTÅ™£>ÁT£>0ªk¥aͲ ¸B
;®4°Bè–$ÈBüÕJ<ÄãJΠ·• ‚K
<è–$üJü×N<ÄåNÏ Ï‡• „O
=è–$þN”úP=<closure_kind>Á><closure_signature>Á><upvars>Á>>=>½T½T¥ÀTÅ™£>ÁT£>0ªk¥a²Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ½T½T¥ÀTÅ™£>ÁT£>0ªk¥a²üY*4žYРЇ• «Y
?è–$¥Y´Ç Ôã ¤ƒ pt b VYHK„Ó >¼é 2ì† äá ü¦M J A token which can be used to signal a cancellation request to one or moreÁ  tasks.Áÿ úüƒA > Tasks can call [`CancellationToken::cancelled()`] in order toÁüÅJ G obtain a Future which will be resolved when cancellation is requested.Á úü”S P Cancellation can be requested through the [`CancellationToken::cancel`] method.Áè ú # ExamplesÁû úlÿ
```no_runÁ´  use tokio::select;Áü¤, ) use tokio_util::sync::CancellationToken;ÁÑ ú”Õ  #[tokio::main]Á¬è  async fn main() {Áüþ- * let token = CancellationToken::new();Áü¬) & let cloned_token = token.clone();ÁÖ úüÚ3 0 let join_handle = tokio::spawn(async move {ÁüŽ? < // Wait for either cancellation or a very long timeÁ¬Î  select! {Áüä1 . _ = cloned_token.cancelled() => {Áü– . + // The token was cancelledÁ¬Å ŒÛ üí Q N _ = tokio::time::sleep(std::time::Duration::from_secs(9999)) => {Á´¿
 99ÁŒÖ
£«

 });Á úü† !  tokio::spawn(async move {Áü¨ K H tokio::time::sleep(std::time::Duration::from_millis(10)).await;ÁÜô  token.cancel();Á\ Ú¬œ úü  2 / assert_eq!(5, join_handle.await.unwrap());Á   ```ÁŒì îÝ|¯-Yñ‚
xKYü„
 ,„
JJ‡•ü¨
1 îÝüÝ
4 îÝüÊ+ îÝOÀcOüüD ÿ ÑÒÓ ÑîÝ Ò c cˆ¢cµ
 `£c¬k `àB¤GS
ÓÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ È éBLN ƒ N
O$„ ± Š üÇ îÝQÙQ¼ÿ üîI F Creates a clone of the [`CancellationToken`] which will get cancelledÁü¼ > ; whenever the current token gets cancelled, and vice versa.Á,! Ô ÔîÝîÝP ˆ! P
Q$‰! ü©"$ îÝS·ßSü€%/ üÔ"L I Checks if two tokens are equal in terms of their cancellation operation.Á¥# úü­#` ] Two tokens are considered equal if cancelling one will always also cancel the other and viceÁü’$S P versa. This is only true for cloned tokens and not for tokens in a parent-childÁŒê$  relationship.Áƒ% ÕÖ ÕîÝ ÖîÝR †% R
S$‡% ¹
,% ìê% îÝüŒ&+ îÝVeVüÌ&4 $Ï& ר ×îÝ ØUWW ë& UÍìò¹ Ô& ¢eò¹”×&
Vò¹$ì& º,ò& +-üº' îÝY"Y”à' $ã' Ù ÙîÝX è' X
Y$í' ü¸(" îÝ[´[üá(! <ä( îÝZZ
[´¯) îÝ]^_`abcdeiü”*! üÌ)C @ Creates a new [`CancellationToken`] in the non-cancelled state.Á* îÝ\\
]üú5. ü¢+I F Creates a [`CancellationToken`] which will get cancelled whenever theÁüð+H E current token gets cancelled. Unlike a cloned [`CancellationToken`],Áü½,> ; cancelling a child token does not cancel the parent token.Á€- úüˆ-G D If the current token is already cancelled, the child token will getÁüÔ-  returned in cancelled state.Áù- út. ¥¦”. úlœ. Ȧ´®. Þ¦üÉ., þ¦ú. ú”‚/ ¿§¬™/ Ú§ü³/- ù§üå/. + let child_token = token.child_token();Á˜0 úü 03 ï¨üØ0? ¬©¬œ1 ô©ü¶10 - _ = child_token.cancelled() => {Áüë1. Ϊ¬ž2 …«Œ¸2 £«üÎ2Q ¾«´¤3 ˜¬Œ¿3 £«lÕ3 Ĭ\ç3 Ú¬÷3 úüÿ3! û¬ü¥4K ¦­Üõ4 ú­\•5 Ú¬¥5 úü­52 ¸®,ä5 ó®<î5 ¯\6 Ú ÚîÝîÝ\ 6 \
^$Ž6 ¤Ø; ü“7H E Cancel the [`CancellationToken`] and all child tokens which had beenÁ¤à7  derived from it.Áù7 úü8C @ This will wake up all tasks which are waiting for cancellation.ÁÉ8 úüÑ8I F Be aware that cancellation is not an atomic operation. It is possibleÁüŸ9K H for another thread running in parallel with a call to `cancel` to firstÁüï9J G receive `true` from `is_cancelled` on one child node, and then receiveÁü¾:H E `false` from `is_cancelled` on another child node. However, once theÁü‹;H E call to `cancel` returns, all child nodes have been fully cancelled.Á4ß; Û ÛîÝ\ æ; \
_$ç; üâ<" ü¢<; 8 Returns `true` if the `CancellationToken` is cancelled.Ádé< Ü ÜîÝ\ ö< \¥—$÷< üÅ@8 ü¿=L I Returns a [`Future`] that gets fulfilled when cancellation is requested.Á> ú”˜>  Equivalent to:Á¯> úl·>
```ignoreÁôÉ>  async fn cancelled(&self);Á<ì> ¯ø> úü€?J G The future will complete immediately if the token is already cancelledÁüÏ?  when this method is called.Áó? úÌû?  # Cancellation safetyÁ™@ úü¡@  This method is cancel safe.ÁLÌ@ Ý ÝîÝÝ
Ý
·mß
Ȉ
…/ רƄkUóÝ\ Ö@ \ƒ˜$×@ üøE> üŠBL úÊÛB ú”ãB ÛËúB úl‚C ‚Ìü”C# async fn cancelled_owned(self);Á<¼C ¯ÈC úüÐCJ ÙÌüŸD ­ÍÃD úüËDG D The function takes self by value and returns a future that owns theÁT—E  token.Á¦E úÌ®E áÍÌE úüÔE Î|ÿE îÝÂß\\
b$F ü”H$ üöF+ ( Creates a [`DropGuard`] for this token.Á¦G úü®GH E Returned guard will cancel this token (and all its children) on dropÁ¤ûG  unless disarmed.ÁTH îÝ»Ü\\
c$¦H üJ0 üîH. + Creates a [`DropGuardRef`] for this token.Á¡I úü©IH ŒÓ¤öI ÝÓt–J Þ ÞîÝ×
×
€mÙ
ð°wØýòkáÞ\ ¥J \
d$¦J ü¿Od üøJT Q Runs a future to completion and returns its result wrapped inside of an `Option`ÁüÑKT Q unless the [`CancellationToken`] is cancelled. In that case the function returnsÁüªL' $ `None` and the future gets dropped.ÁÖL útÞL # FairnessÁñL úüùLG D Calling this on an already-cancelled token directly returns `None`.ÁüÅMB ? For all subsequent polls, in case of concurrent completion andÁüŒN? < cancellation, this is biased towards the future completion.ÁÐN úÌØN áÍöN úüþN< 9 This method is only cancel safe if `fut` is cancel safe.ÁœÌO ß ßîÝÈãÈãßg\ff ãO \ù™ àO ‚ØÈã4œP ò­c[®¥5]&(ˆàõO e8®®ehÈãÔÿ¸• 8îÝÈãÍìÈã8g]‚ØæÝlæÝƒØ¸•~ÞÝøÝЇÞe›de<coroutine_kind>Áh <resume_ty>Áh
<yield_ty>Áh <return_ty>ÁhùŸhhe¥•ü¸Wi ü–RT ÖüïRT ûÖüÈS' Ù×ôS úüüSN K The function takes self by value and returns a future that owns the token.ÁÏT út×T •ØêT úüòTG ¹Øü¾UB ŠÙü…V? ÖÙÉV úÌÑV áÍïV úü÷V< ÄÚÌÅW îÝÈãÈãk\jj\ù™ ßW êÜ4šX
iÈãªU®¥¨U"$ˆçóW iiÖ¬Íìïá#‚Øïá2ïáƒØ¸•DÞâJíâPüâVi^[iÊÝläÝlùÝlÞlùŸlliÖ¬üŒY; ŸnnüÞoÀcoY üÎYD ÑY àáâ àüÞ á c cˆ¢cµ
 `£c¬k `àB¤GS
⓲m ÕY m
oŸ$ÖY ± ÜY üÛZ1 ŸqqüÞrsƒØ„ØsàZ \“[ 4˜[ ppüª[? $­[ ãä儾„¾¦‹†¾ ˜X$]È=„kt• ãüÞ äÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾ååÎp ¼[ p
sŸ$²[ cxÁÈ[ ü¤a8 ÂßuÀcuüãaD æa æçè æÂß ç c cˆ¢cµ
 `£c¬k `àB¤GS
蓲t êa t
u$ëa ± ña üõb# ÂßwxüŸc5 ¢c îÝÂßvv
w»”¦c üìhv Töh é éîÝû]û]æ‘ý]÷‘™Sþ]º™Sÿ]•’™S€^µ’™S€‘F¦”åùv ži v
x»”Ši ü¹l. Âßz{ƒØ„Ø{\îl 4ól yyü…m? $ˆm êë섾„¾¦‹†¾ ˜X$]È=„kt• êÂß ëÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åìÎy —m y
{$m Èç£m ü¯w2 Ÿ}~}~Íì¶Ò ¸w ‚ضÒ4»w ìá´w !#üèwO öw ㌶Òìá||
Ÿ¶Ò»”úw …/4¥x üªy= Ÿ•ï ³y ¦ï4¶y ìჃ؄دy *,\îy 4óy Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¶ÒƒØü”zI $—z íî„¾¦‹†¾ ˜X$]È=„kt• íìá îÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åïœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃìáƒØ ¦z 
Ÿ¶Ò$œz Èç²z ü¢€: ù™ §€ êÜ4ª€ ㈃؄؈&(\〠4è€ ¸•ü‰I  ðñò„¾„¾¦‹†¾ ˜X$]È=„kt• ðã ñÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åòœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃãƒØ  
ˆÈã$‘ Èç§ üêƒ/ ŠŠù™ ïƒ êÜ4òƒ ãü „K ®„ îÝÈãã
Èã»”²„ …/4Ù„ ”@„Z”;¼l‰;{;~;p;s;d;g;”é\;_;N;Q;D·©®ñ ò ø SinkÁ$ 
¦‹& „¾k<; Ì·$D œØš×U ¤,œíZ ëÒ¿\w ¸Mžék4› ©MŸ¯$Œ¯  ³ ½l ®L/ Ÿ¡ŽO prôd b̈ TĨ EÄÀ ¥¢¢Íìçº Å á㣠
ü¿$ üß& # Consumes the stored value, if any.ÁŠ úü’^ [ If this error was encountered when calling `start_send`/`send_item`, this will be the itemÁüõE B that the caller attempted to send. Otherwise, it will be `None`.ÁTÆ áãøã¡¡
£çº üþ) ¥¥¥Âü ƒ áã¦Åc¦ü®: ± óôõ óáã ô c cˆ¢cµ
 `£c¬k `àB¤GS
õ“²¤ µ ¤
¦çº ×¼ üš: ¥¨¨Âü Ÿ ¿cçº áãüŠ k œ“ Á纫¥ªªÂü §
©çº‚¸cYøñÍ ( ©©æ¿Í솂&‚؆‚5†‚ƒØú¿Gê‚Mù‚SˆƒY©Üa©ÊݬäݬùݬެùŸ¬¬©æ¿í
©ÄŸ­ÜŸ­ùŸ­­©ÀÈ¼â  Ÿ¯¥°¯°ÍìÅ» ÷ ¯$Ø$öGgïkÆ)ŸÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¸M¸MÒ¿ºMæ¿›Mãº:%U 4Å»ñ ñ ò ùwô ˆ y×é¾ÀÉSnÅ»ó õ÷Üð ¥²²Âü õ þå³ 
”Ò  þå±±
³çº ³ÊÝ´äÝ´ùÝ´Þ´ùŸ´´³ªÛüÖ! ¥Âü Û Ììçº þå·¸¹"$„© ¬ þåµµ
·çºüÏZ  ö÷ø öþå ÷ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åøÅÖµ × µ
¸çº Èçâ üñ, ô ù ùþåÁµ ø µ
¹çº Þy4ƒ Ü€ ¥»»Âü  «‰ ­å¼½¾¿ÀÁÂÃ(*üÆ% ü¢  Creates a new `PollSender`.ÁÍ ÔÁ­åºº
¼çºÞy4Ñ ü’ $ T• ú ú­å´äº   º
½çº ü‡&Z üù 6 3 Attempts to prepare the sender to receive a value.Á´! úü¼!U R This method must be called and return `Poll::Ready(Ok(()))` prior to each call toÁ„–"
`send_item`.Á«" úü³"^ [ This method returns `Poll::Ready` once the underlying channel is ready to receive a value,Áü–#V S by reserving a slot in the channel for the item to be sent. If this method returnsÁüñ#G D `Poll::Pending`, the current task is registered to be notified (viaÁü½$K H `cx.waker().wake_by_ref()`) when `poll_reserve` should be called again.Á% úd•% # ErrorsÁ¦% úü®%T Q If the channel is closed, an error will be returned. This is a permanent state.ÁdŽ& ûüý û­å üÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åýœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
á㺠& º
¾çº$ & Èç¦& üç5E üŽ2!  Sends an item to the channel.Á´2 úü¼2V S Before calling `send_item`, `poll_reserve` must be called with a successful returnÁü—3# value of `Poll::Ready(Ok(()))`.Á¿3 údÇ3 ã’Ø3 úüà3T …“¹4 údÁ4 # PanicsÁÒ4 úüÚ4` ] If `poll_reserve` was not successfully called prior to calling `send_item`, then this methodÁ|¿5 will panic.Á²|Ó5 Lî5 þ þ­åçºÓ–º ø5 º
¿çº$ý5 »,ƒ6 üæ= üà<) & Checks whether this sender is closed.ÁŽ= úü–=K H The underlying channel that this sender was wrapping may still be open.ÁLí= ÿ ÿ­åº ÷= º
Àçº$ø= ü±@+ üØ>? < Gets a reference to the `Sender` of the underlying channel.Áœ? úü¤?` ] If `PollSender` has been closed, `None` is returned. The underlying channel that this senderÁü‰@# was wrapping may still be open.Á<¸@  ­åÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ 
<9 - `Poll::Ready(Some(permit))` if a permit was acquired.ÁüÙ
<9 - `Poll::Ready(None)` if the semaphore has been closed.Áš úü¢ KH When this method returns `Poll::Pending`, the current task is scheduledÁüò DA to receive a wakeup when a permit becomes available, or when theÁü» LI semaphore is closed. Note that on multiple calls to `poll_acquire`, onlyÁüŒ
DA the `Waker` from the `Context` passed to the most recent call isÁüÕ
" scheduled to receive a wakeup.Ádƒ Óæ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙȾã ã
è$•ÈçüªŒüŠ41 Poll to acquire many permits from the semaphore.ÁÃúüË)˜Ãùúü>×ÃüÄ<ŸÄü…<åÄÆúüÎK·ÅüžFC to receive a wakeup when the permits become available, or when theÁüéLÚÆüºD°Çüƒ"þÇŒ± Óæ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åÔÊã Ìã
éÈçßë½üÑ$(ü¼"41 Returns the current number of available permits.Áõ"úüý"LI This is equivalent to the [`Semaphore::available_permits`] method on theÁüÎ#" `tokio::sync::Semaphore` type.Áõ#úüý#OL [`Semaphore::available_permits`]: tokio::sync::Semaphore::available_permitsÁŒØ$ Óæã ê$ã
ê$ë$ü·(#ü²%*' Adds `n` new permits to the semaphore.Áá%úüé%RO The maximum number of permits is [`Semaphore::MAX_PERMITS`], and this functionÁüÀ&(% will panic if the limit is exceeded.Áí&úüõ&FC This is equivalent to the [`Semaphore::add_permits`] method on theÁüÀ'"ÐÐç'úüï'C@ [`Semaphore::add_permits`]: tokio::sync::Semaphore::add_permitsÁ\¾( Óæã Ê(ã
ë$Ë(¹ Ñ(ì)Óæíî$F$GîL±)$¶)ììȾüØ)^LÛ)˜š„¾„¾¦‹†¾ ˜X$]È=„kt• ˜Óæ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åšÔÊì ï)ì
î$å)Èçû)äñ*ÓæðÙðü”+ ,—+ ÓæÓæï +ï
ð$ž+üï+!ÓæòÀcòü—,8š,œž œÓæ  c cˆ¢cµ
 `£c¬k `àB¤GS
ž“²ñ ž,ñ
ò$Ÿ,± ¥,üÊ-'Óæôâôôø-4û-Ÿ ŸÓæ Ÿ®çó ‚.ó
ô$ƒ.쉲l„© ¦ 4èØö÷×!¤,öø…/$8äöúæƒ4>‚Øöûí$Vëöý ManuallyDropÁd\ÃÛöþ¦‹y„¾öÿµ ök<œÌö·œØöƒÞDÎ\*¿4/¯±DK¡PˆlowDhLZ\HJüï#ü­>; A reusable `Pin<Box<dyn Future<Output = T> + Send + 'a>>`.ÁìúüðC@ This type lets you replace the future stored in the box withoutÁü´:7 reallocating when the size and alignment permits this.ÁŒúŸ¥—… ¯$Ø$öGgïkÆ)ŸÅ»GgïkÆ)ŒXZü™3,™ö„¾„¾¦‹†¾ ˜X$]È=„kt•žBoxÁ¡ˆˆ¢ˆl }.xς؃ØÅ»ÌìŸוüÑ$Ÿ¥ŠŠ—… Ú÷áÖüÈUüüGD Create a new `ReusableBoxFuture<T>` containing the provided future.ÁÏÜÑ÷ሌŒˆÍìÜÑ Ó‚ØÜÑ”þÜуØÅ»T…ÌìÜÑ$“ÜÑŸš
ŸÅ»ÜÑ…/4Ödfü½Xüí41 Replace the future currently stored in this box.Á¦úü®HE This reallocates if and only if the layout of the provided future isÁüû=: different from the layout of the currently stored future.ÁÄ   ÷áÜÑˆŽŽ ˈûå ÈŒæ”öæ±æ$‹Âæ
ŸÅ»ÜÑ…/4ÖFHüö
müŒ 4‹æÅ úüÍ IF This function never reallocates, but returns an error if the providedÁü›
FC future has a different size or alignment from the currently storedÁ
 future.Á<ý
¡ ¡÷áÜÑÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Üш ˆ ˆûå Œæ”Ä æ ±æ Âæà 
ŸÅ»ÜÑ$ …/4“ FHü³dö¢ ¢¯$Ø$öGgïkÆ)Ÿéñ¶ÒÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¶ÒŸ ·•ï ¡¦ïÌì¶Ò¶ÒŸ½
Ÿ¶ÒthisÁ$±…/4êUWÄŸÜŸùŸ¶Òž²â¡ˆˆ¢ˆl }.x϶Òו „¾„¾¦‹†¾ ˜X$]È=„kt•ž²â¡ˆˆ¢ˆl }.xς؃ØéñÌìוü¥Füì41 Get a pinned reference to the underlying future.Á<¬£ £÷ᄾ„¾¦‹†¾ ˜X$]È=„kt• £‚؃ØÅ»Ì죈 ´ˆ
ŸÅ»üÅ7ü•+( Poll the future stored inside this box.Á$̤¥¦ ¤÷á ¥ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å¦œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÅ»ˆ ш
ŸÅ»ÈçÜü¨+8§¥˜§˜—… ­ó皃؄ؚŻü >üð+ô¨©ª„¾„¾¦‹†¾ ˜X$]È=„kt• ¨óç ©ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åªñö ²
š8Å»Èç¾üÕ08«¥œœ«—… áóç
üŠ/8¬¥žž¬—… óçŸÀcŸüÀ8í®¯ ­óç ® c cˆ¢cµ
 `£c¬k `àB¤GS
¯“² Ç
Ÿ8Å»± Îü¹ö„¾„¾¦‹†¾ ˜X$]È=„kt•ž²â¡ˆˆ¢ˆl }.xÏçºוíºÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 íº¥¡¦¢ £¤£¡¤¢Îìçº ÊÍìíº ÕÍìÓÿ ØÍì€ÿ Û–"€ÿž²â¡ˆˆ¢ˆl }.xÏíºוœª€ÿó€˜"Óÿ ¼
 çºíºÓÿ€ÿØ$,Þ new_valueÁLòcallbackÁD€åçáãÝßÙÛ ÄŸ¥ÜŸ¥ùŸ¥¥ ¥çºíºÓÿ€ÿÓÿ  çºíº€ÿüÀ#&TÇ#ö §¨¨§Íìõè Ò#•ï Õ#–"¶ÒlØ#¶Ò˜"õè ä#Çè(ƒìÍesX©²RTWY”í# í#ö¦¦ÃÛÃÛ©ÝÅÛ»¬µÜÀ,%*¶Òü„$* «¬¬«®„ ›$•ï Œ$›„l$‚„ ‰$Çè­®+-¤µ$¸$ö¶ÒÇ說
­õè¶Ò± ¼$%$’%öÇèõ說
®õè¶Ò$—%ü¥&3 °±°±®„ ¼&•ï ­&›„l°&‚„ ª&Çè²"²02”ß&$â&° °Çè¯ ç&¯
²õè¶Ò$ì&üàtü# Module defining an Either type.Á æƒ4;‚Ø´SeekFromÁDKñL´·¦‹^„¾´¸k<nÌ´º·$wœØ´» AsyncBufReadÁdv´½ AsyncReadÁLŸ´¾ AsyncSeekÁLª«´¿
AsyncWriteÁTµÅ´ÀReadBufÁ<Áû´ÁÍÝ´Â(t3dGDYùü(CëíÚÜL…Á誎su[]JLÔÉ ä  ê 
, ë8& ð8¼ ö, ÷8methodÁ& þ8¼,ÿ  ,   , 8À$ˆ& Œ8¼,$  *˜  8" ¬ 8, À8 Å8get_unchecked_mutÁŒÆ × Ø Ú 8'ð8øz ö ø8· ÷*ú8¦‹ý'8ð l  8·  , 8–Œ4” š ¥,  œ ¢, 8À$ £ ¤$ ¦8$¸'¼8{ à Å8½ Ä*Ç8¦‹Ê'Í8ð  Ü Þ8½ Ý ß, à8–Œ ç ò, è é ï, ê8À$ ð ñ$ óü–aÅ£Æ ÇÆÅÇÎéƒØÓÿÖуØÓÿÆ€ ¡‚ØÎé”ÉÍìÎé ‚ØÖÑ”äÍìÖÑ ž†éÈɃ؄ØÉ>@)+z|ÄÄÓÿü”I$—±²³„¾„¾¦‹†¾ ˜X$]È=„kt• ±†é ²ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å³œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã†éƒØÄ ¦Ä
ÉÎéÖÑÓÿÈç²üOË£ÌÌ˰“ Ò“ ÎéÖцéÍÍ;=@Büå´µ·¸„¾„¾¦‹†¾ ˜X$]È=„kt• ´†é µÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å ·ûûÕŠý¬køþfilledÁøÿ initializedÁø§Ã‰ˆ¾0œŸ¸œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÞÌÊ Ê
ÍÎéÖÑÈç¬k·ü£XÏ£ÐÏа“ ¨Ò“ «vÎévÖцéÑÒwxÒÑBDGIü‚Sl…¹º»„¾„¾¦‹†¾ ˜X$]È=„kt• ¹†é ºÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å»œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ¹ƒÑÞÌÎ Î
ÑÎéÖÑ$“Èç©ü’,<•¼„¾„¾¦‹†¾ ˜X$]È=„kt• ¼†éÎ §Î
ÒÎéÖÑ$amtÁ³üõOÔ£ÕÔÕ°“ úÒ“ ý«Îé«ÖцéÖ׬­×ÖFHKMüËE½„¾„¾¦‹†¾ ˜X$]È=„kt• ½†éñLòLóLStartÁôLˆõLöLEndÁ÷LˆøLùLCurrentÁúLˆaÍ>4¡9cÅÞ›Ó ãÓ
ÖÎéÖÑpositionÁDïüÐQ¾¿À„¾„¾¦‹†¾ ˜X$]È=„kt• ¾†é ¿ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åÀœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÞÌÓ ëÓ
×ÎéÖÑÈç÷üÜRÙ£ÚÙÚ°“ áÒ“ äÅÎéTÅÖцéÛÜÝÞ߯ÇÈÉÌÞÜßÛÝgilnüµ\T¸ÁÂÃÄ„¾„¾¦‹†¾ ˜X$]È=„kt• Á†é ÂÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åà Ä
æLæLçLIoSliceÁéLˆ¦ —óë@M$TÏó‚Ø ¤"Ø
ÞÎéÖÑ$š"Èç¸"â$Ö"ü÷##Œú#Ð Ð†éØ Œ$Ø
ßÎéÖÑ$$ü®%˜á£ââáÖÑ$FÎé$Ft¶&Ò“ ¶%$EÎéäô%$EÖÑü™&,°“ ³%†éãä$F$GäLNLÍ&$Ò&àà‚¶üç&TLê&ÑÒÓ„¾„¾¦‹†¾ ˜X$]È=„kt• цé ÒÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åӜ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ†é$Fà þ&à
äÎéÖÑ$ô&ÈçŠ'üò'§æ£çèééçæèÎé®ê • lÚ(ÖÑ®ê ”»lŠ)Íì®ê$ý'Íì”»,ƒ(
Îé®êüÁ('°“ ÷'
ÖÑ®êüñ('Ò“ ú'†éêëìíî 
ëìîíRTCET ),¥)åå”»ü¹)~T¼)ÔÕÖ„¾„¾¦‹†¾ ˜X$]È=„kt• Ô†é ÕÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å֜؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
†é®ê å Ú)å
ëÎéÖѮꔻ$Ð)Èçî)üñ*WTô*ׄ¾„¾¦‹†¾ ˜X$]È=„kt• ׆é®ê¿å ‰+å
ìÎéÖѮꔻ$ÿ*÷$•+ü„,~T‡,ØÙÚ„¾„¾¦‹†¾ ˜X$]È=„kt• ؆é ÙÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åÚý¾å ¥,å
íÎéÖѮꔻ$›,Èç¹,ü¼-~T¿-ÛÜÝ„¾„¾¦‹†¾ ˜X$]È=„kt• Û†é ÜÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åÝý¾å Ý-å
îÎéÖѮꔻ$Ó-Èçñ-s®D¾ñŠª « ® ©,l¢ø¢’.l¬ š¤·.t» ¥k<˜Ì𨠷œØð© tðøùæƒ4‚Øñòîç\)ÑÛñó¦‹E„¾ñôk<[Ìñö·$dœØñ÷¤j´Yt:HTN9;(*¥úúÂü Ú »êlj«?¡Pùûâè»êþ°Tñâè»êøø
ùçºoqñøøâèüï !¥ýýÂü ô »êþ"þ”—

Þ Þ»êü Ÿ
ü
þçº
Ä¥ ¥Âü ª »ê 
üÄ #Ò çº»êÿÿ
çºð ü™ +ƒƒù™ ž êÜ ùêƒØ„Ø$&  ý•üé I ßàᄾ„¾¦‹†¾ ˜X$]È=„kt• ßùê àÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åáœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃùêƒØ û 
Èã Èç
4•ÄŸÜŸùŸÈã ùê Èã¬.»÷1ŒÌ4=ˆüð=ú»„ÜÄÕüÌ#â âƒÑÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ 
ˆneedleÁ4€haystackÁDŒüö
B4„ ã ãƒÑ’Ò ¡ 
ïÑ4‹ ýÑD— dt»•RtO»÷1Œ_üN#üE.Dxðšú‰LŠŒ¶ŠTÅŠÕŠ<'ûŠŽBufÁ>ŠBufMutÁ4CŠ•R$Z¦Šú²<`æLЦ‹x„¾Š ·,¥‚Šk<”ÌŠ˜·$œØŠLðòßáÎÐ,6¾À©«<PœUŒŽln~Lnp\^JLüæ ”ü¥UR Try to read data from an `AsyncRead` into an implementer of the [`BufMut`] trait.ÁûúÔÿ [`BufMut`]: bytes::BufÁšú
# ExampleÁ¬ú¯ü¸! use bytes::{Bytes, BytesMut};ÁüÚ use tokio_stream as stream;ÁÔú use tokio::io::Result;Áü•63 use tokio_util::io::{StreamReader, poll_read_buf};ÁìÌ use std::future::poll_fn;Á´ê use std::pin::Pin;Áü/, # #[tokio::main(flavor = "current_thread")]Áü±.+ # async fn main() -> std::io::Result<()> {ÁàúüäNK // Create a reader from an iterator. This particular reader will always beÁ
// ready.ÁüÁhe let mut read = StreamReader::new(stream::iter(vec![Result::Ok(Bytes::from_static(&[0, 1, 2, 3]))]));Áªúü®" let mut buf = BytesMut::new();Á´Ñ let mut reads = 0;Áèú loop {Áœ÷ reads += 1;Áü‹VS let n = poll_fn(|cx| poll_read_buf(Pin::new(&mut read), cx, &mut buf)).await?;Áâúœæ if n == 0 {Á”ú break;ÁL,—ó®úü¡,) // one or more reads might be necessary.ÁÄÎ assert!(reads >= 1);Áüç(% assert_eq!(&buf[..], &[0, 1, 2, 3]);Ád  # Ok(())Á<  # }Á¯äåæç„¾„¾¦‹†¾ ˜X$]È=„kt• äçº åÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åæ çÂÙ󂥜œ ª
¤€ û ÍìÂÙ
çºÂÙ4•

šçºÂÙ•R¢
Èç·
¬kÑ
[]WYüÜü¯DA Try to write data from an implementer of the [`Buf`] trait to anÁüô;8 [`AsyncWrite`], advancing the buffer's internal cursor.Á°úü´MJ This function will use [vectored writes] when the [`AsyncWrite`] supportsÁ¤‚ vectored writes.Áút›¥¦ªúü®GD [`File`] implements [`AsyncWrite`] and [`Cursor<&[u8]>`] implementsÁ [`Buf`]:Áƒúl‡Ȧü•'$ use tokio_util::io::poll_write_buf;Á”½ use tokio::io;ÁÄÐ use tokio::fs::File;Áéúœí use bytes::Buf;ÁìÖØÄŸ use std::io::Cursor;Á´¸üØÏú”Ó¿§üæ'$ async fn main() -> io::Result<()> {ÁüŽ63 let mut file = File::create("foo.txt").await?;ÁüÅ41 let mut buf = Cursor::new(b"data to write");ÁúúüþFC // Loop until the entire contents of the buffer are written toÁ¤Å // the file.ÁüÚ# while buf.has_remaining() {ÁüþSP poll_fn(|cx| poll_write_buf(Pin::new(&mut file), cx, &mut buf)).await?;Á­ÞÜú Ok(())Áó®¯ýú¼ [`Buf`]: bytes::BufÁü™)& [`AsyncWrite`]: tokio::io::AsyncWriteÁìà [`File`]: tokio::fs::FileÁüáA> [vectored writes]: tokio::io::AsyncWrite::poll_write_vectoredÁèéê넾„¾¦‹†¾ ˜X$]È=„kt• èçº éÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åê ëÂÙ󂥞ŸžŸ Ÿ¤€ ò¿ã ŠÅçºÂÙ
çºÂÙ•RÈ第kÆQSVX¬öŠì’ðãæ×ÚüRO An extension trait for Futures that provides a variety of convenient adapters.Á§Ê³|ܯ ¦Æü¬ Ø ¦Ç惂ئȌûJ¦ÉÜT¼X¦¯ Ø ³ Û æƒ4‚ا©¦‹(„¾§ªk<8̧¬·$AœØ§­â„\b§®Œ‚J§°Çr¼•Ÿ §±Ãuä®Ì §²t¶D#¥ü1ˆìPw\thjTV?Aü¨6Ÿ´µµ´•ï ±¦ïì­üåOó㌶Òì³³
Ÿ¶Ò»”÷…/4¢¢ÄŸ·ÜŸ·ùŸ···¶ÒŸ Ÿ Çr¢ ör£ …/¢³qÞƒÿd¶Ò‹–¶ÒüóAŸ¹º¹º•ï ü¦ï4ÿ컼ƒØ„ؼø*,¸¸¤ñüá Iìí„¾¦‹†¾ ˜X$]È=„kt• ìì íÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åîœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃìƒØ¸ ó ¸
¼Ÿ¶ÒÈçÿ üÃ3¾¾ù™ ÈêÜ‘í¿üýKîÝÈã‘í½½
¿Èã»…/4¶¿ÄŸÀÜŸÀùŸÀÀ¿ÀÈããí¬üŒ>ÂÂù™ êÜ4”‘íÃă؄ØÄ$&ÁÁ¸•ü÷Iïðñ„¾„¾¦‹†¾ ˜X$]È=„kt• ï‘í ðÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åñœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã‘íƒØÁ Á
ÄÈã$ÿÈç¼uqtbeœÔUôîFÜèüXU A trait which contains a variety of convenient adapters and utilities for `Future`s.ÁÊÊÎìüè‚Ø
ϰ
É ç ¸ ñ , ò ó þ, ô8÷& ù8÷
ÿ*  ²,   §+ ¦ § À8⨠« ¿8» ´7¾+ Ò Ó ƒ8ä Ü 8ìí$ ã8Óå è 8âé ì 8» õ7¾, 8÷$
¨»÷1ˆ PÈ J,
  z  %,   #, 8argÁ& 8¯!
$*' * w+ 4 5 N8â6 9 M8»<: B7Ü1LD8Ü1<X'_8ë1,a f g p, h i n, j8½•k
o% q% xü96 Adaptors from `AsyncRead`/`AsyncWrite` to Stream/SinkÁ:úü>KH Raw I/O objects work with byte sequences, but higher-level code usuallyÁüŠA> wants to batch these into meaningful chunks, called "frames".ÁÌúüÐPM This module contains adapters to go from streams of bytes, [`AsyncRead`] andÁü¡KH [`AsyncWrite`], to framed streams implementing [`Sink`] and [`Stream`].Áüí0- Framed streams are also known as transports.Ážúü¢)& # Example encoding using `LinesCodec`ÁÌúüÐSP The following example demonstrates how to use a codec such as [`LinesCodec`] toÁü¤PM write framed data. [`FramedWrite`] can be used to achieve this. Data sent toÁüõTQ [`FramedWrite`] are first framed according to a specific codec, and then sent toÁüÊ%" an implementer of [`AsyncWrite`].Áðú¯üü use futures::sink::SinkExt;Áüœ&# use tokio_util::codec::LinesCodec;ÁüÃ'$ use tokio_util::codec::FramedWrite;Áëúüï/œÙ¼Ÿ # async fn main() {Áä· let buffer = Vec::new();ÁüÔ*' let messages = vec!["Hello", "World"];Áüÿ$! let encoder = LinesCodec::new();Á¤úü¨DA // FramedWrite is a sink which means you can send values into itÁ´í // asynchronously.Áü„ 74 let mut writer = FramedWrite::new(buffer, encoder);Á¼ úüÀ JG // To be able to send values into a FramedWrite, you need to bring theÁü‹
" // `SinkExt` trait into scope.Áü®
,) writer.send(messages[0]).await.unwrap();ÁüÛ
,) writer.send(messages[1]).await.unwrap();Áˆ úüŒ " let buffer = writer.get_ref();Á¯ úü³ ?< assert_eq!(buffer.as_slice(), "Hello\nWorld\n".as_bytes());Á öß ```Á úü† )& # Example decoding using `LinesCodec`Áü° SÉ›ü„
\Y read a stream of framed data. [`FramedRead`] can be used to achieve this. [`FramedRead`]Áüá
b_ will keep reading from an [`AsyncRead`] implementer until a whole frame, according to a codec,Á”Ä can be parsed.Á×ú¼¥üâ  use tokio_stream::StreamExt;Áüƒ&Ïžüª&# use tokio_util::codec::FramedRead;ÁÑúüÕ/œÙ¼…ÉŸü,) let message = "Hello\nWorld".as_bytes();ÁüÊ$! let decoder = LinesCodec::new();ÁïúüóUR // FramedRead can be used to read a stream of values that are framed according toÁüÉWT // a codec. FramedRead will read from its input (here `buffer`) until a whole frameÁ¬¡ // can be parsed.Áü·74 let mut reader = FramedRead::new(message, decoder);Áïúüó>; // To read values from a FramedRead, you need to bring theÁü²$! // `StreamExt` trait into scope.Áü×74 let frame1 = reader.next().await.unwrap().unwrap();Áü74 let frame2 = reader.next().await.unwrap().unwrap();ÁÇúüË+( assert!(reader.next().await.is_none());Áü÷  assert_eq!(frame1, "Hello");Áü˜  assert_eq!(frame2, "World");Áö߯Éú¼Í # The Decoder traitÁåúüéOL A [`Decoder`] is used together with [`FramedRead`] or [`Framed`] to turn anÁü¹OL [`AsyncRead`] into a [`Stream`]. The job of the decoder trait is to specifyÁü‰GD how sequences of bytes are turned into a sequence of frames, and toÁüÑFC determine where the boundaries between frames are. The job of theÁü˜NK `FramedRead` is to repeatedly switch between reading more data from the IOÁüçLI resource, and asking the decoder whether we have received enough data toÁü´! decode another frame of data.ÁÖúüÚPM The main method on the `Decoder` trait is the [`decode`] method. This methodÁü«PM takes as argument the data that has been read so far, and when it is called,Áüü2/ it will be in one of the following situations:Á¯úü³30 1. The buffer contains less than a full frame.Áüç1. 2. The buffer contains exactly a full frame.Áü™30 3. The buffer contains more than a full frame.ÁÍúüÑA> In the first situation, the decoder should return `Ok(None)`.Áúü—MJ In the second situation, the decoder should clear the provided buffer andÁüå)& return `Ok(Some(the_decoded_frame))`.Áúü“PM In the third situation, the decoder should use a method such as [`split_to`]ÁüäOL or [`advance`] to modify the buffer such that the frame is removed from theÁü´NK buffer, but any data in the buffer after that frame should still remain inÁüƒ OL the buffer. The decoder should also return `Ok(Some(the_decoded_frame))` inÁ this case.Áâ úüæ OL Finally the decoder may return an error if the data is invalid in some way.Áü¶!OL The decoder should _not_ return an error just because it has yet to receiveÁŒ†" a full frame.Á˜"úüœ"MJ It is guaranteed that, from one call to `decode` to another, the providedÁüê"OL buffer will contain the exact same data as before, except that if more dataÁüº#MJ has arrived through the IO resource, that data will have been appended toÁüˆ$FC the buffer. This means that reading frames from a `FramedRead` isÁüÏ$1. essentially equivalent to the following loop:Á%úl…%Ȧü“%  use tokio::io::AsyncReadExt;Áü´%C@ # // This uses async_stream to create an example that compiles.Áüø%ro # fn foo() -> impl futures_core::Stream<Item = std::io::Result<bytes::BytesMut>> { async_str
‘·ÜÔë
ü©
=
: Creates a new `BytesCodec` for shipping around raw bytes.Áò
‘·ÛÛ
Üܨ
‘·Þßàðñòà
Ýݾ¹
ÝÝÞÌü O
4„
óô ó‘· ô¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¾¹ÞÌÝ
Ý
à$
¬k
üò
"
‘·âãüýãT›
, 
ááÞÌü¸N

õö õ‘·Ò¸ ö¾¹Þ›á Â
á
ã
‚¸
¬kÚ
üÙ%
‘·åæüýæT…

ääÞÌü¢Q

÷ø ÷‘·¾¹ ø¾¹Þ›ä ¬
ä
æ
‚¸
¬kÇ
ì‰cU\©c<­cÒï³—4×èéú‰L+èë¶ŠT6ÅèìȸDOÂèí•Rb¦èî¤kLWYFH|H8<])Œâ
üg# Decoding of frames via buffers.ÁúüEB This trait is used when constructing an instance of [`Framed`] orÁüÕOL [`FramedRead`]. An implementation of `Decoder` takes a byte stream that hasÁü¥HE already been buffered in `src` and decodes the data into a stream ofÁÄî `Self::Item` frames.Áúü‹DA Implementations are able to track state on `self`, which enablesÁüÐMJ implementing stateful streaming parsers. In many cases, though, this typeÁüž=: will simply be a unit struct (e.g. `struct HttpDecoder`).ÁÜúüà=: For some underlying data-sources, namely files and FIFOs,Áüž>; it's possible to temporarily read 0 bytes by reaching EOF.ÁÝúüá?< In these cases `decode_eof` will be called until it signalsÁü¡>; fulfillment of all closing frames by returning `Ok(None)`.ÁüàOL After that, repeated attempts to read from the [`Framed`] or [`FramedRead`]Áü°JG will not invoke `decode` or `decode_eof` again, until data can be readÁœû during a retry.Áúü“DA It is up to the Decoder to keep track of a restart after an EOF,ÁüØ>; and to decide how to handle such an event by, for example,Áü— KH allowing frames to cross EOF boundaries, re-emitting opening frames, orÁüã (% resetting the entire internal state.ÁŒ
úü
$! [`Framed`]: crate::codec::FramedÁüµ
,) [`FramedRead`]: crate::codec::FramedReadÁ
ïïúƒüâ
º4ïúƒúƒ ðñòóôðñòóôÍì‚„ð £Íì‚„ñä é·£Þ̯£Ç£óòô üú
 The type of decoded frames.Á$£ ïïÜ ü® 41 The type of unrecoverable frame decoding errors.Áç úüï EB If an individual message is ill-formed but can be ignored withoutÁü¹ FC interfering with the processing of future messages, it may be moreÁü„
.+ useful to report the failure as an `Item`.Á·
úü¿
LI `From<io::Error>` is required in the interest of making `Error` suitableÁüKH for returning directly from a [`FramedRead`], and to enable the defaultÁüàKH implementation of `decode_eof` to yield an `io::Error` when the decoderÁü°(% fails to consume all available data.ÁÝúüåJG Note that implementers of this trait can simply indicate `type Error =Áü´.+ io::Error` to use I/O errors as this type.Áçúüï,Œ¡ïïüŸ(TüÂA> Attempts to decode a frame from the provided buffer of bytes.ÁˆúüJG This method is called by [`FramedRead`] whenever bytes are ready to beÁüßHE parsed. The provided buffer of bytes is what's been read so far, andÁü¬IF this instance of `Decode` can determine whether an entire frame is inÁüú+( the buffer and is ready to be returned.Áªúü²IF If an entire frame is available, then this instance will remove thoseÁü€?< bytes from the buffer provided and return them as a decodedÁüÄKH frame. Note that removing bytes from the provided buffer doesn't alwaysÁü”KH necessarily copy the bytes, so this should be an efficient operation inÁ¼ä most circumstances.ÁúüˆHE If the bytes look valid, but a frame isn't fully available yet, thenÁüÕJG `Ok(None)` is returned. This indicates to the [`Framed`] instance thatÁü¤FC it needs to read some more bytes before calling this method again.Áïúü÷DA Note that the bytes provided may be empty. If a previous call toÁüÀGD `decode` consumed all the bytes in the buffer then `decode` will beÁüŒPM called again until it returns `Ok(None)`, indicating that more bytes need toÁ be read.ÁòúüúFC Finally, if the bytes in the buffer are malformed then an error isÁüÅKH returned indicating why. This informs [`Framed`] that the stream is nowÁü•%" corrupt and should be terminated.Á¿úüÇ$Þ üð,Œ¡¡ú¼© # Buffer managementÁÅúüÍJG Before returning from the function, implementations should ensure thatÁüœJG the buffer has appropriate capacity in anticipation of future calls toÁüë52 `decode`. Failing to do so leads to inefficiency.Á¥úü­GD For example, if frames have a fixed length, or if the length of theÁüùFC current frame is known from a header, a possible buffer managementÁ„Ä 
strategy is:ÁÙ úȦ”ó  # use std::io;Á,Š!Ô”! # use bytes::BytesMut;Áü³!%‡Ä,Ý!¡º¬ç! # struct MyCodec;Á,"¡ºô‹" impl Decoder for MyCodec {Át®" // ...ÁüÁ" # type Item = BytesMut;Áüå"! # type Error = io::Error;Á#úü“#]Z fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {Á”õ# // ...ÁŒ$úü”$HE // Reserve enough to complete decoding of the current frame.Áüá$<9 let current_frame_len: usize = 1000; // Example.Áü¢%41 // And to start decoding the next frame.ÁüÛ%>; let next_frame_header_len: usize = 10; // Example.Áüž&C@ src.reserve(current_frame_len + next_frame_header_len);Áæ&úäî& return Ok(None);ÁL'­Þ,'ó®<§'¯³'úü»'EB An optimal buffer management strategy minimizes reallocations andÁ¬…( over-allocations.Á4¢(ùú ù‚„ ú¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÿâ„ÿˆY4î ÿŠZLö£ÿ•R¦ÿŒ¦‹„¾ÿ ·¥‚ÿk<¹Ìÿ·œØÿô>ô(0¤M!Lg|ù”¥éì½Ú\àÌμ¾<†¯l“ŸL¦Ž|~jlì‘„—ÿäíTÿ“½+¸zŠÅ<‰Ü4›¾¹ü±'¬¼ÔÒô»´¤óô»
Üà “½´¤å “½˜˜
ü’ !ô»ëüº % ¾¹ô»šš
ü54Æ ü¢"“½ëüË%¾¹“½œœ
ü54×üé#ɼŸ¢Ÿô“4–ÿ ÿɼ ÿô»ž ž
ŸüÏ&ɼ¡¥¡üü*Tÿ ɼ ô»  Š 
¡$üÈ$ɼ£¢£üó ɼ “½¢ ý¢
£ü±'ɼ¥¥¥üß+ ɼ “½¤ í¤
¥ü­q¥§¦¨£©§©¨Âü ²µ€ µÍì÷¾ ¸Ðãïíº£÷¾ô»¤‰«¾ª«$F$G«]_bd^`¦¦Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
íºðíºñüÑTƒ„¾„¾¦‹†¾ ˜X$]È=„kt• ƒ«¾ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ«¾$F¦ è¦
«çºíº÷¾ÈçôÔ´,¸@«ÄŸ­ÜŸ­ùŸ­­«­çºíº÷¾ÕðÕð $¸E«ÄŸ®ÜŸ®ùŸ®®«®çºíº÷¾õõ,ÈL«ÄŸ¯ÜŸ¯ùŸ¯¯«¯çºíº÷¾ÞÌÞÌõüÅU™¥±š²¦³¨´²±³´Âü ÊUÍìÕ¿ ÍUÍìË» ÐUÍìÏ¿ ÓUßñTƒVú˻տT–Vé˻տüÞÌ|°V£Ï¿“½¬ÈVƒ¿µ·¸º 
·º¸¸º´°²¬®TåV,êV°°žøüW^T„Wˆ„¾„¾¦‹†¾ ˜X$]È=„kt• ƒ¿ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åˆœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ƒ¿Õ¿ ° W°
çºÕ¿Ë»Ï¿$“WÈç©Wü¬YGT¯Y„¾„¾¦‹†¾ ˜X$]È=„kt• ƒ¿Õ¿þû° ÄY°
·çºÕ¿Ë»Ï¿$ºY÷$ÐYüš[ZT[ŠŒ„¾„¾¦‹†¾ ˜X$]È=„kt• Šƒ¿ ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åŒ¹û° ²[°
¸çºÕ¿Ë»Ï¿$¨[Èç¾[܃\t\üÇb^TÊbŽ„¾„¾¦‹†¾ ˜X$]È=„kt• ƒ¿ ŽÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å¹û° ãb°
ºçºÕ¿Ë»Ï¿$ÙbÈçïbŒ¾d
<
<ü;ÿ;î;ñ;à;ã;Te4…eÒ´×ÛÌ3<ïÀÁ¹4<?úÀÂô™ThÀĽQDt¯ÀÅæPL~¨ÀÆê5T‰ÀÇʶ$EÀÈú‰ÀʶŠÅÀËȸÂÀ̳ù$
ÀÍâ„\ÀÎ׳¤,ÀÏ•RÁ¦ÀЦ‹Ó„¾ÀÑk<èÌÀÓ·œØÀÔôhô(ZÌLKN=@/2!$¤›
÷ù|Þé”óÙì‹ÊD®»<¼¬lÉœLÜ{}¼—
¥Ö¦×Ö×Âü œ
µ€ Ÿ
¬ÀØÙÚÛÜÝÞßàãäåæçèéêëFHKMü.üµ
P”ÎüŠQN I/O object, using [`Decoder`] and [`Encoder`] to read and write the raw data.ÁàúüèKé—ü¸FÞÏüƒEB method layers framing on top of an I/O object, by using the codecÁüÍHÿÐüš:ÑÑÙúüáGD This function returns a *single* object that is both [`Stream`] andÁü­MJ [`Sink`]; grouping this into a single object is often useful for layeringÁüÿLÅӴКÔëúüóIÆÔüÁIF calling [`split`] on the `Framed` returned by this method, which willÁüLìÕàúüèLI Note that, for some byte sources, the stream can be resumed after an EOFÁü¹LI by reading from it, even after it has returned `None`. Repeated attemptsÁüŠKH to do so, without new data available, continue to return `None` withoutÁüÚ# creating more (closing) frames.ÁúüŠ$߃ü³ üØ%" [`Decode`]: crate::codec::DecoderÁü‚&# [`Encoder`]: crate::codec::EncoderÁü­[X [`split`]: https://docs.rs/futures/0.3/futures/stream/trait.StreamExt.html#method.splitÁçºíº¬ÀÕÕ
Øçºíºð÷1,¢üØ&IüìP”ÎüÁQN I/O object, using [`Decoder`] and [`Encoder`] to read and write the raw data,Áü—1. with a specific read buffer initial capacity.ÁÍúüÕKé—ü¥FÞÏüðEÒˆüºHÿÐü‡ :ÑÑÆ úüÎ Gɉüš!MšŠüì!LÅÓ´½"šÔØ"úüà"IÆÔü®#I¦‹üü#LìÕÍ$úüÕ$$߃üþ$ ü£%%éŽüÍ%&˜üø%[Èlß&çºíº¬ÀÕÕ
Ùçºíºð,í&÷1,÷&÷‡D'ü¹8;ü“,P”Îüè,Qχ¾-úüÆ-Ké—ü–.FÞÏüá.G®Ðü­/HÿÐüú/:Ñѹ0úüÁ0Gɉü1MšŠüß1LÅÓ´°2šÔË2úüÓ2SP This objects takes a stream and a `readbuffer` and a `writebuffer`. These fieldÁü«3MJ can be obtained from an existing `Framed` with the [`into_parts`] method.Áý3úü…4IÆÔüÓ4I¦‹ü¡5LìÕò5úüú5$߃ü£6 üÈ6&# [`Decoder`]: crate::codec::DecoderÁüó6&˜üž763 [`into_parts`]: crate::codec::Framed::into_parts()ÁüÙ7[ÈTÀ8ÀÁ¬ÀÕÕ
ÚçºíºpartsÁ,Ë8ܾ=üª;?< Returns a reference to the underlying I/O stream wrapped byÁlî;
`Framed`.Á€<úüˆ<KH Note that care should be taken to not tamper with the underlying streamÁüØ<FC of data coming in as it may corrupt the stream of frames otherwiseÁ´£= being worked with.Á<Å= ¬À çºÕ Í=Õ
Ûçºíº$Î=ü@#ü>GD Returns a mutable reference to the underlying I/O stream wrapped byÁlÍ>ß>úüç>KÀ›ü·?F•œ´‚@äœ<¤@ ¬À çºÕ ¬@Õ
Üçºíº$±@üC7üì@NK Returns a pinned mutable reference to the underlying I/O stream wrapped byÁl¿AÑAúüÙAKÀ›ü©BF•œ´ôBäœ\–C„¾„¾¦‹†¾ ˜X$]È=„kt• ¬À„¾„¾¦‹†¾ ˜X$]È=„kt• çºÕ ¬CÕ
Ýçºíº$¢CÌõEüD:7 Returns a reference to the underlying codec wrapped byÁlÀDÒDúüÚDJG Note that care should be taken to not tamper with the underlying codecÁü©EGD as it may corrupt the stream of frames otherwise being worked with.Á,üE ¬À íºÕ ‚FÕ
Þçºíº$ƒFü²H%ü¶FB? Returns a mutable reference to the underlying codec wrapped byÁlýFGúü—GJ¬£üæGG€¤L¹H ¬À íºÕ ÃHÕ
ßçºíº$ÈHüŒKYüƒIDA Maps the codec `U` to `C`, preserving the read and write buffersÁÄÌI wrapped by `Framed`.ÁéIúüñIJ¬£üÀJG€¤L“K¬À€ÿ×׳—ÚðÀßð$.ï}¤çºÕáâáâÕÍ쇪 K×€  K–"€ÿíºtÖK€ÿઘ"‡ª ãK
àçºíº‡ª€ÿ$£KØ©K]_bdüÈP4üÌNBº¥l“O¥Oúü­OJ¬£üüOG€¤lÏP„¾„¾¦‹†¾ ˜X$]È=„kt• ¬À íºÕ çPÕ
ãçºíº$ÝPüçQ&ü·Q+( Returns a reference to the read buffer.Á\îQ ¬À ¾¹Õ úQÕ
äçºíº$ûQüùR2üÁR30 Returns a mutable reference to the read buffer.Á|€S ¬À ¾¹Õ SÕ
åçºíº$•Sü”T'üãS,) Returns a reference to the write buffer.ÁdT˜ ˜¬À ˜¾¹Õ ¨TÕ
æçºíº$©Tü©U3üðT41 Returns a mutable reference to the write buffer.Á„°U ¬À ¾¹Õ ÁUÕ
ççºíº$ÆUü»V,ü•V! Returns backpressure boundaryÁ¬ÂVš š¬ÀÕ ØVÕ
èçºíº$ÙVüÐW<üªW! Updates backpressure boundaryÁÌ×W ¬ÀÕ ñWÕ
éçºíº$öWboundaryÁDüWäÝZüÛX?< Consumes the `Framed`, returning its underlying I/O stream.ÁŸYúü§YKÀ›ü÷YF•œ´ÂZäœTäZ¬ÀçºÕÕ
êçºíº$ïZüÛ],ü [JG Consumes the `Framed`, returning its underlying I/O stream, the bufferÁüï[)& with unprocessed data, and the codec.Á\úü¥\KÀ›üõ\F•œ´À]äœTâ]¬ÀÀÁÕÕ
ëçºíº$í]ü±`J¥í¦îíîÂü ¶`µ€ ¹`ÐãLá`‡ï<ó`¬Àïð$F$Gð0257La$‡aììüïü®aTL±aœž„¾„¾¦‹†¾ ˜X$]È=„kt• œ¬À ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åžœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈ
 `£c¬k `àB¤GS
«“²ú  iú
ýçºíº$¡i± §iäðp¥ÿ¦ÿÂü õpµ€ øpÀÁüÀqTü“q(% Create a new, default, `FramedParts`ÁÇqçºíºÀÁþšþÍìš ËqúíºšÌT‰r
çºíºšÌ•RÎq÷1,Õq9;d•e`„`u`x`|»e\¿eÒ®²ô™T ˆæPL,¨Ì3<JïŠöʶ4f$Eú‰L}ŒȸD”³ù
Žâ„×â¤,¦‹õ„¾k<ŠÌ·$“œØòQ\¦´Ì ¬<¤Xî¤rß|Д¢À캱DÝ¢lë’Lþƒqs”ŸcÜ쥘˜Âü ñÍìŸÃ ôìšœžŸ ¡¤¥¦§@B<>üË 4üŽ 85 Creates a new `FramedRead` with the given `decoder`.ÁÒ çºŸÃìÂ
纟ÃðŸ3<à üª Oü½ RO Creates a new `FramedRead` with the given `decoder` and a buffer of `capacity`ÁŒ”  initial size.Ál± 纟ÃìÂ
šçºŸÃð,¿ Ÿ3<É ÷‡ ܉üñ?ÕšŒµ `FramedRead`.ÁËúüÓKÀ›ü£F•œ´îäœ<¬ ¬ì ¬çº ˜
纟Ã$™üì#üÌG팘ŠÓ®úü¶KÀ›ü†F•œ´Ñ䜭 ­ì ­çº û
œçºŸÃ$€üâ7ü»NéŸŒŽŠÓ¤úü¬KÀ›üüF•œ´Ç䜮„¾„¾¦‹†¾ ˜X$]È=„kt• ®ì„¾„¾¦‹†¾ ˜X$]È=„kt• ®çº ÿ
纟ÃäÚüÔC@ Consumes the `FramedRead`, returning its underlying I/O stream.Áœúü¤KÀ›üôF•œ´¿äœìÂçº
žçºŸÃÜÔü2/ Returns a reference to the underlying decoder.Á<Û¯ ¯ì ¯ŸÃ ã
ŸçºŸÃüÖ'ü—:7 Returns a mutable reference to the underlying decoder.Á\ݰ °ì °ŸÃ é
 çºŸÃü†_ü©;8 Maps the decoder `D` to `C`, preserving the read bufferÁÄéñ§\ì€ÿ®®î”±ðŒˆÓÅ´˜áé纇ª¢££¢¼ª ×€ œ–"€ÿŸÃ€ÿ£ß˜"‡ª ã
¡çºŸÃ‡ª€ÿØ¥]_bdü•"6üÖ!:ŠÛ|œ"±„¾„¾¦‹†¾ ˜X$]È=„kt• ±ì ±ŸÃ ¶"
¤çºŸÃ$¬"ü¶#&ü†#+­¬\½#² ²ì ²¾¹ É#
¥çºŸÃ$Ê#üÃ$2ü‹$3Ë­|Ê$³ ³ì ³¾¹ Ú$
¦çºŸÃ$ß$ü©&,ü¨%NK Consumes the `FramedRead`, returning its underlying I/O stream, the bufferÁüû%)øµT°&ì´´òQ·•R¸÷1¹§Rº·R»»EÖ"#òE纟Ã
§çºŸÃ$»&üì(N¥©ªª©Âü ñ(¦Ð ô(ÐãL )ïŸÃ<²)쫬$F$G¬8:=?LÁ)$Æ)¨¨Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÃðŸÃñüí)TLð)´µ„¾„¾¦‹†¾ ˜X$]È=„kt• ´ì µÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åœØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙìÂ$F¨ „*¨
¬çºŸÃ$ú)Èç*ü«+@¥®š¯°¯®°Âü °+È÷ ³+ÍìÔ ¶+
çºÕ¿<ã+µÃ±²³´µ 
³²´µbdgiceTò+,÷+­­çºÕ¿ üŽ,ZT‘,·¸¹„¾„¾¦‹†¾ ˜X$]È=„kt• ·µÃ ¸ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å¹œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
µÃÕ¿ ­ ¦,­
²çºÕ¿ÔÂ$œ,Èç²,ü²-GTµ-º„¾„¾¦‹†¾ ˜X$]È=„kt• ºµÃÕ¿ñî­ Ê-­
³çºÕ¿ÔÂ$À-÷$Ö-üÅ.ZTÈ.»¼½„¾„¾¦‹†¾ ˜X$]È=„kt• »µÃ ¼ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾å½¬î­ Ý.­
´çºÕ¿ÔÂ$Ó.Èçé.üé/ZTì/¾¿À„¾„¾¦‹†¾ ˜X$]È=„kt• ¾µÃ ¿ÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åÀ¬î­ 0­
µçºÕ¿ÔÂ$÷/Èç0ü‹1V¥·¸¸·Âü 1¦Ð “1ÁTÃ1¿cŸÃTÖ1ì¹Àc¹358:üè18ë1ÁÂà Áì  c cˆ¢cµ
 `£c¬k `àB¤GS
Ó² ï1
¹çºŸÃ$ð1± ö1ìÔe'v„ôedøeÒ¹4<ú»¼ô™TD»¾ê5TP»¿ʶ4p$E»À¶ŠT‡Å»Áȸ»³ù
»Ãâ„»Ä×í¤,»Å•Rû¦»Æ¦‹„¾»Çk<¢Ì»É·œØ»ÊòQ\¾´»Ëô-Ì(!¤b¬|ö|˜æ”­ÖìÅÇDè¸<ö©lƒ™L–ŠŒxz”·j以ÍÎÎÍÂü ÀÍìÅ ÃÎÄÏÐÑÒÓÔÕÖ×ÚÛÜÝÞßFHBDüœ 5üÞ96 Creates a new `FramedWrite` with the given `encoder`.Á£ çºÅÎÄÌÌ
ÏçºÅð 4<± ü Pü“ SP Creates a new `FramedWrite` with the given `encoder` and a buffer of `capacity`ÁŒë €Ò çºÅÎÄÌÌ
ÐçºÅð,–  4<  ÷‡ Ü©ü?Õš”Ô `FramedWrite`.ÁëúüóKÀ›üÃF•œ´ŽäœÄ ÄÎÄ ÄçºÌ ¸Ì
ÑçºÅü#üìG픸àþÏúü×KÀ›ü§F•œ´òäœ<”Å ÅÎÄ ÅçºÌ œÌ
ÒçºÅü„7üÜN韔¯àþÆúüÎKÀ›üžF•œ´éäœ\‹Æ„¾„¾¦‹†¾ ˜X$]È=„kt• ÆÎÄ„¾„¾¦‹†¾ ˜X$]È=„kt• ÆçºÌ ¡Ì
ÓçºÅ$—äýüöDA Consumes the `FramedWrite`, returning its underlying I/O stream.Á¿úüÇKÀ›ü—F•œ´âäœT„ÎÄçºÌÌ
ÔçºÅ$Ü÷üÀ2/ Returns a reference to the underlying encoder.Á<þÇ ÇÎÄ ÇÅÌ Ì
ÕçºÅ$‡üù'üº:7 Returns a mutable reference to the underlying encoder.Á\€È ÈÎÄ ÈÅÌ ŒÌ
ÖçºÅ$‘üª`üÌ<9 Maps the encoder `E` to `C`, preserving the write bufferÁÄñ§ÎÄ€ÿ¨’ˆð»¤…ÉŠª|9Ù纇ªÌØÙÙØÌ¼ª ½×€ À–"€ÿÅ€ÿüŠ ˜"‡ª ˆ
×çºÅ‡ª€ÿØÉ]_bdü»!6üü :↠|Â!É„¾„¾¦‹†¾ ˜X$]È=„kt• ÉÎÄ ÉÅÌ Ü!Ì
ÚçºÅ$Ò!üÝ"'ü¬",ñ®dä"Ê ÊÎÄ Ê¾¹Ì ñ"Ì
ÛçºÅ$ò"üì#3ü³#4°„ó#Ë ËÎÄ Ë¾¹Ì „$Ì
ÜçºÅ$‰$üø$,üÒ$!·±¬ÿ$Ì ÌÎÄÌ •%Ì
ÝçºÅ$%ü‡&<üá%!À²ÌŽ&Í ÍÎÄÌ ¨&Ì
ÞçºÅ$­&½³D³&üŽ(,üŒ'OL Consumes the `FramedWrite`, returning its underlying I/O stream, the bufferÁüà')øµT•(ÎÄ´´òQ·•R¸÷1¹§Rº·R»»EÖ"#òEçºÅÌÌ
ßçºÅ$ (üÑ*v¥ášâãáâãÂü Ö*È÷ Ù*Íì¶Ä Ü*ßñTŠ+ú¶ÄÕ¿T+é¶ÄÕ¿üÞÌ|·+Åäåæçè 
èæç劌TÎ+,Ó+ààÞ“ üê+ZTí+ÎÏЄ¾„¾¦‹†¾ ˜X$]È=„kt• ÎÅ ÏÌÌkÎü¸ÏŠ¸Ð£¸Ñ´¸Òɸf'EwÚ]¾åМ؞؟ØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ÅÕ¿ à ‚,à
åçºÕ¿¶Ä$ø+ÈçŽ,üþ,GT-Ñ„¾„¾¦‹†¾ ˜X$]È=„kt• ÑÅÕ¿œ— à –-à
æçºÕ¿¶Ä$Œ-÷$¢-
 `£c¬k `àB¤GS
Ý“²î ¹3î
ñçºíº$º3± À3üŽf…ŒÄ°fü41 Frame a stream of bytes based on a length prefixÁ5úü9FC Many protocols delimit their frames by prefacing frame data with aÁü€:7 frame head that specifies the length of the frame. TheÁü»HE `length_delimited` module provides utilities for handling the lengthÁü„FC based framing. This allows the consumer to work with entire framesÁüËC@ without having to worry about buffering or other framing logic.Áú¬“ # Getting startedÁ©úü­KH If implementing a protocol from scratch, using length delimited framingÁüùGD is an easy way to get started. [`LengthDelimitedCodec::new()`] willÁüÁGD return a length delimited codec using default configuration values.Áü‰FC This can then be used to construct a framer to adapt a full-duplexÁüÐ(% byte stream into a stream of frames.Áùú¯ü…+( use tokio::io::{AsyncRead, AsyncWrite};Áü±:7 use tokio_util::codec::{Framed, LengthDelimitedCodec};Áìúüð74 fn bind_transport<T: AsyncRead + AsyncWrite>(io: T)Áü¨*' -> Framed<T, LengthDelimitedCodec>ÁüÙ41 Framed::new(io, LengthDelimitedCodec::new())Áó®´” # pub fn main() {}Á¯³úü·HE The returned transport implements `Sink + Stream` for `BytesMut`. ItÁü€ GD encodes the frame with a big-endian `u32` header denoting the frameÁœÈ  payload length:ÁÜ ú ```textÁüì 1. +----------+--------------------------------+Áüž
1. | len: u32 | frame payload |ÁüÐ
1´° <‚ ¯Š úüŽ &# Specifically, given the following:Áµ ú ¯üÁ +Ê« üí :ÿ« ¨ ú̬  use futures::SinkExt;Á¬Æ  use bytes::Bytes;ÁÜ úüà LI async fn write_frame<T>(io: T) -> Result<(), Box<dyn std::error::Error>>ÁL­
 whereÁü·
*' T: AsyncRead + AsyncWrite + Unpin,Á
í üè
IF let mut transport = Framed::new(io, LengthDelimitedCodec::new());Áü²/, let frame = Bytes::from("hello world");Áâúüæ%" transport.send(frame).await?;Áªì,›ó®¯©úü­*' The encoded frame will look like this:ÁØúŸ° üè'$ +---- len: u32 ----+---- data ----+Áü'$ | \x00\x00\x00\x0b | hello world |Áü¸'$ +------------------+--------------+Á¯èú # DecodingÁûúüÿKH [`FramedRead`] adapts an [`AsyncRead`] into a `Stream` of [`BytesMut`],ÁüËIF such that each yielded [`BytesMut`] value contains the contents of anÁü•B? entire frame. There are many configuration parameters enablingÁüØEB [`FramedRead`] to handle a wide range of protocols. Here are someÁüžA> examples that will cover the various options at a high level.Áàú„ä
## Example 1ÁõúüùKH The following will parse a `u16` length field at offset 0, omitting theÁüÅ)& frame head in the yielded `BytesMut`.Áïú¯üû" # use tokio_stream::StreamExt;Áüž2/ # use tokio_util::codec::LengthDelimitedCodec;ÁüÑ/œÙ¼ÉŸü™-* # let io: &[u8] = b"\x00\x0BHello world";ÁüÇ41 let mut reader = LengthDelimitedCodec::builder()Áüü0- .length_field_offset(0) // default valueÁü­# .length_field_type::<u16>()ÁüÑ0- .length_adjustment(0) // default valueÁ´‚ .new_read(io);Áü™?< # let res = reader.next().await.unwrap().unwrap().to_vec();ÁüÙ&# # assert_eq!(res, b"Hello world");Á<€öß<ˆ¯úü”0- The following frame will be decoded as such:ÁÅúŸ° üÕ1. INPUT DECODEDÁü‡63 +-- len ---+--- Payload ---+ +--- Payload ---+Áü¾63 | \x00\x0B | Hello world | --> | Hello world |Áüõ63 +----------+---------------+ +---------------+Á¯´úü¸LI The value of the length field is 11 (`\x0B`) which represents the lengthÁü…JG of the payload, `hello world`. By default, [`FramedRead`] assumes thatÁüÐHE the length field represents the number of bytes that **follows** theÁü™LI length field. Thus, the entire frame has a length of 13: 2 bytes for theÁüæ*' frame head + 11 bytes for the payload.Áú„•
## Example 2Á¦úüªLI The following will parse a `u16` length field at offset 0, including theÁü÷)á¼ ¡ú¯ü­"­½ üÐ2Ù½ üƒ /œÙ¼³ ÉŸüË -°¾ üù 4ç¾ ü®!0¥¿ üß!#ß¿ üƒ":7 .length_adjustment(2) // Add head size to lengthÁü¾"74 .num_skip(0) // Do NOT skip the headÁ´ö"ÅÀ ü#?åÀ üÍ#.+ # assert_eq!(res, b"\x00\x0BHello world");Á<ü#öß<„$¯Œ$úü$0„ Á$ú\Å$Ÿ° üÑ$41 INPUT DECODEDÁü†%A> +-- len ---+--- Payload ---+ +-- len ---+--- Payload ---+ÁüÈ%A> | \x00\x0B | Hello world | --> | \x00\x0B | Hello world |ÁüŠ&A> +----------+---------------+ +----------+---------------+Á<Ì&¯Ô&úüØ&IF This is similar to the first example, the only difference is that theÁü¢'JG frame head is **included** in the yielded `BytesMut` value. To achieveÁüí'PM this, we need to add the header size to the length with `length_adjustment`,Áü¾(;8 and set `num_skip` to `0` to prevent skipping the head.Á
included.Á•Cú<™C¯ü¡C"­½ üÄC2Ù½ ü÷C/œÙ¼§DÉŸü¿D52 # let io: &[u8] = b"\xCA\x00\x0B\xFEHello world";ÁüõD4ç¾ üªE1. .length_field_offset(1) // length of hdr1ÁüÜE#ß¿ ü€F0- .length_adjustment(1) // length of hdr2Áü±F,) .num_skip(3) // length of hdr1 + LENÁ´ÞFÅÀ üõF?åÀ üµG*' # assert_eq!(res, b"\xFEHello world");Á<àGöß<èG¯ðGúüôG0„ ¥Hú\©HŸ° ÔµH¶ß üÐH2/ +- hdr1 -+-- len ---+- hdr2 -+--- Payload ---+ÁüƒI2/ | \xCA | \x00\x0B | \xFE | Hello world |Áü¶I2/ +--------+----------+--------+---------------+ÁéIú¤íI DECODEDÁô‚J +- hdr2 -+--- Payload ---+Áô¡J | \xFE | Hello world |ÁôÀJ +--------+---------------+Á<ßJ¯çJúüëJIF The length field is situated in the middle of the frame head. In thisÁüµKKH case, the first byte in the frame head could be a version or some otherÁüLHE identifier that is not needed for processing. On the other hand, theÁüÊL&# second half of the head is needed.ÁñLúüõLJG `length_field_offset` indicates how many bytes to skip before startingÁüÀMLI to read the length field. `length_adjustment` is the number of bytes toÁüNIF skip starting at the end of the length field. In this case, it is theÁä×N second half of the head.ÁôNú„øN
## Example 6Á‰OúüOIºæ ü×OLç ü¤PJãç üïPHE included. In this case, the length field **includes** the frame headÁ\¸Q length.ÁÄQú<ÈQ¯üÐQ"­½ üóQ2Ù½ ü¦R/œÙ¼ÖRÉŸüîR52 # let io: &[u8] = b"\xCA\x00\x0F\xFEHello world";Áü¤S4ç¾ üÙS1êé ü‹T#ß¿ ü¯TA> .length_adjustment(-3) // length of hdr1 + LEN, negativeÁ¤ñT .num_skip(3)Á´†UÅÀ üU?åÀ üÝU*¾ë <ˆVöß<V¯˜VúüœV0„ ÍVú\ÑVŸ° ÔÝV¶ß üøV2Ìì ü«W2/ | \xCA | \x00\x0F | \xFE | Hello world |ÁüÞW2Äí ‘Xú¤•X‹î ôªX¨î ôÉXÏî ôèXöî <‡Y¯Yúü“YIF Similar to the example above, the difference is that the length fieldÁüÝYJG represents the length of the entire frame instead of just the payload.Áü¨ZJG The length of `hdr1` and `len` must be counted in `length_adjustment`.ÁüóZIF Note that the length of `hdr2` does **not** need to be explicitly setÁü½[LI anywhere because it already is factored into the total frame length thatÁüŠ\! is read from the byte stream.Á¬\ú„°\
## Example 7ÁÁ\úüÅ\JG The following will parse a 3 byte length field at offset 0 in a 4 byteÁü]C@ frame head, excluding the 4th byte from the yielded `BytesMut`.ÁÔ]ú<Ø]¯üà]"­½ üƒ^2Ù½ ü¶^/œÙ¼æ^ÉŸüþ^52 # let io: &[u8] = b"\x00\x00\x0B\xFFHello world";Áü´_4ç¾ üé_0¥¿ üš`ùÜ üº`/, .length_adjustment(0) // default valueÁüê`.+ .num_skip(4) // skip the first 4 bytesÁ´™aÅÀ ü°a?åÀ üða&®Á <—böß<Ÿb¯§búü«b0„ Übú\àbŸ° üìb85 INPUT DECODEDÁü¥c=: +------- len ------+--- Payload ---+ +--- Payload ---+Áüãc=: | \x00\x00\x0B\xFF | Hello world | => | Hello world |Áü¡d=: +------------------+---------------+ +---------------+Á<ßd¯çdúüëdJG A simple example where there are unused bytes between the length fieldÁ¤¶e and the payload.ÁËeútÏe # EncodingÁÞeúüâeKH [`FramedWrite`] adapts an [`AsyncWrite`] into a `Sink` of [`BytesMut`],Áü®fHE such that each submitted [`BytesMut`] is prefaced by a length field.Áü÷fDA There are fewer configuration options than [`FramedRead`]. GivenÁü¼gLI protocols
# let _ =Áü¬j# LengthDelimitedCodec::builder()ÁüÐj#ß¿ ¼ôj .new_write(io);Á<Œköß´”kœ® <«k¯³kúü·k2/ A payload of `hello world` will be encoded as:Áêkú\îkŸ° üúk! +- len: u16 -+---- data ----+Áüœl! | \x00\x0b | hello world |Áü¾l! +------------+--------------+Á<àl¯èlúüìlEB [`LengthDelimitedCodec::new()`]: method@LengthDelimitedCodec::newÁü²m%" [`FramedRead`]: struct@FramedReadÁüØm'$ [`FramedWrite`]: struct@FramedWriteÁü€n-* [`AsyncRead`]: trait@tokio::io::AsyncReadÁü®n/, [`AsyncWrite`]: trait@tokio::io::AsyncWriteÁôÞn [`Encoder`]: trait@EncoderÁüýn! [`BytesMut`]: bytes::BytesMutÁ„¸fŠÀÍÔÌ3<³oïóõö¹4<¼oúóöþ³—4Åo×ó÷î”TÍo®óøº¨’\Ùoóùòú‰Løoóû¶ŠTƒpÅóüÚÓpóþðÓ4¢póÿÜ·,ªpÃóȸD±pÂóStdErrorÁDÕp¾ó•R$íp¦óCursorÁ4ópöJó†qó׋q¤,óˆíqëód¤o}ilUXADLìo14!$,•p öøäæŒÀpÏ<ãpÀèp«­€qž |~üÁz$ü÷yIF An error when the number of bytes read is more than max frame length.ÁÌÌzôɼڄf˜IÉLìz,ìzóŠŠ̶ÜÇŽ¤ª€üÖOL Creates a new `LengthDelimitedCodec` with the default configuration values.Á±€ÜÇŒŒ
Üü°KH Creates a new length delimited codec builder with default configurationÁ\€‚ values.Á<—‚ÊÆŒŒ
Žüõƒ'üЂ)& Returns the current max frame settingÁþ‚úü†ƒIF This is the largest size this codec will accept from the wire. LargerÁäÔƒ frames will be rejected.Á„üƒÞ ÞÜÇŒ Œ
$Ž„üª‡2üÍ„" Updates the max frame setting.Áô„úüü„FC The change takes effect the next time a frame is decoded. In otherÁüÇ…KH words, if a frame is currently in process of being decoded with a frameÁü—†HE size greater than `val` but less than the max frame length in effectÁüä†A> before calling this function, then the frame will be allowed.Á¤±‡ß ßÜÇŒ ƇŒ
$ˇ¹чü–ˆJ\™ˆóàá àÜÇ á¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
’ÒÞÌŒ ¥ˆŒ
$ªˆöðˆüè–G\ë–óâã âÜÇ ã¾¹É‘Œ ÷–Œ
$ø–¹ þ–öÈ—ü”™%ÜÇðñòLÀ™$Å™¾¹TÚ™,ß™ÞÌü÷™H4ú™äå äÜÇ å¾¹û š
$†šöÃŒšü± ,ÜǘüýTä ,é ÞÌü¡N4„¡æç æÜÇÒ¸ ç¾¹Þ› ‹¡
$¡‚¸$–¡ˆâ£¡ç¥ÄŸšÜŸšùŸšššÞÌü‰«%ÜÇœ´œ¤µ«<¸«ÜÇ
œ\†¬<ЬóžÌÚ¬|䬞žúƒäÚ¬žúƒúƒÜü¬䟭äíäç­ô’¯û16ÁÜŸ®û32ÁÜÄ®û64ÁÜé®ü•®vüŒ®d·¯ÊÆ¥¦§¨©ª¬­®¯°±³µ·¸¹¼å³üʯK›˜
\š°ð˜
ª°út²°¥¦Űú<Ͱ¯üÙ° # use tokio::io::AsyncRead;Áüý°0- use tokio_util::codec::LengthDelimitedCodec;Á²±úüº±)& # fn bind_read<T: AsyncRead>(io: T) {Áüè±#È‹
ü² .length_field_offset(0)Áü´²#ß¿ ìܲ .length_adjustment(0)Á¤þ²íÝ ´—³ÅÀ <²³öß´¾³œ® <Ù³¯ì³ÊƤ¤
¥ü‰½)ü‡¹1. Read the length field as a big endian integerÁ½¹úüŹ  This is the default setting.Áê¹úüò¹DA This configuration option applies to both encoding and decoding.Á»ºútú¥¦Öºú<Þº¯üêºç©
üŽ»0‘ª
ûúüË»)Ùª
üù»#È‹
¬¡¼ .big_endian()Á´»¼ÅÀ <Ö¼öߴ⼜® <ý¼¯T½è èÊÆ¶±
¤ ›½¤
¦$ ½ü‹Â,üý½41 Read the length field as a little endian integerÁ¶¾úü¾¾&# The default setting is big endian.Áé¾úüñ¾Dý­
º¿út¿¥¦Õ¿ú<Ý¿¯üé¿ç©
üÀ0‘ª
ÂÀúüÊÀ)Ùª
üøÀ#È‹
Ä Á .little_endian()Á´½ÁÅÀ <ØÁöß´äÁœ® <ÿÁ¯l’Âé éÊÆµ
¤  Â¤
§$¥Âü‘Ç,üƒÃ41 Read the length field as a native endian integerÁ¼ÃúüÄÃ&DZ
ïÃúü÷ÃDý­
ÀÄútÈÄ¥¦ÛÄú<ãįüïÄç©
ü“Å0‘ª
ÈÅúüÐÅ)Ùª
üþÅ#È‹
ĦÆ .native_endian()Á´ÃÆÅÀ <ÞÆöß´êÆœ® <…ǯl˜Çê êÊÆª¸
¤ ¦Ç¤
¨$«ÇüçÏ;üÎÈ&# Sets the max frame length in bytesÁùÈúüÉHE This configuration option applies to both encoding and decoding. TheÁÌÎÉ default value is 8MB.ÁìÉúüôÉHE When decoding, the length field read from the byte stream is checkedÁüÁÊEB against this setting **before** any adjustments are applied. WhenÁü‹ËIF encoding, the length of the submitted payload is checked against thisÁdÙË setting.ÁêËúüòËKH When frames exceed the max length, an `io::Error` with the custom valueÁüÂÌ=: of the `LengthDelimitedCodecError` type will be returned.Á„ÍútŒÍ¥¦ŸÍú<§Í¯ü³Íç©
ü×Í0‘ª
ŒÎúü”Î)Ùª
üÂÎ#È‹
üêÎ*' .max_frame_length(8 * 1024 * 1024)Á´™ÏÅÀ <´Ïöß´ÀÏœ® <Ûϯ„îÏë ëÊÆè¿
¤ ÿϤ
©$„йŠÐüÂØMüßÐFC Sets the unsigned integer type used to represent the length field.ÁªÑúü²ÑIF The default type is [`u32`]. The max type is [`u64`] (or [`usize`] onÁ¤€Ò 64-bit targets).Á™Òút¡Ò¥¦´Òú<¼Ò¯üÈÒç©
üìÒ0‘ª
¡Óúü©Ó)Ùª
ü×Ó#È‹
üÿÓ# .length_field_type::<u32>()Á´§ÔÅÀ <ÂÔöß´ÎÔœ® <éÔ¯õÔúüýÔJG Unlike [`Builder::length_field_length`], this does not fail at runtimeÁüÌÕ)& and instead produces a compile error:ÁúÕúœ‚Ö ```compile_failÁüšÖç©
ü¾Ö2Ù½ üõÖ)Ùª
ü£×#È‹
üË×$! .length_field_type::<u128>()Á´ô×ÅÀ <Øöß´›Øœ® <¶Ø¯ŒÉØì ìÊÆåÆ
¤¥«« øØ¤Âü ÛØžçºÄÞØ
ªçº$ýØ')ü€Þ>üÓÙ?< Sets the number of bytes used to represent the length fieldÁ—ÚúüŸÚ30 The default value is `4`. The max value is `8`.Á×ÚúüßÚDý­
¨Ûút°Û¥¦ÃÛú<ËÛ¯ü×Ûç©
üûÛ0‘ª
°Üúü¸Ü)Ùª
üæÜ#È‹
üŽÝ .length_field_length(4)Á´²ÝÅÀ <ÍÝöß´ÙÝœ® <ôݯœ‡Þí íÊÆŠË
¤ ›Þ¤
¬$ Þ¹¦Þü¦ã>üÃßB? Sets the number of bytes in the header before the length fieldÁŠàúü’à74 This configuration option only applies to decoding.ÁÎàútÖ०éàú<ñà¯üýàç©
ü¡á0‘ª
ÖáúüÞá)Ùª
üŒâ#È‹
ü´â .length_field_offset(1)Á´ØâÅÀ <óâöß´ÿ✮ <šã¯œ­ãî îÊÆëÎ
¤ Áã¤
­$Æã¹Ìãüãç<ü§äIF Delta between the payload length specified in the header and the realÁ”õä payload lengthÁŒåút”奦§åú<¯å¯ü»åç©
üßå0‘ª
”æúüœæ)Ùª
üÊæ#È‹
ôòæ .length_adjustment(-2)Á´•çÅÀ <°çöß´¼çœ® <×篌êçï ïÊÆžÒ
¤ üç¤
®$蹇èüþì3üàè?< Sets the number of bytes to skip before reading the payloadÁ¤éúü¬é=: Default value is `length_field_len + length_field_offset`Áîéúüöé63 This configuration option only applies to decodingÁ±êút¹ê¥¦Ìêú<Ôê¯üàêç©
ü„ë0‘ª
¹ëúüÁë)Ùª
üïë#È‹
¤—ì .num_skip(4)Á´°ìÅÀ <Ëìöß´×윮 <òì¯D…íð ðÊÆÄÖ
¤ Ží¤
¯$“í¹™íü’ñ/üïí?< Create a configured length delimited `LengthDelimitedCodec`Á³îút»î¥¦Îîú<Öî¯üâî0‘ª
¬—ï # pub fn main() {Áü±ï#È‹
üÙ
üýï#ß¿ ì¥ðÔ«
¤ÇðíÝ ¬àð .new_codec();Á<úðöß<†ñ¯L™ññ ñÊÆÜǤ £ñ¤
°$¤ñüóömüþò52 Create a configured length delimited `FramedRead`Á¸óútÀó¥¦Óóú<Ûó¯üçóç©
ü‹ô0‘ª
ÀôúüÈô)Ùª
üöô#È‹
üžõœ«
üÂõ#ß¿ ìêõÔ«
¤ŒöíÝ ´¥öÅÀ <Àööß´Ìöœ® <çö¯Dúöò òÊÆçº®®î”±ðŒˆÓÅ´˜áéçºÜǤ¥²² †÷¤Âü ƒ÷ÐãLÖ÷
±çº$‡÷upstreamÁD÷02ü¼ûmü¦ø63 Create a configured length delimited `FramedWrite`Ááøútéø¥¦üøú<„ù¯üù ÄŠ
üµù2Ù½ üìù,üŠ
üú#È‹
üÅú#ß¿ ¼íú‚Œ
<‰ûöß´•ûœ® <°û¯LÃûó óÊÆçº¨’ˆð»¤…ÉŠª|9ÙçºÜǤ¥´´ Ðû¤Âü ÍûßñTžü
³çº$Ñûð,×û(*üª€uüíü1. Create a configured length delimited `Framed`Á£ýút«ý¥¦¾ýú<Æý¯üÒý-* # use tokio::io::{AsyncRead, AsyncWrite};Áü„þ2Ù½ ü»þ85 # fn write_frame<T: AsyncRead + AsyncWrite>(io: T) {Áløþ±‹
üŠÿ#È‹
ü²ÿ#ß¿ ÄÚÿ .new_framed(io);Á<÷ÿöß´ƒ€œ® <ž€¯T±€ô ôÊÆçº×׳—ÚðÀßð$.ï}¤çºÜǤ¥ ¿€¤Âü ¼€ÐãßñT”
µçº$À€ð,Æ€13üÞ!óõ õÊÆ¤ ð¤
·üƒƒd†ƒóö öÊÆ¤ “ƒ¤
¸$”ƒü"¤’„ó÷ ÷ÊÆ¤ §„¤
¹$¬„Ä»ˆÊÆ»´»¤Úˆ<݈ÊÆºº
»ü½‰-ôɽÀc½üñ‰8ô‰øùú øôÉ ù c cˆ¢cµ
 `£c¬k `àB¤GS
ú“²¼ ø‰¼
½$ù‰± ÿ‰üòŠ/ôÉ¿Åc¿ü¨‹8«‹ûüý ûôÉ ü c cˆ¢cµ
 `£c¬k `àB¤GS
ý“²¾ ¯‹¾
¿$°‹± ¶‹ü–Œ+ôÉ´Òfðð
ð
ð|žg\¢gÒÔÖàôÌ3<ïÄŹ4<?úÄÆÚÓUÄÈðÓ4ZÄÉȸDbÂÄÊwÄÌ×|¤,ÄÍ•R¦ÄÎÉ™3ÄÏô¸ô(©,Mxzqkm[]KM:<|æ¿ÊÑÒÓÔ˜ üü<9 Returns a `LinesCodec` for splitting up data into lines.Á½ ú # NoteÁÔ úüÜ HE The returned `LinesCodec` will not have an upper bound on the lengthÁü©
IF of a buffered line. See the documentation for [`new_with_max_length`]Áü÷
C@ for information on why this could be a potential security risk.Á¿ úüÇ LI [`new_with_max_length`]: crate::codec::LinesCodec::new_with_max_length()ÁŸ ¿ÊÐÐ
Ñü†5üÀ
<9 Returns a `LinesCodec` with a maximum line length limit.Áúü‰?< If this is set, calls to `LinesCodec::decode` will return aÁüÍNK [`LinesCodecError`] when a line exceeds the length limit. Subsequent callsÁü C@ will discard up to `limit` bytes from that line until a newlineÁüèHE character is reached, returning `None` until the line over the limitÁüµFC has been fully discarded. After that point, calls to `decode` willÁ¼€ function as normal.ÁœúÉî
³úü»KH Setting a length limit is highly recommended for any `LinesCodec` whichÁü‹IF will be exposed to untrusted input. Otherwise, the size of the bufferÁüÙLI that holds the line currently being read is unbounded. An attacker couldÁüªIF exploit this unbounded buffer by sending an unbounded amount of inputÁüøFC without any `\n` characters, causing unbounded memory consumption.ÁÃúüË63 [`LinesCodecError`]: crate::codec::LinesCodecErrorÁœ¿ÊÐÐ
ÒØKT¡üÏ!ü 2/ Returns the maximum line length when decoding.Á×ú¯œë use std::usize;Áüƒ&Ïž®úü¶" let codec = LinesCodec::new();ÁüÝ/, assert_eq!(codec.max_length(), usize::MAX);Á<¯<¯ü©&ÏžÔúüÜ52 let codec = LinesCodec::new_with_max_length(256);Áü–(% assert_eq!(codec.max_length(), 256);Á¯þ þ¿ÊÐ áÐ
Óü”.$—Äÿ ÿƒÑÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ÿÞÌ ¡
Ô¬kœîÔÄŸÕÜŸÕùŸÕÕÔÕÅÏÅÏ Utf8ErrorÁÆÏ valid_up_toÁ¯vÇÏ error_lenÁ¯vlÅooÛÜ èÞÌüÃ-¼ÆÄ ƒÑÁ‚  á
Ö¾ ÞÜÒ¿ÊØÙÚÛðñòóÛÚ××úHúHßûHÁ‘4Ý­f‰úM÷,‘×׉Ìü¯S ¿Ê ¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙºƒ ‰Ì× ¹×
Ú¬kÄüË1WTÎ1ƒ ƒ¿Ê ¾¹Ä„ × Ù1×
Û$Þ1¬kä1üä6:¥ÝÝÂü é6àçºT“7¿ÊÞßüýß,.T¥7,ª7Ü܉ÌüÈ7P4Ë7 ¿Êçº ¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
‰ÌÜ Ò7Ü
ßçº$×7š$Ý7¬kæ7Ü·9¿Êá´á¤Ù9<Ü9¿Êàà
áüï;%‰ÌãÅcãü›<8ž<ˆ ‰Ì ˆ c cˆ¢cµ
 `£c¬k `àB¤GS
“²â ¢<â
ã$£<± ©<ü“>(‰ÌåëåüÂ>($Å>Þ̉Ìää
å° Ê>ü•?*‰ÌŒ·g÷ÿúÿ¼êgœîgÒ÷øüÌ3< ïêë¹4<? úêìÚÓU êîðÓ4Z êïÜ·,b ÃêðȸDi Âêñ~ êó׃ ¤,êô•Rˆ ¦êõÉŒ ™3êöô Îô( ¿,M ¯±Ÿ¡Ž}x pr`bOQ>@ü“$ ¼™ ê ƒÑüÅ$ ¼Ë ê ´… žÍúûüüÕS ü¢D A Returns a `AnyDelimiterCodec` for splitting up data into chunks.Áë ú Éî
 úüŠO L The returned `AnyDelimiterCodec` will not have an upper bound on the lengthÁüÞJ G of a buffered chunk. See the documentation for [`new_with_max_length`]Áü­C Žð
õ úüýS P [`new_with_max_length`]: crate::codec::AnyDelimiterCodec::new_with_max_length()ÁÜ ªBªBö­B¬k÷<®B÷<9)
-ÜnLוû’ žÍùù
úåW|à üW|ú ü÷ˆ ü÷D A Returns a `AnyDelimiterCodec` with a maximum chunk length limit.ÁÀ úüÈF C If this is set, calls to `AnyDelimiterCodec::decode` will return aÁü“V S [`AnyDelimiterCodecError`] when a chunk exceeds the length limit. Subsequent callsÁüîF C will discard up to `limit` bytes from that chunk until a delimiterÁü¹M J character is reached, returning `None` until the delimiter over the limitÁü‹F ‡õ
¼Ö Öõ
ò ú Éî
 úü‘R O Setting a length limit is highly recommended for any `AnyDelimiterCodec` whichÁüèI ñö
ü¶M J that holds the chunk currently being read is unbounded. An attacker couldÁüˆI šø
üÖK H without any delimiter characters, causing unbounded memory consumption.Á¦ úü®D A [`AnyDelimiterCodecError`]: crate::codec::AnyDelimiterCodecErrorÁœþ û’ û’ žÍùù
ûåW| üW|½ ØKTß üž&! ü’"3 0 Returns the maximum chunk length when decoding.ÁÊ" ú<Ò" ¯œÞ" Ÿû
üö"- * use tokio_util::codec::AnyDelimiterCodec;Á¨# úü°#H E let codec = AnyDelimiterCodec::new(b",;\n".to_vec(), b";".to_vec());Áüý#/ ‚ü
<±$ ¯<½$ ¯üÉ$- ¢› û$ úüƒ%] Z let codec = AnyDelimiterCodec::new_with_max_length(b",;\n".to_vec(), b";".to_vec(), 256);Áüå%( ®ý
<& ¯T¥& Š ŠžÍù °& ù
ü$±& üã&" žÍþÿðñòóLŒ' $' ýýÒ¸T£' ,¨' ýý€ÏüÍ'Y 4Ð' Œ žÍ Œ¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÒ¸€Ïý ×' ý
$Ü' ¬kâ' Ÿ+ ÄŸÜŸùŸ  û’ üü;] Tÿ; Ž žÍ ޾¹í  ý Š< ý
$< ¬k•< ü…@A ¥Âü Š@ T»@ žÍüý"$TÍ@ ,Ò@ ƒƒ€Ïü÷@X 4ú@  žÍçº ¾¹Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
€Ïƒ A ƒ
çº$†A äg,ŒA ¬kA ü¡C" žÍˆ´ˆ¤ÊC <ÍC žÍ
ˆüÏF, €ÏŠÅcŠü‚G8 …G  €Ï  c cˆ¢cµ
 `£c¬k `àB¤GS
“² ‰G 
Š$ŠG ± G ü©I/ €ÏŒëŒüßI/ $âI ÞÌ€Ï
Œ° çI üÀJ1 €ÏÌ‹hjn`d °ü}U
R A simple [`Decoder`] and [`Encoder`] implementation that just ships bytes around.ÁÓ
úü×&
ø˜üþ&
˜¥
ú
ðÖ·
úü»Q
N Turn an [`AsyncRead`] into a stream of `Result<`[`BytesMut`]`, `[`Error`]`>`.Á
úü‘'
 ƒü¹!
‹‘
ìÛ
 [`Error`]: std::io::ErrorÁù
ú
¯”…
 # mod hidden {Áô˜
 # #[allow(unused_imports)]ÁÄ·
Âç
ößìØ
 use tokio::io::AsyncRead;Áüö4
1 use tokio_util::codec::{FramedRead, BytesCodec};Á«
ú”¯
 # enum File {}ÁŒÂ
 # impl File {ÁüÔP
M # async fn open(_name: &str) -> Result<impl AsyncRead, std::io::Error> {矴"
 # use std::io::Cursor;ÁüÈ5
2 # Ok(Cursor::new(vec![0, 1, 2, 3, 4, 5]))Á
 # }Á
öß,
¡ºü˜/
œÙüÈ5
2 # async fn main() -> Result<(), std::io::Error> {Áüþ:
7 let my_async_read = File::open("filename.txt").await?;Áü¹O
L let my_stream_of_bytes = FramedRead::new(my_async_read, BytesCodec::new());Ád‰
áß<
öß
¯¦
ú7T
‘·¹ÞÍÁ•î0‘· °6Ó‘·

Ó ³
Y‘·(
¹

Z‘·04Z‘·ÙOQ ‘·‘·
¹

œ(À
[‘·Àc"$ ‘·  c cˆ¢cµ
 `£c¬k `àB¤GS
“²˜À
˜
űËÇ
\‘·"(=˜ ˜‘·šÇ
š
‡HË
]‘·]‘·ž·ßž79š ‘· š‘·Ë

ž¹
šÖ
^‘· » "$œ ‘· œ‘·¿ßÀßÁßLessÁÂßÃßÄß~Å߯ßÇßGreaterÁÈßåºÝÈnûê7ŸÖ
Ÿ
 à¹
æPÛ
_‘·¢ïߢ#%ž ‘· ž‘·Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ…º ¡Û
¡
¢Ç¹
Í ç
`‘·¤e¤"$Ÿ  Ÿ‘·  ù£ù¥¥ç
£Íì¹½ ¢e¹½ ¥
¤¹½ ³º¹»½8í
a‘·§´§"$‘·¦¦
§ÜÍ9Lßô»ZÔn°—Nêb©ª«¬¤ïú¨¨ä‰\”¨¨Ü«¨¨¾¹ą̈¨(Åbô»®Àc®"$¡¢£ ¡ô» ¢ c cˆ¢cµ
 `£c¬k `àB¤GS
£“²­Å­
®Å±ËÔð:D‚ɼ§R8µ¥¥ °±Ô‘¯¯ô»ä±¯¯“½8æcɼ³´³"$ɼ²²
³ä—müçjGD `FramedParts` contains an export of the data of a Framed transport.Áü¯kHE It can be used to construct a new [`Framed`] with a different codec.Áüøk<9 It contains all current buffers and the inner transport.Áµlúü¹l$Þ I\¢m¥µ¦µÂü ®mµ€ ±mÀÁÖ"#òE·¸¹º».035Lÿmüºm@= The inner transport used to read bytes to and write bytes toÁƒn´´çºd¡nln
The codecÁ,¥n´´íº´çnü´n.+ The buffer with read but unprocessed data.ÁDën´´¾¹¼Æoü„o=: A buffer with unprocessed data which are not written yet.ÁLÊo´´¾¹¤×p,âp´´( çld¥½¦¾½¾ÂüÞµ€ÝÁ ®mÂÈ ±mÀÁ¿Àc¿  ~¤¥¦ ¤ÀÁ ¥ c cˆ¢cµ
 `£c¬k `àB¤GS
¦“²¼ çl¼
¿çºíº+±2”›uü—q74 Configure length delimited `LengthDelimitedCodec`s.ÁÏqúüÓqKH `Builder` enables constructing configured length delimited codecs. NoteÁüŸrPM that not all configuration settings apply to both encoding and decoding. SeeÁüðr;8 the documentation for specific methods for more detail.Á¬súü°sSP Note that the if the value of [`Builder::max_frame_length`] becomes larger thanÁü„tTQ what can actually fit in [`Builder::length_field_length`], it will be clipped toÁüÙt# the maximum value that can fit.ÁL<¦uÊÆf\
ãv?,ÁÂÃÄÅÆ¤ÐulÐuóÀÀ¼ v„ vóÀÀÔûvœûvóÀÀÄâwŒâwóÀÀ¼þxDþxóÀÀ’ÒüÒy ÔÒyóÀÀ(!†ueÊÆÈÀcÈ"$§¨© §ÊÆ ¨ c cˆ¢cµ
 `£c¬k `àB¤GS
©“²Ç!†uÇ
ÈűË("u
fÊÆ04fÊÆËÙËOQª ªÊÆÊÆÊ"uÊ
Ëœ #”ugÊÆüº}üúzJG A codec for frames delimited by a frame head specifying their lengths.ÁÅ{úüÉ{OL This allows the consumer to work with entire frames without having to worryÁü™|+( about buffering or other framing logic.ÁÅ|úüÉ|52 See [module level] documentation for more detail.Áÿ|úôƒ} [module level]: index.htmlÁM¤Å}ÜÇú,QŸ—Æ…ÎÏ„ü}<ü}óÍÍÊÆ”¥~,¥~óÍͨÈ($«}hÜÇÑÀcÑ"$«¬­ «ÜÇ ¬ c cˆ¢cµ
 `£c¬k `àB¤GS
­“²Ð$«}Ð
ÑűË(%²}iÜÇÓÙÓ"$® ®ÜÇÜÇÒ%²}Ò
Óo„Ú~N\ß~ó¨È[9ìMºÎÆ™ÕÖ×ØÖØÙ¨È$ñ~NóÔÔ¨ÈóÔÔ¨ÈNóÔÔ
Øó¨ÈÔÔýÛ ,€óÔÔ(&Å~j¨ÈÛÀcÛ"$¯°± ¯¨È ° c cˆ¢cµ
 `£c¬k `àB¤GS
±“²Ú&Å~Ú
ÛűË('Ì~
k¨È04k¨ÈÞÙÞOQ² ²¨È¨ÈÝ'Ì~Ý
Þœ (Ó~l¨È¬¾üŒWT A simple [`Decoder`] and [`Encoder`] implementation that splits up data into lines.ÁäúüèEB This uses the `\n` character as the line ending on all platforms.Á®úü²&ø˜üÙ&˜QTÉ¿ÊåØ`.óáâ㌽ÄààŒÑÄààœÎÄàà(.‰o¿ÊåÙå"$³ ³¿Ê¿Êä.‰ä
åo(/p¿ÊçÀcç"$´µ ´¿Ê µ c cˆ¢cµ
 `£c¬k `àB¤GS
“²æ/æ
çűË0—q¿Êéé"(=· ·¿Êè0—è
é‡H1›r¿Êr¿Êì·ßì79¸¹ ¸¿Ê ¹¿Êë1›ë
ì¹
šs¿Êî»î"$º» º¿Ê »¿Ê…º íí
î¹
‡P3«t¿Êðïßð#%¼½ ¼¿Ê ½¿Êî» ïï
ð¹