From ef112855bfb2789f9723d15cfe7880d7692f1d15 Mon Sep 17 00:00:00 2001 From: guanyejian Date: Fri, 30 Jan 2026 17:04:39 +0800 Subject: [PATCH] update --- calib_board/Core/Src/main.c | 4 +- calib_board/Core/Src/stm32f4xx_it.c | 18 +- .../漏液监控主系统_屏幕通讯协议_20260122.docx | Bin 0 -> 12157 bytes calib_board/MDK-ARM/CalibBoard.uvoptx | 123 +- calib_board/MDK-ARM/CalibBoard.uvprojx | 60 +- calib_board/MDK-ARM/CalibBoard/CalibBoard.hex | 3171 +++++------------ .../MDK-ARM/RTE/_CalibBoard/RTE_Components.h | 6 - calib_board/usr/app/app.c | 131 +- calib_board/usr/app/app.h | 9 +- calib_board/usr/app/app_com.c | 7 + calib_board/usr/app/app_com.h | 28 + calib_board/usr/app/app_leakage.c | 100 + calib_board/usr/app/app_leakage.h | 62 + calib_board/usr/app/app_timer.c | 195 + calib_board/usr/app/app_timer.h | 48 + calib_board/usr/app/os_timer.c | 121 - calib_board/usr/app/os_timer.h | 29 - calib_board/usr/bsp/bsp_74HC4067.c | 1 - calib_board/usr/bsp/bsp_Led.c | 18 +- calib_board/usr/bsp/bsp_Led.h | 8 +- calib_board/usr/bsp/bsp_Uart.c | 396 -- calib_board/usr/bsp/bsp_Uart.h | 59 - calib_board/usr/bsp/bsp_uart.c | 489 +++ calib_board/usr/bsp/bsp_uart.h | 70 + calib_board/usr/bsp/tjc_usart_hmi.c | 1320 ------- calib_board/usr/bsp/tjc_usart_hmi.h | 155 - calib_board/usr/gui/gui_tjc_hmi.c | 604 ++++ calib_board/usr/gui/gui_tjc_hmi.h | 22 + .../usr/protocol/proto_modbus_master_tdlas.c | 14 +- .../usr/protocol/proto_modbus_slave_ex.c | 23 +- 30 files changed, 2786 insertions(+), 4505 deletions(-) create mode 100644 calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx create mode 100644 calib_board/usr/app/app_com.c create mode 100644 calib_board/usr/app/app_com.h create mode 100644 calib_board/usr/app/app_leakage.c create mode 100644 calib_board/usr/app/app_leakage.h create mode 100644 calib_board/usr/app/app_timer.c create mode 100644 calib_board/usr/app/app_timer.h delete mode 100644 calib_board/usr/app/os_timer.c delete mode 100644 calib_board/usr/app/os_timer.h delete mode 100644 calib_board/usr/bsp/bsp_Uart.c delete mode 100644 calib_board/usr/bsp/bsp_Uart.h create mode 100644 calib_board/usr/bsp/bsp_uart.c create mode 100644 calib_board/usr/bsp/bsp_uart.h delete mode 100644 calib_board/usr/bsp/tjc_usart_hmi.c delete mode 100644 calib_board/usr/bsp/tjc_usart_hmi.h create mode 100644 calib_board/usr/gui/gui_tjc_hmi.c create mode 100644 calib_board/usr/gui/gui_tjc_hmi.h diff --git a/calib_board/Core/Src/main.c b/calib_board/Core/Src/main.c index e632689..3d8ff4e 100644 --- a/calib_board/Core/Src/main.c +++ b/calib_board/Core/Src/main.c @@ -92,7 +92,7 @@ int main(void) MX_USART1_UART_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ - App_Init(); + app_init(); /* USER CODE END 2 */ /* Infinite loop */ @@ -102,7 +102,7 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - App_Task(); + app_task(); } /* USER CODE END 3 */ } diff --git a/calib_board/Core/Src/stm32f4xx_it.c b/calib_board/Core/Src/stm32f4xx_it.c index 4a0118e..6d5f635 100644 --- a/calib_board/Core/Src/stm32f4xx_it.c +++ b/calib_board/Core/Src/stm32f4xx_it.c @@ -23,7 +23,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include "os_timer.h" +#include "app_timer.h" #include "bsp_Uart.h" /* USER CODE END Includes */ @@ -194,12 +194,12 @@ void PendSV_Handler(void) void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ - OsTimer_Increment(1); - COM_Uart1.Rx_TimeIncrementInt(&COM_Uart1,1); - COM_Uart2.Rx_TimeIncrementInt(&COM_Uart2,1); - COM_Uart4.Rx_TimeIncrementInt(&COM_Uart4,1); + app_timer.increment_int(1); + com_uart1.rx_time_increment_int(&com_uart1,1); + com_uart2.rx_time_increment_int(&com_uart2,1); + com_uart4.rx_time_increment_int(&com_uart4,1); /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); + HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ @@ -277,7 +277,7 @@ void USART1_IRQHandler(void) // if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) // { // __HAL_UART_CLEAR_IDLEFLAG(&huart1); -// COM_Uart1.Rx_IdleInt(&COM_Uart1); +// com_uart1.Rx_IdleInt(&com_uart1); // } // /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); @@ -295,7 +295,7 @@ void USART2_IRQHandler(void) // if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)) // { // __HAL_UART_CLEAR_IDLEFLAG(&huart2); -// COM_Uart2.Rx_IdleInt(&COM_Uart2); +// com_uart2.Rx_IdleInt(&com_uart2); // } /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); @@ -313,7 +313,7 @@ void UART4_IRQHandler(void) // if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE)) // { // __HAL_UART_CLEAR_IDLEFLAG(&huart4); -// COM_Uart4.Rx_IdleInt(&COM_Uart4); +// com_uart4.Rx_IdleInt(&com_uart4); // } /* USER CODE END UART4_IRQn 0 */ HAL_UART_IRQHandler(&huart4); diff --git a/calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx b/calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx new file mode 100644 index 0000000000000000000000000000000000000000..c83294b34c45c2c304009ff3adf96f38bfcaca71 GIT binary patch literal 12157 zcma)i1yo(hvNrDSa3FYa_uw8NxC9994#8axf#AX2-QC??gF|qK;2!Kh%*?%WC-1(0 zy95 zf_$l0Om&6TQ{IgCCxQ>l=tRV=?SYRhZ$W|Qxr@gImbyr24zY^Jy+a6FY?=&tB_iS{ zr(SC4%1ba0+-7Q?J(tdLHug3IX)4XQ?dy<;akx8u`jrabG}sHoL%i5i!9jfB93@As zi5QIqYm>-=IftHT)s8SSx}SFN(2Kn1O_@jPoAaUlIvkc z3v{7aCA~;rkeh+aricS`%ErJDC*d4vuSc&kT+BCjfzk2zlN4=*`J5a`hKD!ta(e3h zz?flUOk~x$P^<`@jV=sMy&5E4hTzzc7+^|W89~!^C?V|UtT$E5$3N6G?rON+&rT3l z(g{N(wHS5;QI}Oj*k4k zOETA+(+L%gP!t&>wkA;m%g2KV&-|rzl1@@iqbcoVmA#kW1hE}g@^(%wr^*rDKQc2c**@4}`-*UrJYxk8n@T^0oTx}oB0crkTXTs) z!wA&!jds`*jc^)4-Bp2A-8NIci_5|!r%M~h5rp2p@~|y-o{4i?{n59umpTyxXdJtIokdd;pupqyLAnmc+cH+{QYYPYUebE;3liuuKG~{OlcE@)@^Y z078DQy1INNmM&4>cWCOdn2M~=XuuTuI@nI7=5=F5L^;vQECj-E6jUG`jV3Ke&M+%n zxk%+?Gts*UGQ=gUVnYL)Xz9WH$z57vLPgcENwG*((I#i+FZ^FiV{yV)yf->wZ5!u0 z#N&Zh$1{A(wGu8^p50t(vu0|6>m28s6z7?yTfxN3aM@MIE>G>quxOhs5z2zet>7gq zIEH%X*(_xlV~oi4TIl>bRn4i&=98BErOQ-#J8+_?%Wy8ENW6IWgNUi8%y!NwKD7rY zR&ty7tCuIhZ>w`*rIXQ-7?b;R(>3H`xhRF|fJ|3nB4LQU zBwznd8FJitg*fB$70Ro({(H!S26@ZH*52s1aMzo^47mylhttMjV5t8Rad33AGIsdG znc6b;TZ8B;yxlHBdd5r?hg{!lvllT}VvU@_awBDjY8WBJtMkFJw7|rQD%SH(Hvo5> zH~gupcW7i?7HSYp(Qp{2#;PU)GsMI`ZsFvo0VN*>jeZgnzqx-S4}l+I#B!67VT0m* z(?)M9HAt3pR`t@)_L3m)^Vl;mYaHJp&UXn$GQ_y0_mk<8uZ=LgT5rfOo@h9h>TE}= zIC1ApkwJn*c`f9MB=YmHJqu>k;F<)Lq~xAAH2HvcR`dwMCJByTbW-ZxuXq`rj8NZ? zK8L(B0d3~z(5LuRspiBvw zZoD4DO&k6#={-T>Rt-aD{w7M+riAgiBmshrpaAPj-A`_TY7H&bmiCtX(QJl(6x#%y zR!p`&l>-wv-}n`CPMT`1{*Uyg$g380@3it3^&?eG8d{w_-vKM;xbAfbwY;?{l&UnK zx|-ezTnY*s1+q47I;e@cm$R&9S1Ny7zSLczQbi|9aShief-{vp_{ry-U3Tt1m@JlDG)p4~Qp>3nMEFqf z7vWFD_X>{E@sy^TL#WYvkpI1v^1m1ov%$bOUvry#aOYgSzAbz-1nb z+YXSN1YD`(L4Z^GZ}NoUAnAU2YmSxS0KG-(=^CN7i&ia0wxOfc%NC+8zX(K0rOKLO z=pHVjG0UwQVprRiS((SdTEt<)BLxV&a~R@F3A$Da;*CP*3t=z5%?l!vgMJo@mF%|% z)|Yfqnza)AsM+uzU&mnAMYh4m$I|}7$){@laZXv)9a>)X)_5~=*6Z~PHlOOs$Fmiu zjw$t@Y@5F*E`lwJWiowH_7=Jaz%mzp~EU1b2P2&9@02=tZ4CxD=}HiK)P%}PK$$+FD{oHev~ zEF@Aav#hZ(nDB&y$!e&?ilX)GF^_)05PNy&W%~svK{vY~&xI=9%)gKRmgqf&JkW^; zj$p{r4kAw7KS3bB@PPp(#9oY<>%$dui4xRJOYQ#b^X zJMZKY=rI@1u$@)QBF|4W-tql1genmX%HID479TH`-Zr&xPpPQQV8tWLSt_P%<)CZa{BC%A4|JFh`71IP|SlBqdqRP}{0vld$E*?3ha4lfoaSav*#e~&HBY_(e;X_=|W{0ULLjb3eS+Sq9#oq7f`^)X>fL@qU-Im70nergZY3!! z6EKEL86{PdPS5EQOaE5gqk18=x~SCaXiVJT!Tz|c&MWu^XQf@tqr_G>yUnH| zM~s=E{)vo%a)87tZNSNh@pNFIB^Y{h<&dZ-`xg|RP_BA(J%{OfS3?aelqDQn`p_}n zmR`U}0J<%GLXE3oaB3ewW}ALhoy_#S9|I&FJt*5+MZu|R=4d0@TBXHlZPvK78BSRZ z(l>)+OEL8fiF@sUy4bVi0F}cOIwril8P4#3(}{Q9Z@*ZZH8le=CfMp?60NQeAhpf7 zI_Rb$dEQ^WKv>JLs*aQ5;vCEsk4V0%&iI!_@q-$zRbt~HBkVy2M5VYIN-=MS?^K(M z<`h|jj9%Q%BDHumT)Q=DM2D~sFk;{^`NxD;7b!t%!dwlTexK#5&L}Y(kj}0kuK1CB zxlKbT(2`Uu5vR?0I7K$7i0u|)Nd;%fzbpq8tT>P z6i)W!*L9APeM694?+PH}?r--ZYZItnX?+2oBj2g~>hQDR`tv*YV2o7x3i-7PlvFOk zM~jHu`P&1c*s~N|7$$TxVo2TNes+NI{J`LR2OlkNe^=2xfgzTbA(5F*)poobyuHaKFI+uB%KnzcER7wa-{ zYGrQ6#P--`M6RB`#Cbo3veY=OWf^jVFLapN&*v>)$VpOgl2*PRVrzBJXiowQaeH+% z)#hdEV3ZTJTwV=*lf!jq_}$3%C$v9cV*fK|Wvi@g>3Qm*78h`+n`jEfpv* zutZP-`MSUQBU^MZc62niG5sSM%v1ZMyv&W|y_WQZir?|ISL%Jy*GW=8tmZ6ZW~&V2 z2a37uP|0Y+?us??p^zHUVdo{Pk-dwwhp2JEHoLiH;CGb}4Xg~LoHs#QI4V{qQ`1}3 zJ~-F4q}e1N5E8|CC#MQR1z)&rF_8N+6HiFLOu|o?Dw=&6 z*peR2R6t9vaG|F+hD+!{B}1z|#3Y1T*Tl*fl8Lsh zurBH`1h0C)GI=+*=t_!FlM1C6=Ns(cVQluBiJ0Z^$Pgo><(gosDd?NslGxUH3hY9{ zk??SSB1y;*uyo<5lUnfh*lsh)QRerAesuS$$+c?IbJ>mHK=$4R3?!%hx^M7|dF-}O zq4iTI*sKoAMnO;zRHU%Wz8<|0bGatFQAR~ks?1#YbuftH1oRuG;-MYF_{o^@Y7~-6 zXyNh&s|~=zkf@b#l`Cv=@}I@iZT;|T#~jb(#Ck81nu8CT+xgCrm$=lQ_kpmZGTHAV zn#}mMGI6D=_2wd4yCe8I&98qjR`yNd5zyzkYu;C*Nr<7)BpWcV;WtKes4b?qPj|=4 z6;_IW0$=P--JVEB*Vb85-AUx|Q2Ejv>jsQz_b#%_%A?dyfn{#APNk=L?$Xgx1m_as z%4@<_$8yfR(T+Mq*BN!Okj51=eUa+nnA%lRCfh|Ayc8Ylyj3gHcWWc#)c{bPa_Jtr zQ0+>fMR*+*9SgL^K#L6)W3Ql!s}~6pDwV8jVpFXXiDK}Ar@(7j6)m!iHZaq81;{9R zc0nops4O4s*y!>=@vYQ&3gqh9DhE=c(Sxnhbi6t7=+|mW2vc*xD$raBfiOLF2}e%u zO&F=C*GUaP`3kEAorSbj~f(<^*jCJ8}}V+p@0D*U+fDn?t#MIS{aEu+8N)>}K$-g(&K-=$^~8h}`?%rzv38xNPjya+iBa ze#sYE8<~CVqIYL_2(3^9dIt`UwoS`K6;Y8P>labcjmV3T|HK~6HbWw zLO<~o`2!~O`*9b-9l3Pf*9cCO+Ru_bBWokF@0QFn)0}I~GdC_vrKAbf`wCtA%djHi z+vCHAU_w%aQpIiG3&7jFu@xUbgs2ogi=SyAIg0nV8Fmy@W8;Z|0(!~ILqti^;l!<8zvW4$H&7L=49TV6x)UxQQ|4zj1gNZ z$-sN3hPc^G__qd~orlVRhI!Je=Ch(v?nhY`p-@UpR~3u##d#PnA{oa+y>hALnS~-j zsV00Kw~qqer}yLujB68Sc418<^tJ(Umx_4np1lUqRApy#dbdAJ@Zf?k@D$^>)VO=d zT3esaB@-s&KYR{^jGXAhu?Q%NjVTL9W&!F`jMu=AZ!9OCBT2dL3`vYm!S9dlOK^k` z0PxA&@V2QT>s(MCHg2>`zX3P35IC5#TPxT%DfK*66f^ohI8viVpj!uI@|sXVdg=y( zi;HxBRl_^bZLIP#hqT5PQ7MnA+jhRLh@^ws%qdQfq3W^!u34sI`7`zxhwreeR>h*_ z6+xZ=vQQ3sqq)^*M;lJdG-tm$q1~yRmIjTolXtE%F9FyoE+xllg@@}LgZmX_>nYdH z4ZE8hgX>3hcZiBq7W0Hp1V(4!*q#+SM>8HMI{r%17dhCDSgL?FcRxl_Ly6ngGn0zy zmT87{M6AlJ-1uaJQTqc*&A=0uc0^t55HhI?q4Bq_VG=^iDA`7XQkC-2D#bjLI1+O% zZ0s0xq880UVcbcBYOYSeOf(!#UH+Hz*~@~i1Ao&3RBs-yyR)mV35h83x~~_#@$UCe zxITi<>~}{8E=)E8J`M#KS!aY_3UU=?B@z89i_-pIw_yei~)9VTn{eL zz74oiSes~)ham3OnQ>Sl)E*R^OEKpvdt-vD(kbR;aT8*Ko4&Y1IVv&PeN?T$p6wv9 z?@VeHHCmFNf;s_=@2dyNDH#_({oletKu}_p6$nao8dlJsTNTj=+y;?dmqN2hm zvAg4>q`$UY1n28OtK$5Y1kV^AuQ9^Yd|boL?otWOGO;jkGC!;4B(Bb6q0-rl@6&rX z$ON75)Xjz8t=?q|UHJByG-l72W$z9*)ftW>U5;1BE`>yBG!c&DPO~l8XmFsils?z1 z2F3^h@Z=T45Q$YFxdb{fI?hOyR)&xKTlxWIng^a#dXjE5dZ9yv)3JS*LYnyu657+d zC=j?m&YJVn>Ymg?#0<-wX>4BF8NdL;Dsj9C)h=agO};-^E%nX#)}GDl_g}DnKKO99 z!fNLu-j*rT1{{D9)IOp9GtspyfWDFfCAl_A|B>i|%0W)n#x{B$3O z>`U=+2|W31$H$y};6B)AW7WcX;H`j-=w`(6x|Ef<%eC|ELEA+8%B{2DuR9~s3E5@g zeb*BOgxf4E(-t1v(a%(YN(0^r{DrxV%+)_w=uVq%6b@sF@&(>J?=T6_qJ+6M6#tRdS8d|8bz8B>ziLI}FDr?=rytgU*4jZ==3?xKorRi8DTwBDi>p2O2 z$B@0aY=$4*;K=X;$B&^|kk$O&xsAuWP(C2)BXj9s@iYTYsF%3l&yglo67xv``YX}7 zT~V6yNB}qAhPxj}^4E6kszL0kUUX=O|d4Lr9 zON?(UT(O|WM7T&fH}gT`l)`X*_j^Plx>@<*Z3Y*J>ijak?MB#d;koPOYDU!8i`&9a zT)9R*afFX^g$*Skn?meb&nG*-x}}W|j9cw)t}mPJemz}G&)z*UBv*Sk)t=v;nkU^I z7$(WZQ-_fj_A$%J1LXk&82+A)`27As>quZFuB;M3u)Bf>|~yJxHR zd}Z)7M^B+*vj*Fg7p>9$D0<(GK@%WV)E9a_&$K?|UKD=B7Uxk@OAp6Hb9r_C>+lih zGh^40pVnQ!{r%i=IBec^9^H?+~Ds+-c$`>EDf-N@rV);_e2nRJR$1(Br#b`+`HpB@SMq*I1TAO^*#OK2X;OGXp6W2l@2OE~A8q1zW$vN4@=W z$n~Yek0}?I`%_CbN$<$wW%fARHHurCaWa|^vsE?PW%B44(}I}o3;;^|nfytb^07-xurGWot? zljcablnYpkDdd(cps^+ObKbrKmd7pyW^$9$;`^;#<`)bGWk!=)0KrEHh8E=JgKiRw zo^9X|rpfZn`GhB7+)j<|uvA!L;&N9K0yw*=zBvVOv0CIj-n{b^;GO5Zixm$u!V?25 zHVv$kXh6r|Z7BEB;)wIKeZ9Z7Iis+p46sylB>qB=W^$kJl0%3i`hdKj}Fh@DD*c1dvt!ufNvcQ%BZ%YZqB4WJ$Fdap-3VU1njiMoGYtg zLs~V-5y^boq8dM=&N-5mLD3G&IRB{IfB9`>?^F%v^!UYhYB|T`DvaX9Iz>_MHq}rV zttP)dA%S|e7C&ZZ5N6_j>5xd>ufPBvBD*iR%SdkHHDV9zS$9tKfYhTLWp8q5n zVB<7a913C2t|XY87mkUa3rwIkw0kU)Rg=U8=!Bz(TP^g_DQQM8Gp{>-JB|6|(?~e6 z7QB~Xzs_6Uyvn3Q!Zma5y|B<4!K9=9GJv}MMnph8dl^fcOV9B~kNQBHe!=V_^1-hu z@oS@1>)0A!m_>u4d_82zVU~X+06sF62{yZAK6{hYT_pI#za&Flj{CH+ zup#MD*RXM? z#5SY8K6X*t9}C8=AKl-Eb5>x|>ShGvmiJ$d_%82AHqd}412Wv;LU&?4O*bfhMoe?$ zDHo8Hg{$EwX$berhMySZ)KxnIIEf>x9IoZ6cl@B~^gVmbo0@%!>b(j*xTsWhyb-%H z&L7PeIM4GpR&`uLIY4{zxOFAoE_0-t3S>J+T{y6rel7>38#cL6bDl9%z(DUwoKtm* z3&~X(p%vjdByX+1IWNa3hv!8-FS_j9Lha{!)mHm&ezL$!S~5JZw$c3I5}ETl!1<_y z0$PNnfpkS7oUfjj;9S{aK4bkGgveAi3UoH^2xnvPyE4yJMPwt>9W1N2eHR7j1)uJJ zU|A72V0!9ESa|hZNQw7=cB>(FFZzYcQf&cvZ;>>z6t8iXw7n zVTMH1J4<`v2*Bp#5WOc1{(|V+(2!)4&Tm8Y6K~I578U zlsZ`0W#;%Lw==Ng-`8(=#XiIEd|giX2E!A=V)wA|)k=t*R5>6mO_q+SZGgt03N7q@ z3r$k!{&t)=ab}1)vIrpSaJjlIOC~i?L_t&#or`2Ypb_xCGnyntNf}JtmNf(}nr-}; zs=IcA_RgQ#jPwh0O7;1B|JgTn1LsL+g*Q@n?C8iR{x75`HD=nHLqQ@qY#*|k-Ox%{ zf*#eP;L~P=q7&6~lhJ(3IHA#Q%GR~AYrQC&n2CBGpuqXn!u$_v~-^UlppNbGhHabgryZ^!u8p@oU9 zjiZXbfz=-jmNwPD$wjM}Q6Yph60szo$ukq)EMf6avl?S!OZmm-{6gl(ev%Ya*ycLU z>e!F2-Qtc%0=yUL3ankyj?76~yd1I3MmS02)EYvHG7N)wi^#EIpPV((aIY8wF|ELp z6&Fn}ifA&q)3?mEcU-Ab%>q6n!-gduXd zykr0dhxJ|J$5xFm==}v|ixQ{P;&GHr3%shM&@tg9s2nAkIngHlmNkcSC(~uB?n;)b z%!ccu*%wbxI~Q5V!3_lPI%dWyi-bM;A{{xC^+0>zN?M@;Nyx@SkxFs|U1vEZOS3uz zZmp;kG?Z@ z__~SM=e^Gf2dUbEBgQ66_zhJr_F3(r7-{!>=hp@J-VlmIOqc_auG$}XF9w1lKfs`- z!uQyyq4n^DDWqWMKYig|7Ka;wY0U~Hj7MHtxjNWfJ0)&$`V6Dq8p!zLV_11wDL)d` z0kyou{j4(HAmYA3?rt)hHABr;O!&K=Btw6WkvkGOI1YVH0a%*NINQ>?bBNr#S~SC1 zh6wOc1PCy+R4^7YSLw&5bh&W3(ESvGmX+^H3%uQQ9=$UXjoI2jr7 z6X@Co=wI=A-uI^r@{jvHi67UcRJBE66L4kss>3 zJp6qcE6dx?>{(66Jsk$!9UT2#vtq5!5aLylfvqV0zvQ|uPxL<{lCin_i=O4Ki{W#Q z?ezT$hS_F~^#IgRGYZh{CvBz0YTRx!e#Xsx>?_6y*MmXh>CiZSZOuGC8VX zfdJavvRwG5T$R=HGH-3!tRwMNSJYlGwtXq}c;Y()=n7JNa{<^AAd-EuiIc$CX@az5 z7z}n34KV{oDMf zygq*qXOT$L>Cc>x;`iO7_DM7Z$N)x`<)N196q;oi1LeEdZbiR4-?F(~hbQ&pA*qPN zBlw3N3!{;EqQih4#YV^p=H--$(_cS7Net3fHfB3rSj2n)tkHSEwags3yL?IKo1N zD;z4&dsOpK{5yrvb4beD07PHI01&@vLD3hq>DN_pvom(k{)6!pJ7Uw#j3#~? z_X{J3y&yL8eJLyU#tN%wM5TRNtY2eIGfIK6&73e9SP+jK6ik4 z(7IbL$`H-wJbRqtfjkGa+w#$h6cL|aL25D*3n8Cy*=~IG9;J^?3PmM#^}uy+peh1( z4u>Xs%5Xr1GxdF-!r8Dh%J_#~z#Q5INf!P+ex=53|15>FFsE9uPMjgK1~k7MX|_?; zrt2{Hn8LgSr0FQpM+Kpp9fV>&dkPBHN+*HgInu8Cv+^91>&0FkCA&Q~7tYecd`d2Q__r%x0xxtXs|qNlt>KZC7u6InvceA{tJ|gn*A!&HA+W&yX59Yn6p&xQz`;mB z?@+Y=)kS|Q_}?SVtAantyLMFniYdPj`g`PgMf^Ev?7uO8{7?RWgMpsof3;Vp@N4@I zQt>}0`8%!nRrt^GK*RkF`-^1!yS2YlU;jpTf$rvi5Be`6?C!dG11>?VHg|8F-?@oCQ?SHmcNHg_6BGd22{vO0$fq$;l)<1#&Bc%PV z>GyNKzcnEc{AI#_>i8Z0d%E^F97ypO{2$5N@A%*A>3`!%K}^g4QCfTu|Km1N^VD+CT5p-wSJhk2>~G;NN971sUkq=R1fkj|Mggx}Os0 HUVr^R-SV1C literal 0 HcmV?d00001 diff --git a/calib_board/MDK-ARM/CalibBoard.uvoptx b/calib_board/MDK-ARM/CalibBoard.uvoptx index 2665748..c78b991 100644 --- a/calib_board/MDK-ARM/CalibBoard.uvoptx +++ b/calib_board/MDK-ARM/CalibBoard.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -117,6 +117,25 @@ Segger\JL2CM3.dll + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + 0 JL2CM3 @@ -140,7 +159,7 @@ 0 0 0 - 0 + 1 0 0 0 @@ -283,7 +302,7 @@ Drivers/STM32F4xx_HAL_Driver - 0 + 1 0 0 0 @@ -483,7 +502,7 @@ Drivers/CMSIS - 0 + 1 0 0 0 @@ -526,8 +545,8 @@ 0 0 0 - ..\usr\app\os_timer.c - os_timer.c + ..\usr\app\gas_data.c + gas_data.c 0 0 @@ -538,8 +557,32 @@ 0 0 0 - ..\usr\app\gas_data.c - gas_data.c + ..\usr\app\app_timer.c + app_timer.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\usr\app\app_leakage.c + app_leakage.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\usr\app\app_com.c + app_com.c 0 0 @@ -553,7 +596,7 @@ 0 6 - 28 + 30 1 0 0 @@ -573,7 +616,7 @@ 0 7 - 29 + 31 1 0 0 @@ -585,7 +628,7 @@ 7 - 30 + 32 1 0 0 @@ -597,19 +640,7 @@ 7 - 31 - 1 - 0 - 0 - 0 - ..\usr\bsp\bsp_Uart.c - bsp_Uart.c - 0 - 0 - - - 7 - 32 + 33 1 0 0 @@ -621,7 +652,7 @@ 7 - 33 + 34 1 0 0 @@ -633,7 +664,7 @@ 7 - 34 + 35 1 0 0 @@ -645,25 +676,33 @@ 7 - 35 + 36 1 0 0 0 - ..\usr\bsp\tjc_usart_hmi.c - tjc_usart_hmi.c + ..\usr\bsp\bsp_uart.c + bsp_uart.c 0 0 + + + + gui + 1 + 0 + 0 + 0 - 7 - 36 - 5 + 8 + 37 + 1 0 0 0 - ..\usr\bsp\tjc_usart_hmi.h - tjc_usart_hmi.h + ..\usr\gui\gui_tjc_hmi.c + gui_tjc_hmi.c 0 0 @@ -676,8 +715,8 @@ 0 0 - 8 - 37 + 9 + 38 1 0 0 @@ -688,8 +727,8 @@ 0 - 8 - 38 + 9 + 39 1 0 0 @@ -700,8 +739,8 @@ 0 - 8 - 39 + 9 + 40 1 0 0 @@ -712,8 +751,8 @@ 0 - 8 - 40 + 9 + 41 1 0 0 diff --git a/calib_board/MDK-ARM/CalibBoard.uvprojx b/calib_board/MDK-ARM/CalibBoard.uvprojx index bf2dccc..0cb53fb 100644 --- a/calib_board/MDK-ARM/CalibBoard.uvprojx +++ b/calib_board/MDK-ARM/CalibBoard.uvprojx @@ -10,14 +10,14 @@ CalibBoard 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 STM32F407VGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.15.0 - http://www.keil.com/pack/ + Keil.STM32F4xx_DFP.3.0.0 + https://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE @@ -185,6 +185,7 @@ 0 2 0 + 0 1 0 8 @@ -338,7 +339,7 @@ USE_HAL_DRIVER,STM32F407xx - ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol + ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol;..\usr\gui @@ -351,7 +352,7 @@ 0 0 0 - 0 + 4 @@ -527,16 +528,26 @@ 1 ..\usr\app\app.c - - os_timer.c - 1 - ..\usr\app\os_timer.c - gas_data.c 1 ..\usr\app\gas_data.c + + app_timer.c + 1 + ..\usr\app\app_timer.c + + + app_leakage.c + 1 + ..\usr\app\app_leakage.c + + + app_com.c + 1 + ..\usr\app\app_com.c + @@ -562,11 +573,6 @@ 1 ..\usr\bsp\bsp_Led.c - - bsp_Uart.c - 1 - ..\usr\bsp\bsp_Uart.c - bsp_Wdg.c 1 @@ -583,14 +589,19 @@ ..\usr\bsp\bsp_Flash.c - tjc_usart_hmi.c + bsp_uart.c 1 - ..\usr\bsp\tjc_usart_hmi.c + ..\usr\bsp\bsp_uart.c + + + + gui + - tjc_usart_hmi.h - 5 - ..\usr\bsp\tjc_usart_hmi.h + gui_tjc_hmi.c + 1 + ..\usr\gui\gui_tjc_hmi.c @@ -639,4 +650,13 @@ + + + + CalibBoard + 1 + + + + diff --git a/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex b/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex index 579e497..a2b2ddc 100644 --- a/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex +++ b/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex @@ -1,2242 +1,949 @@ :020000040800F2 -:10000000C0A600201503000801470008C3430008EC -:10001000FD46000839230008DD61000800000000EB -:100020000000000000000000000000009F470008E2 -:10003000E3240008000000009D470008A1470008D5 -:100040002F0300082F0300082F0300082F030008C8 -:100050002F0300082F0300082F0300082F030008B8 -:100060002F0300082F0300082F0300082F030008A8 -:100070002F030008792300082F03000889230008B4 -:1000800099230008A92300082F0300082F03000864 -:100090002F0300082F0300082F0300082F03000878 -:1000A0002F0300082F0300082F0300082F03000868 -:1000B0002F0300082F0300082F0300082F03000858 -:1000C0002F0300082F0300082F0300082F03000848 -:1000D0002F030008BD610008CD6100082F03000850 -:1000E0002F0300082F0300082F0300082F03000828 -:1000F0002F0300082F0300082F0300082F03000818 -:100100002F0300082F0300082F0300082F03000807 -:10011000795A00082F0300082F0300082F03000856 -:100120002F0300082F030008B92300082F0300083D -:100130002F0300082F0300082F0300082F030008D7 -:100140002F0300082F0300082F0300082F030008C7 -:100150002F0300082F030008C92300082F030008FD -:100160002F0300082F0300082F0300082F030008A7 -:100170002F0300082F0300082F03000800000000D1 -:100180002F0300082F03000800F002F800F0B2F877 +:10000000D88B0020690200083D280008FF24000862 +:1000100039280008A5050008153000080000000078 +:10002000000000000000000000000000432800085D +:1000300013070008000000004128000845280008B8 +:10004000830200088302000883020008830200087C +:10005000830200088302000883020008830200086C +:10006000830200088302000883020008830200085C +:1000700083020008A905000883020008B9050008EA +:10008000C9050008D905000883020008830200089A +:10009000830200088302000883020008830200082C +:1000A000830200088302000883020008830200081C +:1000B000830200088302000883020008830200080C +:1000C00083020008830200088302000883020008FC +:1000D00083020008F52F000805300008830200089D +:1000E00083020008830200088302000883020008DC +:1000F00083020008830200088302000883020008CC +:1001000083020008830200088302000883020008BB +:1001100045290008830200088302000883020008C2 +:100120008302000883020008E90500088302000832 +:10013000830200088302000883020008830200088B +:10014000830200088302000883020008830200087B +:100150008302000883020008F905000883020008F2 +:10016000830200088302000883020008830200085B +:1001700083020008830200088302000800000000D8 +:10018000830200088302000800F002F800F05CF827 :100190000AA090E8000C82448344AAF10107DA45E2 -:1001A00001D100F0A7F8AFF2090EBAE80F0013F082 -:1001B000010F18BFFB1A43F0010318478C8700009A -:1001C000AC8700000A444FF0000C10F8013B13F01C +:1001A00001D100F051F8AFF2090EBAE80F0013F0D8 +:1001B000010F18BFFB1A43F001031847B8370000BE +:1001C000D83700000A444FF0000C10F8013B13F040 :1001D000070408BF10F8014B1D1108BF10F8015BA0 :1001E000641E05D010F8016B641E01F8016BF9D193 :1001F00013F0080F1EBF10F8014BAD1C0C1B09D1EA :100200006D1E58BF01F801CBFAD505E014F8016B5B :1002100001F8016B6D1EF9D59142D6D370470000ED :100220000023002400250026103A28BF78C1FBD8FF -:10023000520728BF30C148BF0B6070476E2900F0DD -:10024000E784702900F03186662908F0B0826529BC -:1002500008F0AD82672908F0AA82612908F0A98216 -:1002600003681B0A28BF41F08001692900F0428120 -:10027000642900F03F81752900F03C816F2900F06E -:10028000BE85782900F0FD85E92900F05985E4292B -:1002900000F05685F52900F05385EF2900F0BB8565 -:1002A000F82900F0FC850368DB0928BF41F08001D4 -:1002B000632901F02582732901F02A82E32901F0E4 -:1002C0003582F32901F03A82002070471FB508F00B -:1002D00069FA01F0CBFA04000020002108F036FA98 -:1002E000401C60600020002108F046FAE0601FBD5D -:1002F00010B510BD01F095FA1146FFF7E7FF06F0C3 -:1003000079FA01F077FB03B4FFF7F2FF03BC01F0C9 -:100310007BFB00000948804709480047FEE7FEE7ED -:10032000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7A5 -:1003300004480549054A064B7047000089480008F3 -:1003400089010008C0960020C0A60020C09E0020A1 -:10035000C09E002053EA020C00F069802DE9F04BAA -:100360004FF00006002B1FBFB3FA83F503FA05F424 -:1003700024FA05F65E4012BF1643B2FA82F502FA7D -:1003800005F4C5F120051EBF22FA05FC44EA0C0461 -:10039000203556EA044C4FEA144418BF641C4FF051 -:1003A00000084FF00009904271EB030C39D300298B -:1003B00019BFB1FA81F701FA07F6B0FA80F700FA2F -:1003C00007F6C7F120071EBF20FA07FC46EA0C0615 -:1003D0002037B6FBF4FCA7EB0507103F07F01F0B17 -:1003E000CBF120060CFA0BFB2CFA06F644BFB34601 -:1003F0000026202FA4BF5E464FF0000B5BEA060CE0 -:1004000008BF4FF0010B19EB0B09ABFB027C48EB6B -:100410000608C01B06FB02CC0BFB03CC71EB0C01E6 -:10042000C1E70B46024641464846BDE8F08B13B58E -:100430004FF000004FF00001AFF30080BDE81C401A -:10044000704700007CB51D4616460C00009001D098 -:100450002044401E074B7B442A46694601903046A3 -:1004600000F0EFFB05461CB10020694600F0FCFBE4 -:1004700028467CBD190800000FB41CB5084B06AA1D -:100480007B4469460090059800F0DBFB04460020A1 -:10049000694600F0E9FB20461CBC5DF814FB000037 -:1004A000E507000070B5044685690068C10601D5FE -:1004B000302600E02026C00707D070BDD4E9012116 -:1004C00030469047206A401C20626D1EF6D570BDF4 -:1004D00070B5044685690078C00707D170BDD4E9BE -:1004E000012120209047206A401C20626D1EF6D515 -:1004F00070BD00002DE9F041064600241068752902 -:10050000314616A510D000F0EFFA002802DA40427A -:1005100013A507E031688A0701D512A502E0490753 -:1005200004D511A5012401E000F0E7FA00210A2218 -:1005300006F1240709E0B0FBF2FCB0FBF2F302FB8A -:100540001C00303078541846491C0028F3D123464B -:100550002A463046BDE8F04100F001BB0000000033 -:100560002D0000002B000000200000002DE9F05FAE -:10057000894604464FF0000ADFF874B1FB44C0F826 -:1005800020A02046E1688847002874D0252806D09E -:10059000D4E901219047206A401C2062F1E700263F -:1005A0005F462046E16888472028054607DB312D55 -:1005B00005D2781910F8200C08B10643F1E7B0070E -:1005C00001D526F00406C4F81CA00027C4F818A022 -:1005D0002A2D09D0284605F037FE38B304EB8708EA -:1005E000303DC8F8185019E059F8041B204604EBB8 -:1005F00087029161E1688847012F054618D1E069BB -:10060000002820DA26F020061DE0D8F8180000EBBC -:10061000800005EB40003038C8F818002046E1683B -:100620008847054605F010FE0028EED1012F0AD0BC -:100630002E2D08D12046E16888477F1C0546022FF1 -:1006400046F02006C4DBA069002803DA404246F0E9 -:100650000106A061F00701D026F010066C2D0BD02A -:10066000682D09D04C2D39D06A2D35D0742D35D058 -:100670007A2D33D016E038E0E1682F4620468847CF -:10068000B842054609D16C2F26D04FF48060E1684E -:10069000064320468847054604E06C2F1AD04FF4E5 -:1006A000807006430DB3A5F14100192802D820350A -:1006B00046F400664A462946204626604E46FFF725 -:1006C000BDFD80B101280BD0F61D26F0070000F11A -:1006D000080956E74020E4E78020D8E70020D6E765 -:1006E00006F104094DE7284652E7206ABDE8F09F6D -:1006F000C882000070B5064600F0F2F904680546AD -:1007000030460A22002100F0DBFB2C6070BD40EA7D -:10071000010310B59B070FD1042A0DD310C808C9D7 -:10072000121F9C42F8D020BA19BA884201D9012080 -:1007300010BD4FF0FF3010BD1AB1D30703D0521CCB -:1007400007E0002010BD10F8013B11F8014B1B1B06 -:1007500007D110F8013B11F8014B1B1B01D1921E70 -:10076000F1D1184610BD40EA0103024630B59B079F -:1007700010D14FF0013400E008C208C91D1B9D4391 -:1007800015EAC41FF8D013F0FF0102F8011B0DD0C9 -:100790001B0AF8E711F8013B002B02F8013B05D0DA -:1007A00011F8013B002B02F8013BF3D130BD10B52D -:1007B000431C02E010F8011B71B18107FAD14FF020 -:1007C000013202C88C1A8C4314EAC211F9D0C01A43 -:1007D0000A0603D0C01E10BDC01A10BD0A0401D005 -:1007E000801E10BD0902FCD0401E10BD40EA01036E -:1007F00070B59B072ED14FF00136042A2AD308C8C2 -:1008000010C99D1B9D43121F15EAC61517D0D8B2FB -:10081000E1B2401A50EA056110D198B2A1B2401A73 -:1008200050EA05410AD123F07F4024F07F41401A6D -:1008300050EA052102D1180EA0EB146070BDA3424E -:10084000DBD018BA21BA884201D9012070BD4FF01F -:10085000FF3070BD0AB9002070BD10F8013B11F8DF -:10086000014B63B1A3420AD1521E08D010F8013BDC -:1008700011F8014B1BB1A34201D1521EEDD1181B3F -:1008800070BD032A40F2308010F0030C00F0158098 -:1008900011F8013BBCF1020F624498BF11F801CB83 -:1008A00000F8013B38BF11F8013BA2F1040298BFE8 -:1008B00000F801CB38BF00F8013B11F0030300F052 -:1008C0002580083AC0F0088051F8043B083A51F8F6 -:1008D00004CBA0E80810F5E7121D5CBF51F8043BFB -:1008E00040F8043BAFF30080D20724BF11F8013B6E -:1008F00011F801CB48BF11F8012B24BF00F8013BD0 -:1009000000F801CB48BF00F8012B704710B5203A22 -:10091000C0F00B80B1E81850203AA0E81850B1E8B8 -:100920001850A0E81850BFF4F5AF5FEA027C24BF6E -:10093000B1E81850A0E8185044BF18C918C0BDE865 -:1009400010405FEA827C24BF51F8043B40F8043B2E -:1009500008BF7047D20728BF31F8023B48BF11F8E3 -:10096000012B28BF20F8023B48BF00F8012B70473D -:100970004FF000020429C0F0128010F0030C00F0C8 -:100980001B80CCF1040CBCF1020F18BF00F8012B46 -:10099000A8BF20F8022BA1EB0C0100F00DB85FEA14 -:1009A000C17C24BF00F8012B00F8012B48BF00F8E0 -:1009B000012B70474FF0000200B51346944696464F -:1009C000203922BFA0E80C50A0E80C50B1F1200162 -:1009D000BFF4F7AF090728BFA0E80C5048BF0CC010 -:1009E0005DF804EB890028BF40F8042B08BF70476E -:1009F00048BF20F8022B11F0804F18BF00F8012BE0 -:100A0000704710B5044610F0030F08BF11F0030F34 -:100A100040F015804FF0013E121FC0F20E8051F8D9 -:100A2000043BA3EB0E0C2CEA030C1CEACE1C08BF03 -:100A300040F8043BF0D0A1F1040102F10402521E7F -:100A400008DB11F8013B002B00F8013BF7D1114600 -:100A5000FFF78EFF204610BD4FF0013C50F8042BED -:100A600051F8043B9A4221D1A2EB0C03934313EAC1 -:100A7000CC1317D150F8042B51F8043B9A4215D1EE -:100A8000A2EB0C03934313EACC130BD150F8042BC5 -:100A900051F8043B9A4209D1A2EB0C03934313EAA9 -:100AA000CC13DBD04FF00000704700BFD01A01BA62 -:100AB000B1FA81F101F0180122FA01F0CB40C1F145 -:100AC0002001DBB2C0B2C01A2CFA01F3D11A914353 -:100AD00011EAC311E6D170477047704770470000B4 -:100AE000004870475C96002009684A0501D540B26D -:100AF0007047C905FCD500B2704709684A0501D5A1 -:100B0000C0B27047C905FCD580B2704770B50C46BD -:100B10000546012A05D02878800600D5EA69002319 -:100B200002E0012305E05B1C934202D2E05C002856 -:100B3000F9D1A869E618C01AA861286A1844286281 -:100B40002846FFF7AFFC04E0D5E9012114F8010BBA -:100B50009047B442F8D32846FFF7BAFC70BD2DE9A0 -:100B6000F0470D4699469246044600F12408016874 -:100B7000880604D5E06921F01001216000E0012021 -:100B8000A84201DD471B00E00027A1697A1902EBAA -:100B90000900081AA0612078C00602D42046FFF799 -:100BA00081FC002608E0D4E901211AF806009047EC -:100BB000206A401C761C20624E45F4DB2078C0067B -:100BC0000AD52046FFF76EFC06E0D4E9012130206B -:100BD0009047206A401C2062381EA7F10107F4DC10 -:100BE00007E0D4E9012118F805009047206A401C6D -:100BF0002062281EA5F10105F3DC2046FFF768FC02 -:100C00002078000602D50220BDE8F0870120FBE72E -:100C100011680268006A530501D508700AE0D3051F -:100C200001D5088006E0130603D5C217C1E900020A -:100C300000E008600120704701694A1C02610878E1 -:100C4000704700B58FB0CDE901310021059105490C -:100C50007944CDE9031011466846FFF787FC0FB0D1 -:100C600000BD0000E5FFFFFF0A6802F8010B0A6003 -:100C70007047D1E900239A4202D2531C0B601070D6 -:100C8000704700002DE9FF5F15468A460446DFF8ED -:100C9000AC80F8440027D8E900103E46CDE90010AA -:100CA00010E03AF816106A4602A800F09AFD411CBE -:100CB00007D02178890603D5E269391891420DD809 -:100CC0000744761C2078800602D5E069B84205DD2D -:100CD000AE42E6DB3AF816000028E2D1A069C01B5C -:100CE000A0612046FFF7DEFBD8E90010CDE9001037 -:100CF000002017E03AF818106A4602A800F071FDCB -:100D0000B0F1FF3F81460BD000250DF1080B05E047 -:100D1000D4E901211BF8050090476D1C4D45F7D320 -:100D200008F10100B0428046E4DB206A38442062CA -:100D30002046FFF7CDFBBDE8FF9F0000C67B00000B -:100D40002DE9F0418046D21D22F007020025D2E9AC -:100D50000002F52915A614D0011E72F1000106DA71 -:100D60000023D0EB030063EB020211A608E0D8F8E1 -:100D700000108B0701D50FA602E0490701D50EA68A -:100D800001251146002408F1240704E000F0DCF8F6 -:100D900030323A55641C50EA0102F7D12B463246F4 -:100DA00021464046BDE8F041FFF7D9BE00000000F3 -:100DB0002D0000002B0000002000000030B40021B6 -:100DC00000F1240408E002F00705D208303542EAB9 -:100DD0004372DB086554491C52EA0305F3D10468E9 -:100DE000002310A2250707D5A40600D421B1C469A9 -:100DF00001230DA2641EC46130BCFFF7B0BE10B564 -:100E0000044621461068FFF778FE02462046BDE8FA -:100E100010400023D2E7D21D22F00701D1E90023C0 -:100E2000CCE700000000000030000000F0B40D46E8 -:100E30000188090502D5214C7C4402E01F4C7C440A -:100E40000E34002100F1240608E002F00F07120919 -:100E5000E75D42EA03721B097754491C52EA030713 -:100E6000F3D102780023120704D5702D06D009B102 -:100E7000022311342246F0BCFFF771BE0123103467 -:100E8000F8E770B504460D4621461068FFF735FEB9 -:100E9000024629462046BDE870400023C6E7D21D21 -:100EA00022F00703D3E90023C0E70368126843F088 -:100EB000200303600823C3610023B7E7287A0000FA -:100EC0002DE9F04791460F4680460446002614F867 -:100ED000015B2DB100F030F80068405DC007F6D12D -:100EE0002B2D02D02D2D18D0641E4A46394620469F -:100EF00000F028FC27B13968A14201D1C7F8008071 -:100F00004FF0020471050BD54042002803DDFFF7C6 -:100F1000E7FD0460A007BDE8F08746F48066E4E7DB -:100F20000028F8DAFFF7DCFD04606FF00040F2E71C -:100F3000004870475C96002010B500F097FC001D3B -:100F400010BD00BF0978000030B5B0F10A024FEAC9 -:100F5000900E71F100034EEA817EB0EB0E0061EB62 -:100F600091014FEA101E4EEA017E10EB0E0041EB9C -:100F700011114FEA102E4EEA016E10EB0E0041EBFC -:100F800011214FEA104E4EEA014E10EB0E0041EBDC -:100F90001141401841F100014FEAD00040EA417090 -:100FA0004FEAD10110EB80054FEA810444EA9074C6 -:100FB00044EB01046D1944EB0404521BA3414FF0B0 -:100FC000000348BF0A3200D530BD401C41F100018A -:100FD00030BD70472DE9FF4F0C461E464FF0FF37DE -:100FE0008BB0D2E90001DDF860800A908A46C1F337 -:100FF0000A5505B93D46002108464FF00000BAF1F8 -:10100000000F00F4400005DA00EB80004FF44001CF -:1010100001EA50004FEA9059B9F1010F00DDB946DD -:101020000A9850EA4A000ED044F61050A5F2FF3557 -:1010300045432F14B8F1000F1ED07542291E1EDD46 -:10104000C9F100021CE0B8F1010F4FF0000001D01F -:10105000302103E0F24305E02154401CB042FBDBA9 -:1010600030460022002121540B99C1F80880C1E9C3 -:1010700000200FB0BDE8F08FBD1B6D1CDEE74A46B7 -:1010800000DA694206A800F043FC06AB93E80700CB -:1010900003AB83E8070050460A9900F0BCFC8DE8DA -:1010A0000700A0F500501F3800900398002D0ADDBE -:1010B00042F21F014A460844002303A903906846F0 -:1010C00000F025FF09E0A0F500504A461F38002334 -:1010D00003A90390684600F02FFF8DE80700000485 -:1010E000000C03D04FF0FF30410800E01046B8F18B -:1010F000000F03D00022009215461EE0751E05D495 -:10110000FFF722FF303262556D1EF9D5B34601223A -:10111000084302D000227F1C04E02078302801D14F -:1011200000227F1E002A099784D01DE0112D07DAC6 -:10113000FFF70AFF303262556D1C50EA0102F5D10B -:10114000084302D00098C8B10EE00021681E05E0F7 -:10115000235C625C63542254401E491C8142F7DBCD -:10116000AB46A81B401E0990002004F80B000B980A -:10117000099AC0F80880C0E9002B7AE711264FF0E1 -:10118000000857E72DE9F04F88460446D21D22F0AB -:10119000070191B0D1E90001CDE90A0105F020F87D -:1011A00002460B98C00F01D02D2007E02068810770 -:1011B00001D52B2002E0202101EAC000032A09907A -:1011C00001D0072A05DB03464146204600F052FBCA -:1011D0000BE12078800601D5E06900E00620B8F137 -:1011E000650F814606D0B8F1660F18D0B8F1670FC9 -:1011F00070D131E00020B9F1110F009001DB112313 -:1012000001E009F101030AAA01A90CA8FFF7E2FE17 -:10121000DDE90C70002609F10105834647E0012055 -:101220004B4600904FF000470AAA01A90CA8FFF70F -:10123000D1FEDDE90DB00C995D46002610B909F12B -:1012400001000D18B9EB050003D4C0F1FF3609F118 -:101250000105A5EB09002BE0B9F1010F01DA4FF010 -:1012600001090020B9F1110F0090484601DD11235A -:1012700000E003460AAA01A90CA8FFF7ABFEDDE9CE -:101280000C704D4600268346207800070AD4AB45F3 -:1012900000DA5D4601A8012D04DD411911F8011C99 -:1012A000302907D04F4502DA17F1040F04DA012084 -:1012B00082460FE06D1EEEE7002F02DCED1B3E4480 -:1012C00003E0781CA84200DD7D1CB81B00F1010A78 -:1012D0004FF000472078000703D4AA4501DB4FF008 -:1012E000FF3A0021B7F1004F0DF143088DF843108C -:1012F00024D002202B23002F01DA7F422D230A2144 -:10130000021EA0F1010000DC5FB197FBF1FC97FB2E -:10131000F1F201FB1C7C17460CF1300C08F801CDF2 -:10132000EEE7A8F1010003702188090501D54521E8 -:1013300000E06521A0F1010800F8011C09980FA93F -:10134000A1EB0807FF1D00B10120411901EBEA7074 -:10135000A1693844081A401EA0612078C00602D452 -:101360002046FFF79FF8099828B1D4E9012190475A -:10137000206A401C20622078C00622D52046FFF754 -:1013800091F81EE0002E04DBB34502DD01A8805D6C -:1013900000E03020D4E901219047206A401C2062FF -:1013A000761CAAF101005FEA000A0AD100F05EFA99 -:1013B000C0680168405CD4E901219047206A401C64 -:1013C0002062281EA5F10105DCDC07E0D4E901213B -:1013D00018F8010B9047206A401C2062381EA7F1C4 -:1013E0000107F3DC2046FFF773F8032011B041E654 -:1013F0002DE9F04F04460D46D21D22F0070089B0BA -:10140000D0E900974846394604F0EAFE0246F80F54 -:1014100001D02D2307E02068810701D52B2302E0AE -:10142000202101EAC0038DF820300BB1012000E03B -:101430000020032A824601D0072A04DB29462046E1 -:1014400000F018FA3FE12078800601D40D2500E075 -:10145000E569C7F30A560D2D49DA00214FEA175BFB -:1014600008464FF00000002F00F4400007DA00EBC0 -:1014700080004FF4400100EBD07001EA600081155C -:10148000012901DD4FF0FF3100224FEA850CBCF14C -:10149000180F06D31346ACF118004FF08052C2402B -:1014A00003E04FF4801323FA0CF30CF10C0CBCF1A5 -:1014B000200F04D3ACF1200C09FA0CF001E007FA7C -:1014C0000CF000294FF0004801DD18B90FE00ED1F3 -:1014D00040450CD319EB02095F4121B9404502D1C7 -:1014E0009F4329EA0209BBEB175F00D0761C2088D6 -:1014F000000502D57B48784402E07A4878441938E0 -:1015000008AA302302F80A30037C0AF10101002EF8 -:101510000AF1020A53546A4602DC4FF0300101E03E -:101520004FF031014FF001088DF8001002D0A6F203 -:10153000FF3603E059EA470100D06B4E002D02DC74 -:101540002178090704D54FF002082E218DF80110EB -:10155000C44600210BE0C7F303433F01C35C491CB1 -:101560006D1E02F80830052908F1010801DA002D86 -:10157000F1DC00210CE000EB1973491C1B786D1E97 -:10158000082902F808304FEA091908F1010801DAC0 -:10159000002DF0DC21688B0602D516E0A8F10108C9 -:1015A000E04505DD02EB080313F8013C302BF5D0D4 -:1015B000B8F1000F09DD02EB080313F8013C2E2BF4 -:1015C00003D1090701D4A8F10108002D05DD3E2152 -:1015D00002F808106D1E08F10108407C002E02F888 -:1015E000080008F1010804DA2D20764202F808000C -:1015F00002E02B2002F808000A214FF47A7086429C -:1016000008F101080BDB96FBF0F3303302F80830E9 -:1016100096FBF0F308F1010800FB136601E0642E6D -:101620000CDB642096FBF0F3303302F8083096FBB5 -:10163000F0F308F1010800FB136601E00A2E06DB57 -:1016400096FBF1F0303002F8080008F1010896FB33 -:10165000F1F001FB1060303002F80800A16908F1D8 -:10166000010808EB050202EB0A00081AA0612078C5 -:10167000C00602D42046FEF715FF216A08AE01EB32 -:101680000A00206204E0D4E9012116F8010B90471A -:10169000BAF1010AF7D22078C00602D52046FEF73B -:1016A00001FF6E4609E016F8010B3E280FD0D4E981 -:1016B00001219047206A401C2062B8F10108F2D253 -:1016C0002046FEF705FF09B00320BDE8F08F206A31 -:1016D0002844206203E0D4E90121302090476D1EA8 -:1016E000EBD3F8E7A573000002FCFFFF10B54369D8 -:1016F00013B1AFF3008001E0FFF708FA012010BD3D -:10170000127800F124010A7000224A700122EDE7EC -:1017100011684FF0FF32E9E710B5436913B1AFF339 -:10172000008001E0FFF7AEFA012010BD128800F141 -:10173000240182840022C2840122EDE711684FF067 -:10174000FF32E9E72DE9F05F824615468B46002718 -:101750000AF10104B9460078302801D09DB113E0A8 -:1017600014F8010B0127782803D0582801D045B17F -:101770000AE00DB1102D07D1002714F8010B102538 -:1017800002E0082500E00A250026B0460EE005FB31 -:10179000080005FB06F101271FFA80F801EB10464F -:1017A000B6F5803F00D3B94614F8010B294600F086 -:1017B000A1F80028EBDABBF1000F05D00FB1641ED1 -:1017C00000E05446CBF80040B9F1000F06D0FFF717 -:1017D00087F902210160C81EBDE8F09F48EA064073 -:1017E000FAE770B516460C460546FFF7A5FB0368F9 -:1017F00093F80101012806D0FF2C0FD8185D68B1BD -:1018000001202C7070BDD3F807013246214603F247 -:10181000071303442846BDE8704018474FF0FF30D7 -:1018200070BD7546FFF784FBAE460500694653461A -:1018300020F00700854618B020B5FEF779FDBDE819 -:1018400020404FF000064FF000074FF000084FF027 -:10185000000B21F00701AC46ACE8C009ACE8C009B8 -:10186000ACE8C009ACE8C0098D4670470048704735 -:101870007C9600202DE9F0411F46044603260168AE -:10188000072A01F4006004DB08B116A505E016A5DF -:1018900003E008B115A500E015A521F010002060B7 -:1018A000A069C01EA0610FB1401EA0612046FEF7D6 -:1018B000F9FD4FB1D4E9012138469047206A401C18 -:1018C0002062C01C206206E0206AFAE7D4E9012108 -:1018D00015F8010B9047761EF8D22046FEF7F8FD6A -:1018E000BDE8F0814E414E006E616E00494E4600EB -:1018F000696E66003A2800D2303820F02002412A72 -:1019000001D3A2F13700884201D34FF0FF30704776 -:101910002DE9F047814616468AB0354878440DC80F -:101920008DE80D0032487844801C03AC0DC884E873 -:101930000D0041F69B300844372190FBF1F290FBFB -:10194000F1F5A5F1800501FB12041B3C02D56442B0 -:10195000012000E00020DFF898A080460027FA442C -:10196000AAF1BE0A0EE0E0070AD03246684607EB4D -:10197000470101230AEB810100F0DEFA8DE8070040 -:1019800064107F1C002CEED1194F7F44AE3F19E04C -:10199000E80715D007EB04100DF1180A90E80E00C7 -:1019A0008AE80E00C068F04201D1981908903246CA -:1019B000012306A903A800F0BFFA03AB83E80700E0 -:1019C0006D10641C002DE3D14FF0010332466946CF -:1019D000B8F1000F03A802D000F099FA01E000F07E -:1019E000ABFAC9E90001C9F808200AB0BDE8F087E0 -:1019F0001070000010B50446AFF300802046BDE82B -:101A00001040FEF780BC000001491820ABBEFEE785 -:101A10002600020070475FEA400C08BF91F0000FFB -:101A20004FEA8C234FEAC12243EA51514FEA1C503E -:101A300018BF00F5F0404FEA300018BF41F00041F8 -:101A40005FEA6C5C00F02980BCF1FF3F08BF40F00A -:101A500080407047130C06BF12044FF0100C4FF07B -:101A6000000C130E04BF12020CF1080C130F04BF7C -:101A700012010CF1040C930F04BF92000CF1020C44 -:101A8000D30F04BF52000CF1010C11464FF00002BD -:101A9000A0F11F00A0EB0C00704711F0004F08BF31 -:101AA000704731F000413FF4D5AF0B0C06BF09047D -:101AB0004FF0100C4FF0000C0B0E04BF09020CF19C -:101AC000080C0B0F04BF09010CF1040C8B0F04BFB1 -:101AD00089000CF1020CCB0F04BF49000CF1010C82 -:101AE000CCF12003A0EB0C0022FA03F302FA0CF273 -:101AF00041EA030100F10100704720F07F4C80EAC9 -:101B0000030023F07F47ACEB070303F57C5300F0A1 -:101B1000004003F1FF032DE980494FEA154B09B45A -:101B20004FEA144325EA0B4E24EA03480FF2042639 -:101B300006EB132749083E785FEA320203FB06678B -:101B4000C7F5000707FB06F64FEA54374FEAD646BB -:101B500006F1020607FB066CCCF1005C4FEA1C475D -:101B60002CEA074C07FB06F40CFB06F504EB1546C4 -:101B70004FEA961634BF00204FF000404FEAD137AD -:101B800006FB07FC4FEA1C4C0CFB0BF7D21B03FBBC -:101B90000CF761EB07010CFB0EF7B0EB074072EBA3 -:101BA00017420CFB08F734BFA2EB0742B2EB074227 -:101BB00061EB17414FEA0C444FEA910706FB07FC23 -:101BC0004FEA1C4C0CFB0BF7B0EBC74072EB5732E3 -:101BD00003FB0CF734BFA2EBC742B2EBC74261EB89 -:101BE00057310CFB0EF7B0EBC70072EB57720CFBD2 -:101BF00008F734BFA2EBC702B2EBC70261EB577123 -:101C0000039F4FEA816141EA921104EBCC044FEA51 -:101C1000D1374FEA826206FB07FC42EA90124FEA94 -:101C200080604FEA1C4C0CFB0BF7D21B03FB0CF73C -:101C300061EB07010CFB0EF7B0EB074072EB1742AC -:101C40000CFB08F734BFA2EB0742B2EB074261EB93 -:101C500017414FEA8C554FEA910704EB9C2406FB91 -:101C600007FC4FEA1C4C0CFB0BF7B0EBC74072EBC8 -:101C7000573203FB0CF734BFA2EBC742B2EBC742AB -:101C800061EB57310CFB0EF7B0EBC70072EB5772EC -:101C90000CFB08F734BFA2EBC702B2EBC70261EB43 -:101CA000577115EB4C254FEA816141EA92114FEAD9 -:101CB00082624FEAD13742EA901206FB07FC44F1F8 -:101CC00000044FEA80604FEA1C4C0CFB0BF7D21B60 -:101CD00003FB0CF761EB07010CFB0EF7B0EB0740C1 -:101CE00072EB17420CFB08F734BFA2EB0742B2EBD2 -:101CF000074261EB174115EB1C154FEA813141EAB0 -:101D000092414FEA823242EA90424FEA80304FEAF3 -:101D10000C7644F1000448EA03434EEA0B484FF0C6 -:101D2000000EB2EB080C71EB030724BF6246394684 -:101D30004EEB0E0E4FF0000B0018524149414BEB99 -:101D40000B0BB2EB080C71EB03077BF1000B24BF0C -:101D5000624639464EEB0E0E4FF0000B0018524112 -:101D600049414BEB0B0BB2EB080C71EB03077BF11A -:101D7000000B24BF624639464EEB0E0E51EA0207B5 -:101D800018BF46F0010616EB0E7655F1000254F12D -:101D9000000103D5BDE88901BDE80088BDE88901DF -:101DA000BDE80048B619524141EB0101A3F101031E -:101DB000704780807F7E7D7C7B7A797877767675B8 -:101DC0007473727171706F6E6E6D6C6C6B6A6A6930 -:101DD0006868676666656464636362616160605FCA -:101DE0005F5E5E5D5D5C5C5B5B5A5A595958585743 -:101DF00057565655555554545353525252515150AB -:101E000050504F4F4F4E4E4D4D4D4C4C4C4B4B4BFD -:101E10004A4A4A4949494848484747474746464643 -:101E2000454545444444444343434342424242417E -:101E30004141002B9C4630D477002BD01CB54FEA93 -:101E4000370703B44FF010004FF01001BAF1000F44 -:101E500006D0BCF1000FDCBF40F0080040F00801E4 -:101E60004FF000000FBCBDE810400BF1010BBBF1BF -:101E7000010F08BF5FEA170722BF12F1010211F13B -:101E800001014FF0004143F1000300F0004043EA3C -:101E900000007047F9D35708D0E746EA064613F129 -:101EA000400F4FEA16461FDD13F1200FDFBF164328 -:101EB0000A46002120335B42BED0C3F1200746EA28 -:101EC000064602FA07F74FEA164646EA0706C3F146 -:101ED000200722FA03F201FA07F721FA03F14FF083 -:101EE000000342EA0702A7E746EA020646EA064678 -:101EF0004FEA164646EA0106BCBF46EA0646360CDD -:101F00004FF000034FF000024FF0000194E72DE97D -:101F1000804C9A46934670B491E8380007C831EA7D -:101F2000400C48BF34EA430C03D5FFF7E6FDFFF74A -:101F300080FFF0BCBDE8008C2DE9804C9A469346AA -:101F400070B491E8380007C810F0804F08BF13F054 -:101F5000804F03D100F005F8FFF76BFFF0BCBDE840 -:101F6000008C20F07F4780EA030023F07F4C07EBD2 -:101F70000C03A3F57C5300F00040A3F1FE0392F0A4 -:101F8000000F00F0B38095F0000F00F077802DE98E -:101F900001494FEA11404FEA144621EA004800FB8C -:101FA00006FC24EA064708FB06F607FB08F800FBD8 -:101FB00007F718EB06484CEB164C4FEA124B18EBA0 -:101FC00007484FEA15464CEB174022EA0B4E0BFB35 -:101FD00006FC25EA06470EFB06F607FB0EFE0BFB8A -:101FE00007F71EEB064E4CEB164C4FF000061EEBAF -:101FF000074E4CEB174B18EB0B0840F1000018EBA9 -:102000000E0B58EB000840F100008F1A4FF0000152 -:102010003CBFC943661B14BFB5EB040C00213CBF99 -:10202000C943F61B4FEA17444EEA8E0E27EA0445D1 -:102030004FEA1C4704FB07622CEA074C05FB07F735 -:102040000CFB05F604FB0CFC16EB074642EB1742B3 -:1020500016EB0C4642EB1C421BEB060658EB020249 -:10206000414146EA9E0601D5BDE80189B6195241B3 -:1020700041EB0101A3F10103BDE801894FEA1445D9 -:102080004FEA114724EA054621EA074C05FB07F40D -:1020900006FB07F70CFB06F105FB0CFC11EB0741F7 -:1020A00044EB17444FEA124711EB0C4144EB1C443C -:1020B00022EA074C05FB07F206FB07F70CFB06F6C6 -:1020C00005FB0CFC16EB074642EB174216EB0C46E1 -:1020D00042EB1C456A1854F1000148BF7047B6191D -:1020E000524141EB0101A3F10103704795F0000F4C -:1020F00037D04FEA11424FEA144721EA024624EA58 -:10210000074C02FB07F106FB07F70CFB06F402FB8A -:102110000CFC14EB074441EB17414FEA154714EB55 -:102120000C4441EB1C4125EA074C02FB07F506FB7A -:1021300007F70CFB06F602FB0CFC16EB074645EB1B -:10214000174516EB0C4645EB1C42121951F10001E4 -:1021500048BF7047B619524141EB0101A3F1010399 -:1021600070474FEA14454FEA114724EA054621EA31 -:10217000074C05FB07F106FB07F70CFB06F24FF0D7 -:10218000000605FB0CFC12EB074241EB174112EB7A -:102190000C4251EB1C4148BF7047921841EB0101C2 -:1021A000A3F10103704700001FB51749086A804773 -:1021B0001648416B88471648416B88471548416B64 -:1021C00088471549086880471449086880471449BA -:1021D000D1F8680180471349C86880470C4802F06D -:1021E00069FD04F0F3FA10A30FCB8DE80F006846E9 -:1021F000FEF7DDFA84B20649642322464868694640 -:1022000001F0F0FF1FBD0000340200207800002024 -:10221000C80000201801002028000020280200200B -:10222000880200200C040020CFB5CDB3B3F5CABCA2 -:10223000BBAF2E2E2E0D0A0010B50A22364801889B -:102240003648008802F05EFA012805D1324800883D -:102250003249088003F001FC32222F4801883048BF -:10226000008802F04FFA012805D12B4800882C493C -:10227000088003F0FFFB6422274801882948008872 -:1022800002F040FA012805D123480088254908803A -:1022900003F0E2FBC822204801882348008802F0AE -:1022A00031FA012805D11C4800881F49088003F035 -:1022B000D6FB4FF4FA72184801881C48008802F0D7 -:1022C00021FA012805D1144800881849088003F034 -:1022D000C9FB4FF47A72104801881548008802F053 -:1022E00011FA012805D10C4800881149088003F033 -:1022F000B5FB4FF4FA62084801880E48008802F0E6 -:1023000001FA012805D1044800880A49088003F031 -:10231000A7FB02F0C3FA10BD100000201A00002035 -:102320001C0000201E0000202000002022000020B1 -:10233000240000202600002000BFFEE730B5024642 -:102340000B464FF6FF70002112E0555C68400024F8 -:102350000AE000F0010525B140104AF2010568408D -:1023600000E04010651CACB2082CF2DB4D1CA9B299 -:102370009942EADB30BD000010B5024800F07EFA59 -:1023800010BD0000F804002010B5024800F076FAF5 -:1023900010BD00005805002010B5024800F06EFA8C -:1023A00010BD00007806002010B5024800F066FA63 -:1023B00010BD0000D806002010B5024800F05EFAFB -:1023C00010BD0000B805002010B5024800F056FA14 -:1023D00010BD0000180600200146087810381823A8 -:1023E000B0FBF3F20848805CC865032A05D9086889 -:1023F0006FF30900001D886503E008686FF30900AA -:102400008865886D70470000B68700080146002087 -:102410008A6A8B69CBB932B1012A0DD0022A03D066 -:10242000032A10D10EE000BFCB6A03F08073B3F132 -:10243000807F00D1012007E0CB6AB3F1C07F00D1DB -:10244000012001E000E000BF34E08B69B3F5005FDC -:102450001AD132B1012A07D0022A03D0032A11D19E -:102460000AE000BF01200EE0CB6A03F08073B3F1F5 -:10247000807F00D1012006E0CB6AB3F1C07F00D19C -:10248000012000E000BF15E032B1012A05D0022A88 -:1024900004D0032A0CD103E000BF00BF012008E0F4 -:1024A000CB6A03F08073B3F1807F00D1012000E09C -:1024B00000BF00BF704730B50468246824F480244E -:1024C00005682C60046863608468402C04D104684B -:1024D000A2600468E16003E00468A1600468E2604F -:1024E00030BD704710B50446204600F0A7FB10BD74 -:1024F00072B600BFFEE7000010B5002201B909E086 -:10250000012901D10A0205E0022901D10A0201E0F4 -:102510004FF440720E4B1B6823F440730C4C236045 -:1025200023461B681343236023461B6823F0F803EC -:10253000236023461B68022444EAC0042343044C5E -:10254000236023461B6843F48033236010BD0000E2 -:10255000103C02401C48006800F40070B0B11A48FA -:10256000006820F400701849086000BF0846006841 -:1025700040F4006008600846006820F400600860CD -:1025800000BF0846006840F4007008600E4800680C -:1025900000F48060B0B10C48006820F480600A4903 -:1025A000086000BF0846006840F480500860084694 -:1025B000006820F48050086000BF0846006840F4BE -:1025C0008060086070470000003C02400A4A1268C0 -:1025D00022F44072084B1A601A46126842F0040254 -:1025E0001A601A4612684FF4803343EA00231A43F4 -:1025F000014B1A6070470000103C0240074A126805 -:1026000022F44072054B1A601A4612681A601A4684 -:10261000126842F001021A6001707047103C0240DB -:1026200010B50D49096821F440710B4C2160214619 -:10263000096841F4407121602146096841F00101B7 -:102640002160026000BF00BF00BFBFF36F8F00BFFB -:1026500000BF00BF436010BD103C0240084A126832 -:1026600022F44072064B1A601A46126842F48072D5 -:102670001A601A46126842F001021A60018070471F -:10268000103C0240084A126822F44072064B1A605D -:102690001A46126842F400721A601A46126842F032 -:1026A00001021A6001607047103C02402348006834 -:1026B00000F0100040B12248C06940F010002049ED -:1026C000C86110201D4908601C48006800F0200007 -:1026D00040B11B48C06940F008001949C86120207A -:1026E000164908601548006800F0400040B11448E1 -:1026F000C06940F004001249C86140200F490860D9 -:102700000E48006800F0800040B10D48C06940F0FC -:1027100002000B49C861802008490860074800682A -:1027200000F0020040B10648C06940F020000449B2 -:10273000C861022001490860704700000C3C02405B -:102740003807002070B50446002500201449C861F0 -:1027500000F058FC054609E0601C38B124B100F0D7 -:1027600051FC401BA04201D9032070BD0D480068F8 -:1027700000F480300028EFD10A48006800F0010022 -:1027800010B10120074908600648006800F0F20017 -:1027900018B1FFF78BFF0120E7E70020E5E7000015 -:1027A000380700200C3C024070B50446A56D00F0CF -:1027B00029FC064694F83500022808D08020606580 -:1027C00000BF002084F8340000BF012070BD2068E5 -:1027D000006820F01600216808602068406920F039 -:1027E000800021684861206C08B9A06C28B120687D -:1027F000006820F00800216808602068006820F068 -:1028000001002168086010E000F0FCFB801B052837 -:102810000BD920206065032084F8350000BF00201C -:1028200084F8340000BF0320D0E72068006800F07F -:1028300001000028E8D194F85C103F208840A8608F -:10284000012084F8350000BF002084F8340000BF68 -:1028500000BFBBE7014691F83500022803D0802075 -:10286000486501207047052081F835000868006838 -:1028700020F001000A6810600020F3E7F8B5044674 -:10288000002000908C4800684FF41651B0FBF1F71F -:10289000A56D2E6894F85C1008208840304098B1EF -:1028A0002068006800F0040070B12068006820F023 -:1028B00004002168086094F85C1008208840A86033 -:1028C000606D40F00100606594F85C100120884064 -:1028D000304068B12068406900F0800040B194F851 -:1028E0005C1001208840A860606D40F002006065C7 -:1028F00094F85C1004208840304068B1206800687B -:1029000000F0020040B194F85C1004208840A860F8 -:10291000606D40F00400606594F85C101020884001 -:10292000304078B32068006800F0080050B394F895 -:102930005C1010208840A8602068006800F48020A7 -:1029400080B12068006800F4002028B9206CC8B16C -:102950002046216C884715E0A06C98B12046A16CF8 -:1029600088470FE02068006800F4807028B920686C -:10297000006820F0080021680860206C10B1204633 -:10298000216C884794F85C10202088403040002853 -:1029900065D02068006800F0100000285FD094F82F -:1029A0005C1020208840A86094F83500052828D1C4 -:1029B0002068006820F016002168086020684069DF -:1029C00020F0800021684861206C08B9A06C28B113 -:1029D0002068006820F008002168086094F85C1006 -:1029E0003F208840A860012084F8350000BF002007 -:1029F00084F8340000BF206D10B12046216D884757 -:102A0000F8BD2068006800F4802080B1206800686C -:102A100000F4002028B9606C10B12046616C884732 -:102A20001DE0E06BD8B12046E16B884717E02068D5 -:102A3000006800F4807068B92068006820F0100019 -:102A400021680860012084F8350000BF002084F868 -:102A5000340000BFE06B10B12046E16B8847606D29 -:102A600038B3606D00F00100F0B1052084F8350046 -:102A70002068006820F001002168086000BF00980D -:102A8000401C0090B84200D905E02068006800F0C2 -:102A900001000028F3D100BF012084F8350000BFF9 -:102AA000002084F8340000BFE06C10B12046E16CD7 -:102AB000884700BFA4E700000C0000202DE9F0418A -:102AC0000446002500F09EFA074614B90120BDE82F -:102AD000F081606A00B100BF022084F8350000BFB9 -:102AE000002084F8340000BF2068006820F0010056 -:102AF000216808600AE000F085FAC01B052805D9A6 -:102B000020206065032084F83500E0E72068006835 -:102B100000F001000028EED120680568214805403A -:102B2000D4E901010843E168084321690843616968 -:102B30000843A1690843E1690843216A0843054342 -:102B4000606A042803D1D4E90B01084305432068D7 -:102B500005602068456925F00705606A0543606ADD -:102B600004280DD1A06A0543E06A48B12046FFF76A -:102B70004DFC28B140206065012084F83500A6E7AF -:102B8000206845612046FFF727FC064694F85C1054 -:102B90003F208840B06000206065012084F8350047 -:102BA000002094E73F8010F02DE9F04704460D46E1 -:102BB00016461F464FF00008D4F8589000BF94F80E -:102BC0003400012802D10220BDE8F087012084F8FA -:102BD000340000BF94F83500012825D1022084F884 -:102BE0003500002060653B46324629462046FFF707 -:102BF00062FC94F85C103F208840C9F80800206807 -:102C0000006840F0160021680860206C28B1206838 -:102C1000006840F00800216808602068006840F003 -:102C200001002168086006E000BF002084F834003D -:102C300000BF4FF002084046C6E7000070B50446EA -:102C400000F0E0F906462546681C10B104480078FB -:102C5000054400BF00F0D6F9801BA842FAD370BD2E -:102C6000080000202DE9F04104460E46012700250A -:102C700000BF2548007E012802D10220BDE8F08176 -:102C800001202149087600BF4CF25030FFF75AFD71 -:102C90000746002F31D1401E3060206801280FD137 -:102CA000207C6168FFF792FC4CF25030FFF74AFD40 -:102CB00007461648006820F00400144908601AE02E -:102CC000A56812E0217C2846FFF716FC4CF2503034 -:102CD000FFF738FD07460D48006820F0FA000B4961 -:102CE00008600FB1356005E06D1CD4E9021008449E -:102CF000A842E7D800BFFFF72DFC00BF0020024923 -:102D0000087600BF3846B9E738070020103C02407B -:102D10000348006840F00040014908600020704707 -:102D2000103C02402DE9F04106460F4614461D4670 -:102D30004FF0010800BF1F48007E012802D1022089 -:102D4000BDE8F08101201B49087600BF4CF25030ED -:102D5000FFF7F8FC8046B8F1000F23D126B9E1B2A5 -:102D60003846FFF74BFC12E0012E04D1A1B23846E1 -:102D7000FFF774FC0BE0022E04D121463846FFF722 -:102D800081FC04E022462B463846FFF749FC4CF212 -:102D90005030FFF7D7FC80460748006820F001005C -:102DA0000549086000BF00200249087600BF404680 -:102DB000C6E7000038070020103C02400020094907 -:102DC000096801F0004159B10749064A0C3A1160FF -:102DD000064911600349096801F0004101B1012071 -:102DE00070470000103C024023016745AB89EFCDDE -:102DF000F8B502460B460025002400200021D6E04D -:102E0000012606FA01F51E6806EA0504AC4274D1F3 -:102E10001E7906F00306012E04D01E7906F0030683 -:102E2000022E13D190684F000326BE40B0434F00DE -:102E3000DE68BE4030439060506801268E40B0434B -:102E40001E79C6F300168E40304350601E7906F09E -:102E50000306032E09D0D0684F000326BE40B043BE -:102E60004F009E68BE403043D0601E7906F00306D6 -:102E7000022E13D1CF0802F1200656F827004E0784 -:102E8000F70E0F26BE40B0434F07FF0E1E69BE402F -:102E90003043CF0802F1200646F8270010684F00A3 -:102EA0000326BE40B0431E7906F003064F00BE4025 -:102EB000304310605E6806F44036002E76D000BFC6 -:102EC000002600963C4E366846F480463A4F3E60F7 -:102ED0003E46366806F48046009600BF00BF374E77 -:102EE0008F0856F827008E07370F0F26BE40B043D5 -:102EF000334EB24202D1002624E057E0314EB242B6 -:102F000001D101261EE0304EB24201D1022619E065 -:102F10002E4EB24201D1032614E02D4EB24201D111 -:102F200004260FE02B4EB24201D105260AE02A4EBC -:102F3000B24201D1062605E0284EB24201D1072651 -:102F400000E008268F073F0FBE4030431B4E8F081E -:102F500046F82700224E3068A0435E6806F48016CB -:102F600006B120431E4E3060361D3068A0435E68B7 -:102F700006F4001606B12043194E361D3060184E77 -:102F8000361F3068A0435E6806F4003606B1204361 -:102F9000134E361F3060361F3068A0435E6806F45B -:102FA000803606B120430E4E083E3060491C102981 -:102FB000FFF426AFF8BD0000443802400838014055 -:102FC000000002400004024000080240000C0240E1 -:102FD000001002400014024000180240001C024091 -:102FE000083C014010B5426921EA020302EA0104EB -:102FF00043EA0443836110BD0AB1816101E00B041F -:10300000836170470148006870470000000000209D -:10301000034800680349097808440149086070477B -:10302000000000200800002010B50D48006840F4A2 -:1030300000700B4908600846006840F48060086032 -:103040000846006840F480700860032000F0A6F88D -:10305000032000F007F800F02BF8002010BD00005E -:10306000003C024070B504460E4800784FF47A7177 -:10307000B1FBF0F00C490968B1FBF0F5284600F00F -:103080002FFC08B1012070BD102C07D20022214670 -:10309000501E00F045F80548046001E00120F2E709 -:1030A0000020F0E7080000200C00002004000020B1 -:1030B00008B500BF002000901048006840F4804030 -:1030C0000E4908600846006800F48040009000BF88 -:1030D00000BF00BF00200090081F006840F0805033 -:1030E000091F08600846006800F08050009000BF8B -:1030F00000BF052000F052F808BD0000443802402F -:1031000001460846002809DB00F01F0301229A400F -:1031100043099B0003F1E023C3F8002100BF70477F -:103120002DE9F05F80460D461646002703F070F843 -:10313000074639462A46334601F00700C0F1070A20 -:10314000BAF1040F02D94FF0040A01E0C0F1070AF6 -:10315000D14600F1040ABAF1070F02D24FF0000A7B -:1031600001E0A0F1030AD4464FF0010A0AFA09FA75 -:10317000AAF1010A0AEA020A0AFA0CFA4FF0010B54 -:103180000BFA0CFBABF1010B0BEA030B4AEA0B0445 -:103190002146404603F044F8BDE8F09F00BF00F030 -:1031A0000702064B19684FF6FF031940044B0B4307 -:1031B00043EA0221014B196000BF70470CED00E0AB -:1031C0000000FA0570B504460D460CB9012070BD2B -:1031D0005848006800F00700A84209D255490D7010 -:1031E0000846006800F00700A84201D00120EEE781 -:1031F000207800F0020002281DD1207800F00400A1 -:10320000042805D14C48006840F4E0504A49086061 -:10321000207800F00800082805D14748006840F4ED -:103220006040454908604448006820F0F000A1680B -:10323000084341490860207800F00100A8B36068A5 -:10324000012807D13C4808380068C0F34040B8B9AD -:103250000120BCE76068022802D06068032807D11B -:10326000354808380068C0F3406048B90120AEE72F -:10327000314808380068C0F3400008B90120A6E7CB -:103280002D48006820F00300616808432A4908605F -:10329000FFF7B8FE064609E0FFF7B4FE801B41F2D7 -:1032A0008831884202D9032091E707E0224800686C -:1032B00000F00C006168B0EB810FEDD11D48006893 -:1032C00000F00700A84209D91A490D7008460068A5 -:1032D00000F00700A84201D0012078E7207800F034 -:1032E0000400042807D11448006820F4E050E16885 -:1032F000084311490860207800F00800082808D128 -:103300000D48006820F46040216940EAC1000A4984 -:10331000086000F03FF808490968C1F30311074A43 -:10332000515CC8400649086006480068FFF79AFEED -:1033300000204CE7003C024008380240BE870008ED -:103340000C000020040000200148006870470000C5 -:103350000C00002000B5FFF7F7FF04490968C1F32E -:103360008221034A515CC84000BD00000838024079 -:10337000CE87000800B5FFF7E7FF04490968C1F3ED -:103380004231034A515CC84000BD00000838024089 -:10339000CE8700082DE9F047002400250026A1462D -:1033A0002548006800F00C0020B1042805D008284A -:1033B0003AD105E0DFF8849039E0DFF8849036E018 -:1033C0001D48001F006800F03F041B48001F0068F4 -:1033D00000F4800078B11A481749091F0968C1F341 -:1033E0008811A0FB01700146224600233846FCF7F5 -:1033F000B1FF05460EE011480F49091F0968C1F3E6 -:103400008811A0FB01700146224600233846FCF7D4 -:10341000A1FF05460848001F0068C0F30140401C9A -:103420004600B5FBF6F902E0DFF8109000BF00BFE0 -:103430004846BDE8F0870000083802400024F40048 -:1034400000127A00F8B504460CB90120F8BD2078C6 -:1034500000F00100002874D0F948006800F00C006A -:1034600004280DD0F648006800F00C00082813D19D -:10347000F348001F006800F48000B0F5800F0BD106 -:10348000EF4808380068C0F34040002859D0606811 -:10349000002856D10120D9E700BF6068B0F5803F11 -:1034A00008D1E7480838006840F48030E44908391A -:1034B00008601EE06068B0F5A02F0DD1E048083824 -:1034C000006840F48020DE4908390860084600683A -:1034D00040F4803008600CE0D9480838006820F4D7 -:1034E0008030D749083908600846006820F48020F9 -:1034F000086000BF606890B1FFF784FD054606E0F4 -:10350000FFF780FD401B642801D903209EE7CC48CB -:1035100008380068C0F340400028F1D011E0FFF700 -:1035200071FD054606E0FFF76DFD401B642801D9DB -:1035300003208BE7C24808380068C0F340400028E9 -:10354000F1D1207800F0020002285FD1BC48006869 -:1035500000F00C0058B1BA48006800F00C000828D0 -:103560001CD1B748001F006800F48000B0B9B4480F -:1035700008380068C0F3400020B1E068012801D09D -:10358000012063E7AE480838006820F0F8002169A0 -:1035900040EAC100AA490839086037E0E06800B392 -:1035A0000120A8490860FFF72DFD054606E0FFF75A -:1035B00029FD401B022801D9032047E7A04808380D -:1035C0000068C0F340000028F1D09D48083800682A -:1035D00020F0F800216940EAC100994908390860E3 -:1035E00014E0002097490860FFF70CFD054606E04F -:1035F000FFF708FD401B022801D9032026E7904869 -:1036000008380068C0F340000028F1D1207800F0AD -:10361000080008282CD16069A8B101208A490860F7 -:10362000FFF7F0FC054606E0FFF7ECFC401B022824 -:1036300001D903200AE782486C300068C0F34000DB -:103640000028F1D014E000207F490860FFF7DAFC81 -:10365000054606E0FFF7D6FC401B022801D90320EF -:10366000F4E677486C300068C0F340000028F1D1E0 -:10367000207800F00400042870D10027704838300A -:10368000006800F0805090B900BF002000906C48A6 -:103690003830006840F08050694938310860084689 -:1036A000006800F08050009000BF00BF012767480D -:1036B000006800F48070B0B96448006840F480701D -:1036C00062490860FFF79EFC054606E0FFF79AFC9A -:1036D000401B022801D90320B8E65C48006800F4CA -:1036E00080700028F2D000BFA068012808D154489B -:1036F0006830006840F001005149683108601DE001 -:10370000A06805280DD14E486830006840F00400DC -:103710004B49683108600846006840F001000860C5 -:103720000CE047486830006820F0010044496831E7 -:1037300008600846006820F00400086000BFA06828 -:10374000A8B1FFF75FFC054609E0FFF75BFC401BF3 -:1037500041F28831884202D9032077E626E03848D2 -:1037600068300068C0F340000028EED013E0FFF797 -:1037700049FC054608E0FFF745FC401B41F2883153 -:10378000884201D9032061E62D4868300068C0F303 -:1037900040000028EFD1012F07D1294838300068B8 -:1037A00020F0805026493831086000BFA069002809 -:1037B00045D02348006800F00C0008285DD0A069BF -:1037C000022845D100201F490866FFF71BFC05466B -:1037D00006E0FFF717FC401B022801D9032035E65D -:1037E000174808380068C0F340600028F1D1D4E9D8 -:1037F00007010843616A40EA81110122A06AC2EB15 -:10380000500041EA00412C20005D41EA00600C4973 -:10381000091F086001200B490866FFF7F3FB054606 -:1038200006E0FFF7EFFB401B022801D903200DE65D -:10383000034808380068C0F340600028F1D049E030 -:103840000838024000004742800E474200700040A6 -:10385000002021490866FFF7D5FB054606E0FFF783 -:10386000D1FB401B022801D90320EFE51B4800686B -:10387000C0F340600028F2D12CE0A069012800D1FB -:10388000E4E51648001D0668A069012820D006F46A -:103890008001E06981421BD106F03F01206A81422C -:1038A00016D147F6C0703040616AB0EB811F0FD16E -:1038B00006F440310122A06AC2EB5000B1EB004F88 -:1038C00006D106F070612C20005DB1EB006F01D0D5 -:1038D0000120BBE50020B9E5000047420038024066 -:1038E00070B504462546681EB0F1807F01D30120E3 -:1038F0000FE0681E4FF0E02148610F214FF0FF30CC -:1039000002F08EFC00204FF0E02188610720086162 -:10391000002070BDF8B504460E46174694F83E00E8 -:10392000202836D106B10FB90120F8BD00BF94F8A8 -:103930003C00012801D10220F7E7012084F83C0077 -:1039400000BF20633A463146204602F055FB05464B -:10395000EDB9206B012819D100BF0020009020682C -:103960000068009020684068009000BF00BF00BF62 -:1039700000BF21680C3151E8001F41F010002168A0 -:103980000C3141E80002002AF3D100E0012528466D -:10399000CBE70220C9E7000070B504460D460C498C -:1039A0002068884203D10B4802F01EFE0EE00A494F -:1039B0002068884203D1094802F016FE06E0084953 -:1039C0002068884202D1074802F00EFE70BD000058 -:1039D000001001407800002000440040C800002092 -:1039E000004C00401801002070B5044600252068F6 -:1039F0004069C0F3C01594F83D00212817D1B5B136 -:103A000000BF00BF2168143151E8001F21F0800081 -:103A10002168143141E80002002AF3D100BF606B35 -:103A200010B1606BFEF7C0FE204602F040F920683E -:103A30004069C0F3801594F83E00222817D1B5B133 -:103A400000BF00BF2168143151E8001F21F0400081 -:103A50002168143141E80002002AF3D100BFA06BB5 -:103A600010B1A06BFEF7A0FE204602F0DAF80020AD -:103A700070BD000038B5044600252B4920688842F7 -:103A800001D12A4D0AE02A492068884201D1294DF6 -:103A900004E029492068884200D1284D206C00F0BC -:103AA000020050B100BF0020009020680068009024 -:103AB00020684068009000BF00BF206C00F0040048 -:103AC00050B100BF0020009020680068009020687E -:103AD0004068009000BF00BF20680068C0F3C000CD -:103AE00050B100BF0020009020680068009020685E -:103AF0004068009000BF00BF20680068C0F340002D -:103B000050B100BF0020009020680068009020683D -:103B10004068009000BF00BF25B1EA8BA9696868C2 -:103B2000FFF7F8FE38BD00000010014078000020CB -:103B300000440040C8000020004C00401801002054 -:103B40002DE9F84F0446206805682068C66820689B -:103B500047694FF00009CA4605F00F09B9F1000F97 -:103B60000AD105F0200038B106F0200020B120462F -:103B700002F0B0F8BDE8F88FB9F1000F7CD007F083 -:103B8000010018B906F49070002875D005F0010006 -:103B900030B106F4807018B1206C40F00100206450 -:103BA00005F0040030B107F0010018B1206C40F0BE -:103BB0000200206405F0020030B107F0010018B1E6 -:103BC000206C40F00400206405F0080048B106F0C5 -:103BD000200010B907F0010018B1206C40F0080077 -:103BE0002064206C002846D005F0200028B106F0A3 -:103BF000200010B1204602F06DF820684069C0F343 -:103C0000801A206C00F0080010B9BAF1000F2DD016 -:103C1000204602F006F82068406900F04000402885 -:103C200020D100BF00BF2168143151E8001F21F0EE -:103C300040002168143141E80002002AF3D100BF9E -:103C4000A06B50B17548A16B0865A06BFEF702FE32 -:103C500088B1A06B016D88470DE02046FFF70AFF91 -:103C600009E009E02046FFF705FF04E02046FFF7E2 -:103C700001FF002020647DE7206B012876D105F04C -:103C80001000002872D006F010000028FAD000BF03 -:103C90000020009020680068009020684068009034 -:103CA00000BF00BF2068406900F0400040285ED19E -:103CB000A06B006840681FFA80F8B8F1000F54D07C -:103CC000A08D404551DDA4F82E80A06BC069B0F5F1 -:103CD000807F43D000BF00BF21680C3151E8001F36 -:103CE00021F4807021680C3141E80002002AF3D1F0 -:103CF00000BF00BF00BF2168143151E8001F21F050 -:103D000001002168143141E80002002AF3D100BF0C -:103D100000BF00BF2168143151E8001F21F04000AE -:103D20002168143141E80002002AF3D100BF2020AD -:103D300084F83E000020206300BF00BF21680C31E2 -:103D400051E8001F21F0100021680C3141E8000209 -:103D5000002AF3D100BFA06BFEF726FDA08DE28DF7 -:103D6000801A81B22046FFF717FE03E740E0A08DDE -:103D7000E18D401A1FFA80F8E08DC0B3B8F1000F52 -:103D800035D000BF00BF21680C3151E8001F21F47D -:103D9000907021680C3141E80002002AF3D100BF85 -:103DA00000BF00BF2168143151E8001F21F001005D -:103DB0002168143141E80002002AF3D100BF20201D -:103DC00084F83E000020206300BF00BF21680C3152 -:103DD00051E8001F21F0100021680C3141E8000279 -:103DE000002AF3D100BF41462046FFF7D5FDC1E6CA -:103DF00005F0800030B106F0800018B1204602F0D6 -:103E000063F9B7E605F0400030B106F0400018B1A4 -:103E1000204601F03CFFADE600BFABE6895A000842 -:103E200010B504460CB9012010BDA06900B100E036 -:103E300000BF94F83D0028B9002084F83C002046DB -:103E400000F028F8242084F83D002068C06820F4A1 -:103E500000502168C860204601F0B8FF2068006962 -:103E600020F49040216808612068406920F02A0011 -:103E7000216848612068C06840F400502168C8602B -:103E800000202064202084F83D0084F83E000020BB -:103E9000CAE7000010B586B00446142101A8FCF75B -:103EA00089FDC149206888427AD100BF0020009076 -:103EB000BE48006840F40020BC490860084600681D -:103EC00000F40020009000BF00BF00BF0020009061 -:103ED000B6481038006840F00100B4491039086055 -:103EE0000846006800F00100009000BF00BF0320FA -:103EF00001900220029000200390032004900820EB -:103F0000059001A9AA48FEF773FFAA48AA490860CC -:103F1000400548600021A8488160C1604FF480617D -:103F20000161002141618161C1614FF44031016251 -:103F300000214162FEF7C2FD08B1FEF7D9FA00BFC9 -:103F40009D48A063846300BF9A4830309B49086055 -:103F50004FF0006048604021984881600021C160B6 -:103F60004FF480610161002141618161C1614FF4C1 -:103F70000031016200214162FEF7A0FD08B1FEF7A9 -:103F8000B7FA00BF8D486063846300BF002201213F -:103F90003420FFF7C5F83420FFF7B2F802E1FFE75D -:103FA0008749206888427ED100BF002000907F486A -:103FB000001D006840F010007C49091D086008469B -:103FC000006800F01000009000BF00BF00BF00209C -:103FD000009076481038006840F0010073491039AD -:103FE00008600846006800F00100009000BF00BFB4 -:103FF0004FF4C06001900220029000200390032043 -:1040000004900720059001A96948FEF7F1FE6D486C -:104010006D4908604FF00060486000216A48816087 -:10402000C1604FF480610161002141618161C16122 -:104030004FF48031016200214162FEF73FFD08B17B -:10404000FEF756FA00BF6048A063846300BF5D4876 -:1040500078305E4908604FF00060486040215B485E -:1040600081600021C1604FF48061016100214161E4 -:104070008161C1614FF48031016200214162FEF72C -:104080001DFD08B1FEF734FA00BF50486063846339 -:1040900000BF002201212520FFF742F82520FFF76D -:1040A0002FF87FE0FFE74A49206888427AD100BFB5 -:1040B000002000903D48006840F400303B49086013 -:1040C0000846006800F40030009000BF00BF00BF49 -:1040D0000020009035481038006840F0080033494F -:1040E000103908600846006800F00800009000BF22 -:1040F00000BF602001900220029000200390032066 -:1041000004900720059001A93248FEF771FE294866 -:104110004830314908604FF00060486000212E4867 -:104120008160C1604FF48061016100214161816162 -:10413000C1614FF44031016200214162FEF7BEFCD3 -:1041400008B1FEF7D5F900BF2348A063846300BF20 -:1041500018486030214908604FF0006048604021F5 -:104160001E4881600021C1604FF48061016100211F -:1041700041618161C1614FF40031016200214162FE -:10418000FEF79CFC08B1FEF7B3F900BF134860636B -:10419000846300BF002201212620FEF7C1FF2620F4 -:1041A000FEF7AEFF06B010BD004C004040380240A4 -:1041B0000000024040600240F80400205805002042 -:1041C0000010014040640240B8050020180600209D -:1041D00000440040000C024078060020D806002071 -:1041E000704770472DE9F84F04460E46174699462A -:1041F0004FF0000A94F83D0020285AD106B117B9B3 -:104200000120BDE8F88F00BF94F83C00012801D1DF -:104210000220F6E7012084F83C0000BF0020206463 -:10422000212084F83D00FEF7EDFE8246A784E78456 -:10423000A068B0F5805F04D1206910B90025B046B0 -:1042400002E035464FF0000800BF002084F83C0033 -:1042500000BF1BE05346002280212046CDF800908D -:1042600001F062FF08B10320CBE745B9B8F80000C0 -:10427000C0F308002168486008F1020803E02878CC -:10428000216848606D1CE08C401EE084E08C0028B2 -:10429000E0D15346002240212046CDF8009001F0A5 -:1042A00043FF08B10320ACE7202084F83D00002044 -:1042B000A7E70220A5E70000F7B50446154694F8E5 -:1042C0003D00202846D1019800B10DB90120FEBD66 -:1042D00000BF94F83C00012801D10220F7E701203B -:1042E00084F83C0000BF01982062A584E58400208A -:1042F0002064212084F83D001748616BC86317488B -:10430000616B08641648616BC8640020616B0865C6 -:1043100001AE23681A1D31682B46606BFEF744FC22 -:104320006FF040002168086000BF002084F83C0066 -:1043300000BF00BF00BF2168143151E8001F41F0E9 -:1043400080002168143141E80002002AF3D100BF47 -:104350000020BCE70220BAE7BD5B0008155C00083E -:104360009D5A000810B504460E492068884203D1C2 -:104370000D48C16B884713E00C492068884203D17F -:104380000B48C16B88470BE00A492068884207D177 -:10439000012204210848FEF72FFE0848C16B884718 -:1043A00010BD0000001001407800002000440040D3 -:1043B000C8000020004C004000000240180100200E -:1043C000704700BFFEE7000008B500BF0020009066 -:1043D0002648006840F40010244908600846006838 -:1043E00000F40010009000BF00BF00BF002000904C -:1043F0000846006840F4800008600846006800F441 -:104400008000009000BF00BF002211460D20FEF783 -:1044100087FE0D20FEF774FE002211460F20FEF7E6 -:104420007FFE0F20FEF76CFE002211461020FEF7E3 -:1044300077FE1020FEF764FE002211461120FEF7E1 -:104440006FFE1120FEF75CFE002211463A20FEF7B7 -:1044500067FE3A20FEF754FE002211464620FEF782 -:104460005FFE4620FEF74CFE08BD000030380240DB -:1044700000B587B0142102A8FCF79CFA00BF002009 -:1044800001906E48006840F010006C4908600846D2 -:10449000006800F01000019000BF00BF00BF0020C6 -:1044A00001900846006840F08000086008460068F7 -:1044B00000F08000019000BF00BF00BF002001900D -:1044C0000846006840F0010008600846006800F0F7 -:1044D0000100019000BF00BF00BF0020019008460E -:1044E000006840F0020008600846006800F0020022 -:1044F000019000BF00BF00BF002001900846006887 -:1045000040F0080008600846006800F008000190CC -:1045100000BF00BF00BF002001900846006840F0C7 -:10452000040008600846006800F00400019000BF25 -:1045300000BF00227F214248FEF75EFD01220421D8 -:104540004048FEF759FD01224FF4E0613C48FEF778 -:1045500053FD01224FF470413B48FEF74DFD01220F -:104560004FF47F413948FEF747FD01224FF4707147 -:104570003748FEF741FD002210213448FEF73CFD8C -:1045800000224FF440713048FEF736FD6F20029054 -:1045900001200390002004900320059002A92848E0 -:1045A000FEF726FC4FF4E260029001200390002009 -:1045B0000490059002A92248FEF71AFC04200290FC -:1045C00001200390002004900320059002A91D48BB -:1045D000FEF70EFC4FF47040029001200390002083 -:1045E0000490059002A91848FEF702FC4FF61070DF -:1045F00002900120039000200490059002A9134826 -:10460000FEF7F6FB4FF4707002900120039000203B -:104610000490059002A90E48FEF7EAFB4FF44070A3 -:10462000029001200390002004900320059002A92D -:104630000548FEF7DDFB07B000BD00003038024042 -:10464000001002400000024000040240000C024042 -:104650000008024010B50B480B4908604FF4E130E8 -:104660004860002108488160C16001610C214161FE -:1046700000218161C161FFF7D3FB08B1FDF738FF6D -:1046800010BD0000004C00402C04002010B50B4869 -:104690000B4908604FF4E130486000210848816010 -:1046A000C16001610C21416100218161C161FFF79D -:1046B000B7FB08B1FDF71CFF10BD00000010014062 -:1046C0007004002010B50B480B4908604FF41650D9 -:1046D0004860002108488160C16001610C2141618E -:1046E00000218161C161FFF79BFB08B1FDF700FF6D -:1046F00010BD000000440040B404002000BFFEE7ED -:1047000000BFFEE710B503461446E01882B29A4295 -:1047100005DD914201DA994207DA012010BD91428C -:1047200003DB994201DA0120F8E70020F6E70000F8 -:10473000154909880144144A118014490988014423 -:10474000124A1180124909880144114A11800F4907 -:104750000988B1F57A7F07D300210C4A11800D49F1 -:104760000988491C0B4A11800949098842F21072D4 -:10477000914207D30021064A118007490988491C44 -:10478000054A11807047000010000020160000202C -:10479000180000201200002014000020704770470D -:1047A00010B50120FFF7C4FF07480121426C904774 -:1047B00006480121426C904705480121426C904710 -:1047C000FEF726FC10BD000078000020C800002085 -:1047D0001801002000B593B0302107A8FCF7EAF8D3 -:1047E000142102A8FCF7E6F800BF0020019024483D -:1047F000006840F08050224908600846006800F0D8 -:104800008050019000BF00BF00BF002001901D48F4 -:10481000006840F480401B4908600846006800F4C6 -:104820008040019000BF00BF012007900004089065 -:1048300002200D9041050E9104210F91A8211091A5 -:10484000022111910421129107A8FEF7FBFD08B186 -:10485000FDF74EFE0F2002900220039000200490EE -:104860004FF4A05005904FF480500690052102A807 -:10487000FEF7A8FC08B1FDF73BFE13B000BD000039 -:1048800040380240007000400348006840F4700067 -:10489000014908607047000088ED00E010B5054848 -:1048A000C16C88470448C16C88470448C16C88477C -:1048B00010BD000078000020C80000201801002072 -:1048C0000FB410B59CB01448006818B91CB010BCE7 -:1048D0005DF814FB11A0006801901FA800906421EE -:1048E00002A8009B1E9AFBF7ADFD04460020009035 -:1048F000002C0FDDA2B20848006802A9836B0648AD -:104900000068984704480068032201A9836B0248A5 -:104910000068984700BFD9E76C020020FFFFFF0046 -:104920002DE9F041A2B006460F46062F03DA00201B -:1049300022B0BDE8F0810025022400BF0DE0312D3A -:1049400009D22046611C8CB2325C2846691CCDB26B -:1049500001A90A5401E0601C84B2BC4202DA305D55 -:10496000AA28ECD1BC4201DB0020E1E7002001A92C -:10497000485503226CA101A8FBF738FF38B90DF1A7 -:104980000700FBF7B7FEC0B28DF8380005E001A8BC -:10499000FBF7B0FEC0B28DF838009DF83800012852 -:1049A00003DB9DF83800042806DD9DF838105FA071 -:1049B000FFF786FF0020BBE7601C84B200250DE0F6 -:1049C000312D09D22046611C8CB2325C2846691C0C -:1049D000CDB201A90A5401E0601C84B2BC4202DAE3 -:1049E000305DAA28ECD1BC4201DB0020A0E700200A -:1049F00001A9485513220DF13900FCF702F80021F6 -:104A00000EA80175601C84B200250DE0312D09D27D -:104A10002046611C8CB2325C2846691CCDB201A9CB -:104A20000A5401E0601C84B2BC4202DA305DAA285C -:104A3000ECD1BC4201DB00207AE7002001A94855F7 -:104A400001A8FBF757FEC0B28DF84D009DF84D0050 -:104A5000012803DB9DF84D00FE2801DD002067E7FB -:104A6000601C84B200250DE0312D09D22046611C66 -:104A70008CB2325C2846691CCDB201A90A5401E00F -:104A8000601C84B2BC4202DA305DAA28ECD10DB9B8 -:104A900000204DE7002001A9485513220DF14E00DA -:104AA000FBF7AFFF00218DF8611000208DF8620048 -:104AB0008DF863008DF86400804618E008EB8800EC -:104AC000244901EB0010407D9DF84D1088420AD129 -:104AD00008EB88011F4A02EB011050220EA9FBF7D8 -:104AE00015FF012024E708F1010000F0FF081A4833 -:104AF00000788045E2DB18480078202811DA164952 -:104B0000097801EB8101134A02EB011050220EA932 -:104B1000FBF7FCFE10480078401C0F49087001208C -:104B200006E7002004E70000434F4D0074302E7468 -:104B300078743D22B6CBBFDABAC5CEDED0A73A250F -:104B40006428D6BBD6A7B3D6434F4D312D434F4D26 -:104B5000342922004C84002070020020F8B5002582 -:104B600001F02EFE064625E0002406E0204603F074 -:104B7000ABFD0DF80400601CC4B2042CF6DB9DF8FC -:104B80000000042814D19DF80100FF2810D19DF8E1 -:104B90000200FF280CD19DF80300FF2808D1042053 -:104BA00001F0C2FD281D85B201F00AFE064600E0B4 -:104BB00002E000BF042ED7DA00BF2846F8BD00008F -:104BC0002DE9F043ADF6242D80460E463748007897 -:104BD00018B90DF6242DBDE8F083002720210DF62D -:104BE0000420FBF7E7FE00200AE018F80010012976 -:104BF00004D10DF604221154791CCFB2411CC8B265 -:104C0000B04203DA294909788842EEDB07B9E0E7C8 -:104C1000002500241DE04FF00009B44205DA0DF62E -:104C20000420005D012800D18146B9F1000F0ED1AA -:104C300004EB84021E4B03EB021105EB850201AB72 -:104C400003EB02105022FBF761FE681CC5B2601C2A -:104C5000C4B2164800788442DDDB14480570002495 -:104C60000EE004EB840201AB03EB021104EB8402BF -:104C70000F4B03EB02105022FBF748FE601CC4B23E -:104C80000A4800788442ECDB0848047809E004EB29 -:104C90008401074A02EB01105021FBF78BFE601CD8 -:104CA000C4B2202CF3DB00BF93E7000070020020A9 -:104CB0004C84002010B5044604B910BD0B480460B4 -:104CC00001F084FDFFF74AFF094808490968886434 -:104CD0000020084908704FF420610748FBF76AFE7E -:104CE00006A0FFF7EDFD00BFE7E700006C02002023 -:104CF000E14E0008700200204C84002074302E74B5 -:104D000078743D22544A43B3F5CABCBBAFCDEAB375 -:104D1000C922000070B504460D4605B970BD032DCB -:104D20000ADB2078AA2807D16078552804D12946C3 -:104D3000204600F003F8F1E700BFEFE72DE9F04768 -:104D400004460D46062D01DABDE8F0872078AA2832 -:104D500002D16078552800D0F6E7A81E215C681EB5 -:104D6000205C41EA0029A81E81B22046FDF7E6FA40 -:104D70000746B94500D0E7E7A678432E08D1294673 -:104D80002046FFF7CDFD10B125A0FFF799FDDBE729 -:104D9000042E04D12946204600F04CF8D4E7062D15 -:104DA0003BD194F80380022E02D0032E32D121E0B1 -:104DB000B8F1070F1BD2DFE808F01A04070A0E1239 -:104DC000160000F00DF913E000F01AFD10E00120CC -:104DD00000F086FB0CE0022000F082FB08E00320DC -:104DE00000F07EFB04E0042000F07AFB00E000BF4E -:104DF00000BF10E0B8F1010F03D0B8F1020F06D1E7 -:104E000002E000F0A7F903E000F094FA00E000BF30 -:104E100000BF00E000BF00BF00BF00BF94E700007C -:104E200062322E7478743D2261646420737563224B -:104E30000000000030B58FB004460D460D2D10D097 -:104E40002A4616A16846FBF717FB6846FFF738FDB0 -:104E50004FF49670FDF7F2FE18A0FFF731FD0FB08A -:104E600030BDA07804280AD017A0FFF729FD4FF421 -:104E70009670FDF7E3FE11A0FFF722FDEFE700209B -:104E800004E0C11C615C0DAA1154401C0828F8DB29 -:104E900008210DA8FFF794FE00BFE0E774302E74E0 -:104EA00078743D22C9BEB3FDD6B8C1EEB3A4B6C86E -:104EB000B4EDCEF33A2564220000000074302E7465 -:104EC00078743D222200000074302E7478743D22E4 -:104ED000C9BEB3FDB9A6C4DCC2EBB4EDCEF322006B -:104EE0002DE9F74FB4B08146002405E019F804001D -:104EF00003F002FC601C84B235988442F6DB6AE061 -:104F000001F05EFC33903398032800DA64E000205F -:104F100003F0DAFB3290012003F0D6FB074632980B -:104F2000AA2801D1552F03D0012001F0FDFB52E04A -:104F3000022003F0C9FB04464FF0000A432C05D0C1 -:104F4000022C03D0032C01D0042C01D14FF0010A14 -:104F5000BAF1000F03D1022001F0E6FB3BE000258F -:104F6000432C04D101F006FC05464DB934E0022C77 -:104F700001D0032C01D1062502E0042C00D10D251F -:104F80003398A84200DA27E0002606E0304603F016 -:104F90009BFB0DF80600701C86B2AE42F6DBA81E25 -:104FA0001DF80010681E1DF8000041EA002BA81E25 -:104FB00081B26846FDF7C2F98046C34503D0284652 -:104FC00001F0B2FB07E029466846FFF7A3FE28463A -:104FD00001F0AAFB00BF93E700BF37B0BDE8F08F38 -:104FE0002DE9F041012416E0012511E02A46214671 -:104FF00032A0FFF765FC04FB05F0C11700EB9171CF -:105000008910A0EB810111B90520FDF717FE6D1C79 -:10501000042DEBDD641C082CE6DD6420FDF70EFE9C -:105020002A48007870B92AA0FFF74AFC2EA0FFF7A3 -:1050300047FC4FF49670FDF701FE31A0FFF740FCEE -:10504000BDE8F08121480078082801DD082001E052 -:105050001E480078064600242BE004EB84002B4910 -:1050600001EB0015671C6A1C394629A0FFF728FCD4 -:105070000A20FDF7E3FD2A78394629A0FFF720FC36 -:105080000A20FDF7DBFD6A7D39462AA0FFF718FCF0 -:105090000A20FDF7D3FD05F11602394629A0FFF7D6 -:1050A0000FFC0A20FDF7CAFD1420FDF7C7FD601CA8 -:1050B000C4B2B442D1DB00BFC2E700007425645F14 -:1050C00025642E7478743D222200000070020020B6 -:1050D00074315F312E7478743D22CEDEC9E8B1B8E8 -:1050E000CAFDBEDD2200000074302E7478743D22AB -:1050F000C9E8B1B8C1D0B1EDCEAABFD52200000039 -:1051000074302E7478743D22220000004C840020FC -:105110007425645F312E7478743D2225732200005B -:105120007425645F322E7478743D22434F4D25649C -:10513000220000007425645F332E7478743D2225AC -:10514000642200007425645F342E7478743D222537 -:10515000732200002DE9F04796B06420FDF76EFD44 -:10516000012491E0052C04DC4AA113A8FBF7FBFA0B -:105170000AE00A2C04DC48A113A8FBF7F4FA03E0C8 -:1051800046A113A8FBF7EFFA204604EBD0714910B3 -:10519000A4EB410121B942A110A8FBF7E4FA03E016 -:1051A00041A110A8FBF7DFFA224641A103A8FBF7B3 -:1051B00063F9601E1E2190FBF1F201FB120000F169 -:1051C0001309601E90FBF1F000F1010A601E062138 -:1051D00090FBF1F000F1080504EB44003C2190FB4A -:1051E000F1F201FB1208182D00DB17254B46524641 -:1051F00031A10BA8CDE90058FBF73EF9AE1C08F130 -:105200000F073C2F01DB3C3F761C182E01DB1726D5 -:105210003B274B46524628A106A8CDE90067FBF77D -:105220002BF913AA21462BA0FFF74AFB0520FDF717 -:1052300005FD03AA21462BA0FFF742FB0520FDF741 -:10524000FDFC21462BA0FFF73BFB0520FDF7F6FCFC -:1052500010AA21462BA0FFF733FB0520FDF7EEFC3B -:105260000BAA21462BA0FFF72BFB0520FDF7E6FC40 -:1052700006AA21462BA0FFF723FB0520FDF7DEFC45 -:105280001420FDF7DBFC641C0F2C7FF76BAF16B00E -:10529000BDE8F0874C48000053480000424A000037 -:1052A000C2A9D2BA00000000B6CFB4F800000000D6 -:1052B0002530326400000000323032362D25303285 -:1052C000642D2530326420253032643A2530326432 -:1052D000000000007425645F312E7478743D22252F -:1052E000732200007425645F322E7478743D222589 -:1052F000732200007425645F332E7478743D224855 -:105300004B2200007425645F342E7478743D22258E -:10531000732200007425645F352E7478743D222555 -:10532000732200007425645F362E7478743D222544 -:10533000732200002DE9F047A0B03220FDF77EFC7B -:10534000502245490CA8FBF7E1FA4FF0000A202251 -:105350004149503104A8FBF7D9FA0DF131013FA0C2 -:10536000FFF7AEFA0A20FDF769FC9DF845103FA053 -:10537000FFF7A6FA0A20FDF761FC0DF146013FA0F8 -:10538000FFF79EFA0A20FDF759FCBAF1000F03D08F -:10539000BAF1010F04D101E03CA403E03DA401E017 -:1053A0003EA400BF00BF21463EA0FFF789FA0A20B5 -:1053B000FDF744FC002549E004A800EBC50605EB19 -:1053C000450000F10509307810B1012804D101E051 -:1053D0002EA703E037A701E030A700BF00BF3A4681 -:1053E000494636A0FFF76CFA0520FDF727FC7078D8 -:1053F00010B1012806D102E00FF2900805E00FF28B -:10540000CC0802E00FF2940800BF00BF424609F149 -:1054100001012AA0FFF754FA0520FDF70FFC3078B0 -:10542000012805D12BA101A87268FBF725F803E03C -:105430002AA101A8FBF720F801AA09F102011FA087 -:10544000FFF73EFA0520FDF7F9FB6D1C042DB3DBD9 -:1054500020B0BDE8F0870000D887000874315F31C4 -:105460002E7478743D2225732200000074315F325F -:105470002E7478743D2225642200000074315F335D -:105480002E7478743D22257322000000D5FDB3A34D -:1054900000000000D2ECB3A300000000CEB4D6AAF6 -:1054A0000000000074315F342E7478743D2225733F -:1054B00022000000C2A9D2BA0000000074315F25AA -:1054C000642E7478743D222573220000B6CFB4F8A0 -:1054D000000000002564C3D70000000030C3D700DF -:1054E0002DE9F04FB9B08046012516E0012611E004 -:1054F0003246294693A0FFF7E3F905FB06F0C117F2 -:1055000000EB91718910A0EB810111B90520FDF725 -:1055100095FB761C0F2EEBDD6D1C042DE6DD642063 -:10552000FDF78CFB8B48007828B98BA0FFF7C8F9F2 -:1055300039B0BDE8F08F0024002532E005EB85008E -:105540008B4901EB00194FF0000A00260EE006EB34 -:10555000860107AA02EB810009F10101FBF77CFA41 -:1055600010B94FF0010A03E0701CC6B2A642EEDB90 -:1055700000BFBAF1000F12D104EB840107AA02EBBD -:105580008100132209F10101FBF73BFA002004EB33 -:10559000840107AA02EB8101C874601CC4B2681CB4 -:1055A000C5B26C480078854201DA0A2CC6DBB8F136 -:1055B000010F01DBA04503DD6EA0FFF781F9B7E71E -:1055C0000027002515E005EB8500694901EB001671 -:1055D000A8F1010000EB800007AA02EB8001701C1B -:1055E000FBF73AFA18B906A8C555781CC7B2681C6B -:1055F000C5B258480078854201DA042FE3DB4FF04A -:10560000000999E006A810F8090000EB800058494D -:1056100001EB001509F1010005906A7D5AA005997A -:10562000FFF74EF90A20FDF709FB05F116025AA013 -:105630000599FFF745F90A20FDF700FB95F82C00C6 -:1056400010B1012806D102E00FF25C1A05E00FF25A -:10565000601A02E00FF2601A00BF00BF524658A065 -:105660000599FFF72DF90A20FDF7E8FA00265AE020 -:1056700006EB4600001D049005F1300010F83600DE -:1056800010B1012806D102E00FF21C1B05E00FF259 -:10569000401B02E00FF2401B00BF00BF5B464FA063 -:1056A000DDE90421FFF70CF90520FDF7C7FA05F144 -:1056B000300000EBC600407810B1012806D102E0AE -:1056C00039A0039005E049A0039002E042A00390B6 -:1056D00000BF00BFDDE90332521C40A00599FFF76F -:1056E000EFF80520FDF7AAFA05F1300010F83600B2 -:1056F000012809D105F1300000EBC6003DA1426848 -:105700006846FAF7B9FE03E03CA16846FAF7B4FE32 -:105710006B46049A921C31A00599FFF7D1F8052039 -:10572000FDF78CFA761C042EA2DB1E20FDF786FA0C -:1057300009F1010000F0FF09B945FFF663AF00BFB2 -:10574000F6E600007425645F25642E7478743D22AB -:10575000220000007002002074315F312E747874D2 -:105760003D22CEDEC9E8B1B8CAFDBEDD2200000090 -:105770004C84002074315F312E7478743D22C7F858 -:10578000D3F2CEDED0A722007425645F312E747868 -:10579000743D2225642200007425645F322E7478E3 -:1057A000743D222573220000D5FDB3A30000000044 -:1057B000D2ECB3A300000000CEB4D6AA00000000D3 -:1057C0007425645F332E7478743D222573220000A3 -:1057D000C2A9D2BA000000002D0000007425645F49 -:1057E00025642E7478743D2225732200B6CFB4F858 -:1057F000000000002564C3D70000000030C3D700BC -:105800002DE9F043BDB06420FDF718FA7648007822 -:1058100028B976A0FFF754F83DB0BDE8F083002426 -:1058200000279DE007EB8700764901EB00164FF05B -:10583000000900254EE005EB450101AA02EBC1007D -:10584000711CFBF709F9E8BB4FF0010905EB4500B6 -:1058500001A901EBC000007D401C05EB450101AA38 -:1058600002EBC101087596F82A0001280BD105EB5F -:10587000450001A901EBC000407D401C05EB45013E -:1058800002EBC101487596F82B0001280CD105EBFD -:10589000450001A901EBC000807D401C05EB4501DE -:1058A00001AA02EBC101887596F82C0001280ED1DF -:1058B00005EB450001A901EBC000C07D401C05EBD4 -:1058C000450100E004E001AA02EBC101C87503E054 -:1058D000681CC5B2A542AEDB00BFB9F1000F3DD1D7 -:1058E0000A2C3BDA04EB440101AA02EBC1001322AB -:1058F000711CFBF786F8002004EB440101AA02EBBF -:10590000C101C874012004EB440102EBC101087518 -:1059100096F82A00012800D100E0002004EB4401A1 -:1059200001AA02EBC101487596F82B00012800D1AD -:1059300000E0002004EB440101AA02EBC1018875DC -:1059400096F82C00012800D100E0002004EB44016F -:1059500001AA02EBC101C875601CC4B2781CC7B2B1 -:10596000214800788742FFF65DAF042C01DD04205A -:1059700000E020468046002632E006EB460001A902 -:1059800001EBC005771C2A4639461FA0FEF798FF99 -:105990000A20FDF753F92A7D39461FA0FEF790FF34 -:1059A0000A20FDF74BF96A7D39461FA0FEF788FFF4 -:1059B0000A20FDF743F9AA7D39461FA0FEF780FFB4 -:1059C0000A20FDF73BF9EA7D39461FA0FEF778FF74 -:1059D0000A20FDF733F91E20FDF730F9701CC6B21E -:1059E0004645CADB00BF17E77002002074315F3103 -:1059F0002E7478743D22CEDEC9E8B1B8CAFDBEDD92 -:105A0000220000004C8400207425645F312E7478DD -:105A1000743D2225732200007425645F322E747851 -:105A2000743D2225642200007425645F332E74784F -:105A3000743D2225642200007425645F342E74783E -:105A4000743D2225642200007425645F352E74782D -:105A5000743D2225642200007047704770477047EC -:105A60007047000010B502494868804710BD00002B -:105A7000280000207047000010B50248FEF760F8CB -:105A800010BD00002C04002070B50546AC6B002052 -:105A9000E085E0842046FDF7EDFF70BD70B5064659 -:105AA0000025B46B20684069C0F3C01594F83D0030 -:105AB000212805D125B10020E084204600F0F7F828 -:105AC00020684069C0F3801594F83E00222805D173 -:105AD00025B10020E085204600F0A3F8206C40F0BE -:105AE000100020642046FDF7C5FF70BD70B5054667 -:105AF000AC6B2868006800F48070002842D1E08513 -:105B000000BF00BF21680C3151E8001F21F48070F4 -:105B100021680C3141E80002002AF3D100BF00BF28 -:105B200000BF2168143151E8001F21F001002168F5 -:105B3000143141E80002002AF3D100BF00BF00BFCA -:105B40002168143151E8001F21F040002168143110 -:105B500041E80002002AF3D100BF202084F83E0073 -:105B6000206B01280ED100BF00BF21680C3151E825 -:105B7000001F21F0100021680C3141E80002002ACA -:105B8000F3D100BF206B012804D1A18D2046FDF781 -:105B900003FF02E02046FEF723FB70BD70B505460B -:105BA000AC6B206B012805D1A08D41082046FDF784 -:105BB000F3FE02E02046FEF714FB70BD70B505460B -:105BC000AC6B2868006800F48070F8B90020E084AD -:105BD00000BF00BF2168143151E8001F21F0800090 -:105BE0002168143141E80002002AF3D100BF00BF50 -:105BF00000BF21680C3151E8001F41F040002168CE -:105C00000C3141E80002002AF3D102E02046FEF701 -:105C1000A9FB70BD70B50446A56B2846FEF7D0FB06 -:105C200070BD00BF00BF02680C3252E8002F22F4A2 -:105C3000907102680C3242E80013002BF3D100BFD0 -:105C400000BF00BF0268143252E8002F22F00101A9 -:105C50000268143242E80013002BF3D100BF016B3D -:105C600001290ED100BF00BF02680C3252E8002F9C -:105C700022F0100102680C3242E80013002BF3D12D -:105C800000BF202180F83E1000210163704710B54D -:105C900004462068C06820F040002168C8602020C9 -:105CA00084F83D002046FEF75DFB002010BD00BFDC -:105CB00000BF02680C3252E8002F22F0C0010268D7 -:105CC0000C3242E80013002BF3D100BF202180F8F2 -:105CD0003D107047F8B5044694F83E00222873D171 -:105CE000A068B0F5805F0CD1206950B90025A66A84 -:105CF00020684068C0F308003080A06A801CA06261 -:105D000015E0A56A0026A068B0F5805F03D0A06802 -:105D100028B9206918B920684068287004E0206814 -:105D2000406800F07F002870A06A401CA062E08DEF -:105D3000401E80B2E085002844D12068C06820F071 -:105D400020002168C8602068C06820F48070216845 -:105D5000C8602068406920F0010021684861202067 -:105D600084F83E00206B012826D10020206300BF6C -:105D700000BF21680C3151E8001F21F0100021689C -:105D80000C3141E80002002AF3D100BF206800680E -:105D900000F0100010280AD100BF002000902068F9 -:105DA0000068009020684068009000BF00BFA18D8F -:105DB0002046FDF7F1FD02E02046FEF711FA002033 -:105DC000F8BD01E00020FBE70220F9E72DE9F84FDC -:105DD00004462068006920F44050E16808432168C7 -:105DE00008612169A068084361690843E1690843C3 -:105DF00000902068C06849F20C618843009908430C -:105E00002168C8602068406920F44070A169084397 -:105E10002168486176492068884203D07549206826 -:105E2000884203D1FDF7A6FA814602E0FDF792FA17 -:105E30008146E069B0F5004F6CD102206168A0FB9B -:105E4000015003461920A9FB007001462A46384636 -:105E5000FAF780FA6421B0FBF1F04FEA001A022051 -:105E60006168A0FB01510B461920A9FB00712A466D -:105E70003846FAF76FFA834602206168A0FB0150AA -:105E800003461920A9FB00712A463846FAF762FA40 -:105E90006421B0FBF1F000EBC00101EB0010ABEBB3 -:105EA0008000322101EBC0006421B0FBF1F000F072 -:105EB000F8000AEB400A02206168A0FB015003468B -:105EC0001920A9FB007001462A463846FAF742FA23 -:105ED000834602206168A0FB015003461920A9FBFC -:105EE00000712A463846FAF735FA6421B0FBF1F022 -:105EF00000EBC00101EB0010ABEB8000322101EBA5 -:105F0000C0006421B0FBF1F000F0070050442168AC -:105F100088606AE004206168A0FB015003461920F4 -:105F2000A9FB007001462A463846FAF713FA824662 -:105F300004206168A0FB015003461920A9FB0070F2 -:105F400001462A463846FAF705FA6421B0FBF1F01B -:105F500000EBC00101EB0010AAEB8000322101EB45 -:105F600000106421B0FBF1F000F0F00A0420616839 -:105F7000A0FB017003461920A9FB00513A462846B0 -:105F8000FAF7E8F96421B0FBF1F00AEB001A0420FB -:105F90006168A0FB01510B461920A9FB00712A463C -:105FA0003846FAF7D7F9834604206168A0FB015010 -:105FB00003461920A9FB007001462A463846FAF725 -:105FC000C9F96421B0FBF1F000EBC00101EB001056 -:105FD000ABEB8000322101EB00106421B0FBF1F04B -:105FE00000F00F00504421688860BDE8F88F000081 -:105FF000001001400014014077B581B004461546F9 -:106000000298A062A58500202064222084F83E002A -:106010002A48A16BC8632A48A16B08642948A16B70 -:10602000C8640020A16B086502AE32682368191DA0 -:106030002B46A06BFCF7B8FD00BF00200090206845 -:106040000068009020684068009000BF00BF00BF5B -:10605000002084F83C0000BF206970B100BF00BF81 -:1060600021680C3151E8001F41F4807021680C3127 -:1060700041E80002002AF3D100BF00BF00BF216841 -:10608000143151E8001F41F001002168143141E84A -:106090000002002AF3D100BF00BF00BF2168143105 -:1060A00051E8001F41F040002168143141E800022E -:1060B000002AF3D100BF002004B070BDED5A0008E3 -:1060C0009D5B00089D5A0008014691F83D0021287B -:1060D00028D18868B0F5805F0BD1086948B90A6A91 -:1060E0001088C0F308000B685860086A801C0862BA -:1060F00005E00B6A581C086218780B685860C88C59 -:10610000401E80B2C88458B90868C06820F080007A -:106110000B68D8600868C06840F040000B68D86021 -:10612000002070470220FCE72DE9F04104460D46AF -:1061300017469846069E34E0701C88B32EB1FCF7D3 -:1061400061FFA0EB0800B0422BD900BF00BF21685F -:106150000C3151E8001F21F4D07021680C3141E866 -:106160000002002AF3D100BF00BF00BF2168143134 -:1061700051E8001F21F001002168143141E80002BC -:10618000002AF3D100BF202084F83D0084F83E00AF -:1061900000BF002084F83C0000BF0320BDE8F08170 -:1061A000FFE7206800682840A84201D1012000E0F4 -:1061B0000020B842C0D00020F0E7000010B502482F -:1061C000FDF7BEFC10BD00007004002010B50248B1 -:1061D000FDF7B6FC10BD0000B404002000BFFEE7D0 -:1061E00003B401984100009850EAC12018BF042070 -:1061F0004A0D18BF40F0010040F2FF72B2EB515F50 -:1062000008BF40F00200012808BF052002B0704717 -:1062100002480068C0F30220704700000CED00E067 -:1062200010B5002804DB0A07130E054A135406E0D4 -:106230000A07140E034A00F00F031B1FD45410BDAD -:1062400000E400E018ED00E030380A2801D2012017 -:106250007047002070470000014800787047000038 -:106260002402002010B500200749087000221021E8 -:106270000648FCF7C1FE002210210548FCF7BCFED1 -:10628000002000F007F810BD24020020001002409A -:10629000000C02402DE9F04180460025102D01DB65 -:1062A000BDE8F0812C4805702C48465D2C48475DC0 -:1062B000002431E046FA04F000F0010048B1294A18 -:1062C00032F81410284A52F824000122FCF794FEF8 -:1062D00008E0244A32F81410234A52F8240000221D -:1062E000FCF78AFE47FA04F000F0010048B11F4AAB -:1062F00032F814101E4A52F824000122FCF77CFEEA -:1063000008E01A4A32F81410194A52F82400002200 -:10631000FCF772FE601CC4B2042CCBDB002416E038 -:10632000AC4209D1134A32F81410134A52F824002F -:106330000022FCF761FE08E00E4A32F814100E4A03 -:1063400052F824000122FCF757FE601CC4B2102C46 -:10635000E6DB00BFA4E700002402002004020020C6 -:106360001402002084010020740100209C01002000 -:106370008C010020E4010020A401002010B586B0AB -:106380000446002001900B2003900120049002207D -:10639000059000200090694601A8FCF763FC06B058 -:1063A00010BD000010B50649486880471022054915 -:1063B000054800F055F802494868804710BD0000C4 -:1063C000680100204402002000000E0870B5102271 -:1063D0000E49A1F11000FAF79AF9A8B10C494868E2 -:1063E000804772B6102209490A4800F05DF8044659 -:1063F0002CB906481038054610352ECD2EC062B691 -:1064000003494868804700BF70BD00004402002077 -:106410006801002000000E0810B5FFF7D7FF10BD7F -:1064200010B5FFF7BFFF0C480068808BB0F57A7F8E -:1064300003DD282108480068818307480068C08B75 -:10644000102803DD102104480068C1830348044676 -:1064500010341ECC1EC010BD640200203402002087 -:106460002DE9F84103460C4621461D46960802F0E8 -:106470000307002005E055F820C0C1F800C0091D41 -:10648000401CB042F7D36FB155F826000090EC469F -:10649000002004E01CF8008001F80080401CB84295 -:1064A000F8D300BFBDE8F8812DE9FC5F07468846B8 -:1064B000154600244646A808019005F00309BA468F -:1064C000FCF77CFC3846FFF759FF044624B1FCF783 -:1064D0001FFC2046BDE8FC9F4FF0000B0FE0D6F8F4 -:1064E00000C06246002351460220FCF71BFC044614 -:1064F00004B107E00AF1040A361D0BF1010B019803 -:106500008345ECD300BFB4B9B9F1000F13D04FF0FD -:10651000FF300090EB46002003E0315C0BF80010E8 -:10652000401C4845F9D3002351460220009AFCF74D -:10653000F9FB044600BFFCF7EBFB2046CAE700006E -:1065400010B54FF480710248FCF74CFD10BD0000FF -:106550000010024010B5002409E03220FBF7C2FF12 -:106560004FF480710348FCF73DFD601CC4B2142C4D -:10657000F3DB10BD001002402DE9F04104468846CF -:1065800017460020A074A08BB84200DAA78B3A46C9 -:1065900041466069FAF775F93A4661696068FDF746 -:1065A0008BFEFCF72FFD054608E0FCF72BFD0646A9 -:1065B000701BC82802D90120A07402E0A07C00282A -:1065C000F3D000BFBDE8F08110B5044660680068F4 -:1065D000C06840F0100061680968C860E28BA1697A -:1065E0006068FDF797F910BD70B504466068FDF767 -:1065F000FBF9E08BE16809684968401A86B206B980 -:1066000070BD002506E0A2695119206802F030F83B -:10661000681C85B2B542F6DB204600F041F8E28BFB -:10662000A1696068FDF776F900BFE9E770B5044637 -:10663000A08C618C884227DA2068808920842046DB -:1066400000F034F8208CE18B88421DDC208CD8B11E -:10665000208C40F6B831884203D9206801F0BCFF95 -:1066600012E0002506E0094A5119206801F0BCFF3C -:10667000681C85B2208CA842F5DCA06C20B1218C6E -:1066800022460248A36C984770BD0000802F00206E -:1066900090F82620012A02D1428C0A444284704795 -:1066A000012180F82610002141847047002180F8E4 -:1066B00026104184704700002DE9F04104460F4642 -:1066C00016461448844204D1012204211248FCF7E2 -:1066D00093FCA08B96FBF0F01FFA80F8002507E0F2 -:1066E000A28B02FB05712046FFF746FF681C85B2AE -:1066F0004545F5DBA08B00FB156086B20EB9BDE801 -:10670000F081A08B00FB057132462046FFF734FF75 -:1067100000BFF4E71801002000000240012181744D -:10672000704770477047000010B5044610488088D5 -:10673000A04202DC00F04AF810BD002013E00C4932 -:10674000898801B911E00A490988491C4FF4FA7295 -:1067500091FBF2F302FB1311054A1180114689885F -:10676000491E9180401CA042E9DB00BF00BFE3E767 -:10677000888100202DE9F04100F022F805460A2D1D -:1067800002DA0020BDE8F08100260027022412E092 -:10679000204601F099FF8046B8F1AA0F09D1701C7C -:1067A000C6B22746042E04DBF81CA84201DC80B2E6 -:1067B000E8E7601C84B2AC42EADB0020E2E70000BC -:1067C00001488088704700008881002010B50020B3 -:1067D00006490880488088804FF4FA710348801D7C -:1067E000FAF7C6F800200249088010BD8881002011 -:1067F00068020020FCF718FCFDF7ECFFFDF738FEFF -:10680000FDF7E2FDFDF726FFFDF740FFFDF75AFF1C -:10681000FBF7CAFC01E0FBF70FFDFCE770B5034690 -:106820000C4603E014F8015B03F8015B151EA2F1AE -:106830000102F7D170BD2DE9F04104460D46164620 -:1068400014B90020BDE8F081082E01DA0020F9E734 -:10685000B01E81B2284600F038F80746A81910F893 -:10686000018C4FF6FF7000EA0828A81910F8020CF6 -:1068700040EA0808B84501D00020E3E728782070F6 -:1068800068786070A878000260806088E9780843C2 -:1068900060806078062802D1281DA06013E060782F -:1068A000102809D128790002A080A08869790843BE -:1068B000A080E81DA06006E028790002A080A088E2 -:1068C00069790843A0800120BCE730B502464FF645 -:1068D000FF7012E012F8014B6040002308E000F066 -:1068E000010424B14AF2010484EA600000E040108F -:1068F0001C465D1CABB2082CF1DB0C1EA1F101059E -:10690000A9B2E7D130BD2DE9FC4106460C4615463B -:1069100098468DF8006041208DF80100200A8DF81E -:106920000200E0B28DF80300280A8DF80400E8B2F6 -:106930008DF8050006216846FFF7C7FF0746F8B245 -:106940008DF80600380A8DF8070008216846C04710 -:10695000BDE8FC812DE9F0478EB081460E46154614 -:106960001F46DDF858A08DF8049010208DF8050022 -:10697000300A8DF80600F0B28DF80700280A8DF86D -:106980000800E8B28DF809006806000E8DF80A00CC -:1069900000240DE037F81400010A6000C01D01AAB0 -:1069A000115417F81410600008301154601C84B2A0 -:1069B0009DF80A0000EBD071B4EB610FEADB6000D8 -:1069C000C01D81B201A8FFF780FF80466000C01D96 -:1069D00001AA02F800804FEA182160000830115423 -:1069E0006000093081B201A8D0470EB0BDE8F08741 -:1069F0002DE9F05F81468A46934652464946A948AA -:106A0000FFF719FF08B9BDE8F09FA74800680078B4 -:106A1000A4490978884204D0A2480078E82800D028 -:106A2000F1E74FF00008A148C0F800B09D48407859 -:106A300006287CD004DC032807D0042878D105E0A0 -:106A4000102876D04128F9D13BE000BF954847880F -:106A500000789749087093484078487091480079C9 -:106A60004006000E887000250FE0384600F040F91F -:106A70000646310A6800C01C8D4A11546800001D8A -:106A80001654781C87B2681C85B286488088A84254 -:106A9000EBDC87488078C11C8548FFF716FF044669 -:106AA00083488078C01C824A1454210A104680789A -:106AB000001D115410468078401D1146A1F80008B1 -:106AC000CBE0784847880078794908707548407865 -:106AD0004870744840880012887072488078C87086 -:106AE00070488088C0F3D71008716E48007940065E -:106AF000000E487100250FE0384600F0F9F8064610 -:106B0000310A6800801D6A4A11546800C01D16547D -:106B1000781C87B2681C85B262488088A842EBDC8A -:106B2000604880884000801D81B2614802E018E022 -:106B30008EE04BE0FFF7C9FE04465A4880884000CB -:106B4000801D5B4A1454210A564880884000C01DAD -:106B5000115454488088400008301146A1F80008BC -:106B60007BE050484788806840784E4989680978BA -:106B700040EA01263146384601F062F88046B8F115 -:106B8000000F00D06FE008204949A1F800084548EF -:106B900000780870434840784870424840880012A6 -:106BA000887040488078C8703E48806800780871D6 -:106BB0003C4880684078487106213D48FFF785FED3 -:106BC00004463B498C71200AC87144E03548478827 -:106BD000002517E03348806810F815603148816857 -:106BE0006800401C085C40EA06263146384601F041 -:106BF00027F88046781C87B2B8F1000F00D032E049 -:106C0000681C85B227488088A842E3DC0820284910 -:106C1000A1F800082348007808702248407848709E -:106C200020484088001288701E488078C8701D482F -:106C30008088001208711B480079487106211C48A1 -:106C4000FFF743FE04461A498C71200AC87102E01E -:106C50004FF0010807E000BF00BF1548B0F800186A -:106C600000F028F8CFE605201149A1F800080D48EA -:106C7000007808700B48407840F080004870084663 -:106C800080F802800321FFF720FE04460849CC70FB -:106C9000200A08710846B0F8001800F00BF800BF91 -:106CA000B1E600004C8E00202404002028040020BF -:106CB000588E002070B504460D460A480A490968F6 -:106CC000884204D12A462146836B984708E007484A -:106CD00005490968884203D12A462146836B9847B3 -:106CE00070BD00007800002028040020180100205A -:106CF000F0B501460020B1F5A27F06D006DCA2293E -:106D000005D005DCA22904D204E0A7E29AE2A6E2BB -:106D10004AE14EE18E0000BF7E447668B744000031 -:106D2000820900008409000086090000880900002B -:106D30008A0900008C0900008E09000090090000FB -:106D400092090000940900009609000098090000CB -:106D50009A0900009C0900009E090000A00900009B -:106D6000A2090000A4090000A6090000A80900006B -:106D7000AA090000AC090000AE090000B00900003B -:106D8000B2090000B4090000B6090000B80900000B -:106D9000BA090000BC090000BE090000C0090000DB -:106DA000C2090000C4090000C6090000C8090000AB -:106DB000CA090000CC090000CE090000D00900007B -:106DC000D2090000D4090000D6090000D80900004B -:106DD000DA090000DC090000DE090000E00900001B -:106DE000E2090000E4090000E6090000E8090000EB -:106DF000EA090000EC090000EE090000F4090000B7 -:106E0000F6090000F8090000FA090000FC0900007A -:106E1000FE090000000A0000020A0000040A000047 -:106E2000060A0000080A00000A0A00000C0A000016 -:106E30000E0A0000100A0000120A0000140A0000E6 -:106E4000160A0000180A00001A0A00001C0A0000B6 -:106E50001E0A0000200A0000220A0000240A000086 -:106E6000260A0000300A0000320A0000340A00003E -:106E7000360A0000380A00003A0A00003C0A000006 -:106E80003E0A0000400A0000420A0000440A0000D6 -:106E9000460A0000480A00004A0A00004C0A0000A6 -:106EA0004E0A0000500A0000520A0000540A000076 -:106EB000560A0000580A00005A0A00005C0A000046 -:106EC0005E0A00006E0A0000700A0000720A0000EC -:106ED000740A0000760A0000780A00007A0A0000AE -:106EE0007C0A00007E0A0000800A0000820A00007E -:106EF000840A0000860A0000880A00008A0A00004E -:106F00008C0A00008E0A0000900A0000920A00001D -:106F1000940A0000960A0000980A00009A0A0000ED -:106F20009C0A00009E0A0000A00A0000A20A0000BD -:106F3000A40A0000A60A0000A80A0000AA0A00008D -:106F4000AC0A0000AE0A0000B00A0000B20A00005D -:106F5000B40A0000B60A0000B80A0000BA0A00002D -:106F6000BC0A0000BE0A0000C00A0000C20A0000FD -:106F7000C40A0000C60A0000C80A0000CA0A0000CD -:106F8000CC0A0000CE0A0000D00A0000D20A00009D -:106F9000D40A0000D60A0000D80A0000DA0A00006D -:106FA000DC0A0000DE0A0000A1F1A305A12D00D239 -:106FB00000E052E1AE0000BF7E447668B7440000B6 -:106FC000420800004408000046080000480800008D -:106FD0004A0800004C0800004E080000500800005D -:106FE000520800005408000056080000580800002D -:106FF0005A0800005C0800005E08000060080000FD -:1070000062080000640800006608000068080000CC -:107010006A0800006C0800006E080000700800009C -:10702000720800007408000076080000780800006C -:107030007A0800007C0800007E080000800800003C -:10704000820800008408000086080000880800000C -:107050008A0800008C0800008E08000090080000DC -:1070600092080000940800009608000098080000AC -:107070009A0800009C0800009E080000A00800007C -:10708000A2080000A4080000A6080000A80800004C -:10709000AA080000AC080000AE080000B00800001C -:1070A000B2080000B4080000B6080000B8080000EC -:1070B000BA080000BC080000BE080000C0080000BC -:1070C000C2080000C4080000C6080000C80800008C -:1070D000CA080000CC080000CE080000D00800005C -:1070E000D2080000D4080000D6080000D80800002C -:1070F000DA080000DC080000DE080000E0080000FC -:10710000E2080000E4080000E6080000E8080000CB -:10711000EA080000EC080000EE080000F00800009B -:10712000F2080000F4080000F6080000F80800006B -:10713000FA080000FC080000FE080000000900003A -:107140000209000004090000060900000809000007 -:107150000A0900000C0900000E09000010090000D7 -:1071600012090000140900001609000018090000A7 -:107170001A0900001C0900001E0900002009000077 -:107180002209000024090000260900002809000047 -:107190002A0900002C0900002E0900003009000017 -:1071A00032090000340900003609000038090000E7 -:1071B0003A0900003C0900003E09000040090000B7 -:1071C0004209000044090000460900004809000087 -:1071D0004A0900004C0900004E0900005009000057 -:1071E0005209000054090000560900005809000027 -:1071F0005A0900005C0900005E09000060090000F7 -:1072000062090000640900006609000068090000C6 -:107210006A0900006C0900006E0900007009000096 -:107220007209000074090000760900007809000066 -:107230007A0900007C0900007E0900008009000036 -:1072400082090000B1F5F37F05D005DCA1F24515F8 -:10725000A12D02D204E0FDE34AE1ACE172E3CFE20A -:10726000AE0000BF7E447668B7440000DA06000036 -:10727000DC060000DE060000E0060000E20600007A -:10728000E4060000E6060000E8060000EA0600004A -:10729000EC060000EE060000F0060000F20600001A -:1072A000F4060000F6060000F8060000FA060000EA -:1072B000FC060000FE0600000007000002070000B8 -:1072C0000407000006070000080700000A07000086 -:1072D0000C0700000E070000100700001207000056 -:1072E0001407000016070000180700001A07000026 -:1072F0001C0700001E0700002007000022070000F6 -:107300002407000026070000280700002A070000C5 -:107310002C0700002E070000300700003207000095 -:107320003407000036070000380700003A07000065 -:107330003C0700003E070000400700004207000035 -:107340004407000046070000480700004A07000005 -:107350004C0700004E0700005007000052070000D5 -:107360005407000056070000580700005A070000A5 -:107370005C0700005E070000600700006207000075 -:107380006407000066070000680700006A07000045 -:107390006C0700006E070000700700007207000015 -:1073A0007407000076070000780700007A070000E5 -:1073B0007C0700007E0700008007000082070000B5 -:1073C0008407000086070000880700008A07000085 -:1073D0008C0700008E070000900700009207000055 -:1073E0009407000096070000980700009A07000025 -:1073F0009C0700009E070000A0070000A2070000F5 -:10740000A4070000A6070000A8070000AA070000C4 -:10741000AC070000AE070000B0070000B207000094 -:10742000B4070000B6070000B8070000BA07000064 -:10743000BC070000BE070000C0070000C207000034 -:10744000C4070000C6070000C8070000CA07000004 -:10745000CC070000CE070000D0070000D2070000D4 -:10746000D4070000D6070000D8070000DA070000A4 -:10747000DC070000DE070000E0070000E207000074 -:10748000E4070000E6070000EC070000EE0700003C -:10749000F0070000F2070000F4070000F607000004 -:1074A000F8070000FA070000FC070000FE070000D4 -:1074B00000080000020800000408000006080000A0 -:1074C000080800000A0800000C0800000E08000070 -:1074D0001008000012080000140800001608000040 -:1074E000180800001A0800001C0800001E08000010 -:1074F00040F237268D1BB1425CD055DCA1F2E71576 -:10750000502D58D2DFE815F0C302C402C502C602EE -:10751000C702C802C902CA02CB02CC02CD02CE0207 -:10752000CF02D002D102D202D302D402D502D602B7 -:10753000D702D802D902DA02DB02DC02DD02DE0267 -:10754000DF02E002E102E202E302E402E502E60217 -:10755000E702E802E902EA02EB02EC02ED02EE02C7 -:10756000EF02F002F102F202F302F402F502F60277 -:10757000F702F802F902FA02FB02FC02FD02FE0227 -:10758000FF020003010302030303040305030603D0 -:107590000703080309030A030B030C030D030E037F -:1075A0000F03100311031203292D70D02FDC292D96 -:1075B000A7D201E0BBE2E5E0DFE815F0E400BA02A3 -:1075C000BB02BC02BD02BE02BF02C002C102C202B7 -:1075D000C302C402C502C602C702C802C902CA0267 -:1075E000CB02CC02CD02CE02CF02D002D102D20217 -:1075F000D302D402D502D602D702D802D902DA02C7 -:10760000DB02DC02DD02DE02DF02E002E1023D2DF0 -:107610007ED018DCA5F12A05132DC9D2DFE815F0BC -:10762000B102B202B302B402B502B602B702B802A6 -:10763000B902BA02BB02BC02BD02BE02BF02C00256 -:10764000C102C202C302472D7ED00EDCA5F13E0569 -:10765000092DADD2DFE815F0A902AA02AB02AC02F7 -:10766000AD02AE02AF02B002B10244F6EC37EE1B3F -:10767000BD426AD00CDC482D68D0A5F59645E93DA1 -:10768000002D7DD0012D7CD0022D7BD1BCE277E294 -:10769000012E78D0022E77D0032E76D0042EF4D18E -:1076A000C2E200BF00BF00BF00BF00BF00BF00BFFD -:1076B00000BF00BF00BF00BF00BF00BF00BF00BFD2 -:1076C00000BF00BF00BF00BF00BF00BF00BF00BFC2 -:1076D00000BF00BF00BF00BF00BF00BF00BF00BFB2 -:1076E00000BF00BF00BF00BF00BF00BF00BF00BFA2 -:1076F00000BF00BF00BF00BF00BF00BF00BF00BF92 -:1077000000BF00BF00BF00BF00BF00BF00BF00E060 -:107710004AE200BF00BF00BF00BF00BF00BF00BF04 -:1077200000BF00BF00BF00BF00BF00BF00BF00BF61 -:1077300000BF00BF00BF00BF00BF00BF00BF00BF51 -:1077400000BF00BF00BF02E038E25EE237E200BFE8 -:1077500000BF00BF00BF00BF00BF00BF00BF00BF31 -:1077600000BF00BF00BF00BF00BF00BF00BF00BF21 -:1077700000BF00BF00BF00BF00BF00BF00BF05E0EB -:1077800040E240E253E241E248E24AE200BF00BF89 -:1077900000BF00BF00BF00BF00BF00BF00BF00BFF1 -:1077A00000BF00BF00BF00BF00BF00BF00BF00BFE1 -:1077B00000BF00BF00BF00BF00BF00BF00BF00BFD1 -:1077C00000BF00BF00BF00BF00BF00BF00BF00BFC1 -:1077D00000BF00BF00BF00BF00BF00BF00BF00BFB1 -:1077E00000BF00BF00BF00BF00BF00BF00BF00BFA1 -:1077F00000BF00BF00BF00BF00BF00BF00BF00BF91 -:1078000000BF00BF00BF00BF00BF00BF00BF00BF80 -:1078100000BF00BF00BF00BF00BF00BF00BF00BF70 -:1078200000BF00BF00BF00BF00BF00BF00BF00BF60 -:1078300000BF00BF00BF00BF00BF00BF00BF00BF50 -:1078400000BF00BF00BF00BF00BF00BF00BF00BF40 -:1078500000BF00BF00BF00BF00BF00BF00BF00BF30 -:1078600000BF00BF00BF00BF00BF00BF00BF00BF20 -:1078700000BF00BF00BF00BF00BF00BF00BF00BF10 -:1078800000BF00BF00BF00BF00BF00BF00BF00BF00 -:1078900000BF00BF00BF00BF00BF00BF00BF00BFF0 -:1078A00000BF00BF00BF00BF00BF00BF00BF00BFE0 -:1078B00000BF00BF00BF00BF00BF00BF00BF00BFD0 -:1078C00000BF00BF00BF00BF00BF00BF00BF00BFC0 -:1078D00000BF00BF00BF00BF00BF00BF00BF00BFB0 -:1078E00000BF00BF00BF00BF00BF00BF00BF00BFA0 -:1078F00000BF00BF00BF00BF00BF00BF00BF00BF90 -:1079000000BF00BF00BF00BF00BF00BF00BF00BF7F -:1079100000BF00BF00BF00BF00BF00BF00BF00BF6F -:1079200000BF00BF00BF00BF00BF00BF00BF00BF5F -:1079300000BF00BF00BF00BF00BF00BF00BF00BF4F -:1079400000BF00BF00BF00BF00BF00BF00BF00BF3F -:1079500000BF00BF00BF00BF00BF00BF00BF00BF2F -:1079600000BF00BF00BF00BF00BF00BF00BF00BF1F -:1079700000BF00BF00BF00BF00BF00BF00BF00BF0F -:1079800000BF00BF00BF00BF00BF00BF00BF00BFFF -:1079900000BF00BF00BF00BF00BF00BF00BF00BFEF -:1079A00000BF00BF00BF00BF00BF00BF00BF00BFDF -:1079B00000BF00BF00BF00BF00BF00BF00BF00BFCF -:1079C00000BF00BF00BF00BF00BF00BF00BF00BFBF -:1079D00000BF00BF00BF00BF00BF00BF00BF00BFAF -:1079E00000BF00BF00BF00BF00BF00BF00BF00BF9F -:1079F00000BF00BF00BF00BF00BF00BF00BF00BF8F -:107A000000BF00BF00BF00BF00BF00BF00BF00BF7E -:107A100000BF00BF00BF00BF00BF00BF00BF00BF6E -:107A200000BF00BF00BF00BF00BF00BF00BF00BF5E -:107A300000BF00BF00BF00BF00BF00BF00BF00BF4E -:107A400000BF00BF00BF00BF00BF00BF00BF00BF3E -:107A500000BF00E01AE000BF00BF00BF00BF00BFD2 -:107A600000BF00BF00BF00BF00BF00BF00BF00BF1E -:107A700000BF00BF00BF00BF00BF00BF00BF00BF0E -:107A800000BF00BF00BF00BF00BF00BF00BF00BFFE -:107A900000BF00BF00BF00BF00BF00BF00BF00BFEE -:107AA00000BF00BF00BF00BF00BF00BF00BF00BFDE -:107AB00000BF00BF00BF00BF00BF00BF00BF00BFCE -:107AC00000BF00BF00BF00BF00BF00BF00BF00BFBE -:107AD00000BF00BF00BF00BF00BF00BF00BF00BFAE -:107AE00000BF00BF00BF00BF00BF00BF00BF00BF9E -:107AF00000BF00BF00BF00BF00BF00BF00BF00BF8E -:107B000000BF00BF00BF00BF00BF00BF00BF00BF7D -:107B100000BF00BF00BF00BF00BF00BF00BF00BF6D -:107B200000BF00BF00BF00BF00BF00BF00BF00BF5D -:107B300000BF00BF00BF00BF00BF00BF00BF00BF4D -:107B400000BF00BF00BF00BF00BF00BF00BF00BF3D -:107B500000BF00BF00BF00BF00BF00BF00BF00BF2D -:107B600000BF00BF00BF00BF00BF00BF00BF00BF1D -:107B700000BF00BF00BF00BF00BF00BF00BF00BF0D -:107B800000BF00BF00BF00BF00BF00BF00BF00BFFD -:107B900000BF00BF00BF00BF00BF00BF00BF00BFED -:107BA00000BF00BF00BF00BF00BF00BF00BF00BFDD -:107BB00000BF00BF00BF00BF00BF00BF00BF502517 -:107BC0001D4EB68B7600AE4203D11C4A32F811002E -:107BD00017E0194EB68B7600502E12D2164EB68B89 -:107BE00091FBF6F6B3B2144EB68B91FBF6F706FB9B -:107BF0001716B4B203EB8306104F07EB061232F8E8 -:107C0000140016E000BF00BF00BF00BFA1F59C45F7 -:107C1000203D094E103636F815000AE0064DA87EC4 -:107C200007E0054DA88B04E0034DE88B01E0002040 -:107C300000BF00BFF0BD0000340200205807002044 -:107C40002DE9F04105460C464FF0000842F635316B -:107C5000681A8D4259D051DC42F61831A5EB01006B -:107C60008D4253D037DC42F60A31A5EB01008D423C -:107C70007ED025DC42F60331A5EB01008D4278D0A1 -:107C800016DC42F6FA21A5EB01008D4272D008DC29 -:107C9000FC2D70D0A5F52850F838A8B301286BD179 -:107CA00086E0012869D0022868D00828F7D1A0E032 -:107CB000072861D2DFE800F0609FA0A1A2A3A40082 -:107CC0000E28F6D2DFE800F0589E9FA0A1A2A3A440 -:107CD000A5A6A7A8A9AA1D28EBD2DFE800F04DA110 -:107CE000A2A3A4A5A6A7A8AFB0B1B2B3B4B5B6B7C6 -:107CF000B8B9BABBBCBDBEBFC0C1C2001D2871D0DF -:107D000016DC1D28D5D202E049E0ABE087E0DFE8D1 -:107D100000F033AAABACADAEAFB0B1B2B3B4B5B650 -:107D2000B9BABBBCBDBEBFC0C1C2C3C4C5C6C70013 -:107D30002C287DD00CDCA0F11E000E28B9D2DFE883 -:107D400000F0B1B2B3B4B5B6B7B8B9BABBBCBDBE3A -:107D500042F2EC22811A90426BD018DC302869D0B4 -:107D60000DDC2D2867D02E2866D02F2897D1AAE0C9 -:107D700047E03FE026E0F6E019E02DE033E08B2815 -:107D80007ED0A0F50850EB38002888D1B9E007294B -:107D90008FD2DFE801F0EDB8B9BAC4CFDC00764885 -:107DA0004FF6FF721146D0F8603120B29847DFE0FD -:107DB00071484FF6FF722146D0F860314FF0FF3026 -:107DC0009847D5E06C4822464FF6FF71D0F86031F5 -:107DD0004FF0FF309847CBE06748D0F850110020B3 -:107DE0008847C5E05DE06448D0F8541120468847D4 -:107DF000BEE000BF00BF00BF00BF00BF00BF00BFAC -:107E000000BF00BF00BF00BF00BF00BF00BF00BF7A -:107E100000BF00BF00BF00BF00BF00BF00BF00BF6A -:107E200000BF00BF00BF00BF00BF00BF00BF04E035 -:107E300046E067E048E044E044E000BF00BF00BF28 -:107E400000BF00BF00BF00BF00BF00BF00BF00BF3A -:107E500000BF00BF00BF00BF00BF00BF00BF00BF2A -:107E600000BF00BF00BF00BF00BF00BF00BF00BF1A -:107E700000BF00BF00BF00BF00BF00BF00BF00E0E9 -:107E800039E000BF00BF00BF00BF00BF00BF00BFA0 -:107E900000BF00BF00BF00BF00BF00BF00BF00BFEA -:107EA00000BF00BF00BF00BF00BF00BF00BF00BFDA -:107EB00000BF00BF00BF00BF00BF00BF00BF00BFCA -:107EC00000BF00BF00BF00BFA5F52C5002380A213B -:107ED00090FBF1F0C6B2A5F52C50023890FBF1F200 -:107EE00001FB1200C7B2244832463946D0F85C3153 -:107EF000204698473CE0E0B21F4AD2F86411884718 -:107F000036E000BF00BF00BF00BFA5F59C40203891 -:107F10001A4921F810401039486A804728E017486C -:107F200010388476807E1649087014491039486AE2 -:107F300080471DE0B4F57A7F02DD4FF0030805E0CD -:107F40000E48103884830146486A804710E0102CA0 -:107F500002DD4FF0030805E008481038C4830146ED -:107F6000486A804704E0E0B2064A5168884700BF8B -:107F700000BF4046BDE8F081880200204402002096 -:107F80000C040020780200200548807E054909681D -:107F900008700548054988640549886470470000F1 -:107FA0003402002024040020F16900087800002039 -:107FB0001801002070470000032809DC05490988E2 -:107FC000814203D10021034A118001E00149088068 -:107FD00070470000740200200848008830B1012872 -:107FE00005D0022804D0032804D102E003E002E017 -:107FF00001E000E000BF00BF7047000074020020F5 -:1080000010B50446024841682046884710BD00006C -:108010002802002070B50346002012E0052500EB81 -:1080200080060A4C2468103404F82650074C246853 -:10803000E380064C24682171044C24686271441C5E -:10804000E0B2034CE48B8442E8DC70BD0404002001 -:108050003402002010B504460948C08BA0420DDD53 -:10806000084800684480072104EB84020548006842 -:10807000103000F822102046FFF7C2FF10BD0000AC -:10808000340200200404002070B5034600202DE0D7 -:10809000062500EB8006184C2468103404F826509E -:1080A000B3F1FF3F04D1144C2468B4F9084000E058 -:1080B0001C46114D2D682C814FF6FF74A24203D14E -:1080C0000D4C2468648900E014460B4D2D686C81CA -:1080D0004FF6FF74A14203D1074C2468A48900E045 -:1080E0000C46054D2D68AC81441CE0B2034CE48B7A -:1080F0008442CDDC70BD0000040400203402002066 -:10810000002009E0042200EB8003064909681031D1 -:1081100001F82320411CC8B20349C98B8142F1DC1C -:1081200070470000040400203402002010B501460E -:1081300000200CE0032300EB8004074A1268103291 -:1081400002F82430044A1268D180421CD0B2034A9B -:10815000D28B8242EEDC10BD0404002034020020E9 -:1081600010B5014600200CE0022300EB8004074A12 -:108170001268103202F82430044A1268D180421C7E -:10818000D0B2034AD28B8242EEDC10BD0404002040 -:108190003402002003480068D0F870010249886466 -:1081A0007047000004040020180100202DE9F74F5B -:1081B00084B004460F46002003905B480068408866 -:1081C00000EB800158480068103000EB81055748EB -:1081D000006890F82800012809D154490968C86A44 -:1081E00052490968C96A3A468B6B214698474E48FE -:1081F000006800782178884202D0641C781E87B21B -:1082000094F800B094F80180781E215CB81E205CC0 -:1082100041EA00200290444800680078584502D0A6 -:1082200007B0BDE8F08FB8F1040F09D0B8F1060F20 -:1082300006D0B8F1100F03D0B8F1410F00D0EFE72E -:10824000B81E81B22046FEF740FB81464FEA292046 -:1082500040EA09201FFA80F90298484500D0DFE77C -:10826000B8F1410F01D104F1060A314906980860BE -:1082700000202882E86820F08040E86028780828FC -:108280002AD2DFE800F0040523242526272823E04E -:1082900025480068408800EB8000264901EB00106B -:1082A000019000260DE0012000EB46001AF80000C6 -:1082B0001AF8161040EA0121019820F81610701CD7 -:1082C00086B21D48808BB042EDDC05E004E003E09F -:1082D00002E001E000E000BF00BF039800B19FE7AB -:1082E000012028702A7801219140E8688843E860DD -:1082F000002068800C4800684088401C0A490968D2 -:1083000048800948006841880B48C08B814203DBE4 -:108310000020054909684880034909688878FFF703 -:108320006FFE00BF7CE7000004040020080400206A -:1083300084020020580700203402002070B5044653 -:108340000D4603482A462146836B984770BD0000BE -:108350001801002008B500200121FE22009208BD6E -:1083600070B544F620640548057F0549096808781A -:10837000044B2A462146FEF7C6FA70BD340200209F -:10838000040400203D8300087CB542F60234012538 -:108390000C480068C08801900A480068407900EBEA -:1083A000800004EB40000749096809794418064831 -:1083B000044900900968087801AB2A462146FEF777 -:1083C000C9FA7CBD040400203D8300087CB5FA2472 -:1083D00001250320019005480549009009680878A7 -:1083E00001AB2A462146FEF7B5FA7CBD3D83000865 -:1083F000040400203EB542F6F82403250C4800682A -:108400000089ADF804000A4800688089ADF80600CC -:10841000074800684089ADF8080006480449009004 -:108420000968087801AB2A462146FEF793FA3EBD5B -:10843000040400203D8300087CB50D240125074875 -:108440000068C088019006480449009009680878CF -:1084500001AB2A462146FEF77DFA7CBD04040020CC -:108460003D83000870B500254D480068408800EB4A -:1084700080014B480068103000EB8104E06800F098 -:108480008040A0B9208A401C80B2208208280EDDDE -:10849000E06840F08040E06041490968498801EBAC -:1084A0008101404A02EB01105021F8F761FA20786F -:1084B000082848D2DFE800F00405080B0E11141755 -:1084C00042E0FFF74DFF3FE000F072F83CE0FFF7BD -:1084D000B3FF39E0FFF73EFF36E0FFF755FF33E02B -:1084E000FFF788FF30E0608830B901202E49096825 -:1084F00081F82800FFF76AFF6088401C6080608870 -:1085000032281EDD00202849096881F82800608093 -:1085100001202070224800684088401C20490968DA -:1085200048801F48006841882048C08B814203DB97 -:1085300000201B4909684880194909688878FFF7B5 -:108540005FFD012500E000BF00BF05B170BD608880 -:10855000401C60806088032820DB22780121914044 -:10856000E0680843E06000206080012020700C4833 -:1085700000684088401C0A4909684880084800682B -:1085800041880A48C08B814203DB00200449096806 -:108590004880034909688878FFF732FD00BFD5E7B6 -:1085A00004040020580700200804002034020020A2 -:1085B0007CB50C2401250020019005480549009058 -:1085C0000968087801AB2A462146FEF7C3F97CBD4D -:1085D0003D8300080404002000B970470021416178 -:1085E0000161C16000BFF8E770B504460D460CB9E3 -:1085F000002070BDE06808B90020FAE745B1D4E971 -:108600000006236903FB060132462846FEF706F9F9 -:108610002069401CA16890FBF1F201FB120020616F -:10862000E068401EE0600120E3E770B504460D46B7 -:108630000CB9002070BDD4E90210884201D100209D -:10864000F8E745B1D4E90016636903FB061032462A -:108650002946FEF7E3F86069401CA16890FBF1F23F -:1086600001FB12006061E068401CE0600120E1E76E -:1086700070B504460D460CB9002070BDD4E9021057 -:10868000884204DA29462046FFF7CFFFF5E745B1D7 -:10869000D4E90016636903FB061032462946FEF74B -:1086A000BDF86069401CA16890FBF1F201FB12006B -:1086B00060612069401CA16890FBF1F201FB12008F -:1086C00020610120D9E7000010B5014609488088E3 -:1086D000884201DC002010BD0648008808444FF4A1 -:1086E000FA7390FBF3F403FB140082B20148801D7F -:1086F000805CF0E78881002013498988B1F5FA7F12 -:108700000EDB11490988491C4FF4FA7291FBF2F310 -:1087100002FB13110C4A118011468988491E918071 -:1087200009494A88891D8854891F4988491C4FF482 -:10873000FA7291FBF2F302FB1311034A51801146C6 -:108740008988491C918070478881002010B50029D4 -:108750000AD00878002807D005487844F8F77CF953 -:10876000002801D0002010BD0248784410BD000050 -:108770000E0200000602000010B500290AD0087899 -:10878000002807D005487844F8F766F9002801D09A -:10879000002010BD0248784410BD0000F202000025 -:1087A000EA0200004FF04070E1EE100A7047F8F75F -:1087B000E9BCF8F71DBE00061016000610160000F2 -:1087C0000000000000000102030406070809000081 -:1087D00000000102030400000153480000000000F3 -:1087E0000000000000000000000000000019484BDD -:1087F00030303100000000000000000000000000E8 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000100000000000047 -:108830000100000003000000000000000000000034 -:108840000100000004000000040000080000000017 -:108850000000000200010000100000000000000005 -:108860000000000030313233343536373839414278 -:108870004344454640305800303132333435363782 -:108880003839616263646566403078003031323374 -:108890003435363738396162636465667870003024 -:1088A00031323334353637383941424344454658FE -:1088B0005000000002400000000000A00000000086 -:1088C00005400000000000C8000000000C4000004F -:1088D0000000409C00000000194000000020BCBEC9 -:1088E0000000000034400000BFC91B8E00000004DF -:1088F000B5400000504BCFD06607E2CF010000002A -:108900006C4100003E8251AADFEEA7340100000056 -:10891000D9420000DCB5A0E23A301F97FFFFFFFF0D -:10892000B4450000FD25A0C8E9A3C14FFFFFFFFF2C -:10893000FF3F00000000008000000000FF3F00003B -:108940000000008000000000948A00080000002061 -:108950002C040000C4010008F08B00082C04002047 -:1089600094A2000020020008100100004300000053 -:10897000F8FFFFFF00404040404040404040414140 -:1089800041414140404040404040404040404040E4 -:10899000404040404005020202020202020202027E -:1089A000020202020220202020202020202020027B -:1089B000020202020202909090909090101010100B -:1089C00010101010101010101010101010101010A7 -:1089D000020202020202888888888888080808083B -:1089E0000808080808080808080808080808080807 -:1089F000020202024000000000000000000000002F -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000001C0000004300000097 -:108A8000F8FFFFFF0C0000000E0000000F000000C8 -:108A90002E0000004132104201031924F4135565E1 -:108AA0001B08410413580C2A202CE3B80B0B14109C -:108AB00018180B14C823182230142070041420181E -:108AC000061420B8052A208213383B1C20F04610DB -:108AD000EA0B2E611AC98013B96614081D671B08BA -:108AE000E90C1A910C411A2D081A48501AB4501A60 -:108AF000D8501A7804295013A8520C1020605E50E8 -:108B00002B180120091C501A60501A2C501A589C1E -:108B10001AF808295013186A0C3420D075A01A25A9 -:108B2000141A23042A687CAC100240041A40131261 -:108B300008220469144A04041A02741129051A0847 -:108B400010A9040A1D0C045940790419441280220A -:108B5000402905197E396D29585910100E0D0E0F38 -:108B60000C0B0A090807040302011B06051016086E -:108B7000090A0B0C4008010203040506071365628D -:108B80001B0895041A590401201321641408CD63AD -:108B90001B08A5041A190C1B34026681620613D93E -:108BA0007F1B08B9045A781C02FFE8015013618149 -:108BB0001B082D041A01041315801B0889041A557B -:108BC000041A95101365841B08AD088113880214DC -:108BD00020180133200113F16C1C08417C30127FF6 -:108BE0001B08B50413F16914080C044220000000AE +:10023000520728BF30C148BF0B6070471FB503F09D +:100240005BFB1FBD10B510BD00F072F91146FFF742 +:10025000F5FF03F079FA00F090F903B4FFF7F2FF2D +:1002600003BC00F099F9000009488047094800479D +:10027000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE756 +:10028000FEE7FEE704480549054A064B70470000B3 +:100290003129000889010008D87B0020D88B002074 +:1002A000D8830020D883002053EA020C00F0698034 +:1002B0002DE9F04B4FF00006002B1FBFB3FA83F57A +:1002C00003FA05F424FA05F65E4012BF1643B2FAAB +:1002D00082F502FA05F4C5F120051EBF22FA05FCDD +:1002E00044EA0C04203556EA044C4FEA144418BF83 +:1002F000641C4FF000084FF00009904271EB030CB2 +:1003000039D3002919BFB1FA81F701FA07F6B0FA1B +:1003100080F700FA07F6C7F120071EBF20FA07FC96 +:1003200046EA0C062037B6FBF4FCA7EB0507103FA6 +:1003300007F01F0BCBF120060CFA0BFB2CFA06F68C +:1003400044BFB3460026202FA4BF5E464FF0000BEB +:100350005BEA060C08BF4FF0010B19EB0B09ABFB76 +:10036000027C48EB0608C01B06FB02CC0BFB03CC4F +:1003700071EB0C01C1E70B46024641464846BDE819 +:10038000F08B13B54FF000004FF00001AFF3008089 +:10039000BDE81C40704740EA010310B59B070FD130 +:1003A000042A0DD310C808C9121F9C42F8D020BAE5 +:1003B00019BA884201D9012010BD4FF0FF3010BD9D +:1003C0001AB1D30703D0521C07E0002010BD10F86B +:1003D000013B11F8014B1B1B07D110F8013B11F831 +:1003E000014B1B1B01D1921EF1D1184610BD032AEF +:1003F00040F2308010F0030C00F0158011F8013B42 +:10040000BCF1020F624498BF11F801CB00F8013B28 +:1004100038BF11F8013BA2F1040298BF00F801CBEC +:1004200038BF00F8013B11F0030300F04F80083A99 +:10043000C0F0088051F8043B083A51F804CBA0E81A +:100440000810F5E7121D5CBF51F8043B40F8043B6F +:10045000AFF30080D20724BF11F8013B11F801CBA4 +:1004600048BF11F8012B24BF00F8013B00F801CB75 +:1004700048BF00F8012B70474FF0000200B513464B +:1004800094469646203922BFA0E80C50A0E80C50B4 +:10049000B1F12001BFF4F7AF090728BFA0E80C5065 +:1004A00048BF0CC05DF804EB890028BF40F8042B5E +:1004B00008BF704748BF20F8022B11F0804F18BFCB +:1004C00000F8012B704770477047704710B5203A0D +:1004D000C0F00B80B1E81850203AA0E81850B1E8FD +:1004E0001850A0E81850BFF4F5AF5FEA027C24BFB3 +:1004F000B1E81850A0E8185044BF18C918C0BDE8AA +:1005000010405FEA827C24BF51F8043B40F8043B72 +:1005100008BF7047D20728BF31F8023B48BF11F827 +:10052000012B28BF20F8023B48BF00F8012B704781 +:10053000754600F02BF8AE4605006946534620F09C +:100540000700854618B020B5FFF79CFEBDE82040A7 +:100550004FF000064FF000074FF000084FF0000B7F +:1005600021F00701AC46ACE8C009ACE8C009ACE832 +:10057000C009ACE8C0098D46704710B50446AFF31A +:1005800000802046BDE81040FFF767BE0048704776 +:10059000787B00207047000001491820ABBEFEE7C1 +:1005A0002600020000BFFEE710B5024800F078FA0E +:1005B00010BD0000E803002010B5024800F070FAFA +:1005C00010BD00004804002010B5024800F068FA91 +:1005D00010BD00006805002010B5024800F060FA68 +:1005E00010BD0000C805002010B5024800F058FA00 +:1005F00010BD0000A804002010B5024800F050FA19 +:1006000010BD0000080500200146087810381823A6 +:10061000B0FBF3F20848805CC865032A05D9086876 +:100620006FF30900001D886503E008686FF3090097 +:100630008865886D70470000023900080146002077 +:100640008A6A8B69CBB932B1012A0DD0022A03D054 +:10065000032A10D10EE000BFCB6A03F08073B3F120 +:10066000807F00D1012007E0CB6AB3F1C07F00D1C9 +:10067000012001E000E000BF34E08B69B3F5005FCA +:100680001AD132B1012A07D0022A03D0032A11D18C +:100690000AE000BF01200EE0CB6A03F08073B3F1E3 +:1006A000807F00D1012006E0CB6AB3F1C07F00D18A +:1006B000012000E000BF15E032B1012A05D0022A76 +:1006C00004D0032A0CD103E000BF00BF012008E0E2 +:1006D000CB6A03F08073B3F1807F00D1012000E08A +:1006E00000BF00BF704730B50468246824F480243C +:1006F00005682C60046863608468402C04D1046839 +:10070000A2600468E16003E00468A1600468E2603C +:1007100030BD704772B600BFFEE7000010B5002282 +:1007200001B909E0012901D10A0205E0022901D13C +:100730000A0201E04FF440720E4B1B6823F4407331 +:100740000C4C236023461B681343236023461B681D +:1007500023F0F803236023461B68022444EAC00404 +:100760002343044C236023461B6843F480332360F7 +:1007700010BD0000103C02401C48006800F40070EE +:10078000B0B11A48006820F400701849086000BF32 +:100790000846006840F4006008600846006820F4DD +:1007A0000060086000BF0846006840F40070086000 +:1007B0000E48006800F48060B0B10C48006820F476 +:1007C00080600A49086000BF0846006840F4805015 +:1007D00008600846006820F48050086000BF0846A2 +:1007E000006840F48060086070470000003C0240F0 +:1007F0000A4A126822F44072084B1A601A461268BC +:1008000042F004021A601A4612684FF4803343EA39 +:1008100000231A43014B1A6070470000103C02404D +:10082000074A126822F44072054B1A601A46126891 +:100830001A601A46126842F001021A60017070478D +:10084000103C024010B50D49096821F440710B4C71 +:1008500021602146096841F4407121602146096800 +:1008600041F001012160026000BF00BF00BFBFF383 +:100870006F8F00BF00BF00BF436010BD103C02403F +:10088000084A126822F44072064B1A601A4612682F +:1008900042F480721A601A46126842F001021A602D +:1008A00001807047103C0240084A126822F44072EE +:1008B000064B1A601A46126842F400721A601A4611 +:1008C000126842F001021A6001607047103C024059 +:1008D0002348006800F0100040B12248C06940F091 +:1008E00010002049C86110201D4908601C4800689C +:1008F00000F0200040B11B48C06940F008001949D1 +:10090000C8612020164908601548006800F04000C2 +:1009100040B11448C06940F004001249C861402049 +:100920000F4908600E48006800F0800040B10D4893 +:10093000C06940F002000B49C86180200849086086 +:100940000748006800F0020040B10648C06940F066 +:1009500020000449C8610220014908607047000076 +:100960000C3C02402806002070B5044600250020FB +:100970001449C86100F058FC054609E0601C38B114 +:1009800024B100F051FC401BA04201D9032070BDEE +:100990000D48006800F480300028EFD10A48006854 +:1009A00000F0010010B10120074908600648006806 +:1009B00000F0F20018B1FFF78BFF0120E7E70020FD +:1009C000E5E70000280600200C3C024070B5044614 +:1009D000A56D00F029FC064694F83500022808D0E1 +:1009E0008020606500BF002084F8340000BF012033 +:1009F00070BD2068006820F016002168086020683B +:100A0000406920F0800021684861206C08B9A06C22 +:100A100028B12068006820F008002168086020687C +:100A2000006820F001002168086010E000F0FCFB85 +:100A3000801B05280BD920206065032084F8350031 +:100A400000BF002084F8340000BF0320D0E72068F6 +:100A5000006800F001000028E8D194F85C103F2005 +:100A60008840A860012084F8350000BF002084F889 +:100A7000340000BF00BFBBE7014691F835000228F3 +:100A800003D08020486501207047052081F835009B +:100A90000868006820F001000A6810600020F3E791 +:100AA000F8B50446002000908C4800684FF41651B9 +:100AB000B0FBF1F7A56D2E6894F85C100820884013 +:100AC000304098B12068006800F0040070B12068E0 +:100AD000006820F004002168086094F85C10082089 +:100AE0008840A860606D40F00100606594F85C107B +:100AF00001208840304068B12068406900F08000E3 +:100B000040B194F85C1001208840A860606D40F00E +:100B10000200606594F85C1004208840304068B1A1 +:100B20002068006800F0020040B194F85C100420D6 +:100B30008840A860606D40F00400606594F85C1027 +:100B400010208840304078B32068006800F008002A +:100B500050B394F85C1010208840A86020680068AA +:100B600000F4802080B12068006800F4002028B9DB +:100B7000206CC8B12046216C884715E0A06C98B164 +:100B80002046A16C88470FE02068006800F4807060 +:100B900028B92068006820F0080021680860206CEF +:100BA00010B12046216C884794F85C1020208840C2 +:100BB0003040002865D02068006800F01000002850 +:100BC0005FD094F85C1020208840A86094F835002D +:100BD000052828D12068006820F0160021680860E8 +:100BE0002068406920F0800021684861206C08B9C5 +:100BF000A06C28B12068006820F008002168086017 +:100C000094F85C103F208840A860012084F83500EB +:100C100000BF002084F8340000BF206D10B12046D2 +:100C2000216D8847F8BD2068006800F4802080B1FD +:100C30002068006800F4002028B9606C10B12046DC +:100C4000616C88471DE0E06BD8B12046E16B8847B6 +:100C500017E02068006800F4807068B920680068B8 +:100C600020F0100021680860012084F8350000BFE2 +:100C7000002084F8340000BFE06B10B12046E16B27 +:100C80008847606D38B3606D00F00100F0B1052059 +:100C900084F835002068006820F0010021680860B1 +:100CA00000BF0098401C0090B84200D905E02068C1 +:100CB000006800F001000028F3D100BF012084F893 +:100CC000350000BF002084F8340000BFE06C10B194 +:100CD0002046E16C884700BFA4E700000C0000201C +:100CE0002DE9F0410446002500F09EFA074614B9AC +:100CF0000120BDE8F081606A00B100BF022084F8E5 +:100D0000350000BF002084F8340000BF2068006870 +:100D100020F00100216808600AE000F085FAC01B9D +:100D2000052805D920206065032084F83500E0E718 +:100D30002068006800F001000028EED120680568F6 +:100D400021480540D4E901010843E16808432169CD +:100D5000084361690843A1690843E1690843216ABE +:100D600008430543606A042803D1D4E90B01084312 +:100D70000543206805602068456925F00705606A1D +:100D80000543606A04280DD1A06A0543E06A48B1B2 +:100D90002046FFF753FC28B140206065012084F80D +:100DA0003500A6E7206845612046FFF72DFC064682 +:100DB00094F85C103F208840B060002060650120FE +:100DC00084F83500002094E73F8010F02DE9F047CB +:100DD00004460D4616461F464FF00008D4F85890BA +:100DE00000BF94F83400012802D10220BDE8F0874A +:100DF000012084F8340000BF94F83500012825D183 +:100E0000022084F83500002060653B4632462946C2 +:100E10002046FFF768FC94F85C103F208840C9F832 +:100E200008002068006840F0160021680860206C07 +:100E300028B12068006840F0080021680860206838 +:100E4000006840F001002168086006E000BF002053 +:100E500084F8340000BF4FF002084046C6E70000A7 +:100E600070B5044600F0E0F906462546681C10B14E +:100E700004480078054400BF00F0D6F9801BA84262 +:100E8000FAD370BD080000202DE9F04104460E465B +:100E90000127002500BF2548007E012802D102203D +:100EA000BDE8F08101202149087600BF4CF25030A6 +:100EB000FFF75AFD0746002F31D1401E30602068F1 +:100EC00001280FD1207C6168FFF792FC4CF2503072 +:100ED000FFF74AFD07461648006820F00400144951 +:100EE00008601AE0A56812E0217C2846FFF716FC8E +:100EF0004CF25030FFF738FD07460D48006820F0EF +:100F0000FA000B4908600FB1356005E06D1CD4E9AB +:100F100002100844A842E7D800BFFFF72DFC00BF2D +:100F200000200249087600BF3846B9E728060020AD +:100F3000103C02400348006840F00040014908604E +:100F400000207047103C02402DE9F04106460F4654 +:100F500014461D464FF0010800BF1F48007E0128BF +:100F600002D10220BDE8F08101201B49087600BFB4 +:100F70004CF25030FFF7F8FC8046B8F1000F23D157 +:100F800026B9E1B23846FFF74BFC12E0012E04D13E +:100F9000A1B23846FFF774FC0BE0022E04D12146C3 +:100FA0003846FFF781FC04E022462B463846FFF71F +:100FB00049FC4CF25030FFF7D7FC804607480068E8 +:100FC00020F001000549086000BF002002490876B2 +:100FD00000BF4046C6E7000028060020103C024043 +:100FE00000200949096801F0004159B10749064A42 +:100FF0000C3A1160064911600349096801F000418B +:1010000001B1012070470000103C024023016745F8 +:10101000AB89EFCDF8B502460B4600250024002031 +:101020000021D6E0012606FA01F51E6806EA05044D +:10103000AC4274D11E7906F00306012E04D01E794D +:1010400006F00306022E13D190684F000326BE401F +:10105000B0434F00DE68BE403043906050680126C8 +:101060008E40B0431E79C6F300168E403043506068 +:101070001E7906F00306032E09D0D0684F00032620 +:10108000BE40B0434F009E68BE403043D0601E79E2 +:1010900006F00306022E13D1CF0802F1200656F8FF +:1010A00027004E07F70E0F26BE40B0434F07FF0E36 +:1010B0001E69BE403043CF0802F1200646F82700E3 +:1010C00010684F000326BE40B0431E7906F00306A9 +:1010D0004F00BE40304310605E6806F44036002E7C +:1010E00076D000BF002600963C4E366846F4804617 +:1010F0003A4F3E603E46366806F48046009600BF92 +:1011000000BF374E8F0856F827008E07370F0F267F +:10111000BE40B043334EB24202D1002624E057E035 +:10112000314EB24201D101261EE0304EB24201D111 +:10113000022619E02E4EB24201D1032614E02D4EB4 +:10114000B24201D104260FE02B4EB24201D1052656 +:101150000AE02A4EB24201D1062605E0284EB242EC +:1011600001D1072600E008268F073F0FBE4030431D +:101170001B4E8F0846F82700224E3068A0435E6859 +:1011800006F4801606B120431E4E3060361D3068CE +:10119000A0435E6806F4001606B12043194E361DC2 +:1011A0003060184E361F3068A0435E6806F4003683 +:1011B00006B12043134E361F3060361F3068A043FF +:1011C0005E6806F4803606B120430E4E083E30605D +:1011D000491C1029FFF426AFF8BD00004438024036 +:1011E00008380140000002400004024000080240AC +:1011F000000C02400010024000140240001802409F +:10120000001C0240083C014010B5426921EA02037B +:1012100002EA010443EA0443836110BD0AB181611B +:1012200001E00B04836170470148006870470000CB +:101230000000002003480068034909780844014978 +:1012400008607047000000200800002010B50D481D +:10125000006840F400700B4908600846006840F4DC +:10126000806008600846006840F4807008600320D1 +:1012700000F0A6F8032000F007F800F02BF800209B +:1012800010BD0000003C024070B504460E480078D6 +:101290004FF47A71B1FBF0F00C490968B1FBF0F53D +:1012A000284600F02FFC08B1012070BD102C07D299 +:1012B00000222146501E00F045F80548046001E078 +:1012C0000120F2E70020F0E7080000200C000020D9 +:1012D0000400002008B500BF0020009010480068FE +:1012E00040F480400E4908600846006800F48040E1 +:1012F000009000BF00BF00BF00200090081F0068E2 +:1013000040F08050091F08600846006800F08050D7 +:10131000009000BF00BF052000F052F808BD00009B +:101320004438024001460846002809DB00F01F034C +:1013300001229A4043099B0003F1E023C3F80021F6 +:1013400000BF70472DE9F05F80460D461646002726 +:1013500001F062FE074639462A46334601F007008F +:10136000C0F1070ABAF1040F02D94FF0040A01E0F4 +:10137000C0F1070AD14600F1040ABAF1070F02D200 +:101380004FF0000A01E0A0F1030AD4464FF0010A31 +:101390000AFA09FAAAF1010A0AEA020A0AFA0CFA96 +:1013A0004FF0010B0BFA0CFBABF1010B0BEA030B3B +:1013B0004AEA0B042146404601F036FEBDE8F09FA4 +:1013C00000BF00F00702064B19684FF6FF031940F3 +:1013D000044B0B4343EA0221014B196000BF7047E5 +:1013E0000CED00E00000FA0570B504460D460CB99E +:1013F000012070BD5848006800F00700A84209D2DB +:1014000055490D700846006800F00700A84201D059 +:101410000120EEE7207800F0020002281DD120789C +:1014200000F00400042805D14C48006840F4E05066 +:101430004A490860207800F00800082805D147488C +:10144000006840F46040454908604448006820F066 +:10145000F000A168084341490860207800F00100CD +:10146000A8B36068012807D13C4808380068C0F379 +:101470004040B8B90120BCE76068022802D060682B +:10148000032807D1354808380068C0F3406048B9E0 +:101490000120AEE7314808380068C0F3400008B9C1 +:1014A0000120A6E72D48006820F00300616808438A +:1014B0002A490860FFF7B8FE064609E0FFF7B4FEC8 +:1014C000801B41F28831884202D9032091E707E06E +:1014D0002248006800F00C006168B0EB810FEDD18C +:1014E0001D48006800F00700A84209D91A490D708C +:1014F0000846006800F00700A84201D0012078E704 +:10150000207800F00400042807D11448006820F473 +:10151000E050E168084311490860207800F00800B5 +:10152000082808D10D48006820F46040216940EA8D +:10153000C1000A49086000F03FF808490968C1F392 +:101540000311074A515CC840064908600648006814 +:10155000FFF79AFE00204CE7003C024008380240AA +:101560000A3900080C00002004000020014800682F +:10157000704700000C00002000B5FFF7F7FF04499A +:101580000968C1F38221034A515CC84000BD0000D4 +:10159000083802401A39000800B5FFF7E7FF044990 +:1015A0000968C1F34231034A515CC84000BD0000E4 +:1015B000083802401A3900082DE9F04700240025B8 +:1015C0000026A1462548006800F00C0020B1042840 +:1015D00005D008283AD105E0DFF8849039E0DFF83B +:1015E000849036E01D48001F006800F03F041B484F +:1015F000001F006800F4800078B11A481749091FDD +:101600000968C1F38811A0FB01700146224600233E +:101610003846FEF749FE05460EE011480F49091FFE +:101620000968C1F38811A0FB01700146224600231E +:101630003846FEF739FE05460848001F0068C0F32B +:101640000140401C4600B5FBF6F902E0DFF81090BF +:1016500000BF00BF4846BDE8F087000008380240E0 +:101660000024F40000127A00F8B504460CB90120F9 +:10167000F8BD207800F00100002874D0F948006817 +:1016800000F00C0004280DD0F648006800F00C00B3 +:10169000082813D1F348001F006800F48000B0F55B +:1016A000800F0BD1EF4808380068C0F34040002895 +:1016B00059D06068002856D10120D9E700BF606882 +:1016C000B0F5803F08D1E7480838006840F4803022 +:1016D000E449083908601EE06068B0F5A02F0DD11C +:1016E000E0480838006840F48020DE490839086086 +:1016F0000846006840F4803008600CE0D94808389B +:10170000006820F48030D74908390860084600682E +:1017100020F48020086000BF606890B1FFF784FD6E +:10172000054606E0FFF780FD401B642801D9032031 +:101730009EE7CC4808380068C0F340400028F1D04C +:1017400011E0FFF771FD054606E0FFF76DFD401B58 +:10175000642801D903208BE7C24808380068C0F329 +:1017600040400028F1D1207800F0020002285FD12B +:10177000BC48006800F00C0058B1BA48006800F09E +:101780000C0008281CD1B748001F006800F4800036 +:10179000B0B9B44808380068C0F3400020B1E06830 +:1017A000012801D0012063E7AE480838006820F026 +:1017B000F800216940EAC100AA490839086037E009 +:1017C000E06800B30120A8490860FFF72DFD054639 +:1017D00006E0FFF729FD401B022801D9032047E757 +:1017E000A04808380068C0F340000028F1D09D48A8 +:1017F0000838006820F0F800216940EAC1009949E2 +:101800000839086014E0002097490860FFF70CFDD4 +:10181000054606E0FFF708FD401B022801D903201A +:1018200026E7904808380068C0F340000028F1D14E +:10183000207800F0080008282CD16069A8B10120A8 +:101840008A490860FFF7F0FC054606E0FFF7ECFC6C +:10185000401B022801D903200AE782486C30006847 +:10186000C0F340000028F1D014E000207F49086058 +:10187000FFF7DAFC054606E0FFF7D6FC401B02281E +:1018800001D90320F4E677486C300068C0F34000CB +:101890000028F1D1207800F00400042870D100273E +:1018A00070483830006800F0805090B900BF0020C8 +:1018B00000906C483830006840F0805069493831F9 +:1018C00008600846006800F08050009000BF00BF2C +:1018D00001276748006800F48070B0B96448006868 +:1018E00040F4807062490860FFF79EFC054606E000 +:1018F000FFF79AFC401B022801D90320B8E65C4898 +:10190000006800F480700028F2D000BFA0680128B1 +:1019100008D154486830006840F0010051496831EE +:1019200008601DE0A06805280DD14E4868300068A9 +:1019300040F004004B49683108600846006840F0F8 +:10194000010008600CE047486830006820F00100A2 +:101950004449683108600846006820F004000860C7 +:1019600000BFA068A8B1FFF75FFC054609E0FFF7DC +:101970005BFC401B41F28831884202D9032077E6A4 +:1019800026E0384868300068C0F340000028EED0F8 +:1019900013E0FFF749FC054608E0FFF745FC401B54 +:1019A00041F28831884201D9032061E62D48683030 +:1019B0000068C0F340000028EFD1012F07D129486B +:1019C0003830006820F0805026493831086000BF68 +:1019D000A069002845D02348006800F00C000828C2 +:1019E0005DD0A069022845D100201F490866FFF795 +:1019F0001BFC054606E0FFF717FC401B022801D937 +:101A0000032035E6174808380068C0F34060002816 +:101A1000F1D1D4E907010843616A40EA811101224A +:101A2000A06AC2EB500041EA00412C20005D41EA6F +:101A300000600C49091F086001200B490866FFF788 +:101A4000F3FB054606E0FFF7EFFB401B022801D938 +:101A500003200DE6034808380068C0F34060002802 +:101A6000F1D049E00838024000004742800E47426A +:101A700000700040002021490866FFF7D5FB0546AD +:101A800006E0FFF7D1FB401B022801D90320EFE558 +:101A90001B480068C0F340600028F2D12CE0A06928 +:101AA000012800D1E4E51648001D0668A069012858 +:101AB00020D006F48001E06981421BD106F03F018D +:101AC000206A814216D147F6C0703040616AB0EB9F +:101AD000811F0FD106F440310122A06AC2EB5000F1 +:101AE000B1EB004F06D106F070612C20005DB1EB28 +:101AF000006F01D00120BBE50020B9E5000047429E +:101B00000038024070B504462546681EB0F1807F5B +:101B100001D301200FE0681E4FF0E02148610F2142 +:101B20004FF0FF3001F080FA00204FF0E021886193 +:101B300007200861002070BDF8B504460E46174620 +:101B400094F83E00202836D106B10FB90120F8BD27 +:101B500000BF94F83C00012801D10220F7E70120E2 +:101B600084F83C0000BF20633A463146204601F02D +:101B7000A9F90546EDB9206B012819D100BF002055 +:101B8000009020680068009020684068009000BFC6 +:101B900000BF00BF00BF21680C3151E8001F41F0B9 +:101BA000100021680C3141E80002002AF3D100E066 +:101BB00001252846CBE70220C9E7000070B504469E +:101BC0000D460C492068884203D10B4801F0E8FC1F +:101BD0000EE00A492068884203D1094801F0E0FC80 +:101BE00006E008492068884202D1074801F0D8FC85 +:101BF00070BD000000100140F801002000440040CA +:101C000048020020004C00409802002070B50446B5 +:101C1000002520684069C0F3C01594F83D002128D4 +:101C200017D1B5B100BF00BF2168143151E8001FC2 +:101C300021F080002168143141E80002002AF3D12C +:101C400000BF606B10B1606BFEF7C0FE204600F075 +:101C500094FF20684069C0F3801594F83E00222864 +:101C600017D1B5B100BF00BF2168143151E8001F82 +:101C700021F040002168143141E80002002AF3D12C +:101C800000BFA06B10B1A06BFEF7A0FE204600F0D5 +:101C90002EFF002070BD000038B5044600252B49FA +:101CA0002068884201D12A4D0AE02A4920688842EA +:101CB00001D1294D04E029492068884200D1284DEE +:101CC000206C00F0020050B100BF0020009020689E +:101CD0000068009020684068009000BF00BF206C42 +:101CE00000F0040050B100BF0020009020680068A0 +:101CF000009020684068009000BF00BF2068006826 +:101D0000C0F3C00050B100BF002000902068006800 +:101D1000009020684068009000BF00BF2068006805 +:101D2000C0F3400050B100BF002000902068006860 +:101D3000009020684068009000BF00BF25B1EA8B8A +:101D4000A9696868FFF7F8FE38BD0000001001407F +:101D5000F80100200044004048020020004C0040F0 +:101D6000980200202DE9F84F044620680568206895 +:101D7000C668206847694FF00009CA4605F00F0998 +:101D8000B9F1000F0AD105F0200038B106F02000AB +:101D900020B1204600F004FFBDE8F88FB9F1000F34 +:101DA0007CD007F0010018B906F49070002875D0B7 +:101DB00005F0010030B106F4807018B1206C40F0DD +:101DC0000100206405F0040030B107F0010018B1F3 +:101DD000206C40F00200206405F0020030B107F0F2 +:101DE000010018B1206C40F00400206405F00800E8 +:101DF00048B106F0200010B907F0010018B1206CBE +:101E000040F008002064206C002846D005F0200037 +:101E100028B106F0200010B1204600F0C1FE206875 +:101E20004069C0F3801A206C00F0080010B9BAF1C4 +:101E3000000F2DD0204600F05AFE2068406900F0C7 +:101E40004000402820D100BF00BF2168143151E874 +:101E5000001F21F040002168143141E80002002AEF +:101E6000F3D100BFA06B50B17548A16B0865A06BA2 +:101E7000FEF702FE88B1A06B016D88470DE0204699 +:101E8000FFF70AFF09E009E02046FFF705FF04E03D +:101E90002046FFF701FF002020647DE7206B01282A +:101EA00076D105F01000002872D006F0100000284E +:101EB000FAD000BF002000902068006800902068E1 +:101EC0004068009000BF00BF2068406900F04000FB +:101ED00040285ED1A06B006840681FFA80F8B8F116 +:101EE000000F54D0A08D404551DDA4F82E80A06B8A +:101EF000C069B0F5807F43D000BF00BF21680C31BE +:101F000051E8001F21F4807021680C3141E8000283 +:101F1000002AF3D100BF00BF00BF2168143151E88F +:101F2000001F21F001002168143141E80002002A5D +:101F3000F3D100BF00BF00BF2168143151E8001F7A +:101F400021F040002168143141E80002002AF3D159 +:101F500000BF202084F83E000020206300BF00BFA7 +:101F600021680C3151E8001F21F0100021680C316C +:101F700041E80002002AF3D100BFA06BFEF726FD66 +:101F8000A08DE28D801A81B22046FFF717FE03E78D +:101F900040E0A08DE18D401A1FFA80F8E08DC0B3BB +:101FA000B8F1000F35D000BF00BF21680C3151E8F7 +:101FB000001F21F4907021680C3141E80002002AD2 +:101FC000F3D100BF00BF00BF2168143151E8001FEA +:101FD00021F001002168143141E80002002AF3D108 +:101FE00000BF202084F83E000020206300BF00BF17 +:101FF00021680C3151E8001F21F0100021680C31DC +:1020000041E80002002AF3D100BF41462046FFF715 +:10201000D5FDC1E605F0800030B106F0800018B1B2 +:10202000204600F0B7FFB7E605F0400030B106F0FB +:10203000400018B1204600F090FDADE600BFABE6D1 +:102040005529000810B504460CB9012010BDA0693F +:1020500000B100E000BF94F83D0028B9002084F8EA +:102060003C00204600F028F8242084F83D00206839 +:10207000C06820F400502168C860204600F00CFEC3 +:102080002068006920F49040216808612068406958 +:1020900020F02A00216848612068C06840F40050A0 +:1020A0002168C86000202064202084F83D0084F866 +:1020B0003E000020CAE7000010B586B00446142197 +:1020C00001A8FEF7D9F9C149206888427AD100BF3A +:1020D00000200090BE48006840F40020BC49086021 +:1020E0000846006800F40020009000BF00BF00BF59 +:1020F00000200090B6481038006840F00100B44954 +:10210000103908600846006800F00100009000BF28 +:1021100000BF0320019002200290002003900320C2 +:1021200004900820059001A9AA48FEF773FFAA4869 +:10213000AA490860400548600021A8488160C16044 +:102140004FF480610161002141618161C1614FF4FF +:102150004031016200214162FEF7C2FD08B1FEF785 +:10216000D9FA00BF9D48A063846300BF9A4830300D +:102170009B4908604FF000604860402198488160AA +:102180000021C1604FF480610161002141618161E2 +:10219000C1614FF40031016200214162FEF7A0FDF0 +:1021A00008B1FEF7B7FA00BF8D486063846300BFD3 +:1021B000002201213420FFF7C5F83420FFF7B2F8E0 +:1021C00002E1FFE78749206888427ED100BF0020F6 +:1021D00000907F48001D006840F010007C49091DF8 +:1021E00008600846006800F01000009000BF00BFC3 +:1021F00000BF0020009076481038006840F00100D1 +:102200007349103908600846006800F0010000902A +:1022100000BF00BF4FF4C060019002200290002078 +:102220000390032004900720059001A96948FEF758 +:10223000F1FE6D486D4908604FF000604860002174 +:102240006A488160C1604FF4806101610021416191 +:102250008161C1614FF48031016200214162FEF76A +:102260003FFD08B1FEF756FA00BF6048A0638463E3 +:1022700000BF5D4878305E4908604FF000604860FC +:1022800040215B4881600021C1604FF480610161A1 +:10229000002141618161C1614FF4803101620021FF +:1022A0004162FEF71DFD08B1FEF734FA00BF504849 +:1022B0006063846300BF002201212520FFF742F8FC +:1022C0002520FFF72FF87FE0FFE74A492068884282 +:1022D0007AD100BF002000903D48006840F40030F3 +:1022E0003B4908600846006800F40030009000BFD9 +:1022F00000BF00BF0020009035481038006840F053 +:1023000008003349103908600846006800F00800EA +:10231000009000BF00BF60200190022002900020CA +:102320000390032004900720059001A93248FEF78E +:1023300071FE29484830314908604FF0006048601C +:1023400000212E488160C1604FF48061016100214D +:1023500041618161C1614FF44031016200214162FC +:10236000FEF7BEFC08B1FEF7D5F900BF2348A06315 +:10237000846300BF18486030214908604FF0006056 +:10238000486040211E4881600021C1604FF4806197 +:102390000161002141618161C1614FF4003101623D +:1023A00000214162FEF79CFC08B1FEF7B3F900BFC3 +:1023B00013486063846300BF002201212620FEF7DA +:1023C000C1FF2620FEF7AEFF06B010BD004C004056 +:1023D000403802400000024040600240E803002014 +:1023E000480400200010014040640240A80400207E +:1023F0000805002000440040000C02406805002051 +:10240000C805002070477047F7B50446154694F894 +:102410003D00202846D1019800B10DB90120FEBD34 +:1024200000BF94F83C00012801D10220F7E7012009 +:1024300084F83C0000BF01982062A584E584002058 +:102440002064212084F83D001748616BC863174859 +:10245000616B08641648616BC8640020616B086595 +:1024600001AE23681A1D31682B46606BFEF7AEFC87 +:102470006FF040002168086000BF002084F83C0035 +:1024800000BF00BF00BF2168143151E8001F41F0B8 +:1024900080002168143141E80002002AF3D100BF16 +:1024A0000020BCE70220BAE7892A0008E12A0008D8 +:1024B0006929000810B504460B492068884203D1F9 +:1024C0000A4801F007F90EE009492068884203D163 +:1024D000084801F0FFF806E007492068884202D169 +:1024E000044801F0F7F810BD00100140F801002089 +:1024F0000044004048020020004C0040704700BFEC +:10250000FEE7000008B500BF0020009026480068E4 +:1025100040F40010244908600846006800F40010E8 +:10252000009000BF00BF00BF002000900846006878 +:1025300040F4800008600846006800F480000090C5 +:1025400000BF00BF002211460D20FEF7FBFE0D204C +:10255000FEF7E8FE002211460F20FEF7F3FE0F20E3 +:10256000FEF7E0FE002211461020FEF7EBFE1020E1 +:10257000FEF7D8FE002211461120FEF7E3FE1120DF +:10258000FEF7D0FE002211463A20FEF7DBFE3A208D +:10259000FEF7C8FE002211464620FEF7D3FE462075 +:1025A000FEF7C0FE08BD00003038024000B587B01D +:1025B000142102A8FDF760FF00BF002001906E48C3 +:1025C000006840F010006C4908600846006800F0A0 +:1025D0001000019000BF00BF00BF0020019008461E +:1025E000006840F0800008600846006800F0800045 +:1025F000019000BF00BF00BF0020019008460068A6 +:1026000040F0010008600846006800F001000190F9 +:1026100000BF00BF00BF002001900846006840F0E6 +:10262000020008600846006800F00200019000BF48 +:1026300000BF00BF002001900846006840F008007D +:1026400008600846006800F00800019000BF00BF65 +:1026500000BF002001900846006840F004000860B8 +:102660000846006800F00400019000BF00BF00228F +:102670007F214248FEF7D2FD012204214048FEF7A7 +:10268000CDFD01224FF4E0613C48FEF7C7FD012279 +:102690004FF470413B48FEF7C1FD01224FF47F41EA +:1026A0003948FEF7BBFD01224FF470713748FEF741 +:1026B000B5FD002210213448FEF7B0FD00224FF492 +:1026C00040713048FEF7AAFD6F2002900120039070 +:1026D000002004900320059002A92848FEF79AFCE8 +:1026E0004FF4E260029001200390002004900590D6 +:1026F00002A92248FEF78EFC0420029001200390DC +:10270000002004900320059002A91D48FEF782FCDA +:102710004FF4704002900120039000200490059037 +:1027200002A91848FEF776FC4FF6107002900120BF +:10273000039000200490059002A91348FEF76AFC5C +:102740004FF47070029001200390002004900590D7 +:1027500002A90E48FEF75EFC4FF440700290012083 +:102760000390002004900320059002A90548FEF77D +:1027700051FC07B000BD000030380240001002409C +:102780000000024000040240000C02400008024029 +:1027900010B50B480B4908604FF4E1304860002148 +:1027A00008488160C16001610C21416100218161A3 +:1027B000C161FFF747FC08B1FDF7ACFF10BD000099 +:1027C000004C00401C03002010B50B480B4908606A +:1027D0004FF4E1304860002108488160C160016128 +:1027E0000C21416100218161C161FFF72BFC08B11F +:1027F000FDF790FF10BD00000010014060030020B5 +:1028000010B50B480B4908604FF416504860002182 +:1028100008488160C16001610C2141610021816132 +:10282000C161FFF70FFC08B1FDF774FF10BD000098 +:1028300000440040A403002000BFFEE700BFFEE705 +:102840007047704710B5094841690120884708481A +:102850000121426C904707480121426C904706488D +:102860000121426C9047FEF7E5FC10BD8C00002072 +:10287000F8010020480200209802002000B593B023 +:10288000302107A8FDF7F8FD142102A8FDF7F4FD9B +:1028900000BF002001902448006840F08050224989 +:1028A00008600846006800F08050019000BF00BF3B +:1028B00000BF002001901D48006840F480401B4983 +:1028C00008600846006800F48040019000BF00BF27 +:1028D000012007900004089002200D9041050E9100 +:1028E00004210F91A821109102211191042112912C +:1028F00007A8FEF7B9FE08B1FDF70CFF0F20029004 +:1029000002200390002004904FF4A05005904FF453 +:1029100080500690052102A8FEF766FD08B1FDF77C +:10292000F9FE13B000BD00004038024000700040C6 +:102930000348006840F470000149086070470000D7 +:1029400088ED00E010B50248FFF70CFA10BD00005A +:102950001C03002070B50546AC6B0020E085E084C8 +:102960002046FFF799F970BD70B506460025B46B97 +:1029700020684069C0F3C01594F83D00212805D1B6 +:1029800025B10020E084204600F0F7F82068406977 +:10299000C0F3801594F83E00222805D125B100200F +:1029A000E085204600F0A3F8206C40F01000206481 +:1029B0002046FFF771F970BD70B50546AC6B28680D +:1029C000006800F48070002842D1E08500BF00BF9D +:1029D00021680C3151E8001F21F4807021680C310E +:1029E00041E80002002AF3D100BF00BF00BF216808 +:1029F000143151E8001F21F001002168143141E831 +:102A00000002002AF3D100BF00BF00BF21681431CB +:102A100051E8001F21F040002168143141E8000214 +:102A2000002AF3D100BF202084F83E00206B01284B +:102A30000ED100BF00BF21680C3151E8001F21F00A +:102A4000100021680C3141E80002002AF3D100BFD8 +:102A5000206B012804D1A18D2046FFF7AFF802E0DA +:102A60002046FFF7CFFC70BD70B50546AC6B206B00 +:102A7000012805D1A08D41082046FFF79FF802E00C +:102A80002046FFF7C0FC70BD70B50546AC6B2868EA +:102A9000006800F48070F8B90020E08400BF00BF37 +:102AA0002168143151E8001F21F0800021681431A1 +:102AB00041E80002002AF3D100BF00BF00BF216837 +:102AC0000C3151E8001F41F0400021680C3141E811 +:102AD0000002002AF3D102E02046FFF7EBFC70BDB4 +:102AE00070B50446A56B2846FFF708FD70BD00BF12 +:102AF00000BF02680C3252E8002F22F49071026885 +:102B00000C3242E80013002BF3D100BF00BF00BF1E +:102B10000268143252E8002F22F0010102681432D8 +:102B200042E80013002BF3D100BF016B01290ED145 +:102B300000BF00BF02680C3252E8002F22F01001E3 +:102B400002680C3242E80013002BF3D100BF2021B1 +:102B500080F83E1000210163704710B504462068DC +:102B6000C06820F040002168C860202084F83D0043 +:102B70002046FFF79FFC002010BD00BF00BF026889 +:102B80000C3252E8002F22F0C00102680C3242E8F9 +:102B90000013002BF3D100BF202180F83D107047B7 +:102BA000F8B5044694F83E00222873D1A068B0F529 +:102BB000805F0CD1206950B90025A66A2068406862 +:102BC000C0F308003080A06A801CA06215E0A56AEE +:102BD0000026A068B0F5805F03D0A06828B92069FE +:102BE00018B920684068287004E02068406800F048 +:102BF0007F002870A06A401CA062E08D401E80B259 +:102C0000E085002844D12068C06820F020002168B9 +:102C1000C8602068C06820F480702168C86020689F +:102C2000406920F0010021684861202084F83E00BE +:102C3000206B012826D10020206300BF00BF21683F +:102C40000C3151E8001F21F0100021680C3141E8DF +:102C50000002002AF3D100BF2068006800F01000D5 +:102C600010280AD100BF0020009020680068009062 +:102C700020684068009000BF00BFA18D2046FEF78D +:102C80009DFF02E02046FFF7BDFB0020F8BD01E0FC +:102C90000020FBE70220F9E72DE9F84F0446206801 +:102CA000006920F44050E168084321680861216907 +:102CB000A068084361690843E169084300902068FF +:102CC000C06849F20C618843009908432168C860D4 +:102CD0002068406920F44070A16908432168486178 +:102CE00076492068884203D075492068884203D11C +:102CF000FEF752FC814602E0FEF73EFC8146E069A9 +:102D0000B0F5004F6CD102206168A0FB0150034672 +:102D10001920A9FB007001462A463846FDF7C4FA7F +:102D20006421B0FBF1F04FEA001A02206168A0FBB9 +:102D300001510B461920A9FB00712A463846FDF7C0 +:102D4000B3FA834602206168A0FB015003461920B4 +:102D5000A9FB00712A463846FDF7A6FA6421B0FBAC +:102D6000F1F000EBC00101EB0010ABEB8000322171 +:102D700001EBC0006421B0FBF1F000F0F8000AEBB9 +:102D8000400A02206168A0FB015003461920A9FBFC +:102D9000007001462A463846FDF786FA834602202F +:102DA0006168A0FB015003461920A9FB00712A4667 +:102DB0003846FDF779FA6421B0FBF1F000EBC00171 +:102DC00001EB0010ABEB8000322101EBC00064216D +:102DD000B0FBF1F000F007005044216888606AE021 +:102DE00004206168A0FB015003461920A9FB007074 +:102DF00001462A463846FDF757FA824604206168A4 +:102E0000A0FB015003461920A9FB007001462A4689 +:102E10003846FDF749FA6421B0FBF1F000EBC00140 +:102E200001EB0010AAEB8000322101EB00106421BD +:102E3000B0FBF1F000F0F00A04206168A0FB017023 +:102E400003461920A9FB00513A462846FDF72CFA03 +:102E50006421B0FBF1F00AEB001A04206168A0FBCA +:102E600001510B461920A9FB00712A463846FDF78F +:102E70001BFA834604206168A0FB01500346192019 +:102E8000A9FB007001462A463846FDF70DFA642179 +:102E9000B0FBF1F000EBC00101EB0010ABEB8000E8 +:102EA000322101EB00106421B0FBF1F000F00F00C3 +:102EB000504421688860BDE8F88F00000010014090 +:102EC0000014014077B581B0044615460298A0620F +:102ED000A58500202064222084F83E002A48A16BAA +:102EE000C8632A48A16B08642948A16BC864002004 +:102EF000A16B086502AE32682368191D2B46A06BD2 +:102F0000FDF764FF00BF002000902068006800907B +:102F100020684068009000BF00BF00BF002084F818 +:102F20003C0000BF206970B100BF00BF21680C31B8 +:102F300051E8001F41F4807021680C3141E8000223 +:102F4000002AF3D100BF00BF00BF2168143151E84F +:102F5000001F41F001002168143141E80002002AFD +:102F6000F3D100BF00BF00BF2168143151E8001F3A +:102F700041F040002168143141E80002002AF3D1F9 +:102F800000BF002004B070BDB9290008692A0008FC +:102F900069290008014691F83D00212828D1886858 +:102FA000B0F5805F0BD1086948B90A6A1088C0F390 +:102FB00008000B685860086A801C086205E00B6A0C +:102FC000581C086218780B685860C88C401E80B284 +:102FD000C88458B90868C06820F080000B68D860C1 +:102FE0000868C06840F040000B68D8600020704757 +:102FF0000220FCE710B50248FEF7B4FE10BD000049 +:103000006003002010B50248FEF7ACFE10BD0000C2 +:10301000A403002000BFFEE702480068C0F30220BE +:10302000704700000CED00E010B5002804DB0A0733 +:10303000130E054A135406E00A07140E034A00F063 +:103040000F031B1FD45410BD00E400E018ED00E096 +:1030500010B50D49086A80470C48416B88470C48F9 +:10306000416B88470B48416B88470B49086880478C +:103070000A480B49C268082090470A4948688047B7 +:1030800009490868804710BD7C010020F801002034 +:103090004802002098020020700100208C000020CF +:1030A0002C00002010030020A800002010B50349C8 +:1030B0000869804700F00EFC10BD00008C00002065 +:1030C000034A12689080024A1268916070470000BB +:1030D000A400002010B51A480068806800B910BD2F +:1030E000002425E016480068806804EB440110F8CD +:1030F0002100D0B1002012490968896804EB44021C +:1031000001F822000E480068806804EB440100EBDF +:103110008100806800B909E009490968896804EB01 +:10312000440201EB82018868804700BF601C84B2C2 +:10313000034800688088A042D4DC00BFCFE70000CD +:10314000A400002010B501462F4A12681288521CB4 +:103150002D4B1B681A802C4A12681288B2F57A7FB0 +:1031600006DB294A12685288521C274B1B685A807A +:10317000254A1268926802B910BD00203CE0224A3C +:103180001268926800EB400302EB830252888AB314 +:103190001D4A1268926800EB400302EB83025288DA +:1031A000521E194B1B689B6800EB400403EB840321 +:1031B0005A80154A1268926800EB400302EB8302C2 +:1031C0005288BAB90122104B1B689B6800EB40047F +:1031D00003F824200C4A1268926800EB400302EBCB +:1031E00083029288084B1B689B6800EB400403EB4A +:1031F00084035A80421C90B2034A12689288824229 +:10320000BDDC00BFB8E70000A40000200148007842 +:10321000704700006C01002010B5002007490870BD +:10322000002210210648FDF7F9FF00221021054871 +:10323000FDF7F4FF002000F007F810BD6C0100203E +:1032400000100240000C02402DE9F04180460025AC +:10325000102D01DBBDE8F0812C4805702C48465D3F +:103260002C48475D002431E046FA04F000F00100EC +:1032700048B1294A32F81410284A52F82400012291 +:10328000FDF7CCFF08E0244A32F81410234A52F824 +:1032900024000022FDF7C2FF47FA04F000F001000D +:1032A00048B11F4A32F814101E4A52F82400012275 +:1032B000FDF7B4FF08E01A4A32F81410194A52F820 +:1032C00024000022FDF7AAFF601CC4B2042CCBDB53 +:1032D000002416E0AC4209D1134A32F81410134A04 +:1032E00052F824000022FDF799FF08E00E4A32F858 +:1032F00014100E4A52F824000122FDF78FFF601CC3 +:10330000C4B2102CE6DB00BFA4E700006C01002073 +:103310004C0100205C010020CC000020BC000020FB +:10332000E4000020D40000202C010020EC0000204C +:1033300010B586B00446002001900B2003900120B8 +:1033400004900220059000200090694601A8FDF736 +:103350009BFD06B010BD000010B5064948688047C7 +:1033600010220549054800F055F802494868804791 +:1033700010BD0000B00000208C01002000000E08ED +:1033800070B510220E49A1F11000FDF704F8A8B1A4 +:103390000C494868804772B6102209490A4800F073 +:1033A0005DF804462CB906481038054610352ECD78 +:1033B0002EC062B603494868804700BF70BD000058 +:1033C0008C010020B000002000000E0810B5FFF7AF +:1033D000D7FF10BD10B5FFF7BFFF0C480068808B0A +:1033E000B0F57A7F03DD282108480068818307480B +:1033F0000068C08B102803DD102104480068C183D9 +:103400000348044610341ECC1EC010BDAC01002081 +:103410007C0100202DE9F84103460C4621461D465B +:10342000960802F00307002005E055F820C0C1F817 +:1034300000C0091D401CB042F7D36FB155F82600FB +:103440000090EC46002004E01CF8008001F80080A9 +:10345000401CB842F8D300BFBDE8F8812DE9FC5FFD +:1034600007468846154600244646A808019005F000 +:103470000309BA46FDF7B4FD3846FFF759FF044685 +:1034800024B1FDF757FD2046BDE8FC9F4FF0000B2F +:103490000FE0D6F800C06246002351460220FDF737 +:1034A00053FD044604B107E00AF1040A361D0BF18E +:1034B000010B01988345ECD300BFB4B9B9F1000FFB +:1034C00013D04FF0FF300090EB46002003E0315C5A +:1034D0000BF80010401C4845F9D300235146022048 +:1034E000009AFDF731FD044600BFFDF723FD20469D +:1034F000CAE770477047000010B5002409E0322089 +:1035000000F0EBF84FF480710348FDF77DFE601C7E +:10351000C4B2142CF3DB10BD0010024010B54FF400 +:1035200080710248FDF770FE10BD000000100240DF +:103530002DE9F0410446884617460020A074A08B70 +:10354000B84200DAA78B3A4641466069FCF74FFF64 +:103550003A4661696068FEF757FFFDF765FE05466C +:1035600008E0FDF761FE0646701BC82802D901205D +:10357000A07402E0A07C0028F3D000BFBDE8F08179 +:1035800010B5044660680068C06840F010006168CB +:103590000968C860E28BA1696068FEF7CDFA10BDCA +:1035A00070B504466068FEF731FBE08BE16809689E +:1035B0004968401A86B206B970BD002506E0A269C6 +:1035C0005119206800F04BF9681C85B2B542F6DB52 +:1035D000204600F041F8E28BA1696068FEF7ACFA82 +:1035E00000BFE9E770B50446A08C618C884227DAF9 +:1035F000206880892084204600F034F8208CE18BFC +:1036000088421DDC208CD8B1208C40F6B83188422D +:1036100003D9206800F0D7F812E0002506E0094A37 +:103620005119206800F0D7F8681C85B2208CA84298 +:10363000F5DCA06C20B1218C22460248A36C98478F +:1036400070BD0000C06F002090F82620012A02D132 +:10365000428C0A4442847047012180F826100021E0 +:1036600041847047002180F8261041847047000093 +:103670002DE9F04104460F4616461448844204D111 +:10368000012204211248FDF7C9FDA08B96FBF0F042 +:103690001FFA80F8002507E0A28B02FB0571204687 +:1036A000FFF746FF681C85B24545F5DBA08B00FBA4 +:1036B000156086B20EB9BDE8F081A08B00FB0571E4 +:1036C00032462046FFF734FF00BFF4E7980200209F +:1036D0000000024001218174704710B50446204665 +:1036E000FDF7BEFB10BD2DE9F04704460D4691469F +:1036F000052D01DABDE8F0872078AA2802D160788C +:10370000552800D0F6E7681E215CA81E205C41EA1F +:103710000028A81E81B2204600F037F80646301275 +:1037200040EA062086B2464500D0E3E7A778032F9B +:1037300000D100BF00BFDDE701480249886470473F +:10374000E7360008F8010020FDF780FDFFF796F846 +:10375000FEF72CFFFEF7D6FEFFF71AF8FFF734F856 +:10376000FFF74EF8FFF774FC01E0FFF79FFCFCE762 +:1037700070B503460C4603E014F8015B03F8015BE7 +:10378000151EA2F10102F7D170BD30B502464FF609 +:10379000FF7012E012F8014B6040002308E000F0D7 +:1037A000010424B14AF2010484EA600000E0401000 +:1037B0001C465D1CABB2082CF1DB0C1EA1F101050F +:1037C000A9B2E7D130BD00B9704700214161016164 +:1037D000C16000BFF8E770B504460D460CB9002083 +:1037E00070BDE06808B90020FAE745B1D4E90006E9 +:1037F000236903FB060132462846FFF7B9FF20691B +:10380000401CA16890FBF1F201FB12002061E0680E +:10381000401EE0600120E3E770B504460D460CB998 +:10382000002070BDD4E90210884201D10020F8E7E1 +:1038300045B1D4E90016636903FB061032462946F8 +:10384000FFF796FF6069401CA16890FBF1F201FB55 +:1038500012006061E068401CE0600120E1E770B5A3 +:1038600004460D460CB9002070BDD4E90210884210 +:1038700004DA29462046FFF7CFFFF5E745B1D4E942 +:103880000016636903FB061032462946FFF770FFF6 +:103890006069401CA16890FBF1F201FB12006061BD +:1038A0002069401CA16890FBF1F201FB120020612D +:1038B0000120D9E770477047704770477047000094 +:1038C00010B502494868804710BD0000A8000020DC +:1038D0007047000010B50548C16C88470448C16CAA +:1038E00088470448C16C884710BD0000F8010020DB +:1038F00048020020980200204FF04070E1EE100ACC +:1039000070470006101600061016000000000000A8 +:10391000000001020304060708090000000001027C +:103920000304000056312E300000000031313532E2 +:103930003030000031393230300000003537363059 +:1039400030000000393630300000000034383030AC +:1039500000000000434F4D3100000000434F4D3246 +:1039600000000000434F4D3300000000434F4D3432 +:103970000000000094390008000000201C03000033 +:10398000C40100081C3B00081C030020BC88000088 +:103990002002000841321042011324F4132439009C +:1039A0000A120856302E3030312E303A012813D505 +:1039B0003822081203320A3AB70C120732323AD1CF +:1039C0000C120B32643AB50C120D32C83ABB0C1211 +:1039D000111AF43D3AC10C121323E8033AB90C1240 +:1039E0001723D0073ABD0CA113C1301B08D504130F +:1039F000453123088C1420F93414081D351B08F5B3 +:103A0000081AF3041AB01411AC100240041A40133F +:103A100012081A04D159144A04042A02B629051AB4 +:103A20000810A9040A1D0C04594079041944128095 +:103A300022402905197E396D29585910100E0D0E96 +:103A40000F0C0B0A090807040302011B06051016D8 +:103A500008090A0B0C1F010203040506E6211319CD +:103A6000321B0849041A0D04012013D5331B0881A9 +:103A7000041A59041ACD04137C01142048061A2094 +:103A8000CE11F3B80B0A1412180B14B81D181AB083 +:103A90004C136003142008051C20A804BE19C7138A +:103AA000702914202835FC20B80B5E511381351481 +:103AB0000871361B08D5041AA10C1A4908411AE5E9 +:103AC0000C1AC8501AA4501AC8501A680429501366 +:103AD000E0400C1020984C502B980220091C501AE2 +:103AE000E0501A1C501A489C1AE80829501B5058DC +:103AF000B00A3464A01354391B085C041A64041A15 +:103B00006C041A4C041A44041A34041A3C041A2C87 +:0C3B100004811339371B081074000000FA :040000050800018965 :00000001FF diff --git a/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h b/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h index 0255df2..4ce996b 100644 --- a/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h +++ b/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h @@ -11,11 +11,5 @@ #define RTE_COMPONENTS_H -/* - * Define the Device Header File: - */ -#define CMSIS_device_header "stm32f4xx.h" - - #endif /* RTE_COMPONENTS_H */ diff --git a/calib_board/usr/app/app.c b/calib_board/usr/app/app.c index dbda69d..753f0ce 100644 --- a/calib_board/usr/app/app.c +++ b/calib_board/usr/app/app.c @@ -1,5 +1,5 @@ #include "app.h" -#include "os_timer.h" +#include "app_timer.h" #include "stdio.h" #include "string.h" @@ -8,21 +8,37 @@ #include "bsp_Led.h" #include "bsp_74HC4067.h" #include "bsp_Flash.h" -#include "tjc_usart_hmi.h" #include "proto_modbus_master_tdlas.h" #include "proto_modbus_slave_ex.h" +#include "gui_tjc_hmi.h" + const char *HwVersion = "V1.0"; char SwVersion[24] = "V0.001.0"; -void TASK_Idle(void); -void Task_10ms(void); -void Task_50ms(void); -void Task_100ms(void); -void Task_200ms(void); -void Task_500ms(void); -void Task_1s(void); -void Task_2s(void); +void task_idle(void); +void task_10ms(void); +void task_50ms(void); +void task_100ms(void); +void task_200ms(void); +void task_500ms(void); +void task_1s(void); +void task_2s(void); + +#define APP_TIMER_TASK_NUM (sizeof(app_timer_task) / sizeof(app_timer_class_t)) + +/**/ +app_timer_class_t app_timer_task[] = +{ + {0, 1, 1, task_idle }, /*һֱִ*/ + {0, 3, 10, task_10ms }, + {0, 7, 50, task_50ms }, + {0, 11, 100, task_100ms }, + {0, 13, 200, task_200ms }, + {0, 17, 500, task_500ms }, + {0, 19, 1000, task_1s }, + {0, 23, 2000, task_2s }, +}; /****************************************** * : AppInit @@ -31,114 +47,75 @@ void Task_2s(void); * : * : ******************************************/ -void App_Init(void) +void app_init(void) { Usr_Flash.Init(); - COM_Uart1.Init(&COM_Uart1); - COM_Uart2.Init(&COM_Uart2); - COM_Uart4.Init(&COM_Uart4); - Led.Init(); - UartCH_Config.init(); - + /*ڳʼ*/ + com_uart1.init(&com_uart1); + com_uart2.init(&com_uart2); + com_uart4.init(&com_uart4); + UartCH_Config.init(); - tdlas.init(); - modbus_slave_ex.init(); - TJC_Init(&COM_Uart2); - initRingBuffer(); - char init_msg[] = "ϵͳʼ...\r\n"; - HAL_UART_Transmit(COM_Uart2.Uart, (uint8_t*)init_msg, strlen(init_msg), 100); + app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); /*ʱãʱƬѯ*/ + tjc_hmi.init(); + led.init(); + //Wdg.Init(); } /****************************************** - * : App_Task + * : App_task * : ʱ * : * : * : ѭе ******************************************/ -void App_Task(void) +void app_task(void) { - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10)) - { - OsTimeTick_10ms = osTime_MSecTick; - Task_10ms(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_50ms, osTime_MSecTick, 50)) - { - OsTimeTick_50ms = osTime_MSecTick; - Task_50ms(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_100ms, osTime_MSecTick, 100)) - { - OsTimeTick_100ms = osTime_MSecTick; - Task_100ms(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_200ms, osTime_MSecTick, 200)) - { - OsTimeTick_200ms = osTime_MSecTick; - Task_200ms(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_500ms, osTime_MSecTick, 500)) - { - OsTimeTick_500ms = osTime_MSecTick; - Task_500ms(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_1s, osTime_MSecTick, 1000)) - { - OsTimeTick_1s = osTime_MSecTick; - Task_1s(); - } - if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_2s, osTime_MSecTick, 2000)) - { - OsTimeTick_2s = osTime_MSecTick; - Task_2s(); - } - TASK_Idle(); + app_timer.task(); + task_idle(); } /*ִеĺ*/ -void TASK_Idle(void) +void task_idle(void) { - COM_Uart1.Rx_Task(&COM_Uart1); - COM_Uart2.Rx_Task(&COM_Uart2); - COM_Uart4.Rx_Task(&COM_Uart4); + com_uart1.rx_task(&com_uart1); + com_uart2.rx_task(&com_uart2); + com_uart4.rx_task(&com_uart4); } -void Task_10ms(void) +void task_10ms(void) { } -void Task_50ms(void) +void task_50ms(void) { -// tdlas.tx_task(); + } -void Task_100ms(void) +void task_100ms(void) { -// tdlas.tx_task(); + } -void Task_200ms(void) +void task_200ms(void) { } -void Task_500ms(void) +void task_500ms(void) { -// UartCH_Config.ch_set(ch); -// tdlas.tx_task(); - Led.Flash(); + led.task(); } -void Task_1s(void) +void task_1s(void) { } -void Task_2s(void) +void task_2s(void) { } diff --git a/calib_board/usr/app/app.h b/calib_board/usr/app/app.h index a6aa29b..d0c3b56 100644 --- a/calib_board/usr/app/app.h +++ b/calib_board/usr/app/app.h @@ -4,7 +4,12 @@ extern const char *HwVersion; extern char SwVersion[24]; -void App_Init(void); -void App_Task(void); + + +void app_init(void); +void app_task(void); + + + #endif diff --git a/calib_board/usr/app/app_com.c b/calib_board/usr/app/app_com.c new file mode 100644 index 0000000..7d28fd5 --- /dev/null +++ b/calib_board/usr/app/app_com.c @@ -0,0 +1,7 @@ +#include "app_com.h" + + + + + + diff --git a/calib_board/usr/app/app_com.h b/calib_board/usr/app/app_com.h new file mode 100644 index 0000000..770071a --- /dev/null +++ b/calib_board/usr/app/app_com.h @@ -0,0 +1,28 @@ +#ifndef _APP_COM_H_ +#define _APP_COM_H_ + +#include "main.h" +#include "app_leakage.h" +#include "bsp_uart.h" + +#define APP_COM_NUM (4) + +typedef struct +{ + u8 baudrate; /**/ +}app_com_flash_data_t; + +typedef struct +{ + app_com_flash_data_t flash_data; /*flash*/ + u16 device_num; /*󶨵豸*/ + u8 device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*豸*/ + bsp_uart_t *uart; /*󶨵ĸ*/ +}app_com_class_t; + +typedef struct +{ + app_com_class_t com_class[APP_COM_NUM]; +}app_com_t; + +#endif \ No newline at end of file diff --git a/calib_board/usr/app/app_leakage.c b/calib_board/usr/app/app_leakage.c new file mode 100644 index 0000000..f274e59 --- /dev/null +++ b/calib_board/usr/app/app_leakage.c @@ -0,0 +1,100 @@ +#include "app_leakage.h" + +#include + + + +app_leakage_t leakage = +{ + +}; +app_leakage_t *p_leakage = &leakage; + +/*࣬ͬһ豸ֵһ*/ +static void app_leakage_region_classify(void) +{ + u16 i,j; + u8 add_region_flag; + + /**/ + p_leakage->region_num = 0; + p_leakage->sub_device_num = 0; + memset(p_leakage->region_data,0,sizeof(p_leakage->region_data)); + + /*ϵͳ*/ + for(i=0;isub_device_data[i].flash_data.state) + { + p_leakage->sub_device_num++;/*ϵͳ++*/ + /**/ + for(j=0;jregion_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*ͬ*/ + { + /*豸*/ + p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*豸*/ + p_leakage->region_data[j].leakage_num++; /*ϵͳ++*/ + add_region_flag = 0;/**/ + break; + } + } + + /*ûҵͬ*/ + if(add_region_flag)/**/ + { + /**/ + memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN); + p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*豸*/ + p_leakage->region_data[p_leakage->region_num].leakage_num++; /*ϵͳ++*/ + p_leakage->region_num++; /*++*/ + } + } + } +} + +/*쳣״̬豸ͳ*/ +void app_leakage_task(void) +{ + u16 i,j,k,sub_device_index; + /*쳣豸*/ + /**/ + for(i=0;iregion_num;i++) + { + /*豸*/ + p_leakage->region_data[i].leakage_num = 0; + p_leakage->region_data[i].open_num = 0; + p_leakage->region_data[i].time_out_num = 0; + /*豸*/ + for(j=0;jregion_data[i].leakage_num;j++) + { + /*¼*/ + sub_device_index = p_leakage->region_data[i].sub_device_index[j]; + + /*ͨ*/ + for(k=0;ksub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) + { + p_leakage->region_data[i].time_out_num++; + break; + } + /*ϴ*/ + else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) + { + p_leakage->region_data[i].open_num++; + break; + } + /*©Һ*/ + else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) + { + p_leakage->region_data[i].leakage_num++; + break; + } + } + } + } +} \ No newline at end of file diff --git a/calib_board/usr/app/app_leakage.h b/calib_board/usr/app/app_leakage.h new file mode 100644 index 0000000..334dde0 --- /dev/null +++ b/calib_board/usr/app/app_leakage.h @@ -0,0 +1,62 @@ +#ifndef _APP_LEAKAGE_H_ +#define _APP_LEAKAGE_H_ + +#include "main.h" + +#define ENABLE (1) +#define DISABLE (0) + +#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*©Һ״̬*/ +#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*ϴ״̬*/ +#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*ͨѶʱ*/ + +#define APP_LEAKAGE_STRING_NANE_LEN (10) +#define APP_LEAKAGE_SUB_DEVICE_NUM (32) +#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4) + +/*豸洢IJ*/ +typedef struct +{ + u8 state; /*״̬ ʹ ʹ*/ + u8 com_port; /*˿*/ + u8 modbus_id; /*modbus id*/ + u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*豸*/ + u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /**/ +}app_leakage_sub_device_flash_data_t; + +/*豸Ϣ*/ +typedef struct +{ + app_leakage_sub_device_flash_data_t flash_data; /*flash洢*/ + struct + { + u16 state; /*״̬*/ + u16 distance; /*©Һ*/ + }ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*ͨ*/ +}app_leakage_sub_device_class_t; + + +/*Ϣ*/ +typedef struct +{ + u8 leakage_num; /*©Һ*/ + u8 open_num; /*ϴ*/ + u8 time_out_num; /*ͨѶʱ*/ + u8 sub_device_num; /*豸*/ + u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /**/ + u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*豸*/ +}app_leakage_region_data_class_t; + +typedef struct +{ + u8 region_num; + u8 sub_device_num; + app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM]; + app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM]; + + void (*init)(void); /*ʼ*/ + void (*task)(void); /*ִ*/ +}app_leakage_t; + +extern app_leakage_t leakage; +#endif \ No newline at end of file diff --git a/calib_board/usr/app/app_timer.c b/calib_board/usr/app/app_timer.c new file mode 100644 index 0000000..d441a4c --- /dev/null +++ b/calib_board/usr/app/app_timer.c @@ -0,0 +1,195 @@ +#include "app_timer.h" +#include "app.h" + +/* */ +static void app_timer_task(void); +static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class); +static void app_timer_task_increment_int(u16 ms_tick); + +/****************************************** + * ṹ: app_timer + * : Ӧöʱʵ + * : ʱƽṹľʵ +*******************************************/ +app_timer_t app_timer = +{ + .p_timer_class = NULL, + .init = app_timer_init, + .task = app_timer_task, + .increment_int = app_timer_task_increment_int, +}; + +/* ȫָ룬ָʱṹ */ +app_timer_t *p_app_timer = &app_timer; + +/****************************************** + * : app_timer_init + * : ʱʼ + * : task_num - + * p_timer_class - ʱƬָ + * : + * : ʼʱ +*******************************************/ +static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class) +{ + p_app_timer->task_num = task_num; + p_app_timer->p_timer_class = p_timer_class; +} + +/****************************************** + * : app_timer_task + * : ʱ + * : + * : + * : ִѵʱ +*******************************************/ +static void app_timer_task(void) +{ + u16 i; + + /* ǷЧ */ + if(NULL == p_app_timer->p_timer_class) + { + return; + } + + /* */ + for (i = 0; i < p_app_timer->task_num; i++) + { + /* ǷҪִ */ + if (p_app_timer->p_timer_class[i].run_flag) + { + p_app_timer->p_timer_class[i].run_flag = 0; /* ִб־ */ + + /* ǷЧ */ + if (p_app_timer->p_timer_class[i].task == NULL) + { + continue; + } + + /* ִ */ + p_app_timer->p_timer_class[i].task(); + } + } +} + +/****************************************** + * : app_timer_task_increment_int + * : жϵ + * : ms_tick - + * : + * : жеã¶ʱͼʱƬ +*******************************************/ +static void app_timer_task_increment_int(u16 ms_tick) +{ + u16 i; + + /* º뼶 */ + p_app_timer->ms_tick++; + + /* 뼶 */ + if(p_app_timer->ms_tick >= 1000) + { + p_app_timer->s_tick++; + } + + /* ǷЧ */ + if(NULL == p_app_timer->p_timer_class) + { + return; + } + + /* ʱƬ */ + for (i = 0; i < p_app_timer->task_num; i++) + { + /* ǷЧ */ + if (p_app_timer->p_timer_class[i].timer_count) + { + p_app_timer->p_timer_class[i].timer_count--; + + /* Ƿ񵽴ִʱ */ + if (p_app_timer->p_timer_class[i].timer_count == 0) + { + p_app_timer->p_timer_class[i].run_flag = 1; + p_app_timer->p_timer_class[i].timer_count = p_app_timer->p_timer_class[i].timer_reload; + } + } + } +} + +/****************************************** + * : app_timer_check_time_out + * : 鳬ʱ + * : time_start - ʱʼʱ + * time_now - ǰʱ + * time_out - ʱʱ + * : TIME_TRUE - ѳʱTIME_FALSE - δʱ + * : time_startʼtime_outʱǷʱ + * ˼ +*******************************************/ +u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out) +{ + u16 timer_activate_val; + + /* 㴥ʱ */ + timer_activate_val = time_out + time_start; + + /* Ǽ */ + if (timer_activate_val > time_start) + { + /* δ */ + if ((time_now >= timer_activate_val) || (time_now < time_start)) + { + return TIME_TRUE; + } + } + else if ((time_now >= timer_activate_val) && (time_now < time_start)) + { + /* ҵǰʱ */ + return TIME_TRUE; + } + + return TIME_FALSE; +} + +/****************************************** + * : app_timer_check_run_time + * : ʣʱ + * : time_start - ʱʼʱ + * time_now - ǰʱ + * time_out - ʱʱ + * : ʣʱ䣨룩 + * : app_timer_check_time_outʹã + * 볬ʱжʱ䣬˼ +*******************************************/ +u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out) +{ + u16 timer_activate_val; + + /* 㴥ʱ */ + timer_activate_val = time_out + time_start; + + /* Ǽ */ + if (timer_activate_val > time_start) + { + /* δֱӼʣʱ */ + return (timer_activate_val - time_now); + } + else + { + /* ʣʱ */ + return (65535U - time_now + timer_activate_val); + } +} + +/****************************************** + * : delay_ms + * : ʽʱ + * : delay - ʱʱ䣨룩 + * : + * : ʹHALṩʱʵʽʱ +*******************************************/ +void delay_ms(u16 delay) +{ + HAL_Delay(delay); +} \ No newline at end of file diff --git a/calib_board/usr/app/app_timer.h b/calib_board/usr/app/app_timer.h new file mode 100644 index 0000000..c153898 --- /dev/null +++ b/calib_board/usr/app/app_timer.h @@ -0,0 +1,48 @@ +#ifndef _APP_TIMER_H_ +#define _APP_TIMER_H_ + +#include "main.h" + +/* ʱغ궨 */ +#define TIME_TRUE 1U /* ʱѵ */ +#define TIME_FALSE 0U /* ʱδ */ + +/****************************************** + * ṹ: app_timer_class_t + * : ʱƬṹ + * : 嵥ʱƬȲ +*******************************************/ +typedef struct +{ + u8 run_flag; /* ȱ־1ȣ0 */ + u16 timer_count; /* ʱƬֵ */ + u16 timer_reload; /* ʱƬֵ */ + void (*task)(void); /* ָ */ +} app_timer_class_t; + +/****************************************** + * ṹ: app_timer_t + * : Ӧöʱṹ + * : Ķʱ +*******************************************/ +typedef struct +{ + u16 ms_tick; /* δ뼶 */ + u16 s_tick; /* δ뼶 */ + u16 task_num; /* */ + app_timer_class_t *p_timer_class; /* ʱƬָ */ + + void (*init)(u8, app_timer_class_t *); /* ʼָ */ + void (*task)(void); /* ʱָ */ + void (*increment_int)(u16); /* жϵָ */ +} app_timer_t; + +/* */ +u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out); +u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out); +void delay_ms(u16 delay); + +/* ⲿ */ +extern app_timer_t app_timer; + +#endif \ No newline at end of file diff --git a/calib_board/usr/app/os_timer.c b/calib_board/usr/app/os_timer.c deleted file mode 100644 index bfa4fdf..0000000 --- a/calib_board/usr/app/os_timer.c +++ /dev/null @@ -1,121 +0,0 @@ -#include "os_timer.h" - -unsigned short osTime_MSecTick = 0; /*δʱ*/ -unsigned short osTime_SecTick = 0; -unsigned short osTime_10SecTick = 0; /*10sһ Զʱ¼*/ - -static unsigned short osTimer_MSec1 = 0; -static unsigned short osTimer_MSec2 = 0; - -unsigned short OsTimeTick_10ms; -unsigned short OsTimeTick_50ms; -unsigned short OsTimeTick_100ms; -unsigned short OsTimeTick_200ms; -unsigned short OsTimeTick_500ms; -unsigned short OsTimeTick_1s; -unsigned short OsTimeTick_2s; - -/**************************************************************************** - * NAME: OsTimer_Init - * CALLED BY: Application - * PRECONDITIONS: - * INPUT PARAMETERS: None - * RETURN VALUES: None - * DESCRIPTION: OsTimer initialization - * - ****************************************************************************/ - -void OsTimer_Init(void) -{ - osTimer_MSec1 = 0; - osTimer_MSec2 = 0; - osTime_SecTick = 0; - osTime_MSecTick = 0; - - OsTimeTick_10ms = osTime_MSecTick; - OsTimeTick_50ms = osTime_MSecTick; - OsTimeTick_100ms = osTime_MSecTick; - OsTimeTick_200ms = osTime_MSecTick; - OsTimeTick_500ms = osTime_MSecTick; - OsTimeTick_1s = osTime_MSecTick; -} - -/**************************************************************************** - * NAME: OsTimer_Increment - * CALLED BY: ISR - * PRECONDITIONS: - * INPUT PARAMETERS: msec - millisecond to increase - * RETURN VALUES: None - * DESCRIPTION: Increase the Timer - * - ****************************************************************************/ -void OsTimer_Increment(unsigned short msec) -{ - osTime_MSecTick += msec; - osTimer_MSec1 += msec; - osTimer_MSec2 += msec; - if (osTimer_MSec1 >= 1000U) /*1s*/ - { - osTimer_MSec1 = 0U; - osTime_SecTick++; - } - if (osTimer_MSec2 >= 10000U) /*10s*/ - { - osTimer_MSec2 = 0U; - osTime_10SecTick++; - } -} - -/**************************************************************************** - * NAME: OsTimer_CheckTimeOut - * CALLED BY: Application - * PRECONDITIONS: - * INPUT PARAMETERS: timeStart - start tick - * timeNow - current tick - * timeOut - expired tick - * RETURN VALUES: whether timer is expired - * DESCRIPTION: check if specified time is expired - * - ****************************************************************************/ -unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut) -{ - unsigned short timerActivateVal; - timerActivateVal = timeOut + timeStart; - - if (timerActivateVal > timeStart) - { - if ((timeNow >= timerActivateVal) || (timeNow < timeStart)) - { - return TIME_TRUE; - } - } - else if ((timeNow >= timerActivateVal) && (timeNow < timeStart)) - { - return TIME_TRUE; - } - return TIME_FALSE; -} - -/* -лжʱ OsTimer_CheckTimeOutʹ -*/ -unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut) -{ - unsigned short timerActivateVal; - timerActivateVal = timeOut + timeStart; - - if (timerActivateVal > timeStart) - { - return (timerActivateVal - timeNow); - } - else - { - return (65535U - timeNow + timerActivateVal); - } -} - -/*ʽʱ*/ -void Delay_ms(unsigned short delay) -{ - HAL_Delay(delay); -} diff --git a/calib_board/usr/app/os_timer.h b/calib_board/usr/app/os_timer.h deleted file mode 100644 index 6ff9a4e..0000000 --- a/calib_board/usr/app/os_timer.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _OSTIMER_H_ -#define _OSTIMER_H_ - -#include "main.h" - -#define TIME_TRUE 1U -#define TIME_FALSE 0U - - -extern unsigned short osTime_MSecTick; -extern unsigned short osTime_SecTick; -extern unsigned short osTime_10SecTick; // 10sһ Զʱ¼ - -extern unsigned short OsTimeTick_10ms; -extern unsigned short OsTimeTick_50ms; -extern unsigned short OsTimeTick_100ms; -extern unsigned short OsTimeTick_200ms; -extern unsigned short OsTimeTick_500ms; -extern unsigned short OsTimeTick_1s; -extern unsigned short OsTimeTick_2s; - -void OsTimer_Init(void); -void OsTimer_Increment(unsigned short msec); -unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut); -unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut); - -void Delay_ms(unsigned short delay); - -#endif diff --git a/calib_board/usr/bsp/bsp_74HC4067.c b/calib_board/usr/bsp/bsp_74HC4067.c index 0d903f0..9c7503b 100644 --- a/calib_board/usr/bsp/bsp_74HC4067.c +++ b/calib_board/usr/bsp/bsp_74HC4067.c @@ -1,5 +1,4 @@ #include "bsp_74HC4067.h" -#include "os_timer.h" /*Ƭ74HC4067һƬTX һƬRX ÿƬ16ͨ*/ diff --git a/calib_board/usr/bsp/bsp_Led.c b/calib_board/usr/bsp/bsp_Led.c index 28974e8..4f1e5f7 100644 --- a/calib_board/usr/bsp/bsp_Led.c +++ b/calib_board/usr/bsp/bsp_Led.c @@ -1,5 +1,5 @@ #include "bsp_Led.h" -#include "os_timer.h" +#include "app_timer.h" #define LED1_ON HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET) #define LED1_OFF HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET) @@ -14,25 +14,25 @@ #define LED3_TOGGLE HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin) -static void bsp_Led_Init(void); -static void bsp_Led_Flash(void); +static void bsp_led_init(void); +static void bsp_led_task(void); -bsp_Led_t Led = +bsp_led_t led = { - .Init = bsp_Led_Init, - .Flash = bsp_Led_Flash, + .init = bsp_led_init, + .task = bsp_led_task, }; /*ʼ˸ʾʼ*/ -static void bsp_Led_Init(void) +static void bsp_led_init(void) { for(u8 i = 0;i < 20;i++) { - Delay_ms(50); + delay_ms(50); HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } } -static void bsp_Led_Flash(void) +static void bsp_led_task(void) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } diff --git a/calib_board/usr/bsp/bsp_Led.h b/calib_board/usr/bsp/bsp_Led.h index 4ec6d54..6316113 100644 --- a/calib_board/usr/bsp/bsp_Led.h +++ b/calib_board/usr/bsp/bsp_Led.h @@ -6,10 +6,10 @@ typedef struct { - void (*Init)(void); - void (*Flash)(void); -}bsp_Led_t; + void (*init)(void); + void (*task)(void); +}bsp_led_t; -extern bsp_Led_t Led; +extern bsp_led_t led; #endif diff --git a/calib_board/usr/bsp/bsp_Uart.c b/calib_board/usr/bsp/bsp_Uart.c deleted file mode 100644 index 3c47baa..0000000 --- a/calib_board/usr/bsp/bsp_Uart.c +++ /dev/null @@ -1,396 +0,0 @@ -#include "bsp_Uart.h" - -#include "string.h" - -//#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_RESET) -#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET) -#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET) - -/*շ*/ -#define RX_TEMP_BUFF_NUM (3000U) -u8 Rx_Temp_Buff[RX_TEMP_BUFF_NUM]; - -#define UART1_TX_LEN (3000U) -#define UART1_RX_LEN (3000U) - -#define UART2_TX_LEN (3000U) -#define UART2_RX_LEN (3000U) - -#define UART4_TX_LEN (3000U) -#define UART4_RX_LEN (3000U) - -u8 Uart1_TX_Buff[UART1_TX_LEN]; -u8 Uart1_Rx_Buff[UART1_RX_LEN]; - -u8 Uart2_TX_Buff[UART2_TX_LEN]; -u8 Uart2_Rx_Buff[UART2_RX_LEN]; - -u8 Uart4_TX_Buff[UART4_TX_LEN]; -u8 Uart4_Rx_Buff[UART4_RX_LEN]; - -static void bsp_Uart_Init(bsp_Uart_t *p_Uart); -static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len); -static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart); -static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time); -static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart); -static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart); -static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart); - -extern UART_HandleTypeDef huart1; -extern UART_HandleTypeDef huart2; -extern UART_HandleTypeDef huart4; - -extern DMA_HandleTypeDef hdma_usart1_rx; -extern DMA_HandleTypeDef hdma_usart1_tx; -extern DMA_HandleTypeDef hdma_usart2_rx; -extern DMA_HandleTypeDef hdma_usart2_tx; -extern DMA_HandleTypeDef hdma_uart4_rx; -extern DMA_HandleTypeDef hdma_uart4_tx; - -bsp_Uart_t COM_Uart1 = -{ - .RxQueue = queue(u8,UART1_RX_LEN), - .Uart =&huart1, - - .Tx_DMA = &hdma_usart1_tx, - .Rx_DMA = &hdma_usart1_rx, - - .Tx_DMA_Len = UART1_TX_LEN, - .Rx_DMA_Len = UART1_RX_LEN, - - .Tx_Addr = &Uart1_TX_Buff[0], - .Rx_Addr = &Uart1_Rx_Buff[0], - - .Tx_DMA_CompleteFlag = 1, - .Rx_TimeOver = 0, - - .relay.uart = NULL, - - .Init = bsp_Uart_Init, - .Send = bsp_Uart_Send, - - .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt, - .Rx_IdleInt = bsp_Uart_Rx_IdleInt, - .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement, - .Rx_DataAnalysis = NULL, - .Rx_Task = bsp_Uart_Rx_Task, -}; - -bsp_Uart_t COM_Uart2 = -{ - .RxQueue = queue(u8,UART2_RX_LEN), - .Uart =&huart2, - - .Tx_DMA = &hdma_usart2_tx, - .Rx_DMA = &hdma_usart2_rx, - - .Tx_DMA_Len = UART2_TX_LEN, - .Rx_DMA_Len = UART2_RX_LEN, - - .Tx_Addr = &Uart2_TX_Buff[0], - .Rx_Addr = &Uart2_Rx_Buff[0], - - .Tx_DMA_CompleteFlag = 1, - .Rx_TimeOver = 0, - - .relay.uart = &COM_Uart4, - - .Init = bsp_Uart_Init, - .Send = bsp_Uart_Send, - .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt, - .Rx_IdleInt = bsp_Uart_Rx_IdleInt, - .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement, - .Rx_DataAnalysis = NULL, - .Rx_Task = bsp_Uart_Rx_Task, -}; - -bsp_Uart_t COM_Uart4 = -{ - .RxQueue = queue(u8,UART4_RX_LEN), - .Uart =&huart4, - - .Tx_DMA = &hdma_uart4_tx, - .Rx_DMA = &hdma_uart4_rx, - - .Tx_DMA_Len = UART4_TX_LEN, - .Rx_DMA_Len = UART4_RX_LEN, - - .Tx_Addr = &Uart4_TX_Buff[0], - .Rx_Addr = &Uart4_Rx_Buff[0], - - .Tx_DMA_CompleteFlag = 1, - .Rx_TimeOver = 0, - - .relay.uart = NULL, - - .Init = bsp_Uart_Init, - .Send = bsp_Uart_Send, - .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt, - .Rx_IdleInt = bsp_Uart_Rx_IdleInt, - .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement, - .Rx_DataAnalysis = NULL, - .Rx_Task = bsp_Uart_Rx_Task, -}; - - -/* ʼ */ -static void bsp_Uart_Init(bsp_Uart_t *p_Uart) -{ - /*ݽ*/ - //p_Uart->Rx_DataAnalysis = NULL; - - /* ÿж */ - __HAL_UART_ENABLE_IT(p_Uart->Uart, UART_IT_IDLE); - - /* DMA */ - //HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len); - /* */ - HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len); -} - - -static void bsp_Uart_DMASend(bsp_Uart_t *p_Uart,u8 *pData, u16 Len) -{ - u32 tickstart,tick; - p_Uart->Tx_DMA_CompleteFlag = 0; - if(p_Uart->Tx_DMA_Len < Len) - Len = p_Uart->Tx_DMA_Len; - memcpy(p_Uart->Tx_Addr, pData, Len); /*ݵͻ*/ - -// /*ʽͣʽͣᵼշʱлͨ*/ -// HAL_UART_Transmit(p_Uart->Uart,p_Uart->Tx_Addr,Len,500); - - - HAL_UART_Transmit_DMA(p_Uart->Uart,p_Uart->Tx_Addr,Len); - tickstart = HAL_GetTick(); - while( !p_Uart->Tx_DMA_CompleteFlag) - { - tick = HAL_GetTick(); - if((tick - tickstart) > 200) // 1000ms ʱ - { - p_Uart->Tx_DMA_CompleteFlag = 1; - break; - } - } -} - -/**/ -static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len) -{ - u16 i,SendNum; - - if(p_Uart == &COM_Uart4) - RS485_TX; - SendNum = Len / p_Uart->Tx_DMA_Len; - for(i=0;iTx_DMA_Len * i], p_Uart->Tx_DMA_Len); - } - - /*ʣ*/ - Len -= p_Uart->Tx_DMA_Len * i; - if(0 == Len) - { - return ; - } - else - { - bsp_Uart_DMASend(p_Uart,&pData[p_Uart->Tx_DMA_Len * i],Len); - } -} - -static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart) -{ - p_Uart->Tx_DMA_CompleteFlag = 1; -} - -/*нж*/ -static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart) -{ - u16 Rx_Length, i; - /*ֹͣ*/ - HAL_UART_DMAStop(p_Uart->Uart); - - /* յݳ */ - Rx_Length = p_Uart->Rx_DMA_Len - __HAL_DMA_GET_COUNTER(p_Uart->Rx_DMA); - - /* Ϊ0ֱӷ */ - if (Rx_Length == 0) { - return; - } - - /* */ - for (i = 0; i < Rx_Length; i++) - { - queue_push_back(p_Uart->RxQueue, (void *)&p_Uart->Rx_Addr[i]); - } - /* ʼ */ - bsp_Uart_Rx_TimeStart(p_Uart); -// HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len); - HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len); -} - - - - -/*жϼ*/ -static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time) -{ - /*ʼ*/ - if(1 == p_Uart->Rx_StartFlag) - { - p_Uart->Rx_TimeCount += Time; - } -} - -/*ʼ*/ -static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart) -{ - p_Uart->Rx_StartFlag = 1; - p_Uart->Rx_TimeCount = 0; -} - -/*ֹͣ*/ -static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart) -{ - p_Uart->Rx_StartFlag = 0; - p_Uart->Rx_TimeCount = 0; -} - -static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart) -{ - /*ʱɣյһ֡*/ - if(p_Uart->Rx_TimeOver < p_Uart->Rx_TimeCount) - { - p_Uart->Rx_Len = queue_size(p_Uart->RxQueue); - /*ֹͣ*/ - bsp_Uart_Rx_TimeStop(p_Uart); - if(p_Uart->Rx_Len <= p_Uart->Rx_DMA_Len && (0 != p_Uart->Rx_Len)) - { - if(RX_TEMP_BUFF_NUM < p_Uart->Rx_Len) - { - queue_clear(p_Uart->RxQueue); - } - else - { - for(u16 i = 0;i < p_Uart->Rx_Len;i++) - { - queue_pop(p_Uart->RxQueue,&Rx_Temp_Buff[i]); - } - if(NULL != p_Uart->Rx_DataAnalysis) - { - p_Uart->Rx_DataAnalysis(Rx_Temp_Buff,p_Uart->Rx_Len,p_Uart); /**/ - } - // p_Uart->Send(p_Uart,Rx_Temp_Buff,p_Uart->Rx_Len); - } - } - } -} - - - -// صдORE -void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) -{ - bsp_Uart_t *p_Uart = NULL; - if (huart->Instance == USART1) - { - p_Uart = &COM_Uart1; - } - else if (huart->Instance == USART2) - { - p_Uart = &COM_Uart2; - } - else if (huart->Instance == UART4) - { - p_Uart = &COM_Uart4; - } - - // - if(huart->ErrorCode & HAL_UART_ERROR_NE) - { - // - __HAL_UART_CLEAR_NEFLAG(huart); - } - if(huart->ErrorCode & HAL_UART_ERROR_FE) - { - // ֡ - __HAL_UART_CLEAR_FEFLAG(huart); - } - // ... - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) - { - __HAL_UART_CLEAR_OREFLAG(huart); // ORE־ - } - if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) - { - __HAL_UART_CLEAR_FEFLAG(huart); // ORE־ - } - -// - if(p_Uart != NULL) - { -// HAL_UART_DeInit(huart); -// HAL_UART_Init(huart); -// HAL_UART_DMAStop(p_Uart->Uart); - HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len); - } -} - -// ʵֿжϻص -void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) -{ - if (huart->Instance == USART1) - { - bsp_Uart_Rx_IdleInt(&COM_Uart1); - } - else if (huart->Instance == USART2) - { - bsp_Uart_Rx_IdleInt(&COM_Uart2); - } - else if (huart->Instance == UART4) - { - bsp_Uart_Rx_IdleInt(&COM_Uart4); - } -} - -/* ڽɻص - ж */ -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -{ -// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) -// { -// __HAL_UART_CLEAR_IDLEFLAG(huart); - -// if (huart->Instance == USART1) -// { -// bsp_Uart_Rx_IdleInt(&COM_Uart1); -// } -// else if (huart->Instance == USART2) -// { -// bsp_Uart_Rx_IdleInt(&COM_Uart2); -// } -// else if (huart->Instance == UART4) -// { -// bsp_Uart_Rx_IdleInt(&COM_Uart4); -// } -// } -} - - -void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) -{ - if (huart->Instance == USART1) - { - COM_Uart1.Tx_DMA_TCInt(&COM_Uart1); - } - else if (huart->Instance == USART2) - { - COM_Uart2.Tx_DMA_TCInt(&COM_Uart2); - } - else if (huart->Instance == UART4) - { - RS485_RX; - COM_Uart4.Tx_DMA_TCInt(&COM_Uart4); - } -} - diff --git a/calib_board/usr/bsp/bsp_Uart.h b/calib_board/usr/bsp/bsp_Uart.h deleted file mode 100644 index 9fc4733..0000000 --- a/calib_board/usr/bsp/bsp_Uart.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef _BSP_UART_H_ -#define _BSP_UART_H_ - -#include "main.h" -#include "algo_Queue.h" - -typedef struct bsp_Uart_t bsp_Uart_t; - - -#define usart_type UART_HandleTypeDef -#define dma_type DMA_HandleTypeDef - -/*ת*/ -typedef struct -{ - u8 flag; /*ת־λ*/ - bsp_Uart_t *uart; /*תȥĴ*/ - u16 time_out; /*תʱʱ*/ -}bsp_uart_relay_t; - -struct bsp_Uart_t -{ - queue RxQueue; /*ݽն*/ - usart_type *Uart; /**/ - - dma_type *Tx_DMA; /*DMA*/ - dma_type *Rx_DMA; - - u8 Tx_DMA_CH; - u8 Rx_DMA_CH; - vu8 Tx_DMA_CompleteFlag; /*DMAɱ־λ*/ - - u8 *Tx_Addr; /*DMA˻*/ - u8 *Rx_Addr; - u16 Tx_DMA_Len; - u16 Rx_DMA_Len; - - u16 Rx_Len; /*յݳ*/ - u16 Rx_TimeCount; /*ʱ*/ - u16 Rx_TimeOver; /*ʱʱ*/ - u8 Rx_StartFlag; /*ʼʱ־λ*/ - - - bsp_uart_relay_t relay; /*ת*/ - void (*Init)(bsp_Uart_t *); /*ʼ*/ - void (*Send)(bsp_Uart_t *,u8 *,u16); /*ڷͺ*/ - - void (*Tx_DMA_TCInt)(bsp_Uart_t *); /*DMAж*/ - - void (*Rx_IdleInt)(bsp_Uart_t *); /*ж*/ - void (*Rx_TimeIncrementInt)(bsp_Uart_t *,u16); /*жϼ*/ - void (*Rx_DataAnalysis)(u8 *,u16,void *); /*ݽ*/ - void (*Rx_Task)(bsp_Uart_t *); /*ڽ*/ -}; - -extern bsp_Uart_t COM_Uart1; -extern bsp_Uart_t COM_Uart2; -extern bsp_Uart_t COM_Uart4; -#endif diff --git a/calib_board/usr/bsp/bsp_uart.c b/calib_board/usr/bsp/bsp_uart.c new file mode 100644 index 0000000..ed9b242 --- /dev/null +++ b/calib_board/usr/bsp/bsp_uart.c @@ -0,0 +1,489 @@ +#include "bsp_uart.h" +#include "string.h" + +/* RS485ƺ궨 */ +#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET) +#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET) + +/* շС */ +#define RX_TEMP_BUFF_NUM (3000U) + +/* UARTС */ +#define UART1_TX_LEN (3000U) +#define UART1_RX_LEN (3000U) + +#define UART2_TX_LEN (3000U) +#define UART2_RX_LEN (3000U) + +#define UART4_TX_LEN (3000U) +#define UART4_RX_LEN (3000U) + +/* ȫֻ */ +u8 uart1_tx_buff[UART1_TX_LEN]; +u8 uart1_rx_buff[UART1_RX_LEN]; + +u8 uart2_tx_buff[UART2_TX_LEN]; +u8 uart2_rx_buff[UART2_RX_LEN]; + +u8 uart4_tx_buff[UART4_TX_LEN]; +u8 uart4_rx_buff[UART4_RX_LEN]; + +u8 rx_temp_buff[RX_TEMP_BUFF_NUM]; + +/* */ +static void bsp_uart_init(bsp_uart_t *p_uart); +static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len); +static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart); +static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time); +static void bsp_uart_rx_task(bsp_uart_t *p_uart); +static void bsp_uart_rx_time_start(bsp_uart_t *p_uart); +static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart); +static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len); + +/* ⲿHAL */ +extern UART_HandleTypeDef huart1; +extern UART_HandleTypeDef huart2; +extern UART_HandleTypeDef huart4; + +extern DMA_HandleTypeDef hdma_usart1_rx; +extern DMA_HandleTypeDef hdma_usart1_tx; +extern DMA_HandleTypeDef hdma_usart2_rx; +extern DMA_HandleTypeDef hdma_usart2_tx; +extern DMA_HandleTypeDef hdma_uart4_rx; +extern DMA_HandleTypeDef hdma_uart4_tx; + +/****************************************** + * ṹ: com_uart1 + * : UART1ʵ + * : UART1Ӳͻص +*******************************************/ +bsp_uart_t com_uart1 = +{ + .rx_queue = queue(u8, UART1_RX_LEN), + .uart = &huart1, + + .tx_dma = &hdma_usart1_tx, + .rx_dma = &hdma_usart1_rx, + + .tx_dma_len = UART1_TX_LEN, + .rx_dma_len = UART1_RX_LEN, + + .tx_addr = &uart1_tx_buff[0], + .rx_addr = &uart1_rx_buff[0], + + .tx_dma_complete_flag = 1, + .rx_time_over = 0, + + .relay.uart = NULL, + + .init = bsp_uart_init, + .send = bsp_uart_send, + + .tx_dma_tc_int = bsp_uart_tx_dma_tc_int, + .rx_idle_int = bsp_uart_rx_idle_int, + .rx_time_increment_int = bsp_uart_rx_time_increment, + .rx_data_analysis = NULL, + .rx_task = bsp_uart_rx_task, +}; + +/****************************************** + * ṹ: com_uart2 + * : UART2ʵ + * : UART2Ӳͻص +*******************************************/ +bsp_uart_t com_uart2 = +{ + .rx_queue = queue(u8, UART2_RX_LEN), + .uart = &huart2, + + .tx_dma = &hdma_usart2_tx, + .rx_dma = &hdma_usart2_rx, + + .tx_dma_len = UART2_TX_LEN, + .rx_dma_len = UART2_RX_LEN, + + .tx_addr = &uart2_tx_buff[0], + .rx_addr = &uart2_rx_buff[0], + + .tx_dma_complete_flag = 1, + .rx_time_over = 0, + + .relay.uart = &com_uart4, + + .init = bsp_uart_init, + .send = bsp_uart_send, + .tx_dma_tc_int = bsp_uart_tx_dma_tc_int, + .rx_idle_int = bsp_uart_rx_idle_int, + .rx_time_increment_int = bsp_uart_rx_time_increment, + .rx_data_analysis = NULL, + .rx_task = bsp_uart_rx_task, +}; + +/****************************************** + * ṹ: com_uart4 + * : UART4ʵ + * : UART4Ӳͻص +*******************************************/ +bsp_uart_t com_uart4 = +{ + .rx_queue = queue(u8, UART4_RX_LEN), + .uart = &huart4, + + .tx_dma = &hdma_uart4_tx, + .rx_dma = &hdma_uart4_rx, + + .tx_dma_len = UART4_TX_LEN, + .rx_dma_len = UART4_RX_LEN, + + .tx_addr = &uart4_tx_buff[0], + .rx_addr = &uart4_rx_buff[0], + + .tx_dma_complete_flag = 1, + .rx_time_over = 0, + + .relay.uart = NULL, + + .init = bsp_uart_init, + .send = bsp_uart_send, + .tx_dma_tc_int = bsp_uart_tx_dma_tc_int, + .rx_idle_int = bsp_uart_rx_idle_int, + .rx_time_increment_int = bsp_uart_rx_time_increment, + .rx_data_analysis = NULL, + .rx_task = bsp_uart_rx_task, +}; + +/****************************************** + * : bsp_uart_init + * : UARTʼ + * : p_uart - ָUARTṹָ + * : + * : ʼUARTʹܿжϺDMA +*******************************************/ +static void bsp_uart_init(bsp_uart_t *p_uart) +{ + /* ÿж */ + __HAL_UART_ENABLE_IT(p_uart->uart, UART_IT_IDLE); + + /* գʹÿжģʽ */ + HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len); +} + +/****************************************** + * : bsp_uart_dma_send + * : DMAͺ + * : p_uart - ָUARTṹָ + * p_data - Ҫ͵ָ + * len - Ҫ͵ݳ + * : + * : ʹDMAݣгʱ +*******************************************/ +static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len) +{ + u32 tick_start, tick; + + p_uart->tx_dma_complete_flag = 0; + + /* ͵ijȴڻȣض */ + if(p_uart->tx_dma_len < len) + len = p_uart->tx_dma_len; + + /* ݵͻ */ + memcpy(p_uart->tx_addr, p_data, len); + + /* DMA */ + HAL_UART_Transmit_DMA(p_uart->uart, p_uart->tx_addr, len); + + /* ȴɣʱ */ + tick_start = HAL_GetTick(); + while(!p_uart->tx_dma_complete_flag) + { + tick = HAL_GetTick(); + if((tick - tick_start) > 200) /* 200msʱ */ + { + p_uart->tx_dma_complete_flag = 1; + break; + } + } +} + +/****************************************** + * : bsp_uart_send + * : UARTͺ + * : p_uart - ָUARTṹָ + * p_data - Ҫ͵ָ + * len - Ҫ͵ݳ + * : + * : ͺַֿ֧鷢 +*******************************************/ +static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len) +{ + u16 i, send_num; + + /* RS485лģʽ */ + if(p_uart == &com_uart4) + RS485_TX; + + /* Ҫ͵Ĵ */ + send_num = len / p_uart->tx_dma_len; + + /* ֿ鷢 */ + for(i = 0; i < send_num; i++) + { + bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], p_uart->tx_dma_len); + } + + /* ʣ */ + len -= p_uart->tx_dma_len * i; + if(0 == len) + { + return; + } + else + { + bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], len); + } +} + +/****************************************** + * : bsp_uart_tx_dma_tc_int + * : DMAжϴ + * : p_uart - ָUARTṹָ + * : + * : DMAжеã÷ɱ־ +*******************************************/ +static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart) +{ + p_uart->tx_dma_complete_flag = 1; +} + +/****************************************** + * : bsp_uart_rx_idle_int + * : жϴ + * : p_uart - ָUARTṹָ + * : + * : UARTжϣյݴ +*******************************************/ +static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart) +{ + u16 rx_length, i; + + /* ֹͣ */ + HAL_UART_DMAStop(p_uart->uart); + + /* յݳ */ + rx_length = p_uart->rx_dma_len - __HAL_DMA_GET_COUNTER(p_uart->rx_dma); + + /* Ϊ0ֱӷ */ + if (rx_length == 0) + { + return; + } + + /* յݴ */ + for (i = 0; i < rx_length; i++) + { + queue_push_back(p_uart->rx_queue, (void *)&p_uart->rx_addr[i]); + } + + /* ʼճʱʱ */ + bsp_uart_rx_time_start(p_uart); + + /* */ + HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len); +} + +/****************************************** + * : bsp_uart_rx_time_increment + * : ճʱʱ + * : p_uart - ָUARTṹָ + * time - ӵʱֵ + * : + * : жеãճʱ +*******************************************/ +static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time) +{ + /* Ѿʼʱ */ + if(1 == p_uart->rx_start_flag) + { + p_uart->rx_time_count += time; + } +} + +/****************************************** + * : bsp_uart_rx_time_start + * : ճʱʱ + * : p_uart - ָUARTṹָ + * : + * : ʼճʱ +*******************************************/ +static void bsp_uart_rx_time_start(bsp_uart_t *p_uart) +{ + p_uart->rx_start_flag = 1; + p_uart->rx_time_count = 0; +} + +/****************************************** + * : bsp_uart_rx_time_stop + * : ֹͣճʱʱ + * : p_uart - ָUARTṹָ + * : + * : ֹͣճʱ +*******************************************/ +static void bsp_uart_rx_time_stop(bsp_uart_t *p_uart) +{ + p_uart->rx_start_flag = 0; + p_uart->rx_time_count = 0; +} + +/****************************************** + * : bsp_uart_rx_task + * : UART + * : p_uart - ָUARTṹָ + * : + * : ճʱյ֡ +*******************************************/ +static void bsp_uart_rx_task(bsp_uart_t *p_uart) +{ + /* Ƿʱյһ֡ */ + if(p_uart->rx_time_over < p_uart->rx_time_count) + { + /* ȡݳ */ + p_uart->rx_len = queue_size(p_uart->rx_queue); + + /* ֹͣʱ */ + bsp_uart_rx_time_stop(p_uart); + + /* ݳǷЧ */ + if(p_uart->rx_len <= p_uart->rx_dma_len && (0 != p_uart->rx_len)) + { + /* ݳȳʱСն */ + if(RX_TEMP_BUFF_NUM < p_uart->rx_len) + { + queue_clear(p_uart->rx_queue); + } + else + { + /* Ӷȡݵʱ */ + for(u16 i = 0; i < p_uart->rx_len; i++) + { + queue_pop(p_uart->rx_queue, &rx_temp_buff[i]); + } + + /* ݽý */ + if(NULL != p_uart->rx_data_analysis) + { + p_uart->rx_data_analysis(rx_temp_buff, p_uart->rx_len, p_uart); + } + } + } + } +} + + + + + +// صдORE +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + bsp_uart_t *p_uart = NULL; + if (huart->Instance == USART1) + { + p_uart = &com_uart1; + } + else if (huart->Instance == USART2) + { + p_uart = &com_uart2; + } + else if (huart->Instance == UART4) + { + p_uart = &com_uart4; + } + + // + if(huart->ErrorCode & HAL_UART_ERROR_NE) + { + // + __HAL_UART_CLEAR_NEFLAG(huart); + } + if(huart->ErrorCode & HAL_UART_ERROR_FE) + { + // ֡ + __HAL_UART_CLEAR_FEFLAG(huart); + } + // ... + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) + { + __HAL_UART_CLEAR_OREFLAG(huart); // ORE־ + } + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) + { + __HAL_UART_CLEAR_FEFLAG(huart); // ORE־ + } + +// + if(p_uart != NULL) + { +// HAL_UART_DeInit(huart); +// HAL_UART_Init(huart); +// HAL_UART_DMAStop(p_Uart->Uart); + HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len); + } +} + +// ʵֿжϻص +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) +{ + if (huart->Instance == USART1) + { + bsp_uart_rx_idle_int(&com_uart1); + } + else if (huart->Instance == USART2) + { + bsp_uart_rx_idle_int(&com_uart2); + } + else if (huart->Instance == UART4) + { + bsp_uart_rx_idle_int(&com_uart4); + } +} + +/* ڽɻص - ж */ +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ +// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) +// { +// __HAL_UART_CLEAR_IDLEFLAG(huart); + +// if (huart->Instance == USART1) +// { +// bsp_Uart_Rx_IdleInt(&COM_Uart1); +// } +// else if (huart->Instance == USART2) +// { +// bsp_Uart_Rx_IdleInt(&COM_Uart2); +// } +// else if (huart->Instance == UART4) +// { +// bsp_Uart_Rx_IdleInt(&COM_Uart4); +// } +// } +} + + +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + if (huart->Instance == USART1) + { + bsp_uart_tx_dma_tc_int(&com_uart1); + } + else if (huart->Instance == USART2) + { + bsp_uart_tx_dma_tc_int(&com_uart2); + } + else if (huart->Instance == UART4) + { + bsp_uart_tx_dma_tc_int(&com_uart2); + } +} + diff --git a/calib_board/usr/bsp/bsp_uart.h b/calib_board/usr/bsp/bsp_uart.h new file mode 100644 index 0000000..4a30e28 --- /dev/null +++ b/calib_board/usr/bsp/bsp_uart.h @@ -0,0 +1,70 @@ +#ifndef _BSP_UART_H_ +#define _BSP_UART_H_ + +#include "main.h" +#include "algo_queue.h" + +/****************************************** + * ṹ: bsp_uart_t + * : UARTƽṹ + * : UARTú״̬Ϣ +*******************************************/ +typedef struct bsp_uart_t bsp_uart_t; + +/* ض */ +#define usart_type UART_HandleTypeDef +#define dma_type DMA_HandleTypeDef + +/****************************************** + * ṹ: bsp_uart_relay_t + * : UARTתṹ + * : UARTת +*******************************************/ +typedef struct +{ + u8 flag; /* ת־λ */ + bsp_uart_t *uart; /* תȥĴָ */ + u16 time_out; /* תʱʱ */ +} bsp_uart_relay_t; + +struct bsp_uart_t +{ + queue rx_queue; /* ݽն */ + usart_type *uart; /* ھָ */ + + dma_type *tx_dma; /* DMA */ + dma_type *rx_dma; /* DMA */ + + u8 tx_dma_ch; /* DMAͨ */ + u8 rx_dma_ch; /* DMAͨ */ + vu8 tx_dma_complete_flag; /* DMAɱ־λ */ + + u8 *tx_addr; /* DMAͻַ */ + u8 *rx_addr; /* DMAջַ */ + u16 tx_dma_len; /* DMAͻ */ + u16 rx_dma_len; /* DMAջ */ + + u16 rx_len; /* յݳ */ + u16 rx_time_count; /* ʱ */ + u16 rx_time_over; /* ʱʱ */ + u8 rx_start_flag; /* ʼʱ־λ */ + + bsp_uart_relay_t relay; /* ת */ + + void (*init)(bsp_uart_t *); /* ʼָ */ + void (*send)(bsp_uart_t *, u8 *, u16); /* ڷͺָ */ + + void (*tx_dma_tc_int)(bsp_uart_t *); /* DMAжϴָ */ + + void (*rx_idle_int)(bsp_uart_t *); /* жϴָ */ + void (*rx_time_increment_int)(bsp_uart_t *, u16); /* жϼָ */ + void (*rx_data_analysis)(u8 *, u16, void *); /* ݽָ */ + void (*rx_task)(bsp_uart_t *); /* ڽָ */ +}; + +/* ⲿ */ +extern bsp_uart_t com_uart1; +extern bsp_uart_t com_uart2; +extern bsp_uart_t com_uart4; + +#endif diff --git a/calib_board/usr/bsp/tjc_usart_hmi.c b/calib_board/usr/bsp/tjc_usart_hmi.c deleted file mode 100644 index 4d2000f..0000000 --- a/calib_board/usr/bsp/tjc_usart_hmi.c +++ /dev/null @@ -1,1320 +0,0 @@ -#include "tjc_usart_hmi.h" -#include -#include -#include -#include - -#include "bsp_Flash.h" // Flash - -#define STR_LENGTH 100 - -// λṹ -typedef struct { - uint16_t Head; - uint16_t Tail; - uint16_t Length; - uint8_t Ring_data[RINGBUFF_LEN]; -} RingBuff_t; - -static RingBuff_t ringBuff; // һλ - -// ָ -static uint8_t command_buffer[MAX_COMMAND_LEN]; -static uint16_t cmd_index = 0; - -// COM_Uart2ָ룬ڷʴ -static bsp_Uart_t *p_TJC_Uart = NULL; - -// 豸б32豸 -static DeviceInfo device_list[32]; -static uint8_t device_count = 0; - -static uint8_t alarm_history_count = 6; - -/******************************************************** - TJC_CleanBufferFromInvalidPatterns -ܣ ӻλЧ04 FF FF FFģʽ -ֵ ֽ -**********************************************************/ -uint16_t TJC_CleanBufferFromInvalidPatterns(void) { - uint16_t cleaned_bytes = 0; - uint16_t buff_len = getRingBuffLength(); - - // ϲҲɾ04 FF FF FFģʽ - while (buff_len >= 4) { - // 鿴ǰ4ֽ - uint8_t pattern[4]; - for (uint8_t i = 0; i < 4; i++) { - pattern[i] = read1BFromRingBuff(i); - } - - // ǷΪ 04 FF FF FF ģʽ - if (pattern[0] == 0x04 && - pattern[1] == 0xFF && - pattern[2] == 0xFF && - pattern[3] == 0xFF) { - - // ɾ4ֽ - deleteRingBuff(4); - cleaned_bytes += 4; - buff_len = getRingBuffLength(); - } else { - // 04 FF FF FFģʽֹͣ - break; - } - } - - return cleaned_bytes; -} - - -/******************************************************** - TJC_Init -ܣ ʼTJC - pUart: ָbsp_Uart_tṹָ룬봮ͨ -**********************************************************/ -void TJC_Init(bsp_Uart_t *pUart) -{ - if (pUart == NULL) { - return; - } - - p_TJC_Uart = pUart; - initRingBuffer(); - - // ܴڵЧ - TJC_CleanBufferFromInvalidPatterns(); - - // ݽΪTJC - p_TJC_Uart->Rx_DataAnalysis = TJC_ProcessSerialData; - - // ʼ豸б - device_count = 0; - memset(device_list, 0, sizeof(device_list)); - - // ͳʼϢ - TJCPrintf("t0.txt=\"TJCʼ\""); -} - -/******************************************************** - TJC_SendData -ܣ 򴮿 - data: Ҫ͵ָ - len: ݳ -**********************************************************/ -void TJC_SendData(uint8_t *data, uint16_t len) { - if (p_TJC_Uart == NULL || data == NULL || len == 0) { - return; - } - - // ʹbsp_Uartģķͺ - p_TJC_Uart->Send(p_TJC_Uart, data, len); -} - -/******************************************************** - TJCPrintf -ܣ 򴮿͸ʽַԶ0xFF - ʽַͿɱ -**********************************************************/ -void TJCPrintf(const char *str, ...) { - if (p_TJC_Uart == NULL) { - return; - } - - char buffer[STR_LENGTH + 4]; // Ԥ30xFFλ - uint8_t end_bytes[3] = {0xFF, 0xFF, 0xFF}; - - va_list arg_ptr; - va_start(arg_ptr, str); - int len = vsnprintf(buffer, STR_LENGTH, str, arg_ptr); - va_end(arg_ptr); - - if (len > 0) { - // ͸ʽַ - p_TJC_Uart->Send(p_TJC_Uart, (uint8_t *)buffer, len); - // ͽ - p_TJC_Uart->Send(p_TJC_Uart, end_bytes, 3); - } -} - -/******************************************************** - TJC_SendResponse -ܣ Ӧ - response: Ӧַ -**********************************************************/ -void TJC_SendResponse(const char *response) { - TJCPrintf("%s", response); -} - -/******************************************************** - TJC_CheckEndBytes -ܣ ָ - data: ָ - len: ݳ - end_pos: λָ -ֵ 1: ҵ0: δҵ -**********************************************************/ -uint8_t TJC_CheckEndBytes(uint8_t *data, uint16_t len, uint16_t *end_pos) { - if (len < 3) return 0; - - // ӺǰҸЧ - for (uint16_t i = 0; i <= len - 3; i++) { - if (data[i] == 0xFF && data[i+1] == 0xFF && data[i+2] == 0xFF) { - *end_pos = i; - return 1; - } - } - return 0; -} - -/******************************************************** - CalculateCRC16 -ܣ MODBUS CRC16У - data: ָ - length: ݳ -ֵ CRC16У -**********************************************************/ -uint16_t CalculateCRC16(uint8_t *data, uint16_t length) { - uint16_t crc = 0xFFFF; - uint16_t i, j; - - for (i = 0; i < length; i++) { - crc ^= data[i]; - for (j = 0; j < 8; j++) { - if (crc & 0x0001) { - crc >>= 1; - crc ^= 0xA001; - } else { - crc >>= 1; - } - } - } - return crc; -} - -/******************************************************** - TJC_AddDeviceToFlash -ܣ 洢豸Ϣڴ飨Flash - data: ָ - len: ݳ -ֵ 1: ɹ0: ʧ -**********************************************************/ -uint8_t TJC_AddDeviceToFlash(uint8_t *data, uint16_t len) { - if (len < 6) { - //TJCPrintf("t0.txt=\"ָ̫\""); - return 0; - } - - DeviceInfo new_device; - uint8_t temp_buffer[50]; - uint8_t temp_index = 0; - - // ָͷ AA 55 - uint16_t i = 2; - - // 1: ˿ںţCOM1 - temp_index = 0; - while (i < len && data[i] != DATA_SEPARATOR) { - if (temp_index < sizeof(temp_buffer) - 1) { - temp_buffer[temp_index++] = data[i++]; - } else { - i++; - } - } - if (i >= len) { - //TJCPrintf("t0.txt=\"˿ںʧ\""); - return 0; - } - temp_buffer[temp_index] = '\0'; - - // ˿ںţ֧COM1ֱ - if (strncmp((char*)temp_buffer, "COM", 3) == 0) { - new_device.port = atoi((char*)temp_buffer + 3); - } else { - new_device.port = atoi((char*)temp_buffer); - } - - // ֤˿ںŷΧֻCOM1-COM4 - if (new_device.port < 1 || new_device.port > 4) { - TJCPrintf("t0.txt=\"˿ںЧ:%d(ֻ֧COM1-COM4)\"", new_device.port); - return 0; - } - - i++; // ָAA - - // 2: - temp_index = 0; - while (i < len && data[i] != DATA_SEPARATOR) { - if (temp_index < sizeof(temp_buffer) - 1) { - temp_buffer[temp_index++] = data[i++]; - } else { - i++; - } - } - if (i >= len) { - //TJCPrintf("t0.txt=\"ʧ\""); - return 0; - } - temp_buffer[temp_index] = '\0'; - strncpy(new_device.region, (char*)temp_buffer, sizeof(new_device.region) - 1); - new_device.region[sizeof(new_device.region) - 1] = '\0'; - - i++; // ָAA - - // 3: 豸ID - temp_index = 0; - while (i < len && data[i] != DATA_SEPARATOR) { - if (temp_index < sizeof(temp_buffer) - 1) { - temp_buffer[temp_index++] = data[i++]; - } else { - i++; - } - } - if (i >= len) { - //TJCPrintf("t0.txt=\"豸IDʧ\""); - return 0; - } - temp_buffer[temp_index] = '\0'; - new_device.device_id = atoi((char*)temp_buffer); - - // ֤豸IDΧ - if (new_device.device_id < 1 || new_device.device_id > 254) { - //TJCPrintf("t0.txt=\"豸IDЧ:%d\"", new_device.device_id); - return 0; - } - - i++; // ָAA - - // 4: 豸 - temp_index = 0; - while (i < len && data[i] != DATA_SEPARATOR) { - if (temp_index < sizeof(temp_buffer) - 1) { - temp_buffer[temp_index++] = data[i++]; - } else { - i++; - } - } - if (temp_index == 0) { - //TJCPrintf("t0.txt=\"豸ʧ\""); - return 0; - } - temp_buffer[temp_index] = '\0'; - strncpy(new_device.device_name, (char*)temp_buffer, sizeof(new_device.device_name) - 1); - new_device.device_name[sizeof(new_device.device_name) - 1] = '\0'; - - // ʼ豸״̬Ϊ - new_device.leak_status = LEAK_NORMAL; - new_device.break_status = BREAK_NORMAL; - new_device.comm_status = COMM_STATUS_NORMAL; - - // ʾ -// TJCPrintf("t0.txt=\"ɹ\""); -// TJCPrintf("t1.txt=\"˿:%d :%s\"", new_device.port, new_device.region); -// TJCPrintf("t2.txt=\"ID:%d :%s\"", new_device.device_id, new_device.device_name); - - // ǷѴͬID豸 - for (uint8_t j = 0; j < device_count; j++) { - if (device_list[j].device_id == new_device.device_id) { - // 豸 - device_list[j] = new_device; - //TJCPrintf("t3.txt=\"豸%dѸ\"", new_device.device_id); - return 1; - } - } - - // 豸ڴ - if (device_count < 32) { - device_list[device_count] = new_device; - device_count++; - //TJCPrintf("t3.txt=\"豸%dӳɹ\"", new_device.device_id); - //TJCPrintf("t4.txt=\"豸:%d\"", device_count); - return 1; - } else { - //TJCPrintf("t3.txt=\"豸б\""); - return 0; - } -} - - -/******************************************************** - TJC_SendDeviceList -ܣ 豸б豸 -˵ 豸Ϣʾt1_1t8_4ı - ÿ豸ռ4ı򣬸ʽ£ - - tX_1: - - tX_2: ˿ں - - tX_3: 豸ID - - tX_4: 豸 - X18ֱӦ18豸 - ʾ8豸 -**********************************************************/ -void TJC_SendDeviceList(void) { - // ıt1_1t8_4 - for (int row = 1; row <= 8; row++) { - for (int col = 1; col <= 4; col++) { - TJCPrintf("t%d_%d.txt=\"\"", row, col); - - // ÿռıӳ - if ((row * col) % 4 == 0) { - HAL_Delay(5); - } - } - } - - HAL_Delay(100); - - if (device_count == 0) { - // û豸ʾʾϢ - TJCPrintf("t1_1.txt=\"豸\""); - TJCPrintf("t0.txt=\"豸бΪ\""); - HAL_Delay(300); - TJCPrintf("t0.txt=\"\""); - return; - } - - // Ҫʾ豸8 - uint8_t display_count = (device_count > 8) ? 8 : device_count; - - // ʾ豸Ϣ - for (uint8_t i = 0; i < display_count; i++) { - DeviceInfo *device = &device_list[i]; - - // кţ1ʼ - int row = i + 1; - - // tX_1: - TJCPrintf("t%d_1.txt=\"%s\"", row, device->region); - HAL_Delay(10); - - // tX_2: ˿ںţʾΪCOMxʽ - TJCPrintf("t%d_2.txt=\"COM%d\"", row, device->port); - HAL_Delay(10); - - // tX_3: 豸ID - TJCPrintf("t%d_3.txt=\"%d\"", row, device->device_id); - HAL_Delay(10); - - // tX_4: 豸 - TJCPrintf("t%d_4.txt=\"%s\"", row, device->device_name); - HAL_Delay(10); - - // ÿʾһ豸ȴ - HAL_Delay(20); - } -} - -/******************************************************** - TJC_SendRegionStats -ܣ ͳϢ -˵ ͳÿ豸͸ֱ - t1_1ʾt1_2ʾ豸 - t1_3ʾ©Һt1_4ʾϴt1_5ʾͨѶ쳣 - ʾ4t1_1-t4_5 -**********************************************************/ -void TJC_SendRegionStats(void) { - HAL_Delay(100); - - if (device_count == 0) { - TJCPrintf("t1_1.txt=\"豸\""); - return; - } - - // ͳÿϢ - RegionStats region_stats[10]; - uint8_t region_count = 0; - - // ʼͳ - for (uint8_t i = 0; i < device_count; i++) { - DeviceInfo *device = &device_list[i]; - uint8_t found = 0; - - // ǷѴڸͳϢ - for (uint8_t j = 0; j < region_count; j++) { - if (strcmp(region_stats[j].region_name, device->region) == 0) { - found = 1; - // ¸ͳϢ - region_stats[j].total_devices++; - - if (device->leak_status == LEAK_ABNORMAL) { - region_stats[j].leak_devices++; - } - - if (device->break_status == BREAK_ABNORMAL) { - region_stats[j].break_devices++; - } - - if (device->comm_status == COMM_STATUS_ABNORMAL) { - region_stats[j].comm_devices++; - } - break; - } - } - - // 򲻴ڣµͳ - if (!found && region_count < 10) { - strncpy(region_stats[region_count].region_name, device->region, 19); - region_stats[region_count].region_name[19] = '\0'; - - region_stats[region_count].total_devices = 1; - - // ʼ - region_stats[region_count].leak_devices = (device->leak_status == LEAK_ABNORMAL) ? 1 : 0; - region_stats[region_count].break_devices = (device->break_status == BREAK_ABNORMAL) ? 1 : 0; - region_stats[region_count].comm_devices = (device->comm_status == COMM_STATUS_ABNORMAL) ? 1 : 0; - - region_count++; - } - } - - // Ҫʾ4 - uint8_t display_count = (region_count > 4) ? 4 : region_count; - - // ʾͳϢ - for (uint8_t i = 0; i < display_count; i++) { - RegionStats *stats = ®ion_stats[i]; - - // кţ1ʼ - int row = i + 1; - - // - TJCPrintf("t%d_1.txt=\"%s\"", row, stats->region_name); - HAL_Delay(10); - - // 豸 - TJCPrintf("t%d_2.txt=\"%d\"", row, stats->total_devices); - HAL_Delay(10); - - // ©Һ豸 - TJCPrintf("t%d_3.txt=\"%d\"", row, stats->leak_devices); - HAL_Delay(10); - - // ϴ豸 - TJCPrintf("t%d_4.txt=\"%d\"", row, stats->break_devices); - HAL_Delay(10); - - // ͨ쳣豸 - TJCPrintf("t%d_5.txt=\"%d\"", row, stats->comm_devices); - HAL_Delay(10); - - // ÿʾһȴ - HAL_Delay(30); - } -} - -/******************************************************** - TJC_SendRegionDeviceDetails -ܣ ָ豸鵽 - region_index: 1-4Ӧͬ -˵ ʾʽ - ÿ豸ʾ15ı - - tX_1: 豸ID - - tX_2: 豸 - - tX_3: ͨ״̬/쳣 - - tX_4-tX_6: һͨ״̬©Һ/ϴ/©Һλã - - tX_7-tX_9: ڶͨ״̬©Һ/ϴ/©Һλã - - tX_10-tX_12: ͨ״̬©Һ/ϴ/©Һλã - - tX_13-tX_15: ĸͨ״̬©Һ/ϴ/©Һλã - һʾ4豸ֱʾڣ - t1_1-t1_15: һ豸 - t2_1-t2_15: ڶ豸 - t3_1-t3_15: 豸 - t4_1-t4_15: ĸ豸 -**********************************************************/ -void TJC_SendRegionDeviceDetails(uint8_t region_index) { - // ıt1_1t4_15 - for (int row = 1; row <= 4; row++) { - for (int col = 1; col <= 15; col++) { - TJCPrintf("t%d_%d.txt=\"\"", row, col); - if ((row * col) % 4 == 0) { - HAL_Delay(5); - } - } - } - - HAL_Delay(100); - - // Ƿ豸 - if (device_count == 0) { - TJCPrintf("t1_1.txt=\"豸\""); - return; - } - - // ȡвͬ - char region_names[10][20]; - uint8_t region_count = 0; - - for (uint8_t i = 0; i < device_count && region_count < 10; i++) { - DeviceInfo *device = &device_list[i]; - uint8_t found = 0; - - for (uint8_t j = 0; j < region_count; j++) { - if (strcmp(region_names[j], device->region) == 0) { - found = 1; - break; - } - } - - if (!found) { - strncpy(region_names[region_count], device->region, 19); - region_names[region_count][19] = '\0'; - region_count++; - } - } - - // ǷЧ - if (region_index < 1 || region_index > region_count) { - TJCPrintf("t1_1.txt=\"Ч\""); - return; - } - - // ȡָ豸4 - uint8_t region_devices[4]; - uint8_t region_device_count = 0; - - for (uint8_t i = 0; i < device_count && region_device_count < 4; i++) { - DeviceInfo *device = &device_list[i]; - if (strcmp(device->region, region_names[region_index-1]) == 0) { - region_devices[region_device_count] = i; - region_device_count++; - } - } - - // ʾ豸 - for (uint8_t i = 0; i < region_device_count; i++) { - DeviceInfo *device = &device_list[region_devices[i]]; - - // кţ1ʼ - int row = i + 1; - - // 豸Ϣ - TJCPrintf("t%d_1.txt=\"%d\"", row, device->device_id); - HAL_Delay(10); - - TJCPrintf("t%d_2.txt=\"%s\"", row, device->device_name); - HAL_Delay(10); - - // ͨ״̬ - const char *comm_status_str; - switch (device->comm_status) { - case COMM_STATUS_NORMAL: - comm_status_str = ""; - break; - case COMM_STATUS_ABNORMAL: - comm_status_str = "쳣"; - break; - default: - comm_status_str = "δ֪"; - break; - } - TJCPrintf("t%d_3.txt=\"%s\"", row, comm_status_str); - HAL_Delay(10); - - // 4ͨ״̬ - for (int channel = 0; channel < 4; channel++) { - int base_col = 4 + channel * 3; - - // ©Һ״̬ - const char *leak_status_str; - switch (device->channels[channel].leak_status) { - case LEAK_NORMAL: - leak_status_str = ""; - break; - case LEAK_ABNORMAL: - leak_status_str = "©Һ"; - break; - default: - leak_status_str = "-"; - break; - } - TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col, leak_status_str); - HAL_Delay(5); - - // ϴ״̬ - const char *break_status_str; - switch (device->channels[channel].break_status) { - case BREAK_NORMAL: - break_status_str = ""; - break; - case BREAK_ABNORMAL: - break_status_str = "ϴ"; - break; - default: - break_status_str = "-"; - break; - } - TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col + 1, break_status_str); - HAL_Delay(5); - - // ©Һλ - char leak_meter_str[10]; - if (device->channels[channel].leak_status == LEAK_ABNORMAL) { - sprintf(leak_meter_str, "%d", device->channels[channel].leak_meter); - } else { - sprintf(leak_meter_str, "0"); - } - TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col + 2, leak_meter_str); - HAL_Delay(5); - } - - // ÿʾһ豸ȴ - HAL_Delay(30); - } -} - -/******************************************************** - TJC_ProcessDeleteCommand -ܣ ɾ豸ָ - cmd: ָ - len: ָ -˵ ָʽAA 55 04 [8ѡб־ֽ] [CRCֽ] [CRCֽ] - ÿѡб־ֽڣ00ʾδѡУ01ʾѡɾ - һɾ8豸 -**********************************************************/ -void TJC_ProcessDeleteCommand(uint8_t *cmd, uint16_t len) { - if (len != 13) { - // ӵϢ - char debug_msg[50]; - sprintf(debug_msg, "t0.txt=\"ɾָȴ:%d\"", len); - TJCPrintf(debug_msg); - HAL_Delay(300); - TJCPrintf("t0.txt=\"\""); - return; - } - - // 鹦Ƿȷ - if (cmd[2] != CMD_DELETE_DEVICE) { - TJCPrintf("t0.txt=\"ɾ\""); - HAL_Delay(300); - TJCPrintf("t0.txt=\"\""); - return; - } - - // ȡ8ѡб־ֽڣӵ3ֽڿʼ - uint8_t delete_flags[8]; - for (int i = 0; i < 8; i++) { - delete_flags[i] = cmd[3 + i]; - } - - // ִɾ - TJC_DeleteDevices(delete_flags, 8); -} - -/******************************************************** - findDeviceCmdLength -ܣ 豸ָij -ֵ ָȣ0ʾȲ -˵ ͨAAָȷָ -**********************************************************/ -uint16_t findDeviceCmdLength(void) { - uint16_t buff_len = getRingBuffLength(); - - if (buff_len < 10) { // С - return 0; - } - - uint8_t aa_count = 0; - uint16_t last_aa_pos = 0; - - // ӵֽڿʼAAָ - for (uint16_t i = 2; i < buff_len; i++) { - uint8_t byte = read1BFromRingBuff(i); - - if (byte == DATA_SEPARATOR) { - aa_count++; - last_aa_pos = i; - - // 豸ָҪ4AAָ - if (aa_count >= 4) { - // Ƿ㹻ĿռCRC2ֽڣ - if (last_aa_pos + 3 <= buff_len) { - return last_aa_pos + 3; // AACRC - } - } - } - } - - return 0; // ûҵָ -} - -/******************************************************** - TJC_DeleteDevices -ܣ ѡб־ɾ豸 - delete_flags: ѡб־ - flag_count: ־ -˵ ɾdevice_listе豸device_count - ֧һɾ豸 -**********************************************************/ -void TJC_DeleteDevices(uint8_t *delete_flags, uint8_t flag_count) { - if (device_count == 0) { - //TJCPrintf("t0.txt=\"豸ɾ\""); - return; - } - - // ͳҪɾ豸 - uint8_t delete_count = 0; - uint8_t to_delete[32] = {0}; // Ҫɾ豸 - - // ־飬Ҫɾ豸 - // ע⣺flag_countͨΪ8Ӧǰʾ8豸 - for (uint8_t i = 0; i < flag_count && i < device_count; i++) { - if (delete_flags[i] == 0x01) { - to_delete[i] = 1; - delete_count++; - } - } - - if (delete_count == 0) { - //TJCPrintf("t0.txt=\"δѡ豸\""); - return; - } - - // Ӻǰɾ - uint8_t new_device_count = 0; - DeviceInfo temp_list[32]; - - // δɾ豸ʱ - for (uint8_t i = 0; i < device_count; i++) { - // 鵱ǰ豸Ƿɾб - uint8_t should_delete = 0; - - // ֻǰflag_count豸Ӧʾ豸 - if (i < flag_count && to_delete[i] == 1) { - should_delete = 1; - } - - if (!should_delete) { - // 豸 - temp_list[new_device_count] = device_list[i]; - new_device_count++; - } - } - - // 豸б - device_count = new_device_count; - for (uint8_t i = 0; i < device_count; i++) { - device_list[i] = temp_list[i]; - } - - // ʣλ - for (uint8_t i = device_count; i < 32; i++) { - memset(&device_list[i], 0, sizeof(DeviceInfo)); - } - -// // ʾɾ -// char msg[50]; -// sprintf(msg, "t0.txt=\"ɾ%d豸\"", delete_count); -// TJCPrintf(msg); -// HAL_Delay(300); -} - -/******************************************************** - TJC_ProcessCustomCommand -ܣ Զָ - cmd: ָ - len: ָ -**********************************************************/ -void TJC_ProcessCustomCommand(uint8_t *cmd, uint16_t len) { - if (len < 6) { - return; // ָȲ - } - - // ָ֤ͷ - if (cmd[0] != CUSTOM_CMD_HEADER_0 || cmd[1] != CUSTOM_CMD_HEADER_1) { - return; // ָͷ - } - - // ȡCRCֽڣ - uint16_t received_crc = (cmd[len-1] << 8) | cmd[len-2]; - - // CRCCRC - uint16_t calculated_crc = CalculateCRC16(cmd, len-2); - - // УCRC - if (received_crc != calculated_crc) { - // CRC󣬺ָ - return; - } - - // жָ - uint8_t cmd_type = cmd[2]; // ֽΪ - - // 豸ָֽ'C' = 0x43 - if (cmd_type == ADD_DEVICE_CMD_BYTE) { - // 豸ָ - if (TJC_AddDeviceToFlash(cmd, len)) { - TJCPrintf("b2.txt=\"add suc\""); - } - return; - } - - // ɾ豸ָΪ0x04 - if (cmd_type == CMD_DELETE_DEVICE) { - // ɾ豸ָ - TJC_ProcessDeleteCommand(cmd, len); - return; - } - - // DZ׼ָ6ֽڳȣ - if (len == 6) { - uint8_t sub_cmd = cmd[3]; // ĸֽΪ - - // ݹ - switch (cmd_type) { - case CMD_DISPLAY_DATA: // 0x02 ʾ - switch (sub_cmd) { - case SUB_CMD_SHOW_DEVICES: // 0x01 ʾӵ豸 - TJC_SendDeviceList(); - break; - - case SUB_CMD_REGION_STATS: // 0x02 ʾ - TJC_SendRegionStats(); - break; - - case SUB_CMD_REGION1_DEVICES: // 0x03 һ豸 - TJC_SendRegionDeviceDetails(1); - break; - - case SUB_CMD_REGION2_DEVICES: // 0x04 ڶ豸 - TJC_SendRegionDeviceDetails(2); - break; - - case SUB_CMD_REGION3_DEVICES: // 0x05 豸 - TJC_SendRegionDeviceDetails(3); - break; - - case SUB_CMD_REGION4_DEVICES: // 0x06 ĸ豸 - TJC_SendRegionDeviceDetails(4); - break; - - default: - // δ֪ - break; - } - break; - - case CMD_ALARM: // 0x03 - switch (sub_cmd) { - case SUB_CMD_HISTORY_ALARM: // 0x01 ʷ - TJC_SendInitCommands(); - break; - - case SUB_CMD_REALTIME_ALARM: // 0x02 ʵʱ - TJC_SendRealtimeAlarms(); - break; - - default: - // δ֪ - break; - } - break; - - default: - // δ֪룬ָ - break; - } - } else { - // 6ֽڵı׼ָ - } -} - - -/******************************************************** - TJC_ProcessCommand -ܣ ָ - cmd: ָ - len: ָ -**********************************************************/ -void TJC_ProcessCommand(uint8_t *cmd, uint16_t len) { - // ָΪգֱӷ - if (len == 0) return; - - // ȼǷΪԶָAA 55ͷ - if (len >= 3 && cmd[0] == CUSTOM_CMD_HEADER_0 && cmd[1] == CUSTOM_CMD_HEADER_1) { - TJC_ProcessCustomCommand(cmd, len); - return; - } -} - -/******************************************************** - TJC_ProcessSerialData -ܣ ڽյ - data: յ - len: ݳ - p_arg: ָ -**********************************************************/ -void TJC_ProcessSerialData(u8 *data, u16 len, void *p_arg) { - // յд뻷λ - for (uint16_t i = 0; i < len; i++) { - writeRingBuff(data[i]); - } - - // ѭе - while (1) { - uint16_t buff_len = getRingBuffLength(); - - // ݲ3ֽڣAA 55 룩˳ - if (buff_len < 3) { - break; - } - - // ǰֽǷΪ AA 55 - uint8_t first_byte = read1BFromRingBuff(0); - uint8_t second_byte = read1BFromRingBuff(1); - - // 1 AA 55ɾһֽڼ - if (first_byte != CUSTOM_CMD_HEADER_0 || second_byte != CUSTOM_CMD_HEADER_1) { - deleteRingBuff(1); // ɾһֽ - continue; // һֽ - } - - // ȡ루ֽڣ - uint8_t cmd_type = read1BFromRingBuff(2); - - // ǷΪ֪ - uint8_t valid_cmd = 0; - if (cmd_type == ADD_DEVICE_CMD_BYTE || // 豸 - cmd_type == CMD_DISPLAY_DATA || // ʾ - cmd_type == CMD_ALARM || // - cmd_type == CMD_DELETE_DEVICE) { // ɾ豸 - valid_cmd = 1; - } - - // 2δ֪룬ɾ AA 55 ֽ - if (!valid_cmd) { - deleteRingBuff(2); // ɾ AA 55 - continue; // - } - - // ȷָ - uint16_t cmd_length = 0; - if (cmd_type == ADD_DEVICE_CMD_BYTE) { - // 豸ָɱ䳤ȣҪҽλ - cmd_length = findDeviceCmdLength(); - if (cmd_length == 0) { - // Ȳ㣬ȴ - break; - } - } else if (cmd_type == CMD_DISPLAY_DATA || cmd_type == CMD_ALARM) { - cmd_length = 6; // ̶6ֽ - } else if (cmd_type == CMD_DELETE_DEVICE) { - cmd_length = 13; // ̶13ֽ - } - - // 鳤Ƿ㹻 - if (buff_len < cmd_length) { - // ݲ㣬ȴ - break; - } - - // ȡָ - uint8_t command_buffer[MAX_COMMAND_LEN]; - for (uint16_t i = 0; i < cmd_length; i++) { - command_buffer[i] = read1BFromRingBuff(i); - } - - // 3CRCУʧܣɾָ - uint16_t received_crc = (command_buffer[cmd_length-1] << 8) | - command_buffer[cmd_length-2]; - uint16_t calculated_crc = CalculateCRC16(command_buffer, cmd_length-2); - - if (received_crc != calculated_crc) { - deleteRingBuff(cmd_length); // CRCɾָ - continue; // - } - - // мͨЧָ - TJC_ProcessCommand(command_buffer, cmd_length); - - // ɾѴָ - deleteRingBuff(cmd_length); - } -} - -/******************************************************** - initRingBuffer -ܣ ʼλ -**********************************************************/ -void initRingBuffer(void) { - ringBuff.Head = 0; - ringBuff.Tail = 0; - ringBuff.Length = 0; - memset(ringBuff.Ring_data, 0, RINGBUFF_LEN); - cmd_index = 0; -} - -/******************************************************** - writeRingBuff -ܣ λд - data: Ҫд -**********************************************************/ -void writeRingBuff(uint8_t data) { - if (ringBuff.Length >= RINGBUFF_LEN) { - // ɵ - ringBuff.Head = (ringBuff.Head + 1) % RINGBUFF_LEN; - ringBuff.Length--; - } - - ringBuff.Ring_data[ringBuff.Tail] = data; - ringBuff.Tail = (ringBuff.Tail + 1) % RINGBUFF_LEN; - ringBuff.Length++; -} - -/******************************************************** - deleteRingBuff -ܣ ɾλָȵ - size: Ҫɾݳ -**********************************************************/ -void deleteRingBuff(uint16_t size) { - if (size >= ringBuff.Length) { - initRingBuffer(); - return; - } - - for (int i = 0; i < size; i++) { - if (ringBuff.Length == 0) { - break; - } - ringBuff.Head = (ringBuff.Head + 1) % RINGBUFF_LEN; - ringBuff.Length--; - } -} - -/******************************************************** - read1BFromRingBuff -ܣ ӻλȡָλõ - position: ȡλãHeadƫƣ -ֵ ȡ -**********************************************************/ -uint8_t read1BFromRingBuff(uint16_t position) { - if (position >= ringBuff.Length) { - return 0; - } - - uint16_t realPosition = (ringBuff.Head + position) % RINGBUFF_LEN; - return ringBuff.Ring_data[realPosition]; -} - -/******************************************************** - getRingBuffLength -ܣ ȡλеݳ -ֵ еݳ -**********************************************************/ -uint16_t getRingBuffLength(void) { - return ringBuff.Length; -} - -/******************************************************** - isRingBuffOverflow -ܣ 黷λǷ -ֵ 1: 0: δ -**********************************************************/ -uint8_t isRingBuffOverflow(void) { - return (ringBuff.Length >= RINGBUFF_LEN); -} - -/*Էʷ*/ -void TJC_SendInitCommands(void) -{ - HAL_Delay(100); - for (int row = 1; row <= 15; row++) { - char region[10]; - char fault_type[10]; - char start_time[20]; - char end_time[20]; - char device_id[10]; - - // кɲͬ - if (row <= 5) { - strcpy(region, "LH"); - } else if (row <= 10) { - strcpy(region, "SH"); - } else { - strcpy(region, "BJ"); - } - - // ͽ - if (row % 2 == 0) { - strcpy(fault_type, "©Һ"); - } else { - strcpy(fault_type, "ϴ"); - } - - // 豸IDλ㲹0 - sprintf(device_id, "%02d", row); - - // ڣ2026-01-19ʼ - int day = 19 + (row - 1) % 30; // 1-31 - int month = 1 + (row - 1) / 30; // ·ݵ - - // ʼʱ - int start_hour = 8 + (row - 1) / 6; // ÿ6Сʱ1 - int start_minute = (row * 3) % 60; - if (start_hour >= 24) start_hour = 23; // ֹСʱ - - sprintf(start_time, "2026-%02d-%02d %02d:%02d", - month, day, start_hour, start_minute); - - // ʱ䣨ʼʱ+2Сʱ - int end_hour = start_hour + 2; - int end_minute = start_minute + 15; - if (end_minute >= 60) { - end_minute -= 60; - end_hour++; - } - if (end_hour >= 24) { - end_hour = 23; - end_minute = 59; - } - - sprintf(end_time, "2026-%02d-%02d %02d:%02d", - month, day, end_hour, end_minute); - - // ͵1У - TJCPrintf("t%d_1.txt=\"%s\"", row, region); - HAL_Delay(5); - - // ͵2УID - TJCPrintf("t%d_2.txt=\"%s\"", row, device_id); - HAL_Delay(5); - - // ͵3У豸 - TJCPrintf("t%d_3.txt=\"HK\"", row); - HAL_Delay(5); - - // ͵4У - TJCPrintf("t%d_4.txt=\"%s\"", row, fault_type); - HAL_Delay(5); - - // ͵5Уʼʱ - TJCPrintf("t%d_5.txt=\"%s\"", row, start_time); - HAL_Delay(5); - - // ͵6Уʱ - TJCPrintf("t%d_6.txt=\"%s\"", row, end_time); - HAL_Delay(5); - - // ÿһУ΢ȴһ - HAL_Delay(20); - } - -} - -/******************************************************** - TJC_SendRealtimeAlarms -ܣ ʵʱݵ -˵ ¸ʽʾ - t1_1: Ӣģ - t1_2: 豸ID (1-254) - t1_3: 豸ƣӢģ - t1_4: ͨ״̬/쳣 - t1_5-t1_16: ÿ3Ϊһ飬4飬ÿʾ - 1©Һ״̬/©Һ - 2ϴ״̬/ϴ - 3©Һ©Һʾʾ0ף -**********************************************************/ -void TJC_SendRealtimeAlarms(void) { - HAL_Delay(50); - - // ʾ豸ݣʵʹʱӦô豸блȡ - DeviceInfo device_info = { - .port = 1, - .region = "SH", - .device_id = 25, - .device_name = "HK001" - }; - - CommStatus comm_status = COMM_STATUS_NORMAL; - - // ʾ4ͨ״̬ - ChannelStatus channel_status[4] = { - {LEAK_NORMAL, BREAK_ABNORMAL, 0}, // CH1: , ϴ, 0 - {LEAK_ABNORMAL, BREAK_NORMAL, 3}, // CH2: ©Һ, , 3 - {LEAK_NORMAL, BREAK_NORMAL, 0}, // CH3: , , 0 - {LEAK_ABNORMAL, BREAK_NORMAL, 4} // CH4: ©Һ, , 4 - }; - - // t1_1: - TJCPrintf("t1_1.txt=\"%s\"", device_info.region); - HAL_Delay(10); - - // t1_2: 豸ID - TJCPrintf("t1_2.txt=\"%d\"", device_info.device_id); - HAL_Delay(10); - - // t1_3: 豸 - TJCPrintf("t1_3.txt=\"%s\"", device_info.device_name); - HAL_Delay(10); - - // t1_4: ͨ״̬ - const char *comm_status_str; - switch (comm_status) { - case COMM_STATUS_NORMAL: - comm_status_str = ""; - break; - case COMM_STATUS_ABNORMAL: - comm_status_str = "쳣"; - break; - default: - comm_status_str = "δ֪"; - break; - } - TJCPrintf("t1_4.txt=\"%s\"", comm_status_str); - HAL_Delay(10); - - // 2. 4ͨ״̬ (t1_5 t1_16) - // ÿͨռ3ı - for (int channel = 0; channel < 4; channel++) { - ChannelStatus *ch = &channel_status[channel]; - - // ıʼ - int base_index = 5 + channel * 3; - - // һı©Һ״̬ - const char *leak_status_str; - switch (ch->leak_status) { - case LEAK_NORMAL: - leak_status_str = ""; - break; - case LEAK_ABNORMAL: - leak_status_str = "©Һ"; - break; - default: - leak_status_str = "δ֪"; - break; - } - TJCPrintf("t1_%d.txt=\"%s\"", base_index, leak_status_str); - HAL_Delay(5); - - // ڶı򣺶ϴ״̬ - const char *break_status_str; - switch (ch->break_status) { - case BREAK_NORMAL: - break_status_str = ""; - break; - case BREAK_ABNORMAL: - break_status_str = "ϴ"; - break; - default: - break_status_str = "δ֪"; - break; - } - TJCPrintf("t1_%d.txt=\"%s\"", base_index + 1, break_status_str); - HAL_Delay(5); - - // ı©Һλ - char leak_meter_str[10]; - if (ch->leak_status == LEAK_ABNORMAL) { - sprintf(leak_meter_str, "%d", ch->leak_meter); - } else { - sprintf(leak_meter_str, "0"); - } - TJCPrintf("t1_%d.txt=\"%s\"", base_index + 2, leak_meter_str); - HAL_Delay(5); - } -} - -// ݾɴĺ궨 -#define usize getRingBuffLength() -#define code_c() initRingBuffer() -#define udelete(x) deleteRingBuff(x) -#define u(x) read1BFromRingBuff(x) diff --git a/calib_board/usr/bsp/tjc_usart_hmi.h b/calib_board/usr/bsp/tjc_usart_hmi.h deleted file mode 100644 index b2abdc6..0000000 --- a/calib_board/usr/bsp/tjc_usart_hmi.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef __TJCUSARTHMI_H_ -#define __TJCUSARTHMI_H_ - -#include "stm32f4xx.h" -#include "main.h" // HAL ͷļ -#include "bsp_Uart.h" -#include "bsp_Flash.h" // Flash֧ - -// ʹõĴھmain.cжhuart2 -extern UART_HandleTypeDef huart2; - -// 崮ʹõĴ -#define TJC_UART huart2 - -// λ -#define RINGBUFF_LEN (500) - -// ָTJCЭ飩 -#define TJC_END_BYTES 0xFF - -// ָ -#define MAX_COMMAND_LEN 200 // ӳӦ豸Ϣ - -// Զָ -#define CUSTOM_CMD_HEADER_0 0xAA -#define CUSTOM_CMD_HEADER_1 0x55 - -// ָ -#define CMD_DISPLAY_DATA 0x02 // ʾ -#define CMD_ALARM 0x03 // -#define CMD_DELETE_DEVICE 0x04 // ɾ豸 - -// ʾ -#define SUB_CMD_SHOW_DEVICES 0x01 // ʾӵ豸 -#define SUB_CMD_REGION_STATS 0x02 // ʾ -#define SUB_CMD_REGION1_DEVICES 0x03 // һ豸 -#define SUB_CMD_REGION2_DEVICES 0x04 // ڶ豸 -#define SUB_CMD_REGION3_DEVICES 0x05 // 豸 -#define SUB_CMD_REGION4_DEVICES 0x06 // ĸ豸 - -// -#define SUB_CMD_HISTORY_ALARM 0x01 // ʷ -#define SUB_CMD_REALTIME_ALARM 0x02 // ʵʱ - -// 豸ָʶ -#define ADD_DEVICE_CMD_BYTE 0x43 // 'C'ASCII - -// ָ -#define DATA_SEPARATOR 0xAA - -// ͨ״̬ö -typedef enum { - COMM_STATUS_NORMAL = 0, // - COMM_STATUS_ABNORMAL // 쳣 -} CommStatus; - -// ©Һ״̬ö -typedef enum { - LEAK_NORMAL = 0, // - LEAK_ABNORMAL // ©Һ -} LeakStatus; - -// ϴ״̬ö -typedef enum { - BREAK_NORMAL = 0, // - BREAK_ABNORMAL // ϴ -} BreakStatus; - -// ͨ״̬ṹ -typedef struct { - LeakStatus leak_status; // ©Һ״̬ - BreakStatus break_status; // ϴ״̬ - int leak_meter; // ©Һ©Һ״̬Ϊ©Һʾʾ0 -} ChannelStatus; - -// ö -typedef enum { - ALARM_LEAK = 0, // ©Һ - ALARM_BREAK, // ϴ - ALARM_COMM // ͨ쳣 -} AlarmType; - -// 豸Ϣṹ -typedef struct { - uint8_t port; // ˿ں - char region[20]; // Ӣģ - uint8_t device_id; // 豸ID (1-254) - char device_name[20]; // 豸Ӣģ - LeakStatus leak_status; // ©Һ״̬ - BreakStatus break_status; // ϴ״̬ - CommStatus comm_status; // ͨ״̬ - ChannelStatus channels[4]; // ĸͨ״̬ -} DeviceInfo; - -// Ϣṹ -typedef struct { - char region[20]; // 豸 - uint8_t device_id; // 豸ID - char device_name[20]; // 豸 - AlarmType alarm_type; // - char start_time[20]; // ʼʱ - char end_time[20]; // ʱ -} AlarmInfo; - -// ͳƽṹ -typedef struct { - char region_name[20]; // - uint8_t total_devices; // 豸 - uint8_t leak_devices; // ©Һ豸 - uint8_t break_devices; // ϴ豸 - uint8_t comm_devices; // ͨ쳣豸 -} RegionStats; - -// ⲿɵú -void TJC_Init(bsp_Uart_t *pUart); -void TJC_SendData(uint8_t *data, uint16_t len); -void TJCPrintf(const char *cmd, ...); - -// λغ -uint16_t TJC_CleanBufferFromInvalidPatterns(void); -void initRingBuffer(void); -void writeRingBuff(uint8_t data); -void deleteRingBuff(uint16_t size); -uint16_t getRingBuffLength(void); -uint8_t read1BFromRingBuff(uint16_t position); -uint8_t isRingBuffOverflow(void); - -// ָغ -void TJC_ProcessCommand(uint8_t *cmd, uint16_t len); -uint8_t TJC_CheckEndBytes(uint8_t *data, uint16_t len, uint16_t *end_pos); -void TJC_SendResponse(const char *response); -void TJC_ProcessSerialData(u8 *data, u16 len, void *p_arg); -void TJC_DeleteDevices(uint8_t *delete_flags, uint8_t flag_count); -void TJC_ProcessDeleteCommand(uint8_t *cmd, uint16_t len); - -/*Էʷ*/ -void TJC_SendInitCommands(void); - -// -uint16_t CalculateCRC16(uint8_t *data, uint16_t length); -void TJC_ProcessCustomCommand(uint8_t *cmd, uint16_t len); -void TJC_SendAlarmHistory(void); -void TJC_SendRealtimeAlarms(void); -void TJC_SendDeviceList(void); -uint8_t TJC_AddDeviceToFlash(uint8_t *data, uint16_t len); -void TJC_SendRegionStats(void); // ͳ -void TJC_SendRegionDeviceDetails(uint8_t region_index); - -// 궨 -#define usize getRingBuffLength() -#define code_c() initRingBuffer() -#define udelete(x) deleteRingBuff(x) -#define u(x) read1BFromRingBuff(x) - -#endif diff --git a/calib_board/usr/gui/gui_tjc_hmi.c b/calib_board/usr/gui/gui_tjc_hmi.c new file mode 100644 index 0000000..1ca4371 --- /dev/null +++ b/calib_board/usr/gui/gui_tjc_hmi.c @@ -0,0 +1,604 @@ +#include "GUI_tjc_hmi.h" +#include +#include +#include +#include + +#include "proto_modbus_lib.h" + + +#include "bsp_Flash.h" // Flash +#include "bsp_uart.h" + +#include "app_leakage.h" + +/*ڷͻ*/ +#define HMI_TX_BUFFER_NUM (2048) +/*ַƴ */ +#define GUI_TJC_HMI_TEXT_BUFFER_NUM (256) + +/*֡ͷ*/ +#define HMI_PROTO_FRAME_HEADER1 (0xAA) +#define HMI_PROTO_FRAME_HEADER2 (0x55) +/**/ +#define HMI_PROTO_CMD_GET (0x03) /*ȡ*/ +#define HMI_PROTO_CMD_SET (0x10) /*Ϣ*/ +/**/ +#define HMI_PROTO_GUI_MAIN (0x10)/* */ +#define HMI_PROTO_GUI_CURR_ALARM (0x11)/*ʵʱ */ +#define HMI_PROTO_GUI_DETAIL_MAIN (0x12)/*_ϸϢ */ +#define HMI_PROTO_GUI_LOGIN (0x13)/*¼ */ +#define HMI_PROTO_GUI_HISTORY_ALARM (0x14)/*ʷ */ +#define HMI_PROTO_GUI_TCP_CONFIG (0x15)/*ý */ +#define HMI_PROTO_GUI_DEVICE_CONFIG (0x16)/*豸ý */ +#define HMI_PROTO_GUI_HELP (0x17)/* */ + +#define HMI_PROTO_ASCII_RX_DELINITER (0xAA)/*շָ*/ + +#define HMI_PROTO_ASCII_TX_DELINITER (0xFF)/*ͷָ*/ +#define HMI_PROTO_ASCII_TX_DELINITER_NUM (3)/*ͷָ*/ + + +static void gui_tjc_hmi_init(void); +static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart); + +/*ڷͻ*/ +static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM]; +/*ַƴ */ +static char gui_tjc_hmi_text_buffer[GUI_TJC_HMI_TEXT_BUFFER_NUM]; +/*ַ ˿ں*/ +static char *hmi_proto_string_com[] = +{ + "COM1", + "COM2", + "COM3", + "COM4" +}; + +/*ַ */ +static char *hmi_proto_string_baudrate[] = +{ + "4800", + "9600", + "19200", + "57600", + "115200", +}; + + +static bsp_uart_t * p_rx_uart = NULL; + +gui_tjc_hmi_t tjc_hmi = +{ + .init = gui_tjc_hmi_init, +}; + +gui_tjc_hmi_t *p_tjc_hmi = &tjc_hmi; + + + +/*ĻЭʼ*/ +static void gui_tjc_hmi_init(void) +{ + com_uart1.rx_data_analysis = gui_tjc_hmi_communication_data_analysis; +} + + +/*ͽӿ*/ +static void gui_tjc_hmi_data_send(u8 *p_data,u16 len) +{ + if(p_rx_uart != NULL) + { + p_rx_uart->send(p_rx_uart,p_data,len); + } +} + + +/*öӦĿؼ +xڼ +yڼ +bufferдbuffer +formatʽ +... +*/ +static u16 gui_tjc_hmi_tx_text_display(u16 x,u16 y,char *buffer,const char *format,...) +{ + u16 i,len; + s16 state; + va_list arg; + + /*ջ*/ + memset(gui_tjc_hmi_text_buffer,0,sizeof(gui_tjc_hmi_text_buffer)); + + va_start(arg,format); + /*ʽתַ*/ + state = vsnprintf(gui_tjc_hmi_text_buffer,GUI_TJC_HMI_TEXT_BUFFER_NUM,format,arg); + if(-1 == state || state > GUI_TJC_HMI_TEXT_BUFFER_NUM) + { + va_end(arg); + printf("Length REEOR"); + return 0; + } + + /*ƴַ*/ + sprintf(buffer,"t%d_%d.txt=\"%s\"",x,y,gui_tjc_hmi_text_buffer); + len = strlen(buffer); + for(i=0;i 0) + { + page_num++; + } + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01:/*ȡϢ*/ + { + if(p_tjc_hmi->page.main_index == page_num - 1 && remain_region_num >0)/*ʾʣ*/ + { + for(j=0;jpage.main_index * MAIN_PAGE_SUB_DEVICE_NUM + j; + x = j; + /**/ + y = 0; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name); + /*豸*/ + y = 1; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num); + /*©Һ*/ + y = 2; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num); + /*ϴ*/ + y = 3; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num); + /*ͨѶ*/ + y = 4; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num); + } + } + else + { + for(j=0;jpage.main_index*MAIN_PAGE_SUB_DEVICE_NUM + j; + x = j; + /**/ + y = 0; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name); + /*豸*/ + y = 1; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num); + /*©Һ*/ + y = 2; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num); + /*ϴ*/ + y = 3; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num); + /*ͨѶ*/ + y = 4; + len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num); + } + } + }break; + case 0x02: + { + + }break; + default:return; + } + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x03:/*ҳ*/ + { + if(0x01 == p_data[0]) + { + if(page_num - 1 <= p_tjc_hmi->page.main_index) + { + p_tjc_hmi->page.main_index = 0; + } + else + { + p_tjc_hmi->page.main_index++; + } + } + else + { + + if(0 == p_tjc_hmi->page.main_index) + { + p_tjc_hmi->page.main_index = page_num - 1; + } + else + { + p_tjc_hmi->page.main_index--; + } + } + } + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} + +/*ʵʱӦ*/ +static void gui_tjc_hmi_curr_alarm_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} +/**/ +static void gui_tjc_hmi_detail_main_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} +/*¼*/ +static void gui_tjc_hmi_login_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} + +/*ʷ*/ +static void gui_tjc_hmi_history_alarm_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} + +/*ý*/ +static void gui_tjc_hmi_tcp_config_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} + +/*豸ý */ +static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} +/**/ +static void gui_tjc_hmi_help_send(u8 cmd,u8 opa,u8 *p_data) +{ + u16 len = 0,i; + + if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } + else if(HMI_PROTO_CMD_SET == cmd)/**/ + { + switch(opa) + { + case 0x01: + { + + }break; + case 0x02: + { + + }break; + default:return; + } + len = strlen((char *)hmi_tx_buffer); + gui_tjc_hmi_data_send(hmi_tx_buffer,len); + } +} +/*Ļָ*/ +static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart) +{ + u8 cmd,data,gui_id,opa,*p_offset_data; + u16 i,modbus_crc16,check_crc16; + /*Ȳ*/ + if(len < 5) + { + return ; + } + /*֡ͷ*/ + if(p_data[0] != HMI_PROTO_FRAME_HEADER1 || p_data[1] != HMI_PROTO_FRAME_HEADER2) + { + return ; + } + /*Уλ*/ + check_crc16 = p_data[len-2] << 8 | p_data[len-1]; + modbus_crc16 = modbus_lib_crc16(p_data,len-2); + modbus_crc16 = (modbus_crc16 >> 8) | (modbus_crc16 << 8); + if(modbus_crc16 != check_crc16) + { + return ; + } + + /*CMD*/ + cmd = p_data[2]; + if(cmd != HMI_PROTO_CMD_GET || HMI_PROTO_CMD_GET != HMI_PROTO_CMD_SET) + { + return ; + } + gui_id = p_data[3]; /*gui_id*/ + opa = p_data[4]; /**/ + p_offset_data = &p_data[5]; /**/ + p_rx_uart = (bsp_uart_t *)rx_uart; /*ָ*/ + switch(gui_id) + { + case HMI_PROTO_GUI_MAIN : + { + gui_tjc_hmi_main_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_CURR_ALARM : + { + gui_tjc_hmi_curr_alarm_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_DETAIL_MAIN : + { + gui_tjc_hmi_detail_main_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_LOGIN : + { + gui_tjc_hmi_main_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_HISTORY_ALARM : + { + gui_tjc_hmi_history_alarm_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_TCP_CONFIG : + { + gui_tjc_hmi_tcp_config_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_DEVICE_CONFIG : + { + gui_tjc_hmi_device_config_send(cmd,opa,p_offset_data); + }break; + case HMI_PROTO_GUI_HELP : + { + gui_tjc_hmi_help_send(cmd,opa,p_offset_data); + }break; + } +} diff --git a/calib_board/usr/gui/gui_tjc_hmi.h b/calib_board/usr/gui/gui_tjc_hmi.h new file mode 100644 index 0000000..654c19b --- /dev/null +++ b/calib_board/usr/gui/gui_tjc_hmi.h @@ -0,0 +1,22 @@ +#ifndef _GUI_TJC_HMI_H_ +#define _GUI_TJC_HMI_H_ + +#include "main.h" + +/*ҳ*/ +typedef struct +{ + u8 main_index; + u8 deliniter_main_index; + +}gui_tjc_hmi_page_t; + +typedef struct +{ + gui_tjc_hmi_page_t page; + void (*init)(void); +}gui_tjc_hmi_t; + +extern gui_tjc_hmi_t tjc_hmi; + +#endif diff --git a/calib_board/usr/protocol/proto_modbus_master_tdlas.c b/calib_board/usr/protocol/proto_modbus_master_tdlas.c index ef3026e..c3db81a 100644 --- a/calib_board/usr/protocol/proto_modbus_master_tdlas.c +++ b/calib_board/usr/protocol/proto_modbus_master_tdlas.c @@ -3,7 +3,7 @@ #include "stdio.h" #include "app.h" -#include "os_timer.h" +#include "app_timer.h" #include "bsp_Uart.h" #include "bsp_74HC4067.h" @@ -36,7 +36,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data); static void proto_tdlas_control_fac_calib_data_get(u8 ch); /*ĸڽյ*/ -static bsp_Uart_t *rx_uart = NULL; +static bsp_uart_t *rx_uart = NULL; proto_tdlas_t tdlas= { @@ -56,16 +56,16 @@ proto_tdlas_t tdlas= }; proto_tdlas_t *p_sensor = &tdlas; -bsp_Uart_t *p_use_uart = &COM_Uart4; +bsp_uart_t *p_use_uart = &com_uart4; static void proto_tdlas_init(void) { - COM_Uart4.Rx_DataAnalysis = p_sensor->rx_task; + com_uart4.rx_data_analysis = p_sensor->rx_task; } static void proto_tdlas_send(u8 *p_data,u16 len) { - COM_Uart4.Send(&COM_Uart4,p_data,len); + com_uart4.send(&com_uart4,p_data,len); } static void proto_sensor_switch(u8 ch) @@ -324,7 +324,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data) if( p_use_uart->relay.flag == 1) { - p_use_uart->relay.uart->Send(p_use_uart->relay.uart,p_data,len); + p_use_uart->relay.uart->send(p_use_uart->relay.uart,p_data,len); } if(p_sensor->modbus_id != p_data[0]) @@ -348,7 +348,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data) { p_rx_valid = &p_data[6]; } - rx_uart = (bsp_Uart_t *)other_data; + rx_uart = (bsp_uart_t *)other_data; p_sensor_sys->tx_time_out_count = 0; p_sensor_sys->state_error_flag &= (~(0x00000001 << PROTO_TDLAS_ERROR_FLAG_TIME_OUT)); diff --git a/calib_board/usr/protocol/proto_modbus_slave_ex.c b/calib_board/usr/protocol/proto_modbus_slave_ex.c index d8ab8fb..27dcdf3 100644 --- a/calib_board/usr/protocol/proto_modbus_slave_ex.c +++ b/calib_board/usr/protocol/proto_modbus_slave_ex.c @@ -4,7 +4,7 @@ #include "stdio.h" #include "app.h" -#include "os_timer.h" +#include "app_timer.h" #include "bsp_Uart.h" #include "bsp_Flash.h" @@ -33,26 +33,21 @@ proto_Modbus_t modbus_slave_ex= }; static proto_Modbus_t *p_modbus = &modbus_slave_ex; -static bsp_Uart_t * rx_uart; +static bsp_uart_t * p_rx_uart; -static void proto_modbus_communication_data_send(u8 *pData, u16 len) +static void proto_modbus_communication_data_send(u8 *p_data, u16 len) { - if(&COM_Uart1 == rx_uart) + if(p_rx_uart != NULL) { - COM_Uart1.Send(&COM_Uart1,pData,len); - } - else if(&COM_Uart4 == rx_uart) - { - COM_Uart4.Send(&COM_Uart4,pData,len); - } - + p_rx_uart->send(p_rx_uart,p_data,len); + } } static void proto_modbus_init(void) { p_modbus->id = Usr_Flash.FlashData.modbus_id; - COM_Uart1.Rx_DataAnalysis = proto_modbus_communication_data_analysis; - COM_Uart4.Rx_DataAnalysis = proto_modbus_communication_data_analysis; + com_uart1.rx_data_analysis = proto_modbus_communication_data_analysis; + com_uart4.rx_data_analysis = proto_modbus_communication_data_analysis; } static void proto_modbus_task(void) { @@ -82,7 +77,7 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot goto Error; } */ - rx_uart = (bsp_Uart_t*)other_data; + p_rx_uart = (bsp_uart_t*)other_data; switch (modbus_analysis_data.func) { case 0x03: