From fa7daf298bcc9e53959f0f07871f2cd7953a61e0 Mon Sep 17 00:00:00 2001 From: death2droid Date: Mon, 1 Jun 2009 08:39:05 +0000 Subject: [PATCH] Added someone's addition to Wiiuse that allows some Wii balance board features. http://www.wiiuse.net/forums/viewtopic.php?f=3&t=181&sid=a9460693620dd73fed22b10259a610b4 This is hasn't being built and is untested. If anyone has the required hid files can they send them to me please on the forum. Anyway this shouldn't break anything at all. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3304 8ced0084-cf51-0410-be5f-012b33b47a6e --- Externals/WiiUseSrc/Src/events.c | 23 ++- Externals/WiiUseSrc/Src/wiiboard.c | 187 ++++++++++++++++++++++ Externals/WiiUseSrc/Src/wiiboard.h | 53 ++++++ Externals/WiiUseSrc/Src/wiiuse.h | 29 +++- Externals/WiiUseSrc/Src/wiiuse_internal.h | 1 + Externals/WiiUseSrc/wiiuse.suo | Bin 32768 -> 61952 bytes Externals/WiiUseSrc/wiiuse.vcproj | 8 + 7 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 Externals/WiiUseSrc/Src/wiiboard.c create mode 100644 Externals/WiiUseSrc/Src/wiiboard.h diff --git a/Externals/WiiUseSrc/Src/events.c b/Externals/WiiUseSrc/Src/events.c index 87bed002d5..63269e52c5 100644 --- a/Externals/WiiUseSrc/Src/events.c +++ b/Externals/WiiUseSrc/Src/events.c @@ -56,6 +56,7 @@ #include "nunchuk.h" #include "classic.h" #include "guitar_hero_3.h" +#include "wiiboard.h" #include "events.h" static void idle_cycle(struct wiimote_t* wm); @@ -635,6 +636,9 @@ static void handle_expansion(struct wiimote_t* wm, byte* msg) { case EXP_GUITAR_HERO_3: guitar_hero_3_event(&wm->exp.gh3, msg); break; + case EXP_WII_BOARD: + wii_board_event(&wm->exp.wb, msg); + break; default: break; } @@ -704,6 +708,12 @@ void handshake_expansion(struct wiimote_t* wm, byte* data, unsigned short len) { wm->event = WIIUSE_GUITAR_HERO_3_CTRL_INSERTED; break; } + case EXP_ID_CODE_WII_BOARD: + { + if (wii_board_handshake(wm, &wm->exp.wb, data, len)) + wm->event = WIIUSE_WII_BOARD_CTRL_INSERTED; + break; + } default: { WIIUSE_WARNING("Unknown expansion type. Code: 0x%x", wid); @@ -744,6 +754,10 @@ void disable_expansion(struct wiimote_t* wm) { guitar_hero_3_disconnected(&wm->exp.gh3); wm->event = WIIUSE_GUITAR_HERO_3_CTRL_REMOVED; break; + case EXP_WII_BOARD://Fix me + wii_board_disconnected(&wm->exp.wb); + wm->event = WIIUSE_WII_BOARD_CTRL_REMOVED; + break; default: break; } @@ -794,7 +808,6 @@ static void save_state(struct wiimote_t* wm) { wm->lstate.exp_r_shoulder = wm->exp.gh3.whammy_bar; wm->lstate.exp_btns = wm->exp.gh3.btns; break; - case EXP_NONE: break; } @@ -890,6 +903,14 @@ static int state_changed(struct wiimote_t* wm) { STATE_CHANGED(wm->lstate.exp_btns, wm->exp.gh3.btns); break; } + case EXP_WII_BOARD: + { + STATE_CHANGED(wm->exp.wb.ltr,wm->exp.wb.tr); + STATE_CHANGED(wm->exp.wb.ltl,wm->exp.wb.tl); + STATE_CHANGED(wm->exp.wb.lbr,wm->exp.wb.br); + STATE_CHANGED(wm->exp.wb.lbl,wm->exp.wb.bl); + break; + } case EXP_NONE: { break; diff --git a/Externals/WiiUseSrc/Src/wiiboard.c b/Externals/WiiUseSrc/Src/wiiboard.c new file mode 100644 index 0000000000..38a540b1a8 --- /dev/null +++ b/Externals/WiiUseSrc/Src/wiiboard.c @@ -0,0 +1,187 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * + * Copyright 2006-2007 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Wii Fit Balance Board device. + */ + +#include +#include +#include + +#ifdef WIN32 + #include +#endif + +#include "definitions.h" +#include "wiiuse_internal.h" +#include "dynamics.h" +#include "events.h" +#include "wiiboard.h" + +static short big_to_lil(unsigned short num) +{ + short ret = num; + char *bret = (char*)&ret; + char tmp = bret[1]; + bret[1] = bret[0]; + bret[0] = tmp; + return ret; +} + +/** + * @brief Handle the handshake data from the guitar. + * + * @param cc A pointer to a classic_ctrl_t structure. + * @param data The data read in from the device. + * @param len The length of the data block, in bytes. + * + * @return Returns 1 if handshake was successful, 0 if not. + */ + +int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, byte* data, unsigned short len) { + int i; + short* handshake_short; + /* decrypt data */ + printf("DECRYPTED DATA WIIBOARD\n"); + for (i = 0; i < len; i++) + { + if(i%16==0) + { + if(i!=0) + printf("\n"); + + printf("%X: ",0x4a40000+32+i); + } + printf("%02X ", data[i]); + } + printf("\n"); + + + handshake_short = (short*)data; + + wb->ctr[0] = big_to_lil(handshake_short[2]); + wb->cbr[0] = big_to_lil(handshake_short[3]); + wb->ctl[0] = big_to_lil(handshake_short[4]); + wb->cbl[0] = big_to_lil(handshake_short[5]); + + wb->ctr[1] = big_to_lil(handshake_short[6]); + wb->cbr[1] = big_to_lil(handshake_short[7]); + wb->ctl[1] = big_to_lil(handshake_short[8]); + wb->cbl[1] = big_to_lil(handshake_short[9]); + + wb->ctr[2] = big_to_lil(handshake_short[10]); + wb->cbr[2] = big_to_lil(handshake_short[11]); + wb->ctl[2] = big_to_lil(handshake_short[12]); + wb->cbl[2] = big_to_lil(handshake_short[13]); + + + /* handshake done */ + wm->exp.type = EXP_WII_BOARD; + + + #ifdef WIN32 + wm->timeout = WIIMOTE_DEFAULT_TIMEOUT; + #endif + + return 1; +} + + +/** + * @brief The wii board disconnected. + * + * @param cc A pointer to a wii_board_t structure. + */ +void wii_board_disconnected(struct wii_board_t* wb) { + memset(wb, 0, sizeof(struct wii_board_t)); +} + +/** + * @brief Handle guitar event. + * + * @param cc A pointer to a classic_ctrl_t structure. + * @param msg The message specified in the event packet. + */ +void wii_board_event(struct wii_board_t* wb, byte* msg) { + short *shmsg = (short*)(msg); + wb->rtr = big_to_lil(shmsg[0]); + if(wb->rtr<0) wb->rtr = 0; + wb->rbr = big_to_lil(shmsg[1]); + if(wb->rbr<0) wb->rbr = 0; + wb->rtl = big_to_lil(shmsg[2]); + if(wb->rtl<0) wb->rtl = 0; + wb->rbl = big_to_lil(shmsg[3]); + if(wb->rbl<0) wb->rbl = 0; + + /* + Interpolate values + Calculations borrowed from wiili.org - No names to mention sadly :( http://www.wiili.org/index.php/Wii_Balance_Board_PC_Drivers page however! + */ + + if(wb->rtrctr[1]) + { + wb->tr = 68*(wb->rtr-wb->ctr[0])/(wb->ctr[1]-wb->ctr[0]); + } + else if(wb->rtr >= wb->ctr[1]) + { + wb->tr = 68*(wb->rtr-wb->ctr[1])/(wb->ctr[2]-wb->ctr[1]) + 68; + } + + if(wb->rtlctl[1]) + { + wb->tl = 68*(wb->rtl-wb->ctl[0])/(wb->ctl[1]-wb->ctl[0]); + } + else if(wb->rtl >= wb->ctl[1]) + { + wb->tl = 68*(wb->rtl-wb->ctl[1])/(wb->ctl[2]-wb->ctl[1]) + 68; + } + + if(wb->rbrcbr[1]) + { + wb->br = 68*(wb->rbr-wb->cbr[0])/(wb->cbr[1]-wb->cbr[0]); + } + else if(wb->rbr >= wb->cbr[1]) + { + wb->br = 68*(wb->rbr-wb->cbr[1])/(wb->cbr[2]-wb->cbr[1]) + 68; + } + + if(wb->rblcbl[1]) + { + wb->bl = 68*(wb->rbl-wb->cbl[0])/(wb->cbl[1]-wb->cbl[0]); + } + else if(wb->rbl >= wb->cbl[1]) + { + wb->bl = 68*(wb->rbl-wb->cbl[1])/(wb->cbl[2]-wb->cbl[1]) + 68; + } +} + +void wiiuse_set_wii_board_calib(struct wiimote_t *wm) +{ +} diff --git a/Externals/WiiUseSrc/Src/wiiboard.h b/Externals/WiiUseSrc/Src/wiiboard.h new file mode 100644 index 0000000000..eabbcf6998 --- /dev/null +++ b/Externals/WiiUseSrc/Src/wiiboard.h @@ -0,0 +1,53 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * + * Copyright 2006-2007 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief Guitar Hero 3 expansion device. + */ + +#ifndef WII_BOARD_H_INCLUDED +#define WII_BOARD_H_INCLUDED + +#include "wiiuse_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, byte* data, unsigned short len); + +void wii_board_disconnected(struct wii_board_t* wb); + +void wii_board_event(struct wii_board_t* wb, byte* msg); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/WiiUseSrc/Src/wiiuse.h b/Externals/WiiUseSrc/Src/wiiuse.h index 46c7da12bd..5ac1fd2202 100644 --- a/Externals/WiiUseSrc/Src/wiiuse.h +++ b/Externals/WiiUseSrc/Src/wiiuse.h @@ -130,6 +130,7 @@ #define EXP_NUNCHUK 1 #define EXP_CLASSIC 2 #define EXP_GUITAR_HERO_3 3 +#define EXP_WII_BOARD 4 /* IR correction types */ typedef enum ir_position_t { @@ -452,6 +453,27 @@ typedef struct guitar_hero_3_t { struct joystick_t js; /**< joystick calibration */ } guitar_hero_3_t; +/* + Wii board +*/ +typedef struct wii_board_t { + short tl; /* Interpolated */ + short tr; + short bl; + short br; /* End interp */ + short rtl; /* RAW */ + short rtr; + short rbl; + short rbr; /* /RAW */ + short ltl; + short ltr; + short lbl; + short lbr; + short ctl[3]; /* Calibration */ + short ctr[3]; + short cbl[3]; + short cbr[3]; /* /Calibration */ +} wii_board_t; /** * @struct expansion_t @@ -464,6 +486,7 @@ typedef struct expansion_t { struct nunchuk_t nunchuk; struct classic_ctrl_t classic; struct guitar_hero_3_t gh3; + struct wii_board_t wb; }; } expansion_t; @@ -524,7 +547,9 @@ typedef enum WIIUSE_EVENT_TYPE { WIIUSE_CLASSIC_CTRL_INSERTED, WIIUSE_CLASSIC_CTRL_REMOVED, WIIUSE_GUITAR_HERO_3_CTRL_INSERTED, - WIIUSE_GUITAR_HERO_3_CTRL_REMOVED + WIIUSE_GUITAR_HERO_3_CTRL_REMOVED, + WIIUSE_WII_BOARD_CTRL_INSERTED, + WIIUSE_WII_BOARD_CTRL_REMOVED } WIIUSE_EVENT_TYPE; /** @@ -653,6 +678,8 @@ WIIUSE_EXPORT extern void wiiuse_set_nunchuk_accel_threshold(struct wiimote_t* w WIIUSE_EXPORT extern int wiiuse_io_read(struct wiimote_t* wm); WIIUSE_EXPORT extern int wiiuse_io_write(struct wiimote_t* wm, byte* buf, int len); +/* Balance Board */ +WIIUSE_EXPORT extern void wiiuse_set_wii_board_calib(struct wiimote_t *wm); #ifdef __cplusplus } diff --git a/Externals/WiiUseSrc/Src/wiiuse_internal.h b/Externals/WiiUseSrc/Src/wiiuse_internal.h index a12d19a61c..de445f73b7 100644 --- a/Externals/WiiUseSrc/Src/wiiuse_internal.h +++ b/Externals/WiiUseSrc/Src/wiiuse_internal.h @@ -152,6 +152,7 @@ /* encrypted expansion id codes (located at 0x04A400FC) */ #define EXP_ID_CODE_NUNCHUK 0x9A1EFEFE +#define EXP_ID_CODE_WII_BOARD 0xa4200402 #define EXP_ID_CODE_CLASSIC_CONTROLLER 0x9A1EFDFD #define EXP_ID_CODE_GUITAR 0x9A1EFDFB diff --git a/Externals/WiiUseSrc/wiiuse.suo b/Externals/WiiUseSrc/wiiuse.suo index 3dfa0ede367a79e83c3a920cbf205a15e9c3fcd3..f36b8326aac4c036a76aa96124e76ab84102adcd 100644 GIT binary patch literal 61952 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*1Oo3?K{^5@29pVqjokVPIhR_y7NYuowda z!~an*q(b2D|Ns9%aVW{az`)AD0FG~V1_lOB1_lNW1_lN$1_lOR1_lOh1_lNm1_lN` z1_lOx1_lNJ1_lN}1_lNp1_lOs1_lOU1_lNZ1_lOE1_lN(1_lOk1_lNR1_lNx1_lOK z1_lOc1_lNh1_lOM1_lN>1_lNN1_lOu1_lO21_lNt1_lNj1_lNd1_lOI1_lN-1_lOo z1_lNV1_lOA1_lN#1_lNb1_lNl1_lOQ1_lN_1_lOw1_lNL1_lO01_lNr1_lOW1_lOY z1_lOG1_lN*1_lOm1_lNT1_lO81_lNz1_lOeXgalJU|_IgU|?`yU|?`(U|?`$U|?`! zU|?`&U|?`zU|?`#U|@)1U|{fIU|{fJU|{fMU|{fKU|{fOU|{fNU|jMU|vVez>vtmz>v(qz>vYfz>vbgz>vzoz>vnkz>vvwnz);S>z>o#i zpToewkjucpkjKElkk7!tP{6>zP{_c*P{hE%P|U!yFnP2I%IKB84Ai zA5_MG@*^n!gUTLI832+;&i|mY3RDJw$_7vwfSmt9f7#dAp53{x4-PtgnKh1e}NS7!nzB7(i;n88R6%p{55j6fq<-fYJiU-JrS`L{o}E=78z} zh(92uYC1y^Ln1>ig93vaLncEGLn_!UzTlDtRO%KpqLjglRIAlw}bsI=6Hmt$G!~klq zfXY4)#-;{c3=~$Nv=0(Tw;xphfXdwhh7yKMhJ1!RytaedDx}vxpf)wAY{h0jD5mll zQW%06@)=6ODFsv_fK+0~Y79(_F!PA@KPbG!K$QTvtpTe0!@#v)DLB0w)V9B7zV89T=5XRul5W|qnPz25q#bCFAQZXnbNlkTW;1&n*wt~`R4nrkd{F{CmiGn6nmgUbStN=W$+(hI^?3`~q5dtn$PMhJu2`4gauK(z>R&4TRb0ET>q zVunn-C6NKteoz|?o0tQ$LU|_Ii0K1RD8r%=9X0T*1VK8BEWpHCK zV{l<`Wzc0XVK8SfWN-nqKx~khBZCox8(7SR!I;6E!G*z;!Gghp!GOV(!H~g>!IGht zL60GYp&VS|BJA~N0M$Oowt{-x*xd$6oglRw;C?eT-Db@I>Mc{#L_LNehE#A%1k~$F zWvF4OU@&7aVbEhpV{n4EJe(MEzYm;sGcAY~>fQ;&g(5i}+P>K_tY{($^2d~DWK6l@^cEd zkU}rdhz%`Jdj+>%O7k?SF2z;)Ldq9VUae+;)Ml;>=HQyokU^Kh3CuQT&}A?L*L?;I zx(tpCt_+3@jtsgC1`GxajtmA2&J30e1`KXs=*(b@R_6sXsBr&v)b2g#vGLZb^TJER z`F$ApPDK|Ow2j~@aShYLoNfT1(eND%%H#!22MSO;GQRFgda4v zjeQg*;ykG33mQKM^@d0vh3R2Pru)bbYy=2Yuf;QfVlt0G4?GJH98?D$7y#uvP>8`W zXrvS*2FePcnGcY74|FyTG}F-w5@29pm$YIE1aAU{^w?9FlKzsZB8A=&S7;?ZPU7!@4 z4($toLf(ZT6Fj$r5_o7F6$U2wd>pai4;o880cwPS=H{G(15z2vz^(Fph64BqCnUEa zk8iqz^JzM`^$r>xg^Y4GLCZc+eN4V7MGT0sQWpjn25*LV1`h^L1{a1H@XQeMCo7xzqFR}R^6b2wH!@vaYW`n|l z*z^aQuLYGxApNj;HrV`IFhd5o3<8ZogK`F;90*GPAbVjLWF{dD3JGvA3!d)-V_a002phZPu@ z7-945AUEJs3zGx&rk}t#;B*8_6QG$oP`Uw0f>JwS6D#PH{z0{5CIhU!1De?j_+<&o zs9^Vl+zZ37G!M!LpqvY;nLx9LpfnHa^nvO|kRM^W9>fNb#z z!sI}`untgEfY(rfW}*tfEy5CpN(Kc6Uxq|*Z2*~%g6Y9UD={#E*NK2e1c|jDv@Qdd z|MB@B6!W<3g^7dw4;o7Zt!p9Heo$o<2XZiY`~g(TVXyx|DG+84E*fM%$X*!6r4Csf zwDv>_l#IcGAO>g@^gWoz!0-zxo&1KTlYdY#P<{X{^#bVu75g9>q>Y6Uk_XrsA-xZf zIu0nC3rd63@j}%JK*d1n1fgtUC=F642302w6$7m%l7X_7p)^RH8dRMoR1Bm}3(D4k z(jayEP<2L7F_68+P_`A62C1`!s&jyffy{G+vVEa6NL>I_T`*J(RK|or+2K$cq%I1o zE*2^VYLUc2*+ozqq^=aIt{Ex@S~bxEWp_hqkh(sox`|LRP{}_D%3cJeLF$%5)vbVv zfl}v6D0?%M2C3TyRksr=23nc53(7tOr9tYBLe-ssih&B=Gf=S$P%%*5aT3bD2&F-K zuRzsZhl+u6%MB>|4wMF|yAM_O2r340%VQ|}2b2b>`wdn14=M&y_aDmUWrCzXkUD-Q zNSYLaih)+GfMz{GEjuZw7|0*eOpq07icm37mP(61?zpl=)o{z!N70{6i5sV3}2yX1=R8Zwc z>RN*)zs(sy(*&T&0T6a$uwXD}Fl8`juw-yyFk+|$E$KEgHUTXpCvGhOcozaR79f<@ zP>PFL0~np48CKBh5>W1m2e0@8^~K^DjG?2^-0W*WomGq;HfVGSlzTwsE~vK+YE6S$ zBp@*mhK-GZ*42Xepso&R%`B+Z16mgk5(BlKK#NU5<8h#M>>x2vTLH9I7Ziv%zHSwV83wXPsB5F6C40I7rZ&Oz&YJ3tZ)3=A`n%!BpB=Rw6l zYxw6w)q#57(2~OioKiu z6n3D|jV=ZThHj`hC~W9~moqRhtYBbZ0F8`*W-V4TFff4PW-S8)!#V~AhV={#3>z32 z7(k;Wpf=-X1_p*L3=9lg85kJ0F)%P}XJBC10d+H|9l0CI22~CF7#JA#GcYh5U|?W4 z$iTpGh=G9tG{SO(fq~&D0|NtSl;t=B1H%ah1_sb5%P9s1hSLlT44`%>XoTe)0|NtS zgyjMQ0|RI#1=Jn^g(E$}1=)@d3=9k(85kHoF)%QEW?*3W0&Nq0V_;zT&cML%gMoqJ zCj+EM59-PPVPIhR3k?UDIiRr!Q2qhsI}i=3;bFBSObnD>VC^eV-UI1nU|_h#T+PS@ zUam*VvS)miH>55BRK>ekUG$4JxC112Cb?GmByf52p}=gXclNU0!R*2dV|D3 zY*3XCQU@x9Kw=;a8cPLG8;9Rx5JLFVru>rxTz^fl0#IovICP|qQop#!y~s1CNW~3NJ40ac3hCcK<~$S_bQu)DYr_f{DxvNJ zjTuZBK=(mrVnOap1n(XJ^=TnHLg_y%3Tk6EK*Ivm!=~q4bOA#qG)6$KxA)cX(!GJ-J!4ND1+XDg7job$Y)d8Rx@3sL74UlV* z(*tO?2`pxa4U=^6p3r;-U1)iM@LvoAJ~`A-0l5TJ#(>(wpb_vUX!%0#^ntuq0W{`^ z92zh-z1;*$v-sw}Kr_Ig+7%xL%|C%=NkIKTNDYinHAHS1sI3kP2nNtTYTWZ*pc)>c z12+k>A7n2K<5r1~0kw7}K_@ry`5)BkKiL7z!`h1=G0^T+kQk^v2vP@PgGLKLWp4|#M-N)H1M2#Mh*!t-GQ11nsWgikpYqi^{hZN$X-xy3S=)R@IYc9b)X&> zh>biy%ESmcEdw^k2`ZmOp(FpGnOKl|(25vrbDW_0Oi*SqgQ^F)&kj1H;EyDh0u`Hv zB(@qVb`MGH1yt-Wk{CM^WVS>ZI@biULk}vJjU-kE65PGwqV)aO3U2Kr}?SYDc@=Gt2JpoFC!gLZ;-BhR;XasEr8|0*o zrBE@@%7p3QM8&|c0xAZ|Ytx|Yl~5XF-fF0M>yX6uLEU!{N$d<8;zI1fj7G5))>FoM9r4 zBqqtm06r&04k`w6t0FYTC?SbyL&bEVVxW>u56U)z(jdL2P<7@|F_3#Kplll`4N_+h zRp$Z~1DWRvWqUzskUAfzIzJ?_P^efKR18%2heO#hP#Po_2W2NiX^?rTP`w#YF_5}U zC_5KQgT(To>|!Vl3gc2X$Qd)0P%%(-TLl%XgNlLH;WdFGjDdjxRDyuw2c)hWDmEFa z4&;`(P`4~Z5?clpgOw5>b!(ww>ygyGhKjvK68i!b`-UVYzz!+JgxDda9mpS&?2z+x zq@ZFT_en#=WT0Xob!P04b9Bt1Vjy)EP%%rW7)V_pJLC+VAgCBfT`*KE1S$qnSHKQA zgQpNG22xi96)T2{fz$HxH)KYk8Kn1a*^K*a>1Vjy*z z91wqKLB&Aow4q`;P%)4?2M)+NNRCi3kUA%*m@`xiq%M&I;@>2w7)V_*R4fH522$4s zwWA#>22$4n73+kGfz++#fSj|m4k`vxw;n3C0V)PcfBQKgY3LYK45ari2P7}tgNlLl z-iL}kfQo_iK85Oi1r-D7W#fdL%f!x!2tN*}7$;N=GdtaP;^-Vy z45aQnRO|v&45aP})W1)mVjy+TpkmLVVjy*Yp?d#8#X#!*L&ZSL6+q<`NSz25B<+fF zA>v33DkcsU1F5s-f`ow$R19REEmX`7Dh5)Q!UZ~4fPo5>Z+Xoff4;2HcI{+0s2o(dx(NQi)x;ghz28QcUF_5}jP<3~qVjw%dL&N05>pWgFBjJE3AAz5Ahh4?x90>h?g@9fOL2-13SWa(3Hms2IpCZ=hmtp<*C) z|G6P`8R)<}n41}SAYx2BkoW+pQ{jQ6Q&p%K$UHTum^xGpq|TBDQbt%o#X#z;p<*^r zF_5|l9!Q)=Ld8JpqM%~YP%)6Ya;R7ZR1Bo95-L^&6$7c8zypb+iBK_+x=B#6$xtzn zy45_8v+~wJ#X#!TLdDiW#X#y#K=q!4ih6$7dJ z#{(&^{zJt;>OhALf>+`5BEngg7m}Xkpkg3(@=!4as2C_6DDy({f+|!Dln!)3jbG5B z5~vtRohekE8Io8iR4g1S2AU0v;Dwy|7l|Ym%?mmAF9As`i5Jp-PKJts?6rj2n+6pF z*_#EmBO59P3WHu=$T^37P%)6-`k`VIpkg4sQ=xjNL&ZRP*YZNbZyi(&q<1}3Yy(sb zPyOc|igy2GXm?52>g1p<*CA44`6$P%)5RJE&d^gzWxGr^PiA!YGos2E7ybf~&HP%)5s z3!vsLK@wXF72As>b`C0b5h?~U?*P=it57kJc{iczZb8LB>h3|+J%WmX)IEi&dkz%? zse1uc_Xa8kQuiLJ?jw@eSE$%Gs2C{xZ(J>KvhBE>JO$y$J%4{FVq61L;kIiX{s$FwlSe1~jt_I$x}S zA&~(#3&Fr}j>iHtI13)X0fhq$gNiOt9Sqtz0UGxJjhKPPc0gjFmHHqI+S>^lc?F4q z{0AEU0I3Is2}lfd{vv2>0W<;)TDbrc1C5J-#t}gJL1jHi45Sy-?f{)r3z{APiGjvR zK;tDK46c`;XWD}1CO~qaIRcP6kUQ<6XUKxqoq@za=7IJ)fkwk&D=0wz0-Y%d8eIm7 zgVcfC0U9L-@j>h4U}B&%WC9Kr1*vVxSRe z(5O6Ur~))14-*5O1_u&@t>yr!1C79g#6WAwKOiYKK%(ATp!H!OG0?g&kQm6krBHJ~ zD@Q{TDS*y>(D^Ah&>aP=WNeB8h=^OM%2-`!ql^O>-GRXGSnE%tKNK+Cc?U zw**NHv}+0^2AW9$IRWIBHBkADP#Po#+f}s#Dh3Ka&`v7Q%+?;L7%2SqGBSYAzTOWN z1Et9$P&Q~s703>d*g2@!H7E@-5439vG&Xw+Dh4v|HY22OaTh8EatmnZ7AP!0JE}nD zf!Ls3RUm(W_LhLeKzZgRBjmjAH&DHxG2*9C_6H~pQuht2?k7|Xr0x@x4Vy&*xev4p z3*>f2=u8mEeW0V-Kw>OVF_2q8vrQnka6!dD=5a&Wf>0VH2HS-t2^9m`0ottvGEWvN z2C_qr3DOT!fQo_a0L^59>`;Y@f%K?B*`S#%P#A#344`5bP#R>16%!;(ZJ=TxJ8Yq1 z_E0g99ZpP;eCY}m1C0f{L)ow$VIVO-s2FVb7sw9Kt}jsC5Dt|C*%846IgdOFDh9Fx zv`-Y|j|3#KEU3LXNMiX=u|lXAsJ<$Kvg@HVNURac2JIXJg#pMd6PO_V&Ph-?kXt50 z#il~VKyH}{wPQAt*gUA%0wl4;P_boDG0<$&awvNZlm?l%4ytYwR18!PZicdVKxvRV z(99wz4E7+29fayV3>5>_*QcTEb5I&2b^*%145dN-y~+eR+xE+P*$iI$PP|sNc!VO60?Si*+IoXY1|&l_JYzNF&`*997==ijbw(T z`)H^b$le&JSR7OgWN#AGjx?wks65SPhV)-@ki;sPA#Kkps2E5uXvP;5FD*!7UCfX> z1Gu~W>Dv;I#biJfDH+y!s}N$e6c3Dh5Np<%#Dt+@u-SW1 z8kc~I$w1YCRwBzn*-B6vWS%NiojOzug=HE z9H3$#b&gQB2b2bhc|q9$P#TmMf>@yA3Q#dnUI>MXg+s+ac0@z%h(!`hhKl7u#X$bZ zhq8;IG)Qk5R9z!f3=|(NPW+bs4P_ey8 zVh5pOr;)_YLB%d2iCuw;T}KkT1r@u8B=!(0_5?}nIaKT|lGq2R7-*FSs6GPu_d8VV zHC2lz#XxDp94clB6$9B}3$?=@Dh67`;Q(bjLurthE0pa4r9pOhu|md; ze4t_=JA9#H{!lTH9YIh#LZM=yycGszgI2kK!W1Ny2o=kM(jdJ#P`&w3F_5|fD7zd= zgTyMK>;@5+4Nw{+wh7AK1EoQ3*~bdWs|TQBAma~0#STNoKz1C5`u7x64CJ@d zQ1(SA4N`X*s_rUO3=~H2(|YUR2|6P&#aJpa=s#oeP@N-OY;j!><=rXeee$|1`2!7Wj>($E|{Tn{2(z_ zHi%n5E1N)R1B5|#r$fh`3ZUaeAhBYoSQ(O7B~+{iNvs|!)`%q50u^gR66=JDbt8%O zLB%E@iA{!zO+^x$0Tr8tBsK>sHXliBF;r|RR16f>i=g9T%b{Z6G$R0MOYDb=fzr$Y zsMtZM7)afH0myoV2T(DPx`$A)M^G_PSUrc@`wl7w(hItn1$4>~lOSTuk692hm%#!R z1L@@!gp^~vP%)5R1wlw#Oc5#uvR4TzrVJGW=~aX3)qskD^o9t6&c$P32!)D)^oBvj z!l7ayy-`rTF;Fp(-XcNhI5|`dq_+erRtgmZ>8*t7t%iz$#^q|D>}DtpGH<>hq#d^a zDh4udAyjM;R19R^QmA>$p<*Dt#{?lO)Q&^NKzdI=#ZE%SKzgr0^J*{sl%ZlEJDh|d`PCUJ26CSZRLm7B22z(O1epg(f{KCEB}2thpkg39 zGN5*3LB&9NJA@!{*$EW`>Ft7wbwkBKdi$YzCql(QdRGfU`h;tsVj#V1p;j;~NVzC*=8dWD4{b)1MWBAi8`Vq#D+kX}h)NH|MF#Xx%H zpz7qIVjz1Jpkj(pF_2zWs9trb7)Y<3FvQLFP%)5R2dJ1MR1Boo1*+E#DhAT)303C> z6$9z@hKl(>#Xx$apn7AF#4?~_Sx91KP_YWA7|4z(!jOK`RHzupj%iS_=}<9{9kZZ% z=Rn0kdgnvcEr5!F^e%*oErN=H^e%(yU4bOF5h}JBDh5i=+d%{ApgposF_7M4P<3aJ z#O^@F9zexFZs8Syq#-^LMEvqY#RQ;YAa!aYkosF4Dh6`122@NFDh5(#4;6EOih zk;EdQV$n!qsZgkf%LjT#oVD{ zAibebz2Qh=DNwOAB(W^0ST0lyWJiw}q`lD#6$9DP2NmmwihPnzurBE@Dx(QId6QN=tb(5fClc8cDbt}ao_4F#J7)ae}sMs2) z7)aeQaY#No4iy8bI{_6t2^9mWyARd-04fGj_Yf-f2r33r_Y11`H&hIy?hjP#FH{Vq zPE-QoJ~0VMn1a-aL&YSZVjy(}P%%TO7)YHFRLmGE28uUF2}m3{L&ZRP%OoIWNjX#u zq_+YpRtXgY>FtN=od^{J)gMzq6Re<7|6WcQ1kXe z#Xx#LOF;757pNFW?^meUH>em$oscBN&BBt1a1nuui9*Fd>U1R`=~)jd1~N|{DrNu` z1F7?ogp|9!P%)4?Kd6{LR1BmpT@sQ`GoWH1b(v7HET|YrU7I9i47wdE22$4n73+kG zfx@6y5)vQ%NMe(qVpE`EAoI>hLc;VcR19R^IjGoqs2E7yM@dLI^a&~kQui4u_5~^i zinq(433UbrhHp?YkX!yh?fnN81DPi(1sMkrlR|{EI8;mmDh4v|7t}l{s2Hg4Ee~VE zXwcoSP_{Od2HBwtHBTQZ26D3jRLlq}22$rP1*um(pkg3(o=`C_s2IpCvY^Ru(EYAZ zF_7N^r6A!P3>5>JS0n{#dly5+K<1S|#Y&-KAoKj8=9NRmKwW@pD7ywqgO-PacD;e> z4VW0n-g>Cs7Ab7IYd|V!i$U%I*#O!J2O3%i%~yfMKx-{PW49o`fYv&I#6W#K(0n;) zP93z?0VD=m_W)Yk09sE0It2nG22uy|D@Y8qBM>A8@;~SvT@VerOBW;tTA~SB?*O7f zYaKvhpsqS-od$>o-Khx@1L*_Zum&nhKx-X9VxYJH-J=VNC)m0N&^Rk--2=#du(b{# z_kr%w1<{~;G+}x{cZP!0!PY{6+yFX%2qXqOu>v$+0$T3?@(1X?OqgEK8V69cf$ri2 ziGjihw6*~>*9$r;2P6h^ALz^+kY3PQ2ap)Z4U?fK^uo?Q1U0WgXW4+v0IgR5sROwM zv_}&Z?x6E(U}B*2YCvM3GiyL%pfG~1T>zb50}=y;2Wb5PXiW_0TpExV=v+b2nKdB4 zU52hJ0J#OU)&MlN{}?I;ax>^$MUb0eYYjkg30j{3N)IoP)V+k>`wTjJ5o8C*E%%`J zM}yWTfW$!Ny@THA3_7ObKBZ-05Wq`~}go=UOlEDbM*E;M;$02)}pZ-MNE zVSH*~a-b83K&M=T`1t(~S`7$Ng&Tv;9|zeDYR`aZ+$s?=pfy`lK$R^)|AT5Egg$I6 za{LdP57&T(Kef)Pft&?{SkDQnb2)jl87jcH9D{DJ0o{U%%7^3*P)#s+ z@+;^(5>Oova}lIuf}9xzIx7fv>vRg1Tc<%{*v=LL`5JU*OcD6(e8{cS$fX4AWE2<; zi7(`nNkA=;dC=X^q?91kN z0y=FTBnRtFfY_kZCP3;yJqVCG4+aJXP%i=`Hyzpn2C-*A?=S$ZLI$Y=ovI0H@q*;m zA*lnMA`dbTw2~O44ipBURluO$6KoYQsJ8*S9|0r>T7e5v2hzjC1XV>W91nC8>>IC`iA=Erj{62!J1Ffn}l-1urF^zt9nngI0xYe;NuLC#SF zwOK*^XJ$qQ2GAL{te~~tj0_B*_3R)y5C)}iP|D_ks^Mc~U;y=-L49VB9w9~s22hFz zrF77#MxZ+v#Gz_I{btY!N1%Q)=yannP@kERfk7U$4xW*LK@qABbgPRBBLf4dPrZea zfkB;-fdSM;1@)aleQHpD8g!!zs1FUY6SQ{$)Q2`?WMFvC$iM*VJA>|W0QH?gCncFP zGB8*$GB8*&GBAK{c(G<=V6b6iU;y=}L8m9#GcquMZg~OS?&1V>18BbkXs-ikj{~TW z?ZL>v;0cuj*$Kj+@E`_*`raV*k&Fxspj%)-eef7Y1_n_78*~E zz>v(yzyLbI3A9H7)XxU(kpT6}GZ`5eK>c!1e>{hgfdSMX&x5)NbcZ6S{|&lH2Gsv9 zVPs$c^}Wj&85lr&CqVsg(0&P!JE|EO7(n|aKy1){iF!r`h6Y9k2J+9?1Krn|$uN-h z4|0nU(mqt*?+@BM!~lvRP=1ABSAa%{80dMifGaybkg!tlGE~M;%l}<2U zfJPlaVxaL9(AX@94ZArMv|nNt8TWtU@Be~UYQt>DPQ&`2Ah)51I(8il44{+IK=-|X zn5gnKq z$Yc;3BnKJ=hJ_rYEkwPREa^2NwljN$I`@EvqA*&Zp!5my0VwZ)Ms+}JQ0fNJps`4h zCJ-AY1{zO;g#xIx2MGm`3Q$;pY7S7f@60%m{>Ro52t5TlVF5B12XZM4Q^)_Xoot}e z2DFonkzp|TAJo&#I`JHI2qZ@QgU07Tu?I@spxOY`+W?gtATdyb5VR*3)M^FIJ%PkP zE#4vq1_n^NfSqa%nkxd$e}TdjG%o~F2V#TvsDe@hY#%JB+yKoNf#g7rfvE%Sg9WLB z%@KjbL3dGrdLW?k5X1+yfQcwC>yrx3Y5|-P{al@{?PL;DE{2NL96pn(=W*1pqc;_7NEES&5?lO3brpA z6jz1NxB|r)NL?amzdR^#7#J8}^LZdHDBeKkfyRJA>OgzHLGcEXgPkY}VuRuhqz*K% z2T}(r13>Wxl3M_s2LrJO`-qwSd=JoeWsLj)>T!eo1qwS*F9y_;hV5?$r5w=QAV?l| z>M1DYze}U5A4Mhh~5rGkA_{tEFk3sbcD9ymq zD(Gwg*a$vsz8s_ubUpw`9cYi=K%XyXf7Gl#|D`SyJQU8{Q~tbkAt=;V&ntRXalHh0OfyB{Rm=%$^j4!s>?uaDCF`4 zBnC=JATf}SK_BvRHuT(K<)vpB>|}imGLk!&?(U%G0>U~m>8&>2Z@2|S(q5; zz9Nv=bfoeb)Exwgf!0{S)PZgg0g1s*eg@eK8d(I1A)f*bS}Oq(y8$&1)cOU@Z-dl> z)*%oZ-XQh3@Zh_@fqR-WXpssy)4KVL1Lg* zGe``?2lcZ-Y>+u18Wakkng?VCsODv4AZN~+S~E_NIWWYWCBqXvP!SLIIn1>n7sGr3 zYW0GA1(E|P1koTdSUVErGmsdlF9<5{L97cv}VuQ|v0ns4yK`J-Gv2`hqVJh_JY<6fnxs^ zG_Qcvf!YKhb)ehEK{Uub(0U<|d7#mAm>6ix5tJf8XO+OjK;woWG0@l_Obj$;2NDB~ zslmiRV__h%4x~|Y&^aFW6+b(VP|K6#NI;1KqJ;Ly=Kr+ zZqOMEFtG-x80ZWGnAkq3*i&c=8)V)Gs2DqR#26$d3O(T*wl5zf<_{G^-WNX^DhAtk z4pMgoDu%pYn+tlvxfRlWSx=}KXpb?>eGSk(w9}#LK#iOkQ1)yn4YFe{RNVro7^u$# z+HVXxVs!&l48&dp3Qz_H2H4(WP`X_RmEQuTLFR3Pnzs{4>?8|h-#%zRG01(Obb6Hq zvft|(R2?Yaf%<76Gd{9lA6ZwLd}i9;gpVY#(qv8Xxs(10%xG^OaR5* zU>i38&BB6O%D7_+yA0@pUC>wntnCF_Lk~LN4x}1%mnp1#1Knu~QU_ZP4q7h{8utUK z1D#a|QwLfZ0a6FLs}v*#YFC2Jr~|13jr60Z5&Y?oHuDdlc3vOIaRk;s8Zm%IQa~=p zjX~)jH0}b*spx*grAva5fngg__QOVRaG3;N{|c_RKz4&LZj}g`2u22m4p2rS=zmbJ z8KDmw3*>)LPYM)M#MgV><;Lm+ja9VQ@kAPlOBK@DEmE)q~~2lc2xr4j73OVHvc&?qv< zJ)qGDkUmhW7_>tLWG?K+X%HJUG6Av!cCsa?mIs|)3F>FVMk_!)D$s~Os3i;c>4Msq=IP_GT74s@y{NG~Y$JOfEEFff36 zXCN^U7qp85qz<$T10)7A4>U&zl7sE40I@lsYnec~8l(;s-muwC(5erR7)Tvx^#{m2 z(8>;w7%10*R(OEqe2{u?pj{0hb)c0JAa$VG70`+akUCJx1&M*!pc5WJ>ZU;Tg2H$z zR1&n#3Cd&u%~^re!A@BO#rILDB=WsjpwkjT>R=}zg3{SDsJf3(J3#h=PCf*w`vnyP z-5&lMs*Vk*=Lb6F5TuR|Dh6t$fKD<5wRmAC6@o^#_(1{;3=FWfRvptJ!xfe<9-3>5>Z3t@t^u3#q%g4BUVJ3*uR(NJ|Dx4=#o%!G=8 z^n%uBf$|k-Z5GI0kls8d1_qEAtoIAry=4t`GibdQNFB({pm`^de_^K$f@(5QFBv4) z3$+8p2Aw?&`fldSj*$c{_pc4Z@ z>OsA4kQj))9~yoqpmu;p6Hh|jd>$$WQU^L65M&4FL_m;U&}hvysJc5y>Ody}g4Ds* zk%7_%Y#kZ$seiAa_QFp61G)J#^d!LFQ1d|L24N7aEumyz$XuJ@V4naH2Kw_Y>8#ICjD&IgO03b2YXalHR29<-b(PEG~&?qs; z3{V*kQU@{zly*ST1xjlmF;Mt`;t-T4KsyjYVxV*lihqzg*hm;i9Vp*|+!GBQu>y_m zf_52#)PZ&pg7kvaf#M59gJu{(VxT+$nxO@$n*`Mhs-Hk3(jawHp<*ERG!Ow=8weEx zxgS&qfL8x6f{KC61JwZ_G0<98kR70%P@oxMkakdu4kQNh2dHcZiGg;vfy6+qeo$Eq z5(BNi1Brp^9?&X0kQivC2}lgoj*4lji$uJP< zH--VUTOyGmmjSY81k(2K?DYdh4Y)N2ax2Kqp!9JH>Oas)yC5-;9B9N4mfnz2Vqc&iVK5k{C$iJ44`q~1B?s|2N@X{Ky#6Y85tNrEd)@@05mRqoRNXy1S12( zNk#?+PzpHB$iM(PpZP2!0|V%6=JSjU3>O#~7%nn0FkE6}V7Lr*!&OEG2GE(!*BKcY zKr6LxGBPlLR%(M%&mBev22jcYxe?Ubc)-ZO@Q{�dzL=W2k;m>jTv40I31p)CoGH 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 Hq?!f*0Q*7s delta 1808 zcmZp8!rainG{J$9X``bulgz*W|Nl!fFfhn4Ffhn6Ffhn5Ffb@EFff3`CpR!vF#g*Z z$j&&4#fOo5vLcH---gd0rls1SWMpPwU^rkhxr*f+Bm3lwI@*&DaIj3SVD(`YXJBC9 z2a7leuuT5J8o*J&z`!sWgag<@Y_u2{7_=D}7^X5XFz7NcFz7+;GGJg}Fl1n0n9jh! zV9db4V8Xz_V9LP2FcT^dcFzO09UAEj3=A0z3=EkJ3=CNe3=G)}3=BC83=Fvp3=DY; z3=H{D4U-SBi`bMgFff!eFfddwFfddyFfddxFfddzFfi0GFfi0IFfi0HFfi0JFfcSQ zFfg=y{~j~{qPX+KgU?L&R>s#)4&*SH?7(q^IgNo~vZGw!byL(%4+T&I{PA7(L}{Dm)sQ4A!(mcqcmaE)nl6~7lND+2=q z7g$h;fq~&M$7DVMx5*9y{`I$*gBiIP82R|L@&@ka!FO14A+c1A`y~0|T=7Qbq;_Wk!g&FGDFq z4nqk;Cc|bv!6e4bKZLj#C-WN$P0kaNn#?0CGug~shS7Gip`hX<5$DN=Sqxc)85kI* zOs*91Vq@fFU|`?@dqsqSfuV$L@-GoDR(S>n21$@0qt4_~Q9m|@|NsC07XS%xgQ5@Y z6$XaMfr5sU3xo_N?-O5=R&t;KA)9CBq5|5Rix|Bj;pW z`O?WJY`P{lNNG&|U?agEah?lg>f}Ia>B;ltML0q6QNfVRU^V%_v@6)Xq9E&8L184a zxl+cPak9&7Lr^?uux$P%TgAj^Hn~)xp3!{rR|P+iA19Y6hA_&2^lbj3c%F%k5#$9y z2w#PVV{(&y9ls4jK0^URDnlNF9Rn`|*JMYzMoclcRtz!52rOdmwUcXfMJ9)F7&4hK zPS%j{k*r~`Ven%QBC-<5m z;xv*hznBq<(?{*5r>WEB>v$qn|0*%+i47#R3K8Fq4s!+A)Sb_`(@ V0*P$?;&{epa>B + + @@ -488,6 +492,10 @@ RelativePath=".\Src\os.h" > + +