From d8c4378ec196df47b474c6e29a4b6477365d13dd Mon Sep 17 00:00:00 2001 From: 20kdc Date: Thu, 22 Mar 2018 23:37:19 +0000 Subject: [PATCH] Fix a bug that's apparently been around since multimonitor-support, and optimize some stuff Also, store an old installer copy for reference --- code/apps/app-textedit.lua | 21 +- code/apps/sys-everest.lua | 44 +-- code/apps/sys-glacier.lua | 19 +- code/apps/sys-init.lua | 80 +++-- code/init.lua | 72 +--- preSH-Ancient-Est-2-10-2017.lua | 609 ++++++++++++++++++++++++++++++++ 6 files changed, 722 insertions(+), 123 deletions(-) create mode 100644 preSH-Ancient-Est-2-10-2017.lua diff --git a/code/apps/app-textedit.lua b/code/apps/app-textedit.lua index 016e73d..c2a4d26 100644 --- a/code/apps/app-textedit.lua +++ b/code/apps/app-textedit.lua @@ -13,7 +13,7 @@ end local lines = { "Neolithic: Text Editor", "Keymap " .. unicode.getKeymap() .. ", to correct, type", - "\"A Cruel Jump's Kinesis: DVSQuest\"", + " the alphabet in capitals.", "Then, restart the text editor.", "^" .. mappingFinal[1] .. ", ^" .. mappingFinal[2] .. ", ^" .. mappingFinal[3] .. ": Load, Save, New", "^" .. mappingFinal[4] .. ", ^" .. mappingFinal[5] .. ", ^" .. mappingFinal[6] .. ": Copy, Paste, Delete Line", @@ -54,6 +54,8 @@ local sW, sH = 37, #lines + 2 local window = neo.requestAccess("x.neo.pub.window")(sW, sH) local flush +local screenCache = {} + local function splitCur() local s = lines[cursorY] local st = unicode.sub(s, 1, cursorX - 1) @@ -143,11 +145,9 @@ local function getline(y) -- rX is difficult! local rX = 1 - local Xthold = math.floor(sW / 2) + local Xthold = math.max(1, math.floor(sW / 2) - 1) local _, cursorXP = unicode.safeTextFormat(lines[cursorY], cursorX) - if cursorXP > Xthold then - rX = rX + (cursorXP - Xthold) - end + rX = (math.max(0, math.floor(cursorXP / Xthold) - 1) * Xthold) + 1 local line = lines[rY] if not line then return ("¬"):rep(sW) @@ -378,9 +378,14 @@ local function ev_clipboard(t) end flush = function () + local newCache = {} for i = 1, sH do - window.span(1, i, getline(i), 0xFFFFFF, 0) + newCache[i] = getline(i) + if newCache[i] ~= screenCache[i] then + window.span(1, i, newCache[i], 0xFFFFFF, 0) + end end + screenCache = newCache end local flash flash = function () @@ -388,7 +393,9 @@ flash = function () -- reverse: --local rY = (y + cursorY) - math.ceil(sH / 2) local csY = math.ceil(sH / 2) - window.span(1, csY, getline(csY), 0xFFFFFF, 0) + local l = getline(csY) + screenCache[csY] = l + window.span(1, csY, l, 0xFFFFFF, 0) event.runAt(os.uptime() + 0.5, flash) end event.runAt(os.uptime() + 0.5, flash) diff --git a/code/apps/sys-everest.lua b/code/apps/sys-everest.lua index f4e1955..07b8e6d 100644 --- a/code/apps/sys-everest.lua +++ b/code/apps/sys-everest.lua @@ -39,6 +39,8 @@ local screens = neo.requireAccess("x.neo.sys.screens", "access to screens") neo.requestAccess("s.h.clipboard") neo.requestAccess("s.h.touch") neo.requestAccess("s.h.drag") +neo.requestAccess("s.h.drop") +neo.requestAccess("s.h.scroll") neo.requestAccess("s.h.key_up") neo.requestAccess("s.h.key_down") @@ -99,6 +101,11 @@ local function surfaceAt(monitor, x, y) end end +-- Always use the first sometime before the second +local function monitorResetBF(m) + m[5] = -1 + m[6] = -1 +end local function monitorGPUColours(m, cb, bg, fg) local nbg = m[5] local nfg = m[6] @@ -134,6 +141,7 @@ local function updateRegion(monitorId, x, y, w, h, surfaceSpanCache) local m = monitors[monitorId] local mg = m[1]() if not mg then return end + monitorResetBF(m) -- The input region is the one that makes SENSE. -- Considering WC handling, that's not an option. -- WCHAX: start @@ -208,8 +216,6 @@ local function reconcileAll() if mon then v[3], v[4] = mon.getResolution() end - v[5] = -1 - v[6] = -1 updateRegion(k, 1, 1, v[3], v[4], {}) end updateStatus() @@ -237,6 +243,11 @@ local function moveSurface(surface, m, x, y, w, h) cb.copy(ox, oy, w, h, x - ox, y - oy) end end + --because OC's widechar support sucks, comment out this perf. opt. + --if surfaces[1] == surface then + -- updateRegion(om, ox, oy, ow, oh, cache) + -- return + --end end end end @@ -260,6 +271,7 @@ local function handleSpan(target, x, y, text, bg, fg) local m = monitors[target[1]] local cb = m[1]() if not cb then return end + monitorResetBF(m) -- It is assumed basic type checks were handled earlier. if y < 1 then return end if y > target[5] then return end @@ -280,22 +292,8 @@ local function handleSpan(target, x, y, text, bg, fg) local buildingSegmentE = nil local function submitSegment() if buildingSegment then - base = unicode.sub(text, buildingSegment, buildingSegmentE - 1) - local ext = unicode.sub(text, buildingSegmentE, buildingSegmentE) - if unicode.charWidth(ext) == 1 then - base = base .. ext - else - -- While the GPU may or may not be able to display "half a character", - -- getting it to do so reliably is another matter. - -- In my experience it always leads to drawing errors much worse than if the code was left alone. - -- If your language uses wide chars and you are affected by a window's positioning... - -- ... may I ask how, exactly, you intend me to fix it? - -- My current theory is that for cases where the segment is >= 2 chars (so we have scratchpad), - -- the GPU might be tricked via a copy. - -- Then the rest of the draw can proceed as normal, - -- with the offending char removed. - base = base .. " " - end + base = unicode.sub(text, buildingSegment, buildingSegmentE) + -- rely on undoSafeTextFormat for this transform now monitorGPUColours(m, cb, bg, fg) cb.set(buildingSegmentWX, buildingSegmentWY, unicode.undoSafeTextFormat(base)) buildingSegment = nil @@ -388,9 +386,7 @@ everestProvider(function (pkg, pid, sendSig) specialDragHandler = function (x, y) local ofsX, ofsY = math.floor(x) - math.floor(a), math.floor(y) - math.floor(b) if (ofsX == 0) and (ofsY == 0) then return end - local pX, pY = ofsSurface(surf, ofsX, ofsY) - --a = a + pX - --b = b + pY + ofsSurface(surf, ofsX, ofsY) end return end @@ -403,11 +399,7 @@ everestProvider(function (pkg, pid, sendSig) end b = b - 1 end - if ev == "scroll" then - b = b - 1 - end - if ev == "drop" then - specialDragHandler = nil + if ev == "scroll" or ev == "drop" then b = b - 1 end if ev == "line" then diff --git a/code/apps/sys-glacier.lua b/code/apps/sys-glacier.lua index 446ce26..0b0bc5d 100644 --- a/code/apps/sys-glacier.lua +++ b/code/apps/sys-glacier.lua @@ -76,6 +76,8 @@ end local monitorPool = {} -- [screenAddr] = {gpu, claimedLoseCallback} local monitorClaims = {} +-- [gpuAddr] = monitorAddr +local currentGPUBinding = {} local function announceFreeMonitor(address, except) for k, v in pairs(targsRD) do @@ -89,7 +91,7 @@ local function getGPU(monitor) local bestG local bestD = 0 for v in gpus.list() do - v.bind(monitor.address) + v.bind(monitor.address, false) local d = v.maxDepth() if d > bestD then bestG = v @@ -121,6 +123,7 @@ local function getMonitorSettings(a) return w, h, d end local function setupMonitor(gpu, monitor) + gpu.bind(monitor.address, false) local maxW, maxH = gpu.maxResolution() local maxD = gpu.maxDepth() local w, h, d = getMonitorSettings(monitor.address) @@ -227,6 +230,7 @@ donkonitRDProvider(function (pkg, pid, sendSig) if gpu then setupMonitor(gpu, v) gpu = gpu.address + currentGPUBinding[gpu] = address local disclaimer = function (wasDevLoss) -- we lost it monitorClaims[address] = nil @@ -244,12 +248,14 @@ donkonitRDProvider(function (pkg, pid, sendSig) return function () for v in gpus.list() do if v.address == gpu then - local _, v2 = v.bind(address) - if not v2 then - return v - else - return + if currentGPUBinding[gpu] ~= address then + local _, v2 = v.bind(address, false) + if v2 then + return + end end + currentGPUBinding[gpu] = address + return v end end end @@ -270,6 +276,7 @@ end) loadSettings() local function rescanDevs() monitorPool = {} + currentGPUBinding = {} local hasGPU = gpus.list()() for k, v in pairs(monitorClaims) do v[2](true) diff --git a/code/apps/sys-init.lua b/code/apps/sys-init.lua index b584cc0..ce0adba 100644 --- a/code/apps/sys-init.lua +++ b/code/apps/sys-init.lua @@ -6,7 +6,7 @@ local callerPkg, callerPid, callerScr = ... -local gpu, screen = nil, nil +local gpuG, screen = nil, nil local shutdownEmergency = neo.requestAccess("k.computer").shutdown neo.requestAccess("s.h.key_down") @@ -30,14 +30,19 @@ local function shutdown(reboot) end end -local function basicDraw() +local function rstfbDraw(gpu) + gpu.setBackground(0xFFFFFF) + gpu.setForeground(0x000000) +end + +local function basicDraw(gpu) scrW, scrH = gpu.getResolution() gpu.fill(1, 1, scrW, scrH, " ") gpu.set(2, 2, "KittenOS NEO") end -local function advDraw() - basicDraw() +local function advDraw(gpu) + basicDraw(gpu) local usage = math.floor((os.totalMemory() - os.freeMemory()) / 1024) gpu.set(2, 3, "RAM Usage: " .. usage .. "K / " .. math.floor(os.totalMemory() / 1024) .. "K") for i = 1, #warnings do @@ -49,9 +54,9 @@ end local performDisclaim = nil local function retrieveNssMonitor(nss) - gpu = nil + gpuG = nil local subpool = {} - while not gpu do + while not gpuG do if performDisclaim then performDisclaim() end @@ -94,19 +99,20 @@ local function retrieveNssMonitor(nss) end if not subpool[1] then error("Unable to claim any monitor.") end - gpu = subpool[1][1]() -- BAD + gpuG = subpool[1][1] screen = subpool[1][2] end -- done with search + local gpu = gpuG() scrW, scrH = gpu.getResolution() - gpu.setBackground(0xFFFFFF) - gpu.setForeground(0x000000) + rstfbDraw(gpu) gpu.fill(1, 1, scrW, scrH, " ") performDisclaim = function () for _, v in ipairs(subpool) do nss.disclaim(v[2]) end end + return gpu end local function sleep(t) @@ -120,10 +126,8 @@ local function sleep(t) -- This implies we have and can use nss, but check anyway local nss = neo.requestAccess("x.neo.sys.screens") if nss then - retrieveNssMonitor(nss) - gpu.setBackground(0xFFFFFF) - gpu.setForeground(0x000000) - basicDraw() + local gpu = retrieveNssMonitor(nss) + basicDraw(gpu) end end end @@ -146,7 +150,9 @@ local function finalPrompt() warnings[2] = "ENTER to select..." -- The actual main prompt loop while waiting do - advDraw() + local gpu = gpuG() + rstfbDraw(gpu) + advDraw(gpu) local entry = "" local entry2 = "" local active = true @@ -164,7 +170,9 @@ local function finalPrompt() if entry == password then waiting = false else - advDraw() + local gpu = gpuG() + rstfbDraw(gpu) + advDraw(gpu) sleep(1) end active = false @@ -185,7 +193,9 @@ local function finalPrompt() return shButton end, function (key) if key == 13 then - basicDraw() + local gpu = gpuG() + rstfbDraw(gpu) + basicDraw(gpu) gpu.set(2, 4, "Shutting down...") shutdown(false) end @@ -194,7 +204,9 @@ local function finalPrompt() return rbButton end, function (key) if key == 13 then - basicDraw() + local gpu = gpuG() + rstfbDraw(gpu) + basicDraw(gpu) gpu.set(2, 4, "Rebooting...") shutdown(true) end @@ -203,17 +215,22 @@ local function finalPrompt() return smButton end, function (key) if key == 13 then - basicDraw() + local gpu = gpuG() + rstfbDraw(gpu) + basicDraw(gpu) gpu.set(2, 4, "Login to activate Safe Mode.") sleep(1) + gpu = gpuG() safeModeActive = true - advDraw() + rstfbDraw(gpu) + advDraw(gpu) end end, 4 + unicode.len(shButton) + unicode.len(rbButton), scrH - 1, unicode.len(smButton)}, pw, } local control = #controls while active do + local gpu = gpuG() for k, v in ipairs(controls) do if k == control then gpu.setBackground(0x000000) @@ -225,9 +242,6 @@ local function finalPrompt() gpu.fill(v[3], v[4], v[5], 1, " ") gpu.set(v[3], v[4], v[1]()) end - -- Reset to normal - gpu.setBackground(0xFFFFFF) - gpu.setForeground(0x000000) -- event handling... local sig = {coroutine.yield()} if sig[1] == "x.neo.sys.screens" then @@ -245,10 +259,14 @@ local function finalPrompt() end end end - advDraw() + local gpu = gpuG() + rstfbDraw(gpu) + advDraw(gpu) return safeModeActive end local function postPrompt() + local gpu = gpuG() + rstfbDraw(gpu) -- Begin to finish login, or fail local everests = neo.requestAccess("x.neo.sys.session") if everests then @@ -258,7 +276,7 @@ local function postPrompt() table.insert(warnings, tostring(e)) else warnings = {"Transferring to Everest..."} - advDraw() + advDraw(gpu) if performDisclaim then performDisclaim() -- Give Everest time (this isn't perceptible, and is really just a safety measure) @@ -269,7 +287,7 @@ local function postPrompt() else table.insert(warnings, "Couldn't communicate with Everest...") end - advDraw() + advDraw(gpu) sleep(1) shutdown(true) end @@ -280,12 +298,13 @@ local function initializeSystem() -- Note that we should try to keep going with this if there's no reason to do otherwise. local gpuAc = neo.requestAccess("c.gpu") local screenAc = neo.requestAccess("c.screen") + local gpu -- time to setup gpu/screen variables! if gpuAc and screenAc then local scrBestWHD = 0 for s in screenAc.list() do for g in gpuAc.list() do - g.bind(s.address) + g.bind(s.address, false) local w, h = g.maxResolution() local whd = w * h * g.maxDepth() if whd > scrBestWHD then @@ -348,7 +367,7 @@ local function initializeSystem() else gpu.setBackground(0xFFFFFF) end - basicDraw() + basicDraw(gpu) end if steps[w] then if steps[w] == "INJECT" then @@ -407,7 +426,9 @@ end -- System initialized if finalPrompt() then -- Safe Mode - basicDraw() + local gpu = gpuG() + rstfbDraw(gpu) + basicDraw(gpu) local nsm = neo.requestAccess("x.neo.sys.manage") if nsm then gpu.set(2, 4, "Rebooting for Safe Mode...") @@ -420,6 +441,9 @@ if finalPrompt() then -- assume sysconf.lua did something very bad gpu.set(2, 4, "No NSM. Wiping configuration completely.") local fs = neo.requestAccess("c.filesystem") + if not fs then + gpu.set(2, 4, "Failed to get permission, you're doomed.") + end fs.primary.remove("/data/sys-glacier/sysconf.lua") end -- Do not give anything a chance to alter the new configuration diff --git a/code/init.lua b/code/init.lua index 7fdc2a0..07c761b 100644 --- a/code/init.lua +++ b/code/init.lua @@ -113,61 +113,11 @@ keymaps = { ["??-dvorak"] = { {19, "PYFGCRL"}, {19, "pyfgcrl"}, - {30, "AOEUIDHTN"}, - {30, "aoeuidhtn"}, - {45, "QJKXBM"}, - {45, "qjkxbm"}, + {30, "AOEUIDHTNS"}, + {30, "aoeuidhtns"}, + {45, "QJKXBMWVZ"}, + {45, "qjkxbmwvz"}, }, - ["??-dvorak-full"] = { - {16, "\"<>PYFGCRL"}, - {16, "',.pyfgcrl"}, - {30, "AOEUIDHTN"}, - {30, "aoeuidhtn"}, - {44, ":QJKXBM"}, - {44, ";qjkxbm"}, - }, - ["cz-qwertz"] = { - {2, "+ěščřžýáíé="}, -- The last letter is a *compose key*. #WTF - {2, "1234567890%"}, - {15, "\tQWERTZUIOP/("}, - {15, "\tqwertzuiopú)"}, - {30, "ASDFGHJKL\"!'"}, - {30, "asdfghjklů§"}, - {44, "YXCVBNM?:_"}, - {44, "yxcvbnm,.-"}, - }, - ["de-qwertz"] = { - {2, "1234567890ß"}, -- another one? - {2, "!\"§$%&/()=?"}, - {15, "\tQWERTZUIOPÜ*"}, - {15, "\tqwertzuiopü+"}, - {30, "ASDFGHJKLÖÄ"}, - {30, "asdfghjklÖÄ"}, - {44, "YXCVBNM;:_"}, - {44, "yxcvbnm,.-"}, - }, - ["uk-qwerty"] = { - {41, "`"}, {41, "¬"}, - {2, "1234567890-="}, - {2, "!\"£$%^&*()_+"}, - {15, "\tQWERTYUIOP{}"}, - {15, "\tqwertyuiop[]"}, - {30, "ASDFGHJKL:@"}, - {30, "asdfghjkl;'"}, - {44, "ZXCVBNM<>?"}, - {44, "zxcvbnm,./"}, - }, - ["us-qwerty"] = { - {41, "`"}, {41, "~"}, - {2, "1234567890-="}, - {2, "!@#$%^&*()_+"}, - {15, "\tQWERTYUIOP{}\r"}, - {15, "\tqwertyuiop[]\r"}, - {30, "ASDFGHJKL\"|"}, - {30, "asdfghjkl'\\"}, - {44, "ZXCVBNM<>?"}, - {44, "zxcvbnm,./"}, - } } local unknownKeymapContains = {} currentKeymap = "unknown" @@ -241,12 +191,22 @@ unicode.keymap = function (text) local km = unicode.getKeymap() local rtext = "" local codes = {} + local notQ = false for i = 1, unicode.len(text) do local ch = unicode.sub(text, i, i) - local okc = unicode.getKCByCh(ch, "uk-qwerty") or 0 - rtext = rtext .. (unicode.getChByKC(okc, currentKeymap) or unicode.getChByKC(okc, "unknown") or ch) + local okc = unicode.getKCByCh(ch, "??-qwerty") or 0 + local ch2 = unicode.getChByKC(okc, currentKeymap) or unicode.getChByKC(okc, "unknown") + if not ch2 then + ch2 = "?" + else + notQ = true + end + rtext = rtext .. ch2 codes[i] = unicode.getKCByCh(ch, currentKeymap) or unicode.getKCByCh(ch, "unknown") end + if not notQ then + rtext = text + end return rtext, codes end diff --git a/preSH-Ancient-Est-2-10-2017.lua b/preSH-Ancient-Est-2-10-2017.lua new file mode 100644 index 0000000..99a8800 --- /dev/null +++ b/preSH-Ancient-Est-2-10-2017.lua @@ -0,0 +1,609 @@ +-- KOSNEO inst. +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- PADPADPADPADPADPADPADPAD + +local C, O, G, D = component, computer +local sAddr = C.list("screen", true)() +if sAddr then + G = C.list("gpu", true)() + if G then + G = C.proxy(G) + G.bind(sAddr) + G.setForeground(0xFFFFFF) + G.setBackground(0x000000) + G.setResolution(50, 5) + G.setDepth(1) + G.fill(1, 1, 50, 5, " ") + G.setBackground(0xFFFFFF) + G.setForeground(0x000000) + G.fill(1, 2, 50, 1, " ") + G.set(2, 2, "KittenOS NEO Installer") + end +end + +D = C.proxy(O.getBootAddress()) + +local file = nil +local fileName = "Starting..." +local fileSizeRm = 0 +local ws = 0 + +local convoct +convoct = function (oct) + local v = oct:byte(#oct) - 0x30 + if #oct > 1 then + return (convoct(oct:sub(1, #oct - 1)) * 8) + v + end + return v +end +local function sectorCore(sector) + if ws > 0 then + ws = ws - 1 + return + end + if file then + local takeaway = math.min(512, fileSizeRm) + D.write(file, sector:sub(1, takeaway)) + fileSizeRm = fileSizeRm - takeaway + if fileSizeRm == 0 then + D.close(file) + file = nil + end + else + local name = sector:sub(1, 100):gsub("\x00", "") + local sz = convoct(sector:sub(125, 135)) + if name:sub(1, 5) ~= "code/" then + ws = math.ceil(sz / 512) + else + if name:sub(#name, #name) == "/" then + ws = math.ceil(sz / 512) + D.makeDirectory(name:sub(6)) + else + fileName = name:sub(6) + file = D.open(fileName, "wb") + fileSizeRm = sz + if file then + if fileSizeRm == 0 then + D.close(file) + file = nil + end + end + end + end + end +end + +local dieCB = function () end + +local sectorNum = 0 +local sectorCount = 0 + +local function sector(n) + sectorCore(n) + sectorNum = sectorNum + 1 + if G then + local a = sectorNum / sectorCount + G.fill(1, 2, 50, 1, " ") + G.set(2, 2, "KittenOS NEO Installer : " .. fileName) + G.setForeground(0xFFFFFF) + G.setBackground(0x000000) + G.fill(2, 4, 48, 1, " ") + G.setBackground(0xFFFFFF) + G.setForeground(0x000000) + G.fill(2, 4, math.ceil(48 * a), 1, " ") + end + if sectorNum % 8 == 0 then + O.pullSignal(0.05) + end + if sectorNum == sectorCount then + dieCB() + O.shutdown(true) + end +end + +sectorCount = 260 +D.remove("init-symsear.lua") +D.rename("init.lua", "init-symsear.lua") +local instHandle = D.open("init-symsear.lua", "rb") +dieCB = function () + D.close(instHandle) + D.remove("init-symsear.lua") +end +local syms = {" ","s","e","t","a","i","\24","(","r",".","\ +","p","\"","o","c","m",", ","\1","l","n",")","d","u","\17","\9","x","-","\7","\6","\8","\4","\13","\2","\3","\5","g","\14","\21","\11"," then\ + ","1","w"," ","\12","\18","\22","f","F","y",",","\20","re","b","k"," = ","\23","return "," local ","\16","v"," if ","\ + ","\15","\19","\ + "," ","[","en","/","0","]","path","nction (","\ + ","se","h"," =","or","S","T","le","\ +local ",")\ +","= fu","on"," == ","ne",")\ + ","functio","\ + end\ +","D","{"," t","n ","oc","lo"," end\ + ","\0\0\0\0\0\0\0\0\0","un"," i","W","\0\0\0\0\0\0","fu","et"," end\ +","then ","nd","ni","A","ing"," tab","loca","etting",")\ + ","ct","C","P","}","\ + end\ +",")\ + ","onit","= ","end\ +","\0","I","Y"," do\ + ","return\ +","le.inser"," = func","= \"","al"," r"," e","in","he","nc"," e","j","donkonit","tion ()",") do\ + "," the","\ + ",")\ + ","ur","#","+","N","cursor",".inse",", v ","nction (w"," neo.req"," for "," then\ + ","\0\0\0\0\0\0\0","nd\ + ","()\ + ","neo.","ath","table","l ","do","2","3",":","H"," = nil\ + ","nd\ + e","hen\ + ","\7local ","indowCore",")\ + end\ +","d\") end\ +"," = false","if ","pairs(","dow","string\"","ti","O","uestAcces","nd\ + if ","icode."," if","v in ","pkg, pid","000","750\0000001","end\ + e","750\0000000"," else\ + ","window","end","00",".neo.sys.","neoux.tc","= {}\ + ","(window, ","5","=","E","R",") end\ + "," cursor","request","ode/app"," return e","\" the","equire("," "," then",".neo.pub.","hile true"," end"," en","\0\0","B","M"," ret","for ","in ipai"," true\ + ","close","code.sub","error(\"","return t","oroutine"," end\ + if","end\ + en","tion ","\", funct",":sub(","vailable"," end\ + "," l"," == \"","prima"," if type(","ryWindow","window.s"," end\ + ","L","X","~","on ("," in ipair"," for _, v"," for k","\0\0\0\0\0cod","lose()\ + "," = funct","rror(\"Exp","nsurePath","s.primary","primary","buildingS","unic"," "," re","surfaces","disallowe","ackground","neoux.","ccess","selectUnk"," end\ + "," = uni","\ + end\ +"," f","7","Z","z","for k","rue\ + end\ +","ode.len("," end\ +","lse\ + ",") end","end\ + "," fu",":sub(1, ","sub(1, 4)"," ","neo","the","if not "," th","tion","unknownA","end\ + ","[1] == \"","= unico","Acces","\ +end\ +\ +l","n\ + ","\") end\ +","de.len("," end","\" then\ + ","0\0000001","urface","nd\ +","()\ +","(surfaces"," if ","\0\0\0\0\0\0\0\0","unc","urn","\ + "," end\ +"," neoux","ction","\ + end\ + ","\ + ","neoux","\24\0\0\0\0\0\0\0\0","\ + end"," end\ +end\ +","\ +end\ +"," if "," err","s[1] == \"","unicode."," window"," if ","ocal fun","= false","\0\0\0\0\0\0\0000","\0\0\0\0\0\0\00000","code","_, v in i","()\ + ","d\ + ","f ev == \""," return",", bg, fg"," end"," neoux.","\0\0\0","w.close(","\ + if ev"," i"," if not ","if kc == ",")\ + end\ + ","indow","onkonit","00175","table.",", bg, fg)"," l"," end\ + ",") == \"","d\ +"," return ","rn","ca","q"," tabl"," error(\"","end\ + re"," in ","hen err","nd\ + en","nd\ + ","\ + end","turn ","x.neo.","ion ("," table","false","string","e.len(","d\ + "," re","1, unicod","cursorX ","local ","end\ +end\ +","cal","\" then e","nd\ + if k","ion","00644\00000"," end\ + ","\ +end"," window."," e","if not","== \"",", func"," neo.",", functi","\ + end\ +end"," r","end\ + ","ion (w)\ +","\ + end"," = false\ +"," ret","tu"," end\ + ","f ","unction","= nil\ +","th","n\ +","6","U","_","requir","eturn\ +"," funct","eturn tr","\ +\ +local"," table.","eques","rn ",")\ + r",".insert(","ode.",")\ + end","== ","\0\0\0\0\0\0\0c","n\ + ","\0\0\0\0\0","()\ + "," = nil","able.","n\ + "," = n","return","000644\0000","Access","able","etu","d\ + ","\ + if ","end\ + end","nction (p","ub(1, 4) "," return "," return","lse\ + ","abl","= uni","for k, ","\0\0\0\0\0\0\0\0c","cursorY","ble","bg, fg)\ + ","\ + e","ind","ret","tring\"","000000"," neo","pairs","then\ + ",")\ + ","le.inse","loc","\ + end","n error","\ +end\ +\ +","if s[1] =","lse\ + ","turn","ursor","function","neou","\0\0\0\0\0\0c","function ","\0000001","end\ + e","eo.","Access(\""," re"," lo","\ + e",")\ + end","urn ","\ + re"," end\ + e"," = f","\0\0\0\0","cal ","\0000000644\0","in ip","\ + en"," return",")\ + i","ction ","\ + end\ +","ode","equire(\"","r(\"Expect","ctio"," cursorY","if","%","4","<","G","\ +local f","\ + ret"," for ","d\ + if"," erro","true\ + end","ed\") end","hen ","nd\ + en","al ","on ","] then\ + ","string\")","for _, ","unicode.l","[1] == ","true\ + ","uestAc","nd\ +end\ +"," for k, "," if ev ","then\ + ","\ + en",")\ + en","do\ + ","e.ins",".primary"," true","coroutine","return\ + ","airs(",") end\ + ","nd\ +end\ +\ +","\ + return","window, ","end\ + e","end\ + end","750\0000","eturn t",", functio"," e","d\") end","en\ +","ocal","icode.len","e\ + ","n\ + ","w.close()"," uni","sub(","n ipairs("," for ","end\ + ","ion ()","end\ + en","quest","cursorY ","eturn","unicode.s","x.neo.pub"," = neo","hen\ + ","then\ +","string\") ","in ipa"," retur","indowCor"," re","750\00000"," do\ + ",")\ + if "," then ret","\") end"," en","n\ + ","ipairs"," then err","d\ + en","= f"," local",".neo.","\24\0\0\0\0\0\0\0","func","()\ + ",")\ + en","curs","\ + loca","ode/apps","nd\ + if "," i"," = neo.r","kg, pid, ","\ + i","win","code.sub(","require","wind"," else\ + ","close()"," end\ +e","\ +\ +local "," then re","\ + e",".request","wnAvailab","tion (","\ + local ","error(","\0000001750\0","n\ + ","d\ + "," ","uestA","reques","end\ +end\ +\ +","ion ()\ +"," curso","then\ + ","0001750","surfac",".close("," function","= neo.","if type("," loc","d\ + e","oroutine."," do\ + "," else\ + ","tion ()\ + ",", v in ","window.","neo.re","0000","\000000","\ + end\ + ","ipairs("," ret","\"x.neo.pu","error","\ + i","\ + end","()\ + ","= nil\ + ","nsert(","n erro","rror(\"","nil\ + ","cursorX ="," do\ + "," for","turn f","en\ + "," table.","\ + ","\") end\ + ","\") end\ + ",".close()\ +","\ + re","d\ + e","\ + end\ + ","ownAvaila","000644\00000"," false\ + ","\ + re","false\ +","ion ()\ + ",")\ + e","urn end\ +",")\ + if","x.neo.sys","indow, ","then\ + ",")\ + if t","cti","ion ","ion (w","\" then"," = nil\ +","then","e\" then\ +"," if","on (w)\ + ",") do\ + "," en","tAccess(\"","surePath"," end\ +end","\ + end\ + ","e.inse"," table.i"," local","oca","n (","0 then\ + ",") end\ +"," loc","se\ + ","do\ + ","nd\ + end\ +"," then e","0000644\0","ion ()\ + ","ocal ","end\ + if ","e\ + "," then\ +"," local","icode.le","\" then "," ==","] == \"","eoux","ndow","\0\0\0\0\0c","nownAvail"," functi","0\000000000","eoux.tc","hen error"," = neo.","table.ins"," window","(window","d\ + if ","\ + if ","\ + local","end\ + e","nd\ +end","insert("," local ","k, v i","surface","eturn ","\ +loc","sub(1, ","end\ + if ","io","!","$","&","'","*","8","9",";",">","?","@","J","K","Q","V","\\","^","|","","","","","","","","","","","","","","","","","","","",} +local bytBuf = "" +local bitBuf = "" +local function getByte() + if bytBuf == "" then + bytBuf = D.read(instHandle, 64) + end + local r = bytBuf:byte() + bytBuf = bytBuf:sub(2) + return r +end +while true do + if getByte() == 0 then break end +end +local function pb(c, p) if c % (p * 2) ~= c % p then bitBuf = bitBuf .. "1" else bitBuf = bitBuf .. "0" end end +local stn = 0 +local function getBit() + if bitBuf == "" then + local c = getByte() + c = (c - stn) % 256 stn = stn + 3 + pb(c, 1) + pb(c, 2) + pb(c, 4) + pb(c, 8) + pb(c, 16) + pb(c, 32) + pb(c, 64) + pb(c, 128) + end + local bit = bitBuf:sub(1, 1) == "1" + bitBuf = bitBuf:sub(2) + return bit +end +local buf = "" +local mode = false +local bc2 = 10 +while true do + local bc = getBit() + local v = 0 + if bc then bc = bc2 v = 64 else bc = 6 end + for bit = 0, bc - 1 do + if getBit() then v = v + (2 ^ bit) end + end + buf = buf .. syms[v] + if mode then + while #buf >= 512 do + sector(buf:sub(1, 512)) + buf = buf:sub(513) + end + else + if #buf == 27939 then + stn = 0 + bc2 = 11 + bitBuf = "" + syms = {} + while #buf > 0 do + local len = buf:byte() + if len > 127 then error("symlen") end + buf = buf:sub(2) + local ch = buf:sub(1, len) + buf = buf:sub(len + 1) + table.insert(syms, ch) + end + mode = true + end + end +end +--[[%]-Er=´ZENϯpᄉƈӦ4.6y3bHMvk +p h 3/U-3PMn4;Fag歞y̐xg- {.w1`&RO?!1-y Ol!m<;.@hPb!dd{R8hũr@1F +BSy]S +nn9ZKá_6" ¤qd2YZk(b f_u}̈́1ؠSldx3O +{=|"9s'`%@*QR?\.>e yv>Ã29·( +W/5sЌns'cFnňrO/DIj,yBտ듗 AUЁ^\\ǎ70x1"y g+/I`ޙ.:Gm!ueG4T.pX*Y(1ڋkyaox +rԤ-*λ*B?AiRi6;[q,H#U(;]FSv])]֍pgr/i4(TꕄW+!O+T.R9bނ`?Ɲʏ 0E"e/\&P50SUk6Im0q-kEܷ7~٣[Ҭ7K~q=-fڀ?8 mf*Zq3MISMSnSjwpr("+niU]UMN۝[_n#-<oƨ:)}3lhUY.^챟~ ?L҅h"bY+ҕޚ2 ] ||` ]]#M[nJb6@MyHijkZh:o`ǛIY=0J +XdPm߱ + 3F, ~ ;BTI((lۑh9*j4eY\ť&To=;h(+-<7yVg&Xl6U: )+L07PRCORY.EWx0?_tK$>78 |bB,.u{AILNxwu1=B Zm!a+}/cK,Emqso]cBԖ Tdw'4[OI%FúmLzf]>tKCJ8`~rUvQ]Y٬765*뜓{<Ң0  +e !$sq;tkȌXk%aˍQvAI/&?'?qט>~%CT_W*%\&,m[/lÔso"-#Y>FF]@)xA؍5Tz/hlϿ9"KL ;$hoj?#v\=0<0ec+?nVރIl7nqhm6g?׻*1|+mkFM +I^!z:j{3ѱpƺ:/V\6zT?€Ӝ//eLCg ԥ'2 W#{5Ɨew\(m_%I!1b04y9"26<"Vŵb}pV"Dq-S .߮:cۈL<=~!'8R;TZJNo%UG G[#rKyf׬  ˢ`ڃ`)iRFXCMȢ6@wCWqC,#hiюLKYE@KnZh)91ҵ(dzʸ:fU&9 r*2bg>h~Mtaɠ)\Ky@9`E*05&Jj2p +#iM-i8 +2)%2mBMCƆJ^m~D@~ $4=J$ b2 !n x!f>21a_=[易G<0ZB?~V>^ OFL |睥>ýB[5T^=G\MUMzmdҦ||ք΃ʔgx`յlNc,{80':9 N٘Nk޸8nYP]\`EjCus| 1G)x*wA=pX7`>߰ )>p}gUDE2$k߬!MD +pV!~%kڴ6(ސ(>£Ms +*i %x?c_C Q2XwK=ɀ}k/1maRoD3 +b4٢$E#IJ2O۫5rW~4,;&2ZV(]VpGZ +ۛsr'yEvLtl-=5хfqjsu0(Z(;-arYCrײDNdc^|L<u_yxn[KAxG9 ǡg\ָvfk̼r[ .chJ`|( mg*tI?}CM:$tzI]{vZ\`7-*λaݯ?٥ISK9!i*Z CE4aUylcz|GQ){o7,n=8a4jÏvU%L 0שXDzK)FBi[=eP=F%kB=kǨ:e24Xƅ T?9*78 9KG 0.uW'`H&յ?9 ϕ]}/qNk#ryar(|^ə[Cꊖ3z-ܿKW:E;EV-i&#+?H=q +(ϓR|rpԌu 4*i6~\8mcw/Z»ԗnr]+:qDHSAy0f( +kQ&ל g @fWٻ2ke-(s|c *>`Kў6P{ 'ǛhtxIFӇˀaplg##Ę8=uAXr/ڸS`&{:7@v Qt!%(u-qs~M0Igsٟ<sz58ϼք܉~Tr߅$L]XG1\՛! hpOb*]o7b[%M:IXڊZ++|v,=[F2 1lzP j2@bYC_‡s `߳Ab'L9'iM\n[elQɗN TҺ}d!bŹ1-d vW(.(.S:J](sbtՅS^sFQ#V$#A/8dA'˫瀄˖cC.ӳ x$/'ewUs̫>;]L.uŢE*f.CUDM?fZ^\\jI8 )",SdB{T@Ǣ +L5oE:)2:+h+ԽxG^tHUڎэG5UΞlJ aſֽJIY/5:$E\.S/L?p4u>NĈƱ'+cǖ ZO<⤝VX +jlxRH}%V-Zt^^2o7/F!?k㤩rsZnz?9 }掔:c{$/B%?{Q;r 敂 ^:N/kaH8r79`;9 KXUXb|/ބYǏq,I!&a< O]\F$c0:B"HA&) u)nҴ)~@՝wvdS峧ru{Ns=L£-N"ΐȮǢ[bRJmMQ ECTDz"XrA_ }?6gN$!/HU:< ]!{|g'B + J~g#?|Rf-`pEiKd;UjZoUvz(冈W(({C-T+ Vn{S,bB +lSR5CEkoRc\WväS{̟t^Ir3L qi;,1Lxk 37nI +yW#ew/̯i f%OXJ]إ8VP`!>_">T+!y=?DJL{`4xk wq/ + Ҥڙ<;0t+a/#}q{Ww-Kdž + pk]ԜćO_ BP{v,nݤ( d剚r\Z30W2XF1zVNdqmƞZ#*bo:xhGj ΔTu "TI a|hZKy4|E K\ήzYl7BqJC81 }Y;$ ż]a;W_;Zb3т2o{*-2hI`ÒEkH5iDS+Y&QB-ґ:za +^<|OES< 9^'^6Њ g%Xˮ 7|+$"eK[OhSY iiI _ɡ*^;,.BWtQ$ӑ7^@_*}z@koˢ]uD+It4_ ' +$@"a)֙]x" 4;>nSNYG)IwcZt79 VqzdK R)]~%rEl j?xvxJL&^d̛@ks u|#⌢hC -|a w؅jB_o +Wi}c>6Uc/ й;eMA}|H3_k|kɯ/grb]Ï)?>gS"IKL~ϲ> C8 V+vscA('.F=p|p;> s޲~ja|g؝%v~Ƅot;iDHNvF gqo㌆8jQd-~JCe-ɢԑTM7r>Ą.Z$H*F +cߘT1ҋ+Fn$& wo8#@NrͰV$$9?_F +e! iz}%n>V7 'L '+.Θ?(4CuEi|wJo=ڊ9}CjǍ ZMbHi>ɋ׶z㳵^;⣥\p꣤ b1Q*aM) ĚJĊ~}N՞Bv_—Cq^BPhƤĉ:qx`6ӥP;aM]V6iLѢnZ dtziY'"dװN.XN ) h jsB]#iTSrfi/ORDYcgmdc5r6p&uAv>((fQYW2uI.Ai+o%Z@΃Yr1Bo~csD8xxME#3I0B5!V"Y@H5Mp+!Y)F/#s&#=}Fds[-~f*{z-ӗ́ͬ~U,@F{E3{<0/fao3JCdvpmZ 5E~ZQ~1>mt:ij4n|@:ŷ(S.DL*'xs-W끄W$Vʭ)?OqB" k,VF +|伻04Qp '$Wf;P.}{¨Ur$$7I.D:{{ +c1*Zց}XꨑGAD :%3ufL>y4K3tm + e:ϣ!b.r6+ev[R{ 8C::)%#CןOBq$Y]|Q)`\!/qJ='<#{Ht׭c^^|WTzpUJgWa-GO.A \ +vz!@/ VHb]|l.c_FIsp3pЇ<$㜕z4p809uܾ񫤍(2\$Y2=2~."5L&IMMBE 1viz~ 6ISC.Ccuh1R&84%P)m^[]3sR>nQ:7PHv~r~&ң'}%:Ϻ@DhkeJlj)fSE6dg06ĺ+TT%QJWehEeࠣ ҉D)rEݾT-rΐRp9pz1{ +6$f.e邬y4^m\oUF?=t̃ij<{UGC )W߉h℣9|2ɲaP+QPFV[^Hn_W>cKT%0S|ZڀSg>+p\JųVUFHGu-/p8 +[MKB11yQ5?TbRub +rbj%)T?7gA$wpF +-U8,5XJciII*,WPk1EemY\帳~ԟTو( M%E7M-X y$q % $]몋ŝBJ$RQkmvM!k|G3k_""H EBʈ!6*F۠EwA+u3EΙg][$ԕJ::HbY"T:Y(-F8Z9Οx3NY" C,x&3 =+Ԉ["t0sDQ,kHq'TB;c8g)E {d֓!£,#M`^GS6ra&S!2%a0omo3w |[7Qs[2V '# +֠ǰYiI- 6Sټގ̪ArG]k+^e5@=>CM[6R0:2eϒ&Š5 鳦}O- [G.W$\+C-_ +bO{&3?H ~Sj|b5fril=*u7rP>x:r?Iʥ_.e1hP {FBC,{7Lj|WiH,j1t #9&6a~S=!^եhj&m.3OE@U7:ݸ59?rx/ze2Y\(H 1VmiѪ:\2:Mc4f$d(q/U:ig35 +QمH3Hqw dRm4ҖJ>Ʃ%;s -Iz\t`^BwP0)xPgjBoC~Cc8p,=`:E Юwܬv?q< +*-g[ʤ݂JqF(+6%S LHD{^HeQ'u ?xI܊ϏuÈc˱h:zaYݍ&FBxp( =<9lˍYZxQ #/2p?SLe(t/]Q{PC}uQr3.?YVR)%r*6(=L:z*i.d<ޱMq$Ԥ2P@ST +N)=  FGV-l-6O9^g4(b8]sf 4~~T˼d[ X{v(TKYHr?\즹'@BS(X@v”>>Ք+\&z\l϶O3q] =,l16"spˢoq8`a氩?CVn\VqapJIc&E㏉,%ec Ef8bG_^cjnO ;AzpGJ/r4˻g6sG=(. 2YD@'8W_ DQ_UpoթBJJ#dB-m6D@>Hh4w&}5Z!<)YS0IzSrFFr-pE,4e9cnhLd=dG8?WY4.jD9' oE~IOJA޾}/,T^i+>ȅG^`U _de@2ӮWIkkABCkXbr|M+(!tCd+>;Dm۳] N^\w]]SH05|+2,漪oW ?-Ϗq[h^@=AL4^\^dcEVӇcUS#&}δ60PuIV^\mB!DJe@FP+i$smcOz |^ΰU3V}NZ#$/^%topVV̞@ovڟ'^r#j&)Z/=Xy잍48PJr8mEy? ө}SŨ:͐J% +c$B !o>duN,˸쿡+[,ƪn1s9OeQi]2~q1{Tʥ(J60,:z~IY$![ydPmeV ,`&eU0=N߆/7X^GϭB*/, Łbvα4= +ux\k7(oa|x~;Xܢc%ܡ9?;N8}-YVkS5x, /SV4D;9A\-0;kvqpt ͰK򿲭s#C,>G[ɂ:Tg'SG w;_7*%$%iL?V^L5ʇj5=ҧiSt}@>ܑKu}04.M(nK[s|M-N;03\VښRbc98gd nfu==9TȵsvWr@nw^Wa|/:&qfg1M'84DM`n_j?e2kim"/)<릈CX`1g N'mH \rn/8xfM^͕NUZ_P.{ !I@ִmR05< ]}A9\>/DS+'<-F=ͦKNJkM^;W2T A\͢in~!l81?L +764/)Q\p[~?H90tq6əG5̐0G~Y|gT9#|Dz 4z&| B)idshxKDtfjݿ>&xz^ Mwe$E)6><h*YIG{0Q"-Ed?>Gʾ9>˒b[}xDN 4! n.}+ +UC2ńߖrOnP}$tz{4w>f%];qRz]+Ү,?W{ebsR՛Sh{З(@];+xo~^O^yBqknlLfS$X;u\%ҺvBagatb5FV1¿pnMx$9ar9yW`?DF<HoTv,;uB=28E;gHReBbYhsq5uSl_›J乡׊`_+p7R[8ܢIFՀ<^C~-0j^2SmՓ3 %Bo/49U#BZ$B> Kt:HS[dgPff]_baAec+P?`r̽4l, $z$G_0% (Ho;⾌BvŹnJ&[EN^Z/D?] 5r|Q&.G3]-8_+Ү,?WxH@W 32n_@3 +a)T[}}+y6{ ,'P6{r֞l_Gc,{r.xiO>ɘp+67+VOwVoBh%+y2~^<493yBd?SEbz[W'Cq(J߄|:'OTf,*Pp{]s؋샍Y)axaI2}YM8!͏ptB_ +Ք-23{}B}DsX~f5\cķ~:v=6yod0. 80 %\LI0&:i1|9[VlP㉍ۀEj̉jq %T 3w3`hvNvwm3-&Qk!It|z +U:h1*kK^z|p_(Vd$$Y Ÿ5J ++5 qhu5+_R3 +R7<zݟIƩLQ2b%Y͵`z{p~ ϺN~g1kc;bHcEJwy eDʁ.*8[34Y+,vymoa~m m?X;aeed*[䆇[v~S)wZy"eӊvJ-u {K?;m)ncq +!X{Έ*q|Bo +8!jA:lHzy*KD-b&8gځ=×Xаt󟔳ÂRͱعZr 7X@uZ=0+*ȣMОWJ13↷osUWC Wcڙ-ؓٳ`T){PIL+1op4GM`6pkfwZcwp'ЋK .@ž"U$ڧ 'vAZ^r24 $Ga}ycG0X_m|@z 1#Ȥt]-X4L+y qI<1[1-J359'xa\shhh1gcR3co)YQtNpVvA9m}]27f\ ,eΐi^^z^'=ɪ(еStSQF2] +)b˨sҐ)KY[8?H)ORJqI]$g՗p {fQ-b2 Jo ](a8F"~:XBs-]:}*<ђ=?žgzl j"sZeE\Z?/#煲|Ia+^;p9Rb1r$u&Qm6g?)`njXqK|=$+31P8=A{Pf M~~=NŽ:3JSI|QXcaccwwsP# mcGtWBZϘ_j`D ;P"A4!?^3Qq{D$c#@X|qkь" Hq%o8®]^R{[;+ɫ_JC!Wx}| o|)cp]S|NjG8!XUVSimMB~@~ ~ΡM[u llhEogXdo9OzSk-:0 m.1‡+g;9mypz!։U"5\Ao9s68BS^R3C"2qy^u [+g_7!Z'Wea^1y H #tsL*DQƵ9@A~ ]wn+N$h*\ǢԷ'ɀ:%{MTvMW/h2(oGi$5x&GQvYӈ~ ^YXY۝snm#( Isx71=nڣ"7N K${']X/r07Q<&/uX4=7r}_2ܚ2/؉%)/wzJ +αqHrӛ8P(_+-'-;;dW8J+8aZĹ8p.znђ՛!Ʀ+.)<KNzYJ3 +0:M([/a 4lH^b^l]`UKkNl{7)6oɜxЧ=W]|ِm9ESCPVftƴ~_"MTf~zo5YPj+֟HۘrurgR8 ,E%88?K+ `=fI[ctX=3+ޕf +Ū)J S  +j>NJeO<*Fa2P~*ls+ACS,`^NUQ.PgR| #a:'{ P'̙J`Vl/FEX20R"6$)a-:?zBWѵuim'#-9ž+7&wOʁtߢqd vHϕ *< 0uJid/Y\!Z5VWGɍYD_,fOQ݅,K&\vP 34KG0) +uJ}.wNc]>Z3f3i5h5iuj/c X@ T5 +z Z-jB"F/:U}B +KȆ1tuJqى>u} uD@c #[ 9S HCYuCxcz{;tHKxU̷^UorYt`!Tx!䈎-(aQJZbmEw]x8y|5zB.Ǭ]""İTcmCsB}z;+Ѽ9l'Kq G^TZv['q"I8|0=Nͦi9I pst.N:hꮪ"5RC`<˂mϞ>ۭ]Be`6X1&H+_!ܬRײzxFf:RffЍ[|t,1픋Lo[1?HC7$)M=0{-l)0ҞJ|B I cpEoR Ѵ$ɼ91ΐ\WY8 oR[ c=iM{)E}2dZIDCpkVؚ}pkjkO۱ݹMLqd.YpHĨg$1m-.?)*i1sm :P% ZACȪ0h7}Fr^y1C'o.v ɴ&%LE9V("~N=cYBAHrXydD:{-G?Gy:.Ϡ4f:腺Q]ch[ |v(+r@=I9Ąu@}0y˦C߂B~Pff&(u0̽Xm'<!?5 ~^z' P@w駶Q1:LL`|gp/CTanT%%Զ2IWP Kd S 7grMy#r5L3JFJ0Y2я4%k}Q<&-MŒaH +Qx.D p> HTt'.Y]'*wgE B;aUjф ٥t&]wzzլL15?=.3ߛ}3@=>3PpZVclT&̖0 $*{Bҡ٪ -M{THm Ņ7TD,h ,bqƌϋ6X&k +tF{{EXp^C9+LG)ˇs*(y%:qHʯ~;LgePhA4\cY@vJټ]ammMpǜRE..OeE3/M!,6WƁSSiT[y-6l@ϲK)y[h@"8'k *ⴏI& " %5gCHiݵ({ۧ]>c4}\ Icb@ G AQ7V$ 1YWHnxO_VL/\!sem3(ڪ J!owI;N"t_G# :$KǚqmoCƵK֒`]柢Hry,{[e՟Ψڿw*[p2A.7  zT9m`>[IQg `gqu܍Ѵ$9$=4Eʗ`@vO|TPP[l|+|a$ +/A4wV/fye\}d)<L>߃Ȗa:3yGf"%kk .9$.u?<+8jsw6mRI[`ƣfvjXY7, v!]ݕh@9a=f9x^Bg"z]J94[,ӶNsֱ] + ͖,2O YÜĨriQ.JGƧܛ,%%)J:B`0Xa.Q{qZ5ɭMCL1Dj g!W?8Z"(moSAq,o~VJXcHУ}-9ǯ=!ܑp|B{X0*t6fWr6ҥZL$O#5kP(`a*su[VPR2`u:컓>3_ڈb;4Y U4 +z~􎷗Ч|H~a;2IFtT΢ocޞBYā2ޖ͛ң&5YZINIF "w2,&(Ay$TJΠ*-:7(kh5;|;ng +Ot?hM i4ӑ-/jB)S&sEyK˨c?Q"mvLEK*-^{!&BV$\;tpbPfOlh\^C.hUSUghKWr;w 7Ta~B-o骛L4)(4'x(zr! xD X-5-=Q+?9|n W^*rv6@{bcy穋5yI@/ YiCt?6Np4\::)28GH'тܻ+fBݜôcsn'Ga }$j 7'QXHk j 4:[Χ_PjU>'#n7;@\-Ԣ$2X]#B $2qP:UilTS$&jGjᢳQ܊G@ivh^rM9i#q3KBG1ڽ,;_Y&ctٲL g-o}Lv9vt<Ϡf9 =odUN`-æt||mmE J>5abZ_mbNKA/zՎ)o^ W1ϮP]VT^a"z-oy7 ˊj_l7M&M&Q.N ^Ӵo_M;@ /]R~7B8QW}/߆/&%/7.LixXL䦺MN`&p`{`5W4!)#M O!aAt~6bA#3!%U 2&m +buGAO[,4;+h9xl*6t_J pѴWlA1MP)G/R,]ID܃~yF4 1T^2npJ2{?B5Y߿,8 g]e|_oXOYЇDa1 +.2ZA"6pv ',}ぴ*h1 `VčmK&w9g6_K&fjɺ7CY3SpgfƙcAA葈Z^5Dmk~~o R~^+'H{Bco~c5GT&,芌Y[zRRjpj/ :tF £VBHfS Lf0eUA]2۾;e|KUXemC}=L{ńWYei +%;ٸI +aU1м" _UA~/#vUmzdb$B~%yrH"-tXEsھ妈&@Yg6ODX?L& qʕZEѤĀ*v\׺Sm#h. ڽ є?o{}ֺH5QW}X11v]=>9_OZR6Z͈lº +lD+Ƿ4iB^f0)+;/O!M1 @"Ϗ2HaLڕ@zk\7Oؗ6l_年ua4DTl̟qSxrhI@vP1}!!VHCep|rteoԃ*jSv๩TFƶ777gPmߔiΩx:3҅~to0Yܓ,=[@h{{/(~#W/\Dˍ2T WR#`rG_)W哠gҚ v:YwuLߗ u2<7D06K `"u7yF)ķ L&B/KaN4+3 +^vqpt Ͱ׹i\v━̐+6QB04l-fLڡT7*Ij767{^QLK(/qj~ĝ }Bu,0pp˫ӌjUPu?4!f#x0SM1~~sqoErIr[0&ŜJh+@%ȩ)N9D-?jD4|!^ ҫ#r5x`Ihy9Zh<\{'V gA;ݭJiز)i8Aj3Alcdo~>~0ŃQ@mə=l;5\-hJs@8 nE{Phܩ'q"Jp~ZM$7T@:Z[QM4ЉXɁoʾ]N߾h[t9T1#Е^Uֿ5 =jt1uPa"7Yү:˸i_\TV쎑P;hDžԧ"Wӷ7B.rE2;G +<ǜZ1ܢE{M=_tɮH)ǛNXhybCD\]84Ռbd&*$2OBY`~ RvQ)9?4$GLωFUA\ebs->wWvo.ܤr!RNp L{KTot3Ubi;%%NSƔf5;CiГ+q%c'3 9#`n$|&:%nBIpw]V egMd.&bU0u6BB +L'n w7"ak)-EL">}c +ޗ3I=sն狝 A*uDoytPVyX~|mJ +64&%o^Q`!~e6M- +'*&%KJ/ݴy p䐊[_!,a1'M]GcC=pq|F[d JiKO*Q%>%/QdY; +bgr<6/UڡB7]2@ߜ2E#m!$.&E7Jq9ZvRS?bZΒ29wg:>ُڦb $6=2*;?G,wnaX&7N aU6L+Ò,`yOzVf( 1B!!a^uSU`Ƞr@[ $TPq41\(V#*!A5V[7jhCu )="z2"sC z?>V:d̿/w|tT6iWgRmr(.3A@ZP{U=5ak'1@9SF{[!}fcxx+.Z!"%h,'B E'1v )c;{StYrF^r=Dnᆉ~İc,^indk]>Ug}8(0αKZ[hZ6;1xS(T،]9;6oAhR!ƒF/iv'#r ?2Ϩg\A(Y5(z.HCC\Ej.2> Hv' +\n"jRPͩ|վQg_FLLX=:|*O00PƑPv(6|Ž̶7AMȃV4qԒ!z JZf:crHW=_Z)Oaytvwũ]#eeWq)QZ'v +>=~ Ub%_ltxpzdM_o/&(|VmV#mIgfy#AK*CmaN7{ #-Dz=^٧Za`&tӘ?r(հr)7\@ Ssy^&Z:XL |oS71AZ"mOsr2G6[WXu"vt̯x;QR%cxln5] +?:Z4߃Y= +Z6ޟ)J!2$A|8ȴtrauyd#u ?T{NP0YT9 DYNhg1\M=7@} s.&jbd$ƇFԟI@%5gۦ@Xp+"禲EḒVB_,Uphڇ 4$dhX>/# c$4@Ir eA>03ڏ\>cKeluws+>w˙=2%E JJ<ֵF3jL[qSq_{N‰jɠlN!qCy@ԥ׵VniTclص9W cha(jV9SpRa +?J  NS# [ֻZ[S[sC=!R[%tv`f{v+2Ϡ?/nUNd>wS.,~B u (;?45%d;UU6=C ng}0΢}H@/}@$hr)}$ejň&`2YwSE_3IT7^qgAirdّb{1^{ͦ+MgRbw5z(' 䞎`:LACx\Z)`hYӖr =éH;؊$cxؐ,% O\If g/)>JiAG8Dtӹ#LqJ`@dt{yci t{FY +xp/= |Vj&y5!,HE-US^Yr[fZE2rSWjd91x$ΜO[X!ɃR[Jp. +lIBO]305*^-bPx spW3Mkxޫ󞑈ym>^ZQA1=#t( 1z~1 ++ +HkN*"gR5'b$5=`{ %~jIHgF&y4r5CbHhS1AthT8!cGa.0?٧eXq7vۂ PǘGҸ!ƭ(X2 |{]#>rT7Dd6ڧu(a}.r (Ӯ;bPdQ SPe2[Nf*^6A(RCXܡ#֮#|~*STLV@^Y=e1_kqw2 ;);S}B"",@ +/&1Kg !1gOnAyP.^6|Qӑ i <7ڌ'AV>"f9#Z9o*t=aʚTRS'qvyлf"ټ}׵_Es>{4+&q@ )~;Z%Q׭e?Z}XT Aq#|~Ҿ]"tw46 tN@? 㘊q*!0K9"Ę:S\f]"ffpxw~M S/e5ܲY*t +!?0S(4Nz(u.R I۬Ҹ18<0p#zT H\Ot\Y":Ak<12 #| v}.734m*GU*k8Zl$cLQ[MJ/.A_x*z- 6ag/&mV|bݯ C<;y[T&Kg>ъ_l[dm_ =1Y]7<*@FKOEo)mjPK ?o%| .y;^\q*&+e/ { +Ld>U>VߵVdJ6\M_jA$V)G$B,S(颵zLVA;vcVh]!eu}{1AĐJܞ.⇾ÚeU<"ɥv46 .r2Je~,_5\MWIF+*auul\`}pb=-%$¥Rȇ JI_Wq&;ABNm3OrvZgXS2zsn'5aP MR EoWy(׭ l- +c7cc;0D=dnK{Vݵ?B8^$L9O=]ͲgW+E)Oå(W(7VCSM=8f)"8q E3l 𿉉klq3%:h&?T:(]/SJ4|P:\~f̂YFeC@_HÁ'uYk4V1<9bYk6 [X0ul}'M@AeWoB D4`[܆_yk< z2Ɩ ^4D˕ijN@wh 6*tX549? `^%wAcJp-ữ+qE˱ytȁD, Xp\Yّ$0RG46")N脹 xmUTY)iy + C(:{,H+o1VԖA/Zd^-?IO4"+0J*u>;?JƫuTbV$cC̯$ρ3qKR(VP\ڤj0;/Va#Cl=G8aaͬ\'Uca-ȇgPXtʜWY' +2*L6`Ƶa"l'z@.O2p~>]F#ni(JuGXN@heT V'$~!|t$,I3Pt|ʚ9$wB B=vAk/eQOS[_oվ ʋ{7M3Q֝9_zkf!Fg"P. [[Ry3IqBk[svduv<  +E(Lޯ9LC +& +S5f&w6 +&psfK8㋂CLdbz夞iJCY"#c:r)ul.Jl"9f#oQkVYNJVZqV:J lT*\:RW+sæ#b۾.#jkvS^8=_l7o8۝2AR$B }oFϩ0ed9PG{3/DŭF./[!69c:=pw+: KN=?C2x`ad?aCz^$fΘTS9鱪"g].åoaUplbb(④.cb'?,VqCX R%x'Yr'v0j7Ž(¦˯*Y3SG{#yv!c@ VE*#s/i`NBU"Os/~SێȻ,M%EY +؆;תnk`X*z2G7{gyXTb{I2dYMēi.blf ޤ1<+lop>y-LF.Q^th9>ėf S%!Ĺᠨ4p_fpiO!h2F_vvz>mNד۽a%a$[5Up*cLo {jɒ纉7eF(3HxbTY' KJNOW2¥g2{5\F-gfh+qy+8㜥wؖTa#ӿ.ܸ&OsAto +V?W/Pbk[(CJʭ|pT4OØg8 K[<!>RᦕКX$:-+-^2.p+[>?HO ;n'e!/v4٪̼K'fV@J3 cߜ)ƨEDnݒG&)omV?fUziԠkkRһǴٴ#+A̵]Zi@P~|G;#Ԉ$1]@iM=YМtuKv +W]Ұ2PS[ )BկDsRV*pm?J4S+!:WKǠEҜP&Z4eJS[ 3J! Ƹ@ԬXn \\j h*y }@5@5p+/)DjjUP] ܀uդO#}Bjvsܾ쳫 :q{va Xz.h7R~ +[jwei`3v\TV/~rDͣ {=eJk)3 sM)VȰ}WMfj!pa`'w)/oVŜefo9}sfGt&.`^=O C!|~лqhXx!r &q}x +D-ք"4ن̎U0= &K-P:.G5Q23qZ,l5C%Qr~k#d󽇐}zcJرT7k4]Uw:6mQMEНo_(1yJ[E⤎l,D'xhv5&'* ݦ? +c+2:\dfؗ; {_,G&!8wx)qvEvac" )涿Iۏوؚw-8!1]7dG #Ƃ6y4\<A3և4mjD)qr'>>թH=ѩS1Aw@%Iw0#y/7ݑAr>KJ|=ӾN/T'pߎyS9BJŲ8I"V *ߋ޳C zX?K 8KGAD0>$~fL10`KwC2x}ygkR/";T55*,!֛t)I _c=$F)iiz0`>P-j>sa sn~bJR]M9d3g<P#͡&% W.- f`}f~P G3cj@xҁB !׭L!رD挑VXl*:ek)ֱp#@Fn"*u DQXfDx)BIjVG8a_jt!61-p@=Nۣ)*G;@&ܠg$uti'@{7IDB} gM|Z4) _ T&"]74H*vYm[F=Xt^ټb@,;Az +!k ³=!"66X I _5]}/< +E"k!oIKWō`Vb +>K\Ű!_9ni& {5JGvs֢-w2ko}֕IH}05>΀PN hks #2d_$& ;lZ鬋3@rس7܊޴OZI bKlF&s61}. PZX0w$FUWH˯&TWڐu`i 0:냼-[sǚ%0ZRW\T"s8:5  !='-0'6h x4[%V;ɶnnʄz}ـ) ~6NMӋ#-)T}+ĜEy&*"+!dlDUI'c/.O@Ib$ \nw$'/W=nv׵a٨~&)?e9z&1c7l35PfKTU5Dr n|m69KʭW^% -S'2jW-25.z5ق@ʿ$7XT[eL[|P|mni;[TϪoIV_P%ȩi9Z[؅zn9g+oXOR 8!RYb!`VIk +(ap`bfo.nWwk{~ڜpLho/, K. e`A ;|aWա˃m^]pF ݻC!6P`e$B<)zW -[-Q U!*K-3Y?f8T s4w&6hF.h¯Î"䣻29Ig]Y:م+:8 2oO+zqU8j`a3OrS{ ;<ʏH+z*د;kW9ڏ ]wS&7L:U]&1SХѻoau5ysiZxufQ8nZ] ا[iZa+^/A8q(%4QBg(7B炈7~y=hn0"A.^Zկ6]Z;xO0n"3G4g'bࡌ@bMcPP\~V`\#pK > D*bXɩxw?)CfxCԟ 6[ؔ^gI|r%sZVlpςg2H 0@hNt;+K@'tYx PEW7xc봑WA]BFsڿ8yj~S9Դ"أsQWebVyFVt +k4_|UX2lzD ff"5|ğˢ!Iٻ&)Acqva 64a/,3!PX_KͿwPUaA~s慞/ Yrð5-RFg`ϴkc0/5,2?@G5dlu]tsZv3nq9臠fЯPY!*HP%p%3CtМnT%?*x|5(ȮEI@ ~Џ~t`|,(t ,8(0ts,![ +zc};Y-CVe)3 +}ʗPԞ~leBw_pc5N; 鱺Fʤ<(`g{ jr$07l p3ml?Ր=!׼?G+[i2j2c. n-~ȱ_w>ɽwWR3>@U@ͭOܼpQyzzFXb*fyJ#_DgI0p^ZcriL Ќ5ai9 o^+B8:Q߷Pnzp&BБD(0L\lZDPhb$erkz/ Zꧼ$žhaD FZGXI}a>k_RFdtU`0af llZ7\v-mW7|"pM楩)f !AĮT'u_ʰF?T\Yx9e?`LyΡ.]>ToTfd"jW%}K4t-)=\$AMiRNti fuh}|u$._@ +K6YӘ~@9~' A7YΠnW!dugoedtHs(LΡ"r-@]ŷ 7 %XE#=FWo8'O?35$fFNz4H:ė rխzr %!򓮏W<ʽ}Yf8S>V 9eJ8zT4ˀ(@u{>dײ|=:_A`z<JZ糅kzs6*)`TV` w(7O} Z#?|yX,; y6 "EfV2GU q#/Ħjo; >|AH#/sYtW*0F-"U1q$qk7mo0LۃM \fc/yO҇[ 1X(kve;Ƌd|Y + +DRMhj5DL\U>ͻ%!Z̚s? |ВWI]Kr$<̠0U܆fp|Cx.1ؤ/Ϧf>jH5bexnzv(9mR"=XѻN ̄[k!TW3"pkp)IiT_-NWN*l,읾n}3aN~or~ Wi׫ν8t/ /#iq9bu: $aZ%G,ͦBOF -do ̮%+~3UoEKT +jg#m k2+@O0dzg|s:0Я͌f1šI^E$ +=k-j'ɢwnhk%* Z?E)t9TZ ls[Z{ꕱjGʚ"+ 买!SFYR M4uqBKOJW5Y5ؔ4#comԣr{^U@:|$?@Nc|CrݞPDyrf__3&9[5z===KD@՞xuk%ʔ\,,=4{?E%t}^u<6G{9AX /7L>kNkx7@&]3V!G W|dΰEX&bT? 72-*\:HpDQOIBNhϣ&o"#mv> +6w4X"{r$(5pGQ3h,o!Fafg娵*"bRmf.w!tَU#c긿PȂ\* 90 @y')3Z{8|TV`@춂Q[]gwĀޞvѳĔKu[HX|W ģK˒e?.R&+3>DsJ=e`%-;qf P&3"6iD|CV98]najWs!=jfmu L&*Cq|ĜҹA_CgHYi//d}]Y+- Ek$T3_8 :P&C~[eޔ /G|6ts2Tu_*);E9=1[*sjqJir~WTS>96ї0q{ ~ZZatFk11BwK!Ery%4u-;1l7GdYeBNT-{~ﲕPVO浘](OV]U<63t0>Wn[l\l2GB1LnڥhmjS-ObV35ϧBG. -52 [i!SF\uGSdV:ߖjXwb<(qVbPwkLYӽ}0R-ZgqGC =0,1$`;&8Qٳ\VФeiP /¥Ѵ3zO[L΂\kOZ[WalkAv |t +#5c[tLU%wUHCBCŇj]tfipiu4ɩsK`jp{DD@3 ߟH!S6)$+#^ D;aHP~j]xDЛG;ϒy( ;cTjoÛ&qi7>蓨1<>BqkhLִ uʝ4މZgžiTEG׿@17>iAD*yda_\AH06y2w@X-Tv> vZY_I9%p)"LE* )NQo=!)4x[뮻GG=Uzk l|~ז>C` +Z6CO!KE˖W/ )#Z/d>~.^COSQkhdxm2.%77˚FyM9tnf;դ\X[ߠR<П8K#-qN7R},C$m>H{^/b7+-JaJ.1-q{h}| q|$yvqոY,]e#-nRD:C{Cda54nuUQ~R##}z]-Vu)I 375RDXK6TmAD8NO#Q+,<`Μg{pw;Ȑõ =W,D|\i7MparO&+QcT9V9X.1c^5JѢõf_ ).Ht7+Dkeyj]2l_Jw]@y!wPʧN>;D`8l>T@s~w# +RrC`Dq~RAf |VUz[kDY +%~7r+Wuq޾eovJ W: "F3pd5{DDy+a[@x ۵?q!a |K|SdTg@pT @M+$6DHb?WdžMVߘ˥GR:$)##](|A9P!k98%@dgSoZS{(_O=A\ +*s3 nw㛉ͻґt}+B5 +czabQa иD"#aj r%<_UMhN>/v8JSg)mQ +$ qe1QvfF9434x[Nߟ kvxJ+W8lqj HNBh`O + +l(AW WY>?mBZWJ,^SD@grRy99{Vբm瞴ۭ"xWA\,nwlkNtw"m F!ruy%%4>{0%guw IDo_kr7=NQ8ݯ# ("Z=~%U<͹[&E jmy:dACLo>ɹ\̞;ShSL` '>7` A-Su$je^ aXB;#ZPb0L=w"h/d~?74`1W";Aj9,3~OZSzH?EmꓚCݎ?U}_hDq;9W8Sj40t; {!I2K*_g=>"Ji"kR1Ó7>Aݜ㎡9Ր|̌ '&~-sR FkqŰ;dp@!<`t"gGB!>”5D`Vm[қ2sWQS@*}=Df3%wpYf'U~lzHK3_JfwahdW1R}n &z*p)4xLehdw}h%XmXƏRR̵wÃӠtO _M;J-G7Xa?e %ErV`h"4IՖ񿫒I)6\OU8H`:4dĐ:}#\\n%+n`!Aҿ$ވc2pSF›7f:KpWд̚v`L=C|t*4KC jE +ҞH#h`1D1 2DTP>bҪe=J{ 8 F yBIv̵O"OAi2󘰄{T|:g^1zY&|8N977>Y>sb]U>nhH ^ߏSl+"yq MLCaN@J:hG}]Hۓ'i + +=NVG@WqbGr;GBMf)MYNT(Aߖ3PT.ˎt=^kzb.ok\CoBCċN$jl$@["v)ɢ'Iy2œیG1m j"@1J7W@^E^C~QķoK ;03!KRx8SMM$O%P9V0V>&.ڄוjTWae ؛#V|dd#n Ep9R>Byq H,9l vnF|hcmY鸄⎔5a{:* !C8:wGAs(O] {ia 9Fd3eVp y(*?lw|F'J?k hwAH4*68,4U2\i}:ڇ0AuТWOkzˣbAҰ,5;fB"_he0u;DDqGR^\1hwEw1uc߯mqg >2~vg5o7Ǻ7i<]uX]vW-bcPL<$WrԼk, ѥ +oKl~m8G|)nd36MYy{x +-m{ ͋@ucP'ϦzO)b/)Q0$[IYWANv%D!L'=Bq`ɀ/449|j%Y7TduvnÕNx{X_{W$V67XR;! $aUSގQGCydG ?y?档͹pfY+TfB| +y9F-90D7gSmphk.έu'̩fHxSʤ\ͅb/ltnzҍ^~|SU5D%1j8*'Ƒd3K8eµţ mwy+hh U$o^%4yx5qt׊ )R2-,-qTGBATai@ۀny#@F/>Vɍmtko St#n[󦒝]ڈ%gكB.o¢T1 V%춘,GP]S&+M3@[NsjZuT光Һ-c0MJ\OEQ_j / +  f2>ɣ2?ߜje7fcHढ.^ýTM pA54Z)ڍj8ID M@IhDgk2$˴_D{9QMmd F+<2#!Y.F?\";GAZjq"y>6/KWȇx5g)͜'rҧȂW"j,M{8QA +dWQ ;3CGbFH)Rmclg2Nm~~M||&Sb81'㣟Or|^}/W\2dт&6?/@p4/aKhUf~Pȗٟ b5i6 ƻZQ5D`'Х:#"+8|H>XH Ӊywgޅf%t#)5m&?wbM[hnZ!\~ZqW, d@89aE,ђwa_qc dWBuӟ[[/egԕbѮXE~ dQV@J].GtDk']'5O˟NtٰFDBN.f8GaY h~sM*l0!17?\fiwCn{$4~jrڴw#D[h2z +Tf p6]>66]@JޒTaR1l'ǹ̋$M1+,@y#jkNYܸS6 "4))MZ5>akD3!OɖbrŶtp~ ؀hPj| +Dn"(橴ɝrMȁcw\K''d1ш7ƶ"b?Qm^Xxz?)vw'd*%Øb9ɑ~kICj8u>jmC2}V?z&#JF ;;ھn /@^"*O.^cSLά,} Rkqů gUg՛&`nh?Q¸*{WXm/Bהe*b9,'$֗4\U ;Oe]`)_@3LҎh裡$ɼŁ 730c" jc}3CQA +Fʕ3%HMOLS/=|d#j{To,mŤ8@?M/F +\y ^ z07E$ J𬬕

΃ʚE +e2[epVny# X;Ayl$̣8&exFGZ9Mif ­ :S[:_ W\(,Y$됣4.f+N5 VnDld!~~n>[JPo_mCHOW` svyOҬY?.`,=Vm&PkVQAU]!*>=7Q':EJW?aVnтdhkVYB/vW^U S7"QVi 4[ęJ;=4@i^Ka^QJ0`--_ˡMCӰR<`&۷W]۩TETzU{MK) qI6 ,5,1F5> $b)3˓ZsNt}K$Vl~3Mz⯥=s.Td'&Rd_+/9{8(z~B؈\ot f??ʔHv.)+2#ckgФ&) >,c)y|cL3oScesk.FɍmOyo[z`!0vb$Nϴ7ߨ͡7A^(RM:V:.sQKD?BXhJhK,hY29rn_-dX@k(랓 kԏ;tT+94LS]a TE@, ʫVt/]KImtF{kU[3M4f篧rGܭkOט=?m|DXL +[H_f7` o6xrWMh/S.:Tkf`kꠥo^cq* 7p8K@ ]$)|m^ ^:C@XCFK"m$/S>د Bك$ Lbdz~ ٲa9_BdPImXaWqsn1#vX)Ac4:bb5iJSwViGy|]Z% 2Q1J&Lԓtg I0OQ!w#UbTOjEG&|;C%lQPvFD~QRda´ +WThpnߺcNCz?;?F]*&G+j0$ReGI vw]=085#/Fpdsjj-Oï_VZ>ŖݨuT-ܖ59SaDgAw<7F%^()ZĔEQ]W_UfҋzJ;ʐz@&[Tum9gfj= M0F=8#]kiZp%6%g~A^IM aBw*"ּ̈́6*⥈P{ ;Toa|We+B!{9;@ +MH('pA<2MɧQ4(iWnAwV5!&߄;F<:u`m\ۭ*)n#՜=%2;q?JBY+mx oet}Xl9-{#ToXhW=y *l@?-C4L&?U/^8hApJ'yS\enAw݊_uL3j11ng]GPWVt]iS`{^B'u81m @i`)[87HR<@hgUk\tNg}W`iҘrO{(ϳ8ŖBΨi&/8d +vaW6a9?(ٵC?e`]Yknp'~mX`4c̲?7rYF_5QS;{d?}v'ų[ S:nsi.ix|Gj]kh(H=Ϯ +zY&HP* hnkP }iH,V"F^Vwݞ<dO%^dn7C|GkLd/t9+QGrԇ-oiTw;;j}0#(0IF_7X_h s&̮݈¦z#w%IZLGS(y +Kݔ Bas;+2J ?R9xONK]njn%e-/ + =ҥa#}쵼`mִâodMKؘP>1˛+jO\}]v`xsۛa[\q>dSA%+mɸrnuEizU@tv"pP׸c쩗|(|nlYH$9 y>8YgU;qeKPBeVt JRP#&5rP`~ +a"Kwm%|\;8q.Ejh~  iIPD$PΩl]SYZNx㦉 I Jen:B?V6PgV8or5uDH +|Ɏe')F~cpRpx hG P",n:e.X-|KйmrjY{H566+G-58oCԴ/BVE<3& YIP6:8;V{~)SD5vw|fj۾-I:qDd(ASXjM!\wMMUݾ[U~ﳐqۚ.|t$#ǕQ +z~w6.Q(EWj:kJաjXa&Į6>'0jت8G lhNvuoF5dC="xQ(+VE)c\,+} &S~87(*)[v $A/5y-ݭ5pB-)Ad5]$=t`!U9pjbF.0E禓`zզdX¦uiU2qv @r%lGFD2N ?[T/}}Lm+Y*-v2 ( a1mXal~Z[BEg>x66CܕHvJԴZc=?;A9ȨX]CA^<[=D獘 /!a !d,a*DgBYwXoYR"[z!ĥVl=BV)Lg2?]QV8+&] \ ^>]UJʏ`Tu Jr1xi] c"2h}kGIHd_p0ƽiji"0QD]seR"wcigV`"V(LuӜߊPFT<%5iȺEе}RSE E|j+~NoikIY{ QcɈ>>OPbkF I<JH0KMvv\-zjo9/c9\H]+ϞP&K[1gO: >m#(n~aȇAv;3@z g5osHX~D TG: iYt~ Ur^8zo /朜od*=V}IYd@*ߏBQEYlO\۟s^;wuȑ *+:^]F ;w.ޝR@AO=2=+%vAYd=Vhwύunӧ^ȭ=-;h &#C Xx3-[z.2$kV\^(~Xv Mb|'Ǝ׫Ú׳)P5If 8I#+34l-hB4 d:>ԔuIFlDe|Tqg*j7F~6vէ_,P D b0_kb񙦳JU4Ԥ:7|3rN`HprR\+oq4+ҷDĺ[&*/2κI2Z# >VvFѐY?JhDgèpRkж3 \X>'ä>dFZ8O7~)%zݵ(yU_MXia]WcPeųqAP*MǺѤ fFw-4ă:0^y" m>n+z1]Pn+syuםG2 +/s]P#4?bX5aޯQOKF"ocӊuO; H[%P̯D4q'Лr)☬"ê7Z`q9i?SnkQhh1s3|v}S؏WӱPaWJYaÎ}霮f[YGp*MXqjLs5Ma뿁lb꛰bY5!ǦDt0EJOyO-͋`3@"hX.Oɒ-oq^٦?Ozuh]/}Ax/~:u+5rQS2Ң|c-qn3PȂlHLLBa2_fۄws,%44 9op)/C bGoռ} +c3PoKH~^tt&c%fCv6*^* +F5TN;Yq7O{7[&-yi0)5Ռ<]T)b^$(vŸ Blv[: +]n*Vk'$0I5(҃|y#IЩi ی(j*7_35| `Ezҭ[dx5v1n<4B:428fX `87A5q,Y#>)=`YdcJ顄wrqr ˮö3H +]r4 +I,^A4/./sVIDCDƈk^YXY۝snmn𲕈Ǫܿ/DYn0E(Z=0+*+oRE@?@„gZUTUי|ojij쮑~æػ+þ@Uj,A$V9,'&'kNA<;