OberonCore https://forum.oberoncore.ru/ |
|
Потоки и обработка собщений в BlackBox https://forum.oberoncore.ru/viewtopic.php?f=31&t=367 |
Страница 1 из 2 |
Автор: | Штирлиц [ Пятница, 19 Январь, 2007 17:06 ] |
Заголовок сообщения: | Потоки и обработка собщений в BlackBox |
Здравствуйте! Я только недавно стал осваивать BlackBox. Решил разобраться с потоками. Переделал пример из Obx\Cubes.odc. Способ синхронизации взят из Delphi 2.0. Кубик нормально закрутился. Но, есть одно но: кубик замирает при перетаскивании окна за заголовок и при активизации меню. Все похоже застревает где-то в Views.Update(v, Views.keepFrames). В реальной ситуации пользователь может просто нажать alt попасть в меню, а процесс обработки может просто встать. А надо бы продолжать отрисовку объекта не зависимо от того тащим мы окно или находимся в меню. Например, в программах на Delphi замирания обработки не наблюдается. как избежать остановки кручения кубика в такой ситуации? Как устроен обработчик сообщений в BlackBox? MODULE ObxThreadCubes; (** project = "BlackBox" organization = "www.oberon.ch" contributors = "Oberon microsystems" version = "System/Rsrc/About" references = "Adopted from a program written in C in 1986 by Roland Karlsson, Swedish Institute for Computer Science (SICS), roland@sics.se" changes = "" issues = "" **) IMPORT Views, Ports, Properties, Stores, Models, Math, Controllers, StdCmds, Containers, SYSTEM, Dialog, WinApi; CONST minVersion = 0; maxVersion = 1; pi2 = 255; invisible = Ports.white; TYPE Colors = ARRAY 6 OF Ports.Color; View = POINTER TO RECORD (Views.View) fi1, fi2: INTEGER; (* rotation angles *) colors: Colors (* colors of the six sides of the cube *) END; Msg = RECORD (Models.Message) consumed: BOOLEAN END; ThreadMethod* = PROCEDURE; VAR para*: RECORD colors*: Colors END; actual: View; sinus: ARRAY 256 OF INTEGER; Terminated: BOOLEAN; ThreadHandle: WinApi.HANDLE; ThreadID: WinApi.HANDLE; UtilWindow: WinApi.HWND; hInstance: WinApi.HINSTANCE; (* property dialog *) PROCEDURE Singleton (): View; VAR v: Views.View; BEGIN Controllers.SetCurrentPath(Controllers.targetPath); v := Containers.FocusSingleton(); Controllers.ResetCurrentPath(); IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END END Singleton; PROCEDURE Notify* (op, from, to: INTEGER); VAR v: View; BEGIN v := Singleton(); IF v # NIL THEN v.colors := para.colors END END Notify; (*Thread*) PROCEDURE Do; BEGIN actual.fi1 := (actual.fi1 + 7) MOD pi2; actual.fi2 := (actual.fi2 + 1) MOD pi2; (*msg.consumed := TRUE;*) Views.Update(actual, Views.keepFrames) END Do; (* View *) PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer); VAR i: INTEGER; BEGIN wr.WriteVersion(maxVersion); wr.WriteInt(v.fi1); wr.WriteInt(v.fi2); FOR i := 0 TO 5 DO wr.WriteInt(v.colors[i]) END END Externalize; PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader); VAR version: INTEGER; i: INTEGER; BEGIN rd.ReadVersion(minVersion, maxVersion, version); IF ~rd.cancelled THEN rd.ReadInt(v.fi1); rd.ReadInt(v.fi2); IF version = maxVersion THEN FOR i := 0 TO 5 DO rd.ReadInt(v.colors[i]) END ELSE FOR i := 0 TO 5 DO v.colors[i] := invisible END END END END Internalize; PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); BEGIN WITH source: View DO v.fi1 := source.fi1; v.fi2 := source.fi2; v.colors := source.colors END END CopyFromSimpleView; PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message); BEGIN WITH msg: Properties.SizePref DO IF (msg.w > Views.undefined) & (msg.h > Views.undefined) THEN Properties.ProportionalConstraint(1, 1, msg.fixedW, msg.fixedH, msg.w, msg.h); IF msg.w < 10 * Ports.mm THEN msg.w := 10 * Ports.mm; msg.h := msg.w END ELSE msg.w := 40*Ports.mm; msg.h := msg.w; END | msg: Properties.FocusPref DO msg.hotFocus := TRUE ELSE END END HandlePropMsg; PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View); VAR c: Containers.Controller; BEGIN WITH msg: Controllers.TrackMsg DO IF Controllers.modify IN msg.modifiers THEN c := Containers.Focus(); IF c.opts # Containers.mask THEN para.colors := v.colors; StdCmds.OpenToolDialog('Obx/Rsrc/Cubes', 'Cube Colors'); c.SetSingleton(v) END END ELSE END END HandleCtrlMsg; PROCEDURE (v: View) HandleModelMsg (VAR msg: Models.Message); BEGIN WITH msg: Msg DO v.fi1 := (v.fi1 + 7) MOD pi2; v.fi2 := (v.fi2 + 1) MOD pi2; msg.consumed := TRUE; Views.Update(v, Views.keepFrames) ELSE END END HandleModelMsg; PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); VAR fi1, fi2, a, c: INTEGER; p0h, p0v, p1h, p1v, p2h, p2v, p3h, p3v: INTEGER; w, h: INTEGER; e01, e12, e23, e30, e45, e56, e67, e74, e04, e15, e26, e37: BOOLEAN; p: ARRAY 4 OF Ports.Point; PROCEDURE DrawSides(visible: BOOLEAN); BEGIN IF (e01 & e12 & e23 & e30 = visible) & (v.colors[0] # invisible) THEN p[0].x := (p0h - c) * w; p[0].y := p0v * w; p[1].x := (p1h - c) * w; p[1].y := p1v * w; p[2].x := (p2h - c) * w; p[2].y := p2v * w; p[3].x := (p3h - c) * w; p[3].y := p3v * w; f.DrawPath(p, 4, Ports.fill, v.colors[0], Ports.closedPoly) END; IF (e45 & e56 & e67 & e74 = visible) & (v.colors[1] # invisible) THEN p[0].x := (p0h + c) * w; p[0].y := p0v * w; p[1].x := (p1h + c) * w; p[1].y := p1v * w; p[2].x := (p2h + c) * w; p[2].y := p2v * w; p[3].x := (p3h + c) * w; p[3].y := p3v * w; f.DrawPath(p, 4, Ports.fill, v.colors[1], Ports.closedPoly) END; IF (e01 & e15 & e45 & e04 = visible) & (v.colors[2] # invisible) THEN p[0].x := (p0h - c) * w; p[0].y := p0v * w; p[1].x := (p1h - c) * w; p[1].y := p1v * w; p[2].x := (p1h + c) * w; p[2].y := p1v * w; p[3].x := (p0h + c) * w; p[3].y := p0v * w; f.DrawPath(p, 4, Ports.fill, v.colors[2], Ports.closedPoly) END; IF (e12 & e26 & e56 & e15 = visible) & (v.colors[3] # invisible) THEN p[0].x := (p1h - c) * w; p[0].y := p1v * w; p[1].x := (p2h - c) * w; p[1].y := p2v * w; p[2].x := (p2h + c) * w; p[2].y := p2v * w; p[3].x := (p1h + c) * w; p[3].y := p1v * w; f.DrawPath(p, 4, Ports.fill, v.colors[3], Ports.closedPoly) END; IF (e23 & e37 & e67 & e26 = visible) & (v.colors[4] # invisible) THEN p[0].x := (p2h - c) * w; p[0].y := p2v * w; p[1].x := (p3h - c) * w; p[1].y := p3v * w; p[2].x := (p3h + c) * w; p[2].y := p3v * w; p[3].x := (p2h + c) * w; p[3].y := p2v * w; f.DrawPath(p, 4, Ports.fill, v.colors[4], Ports.closedPoly) END; IF (e30 & e04 & e74 & e37 = visible) & (v.colors[5] # invisible) THEN p[0].x := (p3h - c) * w; p[0].y := p3v * w; p[1].x := (p0h - c) * w; p[1].y := p0v * w; p[2].x := (p0h + c) * w; p[2].y := p0v * w; p[3].x := (p3h + c) * w; p[3].y := p3v * w; f.DrawPath(p, 4, Ports.fill, v.colors[5], Ports.closedPoly) END; IF e01 = visible THEN f.DrawLine((p0h - c) * w, p0v * w, (p1h - c) * w, p1v * w, 0, Ports.black) END; IF e12 = visible THEN f.DrawLine((p1h - c) * w, p1v * w, (p2h - c) * w, p2v * w, 0, Ports.black) END; IF e23 = visible THEN f.DrawLine((p2h - c) * w, p2v * w, (p3h - c) * w, p3v * w, 0, Ports.black) END; IF e30 = visible THEN f.DrawLine((p3h - c) * w, p3v * w, (p0h - c) * w, p0v * w, 0, Ports.black) END; IF e45 = visible THEN f.DrawLine((p0h + c) * w, p0v * w, (p1h + c) * w, p1v * w, 0, Ports.black) END; IF e56 = visible THEN f.DrawLine((p1h + c) * w, p1v * w, (p2h + c) * w, p2v * w, 0, Ports.black) END; IF e67 = visible THEN f.DrawLine((p2h + c) * w, p2v * w, (p3h + c) * w, p3v * w, 0, Ports.black) END; IF e74 = visible THEN f.DrawLine((p3h + c) * w, p3v * w, (p0h + c) * w, p0v * w, 0, Ports.black) END; IF e04 = visible THEN f.DrawLine((p0h + c) * w, p0v * w, (p0h - c) * w, p0v * w, 0, Ports.black) END; IF e15 = visible THEN f.DrawLine((p1h + c) * w, p1v * w, (p1h - c) * w, p1v * w, 0, Ports.black) END; IF e26 = visible THEN f.DrawLine((p2h + c) * w, p2v * w, (p2h - c) * w, p2v * w, 0, Ports.black) END; IF e37 = visible THEN f.DrawLine((p3h + c) * w, p3v * w, (p3h - c) * w, p3v * w, 0, Ports.black) END END DrawSides; BEGIN v.context.GetSize(w, h); w := (w DIV 170); fi1 := v.fi1; fi2 := v.fi2; a := sinus[fi2]; c := (sinus[(64 - fi2) MOD pi2] * 91) DIV 128; (* 91/128 := sqrt(2) *) p0v := 85 + sinus[fi1]; p0h := 85 + (a * sinus[(64 - fi1) MOD pi2]) DIV 64; p1v := 85 + sinus[(64 + fi1) MOD pi2]; p1h := 85 + (a * sinus[(-fi1) MOD pi2]) DIV 64; p2v := 85 + sinus[(128 + fi1) MOD pi2]; p2h := 85 + (a * sinus[(-64 - fi1) MOD pi2]) DIV 64; p3v := 85 + sinus[(192 + fi1) MOD pi2]; p3h := 85 + (a * sinus[(-128 - fi1) MOD pi2]) DIV 64; (* determine visibility of the twelve edges *) e01 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128)) OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128))); e12 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128)) OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128))); e23 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128)) OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128))); e30 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128)) OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128))); e45 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128)) OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128))); e56 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128)) OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128))); e67 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128)) OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128))); e74 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128)) OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128))); e04 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 224) MOD pi2 < 64)) OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 96) MOD pi2 < 64))); e15 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 160) MOD pi2 < 64)) OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 32) MOD pi2 < 64))); e26 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 96) MOD pi2 < 64)) OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 224) MOD pi2 < 64))); e37 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 32) MOD pi2 < 64)) OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 160) MOD pi2 < 64))); DrawSides(FALSE); (* draw hidden sides and edges *) DrawSides(TRUE) (* draw visible sides and edges *) END Restore; (* commands *) PROCEDURE New* (): View; VAR v: View; BEGIN NEW(v); v.fi1 := 0; v.fi2 := 0; v.colors := para.colors; RETURN v END New; PROCEDURE Deposit*; BEGIN actual := New(); Views.Deposit(actual); END Deposit; PROCEDURE InitData; VAR i: INTEGER; BEGIN (* Pi = 128 *) FOR i := 0 TO 255 DO sinus[i] := SHORT(ENTIER(0.5 + 64 * Math.Sin(i * 2 * Math.Pi() / 256))) END; para.colors[0] := Ports.green; para.colors[1] := Ports.blue; para.colors[2] := invisible; para.colors[3] := Ports.red; para.colors[4] := invisible; para.colors[5] := Ports.red + Ports.green (* yellow *) END InitData; PROCEDURE Execute; VAR r: WinApi.BOOL; BEGIN r := WinApi.SendMessageA(UtilWindow, WinApi.WM_NULL, 0, SYSTEM.ADR(Do)); END Execute; PROCEDURE ThreadProc(Parameter: INTEGER): INTEGER; VAR r: WinApi.BOOL; BEGIN WHILE ~Terminated DO Execute; WinApi.Sleep(10); END; WinApi.ExitThread(0); RETURN 0; END ThreadProc; PROCEDURE [2] UtilWinHandler(wnd: WinApi.HWND; message: INTEGER; wParam, lParam: INTEGER): WinApi.LRESULT; VAR Method: ThreadMethod; r: WinApi.BOOL; BEGIN IF message = WinApi.WM_NULL THEN Method := SYSTEM.VAL(ThreadMethod, lParam); Method; RETURN 0; ELSE RETURN WinApi.DefWindowProcA(wnd, message, wParam, lParam); END; END UtilWinHandler; PROCEDURE Init*; VAR res: BOOLEAN; SuspendCount: INTEGER; class: WinApi.WNDCLASSA; result: WinApi.ATOM; BEGIN Terminated := FALSE; hInstance := WinApi.GetModuleHandleA(NIL); class.style := BITS(0); class.lpfnWndProc := UtilWinHandler; class.cbClsExtra := 0; class.cbWndExtra := 0; class.hInstance := hInstance; class.hIcon := 0; class.hCursor := 0; class.hbrBackground := 0; class.lpszMenuName := NIL; class.lpszClassName := "OberonUtilWindowClass"; result := WinApi.RegisterClassA(class); UtilWindow := WinApi.CreateWindowExA(WinApi.WS_EX_TOOLWINDOW, class.lpszClassName, NIL, WinApi.WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, 0); ThreadID := 0; ThreadHandle := WinApi.CreateThread(NIL, 0, ThreadProc, 0, WinApi.CREATE_SUSPENDED, ThreadID); res := ThreadHandle # 0; IF res THEN SuspendCount := WinApi.ResumeThread(ThreadHandle); END; END Init; PROCEDURE Done; VAR r: INTEGER; BEGIN Terminated := TRUE; IF ThreadHandle # 0 THEN r := WinApi.WaitForSingleObject(ThreadHandle, 5000); r := WinApi.CloseHandle(ThreadHandle); ThreadHandle := 0; END; r := WinApi.DestroyWindow(UtilWindow); r := WinApi.UnregisterClass("OberonUtilWindowClass", hInstance); END Done; BEGIN InitData; Init; CLOSE Done; END ObxThreadCubes. "ObxThreadCubes.Deposit; StdCmds.Open;ObxThreadCubes.Init" |
Автор: | Илья Ермаков [ Суббота, 20 Январь, 2007 00:27 ] |
Заголовок сообщения: | |
Здравствуйте! Попробую по порядку ответить на вопросы По поводу примера - не совсем понятно, к чему там создание окна, ведь оно нигде не используется - просто из старого примера "перекочевало", наверное? Многопоточность через WinApi.CreateThread использовать нельзя ни в коем случае. ББ - среда со сложным рантаймом, и такое использование рано или поздно приведет к краху, например, в момент сборки мусора (когда структура памяти временно нецелостна, но поток-то ничего об этом не знает...). В обычной версии ББ многопоточности нет в принципе. В Active BlackBox нужно использовать либо активные процедуры, либо низкоуровневую оболочку для CreateThread - Kernel.cCreateTask, которая корректно зарегистрирует поток в ядре. И то - прежде чем вызывать из параллельного потока Views.Update, нужно будет выполнить блокировку Synch.BeginOberonSafe (как в Delphi VCL используется Synchronize). По поводу обновления - Views.Update не производит перерисовки экрана, а всего лишь ставит отображение в очередь отложенной перерисовки. Перерисовка выполняется почти сразу, но все равно отложенно. Ее выполняет главный поток среды. Естественно, что от введения многопоточности поведение обновления экрана не изменилось. Почему меню и перетаскивание замораживают обновление - отдельный вопрос. Нужно смотреть, как это реализовано в HostMenus и HostWindows. |
Автор: | Штирлиц [ Суббота, 20 Январь, 2007 07:02 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Здравствуйте!
Попробую по порядку ответить на вопросы По поводу примера - не совсем понятно, к чему там создание окна, ведь оно нигде не используется - просто из старого примера "перекочевало", наверное? Многопоточность через WinApi.CreateThread использовать нельзя ни в коем случае. ББ - среда со сложным рантаймом, и такое использование рано или поздно приведет к краху, например, в момент сборки мусора (когда структура памяти временно нецелостна, но поток-то ничего об этом не знает...). В обычной версии ББ многопоточности нет в принципе. В Active BlackBox нужно использовать либо активные процедуры, либо низкоуровневую оболочку для CreateThread - Kernel.cCreateTask, которая корректно зарегистрирует поток в ядре. И то - прежде чем вызывать из параллельного потока Views.Update, нужно будет выполнить блокировку Synch.BeginOberonSafe (как в Delphi VCL используется Synchronize). По поводу обновления - Views.Update не производит перерисовки экрана, а всего лишь ставит отображение в очередь отложенной перерисовки. Перерисовка выполняется почти сразу, но все равно отложенно. Ее выполняет главный поток среды. Естественно, что от введения многопоточности поведение обновления экрана не изменилось. Почему меню и перетаскивание замораживают обновление - отдельный вопрос. Нужно смотреть, как это реализовано в HostMenus и HostWindows. 1.Если Вы посмотрите как реализован Synchronize в Dephi 2.0, то он как раз реализован через скрытое окно и SendMessage. Что как раз и сделано в данном примере. Поэтому и создается скрытое окно. Что позволяет синхронизировать основной поток программы и вторичный. 2.Я понимаю, что Views.Update лишь ставит отображение в очередь отложенной перерисовки. Ну, она по идее и должна выскакивать из нее немедленно: поставило в очередь сообщение "отрисовать данный объект". А когда обработчик дойдет до данного сообщения объект и перересуется. А тут выходит, что в момент нахождения в меню или при перетаскивании за заголовок очередь сообщений обрабатывает только действия от мыши и действия в меню. Что есть не хорошо. 3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe. Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает. 4. Active BlackBox я еще пока не пробовал. Я только-только начал разбираться с Blackbox. Но я подозреваю, что если очередь обработки сообщений реализована не очень хорошо, то когда вам надо что-бы параллельный поток рисовал что-то на экране (например, график) не зависимо от того в меню вы сейчас находитесь или нет. У вас этого не получится. И вообще все остановится как только вы нажали alt и случайно попали в меню. Я думаю с Active BlackBox будет то же самое. |
Автор: | Илья Ермаков [ Суббота, 20 Январь, 2007 13:31 ] |
Заголовок сообщения: | |
Цитата: 3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe.
Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает. Естественно - BeginOberonSafe ждет, пока главный цикл обработки сообщений будет в определенной точке, выполняет в этой точке блокировку главного потока среды. Затем мы выполняем действия из побочного потока, не боясь коллизий, и отпускаем главный поток среды "на все четыре стороны". BeginOberonSafe - это, так скажем, не "реального времени" вещь. Вся логика по изменению состояния отображения должна производиться отдельным потоком, который не завязан на GUI и никого не ждет, работает синхронно по времени, со Sleep. А периодический сигнал на обновление экрана лучше всего делать через Services.Action. Хотя можно и через специальный поток обновления с BeginOberonSafe. Пример такой графики (с летающими шариками и комнатами) есть в Active BlackBox. Хотя Вы правы - меню и т.п. также прерывает перерисовку. Можно разобраться и переделать политику обработки сообщений в HostWindows, но у меня сейчас времени на это нет... Кстати, допускаю, что это принципиальная особенность MDI-интерфейса в Винде. P.S. А использовать многопоточность в обычной версии ББ для работы нельзя, только поэкспериментировать/поиграться. Попробуйте в побочном потоке сделать активное выделение памяти и увидите мгновенную смерть среды... Почему и был сделан Active BlackBox. |
Автор: | Штирлиц [ Суббота, 20 Январь, 2007 15:06 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Цитата: 3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe. Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает. Естественно - BeginOberonSafe ждет, пока главный цикл обработки сообщений будет в определенной точке, выполняет в этой точке блокировку главного потока среды. Затем мы выполняем действия из побочного потока, не боясь коллизий, и отпускаем главный поток среды "на все четыре стороны". BeginOberonSafe - это, так скажем, не "реального времени" вещь. Вся логика по изменению состояния отображения должна производиться отдельным потоком, который не завязан на GUI и никого не ждет, работает синхронно по времени, со Sleep. А периодический сигнал на обновление экрана лучше всего делать через Services.Action. Хотя можно и через специальный поток обновления с BeginOberonSafe. Пример такой графики (с летающими шариками и комнатами) есть в Active BlackBox. Хотя Вы правы - меню и т.п. также прерывает перерисовку. Можно разобраться и переделать политику обработки сообщений в HostWindows, но у меня сейчас времени на это нет... Кстати, допускаю, что это принципиальная особенность MDI-интерфейса в Винде. P.S. А использовать многопоточность в обычной версии ББ для работы нельзя, только поэкспериментировать/поиграться. Попробуйте в побочном потоке сделать активное выделение памяти и увидите мгновенную смерть среды... Почему и был сделан Active BlackBox. Так вот в очереди обработки сообщений и есть загвоздка. Ее и надо копать. Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню. По поводу MDI - нет это не особенность реализации этого интерфейса в Винде, а именно особенности реализации очереди сообщений в Blackbox. В той же Delphi с MDI все работает на работает и не приостанавливается. А очередь сообщений получается краеугольным камнем всей среды. Если бы обработка сообщений была "правильной", то многопоточность пошла бы на ура, а так же Services.Action бы не останавливался, от действий пользователя в меню. Просто я как бы новичок в Blackbox, то и хотелось бы сократить время копания в исходниках и услышать идеи по этому поводу. P.S. Если память выделять не в самом потоке, а в процедуре Method типа: ThreadMethod* = PROCEDURE; PROCEDURE Synchronize*(Method: ThreadMethod); VAR r: WinApi.BOOL; BEGIN r := WinApi.SendMessageA(UtilWindow, WinApi.WM_NULL, 0, SYSTEM.ADR(Method)); END Synchronize; UtilWindow- см. выше в примере с кубиком. Ничего со средой не произойдет и можно подружить BlackBox с потоками |
Автор: | Илья Ермаков [ Суббота, 20 Январь, 2007 22:47 ] |
Заголовок сообщения: | |
Цитата: Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.
Ну, не надо так драматизировать Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи. И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды. Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя. По поводу обработки сообщений - попробую поглядеть, в чем там дело... |
Автор: | Штирлиц [ Суббота, 20 Январь, 2007 23:29 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Цитата: Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню. Ну, не надо так драматизировать Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи. И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды. Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя. По поводу обработки сообщений - попробую поглядеть, в чем там дело... То что тормозит обновление экрана это мне было понятно с самого начала. Но в момент отображения поток "сливается" с основным потоком Blackbox (происходит синхронизация). Представьте себе, что поток обрабатывает критически важную информацию и в какой-то момент надо отобразить ее (довести до пользователя), а тут бах приходится ждать пока пользователь не закроет меню. И все ведь потоки (если их несколько), которые захотят что-то отображать будут ожидать. P.S. Если Blackbox был использован для управления крупнейшей ГЭС (Unix вариант), я не думаю, что из-за меню останавливалась отображение критических параметров системы. Поэтому должно быть Active BlackBox + продуманная обработка очереди сообщений. И тогда получится хороший продукт. |
Автор: | Илья Ермаков [ Воскресенье, 21 Январь, 2007 00:49 ] |
Заголовок сообщения: | |
Суть проблемы проста. Схематически: Главный цикл обработки сообщений HostMenus.Loop: Код: WHILE WinApi.GetMessage DO
... Services.actionHook.Loop; - вот здесь идет выполнение всех поставленных в очередь Services действий. ... INC(n); IF n > num THEN Windows.dir.Update(NIL); n := 0 END; - а вот здесь та самая отложенная перерисовка окошек. Параметр num задает, как часто она делается. По умолчанию num = 10. DispatchMessage(...) END Таким образом, по WM_TIMER все это хозяйство постоянно крутится. Проблема, однако, в том, что при входе в меню или перетаскивании окна по какому-то сообщению DispatchMessage забирает управление и не возвращает его до выхода из меню / отпускания окна. Сообщения на окна среды продолжают приходить - ОС вызывает обработчики окон напрямую, минуя главный цикл сообщений. В результате чего и actions, и отложенная перерисовка замирают (хотя перерисовка по WM_PAINT, если закрыть выпадающим меню какое-то из отображений, спровоцировав восстановление куска окна, остается). Принудительное обновление можно вызвать через Windows.dir.Update(NIL), но это не выход - ведь с главным потоком перед этим надо синхронизироваться, а как - если цикл сообщений не крутится? Чтобы все работало, нужно выносить эту логику на уровень обработчиков окон, но это решение мне не нравится - не понятно, в какой обработчик это вынести. Среда может быть запущена в режиме /NOAPPWIN и не иметь главного окна. Может не иметь ни одного диалогового. Можно ввести во все обрабочики и оставить в главном цикле, но придется избегать двойной прокрутки одних и тех же действий... В общем, хорошего решения у меня пока нет. Кто что думает? |
Автор: | Штирлиц [ Воскресенье, 21 Январь, 2007 12:23 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Суть проблемы проста.
Схематически: Главный цикл обработки сообщений HostMenus.Loop: Код: WHILE WinApi.GetMessage DO ... Services.actionHook.Loop; - вот здесь идет выполнение всех поставленных в очередь Services действий. ... INC(n); IF n > num THEN Windows.dir.Update(NIL); n := 0 END; - а вот здесь та самая отложенная перерисовка окошек. Параметр num задает, как часто она делается. По умолчанию num = 10. DispatchMessage(...) END Таким образом, по WM_TIMER все это хозяйство постоянно крутится. Проблема, однако, в том, что при входе в меню или перетаскивании окна по какому-то сообщению DispatchMessage забирает управление и не возвращает его до выхода из меню / отпускания окна. Сообщения на окна среды продолжают приходить - ОС вызывает обработчики окон напрямую, минуя главный цикл сообщений. В результате чего и actions, и отложенная перерисовка замирают (хотя перерисовка по WM_PAINT, если закрыть выпадающим меню какое-то из отображений, спровоцировав восстановление куска окна, остается). Принудительное обновление можно вызвать через Windows.dir.Update(NIL), но это не выход - ведь с главным потоком перед этим надо синхронизироваться, а как - если цикл сообщений не крутится? Чтобы все работало, нужно выносить эту логику на уровень обработчиков окон, но это решение мне не нравится - не понятно, в какой обработчик это вынести. Среда может быть запущена в режиме /NOAPPWIN и не иметь главного окна. Может не иметь ни одного диалогового. Можно ввести во все обрабочики и оставить в главном цикле, но придется избегать двойной прокрутки одних и тех же действий... В общем, хорошего решения у меня пока нет. Кто что думает? Все дело в процедуре USER32.DefMDIChildProcA(wnd, message, wParam, lParam) в (HostWindows .DocWinHandler). При нажатии на заголовок или на рамку окна не выходит из нее до тех пор пока мышь не отпущена. Поэтому отрисовка замирает. В Delphi такого не наблюдается, хотя там синхронизация реализована через сообщения. Попробую покопать исходники VCL и посмотреть как они обошли проблему DefMDIChildProcA. |
Автор: | Илья Ермаков [ Воскресенье, 21 Январь, 2007 16:38 ] |
Заголовок сообщения: | |
В HostWindows есть процедура Idle, которая вызывается по таймеру от главного окна приложения. Из нее вызывается Services.actionHook.Step для прокручивания отложенных действий. Мне показалось разумным добавить вызов Windows.dir.Update(NIL) именно туда. После чего обновление больше не тормозится. Итого исправлений - модуль HostWindows, процедура Idle. Новый вариант модуля HostWindows выкладываю в StdCoder-виде ниже. Если не будет обнаружено проблем, то он войдет в очередной Service-Pack. Код: StdCoder.Decode ..,, ..yDG...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX 7.2.s,sU5N.k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O NbXmb.2.AuWA.H.Hi61E.2U.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.bf 61.CcIhgsNHT9N9ntQ8qorG4704D.CbB,708T1U.Et1m.w,IxUA.,U.k38,86.QC18RdfQHfMf 9R9vQ7ONb17.,.D,,6.I12U.U,.JFyuv.U.2m,.d.1cUZT1E.sAE.c4E.k.0.e0M.6YE.G.4.2 UegiJQeFK.3Qwb8R79G9PM7PNZvQRdJ.0U1.,UH,,Uy.,c.o2rFHoA2lqK.o27HHQ52C2FI3Yj yC.E6V.A..2UeEeWQ1Iklb8IepZhZJinpZHZCZORNX2hgnRg.AS.QiiIepZhZ7F6.Z52.KAS.i 80E.QE.sQRtIQeoBjghg2hgn7.X5.u0n9PU.Iy5.,.60cM6.,U00.umUG5.E.Y.2..EKE.4.0E .EM4PhU.wcNC.zwPA.A.I.,gA3EUfL6k.W42.0kyix.ow6I.3QwbGmmoouqpCLLmoouqpGomC5 C.2.y22.O22.1cDsId9N5OP7vQRtHVPNR9JTvPN9FHPMNvPD98DtInvQdPNPv9ZuQZvMTNE3vP f9RD79,t71eMTXUIcgBgXRh0xhsxYdc.3gwP.0.b,0.p.,6.wT6.J7.k,E6,X.16.2Ux,EtH,0 .802.W.0.U,2W.2.0.q5.U.UUV.U4,,k.u1C3......w2.00.k6k.0.,MT..0.800E.606..4E 5k.0.q5.U.UR,,U1V.2.1sCsI.U0Jijxinhgm3ZbYcjRgpxZ0JchYddRgZphnhgbYZUwY0ZhVR A66NOO5PNkIIUDU,2.gD..,.3,,6.2,2..1c1M.,.D0BD0MwcFT9P7vQRdFT9P79F9vQ516.,U rUAUd.,.1U1Ky9U.2..s0,.,.4.,sz1M.s.3gwP.,6.252.I12U.kz1.0EJ.1.V20k,1.1s3E. kX.cwf.0.L,N.X.0U,M.2E0.M.P.16.,6.,Mg5T.OC.2.mL.61sN6.,.sUZ52.UDU7,,.O1Ikm j,6..EBU.U,.J,.V20k22.zT1HM9,d9Rd9PM01.,Mg..2.i0m.4,2.1.06,.AU06.4E.E.emu6 mcwT.,6.YBw.A96.CcF.,.60sD6.,U0u2E..UYU.A.6.6AU.2U5VT0M.6.,U,o.s,6,3gwP.0. t1,.p.0.4E.EJ0.2.0ES9.A.s.,6.A..o.slM.R.4E.M.Z.m.Gk10.,60M.z.8N.M.lE.2Uq,J ,,czM,3gwP.,6.Ix.E.0.p.0.zD.6.J,U.2m,.l.,c06,7.,s76,B.,cPM.l,,M1M.D,,c2kJ. kRUK.z,S04E92.,s2kIE.K,4EH.kAE.i2Gk2UcV2A.cA6,J.,6T6,N.,c16,L.,.2,2UsU2o,2 UXV22,2UXV4Ikmj,6.om7.,EBU.kzF.0EJ.6.t3Q,gUcU.Q.YU1U.20YU2U.Q.YU4..E7k.8,0 k,U2U.Y,AUWU2gU.UIU2Q.2U1U2.,61M.v.C.Gk0..61M.5,,6AM.9,C,4ECE.S,w22UKU,o62 UUW,I1,UJU,A32.M.1,,64M.r.W,4kHUPU2I,sGk4UGV,A.c.6,UXV,I.2USW,I22UlU,Y22UO U,A.2UoU2o.2UuU,Y22Ua0R.,cM3U,Q22UdU,.WC4kSE.CJ.M.TU.YUfW.gj.k.80Y,YU7U.A9 YU4.d.7.A7.Q5Y.k4.kTK.1c8E9O.1s26.v,1s2ESk.G,0E,E0U.A9M16.h6.YU6U.o4M,.c,6 .7,1646.F01sBE9W.16C6.lh.YU,A.4k5E0S04k9E04E.EN9U.636.R.7636.p.1M72.,Y.AUw U.wAc36.fu.YU1U.g6YU,U.YHYUEU.Q00E0G.0k.0.7MP6.J,7s.6.H11sBkjl.C10kpD.7M.6 .LP.0k.W10kY5U.620E.0kVk.4,240k..V,1626.16.AU1.B01M16.Hu.,6.7s.kIE0.5,1622 U.21YUC.rM.s.2U.wj,E0S.gl3k.O3,kS4.7606.J37616.5.1M.2U.oH606.t.1c46.4.7s,6 .dT.YU72.A3AUf.7M.s,EZ4.7c,kO5.1642U.Ih4E0q.0kk4.7MA2.757s1kyH.7M,EO4.1s8k .0U.YUsW.A9M.6.h37616.T31M.2.16.AU1U.wPYU6U.AAAUFE.0kB0.G.0Eb5.1M4klk.W,0k Sl.a,0EE7.1M,2.D,i,0En4.7666.96.YUz2..u1.K.0kf4.7M,k9E0O.w46,6.l,7c,k8E0.T ,C.0ESE0O.23YU3U.g4YU4.R.7.0EO0.7.2QAUAU.YG0k.u.IW,UBU.gl0E0K.Qb,2.a.2JAUO .L.7616.114.,kb4.O.IZ,k.4,,kI4.1656.v.1c5E3k.a.0kPk.u.0kBUDU.gY.k.i.Y1AUAU .A,,UFU.ADAUXE.24AUVE.0E6k.4.,E6k.y.6.AU02.,kxk.G00kHU,U.2,AUXU.A2AU7U.AU. k.8.Ik.k.000kHk.4.0E2k.4020AU,.V.1M1Ewk.800kHU,.F.1s66.V.1M.E6k.u.Ih.k.W.0 k.0.1s.koU9.16.s.Eqk.e.0U.U1.nT.AU8.Pv0YUC.pc,AUGE.Ah0k.y.2b0k.8,Qg46.7c,k K9.7s2EbD.7c,kQF0O.Ah..kw..AUxU.wb.k.8.,Ed8.7c,kD4.7.IHY.6.x17.0EM7.7.wAAU N2.23YU5U.Av1k.G.0kP5.1M.2.r7.AUd.,R.Y.knE0O.2e,.kT.Ex5.7.ga3E0.H17.AD..1M D6.z,1c.kU5.7.w1Y.EBF0U.oDY.6.3C.0E0U.IPY.6.59.0E0.N01656.N.7M1E8l.qm06.3. 1646.n27c.,U.Y1Y.ElC.7s1,U.AI0U2U.QU1k0S,21YUAU.Q7YUE2.,6.Rx.c2,.,M.,UB.t5 7s16.9e,AUF.ba.AUEU.ge.k.q.0E13.1s36.XX.AUKE.0kh6.1s36.V57M22U.QV,2.1656.B 17626.xy.AUO2.I20k0C8,s,3gwP.0..IX.E.0.z5,6.JFA0z.6.0E65.gh.k0W00Ey9.1M46. T31M62.9B.AUXU.YFA.kV4.7c5kbl.8,Ig0E001,6.NQ.AUGE.o2AUHE.gDc26.Le.AU3V.Io0 kzrobGoemoW0GYyqtGrfaKrGqrSrtin4WGJem48E,aEs8rreqmCKuakS0GF8Iq4qlUWgV7whmx gVphdJjVZidxhiBVx2YWwirxiiwhWhgmxhipZX3hWgV7QgjphoJidJAyKtCr2qHE8mb8qm85,N PHvMZvPbPSb9RQiWgV7oiZJinBhjph7U0QetRiolLQimRAU0IYBAVX7QnfQHvNF9RHMD,,...Y hdRgZV7gbUI27uP51klU0IYBAVX3hVphbhgnBVx22qk2qGE8HM0HP4HN0HQmGEaIqark0mW8rq 4qpyKvmGEOqumKqqmtCKtKqmuKEqqrGaUQip3ikxhmZiBAVh22wakAamAag2Y7ZB.UVZgYhgY3 YLBhi,R7NHfQRNJV9N19R998ROGNO8,tM19PN96dvP,NG79P996VfQTvM99NffQ9P1HM9,NKnO KnOHP8F789,dPR99,d9Rd9IUWg,HvQbPR9vQHMDc.3N13M1Jd8HN1PM0HOHVuHZ8J,7HTvNNN1 HM0bOKb8J9OHN76LOFZeH98HbdAN76D8FHuAZ79,NJbOFZuAZ79,tI9fQhPO5PNb99PM0iom8L rKKqmGEqomGrkmGEOoomqmCLK0GYyqtocdZB6ITfQdvQN76F0ZONDPOb9RZPSN76FuP2ejJC6I ZvPVPNZ9RHPNb99PUKBhZtQN765uPR9RyKqmqm8rtmGEC2448bg6FHPM69,tEoiZJiohgmRCwh XNPEKwed,mGES318QH99PM0H6GTvQdPH9vMFPMaqtqqt0GIeGEGqruqHGLE8rmqqrOrm0GJamR qk4akVyIbCJeqk2akouKcmqkCqmeGEqHECnMin2WGJ0GnmqkSKEOqr8LEaKr0Gsmqk66jPOR9N 66JN8PM0HMRR9RH9RNPN7vG9PS,ND,d65tInvQghugiiZid,3tCPM0HMMN9PTvMLONn96EYyqt Ib,ZhgxB19R99NPONPvPZPS3tCPM0GrrGrkmqZKqw.UIxhoBA3tCPUWBjohg9hgt32.IctZiZR iWQbBA,HvENvPbPN,ND,NAV7ArN0Fd8iKryqvuKEaKr2djRCPGrKrt0GJa0Crl8rrmKq8pkuqn KKEq1htAl7BrN1HM03vPZ9N9fQj86v76f76J76VuPZXi2ijBhiZivgV7sNfPMZ9N58O9vML96v 76dtCPUpRiZReZ3iVJiVZijJC,ND,7JZOJ9uC,dPTvI99Q11.BOENuI9uC,N0Fd8,7Q1fQ1PP9 9R9fQb96dvP,dM996fvQ99N,tRH9RF9618QVPNR9NHePd96JN8PUhBhiBhhBhuhgY3Yx2YBBcM 3Z7pdIhc5hcGBZvg,akWuIeKId0mS0GMGIgiHEKodCIEqHE4HVWpRqk2Ye,JcUgbUMCluC,7Hd OE386MEluC,dI7OFN86v76VtBluC,7H7OFN866CluCPM00Ja0mS0mM0HgiHE0Jd0mSAalUEheU g58HgiHE0JW0mS0Wn2fvgV76FN86vVoU2JeUg5KHgiHEGoe0mScBluC,7F786vVr2fvg,4Ia0m SsEluC,NEZ86vV23fv2Y,heUgbUMFluC,NE786v76OIgin4qk2YgZJgpxgUg5B0gV7AVBAV7Ah YZhZhekNMAdiZiZJiqBgg3Yx2Yp2avgVB6Jn8I9O1HM0FmriKJ0mS0GcyoYuIeK2duH,NE3uId eI1uEd86ZOF5uHZ8F,NFR8FrN1Pk2SpouKmc8,ND..98KdOFRuIHeENOF,dI9uEEISpouKmsQR tJHfPM8PM0aEoyqriau2Y6xhjRhvgV7AV7wiiZghIbUgeHh6oZ6BgiZgghgvgV7klWqomKmqGR 0GVyobmoW4Ibin2WGJAha3YrBhiVUAhn3YV3YX3hdZB,tPB96d9O99619QV9PHvM19RHvP0mva 4c8H,GKqSKR0GVy2...FPMb961nNGKEGqo4Kq663vPZ9N8LEemIq.OqoWLR0GVy2.wid,a4T9Q 9nmGKES5ogd3jUQgjxhmZgdphVZiZRiUI3ErKKwGLR0mfaKrkRaEIe0UUIidphbZZUYij7QZPN hPNR9R,tN1fQ3PMDPN,tMT9PNPN59RHvPRnrOKESroUn32UoJiV3ik7Np7630.AB.0ml4quCrm GaoJiV3ig2YdZiUwijphbYCDPNd96H9NNPN,NP9vQbPMDPNb961fPnPPTfQ996Jl4ktKKuKLse HE82UBA,Gqo8LuaLR0GV.A,YgdJio76PPMZvO,tQFvPjfP,d8H,K5eHE..S5EtKqlKqoOrmGKE 4Ku0GqKqkCLu0mruKEqqmC52YeA36Nj99,7NFfC,NGR8JS2rN0F,.bPOpPN,tMTfQZPN59RH1B vPZHuyqrQiUIZd.PvRNlqWKR0mY..PPMl96jPOR1.J,YgZRioJijBjZZgu22.q.SLoKqmmKcyq teHECJYyIdGpYuIein4EuaKumau2YKBhZFLGpoGLqgV7AV37Fr,Goo8rmCKuyatJZUg5.Z0... .QiiYcdJiZ,am4ak2akuuqoGLJeHEaIbgc5VBUdphqBhnBhWZhZJZu2Y0x7.MRqqrOrm4Klmqm ..El4qliqn8rrKLrGKJeX0,gV7AV3,sI5fQTX7phaxhe2YxcI90QflgfBAV7AVnBhuhgeIbUA7 .kq4qtiKJeXHhcIRbBA,ABJ79,NP19SJ79,7Q1vN9f8N76VvPbf8p76H0.YimtM0prCLJ.k4ak 2.PM1HcJ1eIPM0OroCru4KqCpl8rrc8p76.i1qqmqqYuqdGrkGruCLJeHE82.ohjBck3iLBhiJ Zu2Y0,66Fd8aIn0Gu8ruKKEyKrmqw0Guyqr2YrBBEE4KtKKECLoy4.RnVmqoKKrGrdCKt....6 RFPNCKqaqm66jPOEEyKn0Gukk0bg,kv.GqrKqtuqHGbYBhn3igBgt3YnRgmxB0Gl4KtCLJam4a UahigZhHBhuhAI6...kl..wBUV,..YA.....UXJiZdPJdC..OoumKqCrl8rm66YA,,VvP2Ye.7 POqGR0GWaKtK4sCPM0qqkaKrqGK0mlmqokKmGECLu44bP9p76f0.sCH68gBHfP,tRH1Cbe.fno gZuMGR0Qb7UmhgnxhghioBhjlrOahBA.2Ye.59RNvA7P9p76f0.k4sQ5vJP79CrlWoKeHEa2.s Q5fQoBjHmGLo0mkuKm0GoKqoSKoGLEemIkqkfqGK0mq4qo2dhIbU..gB22u4QggBB2YVJiZBgU QidJD,,.FuPTvOJdCW2iXBA,dvJHfP7Xg2YaxedpBIbUwed,r,Grk8rnKKu0mku4BfQTfPd96B vP5PRb96jPOR1b1AVVxedpBI5.r,4qlGroOrkGrmGKECKoa4SroUUI3cP9vRRORPfM9fQp76H0 .ohphhWFEOqrcP99Sd96ffPdPO6N,7NT166J,SrouqUuqlWqr8LR0mfa4Q56PHvQd96OaVZhg3 YrBBsQNFn8bh3Yoxhk3YoxB3vPd9RTPPN76BPOZvQd96HvQ,7NfPPn96FPN19N8LE.3vNjOOR9 NI5.r76H68QgpJimhgiZC3PM5vOD12YrBB69aKn0mkuqw0GJa0SLoaKuKKV8ruCLomGEuqumKq 0pmuKR0mXGoYIai27YBr,7vP5PG5vPR99,7NHfQdnYCqruKR0meC3..aanZiVphXhgu2YJR8.U 7UV3ik,UdtQd10GJUXJgKBhZNNZfC,tJUvA,2inhgpZgj3YrBB66BvPQggBhkJgjBgmZgUYgmB grBhixgUIZd.AggBhYJbUUA,H.59P.QgjphohgiZin3YdRChPM66J,q44olG59fC,dE.UhVUAh n3YVRgoVUwid,e0AgXZidNMaKrSKR0GV..fvQ9HEOqr8bhxhpRiZ3Yr,AgX,wBe0UBxBp76LON ZfPoZBxhYhighgvg,OIt4qqKKc4qouKueGR0Gc8pbCoWGoe8pWWm4ak2akvuau2YJR8.UUghnx gg2Yr3eVJig2Yg3eVJiu2Y7,AZu2Y7,QbBM0DONdvI5fQTX7,p76V0kW....IgVJiu22.0Gf4I d0moogjJbUQeXJij,AZu2Y7,M1QeZZiH,Ue..90.....UU.ERUj,QbUIiZZgmBgrJbUAdC,a0. in4qk2ogjphoZZUAhipApleC3.k4sQdPMdntWIK0mkmKqyag2Yo7RIbUAdC,M04KqkdGLtmGEG rrkdGLtmWWBjotIdfQp761eIZOEn86ZNBh76TeF,tEFOEZuCPUdZAGJt4KsKKme1Y7M1Qicxhr ReoBA9fC,NG.a.CLoyaUQgjhhhBgiZgUogjVVVr,I3qU7Yh0xhmZAZ99,7R3uPZ1Ii0xhm,8KV yKtER00.UkBgXhABvPZHuktAhi3YhBA..Hk46P1vQdPJV9N1Xu.UBgVB6IZuH50KIECpl8rrMH T9NVeQ9vQbPN796FN8p7630.3OFDOGRO1HEdKIeKJduIEKpd.DONdPEbPSRvMLONnvIdPMdHI4 nMWoI0GS0GMqk2KIb2YHRgm,T1UvgVBAVcIZUAgp3jdZhdBgmBjU2ijJC1fMNPN,7QCqmGqusQ ,d8g,.g6DONdvI9vMdPOTXcwiu2YL,iHEOqrC4NFvKKtGroCqkmKR0GV.k2ak2UKB6,tQHfSmG ECrmCKumGE0rrI5H0EEUqBggFR.M8rN1HEfkqCrneHECoruKu85KKtoZExhgZhHhgXNOgdnxgv gV7I6M0Fd8,7QT1EJaW7MPbvNRdNTvMfHEenS0GnyqlsC,NPbHLOrm.0GRqHEOrm85sCPM0q4S LoyKqKqdaKxKKEenS0mMiHEq40rkYiHBhu,0nR0mqC5Ecyqt0GRq1qk2.hPMNPO0GRqX4B6bWU gBYgjphZ3Yu.k4sRRdFTfQjPMZ9N58RZ9PPuQD98PvQDP8rN1Ad43YhRCR,Ye6hcChV7M0bPO. PvQDnv.sC,lmCaUIbx.05CZuVkxhn32.EcsCPM0HM0HWnBB0GS0WUYe6h6,tQH1pVk2Y3p7A,U ZRAmHE01UZVu.modaIX0mtUy2YnBBY8.I5CrokWuIW.6QTvQuHEC5gZUQiZRAGJYEsy4p,.U3, .ES0GM.UuEMcHqk2akWmodKIECroERMAQCcC2av2YkxBUBAV7cHi1Orkmqo.P1h1qk2K2,tF99 RkosCPM1H6I.sI99RTeQHvNHfP,78jXL,.Y3.I5.iHE0rrI5.amR68JltKKu0mr8roS4yKnwCG 4DtQ,dRHXUI3cJ.p,IC.buMZvPgdnxgvEVMGUkdQ.UhVa,,,B1i1oZqhAUUUq,sCMPsPV96pND Coru4MNsNT9RT9ITvQr76P1VvPb966QTvQrN1a.YAcCo6sCAVr,44.W0DP8PkWu2bONd1sCPM1 kV.QATXU2ZrJ5j0Q5Ug.Uu.kRYgdJiu22.EIsQ51IiZZhVZidpiZZZUIgt3YgBhihgUwB,7Q1v N0mouql8rmqqmu4TfQ,7N9vMZPNP1e0o8Uu.UZVH,q2r765fC,tEMMgAumVyKrICgAr76hfC,d JHPNCbKVvgV7I6a26QYC.sM,dCvlvuGmyqluGeWqoCrVyKrG5EIamR0Gv0GRqHECKLGJocFTvM fHIamRqk2akYOYcoiUQYUod7Z7OGEWGvAdH3Y1xhiNM.h0H76d8Gg,QcjpB.OokGqmqok8rpCL IOLICoru4.h0uGeWqoQ6IC.N76BOENWdgV7MFQ5gBoA66cNkRUioC.,,h1kR.wBEmaKtin4a.6 Nu4pV4,r,j1AA.23A3K2,llUvgVBg,FFJ0mqaqtCqmmKq4KrKqrKrt0Gs8rr.EJam46I.KY,Rg ohiVZhLphYJZU2ZdI5f06G.aEVMGqEIem4ak2aIXcNjOOR9N2YX2YC,ojaxedpBoZX3hdZBOGE Oqfa4MRbPN796d8G2YGhcIh8ogL,wiiZgBA,m2,dI98Jkq44PM0HMFRm4emIqk2A7.66..UiQA ..gC..cN.S5EaA7Kpd.HuQjOOG4hOObPO68PPMHnI0mF0GM0Ge..P1P.g6.0n4a.RW7g60mUCK u.in4qk2.UI3hdRiL,0GISLrGKR.6GUdIbUwed,rN1H680GmKKuKKtqqouqm0mv.,dMn96H9Rb 96jOOR1V8RZ96JN8Ic3,HkYsRR9N,NDCKlOpoMNumvuKm0GeW2.QgWp8k4ak2KIa.UHBfHZ8Pe 9hOEN88jOOR1NleC3sFwedpBYdjphbBccwiiZgg2YkAZdgV7MFRm4UUYecBB.rl4..18QVPNRn YEIOpU8ZnJbUAcG,TeF,,ZGEuKR0mY.iXpRiZR84aVZCIbUI6UdU7o8YhZphuMG.Ahg2YeJbUA 7.GKR0mU83Qam2YDp6UBAV0,MEbuI9eId88R96xND,7AN76Z7AHtCPUd3Yug5VtC8pW0pW4Ieq k2ak2Gqhaqi0GRqX13dG3Zn2a63Yf2Yi3YBxd23Yl2adQbUAdCRccAhdQbUohUIbxcP,7FHeJ, NAVtCPM0akYMRb1.2Ya2YcAhUgdDZ6d76vlNaGEOGEWGr0mF0GMaGEGJYEmipoq3IYbIYv2Y7p 7669eHkeuIeaIa0Gr0mS0GMin46P9fP,dCvFaKIbWmtaGEqGE4nRqk2IhUIbx6A0mfWoYmoW0m tiJpqJECGE2fUYcD3Y7p7eqI0mWuYvU7Fp0mJ0mo0GSYhZphUYe6h6PU7I8VOF2Y2hc13ZdBZv sQreOIbx6NrOOiHEa2keuIea2H96v76Vl4M0bvKJPLEMWp4ak2K2PkW6618QUitCq...66FdJs Q.w7.,7Rp7610.M8r,h0NXu..H1.UX3husEFWvg,.YBI5m2sCPUd,VtC,,UdhfUQYU..HHE.IB .Z0sMF96pNDGrheqiiHECbdFRsMFvC,NGRWetC,NGMOgeC,FtMF96v76V7KH76TeI,78HnSYhZ phdQbBktYhZphUgZUAaR3YuEMWp4g6.QbB..QeoJid3iIBhoFEWGf42bXKBBCbIBBAZvgV7cJM Op76H0k4.kYsQr8Av86v7637D376d8GU7ABMA0mfW22ZnRfdlFIYyIYd2Ya22bvKUkM8Gob0mt iZUg3.bvKqpR.MF.H6F9uEFVv.0GR6AM0M1EECJu85UvM1.U5dPdOOdXUsRp76j066RPMPPNp7 61eIU4,2YKVoBhoFRA6.UdUcknKKrKKt4KuKKESroUUYidZC0GnyKt0mk0GmyqlMNc8M0h0Rnv uokqqmEdUqY4TeF,,iXdJbU...A7SLLCru8KEGJY66dPOsKVNL,dCvFFmXv2YoBBMAv86pVk66 98HKYoBhoVk.UC,a2RPMPHECGE8GF0GeW2PU7ABkRq.HsJFOGNWiBghtKHPL,t60XUY6a266.A 7WmoobUYad2YaEr4qqkKGni0mSc93N8,,5OEV88RPMUngfd2Yx22Te6H76B,.ENqpI0mS6F3N8 ,d7..4niaGEq15e6HN1Hk2GJYKIbU7ohVhB6BI52fBk2K2r,4Is0rm68dPOdXg2YiBghN8PU3Z 7qk2ak2Goo4Kqc9POMVvIdfQHfPWmuuKua4GqZ69,dP9vRgBin4A,10.Y3.6618QV1HWcYid,U phhWFK0Gryqd2CsPAZvg,AdCRccohZxCUdgV7MFR0Ad4tREEUUAck3C23.3dD3V3l4UUw6R1Q5 ..6I19RF9JH9R2YcUL,iXDheI3YoBhoFRcIkb.a0o8YhjRgu2Y4BhgFLmorCqkwhmRbUQA.rlt 4HK0mt8HR27bHX.BORNHb4qqKqR0mom0...YhjRgUIbxsRmqrCqR0Gua40GRqXWIYvgV7AVLBd I3dUYhjRgu6GT1UAlkEEGobqk2ak2a42av2YX3hUI5mqrCKL0rkGLoiJMqpR0Gp0GRqXkkt8HE enSI2UL37sMF96576V,q.akY6859OqXWYfWAZUwdGll.Td6H76d8Gg,ak2QilQfehfUUk2fv2Y n,CrMGmR0Gp000n4k2KIa.HM0C5.5nRA7IBP.HMFRmRU7AdCloQ559Oe1N1UdhfBAV7MF.C5.V 7Kq.aIX685OEQilQfkgfd2Yxka8mI0GHkU.XNLH76sHc7.cAvO8,,70BVnB4bNL,ND,7AaWDJe BU72Z1BcE,V,I2.50MA.T0.EN.C2,,.CXd22geWAZUUnFOqJEqXk.U723.V,IYGJYd2YakV.41 kd8mI00.I4UG,.sA.50sQY46AAZBU7oYU2ZnJaUQYUI2H76d0k2Gro.IYcIYv2Y,3C.69,tQam R0mU..IYdIYdgV7kWM1akWm2MFRmRkU2C.kvuGr4qqAZBMF22.d0i1.UIVHZitZB,783PMbPNN 76B9P1nteHECpWAZu2YHh6rV0,MGojcwedpBQiiohj3dHRgmxB0mYuIEOKqkI0GeEEaIbCIaWG l44Iak669eHin2W0FvPZntC4IgVJiUI3MG..oeHRgmVU....UlAZUg6.hPNZ96bvMEl....ZON bPOpX7pdU....4HQaGEK2UnBBHfPD963vPZ9N9fQ,,I8d08qkCbBAV3VI,kR..9eL,78jXL,aG EKJsG4Cpl8rr.b96FdNTvMIbUI6.N76ROFjuCPk423WYjFJaWB6I.2Yc2hfJbU27AZUAcXNOhX ZJZU2Zjphu2Y0,.YZUAc0R8kRqk20Jd...ocjRAeWcwB........8pmCroc8,78j99,7Op76Y8 M8N76..M1PEIsJUUQgmhgVZidxB,d8Ec.kb0rmuKWyql0GISLR.Q5N99,7RN76Z99,FR0mY.iH EqqouKK0mq2ju2Y0,sC68JFnaKtEs4KtGLEyKnwdkhAN765PMNnmGKEOKtEmaaZ,umr05,d8Hl 2o8YgrZZUYAN76ZPNbfC,NG.wiiZgusF7Wm.EEqKRgeHVmMH7OG5eQ9PMKqdGbpRAr765fCC24 48rtQ6ICgArN182U,ReH,x98j0QCHvQduPT9P,NGRmvuGnmqkS4N76Z7Ai1qKLGroEEUWU7A7S po.MEf9S,NGR0UUYe6h6qKLCKq4qtCLEe1yIlKKt661ORlf6PM0KIa66Pf951..GYXJYBAV7cH in4AVhNORvQdPMERqXdphnZCsCPM06S,dCgeHh6sEjOJbPN7ONBPMf9PdvCPM0MS,dCv,...Ur 3Yug5....WKEenS....a2F7P,dDv76aGEO0d96xND.x98F7P,ND,7AH,FVx.cQ,ND,,cM,NDM8 ,7JFWBk2qas,NvC,NPRNS,,dvCPU7A7ICx76NP8,d7ET0GuaGEG3U7gBj18LEqGEmqREo008KE qGEGrR0mvuGnaKw0GR6JZWBAV7AV3l4.rFIem4MG6PmHE8rI00GbwcMH76d0M0PHwUg,j96cQ6 PkwUolq2BcM6RwC.G3kWm2PU7.MJ....a5....kv.....W4...M1HM0u2emIq.PntAjg76pVI3 B.FtSv99,tROKqkIin4MGoDj0S5R1EE..,,U7lq4Kw0GeW2,NGC2Pf9b1mGE8HOaGEK2H68Jlq MOPPOp1JVcIZB.MOR96d8G...nN8,NF.aadhB.emIq.90aUh7PVOMZPMP96pVHBfH,kYu269,t RHtCPUrtMF1e1deIQbBg,HsMkvYA5f9d050.FN8rN1A7GqooZWBgXRBEm0Gek4kvYgjFcEdKql 2ZgZZUYCY3amRq.H6Nj96pNDWGt0mKYhUAZUYc7p8jf98rkqaigiiBhoRbUYgc3Yug58KEqWoB ZUY6..EIeWIxd2xdu2Y1dQZ1,7RFPO0GJaW7M0HW2xhXhCsQRtRuqfaKmG5HeHCKLyKsGrt0Ge W2,NPS5ghVBBj8698HbGEsREmSLEKIbGoR...6G9PO66HeH..6OkqEY0mWm26OEmWKEKIb.qas ,VtCqat,g,wCBPOUI,a.PntUUUvhjBA,90sRRHEenSg8UHhgiZgBhgnRCAccQggBhZFK0meC3s JPOH7OG50YZU2ag2YHBfH,18FZ88PP8HtCPU7Fm...q.8rmCLEe1jOORPEVHLCpmGrfohYtRVu Pb98PM0ak2S5N76X76Fd8WofuIWyJVyIeGpbqIEemImGE01V79.SpoA6sJVuLRuHbOGpOF,t8, tJHfP.kayIfKoIqk2a..oD6NQCUd,wCm4.23P.HWhBA,,0GtKqt00K3kdWqrwedpB2ZrphYZ3b N8,NFRW7.1no.EJk2a.AB,,.....oad2Y3l2UdNO.M0K2q.5f9bONdfFTvM2ZrpZYFLG3OpoKq vWmIamRq.ZXU..KKu.oBHtCP...KJsULBhi,k4akW66TmmY6in4qk203.CItKqk6FTvM,VidCK 3EY.rlv0pkEK0Gq03IbUAdCZ8M8r,FVnhgXxhiZgU2iV,.N,.kva42YcdPcQ,,o8IiZ79,tMj9 9CKomGEKLK0GmmKK0GmGLK0Gm8LKYgWJbUcHUvER0mf.rltGrw69OKR0mdsCOLR.bHfkR0mlyK qeHE0pr8LuCb1xhgxhmRbBk2GqleHEK3.kRIiZRgoZ35fQ9vMdfC,NJ.ZON5nRQgnJbU.6I5eQ kdUoVusEuaV,Q6RHt.rV0,sMb96pVH,o8geHh6..EKYhE,HtCPUr3Yug5.ULdP69Qii2iVJCCL LmKc44a0ICUJ,Q8SZiVA,EK24C3.A7UgUdQbBkvumvu4pVrphYR5HEm.f0sFYc13ZrlIi1Sbkx hm78FuPbHcICbHcyKtAZiQeZ7FYgXZZUwiiZAkYcT.C5W2y4,,..qk2AVm,.sIQeXJCIeVtNWm vuagMJ.8IYyKteLK0GMmWnRgm,EK0WdgV7MFQ5.F,.O3EE......91EdsNW0.U0peZ7RN76V,. EK..oiUIbxsRR,.68iHEOKEenSQDrN1HkfaIecRp765uPAAUKVUYcDh,akl00OLLGJoaa1Fu85 KacA3kYsM,t6,,,7JFWUogUI5CKLyaolWuYBkWm2Pk2o7klyKq0GRqXKBhZtQGbVphn3iVJCR9 Rr76hf9DON8okC4EmWmlyKqamRq.jHmmqn0GRqXcQj1xB44EryqV4KtKKumGECor..bONNPN59 Ryax3Yh2Ya3Yx2YvhjdAVcI3PPMbvO,NPT9N9HJg,HM0Hc7Qgj76vFcyKtQC7POEV4ql.AZvAV cEmaqkEEAgX,66JN8qU7QioBD008oYGpdWmeCpWU5lfoBY7.M9XdBHN8rN1QC.GJosIEICLua5 ,N9,tSZ7AN76ZNAN76X7Cv99,tR.i1a2j0QCI8a4.UUY8g,QCERsQdPSM9Wmfaa,VLReTZe6Bd 1Rd4Je,hd33Yf22.MH18KHOHHeK9eET8KHlJ00.IcDJe2hcGh,KIa.H.cC.Q3.Ee.k4ak2KIbk 4ak2a27Ht..G3k2.e1.P,...00oB.P0.0mJqk2ak2aEESpou4.HeHHOHHeK.,tJ.cEUUQZUw8. YcAxc4Je,lIin4Et66sJ.b8OTndCKtEV4KtWmvuKmsJ.8oj8obGJYmGES3EX4IaCZdU3,cQ.f0 sI9nf6NY7.M9YZUwdGZccQioBDamIi1C52YuEV..D0..Um2adAZvU7FzGqo8LL..EEaY1ltG5m WsAZUgcAR8,NFluEN88b1.uYvAVckv.,NN7vN996JV7AV7lvYggFeW2WGJ0mY..VN8,d8H7698 HMGRuE.MCH7690EmAAMPTnkmKEOKt4qqYZUQAEEYgb,PM1ICUJ,Q8cP6H..mGEyId.A3r,Z1.. .03SLLSLrY3VVk..iLMmGE4HK0GNmGECHK0mOqrIin4M0FVixhUQidNNNFryKEqqrOrmmGEEx0 mr8LmKKtm0IiZZA1HKoA6659O1fPDHm0GJM0H..U5lVmqoK4ZON5HISLrEtKqlAZvg,KLEe1jH n85u0G55vR,dCIiZRARdQHvNFnR0mlW4.8qrGLuyavgV7sR05umdKKuCpoebc2ag2YkAZvg,6N TXE7PgAWGmmKK6RNVmFmAZvU7,BPOY8g,A7Gam,Ui,.HsRUHhAZON5XkYZU69GaUg379P,79,7 N396PVoBZU2Ze6J.8bXZiU.,d8k2KIaM1aU7A7SbY,66jXj,.6AQgr3Ye2YpZZU6O,d8,NRHN1 M090,tRR7N.UWxhmVLZZUIgj,sMj10mK0Gly4.F1.UdgV7A,HMFRm4M0.98HaIXwCm4k4klSLE e1F7NZ966PH7670fvCPU76O,dCEl00G570.j1.EM6AYgm,N99IA6Rqk2akWMFPU7ICUJ,..klm qoEKQgmhAa0sMj1WWm,N96L76Z76J763vPZ12Y2B72Yf2YlQbB.F1cMEu0mJ00....aIXojc.Q C27UUA7cNN1H76BVXxiUobUQgmhAuGtUUgZUYakAZUY82YXxiUI5CKtK4.6CV7690PM0..UK,. ..Way2YX,8466PFO.Eo0GR...l,EIk2UXxCxFtKqlcQUI,SbuEt.U3p7A,UcdD85IAUI376Oe1 ..9eHc8Ur,.2ZW,Y331..,t8,7NZ966PNFly4.8KEEua0KIbQ5HkYkvYbU2aU.wCpVk22.EoYb U24.FHR..jndKaH,5vRN,HtCP.8pmCLuyKtKKI01VVXxig..f8Q71rN1H..buMElEIOoUm2HtC PU7FzSLLOqo.wCbON..0mW.85ke.kfoBIeZRAS5.H,SbhxiUI585uGt.PFtK4mqmOKuiHESbh3 hUIbx.IAUhcQEuyKsin4aU6tQdPHC4a4umYuqtAggZh2Jij3iIBgmxAWmvu4SrIi1SbnhAfHEe nSYeGl4g60mV8rmEWsC6IQc3V3tHVHrGIqSKEWWu2YL,iXgFucQN763fCodItFQ5PPOmWhFRI6 Ud.FVa,AA.69C4EnwBGqogAyat,00AVK,CLK6SQgtZZUQgrVcJ5H0UrpBplXEN.ktGrwcC,tIQ bBk28bXdC.I8QbUcCcPABkV6RZvPgAr,.4283jOOktAhnZ8MGEnUg2Ym24ktUU.FXH,FtSj79, NAn79,dAZ79,dAb79WGJ8nOmGJaGECnMqLK0mv.amRaEI6N44mWnBjnhhZphpZZUIgjVmZ359P 0rlWqocQ9fPN76VHsKLs0GJa0SbX3B22o6sC,tRR7NcCYeGlREtQCMJ.D0u483Wmq4qoY3ZPNA 3sMj1WGtKqloZm,.YhZlI0GWENin4ak22jUI585.,t8,tMjHWaIf.2B68UW,.6RAZU..n96pND 85UUQZU6OGoYO3kY68o5AZUo2Gby.cTW0vFMUckS.ICvFM.3nSkI.PU7Qgs,NXXBjUI5GbBk2a 28by6Po2cDG5d0k2CqvUm32mqR6Oe131dvC,tROqocCY8g,HM09WB.iXc.H0NHSICEuY53P8,, k2CKwUgVrdCICYBAD6RQgc,31dXr,Ee.KIaM1AVm,g8...F,.a0sMj1W0oZm,.YBA3.Us,ZPN. 00Sb2,.F1W0cM..G5H,.MSEt.222B70qk2akWu2e0akYcPTPEV9QohUY8U7QC66sQUfsJuqUkf MH.kRq.SLr22g8U1JiZBASZiV33j,3ZLBhi,MFluL18IVuJHeH7uHj86L76j0.6FNuFPuH7OEN eFZOEPGKqk2AV7..8mb8qmEEYhbJYg2YWIYg2YnZitFKQgs,sRQANN1HM0a..ME59Rf1GKIaGK 2agMOC5RXgsIn0P0W0UgUdg,KIaU7AVr,...y4sSVNTN763tH3PNUg,..l1sMj1.H..A6.Uk.. ....kWu2aUm,.sIFXLdPyacwCmWlAZvg,CKEkvsPY8Q6.23r,u0O2ELG4UKNNWWd.Z1MJ.K4.R nIg,..MJUL,.PkW66TmmY6in46I.sEU2Zhb3YccPeXJR8EYUZlv0pkEKYBER.M8EIsQwB7Hs.. Nll44.wid,,7O118LE.h069wC2B,7NNXYZCGKtmWYdC.Q5eXLFmsCPM0aEmYZUghZphpJbU..s C8bXdCKpd.Z0rVnle.03kdG5GrRqU0,PUXRiUUHtI.Wme...Y3.H,SLE..sJUgkt2CsQHtCPUm ,g8UHlfoBY7.mWkkd.U7,Y3sCsRRtR2Yukvuav2YrtMF1EXUvELGKq2YuEekRkYcTFNOR9INXZ 3Y7pdUUg,,7Jk4AV7ghZphp3Yuke.S2bOSb9R9naKKr2ZrFKM8k285.UGNPTnmqomkqKKrY3Vd FV7AV7GN76rPTHtCH68Qe1xfHBdOFJM0HkYEryqU05uKEUUIC00..MN2369EN0HYmGEEEK2aEI .POGa222A,85...9Xc.N,CHMWIK00i1.10.a....MN2369MAZ7AF89..ZOFb8JTeI986JV7kY6 N8LLKLrqqrMM66d8GgV7M0HcQ...qom68EKEM4HMWIK00a.kayIf2Yek2MFQbBg,HEm..S27Wr lIi1wCVHt2Z6VExhmtQ0ZmN8CpmY6G4,tR.A7uLIS37XndPW2y4,,..U7IC..bWHRAcI1nn23Y 3f0EVW2p1QC.694nIq.K2AV7MG68.Ef.00...HcQ..gA.ZWb78..8If.V79..N,kW.IC..DW1, 83WmvUmhAa0MGwCa4d0k2CqvUmViIidxAiXX3Bp,El.r,akvYAQ883WGM6AQgr3YesRRFt.Yig 2YX3hUI3j1.AZBM0KIaM1aU7wCEcYBK4G4YCICM8U7QAEIGKtEmmqIY6wC.kRq.aklW4ElUo76 70..U7wCkd.24017HEEqm03966Rq.KIb.a25vRm1,,0mlSbuEM00.Eo0GS24.FHR..SbHlda4. FP8r,cICLuMNEMsMj99.UJ3Cggv..QeX,31.H,kd..M1HkW.W2q2.u06P.85.SbvUrtQEEe1d0 PkW6650Y6DvCqk4qk2WWesJUUIZeM128C2g6FtRw8kI0GXIirBAYim,J76FdJ1WhFR.kmQiigd ZRCM8N7698KdOFA7QbBA,h07fC,dE.rFtKqte1sFQbBcEA7MGwCUUQ2R0k4M0hOO9ntQeZdITv Pd98jf9B1mWr,oZqBBmGESLEqHEOqfaKrEKwii6PkRq.HsRO2jPM.cLFNPbvNHtCkfUhRibJ5. .buMka667uHk2SbJ,.84.g,akWm2P.uYv.HWcwii.0GJ0mxSpou4CbdRi,7SN76j0.d0v96v76 rXUoYUsRCrm4LECGEkIY8.H6N,dCojcw8.RPNhPNZ9FHHu2Y7p7.aGEOWrtQoZ2BhmFIamRq.a kYEm0mF0mvuWdJioN8,d7WWUg51vJHfPM8G3U7cQ.f08XHhgiVn,1mvumv69K3kfod1BcXZidp CY3X790nI.HkYMJ.HGhyqrqqmGKISLLS5H76576V76EE8bn32.6FZPMjPH9X0Bgm3ZhBgdN8KI bg,AV3l4.kWU3FEOor85.sCPM1H6I...sI9ndIDJFIAhYZCN76FPNER0mY.a0oe,Ft69WLK0mw mGEGqvmWYdC.QbUQgmZZUcQp76f0cICav2YkJbUgeH,0praKrQbBAV0lYU7lv2ijJC,t6,dH22 M1AV7FIS5dHEqHE0XUUchgdVUg56J66jndsIcLFNPHfPH1YZUghdpBUdg,gcA,AVrtI91kvaKm Gbg.M8rN1AV7IC..D0.9XcwC69CKta0M07vRkvaKmGbUgZUQgmpZmBhblRYAe1FPNH1,N9ElyK u.M0HWy3Zd,.oA.wiUQYUQgWp8gAH76BVcYgr3YX6AHlb2279O,t6,7Aa0M1M085ke.kfoBI8. kv8rIi1A,Vf9l96pVrJiiYhZpArFsumwI5EuyKsi1Hk2A7sJUnNOUUA7.EeEE85,,f0sI5fQ9P NR9JTvENPO6859PK4NFsaGEK2r,aUs3YuEsuGwiHEaLEe1Ajv.HkYsJ....,7JF07OF5GwmGEG qv0GWa2ZN8r767OF5mwmGE2hUYc7,,NF.aUrBhYZCe1jXm,sRZHqEE6NjvC,7O9POER.3122S5 dvP00WqRqk2M0a2jnl.d8Gg,A,85ke.S250I8sMUgsM.a.71QgmdQkREEe1cMUBAV7M0K2U7Em .bvMjuC,7N.Wo4aU7A,9eHi1A,HWs3Yf2YrBhYZCuHEGqv0GeW2,7S,dCYgr3Yh2YrBBMF.aU7 lw0mJ0Go.,dD,Fo0GeW2aLEe1Wah6O91g6M1aU7MG2Dt76006Se1V,M0A,HWt7D,,kwI5.68qU 7M0a2lnJUoFTsRG3widZAI5Gqvg3l969eHk2A,HWtt8.0GT6OG32hZBBcC6OqWt3Y3,emIqU7M 085ke.CpmGrfoBTHc.j101l99a5jPO79Rm0UggV7A,HULBhiB6QeLFX8pUsEFOERuF98F,t8SZ iB6.RGhyIdG2..kUCIeaIf4IeKoIqk2M09WBM0.K2g60mdKKuUvgVB6IQ6..7Xd.dOOdXmIZU2 ZoBBI5h0bHeYCaGKod3tCaEI2YVRinBhb76RPM2YjpgUwidpBY3DPNRXVNN,7RH1,tPf9R,tPB Hr44NlkuaUgikZA2YrdP66d1IgVJiU.HcJ.p,.WKR0mf.r76dfC42aZm.Q6ktI510.sIFuHQc6 B6q..HMEbuIkvUUQYU69,dAV,QeoJid3CH1F7RH9RAZvUc3Yukvin4ak28ZENEqU7AV5dPd0WG omGEGroG5NFuamR0mt2YukdWob68d97HtCM0Z1MJ.UiVIhgsZi,3ZcpZrphYZ3b9RH,2B6OR7P HfPWmfaKrkIqU7g8Y7F96vlvqk2KIb.UmQbBg,..w8UU.EJ0GIG5I5.UdU0,..66.Q5akvuGua Ku66pVoBBQ57OO11R,GLtaKr2ZrpZoBBY3a4a0kd6JENWGuaKuM8PkWu2.QbBg,...Edogmhgn 3hIBhoFJQbBM0h0d1e1.kRAV0,....M07mk...EK.amRkv.EN.am4.ZONB16RQ5P....wcZZiI ,JFIyoeG3H1p,.M8rVcknYiUohVFEkv.,d8HV7o8IC..I51000.F050.....U7YC66sRR7RkRA ,HeFGroEEqXWIYU.PU7ICUJ,w6SZiVI,SLLEKEKYd3p7dPOM8HtCM0d10GRsQd97r76b8RZHs. F7RkIqU7g6qU3FESYo,iXB..UL,aWHld0rmCKJ2ZgxhXJ5B0u044iHEuqkcCOooUCBghtCCqru KveHEC2hPNgAbnVy4UdQbBEfEuUu..Q5HcE.a2R1,t68WU.,tG91MMLPNBOONPNROMPPNFdP1P PmWWIYdMF.j1C3uJEWGq69uqkUXxBamRqU7A7WGq66576RWdc7wiiUUUd2YI,DONR9I1HoAB2Z rZZUYidVdQbUwCbWI,F7RkI0mWM1UH,QbBg,.66..POMZvO,787vPN76jvOp7630M8NFb.O3qq k8bu2Y1Fu85K4qok8bBRibR5HcE.qqk8rpumtWqrSLEe17vPrN1HM0P1OqrC4,dCojrRhvgV7s RO244.WWVJCHtCPUEJij3iZJCKaiA75PFZPMPM090POMZnRqk4....yquCrmGorSLreGEWGwmG EEughZJ5H0UhxhYBhaBhZJinJbUQe3N8682hVpBNPN,NM,NPTPR2YYxhrphUggqhgiZiUAhi3Y r,0GJk2O30rvmGE0LoeHEa2.dfQ1vMeHEC2.6JZPMgdn,3W7,dfQ1XighjZgd,0GRMPT9N.rN1 HM0jHsICRtF99RbOO2ZkxigUdQbUYim,l96pVs3Ye2205giiBho76dfQkw0GRMS,d8,tR.UB.B 011.GLt44HtCPk203...sPfX2Vvg,kV.UL,aW9hgtZcjxCJVXdCC22YWhioZCRvQp76.82H0Sb 9hgtZ6ofcQgcZZUIgpZCM8rV7....ioma5Q5qk203.KJsG4C3cM68jfC.iXqhgmNO5Xg2YaxhX FRI6UdQ5o8ICmWnBhu79CrmC40rrCLKYit3iZZZU2ig2YlZZUghuMG.oiVZBeX0,Q5HXHRATX7 VvgV7M0PvQe1.K403C3aqrg7iHEOKR0Gf.BeQ1XvgV7I6.HWrpZaJC2Yx2YCBdA32EdUCNFR8F r,HWqhAUUYe6VoBjk76pVJ,Qe0,,NFNWUYit3C..W20mWu2sFGbZRA68j99,dNT1NFvkoEKQid ,EK.Orkm4HtCPk2a24Kq66d0PU7IC..W4bGtEV44jf9jXg6RnXgMAHtCM0..gciBgWZhZReXtP ...Kpd.CJVKIr448orGLoamRq.0LEe1LOFZmWm2RNHf9P7OOh98VvPbXnRATXGBADHKQidFEqW nVd.a2F7FHPMEsmqkGLnyKtqKECGE4nMaGEO0DONdvI51a20mF00aWI,M0Hf9bPOpXukdaIhKI ICpl.M8r76Hf9PPMbvOenSQjkY3X798nyin2W0ZPMRvN6Q1vNmGEwB,d8H,HM0Z1sF91.2ZrpZ r,.HP8r,akYEtKqt0mF0GM.U7MGQiZFEuXk2YIVUAiUIbxsG..sQ9vMmWnRAcI.b1q0M80mq0G RsQ5fQ.2YfMQPM0Hk2gcAVl3YukK4nR0mqUn,.PM0Hk2gcCtCk2A7WmouGsyqtQYU2id2YDVdl kSqm0mF0ms0mJ0mMaGEG3q.a.HHsER6Qr76Hf9V1enSAiUQ3iHEaah7S,dCghvg,A,85e1bON. a2..EK0mMg,Hk2g6qU7M098Ha2V96576fuI90S2.VuPb98.Ud2YI,M085ke.CpmQ8...mWkZ3X N8k2KIb.m2..S2...M8.M0Z1.kd....N,.KIbU3Z7cTBvP5XUYe6,gBuGny4I5O2Q5PvQuGv.2 YuEvK4kR0mqC57vPRHEe1B0g,ogUI5O36JFX4JiVhBFtRRdNEKwiiYgjRAd8Oo823H,A7OKECG Eu2,,U7oedltocjtR11.OKK0mqCbdQ5M0HWhRCRViFe.A,Z1MJ.W4.30..4Xv.HEt..gci,buM ...MJ.CJVGooCrk8KqKKVUBA,akWMF,dQ9vQ.UH,...EMam4a.HMFR0aUA,.......UC,90K2, NJV9N.cMQbBM0.g6F,j0A3buMy4,785vP7PNNFseHEa2.BvP69gAQAe1.H79sJEf4269Cro69g AmWkFKYCIbUA7.O5YZUohjJcppgu2Y0,QbBA,A7sFMNAB..h1EKMO.Y3UqBAA3MGoC66.aEryK VKbUI5WorCbExBCbixh0hCBPNZvC,7GTvQ..66pNDG3i1akYsMT9N0mSgeH,IcI3hphhW3ejRi UYe6,AVHhATmocPFtRN,.91U9h6.P06QN76b1,,UnRAcIwAHN8PM0gcANGoidRip,EEOGEWmly 4..UIJiVVUY8.HsI........a4.klUG,Q5M0Z1MJ.f0w8R9N23R,HtCk2Gqo8LLK368jP8Pk2g 6kl..Q8NOORne0LEGJY66buMEISLK...C2UZFLGqmCKaaKrKqIqU7....U2xhr76d8G.68.... kmkouqlmoouad....Ec4qngek32.EI....UZVYFc4qnKqIqk2....U2xB..W0....gAAB0pkSa d.uYv68M0KJsGqksIUWFIY3h1.B1amRIZd.D0MO.B1m0.sQHXg.mWkFKMMYgd.aIXoiZ,2YI,d 1,lS.UKVU.Grw..EY.k2cQ..ggotMEc.69UgsG..krktC4I869Cro66.H79.YA.23iX7EY6R.y 4B1EryKVM1HM09WB.,tI51iXB.U3,.aWJ,C3cMQiU2Za,p,Ud.EV.A7WmeC3sFA6nX9hAUcAad 2YygbUM8P.Hc7Wme....dN8,dDv,k2O0....ZN8,dDv,,7JM1AV7FzW0ktohj37wB0mYELYBA3 d0,NJV9NsIUWFIEX42mGEOqrkI0mW...UK,22....El.GJdKZgcN.M1a.qU3FEK3..bvCq..K2 .M8.Cou8rtyKt2ZsVuMG.gB.e1UC,aEfEsS5VHR..bHRQ6.9Xi28QcpJinxBPuQiXXhimJ5HeH .P..jHsICRtFQedJDF,M8r,HWc2Zr3YxcNaKrG4wdGlv00dvJHfP.ojrtMF1H76BVs3Yyg5c7E S2irBZUo2aby..tFsWaUY8g,akqEw00W5EtELK5dHEq4RNS,dCAD...QgpJC2YuEcy4bnk8Lty qvCou8rtsCPk2a.ghjZAUUI5qqr.Q5HM0Sb4VVVo,ghnxgdQbUQgp76p,bHLC4M1gcANF,tMff QEc...cHi1a25PRZHTq1,7J66j1kdKa1himVcQgpJid22.00.kRg,sE...VORdvHR9JT9QN76R OFUKVqJbUw8kRqU0lYU7lv0mFIgbxed,,7JM1AVq,jPORPERHoyKtin4aU7we6,FdR,t6kIo2O LLuqmWLuQYUwid2Y2xdUoiUUqpZi,9eHi1A7OLEC022F0M0hf9RPNcCwiiohZ3Dr76jHrEEUd, c9RPNQ5aKr..,,qU7MFg,H.g60GcKLu.rl4...kIQcgxhnhgeY398KK2H0A,h0ZXuMGR066FXL ,i1.A6UrdNEECWCB7N76ZVvU7FlSqf.,ND,tR,7J6631UuEbaIa0mWu2.BvJHfP71v,k4M0jna 44FdF10NFXUdQbUogLBBER.rN1Hk2a2dvJH1g5.,7Rj0cCUUUBM0mY7Fu.g5.P.j1.Y3UdEuSp o.p,gV7EbQ5F,W0ZPNPvP2YVZhg3Yn3hjdPqqksQ,NOR9619PNnvaKrkt00MGoAUUQ2RWUY8U7 A6Uaxed,RdNZ1.NlM8nOamR0mUCpdK2.sR220HKA4hN8r,qqkc9b1,dCo6sC,dN.OorMM.UVlI qk2akWU76RjGrEEEbsC,dNj0.k4e0F,aIXwCvFn.Y82Yax8Uu.0mWsCMG.d1EeUo,cC.Uek2aE oUrBhiB6kRkf.WKLuqmW55FbM8Eou0Ur,WKEe1FHrU3,HkU.WKL.vVgcAXN8rN12hiohZVukvu 0Q5u022o7iX76GMH.EdKqqEW8rr0Le.FFLS5H,Sb1ZhjRCxuCPM0a2xvRGqmCLu8rrEEG3q.Hs RGqm.cCY8Q5AV7lvumlUU6G.HMGg8ELa2..,Vk22.aUm,g8UHdP.klABke.SZBFdKqtG5mGESb rFK2adU7AV3,M0Z1.kd....kfU2hgnZCY3j1.MFNmWq.aEt..YcZRioVLBhiVc.am4kWu2kvYi mBgk3C796pVI,,tRS5,dC2aB.U,,wCB1g5RWgcBVN8PM09eH0mVmqrsCPM1P..QecxBPOMHfPJ tCPM0O3sQ.D0qqmuausJAckFY4IbGIaKoRcEA7MGYgZJgpxAd0,7HTvNRtIdfQHfPIYn3hj76P PMHHFamR0GayqnYdi3Y3p7kYcNf9PCpo66d0PU7ghZFEkfoBsF99RartkaEIqqk690nIi1HM0Z 1.EdKqqkaKKrkm69Spo.buEzOHTWgsSvn4ak2K2r,Z1MJ.b8Ow8R1qqka4CLosIdPMAZvg,..M JULdP.AZvUn3Bj12Yu.UHxeH3hjN1HMF2YH3Bq2in4g,FV2BhmhAyatd8g,V0.F7Np767OO.aG EyIsohe2YcgV7AVrJbUw8G4bf9jWYlR0GmyqleX2xhXhC9HuCb2luUv2YaZhVFRQ8iXiBAeXK, GpokREqcCO2CbAlkUUogiBghV4,u2iHECqrcCEvK49XiQ6.qk2aGK0mW..o8Uu..h99,dMDfC, ,wC0LR0GYyqt28EcyKtQbBcEcHsJH0jfC,tJUUYcDhV7AV723a43PM5nnUY3Yo3hZphUAho3Yc Bgn7RTHlKKE4KrGKE4ouWLWaqkEEemIA,HMGYgiIgVRA.PM0ak2O0FtJHfPsQa4kYcNN1HlbEI .cPW2y4,NG....h0..am4EecHM0H6NRdM11UUI5O2k2g6i1HEI6QTXUAggtPMO22UChcL3ZkBZ v.H0KLr665FM.,7QRNGRPOd987f9f1NFcyKtQCbvMK4H76mod2YkpZ7VcgiiBhoZ3..cH.FVdp hdNO1noerkGroy4.jf9..kRqk2U7phd78VP8r,GaD3iZdLFtRYgjRggcNN1NFrEKYhj79ohV,5 1H,A7SLECWX,jPN0Gek4k2a2x9NRdM11.d0k2wCRPN.jPO4IrsPZf9K4rVd,.22M0Fd8uqm2Yo xhk3YrBhiZA0GJ.HMFNWBU7cR,,aa,,in4k2we6,hf9UXcHHGEGob0GvUq,g62YqdPERsRr76j f9R1EbsCk2IA,dCIgbx8kRIgb,2Yukv0GIeWiVWBA.wid7Nc8U7gcCl4k2a2Wmo.00SbaZBAZU Y8.HEIsRH1QA9Xd,U7MGw8ktABy4a2B100.HUD3iZph2FISLK0WiYhg2YYpZoZZUYAZ99GKL8K K0GmghdphdhB69G419SH1A3aU7MFN0M0A7uLmAhipidRC66B76Kpd.HmfoBo8b1W0AZUg5VFEG 30mdWqr.,NFR0M0w7sPWmvm0m4YCcQElUhBB.N,44Ud.HkWu2k2A7WGq66o7a0oB22OKr44H76 d0SYi,a4WmvmWi,K2U7sRCpmY8d1RPMsCP.HkYsJUn,..UBU7Et.K3kdK4.sRS5Nle.SZC,HfR 690HK24U7Et..Q8....S3.UlY3VN8P.HkW.A,10.Z1,t6u2N,U7g6q.kRUY7P,dCvlKEmuGu0G Rq1Um3Yug5.396p,gV7.PPO.0GRcFkR0GmgB..UB.KLr66pVkQ5.q4440GRcF.MGYA3PM.6J.a kYcM0mFUUY82YYBBRtENvP2ZWxgd2Y3,M03nf.,dCwivg,Hk2GaW,.pV4,P.9WBkWU3FEy2in4 A,Q6MF..66BOOZvQeGEWmIeXL,in4aEVEbEdY8uYrBB10o39XBAV3V4BhmlRqk4....2YCVe2Y cwiusJUntJYAaGR0mf.r,cHMGwCMG.83UcwedpBAZiohZ3D,NFNuI0GdK2cHH8HK2P.odZlRqk 4....aGEsRJ76FN8.Y398KK2H0EfkveHE.i1EbEbkvamR0GdKIeUrhV7g6kvin4q....UUocjR AeWcYiVJCIbUI6UdIbUw8.UCV7Fu442YI,.GrfoB2Y3Z7.cNoBEb.ocjVvgVB....66bONNPNI 3.kt.QbUYhVJjtJ530kR.IC.UBcEcHsJH0.6670akYcTF,.wCm4a0M1AV7ICUJ,Q8dfF8rmSKt yqusJHfP68kIi1AV7FtKaUgbU2aU.,dQcC..1uMdXZxedpB.2Y3lRaEIsRQamQiUIZdk2AV7lv uml....8ItaKrSqfa4YejZej3icghV,M1ak2K2rN1HU7le.aY7RgjNO598jf9M8,Vk.q.aEt.. Qeclf.FtRR,NlQamRa.85dXZ3Ye.aEt..AdipiVZBYiZJeZRAFtRS5od7Zdg6AU3,MG.sFYej3 iL,gBkFwiiwC0Ge.AVm,.cE.Ee.jf9M8P.90W0aUm,.MJULdP68j1Q5J,..kdKa4tM23R,q.9W BMF2YHhggVvgVB...UjNS0mXKaI3hdtJUe68VfC,7I8503iHE0LwmGE0rweHE.U7M0..wdJZeU 2jgMS.EEyoeGZrJ5j0QC6NAZvUK,I5.sRRHRgeH,W2mav2YkZiu2YJ,2ejVvsQp761eIA9bVD, T0I8PEVEbkvu4pVk3Z6xBUn,aWrphYRbBEsGLLWLEUsRbU2iopZt32MSr,Z1MJ.58PHXoZejRe XJiZFISLrY3V9RHtCaUr,.sJHfPcFZvPP9ITPORHI0Lua0A7SLr2YX6A,,k285.U5lVmqkcH1P P4IISLrY3b99,7H9WnN8r,HMG2Zn3Yxc6Tmm85,VXJYd2YDFIC5.MEWLFaGEy2..GIqSKFaGEG 3U7IC..buMK4d0EISLrEs.AVs,V9RR7SrVU.Ajv2Yr3YuEeW4krSLIohYB3AV3Z7q.akv00u2P .9eHqU7gcA,wC.EbkW66D0.sCPM1....H7658PTXe2YcwCABsQ.amREfEvmGEKLR0mf.b1kR0G oe1.PM030R0F96sRHfP10QbUwe67H236S0mFo7a02B.SrIUc,F1MFRmRA,HWcpZi,vVUY8U7A7 urvQipJgUYe6,AVq,jf9NPORvOrN1HM0HM0j8GEv0mFwiUYcD3Yp3Yug5hHqaKr66hf958PTXv 2Yq,f969eHqU7AV3lRUrpZ1,PM0K2PkW665mrsCPk2....H76DW0xhpphYRie2Ycw769,7OplY u2M8EfEtQAple.83iHE8rm.Uvg,EbEt.K3kXUdhA83Wml.NFtkIin4sR,,ZnloZmBBQbU2hU.E lyKuG5g6w6.in4qk423JlvaaYFEWqkkm8bUIZeM128.QcVZhg3dZBgkRecFJMMp76H0M8Eea3, 7I,ND,7IZuH.FNMp76.iHEGLRA6kbOY1Vd.HcJ,ND8Z1x72ZBhgod9hOMNPR9P8,7Qp760mWuY vUKB6aKRgdZZCaIuKqqiHEyqpeHE82kR0GveXKRbBA,.qomGrkYdjxhfhik3ZWYcZpi2hgWFFm GEaqIU7loumr8Kp0mS0maKKuMPT9NTeMJHeW2,NOR7HT1sIFX6hgV3iDJA9vMdf6N76H1AV7,T XUg5UkJijRgDJge7J.DGuOpk2ZqZZUwhfBZv.HMGwhf3YI37oii2icAggc6.Pk2g6q.90K2,tE 19PUHVvM1H..,tG9nayKma48bU2ZYBgoBgu22.HdCCpWM1o8Igu2YH,82UW3Yug5rPTr,HWJ,U 9hgtR8ggcAak2dd2YwEE.HmVcMN765uPGLtyKqgAummWLuKKrGqI2Y7,6GT1sQCLoaKnGrI0mW sCA,...kM66t,..C2.MPTnoOqwamR0mY.27.QgoJigBZUg6.wd2ZccYgVNM,7FHGE2ak2ak24W oIY8...MMN9RHlW.83Elqk2KIbsGg7MOsCq..6G1fP7X9hAWmvuau.EYoBQ55HmY399SdfCaYI ,i1O3.2YrJ5.r76VPPbHR..28NHXyqlMHbvNrltCKty4p7630sCCKRQ6AgdFtCb1Fu85KavM0. wC6J.68M8rFl0GRsG91.WmmWLuamR0mvumuC5e1deIM1HktCKty4,dCvlbGIWgeH,S2sIMNanM WoIaGEWGJQiX,mqrQhUI3rN12ihRCRdNEEEbsC,tRRdFTnv44kaEsq4Hl4MG2Zkhhnd9.576Yd d.V1.RdRHPN0mYCJEUV,o8SrI0Gek4M0596pVkhhn,.2Z1xhi,.AZi6OQ6GLtkm23r,HMGsM,t 6,,U1xhiNM.RvP500mYuYXp3Gbd2YIVUQiX,,dCY82Y3p7Pk2kRkV4odKIECqrGaUwd4hV76T, dA98GplvumZK468Z8F98HN763P8H68J767PNNPNdPN,N9x76ZPOD9O0GmKKqUe.tHMWHYeHES5 .mIWKYg.cM1Xn3iVRAqGTYhZpgo7N91.kQWIR0GIeWoBgW3YeA3A,QcjFtkmQC912Y7Fl0GeW2 S5.Ye,79,dMH,mqmEu4Kl.gcAFESb9,6J1eE.Iid,dPM.cHq.tX23du22.MFR8J9eIN7631ggi ZiZJiUI36T4HVWIRwC.sI5898qI.bvM19Q996J,cAX7GpN0Fd80rkSaUgik3Ye.HMGQiX,,7JF WBk2akvumdC42ZJR8kd8Ic44fGK0GMmWIJ8mWy3Z1xBUZFLq4Oqw0mYu2HN8PM0HkWmY7lV... UU.,78ghjpC,tM1fQ9XgdNwhihgU2iVFEe0M0jnZ.2eAZZUIgUg3rvET1..qrIqk2MFg6Fd8.. fHEyKr..AVr,.f89,dMqk2MFR0ENEI6Q1171,d8U7,EE27q.akvQ8EI..Y6jHK0GMm0Z0u5.K4 .00A3kWmY7,...66EEkqUX,8roS4yKr.0GJ.HsRi2EIIeg22,,...v1g6K2..GqrSbUwhihA.U 7wC.WW2ZZUIgd.9eH.ZtAFeC,78ggiZAJ,A7.0W6l4k2SbH,W0.GJocMVuPmWn,83DHKYeG,5u P.91.,,am4kWmY7,...66EEkq.UoxhUYgj769fP.AVrtG.GIWmGE22...gDkWMF...NPORPN,N NR9N.akv.UGZZUM8kWu2Uo2du2YcEoyqqKKEemIU7,EEUBU7wCb023...V79I8.UZ,UU.H,KIa A7....,,00q4.UYVnZiVJiod8U7wCL0UJZZUIgU...Ux,K290..6PktGrk.k2S5.Ydg22H,KIb .ga6JbUUg,J,A7.0W6l4k2SbH,W0.m2KZg.83o6M8P.98Hg,Hk2Sb9,MEN89,,MFR0EPWIR00K Ls0GJ.H0UU6G.HsRC368...cIEekIq.KIa.akvQ7.KJK0Gla0gcC,sBFeC,,Z1I3kY.66W2k2S bH,W0.U2tRmWkUGFKo6M8kWm2P.HsRi2EIIeg22U3p7Um2b6JbUUYxhr76J,A7.0W6,AVrtIUc ...mWkUG,d0H,KIa.akvQ7Uc6FNFl.9eHkWm2MFRmREckm8bdhAsM90EEWoku4i2rN1P...Qcc Bgm3YcwiidCK3EY.rlv0pkEK6IERA7w6k2o8wCS3sCqqrI5bOFiXXdCC2i1MGkY68j9I11,dDv FN0HYaGEO0j1s6SHXWoI0090akv002hdtJUcwCa0PvP0GRsGg7aaddQYhEBAA3,tRRNR.GJdsC M0HWJ,oefRdZBD5PMRPEFtIFuH2Z13dG3Zr3eV,HN8,dDYaUIZUIapo4d8G2Y33f1ZdcghjZgg 6GT1..i1Q6sRVOM66TeFEy2bk2du2YX3BcA4oVWp2WGJggpJij3YeAZBk2ENWIRQA.XNElO1Hk 2kNWIR0ml.VNAndAlO1H.Ya6J5.ZV33fBA,kOWIR0ml.Iaq2fBA,EPWIR00.0Hgqk2.j7Gp76. MA.2b6J5.VdA5eBlO1H.Ab6J5.ZlN0Hgq.kUWIR00EM4HP0Hgq.EVWIR00ENMClO1H.Qc6JbU. 24fdAlO1UtA4.I4X7ClO1H.I4.Ut2fBA,kN..CIgqk2a.Ya6J5.6FlO1H.ga6JbU.EN8Hgq.EP WIR00.XtAlO1H.wa6JbU.Uo2fBA,EQWIR00EM8HWCIgq.kQWIR00EN4HN8Hgq.kUWIR00EM4HP 4Hgq.EVWIR.IakQa,3fBA,kVI5.VlOCHgq.EXWIR.kPWHgqk2MFNWUQgc32Qc6,kIqk2EbQ5sR R,UX3BqqrGqIqk2g6qU3FE.C2iXB...qorKrtKKEWmvcC.27kR6I11N,ER..o8UL,iXdRi2xhr phu22Y7Q5l99,,.iXWJbU.OKK0mneHEOZZtQOItkRqU0,sR,,d8OH1R1FtRA384QD0mvu0.deI U7A7y2SLcUd2YINFA75027.YhZpAH,...,7FHWload2YI,...PPO79NNPNHlW...UKdAHFe... UmBhblI00UdRi2xB0GRqXW3YXsSvvCPU7,..GnIY8...sQUv2Y7,sE.K4K4M8,NF....lN8,7J ..F0.51HtC,,U1,.q4Ajd2Y3,UJ,w64otaLrQ7YCMAZ7GH76t,..W2.44g6.w7..4HNWXUY8.U 1,.GqrKLlmqmCIqaqliqI0mW.W5YhEBAMHTWqgapQaqQbBAV7AjUIbx.EWEPKnO.W2.CZohdjh CCJu44WLK0WgcMNloCLWkIi1a2j9I11Umg4qHE4HEGJYM1AV7lxWorCLu.q469W2.C5YZU..51 v96P76396vlx2YI37U7QcVZhg,EICpgC3.u269,tRHN8Pk2akWmY7lx.Uh,..C5..AAqLEq0.. AVa,jHn8bhFEWLEe1l1Bf9ffPHnRADMSeWa,g,ak28ZEh6d86D96pVaRbUogUUK,.18RFtNN76 l96P76Df9D9SN76n96P76DXtBZUg8d0B96vFbsCP.HsE.....wgdAZBU3,urkCKuoiVNOSKEGJ Y.akvumayqu6F68l99,FK2agcMU3p7Pk2KIaUr,..Z76d8G90wCf8QkVsQTHIWLKUWB3gcCtCM GojdRi2xB0GeW2,NM5no.I5O2MF.V0.kW.2211q2Q5P..YcZBgXZidVZx80GISLrI5f06GUvEc Ug.cC6JkIUK,.QbBAV0VCVr32Yec,EIS5Hl4MGogLdP66vlv.PU7c9POM23EKY8AZvcN.e1R0M 0HWcAhi38kYsROKq.TGEubL,CbdRCkY..d0k2S5Ee8peY3kIg,AV7Vr3YX2YVxed7NAZUo2xno ....,7RjGrEE.0WCN1AV3l4MFkW667ON11.i1.U,RA.22uau....N,ER..o8ICb1.rlve1UvEV .wiUUI,UcUd.HWaFrEECWr7JM1AV7,.o7Y8.H6F9PM51.FdNjOOELS5NFM6AHl2AV3lRk2SLL0 puGrbY8iX7Et.K3ke.jWYFI.kY68H1..kbUL,C5...d0k2SbB,B0..aEucP66pVrh,HkW.ogLB hi,kR00POM6J69Ud.03..QbB2Zek2YcdBATHLCIoKqlwcpdQCr4emIM0.odjZidpgt3ZkY3mWv xgpBgmtEF1vP8Pk2K2P.0mUCKu.ohvk4qk4a....G4JVrJ5.bnf.r767HR0GV.a082U7FmKKl6 6.akYkr0GeW2,7HsIUcIY,Rgo,0GFaGEKIaCZUYdjxA.YcZBgX,.uYvk2YdjxgiAdiZi4xhmhh cQeNR8..Y3jHKAaqYZU2bg2YW2aWYZUoc,VdQ5a.sE4KtWGF0GFamR.MG....cNjOOkImGE..O 2.A7aKr03..00.C3UUAhkJYd22.kf.bno......dvPTHFaGE.6H6Hqk2akWsCqU7A7G4U,RAUL FISLISZiVdoZrpBUkA3gcANF,7F91....m0H,uYB.,,.YAin4qUE,UHBhutJHHEcPe1.F0Ug.H 0M8EfEveXLBBU7I6.h1G3.W0amRkYcTFNO.EvoggBAa0M1AVqpZHhAbOOpHISLKM8P.Q5H.OLL WqryaUQYU.EEO5c9ZONbPO.2Y3l4UUQedJDjWvk2..5nrsJHfP,,e1..6IEKoiZloC4plYkX.o 8wCEmsC.kv00.UcUd.HWyBAUdVI,jndC42Zr3866P0g4mGESLc44Y6o4UHRAMHTHc85bPNWmIm GEO5UUQYU2adg,k4UUsMkfsC.U3tJFPN9ndCajFEWmvuau....NFq.p,.Ef.EmsC,dQYZUYhdp Bb99GqmmKu4KKQhZBjnJbU.sCqqtI550kmc9j8O9PNqotSqRqk2ak20LR0mfMEVXExd7p7rN1H cE.GqmmKu2Yug5j9IEEUl2ak2ak2dv2Yfhgt76p,.P0XFMUBM0j1G3.W0a0YhdpB00CnRqk2IC ULdPkdartGbh3eVJiVNNd1HePBvPFNAV7B,78JtIVOGzuF98Jj8G9OFNuI5eIT8HN8HHeH9uIJ N8NFMsIC3Ac2JecYhdpBaGK0GMamREsu06PUU.h,iHE0LL2Yu.U2Vq.q.Z1sJ6QsMZPN.EIEK2 idQ5ghnd9l10LLWLEeWrpZkdQumuAB0mqc9nHRUtd8,tR.UB.ohjpgABhiFEEMiHEq4yaUI5q0 PM0a2NPOR1x76X7A,7JFW72ZesQwB0Gs4qnQCJ,akYu2jXchA03N7671amRq.HEXwiiwC.,dDv 76XdAV76d8Gg,ak2q4.Cor.K4R7N9vM4aZRbBA,aEWK2jf9.Y3XdAVN8P.98Ha2.EEmnS0mK4H N0HE.M0P1...H1.AV7p7.Ug.U3p7Pk2Y76P.01.a2..G42Ye2YgBBAZv.jmYkvumv.2Yy.0GWy o4k2q4...G4NGrQbBU7A7ghnxAR1sQ.H6F..mWlkIU3p7r,S3..0GS..AVhVj,wB.MOY7RnRU7 A7knoBUn,AV7Vr,Ug.U3l4.r,P17vPRXuEXUvU7p6P1TXyg5V76EEcFMM6Rg7WmqCbd2Y3lR.u rqCrnuGmUI,FVn,0GmyqlKbZFEe0sE1mWgBumrsHBO16TC2UZVYFcERqk2aU7wiiQ8EIK3kd28 g8NVgsH78Fiqma57OG25N76xvH78FF,.dlIq.m5.K4a4V0p,akv.23..70NFM..EQ...d,6TC2 UZVYFaERqk2M0j0ghnFr.CLEU2x7AV7sR.W0.m2K3..Us...G1r,aU2VhRC.QidgV7A,HMFg,a Ey.kmko6HcCk2S3..QiU..Hkv.23..7024..25..EO.A,70.UnB3M090EagcBM0o7WGJqU7MGB GqUUkM.aUe.66V1b1k2aIb..mWY,H,AV7p6jnv.2YykM66d0P.Hkv.23.28g8...l,..Y4.HEW kv.EKA4a0AV3Z7HWr,UUY5..A,j1...70...l,..Y4.HkYu2.EK.k2KIbM06HEq.24d0k2a2.. G422.HtCk2SZ7Vr,UUo5EEG2M0S5..6HMJ...W1..6B.aU2,.6941H,akWuYv.HsJ..66t,.k2 wC...Y6...25..EO.A,H0.EK.k2K2P.EJU3V7g60mfW4C3sCq.Q6MFaIrAAH9NUi32UYRguMJ. F0Es4qouKueX7,A36JgcUIeZRAV8RZ96vFcy2KId0GeyIEKpd.Z0rN1o8ULFmsC2iu2YGhgX7I QbBcEA7sR,,d0.F,H,SLL0bm78F0kt28ZnIQeZZi278kvu4Et0LEenSQeNR8cJmYGhgX,N76VP MHXdQbBkvI8b9RggcIikpZghAmWm3iiYij79,dQIidxAmGE853vPG5HN1HMFMGRfR.kR.C2Ec4 qouaLBhi32cC.27.199,dMplYu2D0Ef.EmsCPM030UUI5G3.W0a0wiig8k4akWEc4qo.r,.kh8 ni0GWyqlSpouKY4KrEt0GIER..sCqqmC5Y3j9IEK.I5.I5H0sCPk2O385NFwmWY3jg22nfC,,U UwCEmsC,7QbfC,NJ.VOMHXHZimhiXtCM0FVkhhu2YJ,MHHfPPOMlPGRfNiHEemIk28rmCKR00U GVv2YnZit,b9RpldsCSLseHES310jOGR8F2eDRevgV7.kVy4kmQCbONdvEffQZHr2eVZic3Z1x B.6R850pkGbdQ5Qc,NFgAEEyIXEyg8ULhd1JiZBA9fCPM0akZ.GJtaLICItK4GorY3jXgsRVOM 69.am4AVw,.mqrcCP.ZntI5K3kdKKr.MEqqkaagMJ.jWjhhhBA799,NO58PTXg2Yk.akVy4.Ie ZRiZZi1,.FN8r,8ZI,VN1YD.6F9Hu8rrIbBA,SLEEe.G4F,H,Ad4dTjHmKqtG5K4d0k2SLLG4. e183r,akvQ6M1AV3lRU7lv0mSAAYA0GeEE4qfa4cCo7gcC,.6RohYVI,d1ER.k4A,.kVWqoma, Rgo,9fCkv00GJo.68.EL03Y8iHE4qf.,,jvCPk2YCu4.PUw,.bONdfFERqk2aUr32Y8.23.akY 6N9Xb,q.aEakd.YcjdCCpmGLXUUIYdQ5M0N0H0..MGsFY3jP8A4UWc6o6M8U7Y7Q6UWsCk2m2a 2....O4R1H79..O2.AV7lo6P.Sba,,,0Gakd.2Yd3C00i1AV7lf.bXn,aIb....EuEF22.aEaE a.90kY6Rj02YXsRG3AgXNOMOcCcI2Y3,.j13vN.G3q.aEt.SZiB6Q8S37XExBFtRRHKAaUU6x8 70d8JqYe69Y3V,k4ak2ak2wedph,,jmjsI66Llfoh,,UBVUQ3..8pWGId4ofam4A,90kZ.U,Rg o,9vJuKK0mvu4S569.amRq.aIXc9FvPTHECWCVIVUwCELOorC4F7JZWd2Y3l46T.kZaKqmKXy4 e1HkvUI3B.W0amRU7Fm.k4A,H6HsI.G2QddZhg,00U7Y7A7....wid..EX.U7Y7Q6.i1AVAV7, ...Ua,A3..O2.AV7lo.A7cN.66N0b0EEaKs66sCk2a2jWYlt.22R0....d13FE.M0N0N0g6.HW r3eVVUQ2PPM2YI37Q7.6F9PM.cPcPm0Ug.M8,NF.Ui2B22.kv.R,2Z4B6669WB..sIHfSen4kv ..68M8r,a2FtR,ND84Ud22WGISLcUUg5jOO42AdOhcThd,3f6Bd2hcdsHZGI28...sIFuHjO8H 76d0P.HsE.UGtQEt.G5.HcI.q.HMFNmWqU7M0L0.CpoebLdPUg6PV0g7kO69m4EWa2hlOM8PM0 HkWuYBEy.U6ReXJijFRqk2aU9,.C4w8m0kv.NFMa0AV1,MN....I8...oeHRgmVu.L0..S3..M AHtCkV.gA....83.EM8HM4IYeXckfqojqYJRe3xe6hc376JN8kZ.UL3hZVX,N76jfPEc.m4M8r ,C2UZ,...Ed..K3.VOMHXugV7kv..68M8.RtF99RbGx2ZY3jg6NamRq.a2GKw0mF0mqa4Ud2Ya EmaLECGE..d0k2W05Xk3YmhgbBhjphUghpRio3YWhgUIiZRC0GuMNCruggUQgjJimhA0GsCLL0 rkEE4GEemIq.aEt.SIWaYmoZH7P9HuCIqaKs8pnuKISLL0bm78y4ktEtA37vMN76VN8M0aEwUJ ,IcZxgdphEBgdFIo3R9N2inB3Pk2AV9,.HePh1kf.Y3l99C3kUGId2inp3kIamRU7IC..9eP79 I1PO23.V1k2i2.2eVBBSZi,6A0Wdg,g6..SZAJcp7RY6j1.cI3ORG5..MH3ORd9R.pN1HM0aIX wii76g8U5FX.H,.HcQ..CZi,.5XZFKg8ULFWAcXNOEKwii79sCk285.UH7RB0wiiN8P.9Wv.Z1 ..Cok0LuKLt2ZrpBi1Q7.6G1fPMHT1Nlv69S566L76ZNBh79,7PUd.a2f0sFQ6.H76v76jfP0G eEE85,,.8ZghgVRiZRcV3io,g6i1Q6..Ka1him,.UG,..sJm2G58KqCIqiKK0me.cI...UBJ6. ERqk2aUm,.sIMM.jXd.i2....N,EE68XdAl76L76ZVdYZUYBkI.H0.D0.aWx.,,UU..Z0..K2U 1,.kmQcp,..Z0..kfY7YCKJsmGEK3.Z0..ka.cCPM0Q7....m0Ug.M8U1,..50..I8...sPfXB xhqhgug,HkZ...EK..008HEeGE81.M8U1,.....Z0...LONn9F.Q7..sGY3j1.m0Udg,H6T.kV WqkIbBA,...50Nlv.Ug.M8r,C2.....I8...o7NeEf9RdX2xB.HWVRAkoEH0Wc.2YxcBH76T0. sBH76T0.cAVN8H76d0HEJAB,tQ5184N7659PTXUI3M0HsE.K4.50..AVG,.HMFg,m5..YCKZg. .Ie0hio,e1AgXZC.e1BWH,t1.qIW.MNp,SLEEe..A3kYsRR,00EeEES5c91uMd12ZrpB,NDmKc Ud22g,..RmUYCERUr,..A3kY68j96.kIw72ZWxgL,0mFUd.j9IEEq2.,NDSZiBckFXsIamI0Ge k4k285kf.CpmGrfohYFc683vNj0o3G4X,W2EeUe690HK69.PU7A,jGr42w8sI66LlfME.MHO3. .ME58JOpUgcdU7g6i1QioVUI582b0U5lf6NY7.mWhA4H,MGwiE,.UX6A,,M0akYcTPPMHfP10K KEOGE665FuSZiVdc7YiLBB66o76J.aUn76p,...Y7EuSpoUi..U7sQUn76P76rPAh79,NAj79, NAnNTrN0FVhBBUUIgj3jg2YhBAHPP.sQnvQPHr2YeM1aU7cQ.f0sIErEa..u0.NlbY6bnIamRU 7cQ..S2.ZmlGLIGrf.R,IiZRgdQ5M0W5w6I45eQ44ZmlIebph7phYBhmVcIiZRAU7cQ.f0sIu4 .YiL,.K3kfEc4qouag6S2adgV7k2K2U7A7WWioAEJ00UnV,7SEr.Y8gjUg5rnI0Ge.A,HWy3ZL ,cPO57GtG5HeHcNkIo2jntKqsEt680Ge.A,85.cACZoRcgBAmoru4S5g3d79Gqo85HuMuqIiHE SLLGqoYC,dCYeGl4A,HkWm2Pk2A,85ke....g36NTnYC4..o6.aU3p7P.HMFQ5M0bnw.CbtVfU iB6weHNH.8YM32,tJ.sInuIPOFROJrN1M0H0Em.TfICro66HeHcN.d0,tQdPScC.Q3ME.POEa2 .9eHU3Z7HWhBgd,Eek4k2C5cC.gZUQDMA.H68J,.84gB..b1.A,9eH.ZXUUJ,ULdP7XA,.PFPs HUtlIg,H6TSpoA6MHzuJHeH70Qc6BcCx6en4kvUI3B.W0a0Es0GRsIC3o8w8.H0EK0Gq03AZv. HWc66vFl.A32Zr3ii2hrpBHePbPNZ9R1eNdPNZ96576X76F,.UeM8,7J.aEt.SZi,bONEm6IsR Y3X,..6966m0k4k2w8R1w8sI.ME.MH...42.rN1M050.UZtEffQ..M0Z0MJ.7GnqIWaYcBB0Jt ya,3Zr,PPNb1m0V0m0Udg,akWmY3l2AV1,.....HcI........Y3.H,KIbgVc.tne.SZ5hgohd dVsB7IbBA,HsR,,d0.F,H,A7665,c7c9PvRuHEAZUo2SpoYAC5kokY...Hk20rq0GRqXH,.f06 IP0.N76N1sCk20bighV3jIJiVRAbOOoZs3YukvumqQbBAV7M0V1..n96p,2hvgV7k2C2.....A VG,24MFc8M098H.RmRkV.....Ed.K3EW...Y3..69.am4g60GWyqlEY.ZvCq.Q6MFi3AhVV6Bg iZA2YcwiidCKpd.F0Q5..69.e1sFA3.QbBM0hWUktmWsFmW5aLR.EES5jOOkR.f06I11b05XBc E.C2.CbH7R50.Q6.Eu.YCH,CoU.UU.m5.jmV85I5AV9,.50Ycgxgg2YrFKwCEK.A3aEy..N1p, 85,,f0sIu4.1mqEKg8ULlrMMko.NFMamRk2Cor.UGtQ91.68H,I8UkUw,.7WoVu.j1G3Em68M8 U7FzS5C5gAG3U7wiiYA.I5I8i1AVrtEk4AV7g6qk2..Cpmo6cCkv002B..U7Fmkn.k2m2C3U2Z hbJ5bONdfFEE.AVAV77R..kYkX69SrI22hVsEFIYgcFkIi1AVAV1Vc.r,aEakY....EncP7XdY 3..B0.akYMO0Jq..66d0,7HsI.0mo05,,rV7M0HWL,Cbd,0mYu2....G58mI00.H6H6HU3lRU9 ,.1WdNMw8R99SLrY3j1Y3.HtCkYsRR7O665,00sRUio668d0H,q..U9BB.pV7sR..23AZv.HWY ,UBU7Y7Q8.70i2.,,k2m2a2....SrI..cF.k2m2C2.r,aEakY....En.a0..B0.akYMO..B1., 7HsI.0mo05,,r,akYsJUn,66u2....G58WU.k2m2m2MF.a2x98H1..A3U9,.70a4ErErY3.N,k I00.sRW400.sRUi.WGX.,,P..kda4p,S5..F,HtCkZ.UHBhutJu469m466.f,L76jXrZZUYBU2 B7,Vp.Eoam46T.EYkrcC..klULFK.S56901M050km.b185..83UB..cJC4I5sG..kf...XN8U1 ,MN....I8.UkkU.Spay3f0.k2i2.w8klUgErUE,YBkIi1Q6.91...UG,.g8.03I5sR...H,c9D WHVc.7nI.HWcYgsVh,6No2GqwQ2.UIVBU723C4V96wAT1f13HE.,,QipNN,lrIC2YkRii.00g, AVm,w6I4bGqKao,ZWc.ZHIW2cQC58bd6N5HE01A,H6Ske.8omcPV0W0jHm6QbP8M0akZ.U7,AA .69W5b0ME70.a0k285.U3Fc4qo68.05U7Q7.6IkfoB.VFEAZBU3l4..jGaEu6F69.EdEu...Pe EYCUu.Z1.kdYC11sRA3kZ.U6,qor.jfPmWr,0mJI4mWg,a0MGBme.S250kIg5jXUY82YmFE.UG ,..9Wv.50.UZtEf1..83..UL7H6RcMEKg8.83...MH..pV7cQ..C344kvM8U9,...EK.22WmMk JI4aGKYBkI.H0.D0.aWx.,,UU..Z0..K2U1,.kmQcp,..Z0..kfY7YCKZg..Z0..ka.cCkZ... .69.m0Ud.C2..Q6..Ed...UjVB,A,L0...N,.66cA..M8U1,.....Z0...LONG2.L0..i2Nlv. Ug.M8PUw,.58OY3f0UHBjnRccBgmJ5...Q6Y3j1.m0UdQ5sE.....Ed...kUCKu.p,SLEEe..A 3kYsRUU.Y8sRUiA6.FFc440mF2ad2Y3l4..o7UgMJ.kUYCER.ocmBA0ZdFECGEu2UBU7Q6..Um ,.U7I8U4JC.WWi79q4EK6IEK.AZBk2K2MFNWBkWuYvU1,....UG,g8U2lfaKrG4VeQTvM...EK .A3K2,lo44.8rRgVBEII359PIgjBA0Go4KrMORvNeGJg,0350KYD3iZph1Zhd,IZU2ZYxhXJ57 uP5PRktYcjRgp,HtCI6.R05fMhWrhAHtCPk2GqosHVPNWml8Kf.N767vPmWvxedVrRCRPN.gjg c658PH1c6NFbaIamWWIYgcHAZBAV3VDNNC2.rN1F,VeI.QedlVmqo05c8wCe1.F0KqRwig6OpF ayIbSoYuIeamRq.hWUUu6HT0QbUYgX,..PEV.QgWNOELS5,dCwiitCak2GqlI5K3kX6FwCa0ak l.6QTfQW0.bHckIQeZZi2Fm66j123AVm,.sIFXHRgmxB82oBNle.Ic6xBp994nIUm,.kmQeXJi jFdsNWmv..82EMmWnRA.Y3X,..Uc,EV..U0p8Y3XN8...K4UG,F,.EV.0HK..m0c8kZ.UHBhut Ju4UrZ3amR.C4.f8Q71bWjFlsQFdFQ8HtC.Z1.Ed.GoVWmvUYRgdQ5K2CposE.Q5P..9GcU1Zh d,I3F,p,U6,2YKB6,7QbfCK3Ec44C3CadQ5HM0h0Z1m2..U6,g,30..S5kvsCaUm,w6I4KKq.I 82in7N599,7Ai1HsG.kY.kfoBEK2CR,4IW8JIEsUdA3a..EcULdP.01VN8PM0EcU1VW,rl4..b uMy458PH1c8W0e1..0mlEK2ijdCm2.hPNABI530M8q.h0cCm2.71f0.k4I6...kvsCW0aEm.f0 sFUrlIk2C4.V1F,Un,a0Y6G4S5..QeX,FtMT1EK0GvK4kIin4..KKuCpo685fMh06Qc9j99CKl O3.6OHtC..f0Q8El.Q8Um,.cI..NFmM1JN8g6QeX,50Uvc8g,F,Pnt6PNPMkt0GJe028.9me0L mkYuKnyqRqU7o8.a2S2rltIiuMEAcNdA2YD,66CLu8LR..sIFuHZmVUBcE.aIXghZhh7,dPRb9 6B76WmkmKqQgUQ2LONZ14Iqm41nm2ZdAZU23yId0WoxhoFECW9,genhgY33IZd2Yd2YI,AVVZB 2YukZICMEkk.r76dvPd1pND.g8UBk2Cbm3Yukkm4CZmZYv2Y,3C9X7pho3ZnZimZZUAggVgMRb PNbON44dvPZvQ2Y,3C68b9RcMn9RYCHtCP68U,3ikhA.GrrG5bWd6610A7..N76fvQ...23El. M1JV7AV7QinZim32Qe6x7WmtGbYAZv.Z1MJ.bWLdP7XIhgsNEaKrOqrmWnRioN8Pk2K2PkW66f GmMNkR2328.QcchAin4cJMOplY.ERQe3tC,tP3fOp76LONUDJgehAin4I6.HW2tMUn7NHvQVPH bvNFONHvN2Yx6A.AV7lkMH2YxcHmIEG30mk.e1L0MPT9NNOOb9R,NFQ5ak2.EL8rmOqluKu0GT qXk.q.akr8KpIbx.EeWqowdWJhZFI4qlG5mWWojWAZvM0AVn3YuEVY84qlG5umlCroebdQ5M0H 96pVDJe2tQ,t9,tInuIEdyYcQig2YrAZUwZUQ8..P7CHN8r,akY68TfMJ96vFbM8,tHZ86y4Rd NVfQHHu0mFAhd2YD,sPBfNb965lUGIdwhWJhSBZd22.aUHB9EcKJeWmUGIdYcjRA...aGK0GIe GEm2WGEemIWGJY7.XN8PM0HM0HMFg,HM0sCkkCaBFEe11vMd1RdP9XBM09WBMF2Y13hZ,JN828 .QeZZiKBhnhCNvIwBeGEWGmI530.82U7Fva4.2YX2YYxhU.M0hPOK5.e17nRU6VGtNC5nf9jeQ H9R9fETvPN983dJHvQ44UWY37nIqk2akWM1EECpmG5.kR..9mYGKqKKJin4ak2O3S5jOOsRrFu aqliKRQ6.9ntuGeaqlg7iHEOqrER0GV.in4I6.j1AhmpZ4xhXFI.k2aIX2Zr32u2o2xvRGLt4K s6NG3k2SLLGLt.e1deIQ5AV7lvogmVUQ2RWU.k2GroCqpuGuaqliKEe1LOFgcAR4RtFYedlVyq uuKuWmIi1AVrdF8bVlVGbgVcYidRAHN1HM0HMFQ5sRG5.o6M1g6UaxhXhC,dCQeXtPg70JtsQk R0mv0GRqXYdQAhm7RFN8q.j8GH00mF.7uHM0HeFurv.Ee.AVr,UuEe.M0jne0LmkdC4IAcNTvM c7,lvg5BvJu4amIin4k2Sbo,.B0k2K2Ur32YAodZ3DFtRHN1akW.aIXMO79PGZV3iZ76d0koGa Z,cCY8.HMGg8U5lUAD5vG.WmMa0.22ABABDHRcFEEK2...kl.EN2Yy...wA..UJ7N1X7pB.aU1 3hZRA.HM0H1..M1g6UHhgmpC5ntumkC4THYyqrsIdPNVvCPM0SpouKmsQGampZJ,WGbM8P.0mY GKqQ5P..9mUEvMNPOMHfPJ76F7N.kIEVMGRW7ghVBhiB6MNe17vPPM0901044kRk2.UGhgnBBq okaaLBhiVe2YcYit3CwigERA7UdQ5aEfEt69qKRA7Uvg,.66sR,7FHeJ8nRM0PPM66p,qWgJcj JiYhgm3Yh2YmJcjJCQ5H.2dUI5WKEqWoJcj,,VWJcj,r,HW2BhVViQicxBbvIdPMKbUY86F9uE qqka4N76AA2dd.23cQ.f06FocmBA0JtyqlMP1XgsMgAmWJ,w8bOOY3dPSV1PPMHnfQ3PPM2dUI ZUoapg4amRqEJU7FmMRD16HSaHdQHnncQ9vQ66PPM2YrVjd6HtC,7HTXA76u2aUm,.MHTfRSpo UcQggBBEq8orUg2YoJ6.PPMweg2YhBAWIKA4kY6F.b1.00g,akYMP...aEt....CLu44mGE0HK 2hUg3b9R11F89qKEiGE4HK0mt.MAU7AVm,...AhipANlqmGEWKE..j96PlqmGEC5.X,M0Z1.kd W4jGr.UlAZBM0HMFN0M0Z1.ka.Un,m0..FWrZ3b1UlsCk285.UH,.H12adk2gcCtCEt....C56 94XBkWm2M0.....6Ai1....MO.q.9eHq.2YGtQMHsJH1in4q..sIgdVBB3uPZ1jOO79ReGEWGq mWoZ3mGEI5HeHUdk2o8UuMG.r76ZnlGLRg8UGtMi130Eq8266pVgR5dfET1UoR5ZfET1UmRbUI g0xB.8qRq.Z1MJ.DW1ZhdhA8pm68P1NFtQAH,8pmCro.S368V79,dQ9XiIidxAmGE.31U3VH,I 6kf6Rin4q..sFg7.IZUcJ6PN76EK..H,O385.sCUu.EdkR.Um,.sF..F,m0M8Eq0GR6ArFu0GR .Z96pVmhgXd9Z1iHE8KE.cMUvU7FW.Un,22667OFIgg2YnZC6GH,q.sF.30Q5PM0.kd4KvKqfk rQeoBA9f8r,h0..wikJbUg8ULBB6INPM5nqKKrQ5NPObHR0mU.X7A,tHB86HeH.PEV.A7uLnKL qQ82YIFbq.HsRVf9NPNR96pVHBdO78fuI90..kIi1aEt.K3kXsJu4.EIqqk69SLsamRq.a2ZXU Q2V76.AVgBhnZiP3aR3Yukv0LLuqr8rq0prCLLmqmOavg,Hk2m4AaR3Yu..6RT9QrN1M0N18ni I5..ZPOD1P.H6PkNqJEenS..8qrG5.H6PEOqJEe1MPHHcyqtuGwin4k2m4gaR3Yu..Ajv.H6PE PqJEe1kkWLcyqtuGw.H6PkPqZu..ADk2m42bR3Yu.CLoya1hhYRbBU7A74HEaIb6QRdNNPM226 6NPObXtgfUI54HEKIaCZUYBb1Uk2Y3lRU727knQCa5kYYiAVcIYBBAS3c6NFqaqtAZBA,HMFNW BU7ICI5i2K2Zd96H1vQdPFZfQTfQFN8r76FOEN8JFNAZ7AU3p7Pk2.9WUQeVpCj0Q8sC..mor4 KmSZi,EEWmIi1HcJ.p,.,,.w8Ec.sCUu...UBM0HsQHfC,tG9eI.b8R1fQKLsaIrOav2YmhAeX LlU05ZOF58JrN1HcE.m4iJQ.VtCm4A5.PM0HMGogpZB.odBk2S5.C3....H,a.O4cCw8R1SJcO ojCpWGpaaIb0pbCpYGpYyIb0mJ0mfoB.8pWCZDFeyoa42EWin4Et..QetRiohAVGtghZZCZvQH 0FtJHfPUEBdT,TeILOEZOF189Y3bmdU,Z68rmCadY3VN8r,S5R1EqEEe1Z1R7P9fNi1..G5,dC .GrrQ5..ICDXUI5.Z1i1..8466p,El.r,kqa46S,,Ug,..AjUI5.d1.AAEw.Eq...a5.G5.QCU UI5K3kdSJYaKmKqRqk2sQFnvC3KaukfEskfypdWobSpRM085ke.gA6N.Uc.N,qk2gcA,HM0F0k tUGNM7PGR9RN0F,w8EF.mGE8rmCrIk2A785,ND0XI,M0jXgdPkd..j028.a0M0jXa,kx0nyiHE a.CrmGLEqqo2Ykxhn3YeAZBM0akvcP.m400mqosKVlRq.akv.UoFE.MAin4k2S5.IC66.I4rN1 HU7wC.cMUU.kNQbBA,akvMPH1uGw.EOQbBU7wC.AD.g4rN1M0HWg,lVx6AU7c8OrMuGMuGLOrM umM0GJam4k2wCC5C2.cBin4k2wCqqk.l1qWv.Hkv.kw.qk2aU7g6AVcIZUUlAaioZUIZd.Hkv. EwUg,.aUr,Ut,UrsCP.HkvsQ..6Cin4k2A7.nVy2Yk2266HeH5GISLsu0694XUg6a.8rmYijFE qasBBEEemIq.akWuYv.HsQHf9bPOcCQ8sG9eIK26R.M8q.akZKIdu2sFQeoBgm,MEFtQHP8r,a kY6A,NGRmtaKLOKq44,7JM0sQFvPS366hPMaaUI3k2A7CroQic,UyMA,7J66jXnV1,Qidp3sJU BM0aU3Z7HWr3CkVkSIaUY8A,IC.aKra4.k2MGA4HWrFn.EEkt.I5CHEKIa66j9QR,.AbUUBM0H M0KIbg,AV3lRU7Qicld.sR.5Wv2Yrd9.00K3kdS3.aEtER.UZtJu403.F,m0.9WBkWU3FEmor4 4UH,rl4..5eQ44P0j0Qie2YcghZpB3OMmWrBhihdZpBp76f06G.,7G1fPcQple.SJrGKc8rrAZ vg,O3EREeEd2YXZhVRCp76.kVmqksC,tM5vQp,U1ZhdV1JiZVHZCCavU7YgXJ5.W2sCGrqeX5Z 68XIhgsZiBhgoJidRgv2YnZimJ5.Z,sEEEOrmI5102bUwd4,g,QinFR.o4y2b0C2EV.23aad76 jPOG4,tMN19vQ,lIM059P1vQumlKLtwBe1.mor4KmCou854II0HKg8UBBgfNGR9RZuQCKIKpd. H8F5OEZfQTvRHN8r,51AhXxhi3Yug5.m2aolya,3ZdphnNMRnmMJ.P0.AadAZvU7FICKq44UUg bU2adsHsM..XN8,7JM1AVX,.p,.N0kU24.g7.ke.aY7Bck3igtM19RHXdAZBM09WvUX,qqmuaC Bgh76pNDu2r,.59P1XC,c6ggmdP,NEV9Q3tCPk2.RdM1vMLvNR9N,,VFEW0XdA,t8,NArFJam2 WGJAgk3ig,66jvPZvOb9Q1nm0mlyKqyaUIZdUX,CLuaLq2YukxCHKgaxRb7UYxhpJA9vMNPO5n tmGE0LtaKv4Ku0GmCKEeWB.kouqtG52Yug5HfPb1Q5.wiiZgEVUI5WokUmR5H.klQi33joJiV3 Yug5Vl4.sRg6dfQUoQbBkeCpW838ZbtQKKtCYVlUWmlmqkM8rV7QAc95PREEEMAVcI3RvP,tMN 1,tMfntEJ.ELq4.cH..31666A.IgVtO85GKE..59P1XC,c6.GIqSavg,.RtR28.7OO11FOMMNU J,.b15042kIk2C4oZX,R0EF.Acp3jWQbB.c9j1.Gorw8W2.g8.sQ.A6UdU7YgjNG5XUUJ,Y7.1 mo.Y3.q291UmAZdQ5A7YA5PG66vFM.G4.41.YA.p,.N0kU24.g7.ke.a2.Ud.906NHfQdnYCai 32.6H.4Yd,..P0.gadAZvU7,HfQd12Yx6A...X,6671.pVYtMU3p7r,51umoC4e1.in4A,UX,R 0EF.YcjRgWQbB.c9j1.G2j0.ke.83C5.10M8M0FVj3iZphUghVFESbilvCLEe0QC22Qe6VcYcd ,RNMVHb4qqYYd.HWa,5nmKKr0GeW2P.P1e1f0sEZnksJu4K22bgMCv99wdW,4IsIYg22bXgsJA 6weHtIC32YfsJ.MHH0cEWJEiGES3.0pb0pe0JKqk2ak2a..0HK0GMm0.D0nvQKqqqYoJCCLISp o.bOHzuEleFf8HNuI5eI9OFRO8NN1HU7.ke.....UNpcJZdA,.A,.24qqmua0BAAhiRC.V,gcA ,B1bOO6J.q4..50.......ULla....b0..kV4IcGpYyIbmm4ak2A,.g8.jmtYcZVgZig2YJ,.. M1M0.MJ...00...P.H..VFE...k4MFgcBk2q4..85......M1HU7.UvBaqoZiAatYZUIamY3Zt Av99H68Jlq4Kw8qrWLKghddMT9SNFn8rk69CrwgBRHKYidZCmGE8qrEt0GJ.H..f0kf..,,..U BU7.UJ,..66...g,A,.24gA82..V,KIb.5vMbf9jPOG4PONKLEe1jPORPHsCP.cNH158OH9P0G RMAV7A0nRq.HWixh1ZB9XHRATXUYe6,QggBB22g8.Z1.K2gjgc6P8FHGaaoWuIe8GK0GbYdggV 7k2.kx8nOmGECHMqLKaEIsMaKsCadZBZ1CKoa4,d8H,HM0.6A2401g,A,.gBY3bdAjdBj79,NO R1UHtIU2llCqtamIkWm2M051.......Y3.A,.QDV79,dAX798nOmGEC1UnRA69CKq.ICsMEE.a ..0122k4k2.kq.blP..sI...9eHUnZiVNRb96p,....sIdOEdOG5e6o7.H.Uvxag2YmQagsAV, 6P9Xg2YixBZPNBPOl99,dMT1mWX,.HM0.2466UBU7.kq.EPmGEa4.0XvUdpha76pND.......k 2.QD........A,.V,00M1M0.q4.KHKAhi,EM.Z1.kdohY,MECLu4Ku69K3kfqYZdFuKumGEOqr uKuMAi1..sI..HfPBHKg8UL,.B1A4EmCKE.U5FW2ZnZCM8r,Z1sFQ4S2dONl9RUXNEF7N599,7 RPP8rN1.MJ.ZGq.5mt.NFmCqIi1C56G,dCYihpZchgdxAin4EosIMN,,f0sIjuIFXvM0mYVZgL dPsIEIamREt..6Ow8R9N2ZXZB9Xg.MGY6sNC5CrdAAfHEG3Um,..S3ktG5Y3X,AV7lqMG.00.H cQ....HfPkMg,HkWM1akWsCWW7ghjpC796dvP,7GTvQqYitQPM0HcQ....PnokeC3kfUdQ5..k e05Kqf.UdQ5Jl46GcFELqqkaaUUhBgdtCaUY,K3kX6FghVlIM0KLrYCpVExBdvQaKrCKo0GWaI fwc2tAZ,ggqBhXhg1BAb987vMNlXG2YdjxgEBhshggRiNBZvUm,g8UG,UhVg6N51Pk2Goo.PGs YimBBDnkmKqsGY319PsIAZvU2,..dvPdX9hANFuyKusIA3..koElaLuQdZVWBDC3HVBkY6F.1X CVUg53dE442D,7JF0sQdfQ,,7OO..7tCPU7oiZJiUUW2YspZtJYv.sKXNL,,58GYcd,O5bPOTf PGoYOZlkJ0mb8JWIYkIYdAZv.kNqJE...UBx74XU...1GsKKr23dHK0GvKadQ5HU2,QecxBb0f HICbmBZBkWUBEYkaQA1fPghnNGCbVZhgZcmFe442ZXZhd,u2Hl2K2,tEZ1q2SZiZgjtQrVBAVE ,MFaIraKui1O385N76hfCa2.7X2dQ9XjNS0GmCKKgC8LRg8U6,in4aU7I8DntggmJ5VeITuEUc Ahu2YJ,.AZuEb.2iu2Y9h6ENQeoJidFcGLti130R0HntcP22vlZ.sFgdjZgpZhZ3dVphYlUWGb a2rV7YAke.S27uE0nIi1K5d966I.66kXENw6gA..D0Y7..85ke.83.0HKYAM0CrlSJEe1.S2b0 qqaUX78VN8aEIsQgARnvYgo76JN8sQWIE....kMamRa..2hZtN2Ye.R07P8r767f9N96pVhsC, Vo3Yu.Et00.8KEe1UdJiUI5GqR0mfa4c9bGuGoo8LIGqIin4cHsRHfP1ePWqr8rIiHESro.oZi hgs76pVClRaEI6NfPPPPS,7O44006RjGrEEe1EEOqfohY,.4qfa4.UWxAu4.M1ohjRcg,bWjFE e1B0iHEOqumaH,p,.RvP18QVXi3Yu.k4sRF13eQfXUI5S2bV5VoxhXRhDJA9Xcwc2B7wecBho, AZvUihigZhEFEe1.D0..UChig,H,Oai76p,U5,..kUuqtaKf4KtOoruadQ5QgWNMERcFUUMNjf HfPP3Ht004nRq.hPOAA.EeUU2djFdktIitdI4a0tPN1.UWEva4.Y3Znta0aUUU9,kXcJ9fQcPF N8rN1.OLEqobcAfdBeGE4HM0HEiGEOLEGoYcAfdBqob.rN1HM0HeFOLEmHEGHM0HE.AVm,Q7.C pm4KtCKo0pkGLo4IIuoYYZUsEd8Hb7FbdAR7FN8H379,dHEM2YC,VP8rN1AV7Ft66xFMY8AVck VGJaC10mkOrkaKq4Klmag2YVpijBhYRiUggmJijJiUYgdBA2YdpBNuP1HaaKl8rk8rw0mruKES poQ40Wdk2ak2CKumqNGKEe1.6H44.1883tEd0IYdQ5M0HWXZigR4CWk.q.aUHB9EcY8bOKb04I WcI9vNCbZJidYZUQ7.S2VeQAcYZgmhgnRicQgoZBmGE8WoZB8pmS4c6HN8rV7M0a2ZONDntEEC WCB7,7JF0M0ICI58pmS468HfPb1KqIi1Hk2MGIC0mF..H.b06IM1Hk2a.Q8U,V4JiVFc44aGKQ 7...QCUg.6FNvNBeQ11EFamIq.a.98H2YXZigFEe1VN1M0gcCN1M0K2k2K2.kWsCaUpRCZ96pV 9,.q2.UWgeHhcGFFa0Q8UEVH,A6wcZZiHRAMGM8N76L0.28.kuCrmY33tF99Rb0.3N8HtC.Ec. U,VHhgoR8.A3..03..kdKKuC3.80PkW66HePHnRgV0hc5,HmoGr4KIbGY6xhntJuKmsQqE,5Te KKwQcjphoJijlmQiiQeoZg1ZimZh2hgnRg.ASW5.ELCor.6F9vQ59.C2dPMHnmc9Et...ktu0. Y62Umb.,6.,.dU.2.AV.2.0..4E,9z52U.2U.kk0U.wU.2U.Af.2.,6.C60E.2.U6Uz6.0E.cU Zb.2.,..G00k.0U.6.665hK0E.0E.SoAtb2U,2.4G.6.,U0O10.,..u,2.A.MEZPO19P0S45E. E.0t.U..61lL.m.GpOycAgYvob0Cy2xhXhCYintET1.UM6.,6..U6U..HE.6O5vQWnBCO.0Myf U.az86mDRN,6ix6a.6Q0... --- end of encoding --- |
Автор: | Штирлиц [ Понедельник, 22 Январь, 2007 04:45 ] |
Заголовок сообщения: | |
В процедуру (HostPorts): PROCEDURE (rd: Rider) Input* (OUT x, y: INTEGER; OUT modifiers: SET; OUT isDown: BOOLEAN); VAR msg: USER32.Message; wnd, mw: USER32.Handle; pt: USER32.Point; res: INTEGER; set: SET; BEGIN wnd := rd.port.wnd; mw := USER32.GetCapture(); IF USER32.PeekMessageA(msg, mw, USER32.WMMouseMove, USER32.WMMButtonDblClk, 1) # 0 THEN mx := (msg.lParam + 32768) MOD 65536 - 32768; my := msg.lParam DIV 65536; IF (mw # 0) & (wnd # mw) THEN pt.x := mx; pt.y := my; res := USER32.ClientToScreen(mw, pt); res := USER32.ScreenToClient(wnd, pt); mx := pt.x; my := pt.y END; mb := {}; set := SYSTEM.VAL(SET, msg.wParam); IF WinApi.MK_LBUTTON * set # {} THEN INCL(mb, left) END; IF WinApi.MK_MBUTTON * set # {} THEN INCL(mb, middle) END; IF WinApi.MK_RBUTTON * set # {} THEN INCL(mb, right) END; IF WinApi.MK_CONTROL * set # {} THEN INCL(mb, ctrl) END; IF WinApi.MK_SHIFT * set # {} THEN INCL(mb, shift) END; IF USER32.GetAsyncKeyState(12H) < 0 THEN INCL(mb, alt) END; (* Windows.dir.Update(NIL) *) END; IF WinApi.GetSystemMetrics(WinApi.SM_SWAPBUTTON) # 0 THEN IF USER32.GetAsyncKeyState(1) >= 0 THEN EXCL(mb, right) END; IF USER32.GetAsyncKeyState(2) >= 0 THEN EXCL(mb, left) END ELSE IF USER32.GetAsyncKeyState(1) >= 0 THEN EXCL(mb, left) END; IF USER32.GetAsyncKeyState(2) >= 0 THEN EXCL(mb, right) END END; IF USER32.GetAsyncKeyState(4) >= 0 THEN EXCL(mb, middle) END; IF WinApi.GetAsyncKeyState(WinApi.VK_SHIFT) < 0 THEN mb := mb + {shift, extend} ELSE mb := mb - {shift, extend} END; IF WinApi.GetAsyncKeyState(WinApi.VK_CONTROL) < 0 THEN mb := mb + {ctrl, modify} ELSE mb := mb - {ctrl, modify} END; IF WinApi.GetAsyncKeyState(WinApi.VK_MENU) < 0 THEN INCL(mb, alt) ELSE EXCL(mb, alt) END; (* (* alt handling *) res := USER32.PeekMessageA(msg, 0, USER32.WMSysKeyDown, USER32.WMSysKeyDown, 1); *) x := mx; y := my; modifiers := mb; isDown := mb * {left, middle, right} # {}; IF USER32.PeekMessageA(msg, 0, USER32.WMTimer, USER32.WMTimer, 1) #0 THEN res := USER32.TranslateMessage(msg); res := USER32.DispatchMessageA(msg) END; END Input; необходимо добавить IF USER32.PeekMessageA(msg, 0, USER32.WMTimer, USER32.WMTimer, 1) #0 THEN res := USER32.TranslateMessage(msg); res := USER32.DispatchMessageA(msg) END; иначе, если в клиентской области окна редактирования нажать мышь и не отпускать, то отображение также замораживается. Вообще-то WM_Timer не очень надежное сообщение. В некоторые моменты оно вообще может не посылаться или посылаться с большими задержками, чем установлено. Можно подумать над реализацией кокого-нибудь thread таймера. |
Автор: | Сергей Губанов [ Понедельник, 22 Январь, 2007 09:56 ] |
Заголовок сообщения: | |
Ужас... Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный. |
Автор: | Александр Ильин [ Понедельник, 22 Январь, 2007 15:56 ] |
Заголовок сообщения: | |
Здравствуйте, Штирлиц! : )) Очень приятно видеть, что кто-то заинтересовался главным циклом BlackBox. Проблема остановки фоновых задач при удержании кнопки мыши или вхождении в главное меню - это первое, что мне сильно не понравилось, когда я стал изучать BlackBox чуть больше года назад. Кстати, обратите внимание на 100% загрузку процессора при удержании кнопки мыши. Я пожаловался на это дело в официальную рассылку blackbox@oberon.ch, в результате чего некто Marco Ciot 25.03.2006 поделился своим вариантом исправления. (Его вариант был куда лучше того, что к тому времени придумал я.) Данный патч, впоследствии немного доработанный мною, выложен здесь под названием "Фоновая многозадачность". Этот патч положил начало целой серии исправлений стандартных модулей BlackBox, предпринятых мною за почти год освоения среды и попыток написать на ней полезный код. Все эти правки (кроме самой последней, некритичной) выложены на блоге, ссылку на который я дал выше. Недавно некто O.Nick спросил у меня на том же блоге, как эти исправления сочетаются с SP от Метасистем. Вот мой ответ, опубликованный там: Цитата: К сожалению, метасистемщики не включили мои заплатки в свой последний сервис-пак. Я так понимаю, что сам выход SP 4 связан скорее с работой над Active BlackBox, а не с желанием устранить существующие неисправности. Моя же цель - устранить неисправности, поэтому наши пакеты обновлений несколько рассинхронизировались.
Что касается того, как они уживаются, могу ответить так: все мои исправления полностью совместимы с их SP. Однако, некоторые модули были исправлены как мной, так и ими (например, HostWindows, входящий в патч "проблема прорисовки"). Такие модули нужно править вручную, причем мои исправления добавлять в SP, а не наоборот. Это не сложно, так как мои правки немногочисленны, выделены цветом и перечислены в стандартном заголовке (внутри складки после слова "сhanges"). В свое время метасистемщики ко мне обратились с вопросом об интеграции моих исправлений в разрабатываемую ими версию BlackBox. Я провел означенную интеграцию в их базу данных исходников. Честно говоря, я думал, что SP формируется именно на основе этой базы данных. Отдельно исправлять еще и ServicePack никто меня не просил. Поскольку сам я им не пользуюсь, то подобные проблемы мне даже и в голову не приходили. Если будете качать патчи, то лучше сразу берите полный архив из последнего поста блога. Дело в том, что некоторые модули правились несколько раз, последняя по времени версия содержит все предыдущие исправления. Что касается цикла обработки сообщений, то он сделан не во всех местах очень хорошо : )) (покосился на info21, но продолжил рассказ). Например, 100% загрузка процессора берется из того факта, что всякий View, если он хочет отслеживать положение мыши (например, когда вы выделяете блок текста, нажав кнопку) вынужден организовывать цикл опроса мыши и клавиатуры, постоянно вызывая Rider.Input. Этот способ официально рекомендуется в документации разработчика. Видимо, это единственный способ реализовать перехват всех сообщений от мыши, так уж устроен фреймворк. Выглядит это иногда вот так (циатата из HostMechanisms): Код: REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown; Подобных циклов немало разбросано по исходникам BlackBox (более десятка). В Delphi VCL при организации подобного цикла всегда есть возможноть "дать дышать" всем другим объектам и процессам, вызывая главный цикл обработки сообщений: Application.ProcessMessages. В BlackBox такой возможности не предусмотрено. Более того, если внимательно посмотреть на HostMenus.Loop, то станет очевидно, что процедура не рассчитана на повторное вхождение. Потому и не опубликована. Кстати, в официальной почтовой рассылке уже не один раз за прошедший год пролетали "рецепты по разморозке" в виде небольших циклов обработки сообщений Windows. Естественно, ни о какой платформенной независимости тут речи вести не приходится. Что касается приемлемого решения, то оно есть. Если в Rider.Input внедрить небольшой Sleep, а заодно вызывать обработку фоновых задач и прорисовку окон, то многих неприятностей можно избежать малой кровью. Только фоновые задачи нужно прокручивать не выуживая WM_TIMER (я тоже сначала пошел по этому пути), а вызывая напрямую Services.actionHook.Step. Идеи Sleep и Step принадлежат Marco Ciot, за что я ему до сих пор благодарен. Однако, это не решает всех проблем. Например, кубик все равно не будет перерисовываться при нажатии кнопки мыши, вхождении в меню или перетаскивании окна. Он будет крутиться "в памяти", но прорисовка будет отложена до момента выхода из меню. Форсировать прорисовку возможно с помощью некоторых недокументированных процедур, таких как Views.ValidateRoot, Windows.Directory.Update и пр. Чтобы кубик вертелся при работе с меню, нужно поправить процедуру HostWindows.Idle следующим образом: Код: ...
WHILE w # NIL DO IF ~w.trapped THEN w.trapped := TRUE; Views.ValidateRoot(w.frame); (* <- добавить эту строчку *) w.UpdateScrollbars(focus & (w = fWindow)); w.trapped := FALSE END; w := dir.Next(w) END; ... Я думаю, что по умолчанию этого не сделано чтобы не загружать процессор лишней работой. Типа: "Зачем вам обновление окон, если вы в меню находитесь?" Лично я не согласен с этим, но допускаю, что на слабых машинах это могло когда-то иметь смысл. А может быть, это банальная недоработка. К сожалению, разработчики вряд ли станут это комментировать или обсуждать. PS: Илья, ваш способ с Windows.dir.Update не защищен от трэпов при прорисовке. PPS: Во время выделения текста кубик все равно замирает, так что, по-видимому, из Rider.Input нужно вызывать HostWindows.Idle, а не Services.actionHook.Step. Я протестирую этот момент и выложу заплатку на свой блог. |
Автор: | Александр Ильин [ Понедельник, 22 Январь, 2007 16:14 ] |
Заголовок сообщения: | |
Штирлиц писал(а): Вообще-то WM_Timer не очень надежное сообщение. В некоторые моменты оно вообще может не посылаться или посылаться с большими задержками, чем установлено.
Можно подумать над реализацией кокого-нибудь thread таймера. Период работы таймера в миллисекундах задается константой HostMenus.idlePeriod = 50. Вы можете поменять это значение. Я ставил себе 10 и все нормально работало, плюс фоновые задачи чаще проверяли, не пора ли им выполниться. Сейчас вернулся к прежнему значению, ибо незачем. Да, WM_TIMER - не очень надежное сообщение. Но ведь вы не звук выводите и не видео отображаете? С точки зрения пользовательского интерфейса обновление раз в 50 и раз в 100 миллисекунд практически не отличается, так что тут особая точноть и не нужна. Если же вы работаете со звуком или видео, заводите мультимедийный таймер. От повседневного интерфейса не требуется такого сверхточного быстродействия. |
Автор: | Александр Ильин [ Понедельник, 22 Январь, 2007 16:30 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Цитата: Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню. Ну, не надо так драматизировать Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи. И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды. Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя. Ну, не надо так драматизировать BlackBox 1.5 стандартной поставки содержит два потока. И может содержать сколько угодно еще. С потоками работать можно, достаточно соблюдать только одно условие: поток должен работать только с базовыми типами (никаких RECORD или ARRAY). Впрочем, насчет ARRAY, Илья, вам виднее. Если при обращении к массиву не производится проверка динамического типа (изменяемого сборщиком), то с массивами работать можно. Тогда добавляется второе условие: нельзя динамически выделять память под такие массивы. Массив должен быть глобально заякорен, чтобы сборщик мусора его не уничтожил. Да, условия жесткие. Есть еще вариант: в каждом потоке должен быть свой менеджер памяти с собственным NEW и сброщиком. Это легко сделать, залинковав Kernel в DLL и создавая параллельный поток в DLL. Правда, это решение очень плохо масштабируется: чтобы создать 10 параллельных потоков, нужно создать 10 разных DLL. Зато если подключить еще модуль Services и в параллельной DLL запустить кооперативную многозадачность, то чем вам не серверный вариант? |
Автор: | Александр Ильин [ Понедельник, 22 Январь, 2007 16:35 ] |
Заголовок сообщения: | |
Сергей Губанов писал(а): Ужас... Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный.
Это точно! В поток лучше выносить только обработку данных и сигнализацию об их изменении/готовности к прорисовке. PS: Уф! Какая хорошая, вдохновляющая ветка : )) |
Автор: | Илья Ермаков [ Понедельник, 22 Январь, 2007 21:15 ] |
Заголовок сообщения: | |
Да, ветка весьма интересная Александр, прокомментирую про слияния наших сервис-паков с вашими исправлениями. Дело в том, что действительно имеет место рассогласование. Над сервис-паками работаю лично я и никто более, в то же время я не работаю над юникодизацией и "линуксоидизацией", над которой работают остальные. Вы отдали свои исправления в репозиторий, но у меня никак не доходят руки с ним разобраться, равно как и с Subversion. Поэтому, как Вы правильно заметили, SP4 формировался в основном из потребностей Active BlackBox + я туда включил навигатор исходного кода и еще кое-какие мелочи. Давайте выпустим следующий Service Pack с Вашими исправлениями и с тем, что обсуждалось в этой ветке. Если Вы возьметесь все это туда включить, то было бы превосходно... |
Автор: | Штирлиц [ Среда, 24 Январь, 2007 02:08 ] |
Заголовок сообщения: | |
Сергей Губанов писал(а): Ужас... Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный.
В ужас надо приходить от того, что в Blackbox одним кликом мыши загружается процессор почти на 100%. И от того что, для определения отпущена мышь или нет используется такой код: | msg: Controllers.TrackMsg DO v.x := msg.x; v.y := msg.y; v.context.GetSize(w, h); v.Restore(f, 0, 0, w, h); REPEAT f.Input(x, y, m, isDown); IF (x # v.x) OR (y # v.y) THEN v.x := x; v.y := y; v.Restore(f, 0, 0, w, h) END UNTIL ~isDown; Views.Update(v, Views.keepFrames) (ObxView5) Почему нельзя сделать так: MODULE ObxViews5; (** project = "BlackBox" organization = "www.oberon.ch" contributors = "Oberon microsystems" version = "System/Rsrc/About" copyright = "System/Rsrc/About" license = "Docu/BB-License" changes = "" issues = "" **) IMPORT Views, Ports, Properties, Controllers; TYPE View = POINTER TO RECORD (Views.View) x, y: INTEGER END; VAR doUpdate: BOOLEAN; PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); BEGIN f.DrawRect(l, t, r, b, Ports.fill, Ports.red); f.DrawLine(v.x, t, v.x, b, 0, Ports.white); f.DrawLine(l, v.y, r, v.y, 0, Ports.white) END Restore; PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message); CONST min = 5 * Ports.mm; max = 50 * Ports.mm; BEGIN WITH msg: Properties.SizePref DO IF (msg.w = Views.undefined) OR (msg.h = Views.undefined) THEN msg.w := 20 * Ports.mm; msg.h := 10 * Ports.mm ELSE Properties.ProportionalConstraint(2, 1, msg.fixedW, msg.fixedH, msg.w, msg.h); IF msg.h < min THEN msg.h := min; msg.w := 2 * min ELSIF msg.h > max THEN msg.h := max; msg.w := 2 * max END END | msg: Properties.ResizePref DO msg.horFitToWin := TRUE; msg.verFitToWin := TRUE | msg: Properties.FocusPref DO msg.setFocus := TRUE ELSE (* ignore other messages *) END END HandlePropMsg; PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View); VAR x, y, w, h: INTEGER; m: SET; isDown: BOOLEAN; BEGIN WITH msg: Controllers.PollOpsMsg DO msg.valid := {Controllers.paste}; msg.selectable := TRUE; msg.type := "Obx.Tutorial" | msg: Controllers.EditMsg DO IF msg.op = Controllers.pasteChar THEN (* cursor keys *) IF msg.char = 1DX THEN INC(v.x, Ports.mm) ELSIF msg.char = 1CX THEN DEC(v.x, Ports.mm) ELSIF msg.char = 1EX THEN DEC(v.y, Ports.mm) ELSIF msg.char = 1FX THEN INC(v.y, Ports.mm) END; Views.Update(v, Views.keepFrames) END | msg: Controllers.TrackMsg DO v.x := msg.x; v.y := msg.y; v.context.GetSize(w, h); v.Restore(f, 0, 0, w, h); f.Input(x, y, m, isDown); doUpdate := isDown; | msg: Controllers.PollCursorMsg DO msg.cursor := Ports.graphicsCursor; f.Input(x, y, m, isDown); IF isDown THEN IF (x # v.x) OR (y # v.y) THEN v.context.GetSize(w, h); v.x := x; v.y := y; v.Restore(f, 0, 0, w, h); END; END; IF ~isDown & doUpdate THEN doUpdate := FALSE; Views.Update(v, Views.keepFrames); END; ELSE (* ignore other messages *) END END HandleCtrlMsg; PROCEDURE Deposit*; VAR v: View; BEGIN NEW(v); v.x := 0; v.y := 0; Views.Deposit(v) END Deposit; END ObxViews5. И процессор не грузится и делается все тоже самое. |
Автор: | Штирлиц [ Среда, 24 Январь, 2007 02:58 ] |
Заголовок сообщения: | |
Здраствуйте Александр! Цитата: Что касается цикла обработки сообщений, то он сделан не во всех местах очень хорошо : )) (покосился на info21, но продолжил рассказ). Например, 100% загрузка процессора берется из того факта, что всякий View, если он хочет отслеживать положение мыши (например, когда вы выделяете блок текста, нажав кнопку) вынужден организовывать цикл опроса мыши и клавиатуры, постоянно вызывая Rider.Input. Этот способ официально рекомендуется в документации разработчика. Видимо, это единственный способ реализовать перехват всех сообщений от мыши, так уж устроен фреймворк. Выглядит это иногда вот так (циатата из HostMechanisms):
Код: REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown; Подобных циклов немало разбросано по исходникам BlackBox (более десятка). В Delphi VCL при организации подобного цикла всегда есть возможноть "дать дышать" всем другим объектам и процессам, вызывая главный цикл обработки сообщений: Application.ProcessMessages. В BlackBox такой возможности не предусмотрено. Более того, если внимательно посмотреть на HostMenus.Loop, то станет очевидно, что процедура не рассчитана на повторное вхождение. Потому и не опубликована. Кстати, в официальной почтовой рассылке уже не один раз за прошедший год пролетали "рецепты по разморозке" в виде небольших циклов обработки сообщений Windows. Естественно, ни о какой платформенной независимости тут речи вести не приходится. Обычно обработку реализуют так (схема): WM_LBUTTONDOWN: GetCapture; (подготовка к обработке) WM_MOUSEMOVE: (обработка, например выделяем текст) WM_MOUSEUP: ReleaseCapture;(конец обработки) Для этого у нас почти все есть Controllers.TrackMsg - возникает когда нажали мышь Controllers.PollCursorMsg - возникает при движении мыши ввести еще сообщение типа(по крайней мере в документации я не нашел чего-то подобного) Controllers.MouseUpMsg возникает когда мышь отпущена И тогда не надо будет писать REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown; Если такой способ обработки в приложении остается на совести программиста, то из ядра Blackbox такие вещи надо выкинуть однозначно (если это возможно). Необходимо критически пересмотреть обработку сообщений в ядре Blackbox. Тогда и процессор не будет загружаться на 100% и другие задачи замирать не будут, только от того что нажата мышь. Ввести все-таки функцию (например, включить ее в модуль System\Windows) типа PROCEDURE ProcessMessages: BOOLEAN, которую программист мог-бы вызывать на свое усмотрение (все зависит от задачи которую он решает). переносимость не пострадает, потому как на других платформах ProcessMessages может быть пустышкой. |
Автор: | Сергей Губанов [ Среда, 24 Январь, 2007 10:27 ] |
Заголовок сообщения: | |
Чего-то тут не многопоточность обсуждается, а оконная подсистема. Надо в другую ветку форума перемещаться... Цитата: когда мышь отпущена
Мышь может быть нажата на одном окне, а отпущена уже на другом. То есть окно на котором мышь была нажата, сообщения об отпускании нажатой кнопки может и не получить. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |