From 2a309f5e5c4b0155fd200e2159df94f99d950add Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 6 Dec 2021 15:38:46 -0600 Subject: [PATCH] added more glfw3 mappings --- modules/glfw3/module.onyx | 80 ++++++++++- modules/glfw3/onyx_glfw3.c | 268 ++++++++++++++++++++++++++++++++++++ modules/glfw3/onyx_glfw3.so | Bin 28896 -> 55752 bytes 3 files changed, 347 insertions(+), 1 deletion(-) diff --git a/modules/glfw3/module.onyx b/modules/glfw3/module.onyx index c2e13f8c..1eed1df0 100644 --- a/modules/glfw3/module.onyx +++ b/modules/glfw3/module.onyx @@ -6,16 +6,36 @@ package glfw3 // Opaque types that are only used by pointer GLFWmonitor_p :: #distinct u64 GLFWwindow_p :: #distinct u64 +GLFWcursor_p :: #distinct u64 GLFWimage :: struct #size 16 { width, height: i32; pixels: ^u8; } +GLFWgamepadstate :: struct { + buttons: [15] u8; + axes: [6] f32; +} + +GLFWvidmode :: struct { + width, height: i32; + redBits, greenBits, blueBits, refreshRate: i32; +} + +GLFWgammaramp :: struct { + red: ^i32; + green: ^i32; + blue: ^i32; + size: i32; +} + #foreign "onyx_glfw3" { glfwInit :: () -> bool --- glfwTerminate :: () -> void --- + glfwInitHint :: (hint, value: i32) -> void --- glfwGetVersion :: (major, minor, rev: ^i32) -> void --- + // glfwGetError :: (description: ^^u8) -> void --- // glfwSetErrorCallback :: (f: (i32, cstr) -> void) -> void --- glfwMakeContextCurrent :: (window: GLFWwindow_p) -> void --- @@ -23,10 +43,68 @@ GLFWimage :: struct #size 16 { glfwSwapInterval :: (interval: i32) -> void --- glfwExtensionSupported :: (name: cstr) -> bool --- + glfwGetInputMode :: (window: GLFWwindow_p, mode: i32) -> i32 --- + glfwSetInputMode :: (window: GLFWwindow_p, mode, value: i32) -> void --- + glfwRawMouseMotionSupported :: () -> i32 --- + // glfwGetKeyName :: (key, scancode: i32) -> cstr --- + glfwGetKeyScancode :: (key: i32) -> i32 --- + glfwGetKey :: (window: GLFWwindow_p, key: i32) -> i32 --- + glfwGetMouseButton :: (window: GLFWwindow_p, button: i32) -> i32 --- + glfwGetCursorPos :: (window: GLFWwindow_p, xpos, ypos: ^f64) -> void --- + glfwSetCursorPos :: (window: GLFWwindow_p, xpos, ypos: f64) -> void --- + glfwCreateCursor :: (image: ^GLFWimage, xhot, yhot: i32) -> GLFWcursor_p --- + glfwCreateStandardCursor :: (shape: i32) -> GLFWcursor_p --- + glfwDestroyCursor :: (cursor: GLFWcursor_p) -> void --- + glfwSetCursor :: (window: GLFWwindow_p, cursor: GLFWcursor_p) -> void --- + // glfwSetKeyCallback + // glfwSetCharCallback + // glfwSetCharModsCallback + // glfwSetMouseButtonCallback + // glfwSetCursorPosCallback + // glfwSetCursorEnterCallback + // glfwSetScrollCallback + // glfwSetDropCallback + glfwJoystickPresent :: (jid: i32) -> i32 --- + // glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> ^f32 --- + // glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> ^u8 --- + // glfwGetJoystickHats :: (jid: i32, count: ^i32) -> ^u8 --- + // glfwGetJoystickName :: (jid: i32) -> ^u8 --- + // glfwGetJoystickGUID :: (jid: i32) -> ^u8 --- + glfwSetJoystickUserPointer :: (jid: i32, pointer: rawptr) -> void --- + glfwGetJoystickUserPointer :: (jid: i32) -> rawptr --- + glfwJoystickIsGamepad :: (jid: i32) -> i32 --- + // glfwSetJoystickCallback + glfwUpdateGamepadMappings :: (string: cstr) -> i32 --- + // glfwGetGamepadName :: (jid: i32) -> cstr --- + glfwGetGamepadState :: (jid: i32, state: ^GLFWgamepadstate) -> i32 --- + glfwSetClipboardString :: (window: GLFWwindow_p, string: cstr) -> void --- + // glfwGetClipboardString :: (window: GLFWwindow_p) -> cstr --- + glfwGetTime :: () -> f64 --- + glfwSetTime :: (time: f64) -> void --- + glfwGetTimerValue :: () -> u64 --- + glfwGetTimerFrequency :: () -> u64 --- + + glfwGetMonitors :: (max_monitors: i32, out_monitors: ^GLFWmonitor_p, out_count: ^i32) -> void --- + glfwGetPrimaryMonitor :: () -> GLFWmonitor_p --- + glfwGetMonitorPos :: (monitor: GLFWmonitor_p, xpos, ypos: ^i32) -> void --- + glfwGetMonitorWorkarea :: (monitor: GLFWmonitor_p, xpos, ypos, width, height: ^i32) -> void --- + glfwGetMonitorPhysicalSize :: (monitor: GLFWmonitor_p, widthMM, heightMM: ^i32) -> void --- + glfwGetMonitorContentScale :: (monitor: GLFWmonitor_p, xscale, yscale: ^f32) -> void --- + // glfwGetMonitorName :: (monitor: GLFWmonitor_p) -> cstr --- + glfwSetMonitorUserPointer :: (monitor: GLFWmonitor_p, pointer: rawptr) -> void --- + glfwGetMonitorUserPointer :: (monitor: GLFWmonitor_p) -> rawptr --- + // glfwSetMonitorCallback + glfwGetVideoModes :: (monitor: GLFWmonitor_p, max_modes: i32, out_modes: ^GLFWvidmode, out_count: ^i32) -> void --- + glfwGetVideoMode :: (monitor: GLFWmonitor_p, out_mode: ^GLFWvidmode) -> void --- + glfwSetGamma :: (monitor: GLFWmonitor_p, gamma: f32) -> void --- + // glfwGetGammaRamp :: (monitor: GLFWmonitor_p, out_ramp: ^GLFWgammramp) -> void --- + // glfwSetGammaRamp :: (monitor: GLFWmonitor_p, ramp: ^GLFWgammramp) -> void --- + + glfwCreateWindow :: (width, height: i32, title: cstr, monitor: GLFWmonitor_p = 0, share: GLFWwindow_p = 0) -> GLFWwindow_p --- glfwDestroyWindow :: (window: GLFWwindow_p) -> void --- glfwWindowShouldClose :: (window: GLFWwindow_p) -> bool --- - glfwSetWindowShouldClose :: (window: GLFWwindow_p, value: i32) -> void --- + glfwSetWindowShouldClose :: (window: GLFWwindow_p, value: bool) -> void --- glfwDefaultWindowHints :: () -> void --- glfwWindowHint :: (hint: i32, value: i32) -> void --- glfwSetWindowTitle :: (window: GLFWwindow_p, title: cstr) -> void --- diff --git a/modules/glfw3/onyx_glfw3.c b/modules/glfw3/onyx_glfw3.c index 11f7134c..6e3145f1 100644 --- a/modules/glfw3/onyx_glfw3.c +++ b/modules/glfw3/onyx_glfw3.c @@ -231,6 +231,224 @@ ONYX_DEF(glfwSwapBuffers, (LONG), ()) { return NULL; } +// glfwGetInputMode :: (window: GLFWwindow_p, mode: i32) -> i32 --- +// glfwSetInputMode :: (window: GLFWwindow_p, mode, value: i32) -> void --- +// glfwRawMouseMotionSupported :: () -> i32 --- +ONYX_DEF(glfwGetInputMode, (LONG, INT), (INT)) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + results->data[0] = WASM_I32_VAL(glfwGetInputMode(window, params->data[1].of.i32)); + return NULL; +} + +ONYX_DEF(glfwSetInputMode, (LONG, INT, INT), ()) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + glfwSetInputMode(window, params->data[1].of.i32, params->data[2].of.i32); + return NULL; +} + +ONYX_DEF(glfwRawMouseMotionSupported, (), (INT)) { + results->data[0] = WASM_I32_VAL(glfwRawMouseMotionSupported()); + return NULL; +} + +// // glfwGetKeyName :: (key, scancode: i32) -> cstr --- +ONYX_DEF(glfwGetKeyScancode, (INT), (INT)) { + results->data[0] = WASM_I32_VAL(params->data[0].of.i32); + return NULL; +} + +ONYX_DEF(glfwGetKey, (LONG, INT), (INT)) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + results->data[0] = WASM_I32_VAL(glfwGetKey(window, params->data[1].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetMouseButton, (LONG, INT), (INT)) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + results->data[0] = WASM_I32_VAL(glfwGetMouseButton(window, params->data[1].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetCursorPos, (LONG, PTR, PTR), ()) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + glfwGetCursorPos(window, (double *) ONYX_PTR(params->data[1].of.i32), (double *) ONYX_PTR(params->data[2].of.i32)); + return NULL; +} + +ONYX_DEF(glfwSetCursorPos, (LONG, DOUBLE, DOUBLE), ()) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + glfwSetCursorPos(window, params->data[1].of.f64, params->data[2].of.f64); + return NULL; +} + +ONYX_DEF(glfwCreateCursor, (PTR, INT, INT), (LONG)) { + GLFWimage image = { + *(int *) ONYX_PTR(params->data[0].of.i32 + 0), + *(int *) ONYX_PTR(params->data[0].of.i32 + 4), + ONYX_PTR(params->data[0].of.i32 + 8), + }; + + GLFWcursor *cursor = glfwCreateCursor(&image, params->data[1].of.i32, params->data[2].of.i32); + wasm_val_init_ptr(&results->data[0], cursor); + return NULL; +} + +ONYX_DEF(glfwCreateStandardCursor, (INT), (LONG)) { + GLFWcursor *cursor = glfwCreateStandardCursor(params->data[0].of.i32); + wasm_val_init_ptr(&results->data[0], cursor); + return NULL; +} + +ONYX_DEF(glfwDestroyCursor, (LONG), ()) { + glfwDestroyCursor((GLFWcursor *) params->data[0].of.i64); + return NULL; +} + +ONYX_DEF(glfwSetCursor, (LONG, LONG), ()) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + GLFWcursor *cursor = (GLFWcursor *) params->data[1].of.i64; + glfwSetCursor(window, cursor); + return NULL; +} + +// // glfwSetKeyCallback +// // glfwSetCharCallback +// // glfwSetCharModsCallback +// // glfwSetMouseButtonCallback +// // glfwSetCursorPosCallback +// // glfwSetCursorEnterCallback +// // glfwSetScrollCallback +// // glfwSetDropCallback +ONYX_DEF(glfwJoystickPresent, (INT), (INT)) { + results->data[0] = WASM_I32_VAL(glfwJoystickPresent(params->data[0].of.i32)); + return NULL; +} +// // glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> ^f32 --- +// // glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> ^u8 --- +// // glfwGetJoystickHats :: (jid: i32, count: ^i32) -> ^u8 --- +// // glfwGetJoystickName :: (jid: i32) -> ^u8 --- +// // glfwGetJoystickGUID :: (jid: i32) -> ^u8 --- +ONYX_DEF(glfwSetJoystickUserPointer, (INT, PTR), ()) { + glfwSetJoystickUserPointer(params->data[0].of.i32, (void *) (unsigned long) params->data[1].of.i32); + return NULL; +} + +ONYX_DEF(glfwGetJoystickUserPointer, (INT), (PTR)) { + results->data[0] = WASM_I32_VAL((unsigned int) (unsigned long) glfwGetJoystickUserPointer(params->data[0].of.i32)); + return NULL; +} + +ONYX_DEF(glfwJoystickIsGamepad, (INT), (INT)) { + results->data[0] = WASM_I32_VAL(glfwJoystickIsGamepad(params->data[0].of.i32)); + return NULL; +} + +ONYX_DEF(glfwUpdateGamepadMappings, (PTR), (INT)) { + results->data[0] = WASM_I32_VAL(glfwUpdateGamepadMappings(ONYX_PTR(params->data[0].of.i32))); + return NULL; +} + +ONYX_DEF(glfwGetGamepadState, (INT, PTR), (INT)) { + results->data[0] = WASM_I32_VAL(glfwGetGamepadState(params->data[0].of.i32, (GLFWgamepadstate *) ONYX_PTR(params->data[1].of.i32))); + return NULL; +} + +ONYX_DEF(glfwSetClipboardString, (LONG, PTR), ()) { + GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; + glfwSetClipboardString(window, ONYX_PTR(params->data[1].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetTime, (), (DOUBLE)) { + results->data[0] = WASM_F64_VAL(glfwGetTime()); + return NULL; +} + +ONYX_DEF(glfwSetTime, (DOUBLE), ()) { + glfwSetTime(params->data[0].of.f64); + return NULL; +} + +ONYX_DEF(glfwGetTimerValue, (), (LONG)) { + results->data[0] = WASM_I64_VAL(glfwGetTimerValue()); + return NULL; +} + +ONYX_DEF(glfwGetTimerFrequency, (), (LONG)) { + results->data[0] = WASM_I64_VAL(glfwGetTimerFrequency()); + return NULL; +} + +// // glfwSetJoystickCallback +// // glfwGetGamepadName :: (jid: i32) -> cstr --- +// // glfwGetClipboardString :: (window: GLFWwindow_p) -> cstr --- + +ONYX_DEF(glfwGetMonitors, (INT, PTR, PTR), ()) { + int monitor_count = params->data[0].of.i32; + int actual_count; + GLFWmonitor** monitors = glfwGetMonitors(&actual_count); + int monitor_ptr = params->data[1].of.i32; + + int count = (actual_count < monitor_count) ? actual_count : monitor_count; + for (int i=0; idata[2].of.i32) = count; + return NULL; +} + +ONYX_DEF(glfwGetPrimaryMonitor, (), (LONG)) { + results->data[0] = WASM_I64_VAL((unsigned long) glfwGetPrimaryMonitor()); + return NULL; +} + +ONYX_DEF(glfwGetMonitorPos, (LONG, PTR, PTR), ()) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + glfwGetMonitorPos(monitor, (int *) ONYX_PTR(params->data[1].of.i32), (int *) ONYX_PTR(params->data[2].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetMonitorWorkarea, (LONG, PTR, PTR, PTR, PTR), ()) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + glfwGetMonitorWorkarea(monitor, (int *) ONYX_PTR(params->data[1].of.i32), (int *) ONYX_PTR(params->data[2].of.i32), (int *) ONYX_PTR(params->data[3].of.i32), (int *) ONYX_PTR(params->data[4].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetMonitorPhysicalSize, (LONG, PTR, PTR), ()) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + glfwGetMonitorPhysicalSize(monitor, (int *) ONYX_PTR(params->data[1].of.i32), (int *) ONYX_PTR(params->data[2].of.i32)); + return NULL; +} + +ONYX_DEF(glfwGetMonitorContentScale, (LONG, PTR, PTR), ()) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + glfwGetMonitorContentScale(monitor, (float *) ONYX_PTR(params->data[1].of.i32), (float *) ONYX_PTR(params->data[2].of.i32)); + return NULL; +} + +ONYX_DEF(glfwSetMonitorUserPointer, (LONG, PTR), ()) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + glfwSetMonitorUserPointer(monitor, (void *) (unsigned long) params->data[0].of.i32); + return NULL; +} + +ONYX_DEF(glfwGetMonitorUserPointer, (LONG), (PTR)) { + GLFWmonitor *monitor = (GLFWmonitor *) params->data[0].of.i64; + results->data[0] = WASM_I32_VAL((unsigned int) (unsigned long) glfwGetMonitorUserPointer(monitor)); + return NULL; +} + +// // glfwGetMonitorName :: (monitor: GLFWmonitor_p) -> cstr --- +// // glfwSetMonitorCallback +// glfwGetVideoModes :: (monitor: GLFWmonitor_p, max_modes: i32, out_modes: ^GLFWvidmode, out_count: ^i32) -> void --- +// glfwGetVideoMode :: (monitor: GLFWmonitor_p, out_mode: ^GLFWvidmode) -> void --- +// glfwSetGamma :: (monitor: GLFWmonitor_p, gamma: f32) -> void --- +// // glfwGetGammaRamp :: (monitor: GLFWmonitor_p, out_ramp: ^GLFWgammramp) -> void --- +// // glfwSetGammaRamp :: (monitor: GLFWmonitor_p, ramp: ^GLFWgammramp) -> void --- + + + ONYX_LIBRARY { ONYX_FUNC(glfwInit) ONYX_FUNC(glfwTerminate) @@ -254,5 +472,55 @@ ONYX_LIBRARY { ONYX_FUNC(glfwPostEmptyEvent) ONYX_FUNC(glfwSwapBuffers) + ONYX_FUNC(glfwGetInputMode) + ONYX_FUNC(glfwSetInputMode) + ONYX_FUNC(glfwRawMouseMotionSupported) + ONYX_FUNC(glfwGetKeyScancode) + ONYX_FUNC(glfwGetKey) + ONYX_FUNC(glfwGetMouseButton) + ONYX_FUNC(glfwGetCursorPos) + ONYX_FUNC(glfwSetCursorPos) + ONYX_FUNC(glfwCreateCursor) + ONYX_FUNC(glfwCreateStandardCursor) + ONYX_FUNC(glfwDestroyCursor) + ONYX_FUNC(glfwSetCursor) + ONYX_FUNC(glfwJoystickPresent) + ONYX_FUNC(glfwSetJoystickUserPointer) + ONYX_FUNC(glfwGetJoystickUserPointer) + ONYX_FUNC(glfwJoystickIsGamepad) + ONYX_FUNC(glfwUpdateGamepadMappings) + ONYX_FUNC(glfwGetGamepadState) + ONYX_FUNC(glfwSetClipboardString) + ONYX_FUNC(glfwGetTime) + ONYX_FUNC(glfwSetTime) + ONYX_FUNC(glfwGetTimerValue) + ONYX_FUNC(glfwGetTimerFrequency) + ONYX_FUNC(glfwGetMonitors) + ONYX_FUNC(glfwGetPrimaryMonitor) + ONYX_FUNC(glfwGetMonitorPos) + ONYX_FUNC(glfwGetMonitorWorkarea) + ONYX_FUNC(glfwGetMonitorPhysicalSize) + ONYX_FUNC(glfwGetMonitorContentScale) + ONYX_FUNC(glfwSetMonitorUserPointer) + ONYX_FUNC(glfwGetMonitorUserPointer) + + + // // glfwGetKeyName :: (key, scancode: i32) -> cstr --- + +// // glfwSetKeyCallback +// // glfwSetCharCallback +// // glfwSetCharModsCallback +// // glfwSetMouseButtonCallback +// // glfwSetCursorPosCallback +// // glfwSetCursorEnterCallback +// // glfwSetScrollCallback +// // glfwSetDropCallback +// // glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> ^f32 --- +// // glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> ^u8 --- +// // glfwGetJoystickHats :: (jid: i32, count: ^i32) -> ^u8 --- +// // glfwGetJoystickName :: (jid: i32) -> ^u8 --- +// // glfwGetJoystickGUID :: (jid: i32) -> ^u8 --- + + NULL }; \ No newline at end of file diff --git a/modules/glfw3/onyx_glfw3.so b/modules/glfw3/onyx_glfw3.so index 0822af7a87e59f6ac1ea48a15bdb05f480e12f87..147878724327831d26c7ddd917ae834c9d9429aa 100755 GIT binary patch literal 55752 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 Q)-3HG`ypuv15q^o5B-$vEdT%j literal 28896 zcmeI54RBo5b%3vA3pTZp)&y*UNmv})71S&;7%&OOt3PWEvJsa2L-^TUX;+p&(r$KF zw#1~Zh>3$D+^QLp(9DGH(1dz2WU8c@)NMm&6Bt7h+9(Z8-IQTAw8^X{6qcVP3KVb8 zx%Zsa)6sixH#E~}I{Rj{=iTp}pZoXTUcGnk+du5++ErUqqj+1PZc><@Mz`soX57 zdUaj;AOtpV=idF$?`pD`m-oOQZnc!Q>R$kS1^l7@`vTAW&CZ>tQsoi)7& ze|g5(Dd@)v{82l5A*Vj<+h)7&nkW8c|8$JAPjpe_!SMXWWN8l#e5KUl&d*@iPXDX} z?{V*7C$}9Ae!k|w$H9SJK6e4%Ae}?{^A7rNX#cBKVUsc9>&a`t*Qm8B z+++Bx5lV$ZhezV0p;S7OOou`$w7YjtC>l$~4iBZ$v1IR_w&D0_tT)m(95cu4kA(Wi zBcXwz(a7-7eKB=-c;INy(MY0oY+xXkOzCuYJeBSkNu(z_j>JaO8Xb%brFAORJ2VoD zk4Z{)!^1|&xQ(R`4vj|RN5P*u8cB_WMq(rJ}MNI*r-gb{d)gOrra~aykl1Zqvwm9%{Q%idy_r@qqM_Ks*)Hrz6$=+CU z1R5o6vbuY8C=Kl$ADtKv4G;AtBgqMqz-qWg0m2=BD(=^be%!lGb$0D;Z3|uPzuJE- z_nBWy;)NWp(qw~sjez(XGEeB)J`ZlxE3X zH5>m;LVp$UX2HYM-?j^0pnet*JWTy6EI7v<6ns6!O$a_oamNMEkpD@+Cy8eS=eQ>Y z_fyK!7yJQkU%|USVA^p(@C3zGbiLtr%urmu4l(DrO+x>(+`fX(P~7d3 zQ`~^yS#Dp!Iqsm~k8}G9K1*@O1y^^NdYBYE$L%XP$2}?dlia?7XDRL}!DqRB1@}>Y za)NW*yx>3N_7yzG?JIbJ+n2ttxE<$+^Y<8Yj@u;kU*`4|+`G}#=XS~W86FTkK;`A{ zRT+0s=%3~G6}*|^jtkyRaVG_DCY}+T%X?DrhOH+5vw~+R?kT}%$bVMw1o52U95*lc zW{O)7yg+dm1fM1UipD!!pJA$J9tSb!xJ^R;dWzdDxR?HK*)I4b`40#_NBId0&T$6? z-$QW|f;Us#als4Ze^T%aS(f2L4V~*QbaE{v~`2F0zg3odL3htx00l}N89_DT}`NDfmwUk8^XDpoa ziaclG4G3tD}y{_;dIMW9}QdhYK#7$g`a2P2@B_2rg(VV!o3## zNef?N;SXB)`4&E7;qSHZM=bmT3(r{ig%*C&!q-{&tc5pP_$dp&$ilN0zTU#CyVV+~ z)F{Aso=-6>DuC4@YvIyr*u(@*S-X} zxamLOv*FSJ>|uHkkImdrUo^v5ubL)>|vPTz-V9NNx%bvlV@9MaA!oxTUt4VW&R1+b|P(_T#Hbo#@X z#v$$eoKEk6KdaNNn8u;&d`71~h-n}+ ziJQLI>3O}u8}Q`+aq)n~U;Yz|Slj>g(sXdT(=*-OG@WSFQGc}Y5((0JG&)EWQBp`9iU{67H_N3GxzeX3^MTeE)k zxtk8y{NHQtvyyvZcQ1SY2m*b8WD`sjc4EQr`#)t@R!(?`kM#0ql05T}!?9 zcr6@0wxYA%7q4$@tM|50KCwML(7yUPGsN9b9NX6mT;>zo8};>bNYFn3`dC-k{-_WC z-|2YAY7fH^Q>Tx>v5j!dTBlgHS>RiM_o0m_TRWF+_wusgx`!y(-GX+yZ0%IGkJdLr zn#+dkI35B$?9*7M`zWtXz#j&#%K-YvYO%Jd{o&Xna7^a)PT(2f_o6S6*HSy|Uz*no zK=om;I|FvsdPLt(0H5PHIuBTrW{&c+a175qOjoyR4ODBOS_9P@sMbKW2C6mi+gt

mASJU5QVO+0s!*Ky(h0J!n- zpPwzpHGuyeaO1g<3$(*?Ae-no&t>#e{#F??J^saAQiBPQ<^ZWFUQdkULELx_r5=|; zx|t>oGJlXV$oV`;6~S{X_1F~b;K`%TzkVVOX?XIf(_D`*gw*NH1{2^%_OfQxr^ihk^>}< zkUUP(cv=3Lqkh0gYG4QdoHjgG>O(e4c+Abd+;QxWZuZ6&@I{(w- zblO_pD50}m`f!VlO23KYZa&JD&#mn%$zQ3UwBw_B?L2Rv*A0XZ83i9nUbn&PM#2Z_ zI7wc&lc9AtVUj+Qyl#uvjfH9bm5(H^+v9bE;a>7jlCry8G#j*vB(IY!(0LW6@+~(c zLU!v(@_NS%*-chx&+8axHWoU_C1t;UPl-pdmqVi<>&Q* za}>Xs@*l3yK1J~hWZzBplNH+YdOcpBmmvF0h4#Gej@Q}EaQ#)vK5zK{HrtAAe4#_QJ#WIso;oIS5g<8^3WS|1dsFg~v@)aDbvhgPcB zit-Q+Gizbg&F^30T> zi1T%r`6Tf<(%1L!!PgVS3&iz3eBft@^Yu{QqX&LYE!F=AOhzs?LNycT>lerEBhJ^Q z^`!q9;(Wc)_vGQ&GsO8i!u9healStEkslunNU$FGyw~^J;n+Un1v;PCk^UbL=kt{F z^OwZ={NuPkCeG)TzPAp(R;@H~`F!E>ZX?d;0sA=wyawJgr8MERK{&f_2EUnb7u zA?E)^oX1DZ*TBG1`#)qHGv7s=$4|_U5a;m}^CyV&_=@=p?4QP4%+G^=Krt?lznHfY z=kXZx`-t=SjQK2a9){`3yk1QTezWFlm6yJ!+0TQd zpB4Jg5LYy=VEwbib3*?*xS@b?144g&++p zq%>cv3PS%Y#ODMr5ckq}fb(+&eBtSK5&mPELwySUM~OEJeunsr;OiPpy(I)cNPJfC z8O@KD;hkj1$u$jZxrtSBB-T4^TtD3H*3%^C!jT7Dr`nBpj#rF|e{UYrL zuD9JxjNGg_ETh=FlwSoLR;DO^Zy_ITB|kwr-w!uOF5 zu@tL&018#D@eW+i?exFrz~6@N9XtJfaGkW{pLWpy8YrI+%V;lu`(VWe zOGMbC;iY%jO zeT`)4tc}J7Gw#zWa$`V^IFo zvoWgZ9JjG+U;eID+4pR$T&`9&+NHeNUkPn2p!rP*yKAzIeknqQ`YzuNHr^M%rj~s_ zxN7q&bt|aQGT)mvVXV``Wq?Ek1_Gfz{pw$NNpQ1E#!~R!-FIQ=7O+gwTw|88bql-L zXim-G8o9iAWx<#Am=0jxQ2AKbPHL^tNm5W zHE0=Ix3DgkR@aa&c5dO?%U}Op!&YGL7QR$bZX-?C3{>R7EeodN-gW%)=5E2=2M4YN zcQN;? z%sc(Z;~Lh*&Mlnte=n}loXy;V+5SuA8iy=)?Q7Z75$f36jz95$w{GAoKAMV$1|y?U z{AGvs+xNEY+1&;d9$kkzf+1rNY~Ke6eguL|JG*XeZRrZ#x@%WYM{lUNrM0UA9D+ai zVF8z4j&S{<2KfsVX3%K!0|h!l1;0NLSn`tv{?x=sI?|{7@QVya4)We;JRS2N9v$;1 zlJP_=nVwMo66zZp8jfB$6jfSbFp?Tn{^-OgI5RSxG)Iom&n;**N`&B8GBzAR1KLXr zr zY|rzWS@OJQj?eYS<-ecoTgf5MlV-{Ds?i>vs+8t+v;8zMtP{8mZZ_XiiT%sEaXy$G zhaIcE&u5OX)N4su86-dJVEHG&toA&whNXTJnTTnX_!1WcfunhWp%p{G5yB(-vFYmGS=ynAN_UGQ#o&c1(V_{VA!QgdKQ3GK0s^w)X#u!Eh4>BB}lxhSN}@ -- 2.25.1