rovided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type null $last_used Null. * @type null $last_ip Null. * } * @param string $new_password The generated application password in plain text. * @param array $args { * Arguments used to create the application password. * * @type string $name The name of the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * } */ do_action( 'wp_create_application_password', $user_id, $new_item, $new_password, $args ); return array( $new_password, $new_item ); } /** * Gets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @return array { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } */ public static function get_user_application_passwords( $user_id ) { $passwords = get_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, true ); if ( ! is_array( $passwords ) ) { return array(); } $save = false; foreach ( $passwords as $i => $password ) { if ( ! isset( $password['uuid'] ) ) { $passwords[ $i ]['uuid'] = wp_generate_uuid4(); $save = true; } } if ( $save ) { static::set_user_application_passwords( $user_id, $passwords ); } return $passwords; } /** * Gets a user's application password with the given UUID. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return array|null { * The application password if found, null otherwise. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } */ public static function get_user_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( $password['uuid'] === $uuid ) { return $password; } } return null; } /** * Checks if an application password with the given name exists for this user. * * @since 5.7.0 * * @param int $user_id User ID. * @param string $name Application name. * @return bool Whether the provided application name exists. */ public static function application_name_exists_for_user( $user_id, $name ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( strtolower( $password['name'] ) === strtolower( $name ) ) { return true; } } return false; } /** * Updates an application password. * * @since 5.6.0 * @since 6.8.0 The actual password should now be hashed using wp_fast_hash(). * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @param array $update { * Information about the application password to update. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @return true|WP_Error True if successful, otherwise a WP_Error instance is returned on error. */ public static function update_application_password( $user_id, $uuid, $update = array() ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$item ) { if ( $item['uuid'] !== $uuid ) { continue; } if ( ! empty( $update['name'] ) ) { $update['name'] = sanitize_text_field( $update['name'] ); } $save = false; if ( ! empty( $update['name'] ) && $item['name'] !== $update['name'] ) { $item['name'] = $update['name']; $save = true; } if ( $save ) { $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } } /** * Fires when an application password is updated. * * @since 5.6.0 * @since 6.8.0 The password is now hashed using wp_fast_hash() instead of phpass. * Existing passwords may still be hashed using phpass. * * @param int $user_id The user ID. * @param array $item { * The updated application password details. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @param array $update The information to update. */ do_action( 'wp_update_application_password', $user_id, $item, $update ); return true; } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Records that an application password has been used. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error True if the usage was recorded, a WP_Error if an error occurs. */ public static function record_application_password_usage( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$password ) { if ( $password['uuid'] !== $uuid ) { continue; } // Only record activity once a day. if ( $password['last_used'] + DAY_IN_SECONDS > time() ) { return true; } $password['last_used'] = time(); $password['last_ip'] = $_SERVER['REMOTE_ADDR']; $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } return true; } // Specified application password not found! return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes an application password. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error Whether the password was successfully found and deleted, a WP_Error otherwise. */ public static function delete_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $key => $item ) { if ( $item['uuid'] === $uuid ) { unset( $passwords[ $key ] ); $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application password.' ) ); } /** * Fires when an application password is deleted. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $item The data about the application password. */ do_action( 'wp_delete_application_password', $user_id, $item ); return true; } } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes all application passwords for the given user. * * @since 5.6.0 * * @param int $user_id User ID. * @return int|WP_Error The number of passwords that were deleted or a WP_Error on failure. */ public static function delete_all_application_passwords( $user_id ) { $passwords = static::get_user_application_passwords( $user_id ); if ( $passwords ) { $saved = static::set_user_application_passwords( $user_id, array() ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application passwords.' ) ); } foreach ( $passwords as $item ) { /** This action is documented in wp-includes/class-wp-application-passwords.php */ do_action( 'wp_delete_application_password', $user_id, $item ); } return count( $passwords ); } return 0; } /** * Sets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @param array $passwords { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } * @return int|bool User meta ID if the key didn't exist (ie. this is the first time that an application password * has been saved for the user), true on successful update, false on failure or if the value passed * is the same as the one that is already in the database. */ protected static function set_user_application_passwords( $user_id, $passwords ) { return update_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, $passwords ); } /** * Sanitizes and then splits a password into smaller chunks. * * @since 5.6.0 * * @param string $raw_password The raw application password. * @return string The chunked password. */ public static function chunk_password( #[\SensitiveParameter] $raw_password ) { $raw_password = preg_replace( '/[^a-z\d]/i', '', $raw_password ); return trim( chunk_split( $raw_password, 4, ' ' ) ); } /** * Hashes a plaintext application password. * * @since 6.8.0 * * @param string $password Plaintext password. * @return string Hashed password. */ public static function hash_password( #[\SensitiveParameter] string $password ): string { return wp_fast_hash( $password ); } /** * Checks a plaintext application password against a hashed password. * * @since 6.8.0 * * @param string $password Plaintext password. * @param string $hash Hash of the password to check against. * @return bool Whether the password matches the hashed password. */ public static function check_password( #[\SensitiveParameter] string $password, string $hash ): bool { if ( ! str_starts_with( $hash, '$generic$' ) ) { /* * If the hash doesn't start with `$generic$`, it is a hash created with `wp_hash_password()`. * This is the case for application passwords created before 6.8.0. */ return wp_check_password( $password, $hash ); } return wp_verify_fast_hash( $password, $hash ); } } ۖƑ(^^n%@Z]%%uꖵZ $4.uu53:3^O2_#"W$XŖ=jH"~}-{~1'-:s/&I/wI}g+YlG' eaY+~Һp^ĽuΌ+aD*rB,㝳'uh[m'jP`ѽ{]2}cEareqOv9+`v̖{ PmEK2%g+HVgZ'r"~cWk `^=s=l+\W@2Wg]Q)lh\klz^΢lKܐy&`w Y M"xwnbfܜ{["=?0Gw];WskM]<_86`4YY VTXփ3=:܇j(Rm*t5 PV ,Ect[, ƚ51#d_AG<D s@cd:w+=炙B'gȌv5Ig6_YV3vE(F6IO4qzv\+]߲ô ^ nξ/z=M}^l-q?JHzdɝ2 ؞rfn;X5Ζ0:NcS1pqt+vP҉&3+sx3gIkN "a?-ZS94YL_Z 1r/ym vk ?rY+`Wphőd$ѷ z2ǮoCrVP P`-j޶~Ce\EI%ZoN7Z/[+x  sn9\HL ʥB IJV+ooAAwTxhV&ӒY~xO-1x/a㠚 /DL 5vNnd#Q'^i(`pL%%z$hFny6[<_=9rO 'Y m7F?30+}5n`b5mb\nL.:ij 4)R*+2o/ax`ue!l]w~ $Yp+~е:Cj}\FINX* P-%ݹ9p`S?͇ԞƐmskd=mlN󞩏=]ϸ='xZ퓩 ~'W;7B<'UE ^B39#PB$e,3# O9Ax%hF ovֿ{&5m>b Зy=XW1s$t;x/<(^!ݛg]JbɶwCŷ;7^8-V?W<-?v+jf{0I>#-pr9 㫕 p\XbOϱ̾0w/eL~t( ɘ nzDՔw]E%>9B5(3tEj] __!9 4.xټfipfڅ6'Zot<P[\>)WBIj<Q!Kr\~aH>pZ& ,/:S2WR¥e4et*L 0AM4Un-W\g`nZETe``S[dsuw${(ixdhB?y(b: u 'X` mNfwaJض-@FR%_8MΦVkA2G:( a@L-}'`Xvw0u w&ǀW+_l*soVr;Bc^;\֢> q]zGQ{0%Am;h2.`\{R`r0Qr |ֻ1mBlT^sɹ̮--_ԍ9[+%5GhpL{Η <{&787>kM^(ji`s\z-gnY3kyb[gaKd  Ü} c_AY~Dh?ܩTLhyUÈ.:aN.+ &!f%i2uePMx2%Ӎ|w*L2QFEE (M?x:ke S ض<:>,.6 .KǶw[Ғ֔&?v 溄좉\OUP6! ZhɈ;oLrB.K=p|mRYA{A栃= 7D|W wSVߔ$|Vl! Q""@m/A"h}  <%hp 6܏@MI9jSuj@ޘ;. c3 qH{G5pK 0anj A-, kMۢת+\4E̅3M#;#>r΢}6$NWC CF|,c["鿚6(JU9" :}SEo,aʋk (:;$Rjғ./-@:y{)_x2/=Jsu'8?g tِER}9<=fJ h9u՞zZڛx#ͯ:8 &E[/ U}i-5jZo$EQd@3L 0˕g +m;ܵ1&.-Rͼq ɛG5 s}Eвj)/{^Pڷز0͌Vs2fl9ua9̭^'n9kBBҥI1"'&sVyS-׈Do"Gb;ˏR|Y칓oVqy_R!P2lW+ AJy.i:|2w\Qn\ tE['t DTM9anjpZFgZ.1_1ᇠXm8=%=b rbh td4:%]嗆j7r4#;0:=;BX=YjɛI}y5/H)Hvu0J}?5\+\1r }$Y^`AwYQԗuGs T+R $a+&:hD+ta;zX8P3p[oy!e-C%?VȨ3qT~^:!û)|Sģ8:XR&!%67aov\ yL$NbWNV.G^bJ5B?/bf(EGH),4b.qp)ҠoXX"Sϱ ӏAJono+PO1'5wdl28cGq@݃x+'l%0hBNmQ DqDkѬL30k7ְN p ^ 5~Z:R EH"J0Y L)Mii] H@- &[1'oHO퍶j 6(Gp`^#-PVL^Lrۜ&nG_m`\d g+=K>ڝHha]y8&UYҎzʃ6;erO;֧Xh< pLx |TY&_~u+oKxUSVh.\ (<,rJҭMFw' &7 ˙ќ# :)(xL1|* #Zdb9 8l3b~86[CtlEfG:l'Z qfx+.C/Ue*<j\VTsH3һ/RZIP=,ń!.\"TU`.-4D\UE1ɺ1 RHcBvKˇ`o&CR!=HRAeC6?+f}ëX?]2!%4뇇Xk"-Xj{`6G)/OY}Ym/)4.bT=}D==-w+@{MFjnHjR@SU0)4oV U<{a|Q :*1VZL}dw% GS&(r*jzoR$k?[UҮ=UC#| gsN]* Gޒc)3.(sO\R5v[ it<ԟίVZ$+._X.0!ˡ #]?zS5Lɇkd7* y ic|Y6hS$ҋAVEmE]뒇wMujDy>@w8m+p8i@/~(iNSrh-Q*[OG!-(LY~o} l?P"[㾀픞z ɯp׎8YATAI*~oxWt>Xy>q$ Њ^xX6I9SK< |VSr]PU QT {H'&S|Wul@$~yr i%Û3H6D<-s̍Xg]0IOTf] G'帑?iA >nܔ$..^[I۷\j?fXk3.& zY;>C-K _O˕ɀ76OC1!ׁJNwsԓ_do} NmQ TyGlm>b7* 4/XDt􀰢RW{EhȢQX8)XQ^,ro)~HrmIX*t^$ѝ^ PqY8m)}sW a#g&tJ++'j^B:e"٩R-)gE5* 2` 7Be u3v ӟ&ΖD߁/MvGct91'yAu>˻#Sr;.ĢN֦0UlxLrVlWkFlֺY G{[6;, 0$J1c\))z`2I2T/MZCoG2#SղQf~*[PԪ&%h-I_ya :;3ՑN䧿۝{ O  ,} kF< ywR?F{Z[addfcuTT#__*"UnVh_W l^_tn8CŠȐnd=H"^´GCuFc{Ft `vÎ'殺Ey3-ѳ蓌5~$GjSX/B=޲gdK2Ml4]m,^0 rrT pҺI&0F5pO@i}fҶK_yZ.RrHԁr2#s%`{ yڮԼUצvy;Kufg,wҧx鬁ʧ7̴q/e8I&McJIm@m)Jn8!}Ka,(z}\xmPɘ׮oaЌ^WvAr}l+Dc쥿+=gko܈ NZRjO>6@L+ӂ'gct5ҮOЅtnxZy+ܝq{!jWEOQ?%="<ЂI J۬ F%ƹy;].Č?[$1, +R`㣸@hD-HkFFeNa <)RJX,EQ"@Q*t*yj+Un倭 m 7.A6z2̞, EPP# I0Q;ЉI<%,&-cJ<#pX +JÒ*ay@֒DH yX&N{4QhF*7}C\O=}fvW*@ Y[b@:׵af'h 5 ?<@Ov{ЕLoRBX gKT%MT9ެӟԖhk1hӖ9}"'NH5o:z i"^r/[Tg0T$9.4IIgRӡlnTvsE^}uR[9Ç3) %j D1 ޮ$cڎ Y׍t k~PcV(%n4NRnJK +GG ;:⁨wF B,vN7_`&B&' B*zҚ[n*j@siLAے_x&V8d*`|`bbW+ [H4 [ p?< i#בVd_PՌ1t^: >yWϘ)c7> SLSz=ulaeEL'CHàl}К0Lfw;ߚc4A]Ȳ=Ld㡞TQ։62LA&&B}HE{  dMTCJo0JD3Gi*zܰZ+k_ B,y%XZh焠bf?"Vj`C )q=TI5f*ZB)lM>1h~P_,-P4_R/a|aASi\9 G.7LRk}F])iVel9RYak6l7jVƶf֬Yc{grRd}r8vUepت U;:0udt:)gUaUK4 x;l\aϺK5*T#\x?Tgny@{͜`.Mr5ݬh&k`~9>m&ǒ Z j~)۪,͏<['ævPЕfjo0E~mG5)R9E bbKAKTp5 a6z[F 2~S?n?CtZhSpLtJh */!+l`Avy]^XknE!p%{(Q.؈@>ڇj}$G;>3c E0zꃮ "Ճ$TvP}DWVTefB. "{=!z~ƞ_ZqI4dB1\P2 ȏQf=eZLر.\(TP᭄W1dr@< =@2K9ܵ[N/-},5ˍ!wKz%(rDKdJ%%($M$2/dy?0I ujL{tM(C$Kf{&p[7F{*w`gh#D"="} 0)y{3a!>Lc,?48h525H(/̛^ϡ4$^U~$ћ$% (IZgz#fVwz8aۄkGIlCtq ,^! Yt&ӵǐe#@u Wk *W}iqR$fĊA?ufˈ]icG/(RY楷H^νh6GfسYNT ژ3 mjsPbʬhȇD3'zcMuꦚ(7U:eXN %knKF9,lkm6FiP9^b7:SyX/9d+Cgm i`dw :|9sؔ/w{o&f6| bH,tt8 ;8HMr% A㳍Ղy4[]CB{@SgMx2'֩R7SY}XS"3txmLUq:X9.M[_5!z3>\v4j<$󰸇ѕa ~ope] ] cB\,Q¹#;ɷGɐ])F,X(rgG2쐡=~ r?lZ x/YA| 0RnTЪAqׅ[g20֏AmV(]=0=P"J :DT' ,8ZB:|g,{4% dP)wG&1;wX!R]+FD>LU ;~Luܾn,H`:LW{4}6 ڀ {ibd? Tcʀ&N 2`L{Ǻ SfT{AиyHW{ 0T}i&>N92<GFN yq'03z >}F88 Mj_h:g V]Iu`^0 ]p"kŦKNC`Z}Ѓ0VRׁFc}k^9d&h4|.|4#l*%8P{C̭}:BnC0d ԁ9uդe:s㗢j0xt,nJ1i'_пVMŠ(b߁BOt>h,m?O˜>`v14{u|_30f=uX*hU39RLף/LdᐆzA}Tmpf!|Yo}=u OyA:w (C҃X Fpfc 2SGzD,2XE!:Ak!zǸl'?@^(uaBjϨ&tԨM5.a+hP|!.b3R=`=t TT#2wArq| =%dY_ZRr+,%4V&$~0t[%YHDq4"k?z$n[VvSݥ'LƠW8nulys*vj[tH *^4;YRY )MW-UoEz `Z?Nm\C^XD~ŵѱ=%9]GKEhN~[fEmiR$y[aCytU _"R|. 2.W%n"lsiВOQ&]9k3Y;:tJA 1I+~W׺<0Dj.~/bx7h(j*DA@b0-:OE9<3 t2W^l-{QD}}⮍>cTm|>{+vJ=ꋢ?l#Q=e| _YFă0^_ꆥ\͠Sʵ$;8+! C>2B3rS3hYtcnU6;sCW{.=jSD.{-[fNpU=E\kr$cnHAIAn0CⷮcWGÑ89$LƐU 㛜 PMYD%.C.LH='/"E`.p>!ǤmYNP]Lx,u|x;ys9x sCTBw>UV{o%ܭ0)i~x%#|@{Zn> yډmr>FY;GNc='Oz""A[^&}t*^WQ@3;¯ұBgx%2HfxT( W8.R񩃮-xbe{STo~oBmfg⺸hxJs9.kxTLEASf+ێ|kÿOED< |'5 ?=*pd ESTAvEj]x!4L6A@'ѓ4A*AT'%#]r{z`@HzLM69|#(9B5羞m+ZJPz=)||(>C^F''l_r^[D }3itMN$ :KP( x+ N,(q+SR  7&:b/ >L<3)r($]&<ԑ燞^jBs͞h" :xږKt(`b3O!,E#یB/$TI%tUD["<}բKJ=JZ+{N-01|WɄ[{IUP$^GR=-ѭ f.LՆA<ԪO.U4Usb8U^3%-oeK}[0!qo}w>b: Ĉߒ$F/u 3S`MvsL$PFXjѲ/.8S5!6 OLlӁ5CWܐ?` )+ 2{} B)j|%p)F-5&D8wt^ċ;sGy̎ET Xԍ"a1<$9dWq0reP _nBVWTz.P4I)uI9Q|.0obn5 P 6(6,|{IRt`Ẅ́"*LS ?*s~k4VB]K>Yn `tYQs\Lg {i]a6o(& |v> : S$D"VI95bdҸ̸&锒6Iŝ;WSӝ)74RuV+亨=:A-~Gb{PN‘\f <:)#Ua|D 8³F.n E>վ{ ]2 suܐu"<.&"6sfvKr/ngΦ9p{H r(pi;0g u!!=vŞO}4S SI9-7T̙\,gY%˿\-ZmTkl_/c}6DL _9Rй SX]@4 tOd%GX*cB Vzpq]\5ɭ Z:)\3 gzR l۵:bEKоxI-s/ E&0Ă .|Pl~? cvJH g3?;奃SۓPG *8X $4cK-F+:BNBwR=h(K Z5y g_K8Y69me>W1ZiʱKDU Q'WXmv+Dڲf3]ɐJc s y._z{ep8}n"<r/uaLw0 8:t%)tU/j*lU"hI6{աuzK&]=GYԠ[~:s #+1:I5w BYP|͊*=_½-H/("O+q2pȌ~_zo/f-jMK1wVd~^zWG=L(@$E``b|G?z7+D:T=#94Y^{ᜁ%b$JB![Q?x?ڼ8&] $8CڎLZO*OOeì~Dh'[k<4aO=~r̦d+e;q8a1K|€[:vj2]#ĸl1>ݱ^my?F'g94Gx \9wxe5;(8U., [<_Է'И'8ZzOa'Ӄ$o8۹N_"+R 2Gaw VRj*ꪦoZI%5械n@HS{bGA5ΤG3ǙC`^~Ğ=ϟ~ (4d[Nmzk]5К쨗p(OH_s!3 [pGvH^YA3n n?|X7oN|Ag%ݵAU潣Rq0ᾋ<8<:37/ ,9C#3Z .?@>fCt"";+Gg@9`2-H0lHV'i}g-9 3t19&kJ2?O*wpޙ`;Wk75™~BBFhD:d{qb"~}HIQ /e0A u M <)#ȶ{& dnJZwLTx.<-NZw @w,l)]/yzJկ <֒\vLD6X mX9x"]NĬ߽um!?J^S>>覶v?9t<ۿT.JBX"*^t“Zs¦M8ZfoF-m(c6튬zrK:iViQ8h^ }_A0̤g~}w3<ݥώ׾*J{>ցg˃aW(ڐ^y" RE=yXG+d6jVřlxFR8Xr#l)?99~޴]ӫ'2wR"Xt>?N"Z?n;#ɉxUx˺<2c}^:&P TY{ZQoyOk?ņ9"U 6-?yO|ZWI2e&|NM >gaRM̴p)Hoxh`c)neYiM>fV.ڬGY"rD NZa X~aNjӧ!w"_xJOpt};ψzZ{Yx bKڣ`VMxeح-{}- Z "z\'Q)bq*.\ׯޥƕPކ0N"QgMlbviuS&V:9yu<>gt\ҝJܒ ٲW 8u3?vF$(dKSb[H8zxF+ҴG[SINxG sX#4ۡd K^@u*wd;xa$J6l.|> TߓGvOp8GHvUFءwa0zAGa':k=-G &y; ?yoN8|t$5$'OwB\#l%B1G8V/9_@9+(?'*mӧO#5?N>APmƪ=@ӹ.erOB{w䈶B%#;7"Ǐ=ڏ,}⛫%SCOI!wE겧DIa'1LEN.{)>&_:^(grs@Yxș0 ( #,s'<0mGKGF&Ξ5U4̡^AOf`PMgxb &f+ꑢ}<_v