rust#rustc 1.71.0 (8ede3aae2 2023-07-12)p,xB7L-4c3ff48df34f5f95z-=1VYc-c7cd577a60a88eb7rustc_std_workspace_corefΝf,ޚsu-ba6f8b8bb8f76d1dV    unwrap_u8 "" &ConstantTimeEq(ct_eq(ct_ne ++ .generate_integer_equal 1ConditionallySelectable3conditional_select3conditional_assign3conditional_swap to_signed_int#generate_integer_conditional_select 9;ConditionallyNegatable=conditional_negate??'a?CCFFFF F Funwrap_or_elseLFFis_someFis_noneFPUPFSSFor_elseVXX[[ConstantTimeGreater^ct_gt!generate_unsigned_integer_greateraConstantTimeLesscct_ltiChoicek k oqsuw y!{"}#$%&'()*+,-.CtOptionvalue/012345777!7)7)7*7*7-7-7/7/72727474757576767:7:7<7<7>7B7I7N7O7Z7Z7]7]7_7_7b7b7d7d7j7j7p7r7r7r7t7t7v7v7x7x7z7z7|7|7~7~777777777777777777777777777777777777777777777777777777777777777777777(c3=^}[.ks1{uy+ wihfgeX9;k?akqkkok&kC k"kkkknk(c@3 =:^G  ,,p,,kkl m  V, ,,,00/4000/4666  6665{556source55{ 77777777JJJ  %JJ kJ777N0/7H' /777777J7 7/inputH7N 8 8877777777JJJ JJ kJ788888M7N8 0/7H' / 8 8 88 8777J8  87 7/H8M 99999999JJJ JJ kJ999M0/9H' /999999J9 9/H9M : ::99999999JJJ JJ kJ9:::::L9M: 0/9H' /  : : :: :999J:  :9 9/H:L ;;;;;;;;JJJ JJ kJ<<;N0/;H' /;;;;;;J; ;/H;N < <<;;;;;;;;JJJ JJ kJ<=<==!==>JJJ JJ kJ>>$=?0/>H' /==== =J=/H=?JJJ JJ kJJ'HHHJHHQQQ )Q == ===  >==>JJJ JJ kJ>QQ*QJ=?$Q0/>H' /Q 7Q:QQ== =JQQ=/HQJX DYY Y Y YDYYYYJJJ  JY/Y[[[F[[[  ܻ ܻ ܻ   T  T  T  T > T  F[ F[  Y0 Y 3Zipa3b333a_len3iQNMMIterMMMMM_markerMnp>@@@ Y[  >AA[ AA[[[ [ [ )>[ E\ E\ E\\\J2/J2J /J[03[[[\E\ E[c\J kJYY\ T  T 8  >T CT  T  T һ7T CT T %T  T  T  >%T  %T !%T "BB >BB > %T "%T !%T  T T T NT M> PhantomDatacKT)AT T T #ܻ+ܻ+ܻ#+>+T$ T% T% T > T%  T& T&8 $ &>T&CT T' T'һ7"$#'T'CTT%%T( T) T)#E%T,%T-%T.BB$,)>BB$( >,%T.%T-%T,T)T*T*$NT M>(*FT*T(T$#Y- Y 3?@@  Y[ @</F[F[ F[ E[cF[ F[J2 k/J2/\\\-4WX[E[c[6H'YAV>[TN>TTT UV>T8 >T8  ˸7 >T>7@B >%TAB)>΋C) :>B BJ: M:?:A: :C,:>: D :AV>[TN>TTTUV>T8>T8˸7>T>7!!@B>%TAB##)$>΋C)# :%>B B%J:&& M:'?:&A:( :(C,:))>:* D :)\9@@[VY,3@@!\,@,<,8@ƫ \,@,<8?F[LY3@@F[0/\H1' /1/4[ 0X  >WVWXDYVY [?F[?[@[ @[ ?F[ ;1AF[ ?F[E[cA[A[[[[ \YJ>T>T  TV TV TNonNullYw>%TE T>T Vܻ >BBE΋C) ?:>T>T TV TV TY%TE T>TZܻ>BB#E΋C)#Z?:&J2.W_rhsWXx[F[ ai[bi[HY TTT  addr8 77@B)! :! :"B:":" TT#T$\8&7!#7!'@B#))%- :&- :(.B:).:+.\, Ǫ\, >Y- >Y- @<. @</ Y0 /1H203W T > T >]]]]];;;;;;;;J JJ  JJ k J <]]= =  = = =   > = = > J JJ  JJ k J > ]]/\G;N]0/;H' /=?$]0/>H' /\\\]]];;;J== =J \ \; ;/H=/ H \Gp+ p+ p+ p+ qL H p+ p+ bbj  j jj# j bbbbb* bbcc  c cc c J JJ  JJ k J cct _`bp u+` qL1Hp +j`bjnj0/cH' /` _o``bbblbcc p+p+j J _`[`ybp +p +qLH qLH jjj j/H_)e(eeeee(eeeeeeee e p+p+p+p+qL H p+p+b b j jjj#  jb   b b b lb*    b b cc ccc cJ J J JJ kJ ce e eeeev d_te`bp u+` qL1Hp +j`bjnj0/cH' /d dzdoe(ezeoeeze`bbblbcc p+p+j J dd_`[` pb p +p +qLHqLHj jj j /H d+ + + + qL H + + bb   #  bbbblb* bbcc c  c cc  c c c JJJ JJ kJccx _`b u+` qL1H +`bn0/cH' /` _݃``bbblbccc ++ J _`[`pb + +qLH qLH  /H_,e(eeeee(eeeeeeee e ++++qL H ++b b  #  b   b b b lb*    b b ccc ccc cccJ J J JJ kJ ce e eeeez d_xe`b u+` qL1H +`bn0/cH' /d dҎd݃e(ee݃eee`bbblbccc ++ J dd_`[` pb  + +qLHqLH   /H d+ + + + qL H + + bb   #  bbbblb* bbcc c  c cc  c c c JJJ JJ kJcc| _`b u+` qL1H +`bn0/cH' /` _``bbblbccc ++ J _`[`pb + +qLH qLH  /H_,e(eeeee(eeeeeeee e ++++qL H ++b b  #  b   b b b lb*    b b ccc ccc cccJ J J JJ kJ ce e eeee~ d_|e`b u+` qL1H +`bn0/cH' /d ldde(eleeele`bbblbccc ++ J dd_`[` pb  + +qLHqLH   /H d+ + + + qL H + + bb   #  bbbb?lb* bbcc c  c cc  c c c JJJ JJ kJcc _`b u+` qL1H +`bn߰0/cH' /` _``bbblbccc ++ J _`[`pb + +qLH qLH  /H_,e(eeeee(eeeeeeee e ++++qL H ++b b  #  b   b b b ?lb*    b b ccc ccc cccJ J J JJ kJ ce e eeee d_e`b u+` qL1H +`bn߰0/cH' /d dde(eeeee`bbblbccc ++ J dd_`[` pb  + +qLHqLH   /H d+ + + + qL H + + bb   V#  bbbbVb* bbcc c  c cVc  c c c J J J JJ kJ cc _`b u+` qL1H +`bnXE3 Vh0/cH' /` V_`V`VbVbVbVbcVcVc V+V+V J  _`[`pb + +qLH qLH V /H _,e(eeeeVe(eeeeeVeee e ++++qL H ++b b  V#  b   b b b Vb*    b b ccc ccVc cccJ J J JJ kJ ce e eeee d_e`b u+` qL1H +`bnXE3 Vh0/cH ' / d Xdde(VeXeeVeXeV`VbVbVbVbcVcVc V+V+V J dd_`[` pb  + +qLHqLH V  / H dCi$i iii  i i i i  i i  i  i i$ii i i i iiii iii i j i  ie(eeeee(eeee eeeeep+ p+ p+!p+!qL H !p+!p+ bbj "j"jj#"j"bbbblb* bbcc ccccJ #J J #J J k#J #ceeeeeijj jj2 i\dvi_te`bp u+` qL1Hp +j`bjnj0/cH ' / $i Less~Greater8[8 iizi$zi izii i i i ziziiziiiiioe(ezeoeeze`bbblbcc p+p+j J iidd _`[`pbp +p +qLH qLH!jjj j/ H i\u-uuu-u 47u-vu5vv5u u 7u :uu7u-:uu uchoiceuu{{|||| | { { 57{|||  |  | | | || ||6{{k  {{{{7{ { :| | | | :||>{>{{t{{+*0*zт+ т+т  p+ p+ p+ p+ qL H  p+ p+    p + p + qL H p +  Ѐp/4 p u+qL1Hp +p s+qL1Hp +ooz+z*p+p+p + >>mask0p +p +qLH qLH p +p + qLH qLH Ѐ+*0*z+ +Ѕ ׅ ؅ ؅   ׅ     Ѕ   Dž   }/4   ƃ oу߃z+z*Ѕׅ؅ƃ у߃0+*0*z+ +  ˆ ˆ Lj Lj     Ɉ Ɉ   Ɉ ܈  Y/4  چʆz+z* ˆLj>>ʆ 0*0*zт+ т + + + + qL H  + +    +  + qL H  + Ѐp/4  u+qL1H + s+qL1H + zzzzz*zzz+z+z + >>0 + +qLH qLH  + +qLH qLHЀ*0*z+ Ѕׅ ؅ ؅   ׅ     Ѕ  Dž }/4   zƃ zу߃zz*zЅzׅz؅zƃ у߃0*0*z+   ˆ ˆ Lj Lj     Ɉ Ɉ  Ɉ ܈Y/4  چʆzz*zz zˆzLj>>ʆ0+*0*т+ т+т  + + + + qL H  + +     +  + qL H  +  Ѐp/4  u+qL1H + s+qL1H +݃݃+*++ + >>0 + +qLH qLH  + + qLH qLH Ѐ+*0*+ +Ѕ ׅ ؅ ؅   ׅ     Ѕ   Dž   }/4   ƃ ݃у߃+*Ѕׅ؅ƃ у߃0+*0*+ +  ˆ ˆ Lj Lj     Ɉ Ɉ   Ɉ ܈  Y/4  چ͘͘ʆ+* ˆLj>>ʆ 0*0*т+ т + + + + qL H  + +    +  + qL H  + Ѐp/4  u+qL1H + s+qL1H + ҎҎ*++ + >>0 + +qLH qLH  + +qLH qLHЀ*0*+ Ѕׅ ؅ ؅   ׅ     Ѕ  Dž }/4   ƃ Ҏу߃*Ѕׅ؅ƃ у߃0*0*+   ˆ ˆ Lj Lj     Ɉ Ɉ  Ɉ ܈Y/4  چŪŪʆ* ˆLj>>ʆ0"+"*"""0""*l"т"+ "т"+"т" " + + + + qL H  + + "  "  +  + qL H  + " ""Ѐ"p/4"  u+"qL1H + s+"qL1H +"""""l"+l"*""""++ + >">"""0 + +qLH qLH  + + qLH qLH "Ѐ"+"*"""0""*l""+ ""+""Ѕ "ׅ "؅ "؅ " " "ׅ   " " "Ѕ  " "Dž  " """}/4"  " "ƃ "у"߃"l"+l"*"""Ѕ"ׅ"؅""ƃ "у"߃"0""+"*"""0""*l""+ ""+""  "ˆ "ˆ "Lj "Lj "    "Ɉ "Ɉ "  "Ɉ "܈ " """"Y/4"  "چּ"ּ""ʆ"l"+l"*"""" "ˆ"Lj>">""ʆ"" 0""*"""0""*l"т"+ "т"" + + + + qL H  + + " "  +  + qL H  + """Ѐ"p/4"  u+"qL1H + s+"qL1H + l""""l"l"*""l"l"l+l+l + >">"""0 + +qLH qLH  + +qLH qLH"Ѐ"*"""0""*l""+ ""Ѕ"ׅ "؅ "؅ " " "ׅ   " " "Ѕ " "Dž """"}/4"  " l"ƃ "у"߃l"l"*""l"Ѕl"ׅl"؅l""ƃ "у"߃"0""*"""0""*l""+ ""  "ˆ "ˆ "Lj "Lj "    "Ɉ "Ɉ " "Ɉ "܈"""""Y/4"  "چ"""ʆl"l"*""l"l" l"ˆl"Lj>">""ʆ""0")+)*)))0))*)т)+ )т)+)т) ) + + + + qL H  + + )  )  +  + qL H  + ) ))Ѐ)p/4)  u+)qL1H + s+)qL1H +))))))+)*))))++ + >)>)))0 + +qLH qLH  + + qLH qLH )Ѐ)+)*)))0))*))+ ))+))Ѕ )ׅ )؅ )؅ ) ) )ׅ   ) ) )Ѕ  ) )Dž  ) )))}/4)  ) )ƃ )у)߃))+)*)))Ѕ)ׅ)؅))ƃ )у)߃)0))+)*)))0))*))+ ))+))  )ˆ )ˆ )Lj )Lj )    )Ɉ )Ɉ )  )Ɉ )܈ ) ))))Y/4)  )چ)))ʆ))+)*)))) )ˆ)Lj>)>))ʆ)) 0))*)))0))*)т)+ )т)) + + + + qL H  + + ) )  +  + qL H  + )))Ѐ)p/4)  u+)qL1H + s+)qL1H + ))))))*))))++ + >)>)))0 + +qLH qLH  + +qLH qLH)Ѐ)*)))0))*))+ ))Ѕ)ׅ )؅ )؅ ) ) )ׅ   ) ) )Ѕ ) )Dž ))))}/4)  ) )ƃ )у)߃))*)))Ѕ)ׅ)؅))ƃ )у)߃)0))*)))0))*))+ ))  )ˆ )ˆ )Lj )Lj )    )Ɉ )Ɉ ) )Ɉ )܈)))))Y/4)  )چ)))ʆ))*)))) )ˆ)Lj>)>))ʆ))0)'**+ *    0  *  zт +  т + т  p+p+p+p+qL Hp+p+ p +p +qL H p + *2 k<Ѐ*p/4 p u+qL1Hp +p s+qL1Hp +ɑӑݑ*ooz+z*p+p+p +>ɑ>ӑݑ>>0 p +p +qLHqLHp +p + qLHqLH    A ܜ Ĝ*ɜ 5>ɜ%BZ  >ƛ ћ>A Ĝ*Aܜ ƛ ћself_neg0ҥ0ҥ>0ҥ0ҥ >0ҥ00,0 >0000,p0,  S(j>0 0>0ҥA0ҥ000,0 22CtOption 2ҥ2ҥvalue2ҥ2ҥ>2ҥ G22is_some22 2 2  2 ފ22 G2222 22   X&7 דדؓ ˝<' F22 GGGDGDGDG DGDGbufD<4}t222ҥފ2ҥA2ҥ2ފ2 22222 H#H# 0H#H#    > >ݪ{H#ʫ >ݪ{ݫޫݫ>E۹<N> /4  ;1>ɪ > ݫ0L >Hخ >Į Į3 3 0ӱ3 3 3 I>o3  33o3 oJ 3 3  3  3  3  3    3 3 3  3 J 3! }NeMatch7|s3<4ٱٱٱI> Vٱ  444ڱ4߱    G   GGGDGDGDG DGDGD<4}t   G  C 4 G F formatterFH2-\g444  44 G4443< IpiecesDDDМj033}3  A 3}3 33 >I{33/4ɱ gF4ڱFN>oo3 o3 o3o3 J33 3 ޙ33} ;13<4ٱ4 V444ڱ 4߱ٱo3  Ý msgleft_val3 right_val3 3ޙ0[[{ٱ ٱٱٱI3ٱٱٱֱֱ3 3 I{o3 ֱ3 55055 5 J>o5 5 5 o5 oL 5  5  5  5  5  5     5  5  5   5  L 5 ! ޙ5 5  5 ]5 Ҡ  5 ]5 5 5  >ɳJe5 5 /4 >5o5o5 o5 L 5 5 5 ޙ5 5 ]5 o5 5 ̥5 5 ޙ0e5 5 Jeo5 5  >ɵ ɵ 6 4>6յܵK>Ѵ>״AA ɵ Ѵdef״    >  Ҹ6ҸҸ6Lҷ>A>A  ҷ N۹<۹<   == ===  >==>JJJ JJ kJ>O==?$ 0/>H' / == =J=/H=~    >   >   ~ ~   >   L   PǾH޾Կ   S(j޾ ؾ޾޾>~A > A   ؾ޾ Į Ǿqn      >   n n q qq        8  8 8 777 77 777JJJ J J kJ78 8  8   S8M7N8 0/7H' /ȿ ȿq>nA > A     8 8777J tmp8   8 7  7 /H   = =  = = =   > = = > J JJ  J, 4,J k J >  VnH=O> =?$ 0/>H' /   == =J=/ H 1>>111:  : : *      *+* 0*zт+ т+тp+p+ p+p+ qL Hp+p+p +p + qL H p +* 2 k  : : L >Z <:Ѐ*p/4 p u+qL1Hp +p s+qL1Hp +H>>1AA:  *ooz+z*p+p+p +>>>ɑ>ӑ ݑ> >  0p + p + qLHqLHp + p +qLHqLH  Į    &7 77777 77JJJ  J 77777777J J J JJ kJ7 >  >A J  kJ 7   = = = = =  > = => J J J J J kJ >  == ===  >==>JJJ J J kJ>777 77 777J JJ  JJ k J 7  9!9"9"9#9# 9!"#9#9"J$JJ !$JJ k$J$9! ]xX۹<N> ۹<N> 7N0/7H' /7N&0/7H ' / =?$0/ > H ' / =?$0/>H' /7N 0/7H' /9M20/9H' /%&AA  777J777J = = = J == =J777J999J >>7 7/ H 7 7/ H = / H =/H7  7 /H9 9 /!H!6++f H +g +g +h! H g +666+ + f H  + g + g + h! H g + 6666l6O6 6 6  l6 O6  6 6 6 6 6     6 6 6 6 6 6 6  6 N6 N66666 66 6666l6Q666 l6Q6 66666  6666666 6P6P6666 66JJJ JJ kJ666666666666]+6f H+g s+6 h!-Hg +]+6f H + g t+6 h!-H g + H'66o6o66666l6Ol66 6l6l6666l6Ql66 6l6l666+g ++ g + J66gtb6ltb6pow6bit66+f Hg +g +h!H  h!H + f H g + g + h!H  h!H H67++f H + + +h! H  +777+ + f H  +  +  + h! H  + 7777l7T7 7 7  l7 T7  7 7 7 7 7     7 7 7 7 7 7 7  7 S7 S77777 77 7777l7V777 l7V7 77777  7777777 7U7 U77 777 7777JJJ JJ kJ777777777777]+7f H+ s+7 h!-H +]+7f H +  t+7 h!-H  + H'7 7݃7݃77777l7Tl77 7l7l7777l7Vl77 7l7l777 7+ ++  + J77ۅ77777+f H + +h!H  h!H + f H  +  + h!H  h!H H78++f H + + +h! H  +888+ + f H  +  +  + h! H  + 8888l8Y8 8 8   l8 Y8  8 8 8 8 8     8 8 8 8 8 8 8  8 X8 X88888 88 8888l8[888  l8[8 88888  8888888 8Z8 Z88 888 8888JJJ JJ kJ888888888888]+8f H+ s+8 h!-H +]+8f H +  t+8 h!-H  + H'8 8888888l8Yl88 8l8l8888l8[l88 8l8l888 8+ ++  + J88ۅ88888+f H + +h!H  h!H + f H  +  + h!H  h!H H89++f H + + +h! H  +999+ + f H  +  +  + h! H  + 9999l9^9 9 9  @l9 ^9  9 9 9 9 9     9 9 9 9 9 9 9  9 ]9 ]99999 99 9999l9`999 @l9`9 99999  9999999 9_9 _99 999 9999JJJ JJ kJ999999999999]+9f H+ s+9 h!-H +]+9f H +  t+9 h!-H  + H'9 9999999l9^l99 9l9l9999l9`l99 9l9l999 9+ ++  + J99ۅ99999+f H + +h!H  h!H + f H  +  + h!H  h!H H9           z           z       _bhEzz    zzo o  >>  _7 == = = =   > ==>J JJ  J = =  = = =   > = = > JJJ  JJ k J >7 J kJ> 77777777J J J JJ kJ 7d _=?$0/>H' /=?$0/>H' /7N'0/7H' /::== =J== =J777J  =/H=/ H 7 7/H _           z           z       djhEzz    zzo o  >> , k,l,,,,, k,l,,,,   0https://doc.dalek.rs/assets/dalek-logo-clear.png2K  https://docs.rs/subtle/2.5.07 # subtle [![](https://img.shields.io/crates/v/subtle.svg)](https://crates.io/crates/subtle) [![](https://img.shields.io/badge/dynamic/json.svg?label=docs&uri=https%3A%2F%2Fcrates.io%2Fapi%2Fv1%2Fcrates%2Fsubtle%2Fversions&query=%24.versions%5B0%5D.num&colorB=4F74A6)](https://doc.dalek.rs/subtle) [![](https://travis-ci.org/dalek-cryptography/subtle.svg?branch=master)](https://travis-ci.org/dalek-cryptography/subtle)T **Pure-Rust traits and utilities for constant-time cryptographic implementations.**WJ It consists of a `Choice` type, and a collection of traits using `Choice`MP instead of `bool` which are intended to execute in constant-time. The `Choice`S9 type is a wrapper around a `u8` that holds a `0` or `1`. <  ```toml  subtle = "2.5"  ```  G This crate represents a “best-effort” attempt, since side-channels J= are ultimately a property of a deployed cryptographic system @9 including the hardware it runs on, not just of software. < K The traits are implemented using bitwise operations, and should execute in NL constant time provided that a) the bitwise operations are constant-time and OM b) the bitwise operations are not recognized as a conditional assignment and P optimized back into a branch. ! L For a compiler to recognize that bitwise operations represent a conditional OM assignment, it needs to know that the value used to generate the bitmasks isPG really a boolean `i1` rather than an `i8` byte value. In an attempt toJK prevent this refinement, the crate tries to hide the value of a `Choice`'sNL inner `u8` by passing it through a volatile read. For more information, seeO the _About_ section below.I Rust versions from 1.66 or higher support a new best-effort optimizationLK barrier ([`core::hint::black_box`]). To use the new optimization barrier,N* enable the `core_hint_black_box` feature.-N Rust versions from 1.51 or higher have const generics support. You may enableQR `const-generics` feautre to have `subtle` traits implemented for arrays `[T; N]`.UN Versions prior to `2.2` recommended use of the `nightly` feature to enable anQH optimization barrier; this is not required in versions `2.2` and above.KM Note: the `subtle` crate contains `debug_assert`s to check invariants duringPL debug builds. These invariant checks involve secret-dependent branches, andOL are not present when compiled in release mode. This crate is intended to beO used in release mode. ## Documentation) Documentation is available [here][docs].," ## Minimum Supported Rust Version% Rust **1.41** or higher.l Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump.o ## About N This library aims to be the Rust equivalent of Go’s `crypto/subtle` module.QL Old versions of the optimization barrier in `impl From for Choice` wereOK based on Tim Maclean's [work on `rust-timing-shield`][rust-timing-shield],NG which attempts to provide a more comprehensive approach for preventingJ% software side-channels in Rust code.(O From version `2.2`, it was based on Diane Hosfelt and Amber Sprenkels' work onRN "Secret Types in Rust". Version `2.5` adds the `core_hint_black_box` feature,QN which uses the original method through the [`core::hint::black_box`] functionQ from the Rust standard library.#C `subtle` is authored by isis agora lovecruft and Henry de Valence.F ## WarningO This code is a low-level library, intended for specific use-cases implementingRI cryptographic protocols. It represents a best-effort attempt to protect LO against some software side-channels. Because side-channel resistance is not a RM property of software alone, but of software together with hardware, any such!P! effort is fundamentally limited."$" **USE AT YOUR OWN RISK**"" [docs]: https://docs.rs/subtle""Q [`core::hint::black_box`]: https://doc.rust-lang.org/core/hint/fn.black_box.html"T] [rust-timing-shield]: https://www.chosenplaintext.ca/open-source/rust-timing-shield/security#`$ $$U$$% % %%% % %%% % %%%%%%, /; Unwrap the `Choice` wrapper to reveal the underlying `u8`.->- # Note- -C This function only exists as an **escape hatch** for the rare case-F< where it's not possible to use one of the `subtle`-provided.? trait impls../N **To convert a `Choice` to a `bool`, use the `From` implementation instead.**/Q/ 0 05A Convert the `Choice` wrapper into a `bool`, depending on whether0D( the underlying `u8` was a `0` or a `1`.1+11 1I This function exists to avoid having higher-level cryptographic protocol1L* implementations duplicating this pattern.2-2? The intended use case for this conversion is at the _end_ of a2BH higher-level primitive implementation: for example, in checking a keyed3KI MAC, where the verification should happen in constant-time (and thus use4L@ a `Choice`) but it is safe to return a `bool` at the end of the4C verification.55 66 67&7 78(8 8 88 99%9 9:': : :; ;;&; <<(<  < !== =""=="" $CBBBC BBC BBcore_hint_black_boxBB,C HHH&& 'LA An `Eq`-like trait that produces a `Choice` instead of a `bool`.JDK # ExampleK KK use subtle::ConstantTimeEq;K let x: u8 = 5;K let y: u8 = 13;KK( assert_eq!(x.ct_eq(&y).unwrap_u8(), 0);K+( assert_eq!(x.ct_eq(&x).unwrap_u8(), 1);L+LL((N(" Determine if two items are equal.L%M6 The `ct_eq` function should execute in constant time.M9M # ReturnsM M$ * `Choice(1u8)` if `self == other`;M'$ * `Choice(0u8)` if `self != other`.N'N(N(7Q'& Determine if two items are NOT equal.O)O6 The `ct_ne` function should execute in constant time.O9PP P$ * `Choice(0u8)` if `self == other`;P'$ * `Choice(1u8)` if `self != other`.P'Q(Q( *7Q.,,>Q(>QVQQW%> Check whether two slices of `ConstantTimeEq` types are equal.RARR R@ This function short-circuits if the lengths of the input slicesRCA are different. Otherwise, it should execute in time independentSD of the slice contents.TTK Since arrays coerce to slices, this function works with fixed-size arrays:TNUU # use subtle::ConstantTimeEq;U! #U$ let a: [u8; 8] = [0,1,2,3,4,5,6,7];U'$ let b: [u8; 8] = [0,1,2,3,0,1,2,3];U'V let a_eq_a = a.ct_eq(&a);V let a_eq_b = a.ct_eq(&b);VV# assert_eq!(a_eq_a.unwrap_u8(), 1);V&# assert_eq!(a_eq_b.unwrap_u8(), 0);W&WW+W+ ->\\'\.\. /^#^h%H `Ordering` is `#[repr(i8)]` making it possible to leverage `i8::ct_eq`.hKi'i1i1 2k'= A type which can be conditionally selected in constant time.j@j@ This trait also provides generic implementations of conditionaljC" assignment and conditional swaps.k%k337kkpB) Select `a` or `b` according to `choice`.k,ll l * `a` if `choice == Choice(0)`;l# * `b` if `choice == Choice(1)`.l#m/ This function should execute in constant time.m2mm mm% use subtle::ConditionallySelectable;n(n # fn main() {n let x: u8 = 13;n let y: u8 = 42;nn2 let z = u8::conditional_select(&x, &y, 0.into());o5 assert_eq!(z, x);o2 let z = u8::conditional_select(&x, &y, 1.into());o5 assert_eq!(z, y);p # }ppp3p3u>? Conditionally assign `other` to `self`, according to `choice`.qBqq2rr rrr(rȭs let mut x: u8 = 13;s let mut y: u8 = 42;ss$ x.conditional_assign(&y, 0.into());s' assert_eq!(x, 13);t$ x.conditional_assign(&y, 1.into());t' assert_eq!(x, 42);tݯttu3u3{?C Conditionally swap `self` and `other` if `choice == 1`; otherwise,vF reassign both unto themselves.v"ww2ww www(xȭxxxx0 u8::conditional_swap(&mut x, &mut y, 0.into());y3y assert_eq!(y, 42);y0 u8::conditional_swap(&mut x, &mut y, 1.into());y3z assert_eq!(y, 13);zݯzz{3{3 67|| 0#.# `Ordering` is `#[repr(i8)]` where:&؋ - `Less` => -1܋ - `Equal` => 0 - `Greater` => 1J Given this, it's possible to operate on orderings as if they're integers,M= which allows leveraging conditional masking for predication.@ߍA99 :'A;̑; < < A type which can be conditionally negated in constant time.? A A generic implementation of `ConditionallyNegatable` is providedDA for types `T` which are `ConditionallySelectable` and have `Neg`ϗD implemented on `&T`.==1< Negate `self` if `choice == Choice(1)`; otherwise, leave itԘ? unchanged.2== >7$@@A A>> 3>ߚA>0?ƛ? B>'DDՓ)L Convert the `CtOption` wrapper into an `Option`, depending on whetherOE the underlying `is_some` `Choice` was a `0` or a `1` once unwrapped.Hç˧ ڧN This function exists to avoid ending up with ugly, verbose and/or bad handledQN conversions from the `CtOption` wraps to an `Option` or `Result`.QN This implementation doesn't intend to be constant-time nor try to protect theQ= leakage of the `T` since the `Option` will do it anyways.@CC E>GG4? This method is used to construct a new `CtOption` and takesB< a value of type `T`, and a `Choice` that determines whetherì?< the optional value should be `Some` or not. If `is_some` is?= false, the value will still be stored but its value is never˭@ exposed. FF H>#9 Returns the contained value, consuming the `self` value.Ư< # Panics D Panics if the value is none with a custom panic message provided byG `msg`. FF I>3 This returns the underlying value but panics if it6 is not `Some`.FF J>Q2 This returns the underlying value if it is `Some`ϳ5! or the provided value otherwise.$Ǵ FF K>ҷq59 or the value produced by the provided closure otherwise.<ݶ= This operates in constant time, because the provided closure@ is always called.ٷFMMF   > L>۹1 Returns a true `Choice` if this value is `Some`.4FF N>1 Returns a true `Choice` if this value is `None`.4FF O>Ǿ~: Returns a `None` value if the option is `None`, otherwise=B returns a `CtOption` enclosing the value of the provided closure.E= The closure is given the enclosed value or, if the option is@4 `None`, it is provided a dummy value computed using7 `Default::default()`.ҽڽ@ξFQRQRF޾Ҿվ>޾ÿ P>޾ҾҾվվ=; returns the result of the provided closure. The closure is>9 given the enclosed value or, if the option is `None`, it<? is provided a dummy value computed using `Default::default()`.B@FTUTUFȿ S>޾~K Returns `self` if it contains a value, and otherwise returns the result ofN9 calling `f`. The provided function `f` is always called.<FWWF  V>HYYAXX Z>6\\,9 Two `CtOption`s are equal if they are both `Some` and<( their values are equal, or both `None`.+[[ ]>L A type which can be compared in some manner and be determined to be greaterO than another of the same type."^^(" Determine whether `self > other`.%I The bitwise-NOT of the return value of this function should be usable toL determine if `self <= other`.!2 B A `Choice` with a set bit if `self > other`, and with no set bitsE otherwise. ! use subtle::ConstantTimeGreater;$ let x_gt_y = x.ct_gt(&y);# assert_eq!(x_gt_y.unwrap_u8(), 0);& let y_gt_x = y.ct_gt(&x);# assert_eq!(y_gt_x.unwrap_u8(), 1);& let x_gt_x = x.ct_gt(&x);# assert_eq!(x_gt_x.unwrap_u8(), 0);&^^.!*'aa b@I A type which can be compared in some manner and be determined to be lessL"cc(7^7'" Determine whether `self < other`.%L determine if `self >= other`.!F A default implementation is provided and implemented for the unsignedI integer types.2 B A `Choice` with a set bit if `self < other`, and with no set bitsE  use subtle::ConstantTimeLess;! let x_lt_y = x.ct_lt(&y);# assert_eq!(x_lt_y.unwrap_u8(), 1);& let y_lt_x = y.ct_lt(&x);# assert_eq!(y_lt_x.unwrap_u8(), 0);& let x_lt_x = x.ct_lt(&x);# assert_eq!(x_lt_x.unwrap_u8(), 0);&cc d7''ii j,K The `Choice` struct represents a choice for use in conditional assignment.%N&M It is a wrapper around a `u8`, which should have the value either `1` (true)&P or `0` (false).''N The conversion from `u8` to `Choice` passes the value through an optimization'QN barrier, as a best-effort attempt to prevent the compiler from inferring that'QI the `Choice` value is a boolean. This strategy is based on Tim Maclean's(LN [work on `rust-timing-shield`][rust-timing-shield], which attempts to provide)QL a more comprehensive approach for preventing software side-channels in Rust)O code.* *M The `Choice` struct implements operators for AND, OR, XOR, and NOT, to allow*PB combining `Choice` values. These operations do not short-circuit.+E+ [rust-timing-shield]:+G https://www.chosenplaintext.ca/open-source/rust-timing-shield/security+J,Vlm,,kk l,,kk,,, ,,,, ,,,o,o p,,, ,,,q,q r__'_s_s tczd'dudu v__'_w_w xcd'dydy z__'_{_{ |cld'd}d} ~__'__ cd'dd _ V_'__ c Xd'dd  ЀAӀ >ƃ ?  zЀAӀ >ƃ ?  ЀAӀ >ƃ ?  ЀAӀ >ƃ ? " "ЀA"Ӏ" ">""ƃ "?"" " l"ЀA"Ӏ" ">""ƃ "?"" ) )ЀA)Ӏ) )>))ƃ )?)) ) )ЀA)Ӏ) )>))ƃ )?)) C The `CtOption` type represents an optional value similar to theF= [`Option`](core::option::Option) type but is intended for@ use in constant time APIs.? Any given `CtOption` is either `Some` or `None`, but unlikeB0 `Option` these variants are not exposed. The3@ [`is_some()`](CtOption::is_some) method is used to determine ifCB the value is `Some`, and [`unwrap_or()`](CtOption::unwrap_or) andߟE; [`unwrap_or_else()`](CtOption::unwrap_or_else) methods are>? provided to access the underlying value. The value can also beBA obtained with [`unwrap()`](CtOption::unwrap) but this will panicD if it is `None`.@ Functions that are intended to be constant time may not produceC@ valid results for all inputs, such as square root and inversionɢC@ operations in finite field arithmetic. Returning an `Option`CA from these functions makes it difficult for the caller to reasonѣD> about the result in constant time, and returning an incorrectA; value burdens the caller and increases the chance of bugs.ؤ>ɥS(jɥɥҥҥ>00004ɥ>0ɥɥ000 >11115ɥ>1ɥɥ22226ɥG>2ɥɥ222 >6 6'C Returns Choice::from(1) iff x > y, and Choice::from(0) iff x <= y.6F66 6> This algoritm would also work for signed integers if we first6A4 flip the top bit, e.g. `let x: u8 = x ^ 0x80`, etc.6766 7 7'7F77 77Aء7777 8 8'8F88 88Aء8788 9 9'9F99 99Aء9799 08:<NNQQWW\\iippuu{{֑̑ƛ,,,,_`dd_`dd_`dd_`dd_`ddƃ؃ƃ؃ƃ؃ƃ؃"""ƃ"؃"""""ƃ"؃"")))ƃ)؃)))))ƃ)؃))022266778899F*https://docs.rs/subtlehttps://crates.io/crates/subtle core::option> /https://travis-ci.org/dalek-cryptography/subtleCtOption::unwrap_orhttps://doc.dalek.rs/subtleCtOption::is_some5https://doc.rust-lang.org/core/hint/fn.black_box.htmlCtOption::unwrap_or_elseFhttps://www.chosenplaintext.ca/open-source/rust-timing-shield/securitycore::option::OptionڮCtOption::unwrap ڮ (3=^c88889%(3=^ckl$BitAnd$ BitAndAssign% BitOr% BitOrAssign%  BitXor% BitXorAssign%  Neg% Not% %p,7 7Gr,,777 7 7GGGDGDGDG DGDGD<4}t707 757 78 87 7 9 9: :7 7 ; ;!< <7 7 #$=C'H()*)*NN77 77 77QQ77 77 77(V-W[W77 7V 7V(/\ \77 7 7^f___ t_u__  ___ t_i__  ___ bit_width_ _ ___e _ _ __ __c___ _  _ __` _ _` `` `` ``  ``c ` [``` `` ` ` `a b pbbb bbbb [b b [bb wrapping_negb bb bbbb b b bbcccc pc ccc c cc c c  cc intoccc c c dd ddeddd d  d ddd d dd dd dd dd  ddeee e e ee ee eee eee e e ee ee(t_`77 7 7(zvdd77 7z 7z(x_`77 7 7(zdd77 7 7(|_`77 7 7(l~dd77 7l 7l(_`77 7 7(dd77 7 7(V_`77 7V 7V(Xdd77 7X 7X(2ii77 7 73456456>p>pp77 77 777uuu77 77 77 >{>{{77 77 77 |(||  |||| ||}}  }}}} }}}}  }}}} }}}}  }}}} }}}}  }}}~ }~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~           €   Ѐ Ӏ >   >         т       ̂͂Ђ΂ ς ӂւ ׂ؂ >    >  >    Ń ƃ ǃ ˃σ уփ ؃ ك݃ ߃                Dž ȅ ͅ Ѕ Յׅ ؅ م ޅ      ؆ >    >   ĆȆ ʆІ  ҆چ                 Ɉ ˆ >È ň Lj >Ȉʈ ܈ >݈ ߈   >   3>>77 7 7˃у߃77 7 7 >>ʆ77 7 7 3z>>77 7z 7zz˃у߃77 7z 7z >>ʆ77 7z 7z 3>>77 7 7˃у߃77 7 7 >>ʆ77 7 7 3>>77 7 7˃у߃77 7 7 >>ʆ77 7 7 3>">""77 7 7"˃"у"߃77 7 7 >">""ʆ77 7 7 3l>">""77 7l 7ll"˃"у"߃77 7l 7l >">""ʆ77 7l 7l 3>)>))77 7 7)˃)у)߃77 7 7 >)>))ʆ77 7 7 3>)>))77 7 7)˃)у)߃77 7 7 >)>))ʆ77 7 7 3:>>77 7 73<>ɑ>ӑݑ77 7 7=>>7 77 =>B˛ћ7 7> 7 7G2777 7 7GGGDGDGDG DGDGD<4}t7ՓEՓHIJKLNOPSV Į>7 7>>Ѵ߲״>>>7 77 7ؾ޾ȿȿ3Z>>77 7 7(] 77 7 7^__77 77 77           #F## ##A#ء7           6  ۅ                &               ۅ        &                    ^6677 7 7^7777 7 7^8877 7 7^9977 7 7^b77 7 7cdd77 77 77cccccj77 7 7Pz_×~.8!ːLޖCcNH|!Kk:5'uSka6tK}KCCD(\ DKs  TS Z8-lKO%V{hX@~!m}-Ka,NI?S$!VZgF¦@̰Kԑ }d8{E}uyHlH-G ISO4y '߽QtRlPmCRW[Ln+ ~QVyS 5n L4'k@#eǃNI#?bG'EUČLh(`6xaG&ҏGHDɜpҸ!>:.OHV%~pKQ&۽UݼjuT. G',ۮI2DiqyUZHv 껟_i̪W97&XI&[!Ris+i,Y: ~ZHiqr=CR!cz\ޖ qA'!,Լ>e$)G;a;5lXHE8CUejR098vZq#Ol_@&!gd/A$]-i;pb>e헾h|0Ό_Xs  ? H;Qt1hDP s>R ˩L9;5Kbwgbz uDs~A4ScK¥Q'Lk/#{Wʌ Xo1huSSkaE\YZT|_NȷSq(_UKumNZ'(o2 Ihl DYzSx5DïKGRk[x>5lzHyI uYS̛ҫ('NzL_m] ZV ¡Bg9\4"ɯo4OŸJ@95K2Jf-B2~fo ;jTY5HR/k۞ef%' 5Xi YgSzcB`!P?$}lgܠjּgt8L&b%alj䡫O8Mkqfq]qxR!v)bBSW‘^-@v wb}TfGs_`adGv4)]E&5^ &2A<}%KCߎڦ8mz;,# %,-̓i'(v&Y?Ch?ҙ2)wHV767d`OaNd RS"Տb//';**?ܖVzlezoGaVou3x`,F_ױoqhؙO0zl ut0MIHԯ,h2&O4QSvk zk9T.byӍ9_wA$*u)"^ (U$bKƶ=m~ [YME~9y RoЇ=oK8bd (8hn4>uʨ6MTyĀ6w֕БgG@K~ƺڹ\1_ Q,fT. l13hRWUP0t*[OjnfR0Ӆ:O)q(@TS .<șABQ"Zφ`@Yc}tl5pJ F,]KHrE/bv (ݏY%C88#9Slx,g4%/q8aG<{]pTaцtcW 0Jwf.[{EfY8)x)cjN: IdddɌ(_U~ R݌CHAk!~A&ytJ0WV1 /UD3D EE HHHI)IZInIIIII J(JSJgJJJJJKKK aMNO(PeSySSS!TRTaU(XZC\Q\`\]]]2^_9``a[a ccle}f gg$iijxl\noopfpqq AuQuguu`v#zz0zEzZzpzz~ @s Ocۀ!5g{=QЂS׃F[ɄMх?wÆ2G~9pԍˎGÏNc' <;DqOwܝʞW0 =<~el=˥Y0x$ %U] W      %%%         %!    CEHHH=ItIIIJnUnpoooopHp_pqq:uJu`uuYvyz)z>zSzizz~~:mH]Ԁ/`u6KȂނLЃ>T„F}ʅ8o*@w2i͍ rĎ)@ F\%-5=EMU]emu}Ɠϓؓ )2;DMV_hqz”ʔҔڔ "*2:CLU^gpyʕӕܕ $-6?HQZclu~Ɩϖؖ )2;DMCCCCCCCCCCCCDD!DEEHHHHI)I\InIIIII J(JUJgJJJJrKKK>MhNOOP0SgSySST!T"UWY\C\Q\]]]]a_`;````aDaccc;eEffwg|h ibii|kIl`lm.nEnnwoooopOppq uAuSuguvyzz2zGz\zpz~~~.as Qc݀#5i{?Q҂S׃H[ɄMх?yÆ4G~9ppԍ8y0kÏPP#+3;CKS[cks{ē͓֓ߓ '09BKT]foxȔДؔ (08AJS\enwȕѕڕ"+4=FOXajs|Ė͖֖ߖ '09BKT)DEEHHHIILIdI}IIIIJJEJ]JJJJJKKKWMNOOPTSoSSTDT;UX Z2\]]]#^{_'`P``a-aQacccZekffghiiikVlmlm;nRn'oooop-p\pqq3u[uuvyz%z:zOzdzz~~6i@Ỳ+Xq,Guڂ Byƃ4P <sƅ.e <mۇ(_ʍO= <Xّv#DEEHHHHI>I^IuIIIIIJ=JWJ|JJJJKKKEM~NOOPFSiSST6T)U XY$\]]]^i_`=```aKacccRe\ffghiyiikPlglm5nLno~oooopVppq$uUu}u vy zz4zIz^zz~~~0c 2Sx߀%JkցAfԂ2i$Jq߄,cU{ن6]ˇOyčݍ:7mڏ,RɑfYMOU}_qAv+DEEHHH I!IPIfIIIIIJ JIJ_JJJJJKKKNO PXSqSSTHTX Z6\]]]'^+``a:acc^eoffghij3lneoopEp q7u]uuyz'zr-d o& AZޑ{EHH>III=J|JJKK}NOESS6T XY#\]^``cQe[ffghxiikmoop#u}uyz~~2xJցf2i$q߄,cUن]ˇOxُ,ɑfM{ǜ(bɝNܞӧ0|ɨwȽ%Nnѿ ;\}QP~~uOݥ$kCID?޷:ٸ5Թ0Ϻ+zʻ&uż0r"lEHH/III.JmJJxKKnNO6SS'TWY\]^``cBeLff~ghiiikmoopunuywz~y#i;ǁW#ZރbЄT؅FʆN @wʏWh Emҝ}ĞQ^e7~ť S*r MUQ!P`SaciXlol=nTnoo^p̍? # m!W0hq@rd@y@LXrvfTCHwM]SW]bWt$xz}?I)ӌGR2ܞPǧ[;YйX' ." l V04q?rVt??NqueS%*.V/ 9>CHvM\SW]bh#xz}>H(ҌFQ1۞OƧZ:XϹcWx& ;!ErQxݝ=˞§aX:Z޿(Ij>=m>̥Z2z*zɵ%uĶ pkfa \W'_Y21             )))44> 4)_d#))))))))))456456456456456456456456#____CDEHIZIIISJJKELSZahov}    % , 3 : A H O V ] d k r y ~ W/W/X/Z/\/^/`/b/d/e/e/e/e/e/e/e/h////////////////////W/W/e/e/e/e/e/e/e/e/e/e/k/n/q/t/w/z/}////////////////////////X%r%:7l511hJRR EMMlAIIl<Э8622llO\\ FMM=93lpljP\\ KWWBKK>ll744q "Q\\LWWGRRl5l )flR\\MWWHRRCMMl@lll4006lgNWWIRRDMM[c 6 assert_eq2H%R$crate::format_args3 fmt_internals\8C#i% core_intrinsicsderive_clone_copy ]"R8Xay29o~>@6bݕUt[#۲3+o7!2qSHi,%   dc\+ `4Kx9.vW/ 8E7ڼ<%/ 8|gf%^0>7Orv13O&/'R$k[ۖ":Պ78wumG  yiY_ɛ 'ݕPTU86ue6Rh Ep,2 fmt_helpers_for_deriveGG%p+ `8X뱑) `gG)ЖA Ӊ/ 8b)8'hf%^0RB$f"^0("#,)pmu6L~4Yp'aU8\0++pp2  GGE%#v5  sU9++,7o*J8h tm,G  7rBy+ `v&m,9Ćg/ 8imbgJ^0%0 f%^0\p[L6f&6M7R8W9\3I5KKhKLMxM"LLLhM4KKLtLL>MKKKbLLGMKzKK`KKR ]4>uhDP s\(o2 Iq@Yc}-BZV i'(v ؏}S .X@~!m*q"HAk!4wA$# %,-۟'q(@THrE/bv"I2Diq:E&5^¡V76-i;pUP_<z;,h?ҙAf?[CBʣDïuadGNH|!&XI&?tJ07cK¥c[Ln+%Mzy=O4y QCR!cDwZQRBd&SBSzk9T.bOHV%4WʌfBSW‘^+i,Y: A8vZqOA$]TL_}h(`6xa.b%alUejR0MI\k !a;5lXK[Ojnɯo4Ό_Xs Yk[x>5xq]qxRlzyVEjxdE'|tb}TY}c_i̪=VzlaG<{]('!,G8)x)c.ABQ"ZB`!uZLmǮtK CD(\ 0Jw+ rʥՏb/!ːLS$!̰Kԑ }aE\jfR0%C88$  Iddd0d8{EyUZH;< 'ʯKb>eV('Nz|UP0.I{}uyHl:.3HE8CLv4)]_EfY-aVou 7Hzl _ [!Ris@mC#Q,d/SOŸJ Ygڹ\1 tl5SSkiʨ6MHR/k%V{h013hRWEUČL--@v w헾hW@K~ƺ t*T|l(8hnQt!<ș|0XpTaц)~.8&ҏ0gܠjּg3x`,F_۽Uݼj6Slx,&Hԯ,t8L& ? HZl_@&QTy,]K!T Z ޖbz u`%E肀Rwg9\4"@c֭=KQ'LkdQD`whr &22~fo fGso1huh8MkqfZ8-lKOumNonuD l ~pKQ&5iqr=CDs~aSx5tM>Szc셐Tc|P?$}lϒKbwg_x}pҸ!>2;Qt1[t0MId-;~Ӆ:O)J F ױoɌ1R݌C3 9 DKs _` ¡Bj䡫Oۮ9}-Ka,5XigG ~5 c/Yoݝ}KC YZk*?ܖ.q++uRoЇ=o.mh_/';*yӍ9_!v)bKGv_NȷSqmAM)_ *ezoGRS"YS̛ҫ{m] ~̓'߽ ֕Б ~ZHB#9%NI?Լ>e$HqhؙO;J˩L9;5^Kkڦ8mRW$۞eA4Sb×G/v 껟<W97>@95(_UKntcW *Pzφ`A&y6Nd )vq6 2)wHVy'/#{e)GI5'uSka6 (- W :({zg9$>vhs>}[rPgg^;8af8 teWQDH boI2"%2=RslA!.]_aYc9Gdt35&5fp+I;Czs7f sWQJ @fmEzI%sK@{y 5zJy3 %N_S{sU)z ,P vm|q1!6Fo_5S<"ed?(AN=V{n?je2Q9A3'}Vk?RBg3a^?#Xm[Bm|'|4#?l!MKlcL[s^p#8fwUvW^|$'hZ5S]s Jhzep%x=lLdL[<~g(- W :({zf/Users/richardalbertleddy/.cargo/registry/src/index.crates.io-6f17d22bba15001f/subtle-2.5.0/src/lib.rs ˗M\raH<* 71 L8XNT= KA=OPQ"PQKOPMO.RVRLQPP-&p RPOK)SRR$GSMSQ%#Ua [OQRRMRP QFKCKDV$I0Q2GPQH&>- /, .- /!PHKN(QTK- 4 "#*-436( 4!#]K!E ,,*>,,-.>,,.1FHIS & ,,""++ ,C$ GC.7+ !.EG(&-'67,DFJP1 '6E9 $'''*LL(.-AD&*1((7 - :: GG7 - ,, E?K'7 - 88 F**          3.P<<N%M<<N2N<<N* 11111'NA1H:NMA*H;#; H.E70 @ EE#D76% $70)4GAC4DF?CEDDDEB?*TMVVVE01' GDDE; AL*<;1:)( $?:AE. $?9&9&BJE<E0 .% BCAGE5 .%/ % SA1 $$&5KH?H 9A03 ;P# *Q&7J )"+"+"+ -1&,SND6z{!\)V I!)d SO. +---/-.B#$$M#C*Q&N7J &"+"+"+ .0 !!!"*.?#$$  BBɡlQi:s.2subtlewasm32-unknown-unknown-2be7d17fc798bc36A0^LRq'.6ڤ aa''               e