From ae25dd5c640b7890aae1fc87651dd4a65d9bde95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Thu, 15 Aug 2024 14:53:56 -0700 Subject: [PATCH 1/2] Warn but continue if requested glyph PBF is unavailable --- CHANGELOG.md | 1 + src/style/load_glyph_range.test.ts | 73 ++++++++++++------ src/style/load_glyph_range.ts | 16 ++-- .../cjk/expected-mac.png | Bin .../cjk/expected-ubuntu.png | Bin .../cjk/expected-windows.png | Bin .../cjk/style.json | 0 .../missing/expected-mac.png | Bin 0 -> 16074 bytes .../missing/expected-ubuntu.png | Bin 0 -> 16074 bytes .../missing/expected-windows.png | Bin 0 -> 16074 bytes .../text-local-glyphs/missing/style.json | 43 +++++++++++ 11 files changed, 103 insertions(+), 30 deletions(-) rename test/integration/render/tests/{text-local-ideographs => text-local-glyphs}/cjk/expected-mac.png (100%) rename test/integration/render/tests/{text-local-ideographs => text-local-glyphs}/cjk/expected-ubuntu.png (100%) rename test/integration/render/tests/{text-local-ideographs => text-local-glyphs}/cjk/expected-windows.png (100%) rename test/integration/render/tests/{text-local-ideographs => text-local-glyphs}/cjk/style.json (100%) create mode 100644 test/integration/render/tests/text-local-glyphs/missing/expected-mac.png create mode 100644 test/integration/render/tests/text-local-glyphs/missing/expected-ubuntu.png create mode 100644 test/integration/render/tests/text-local-glyphs/missing/expected-windows.png create mode 100644 test/integration/render/tests/text-local-glyphs/missing/style.json diff --git a/CHANGELOG.md b/CHANGELOG.md index b3da31c264..84fa02adca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Fix 3D map freezing when camera is adjusted against map bounds. ([#4537](https://github.com/maplibre/maplibre-gl-js/issues/4537)) - Fix `getStyle()` to return a clone so the object cannot be internally changed ([#4488](https://github.com/maplibre/maplibre-gl-js/issues/4488)) - Prefer local glyph rendering for all CJKV characters, not just those in the CJK Unified Ideographs, Hiragana, Katakana, and Hangul Syllables blocks. ([#4560](https://github.com/maplibre/maplibre-gl-js/pull/4560))) +- Fix crash on missing glyph PBF. - - _...Add new stuff here..._ ## 4.5.2 diff --git a/src/style/load_glyph_range.test.ts b/src/style/load_glyph_range.test.ts index f79334a301..e0c1bc6244 100644 --- a/src/style/load_glyph_range.test.ts +++ b/src/style/load_glyph_range.test.ts @@ -5,7 +5,7 @@ import {loadGlyphRange} from './load_glyph_range'; import {fakeServer} from 'nise'; import {bufferToArrayBuffer} from '../util/test/util'; -test('loadGlyphRange', async () => { +describe('loadGlyphRange', () => { global.fetch = null; const transform = jest.fn().mockImplementation((url) => { @@ -14,27 +14,52 @@ test('loadGlyphRange', async () => { const manager = new RequestManager(transform); - const server = fakeServer.create(); - server.respondWith(bufferToArrayBuffer(fs.readFileSync(path.join(__dirname, '../../test/unit/assets/0-255.pbf')))); - - const promise = loadGlyphRange('Arial Unicode MS', 0, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); - server.respond(); - const result = await promise; - - expect(transform).toHaveBeenCalledTimes(1); - expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf', 'Glyphs'); - - expect(Object.keys(result)).toHaveLength(223); - for (const key in result) { - const id = Number(key); - const glyph = result[id]; - - expect(glyph.id).toBe(Number(id)); - expect(glyph.metrics).toBeTruthy(); - expect(typeof glyph.metrics.width).toBe('number'); - expect(typeof glyph.metrics.height).toBe('number'); - expect(typeof glyph.metrics.top).toBe('number'); - expect(typeof glyph.metrics.advance).toBe('number'); - } - expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf'); + afterEach(() => { + jest.clearAllMocks(); + }); + + test('requests and receives a glyph range', async () => { + const server = fakeServer.create(); + server.respondWith(bufferToArrayBuffer(fs.readFileSync(path.join(__dirname, '../../test/unit/assets/0-255.pbf')))); + + const promise = loadGlyphRange('Arial Unicode MS', 0, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); + server.respond(); + const result = await promise; + + expect(transform).toHaveBeenCalledTimes(1); + expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf', 'Glyphs'); + + expect(Object.keys(result)).toHaveLength(223); + for (const key in result) { + const id = Number(key); + const glyph = result[id]; + + expect(glyph.id).toBe(Number(id)); + expect(glyph.metrics).toBeTruthy(); + expect(typeof glyph.metrics.width).toBe('number'); + expect(typeof glyph.metrics.height).toBe('number'); + expect(typeof glyph.metrics.top).toBe('number'); + expect(typeof glyph.metrics.advance).toBe('number'); + } + expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf'); + }); + + test('warns on missing glyph range', async () => { + jest.spyOn(console, 'warn').mockImplementation(() => { }); + + const server = fakeServer.create(); + + const promise = loadGlyphRange('Arial Unicode MS', 2, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); + server.respond(); + expect(async () => { + const result = await promise; + expect(console.warn).toHaveBeenCalledTimes(1); + expect(Object.keys(result)).toHaveLength(0); + }).not.toThrow(); + + expect(transform).toHaveBeenCalledTimes(1); + expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/512-767.pbf', 'Glyphs'); + + expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/512-767.pbf'); + }); }); diff --git a/src/style/load_glyph_range.ts b/src/style/load_glyph_range.ts index ba63c10a4b..32203c3533 100644 --- a/src/style/load_glyph_range.ts +++ b/src/style/load_glyph_range.ts @@ -18,14 +18,18 @@ export async function loadGlyphRange(fontstack: string, ResourceType.Glyphs ); - const response = await getArrayBuffer(request, new AbortController()); - if (!response || !response.data) { - throw new Error(`Could not load glyph range. range: ${range}, ${begin}-${end}`); - } const glyphs = {}; + try { + const response = await getArrayBuffer(request, new AbortController()); + if (!response || !response.data) { + throw new Error(`Could not load glyph range. range: ${range}, ${begin}-${end}`); + } - for (const glyph of parseGlyphPbf(response.data)) { - glyphs[glyph.id] = glyph; + for (const glyph of parseGlyphPbf(response.data)) { + glyphs[glyph.id] = glyph; + } + } catch (e) { + console.warn(`Could not load glyph range. range: ${range}, ${begin}-${end}`, e); } return glyphs; diff --git a/test/integration/render/tests/text-local-ideographs/cjk/expected-mac.png b/test/integration/render/tests/text-local-glyphs/cjk/expected-mac.png similarity index 100% rename from test/integration/render/tests/text-local-ideographs/cjk/expected-mac.png rename to test/integration/render/tests/text-local-glyphs/cjk/expected-mac.png diff --git a/test/integration/render/tests/text-local-ideographs/cjk/expected-ubuntu.png b/test/integration/render/tests/text-local-glyphs/cjk/expected-ubuntu.png similarity index 100% rename from test/integration/render/tests/text-local-ideographs/cjk/expected-ubuntu.png rename to test/integration/render/tests/text-local-glyphs/cjk/expected-ubuntu.png diff --git a/test/integration/render/tests/text-local-ideographs/cjk/expected-windows.png b/test/integration/render/tests/text-local-glyphs/cjk/expected-windows.png similarity index 100% rename from test/integration/render/tests/text-local-ideographs/cjk/expected-windows.png rename to test/integration/render/tests/text-local-glyphs/cjk/expected-windows.png diff --git a/test/integration/render/tests/text-local-ideographs/cjk/style.json b/test/integration/render/tests/text-local-glyphs/cjk/style.json similarity index 100% rename from test/integration/render/tests/text-local-ideographs/cjk/style.json rename to test/integration/render/tests/text-local-glyphs/cjk/style.json diff --git a/test/integration/render/tests/text-local-glyphs/missing/expected-mac.png b/test/integration/render/tests/text-local-glyphs/missing/expected-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..42cb9d520dea227d175137be52d41bf065c500a4 GIT binary patch literal 16074 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 Date: Thu, 15 Aug 2024 15:32:58 -0700 Subject: [PATCH 2/2] Fall back to local glyph rendering if glyph PBF is unavailable --- CHANGELOG.md | 2 +- src/render/glyph_manager.test.ts | 7 ++ src/render/glyph_manager.ts | 24 +++++- src/style/load_glyph_range.test.ts | 73 ++++++------------ src/style/load_glyph_range.ts | 16 ++-- .../missing/expected-mac.png | Bin 16074 -> 23917 bytes .../missing/expected-ubuntu.png | Bin 16074 -> 24783 bytes .../missing/expected-windows.png | Bin 16074 -> 25188 bytes 8 files changed, 58 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84fa02adca..c37b1fa21b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ - Fix 3D map freezing when camera is adjusted against map bounds. ([#4537](https://github.com/maplibre/maplibre-gl-js/issues/4537)) - Fix `getStyle()` to return a clone so the object cannot be internally changed ([#4488](https://github.com/maplibre/maplibre-gl-js/issues/4488)) - Prefer local glyph rendering for all CJKV characters, not just those in the CJK Unified Ideographs, Hiragana, Katakana, and Hangul Syllables blocks. ([#4560](https://github.com/maplibre/maplibre-gl-js/pull/4560))) -- Fix crash on missing glyph PBF. +- If a glyph PBF is unavailable or lacks a glyph for a character in a `text-field`, try to render it locally instead of crashing. ([#4564](https://github.com/maplibre/maplibre-gl-js/pull/4564)) - - _...Add new stuff here..._ ## 4.5.2 diff --git a/src/render/glyph_manager.test.ts b/src/render/glyph_manager.test.ts index 05d07f2fed..b2aac6aee8 100644 --- a/src/render/glyph_manager.test.ts +++ b/src/render/glyph_manager.test.ts @@ -131,6 +131,13 @@ describe('GlyphManager', () => { expect(manager._doesCharSupportLocalGlyph(0xC544)).toBe(true); }); + test('GlyphManager generates missing PBF locally', async () => { + const manager = createGlyphManager('sans-serif'); + + const returnedGlyphs = await manager.getGlyphs({'Arial Unicode MS': [0x10e1]}); + expect(returnedGlyphs['Arial Unicode MS'][0x10e1].metrics.advance).toBe(12); + }); + test('GlyphManager caches locally generated glyphs', async () => { const manager = createGlyphManager('sans-serif'); diff --git a/src/render/glyph_manager.ts b/src/render/glyph_manager.ts index 0efe9f066f..db0f39e5f7 100644 --- a/src/render/glyph_manager.ts +++ b/src/render/glyph_manager.ts @@ -2,6 +2,7 @@ import {loadGlyphRange} from '../style/load_glyph_range'; import TinySDF from '@mapbox/tiny-sdf'; import {AlphaImage} from '../util/image'; +import {warnOnce} from '../util/util'; import type {StyleGlyph} from '../style/style_glyph'; import type {RequestManager} from '../util/request_manager'; @@ -84,7 +85,7 @@ export class GlyphManager { return {stack, id, glyph}; } - glyph = this._tinySDF(entry, stack, id); + glyph = this._tinySDF(entry, stack, id, false); if (glyph) { entry.glyphs[id] = glyph; return {stack, id, glyph}; @@ -108,7 +109,22 @@ export class GlyphManager { entry.requests[range] = promise; } - const response = await entry.requests[range]; + let response; + try { + response = await entry.requests[range]; + } catch (e) { + glyph = this._tinySDF(entry, stack, id, true); + const begin = range * 256; + const end = begin + 255; + const codePoint = id.toString(16).toUpperCase(); + if (glyph) { + warnOnce(`Unable to load glyph range ${range}, ${begin}-${end}. Rendering codepoint U+${codePoint} locally instead. ${e}`); + entry.glyphs[id] = glyph; + return {stack, id, glyph}; + } else { + warnOnce(`Unable to load glyph range ${range}, ${begin}-${end}, or render codepoint U+${codePoint} locally. ${e}`); + } + } for (const id in response) { if (!this._doesCharSupportLocalGlyph(+id)) { entry.glyphs[+id] = response[+id]; @@ -129,13 +145,13 @@ export class GlyphManager { /\p{Ideo}|\p{sc=Hang}|\p{sc=Hira}|\p{sc=Kana}/u.test(String.fromCodePoint(id)); } - _tinySDF(entry: Entry, stack: string, id: number): StyleGlyph { + _tinySDF(entry: Entry, stack: string, id: number, force: boolean): StyleGlyph { const fontFamily = this.localIdeographFontFamily; if (!fontFamily) { return; } - if (!this._doesCharSupportLocalGlyph(id)) { + if (!force && !this._doesCharSupportLocalGlyph(id)) { return; } diff --git a/src/style/load_glyph_range.test.ts b/src/style/load_glyph_range.test.ts index e0c1bc6244..f79334a301 100644 --- a/src/style/load_glyph_range.test.ts +++ b/src/style/load_glyph_range.test.ts @@ -5,7 +5,7 @@ import {loadGlyphRange} from './load_glyph_range'; import {fakeServer} from 'nise'; import {bufferToArrayBuffer} from '../util/test/util'; -describe('loadGlyphRange', () => { +test('loadGlyphRange', async () => { global.fetch = null; const transform = jest.fn().mockImplementation((url) => { @@ -14,52 +14,27 @@ describe('loadGlyphRange', () => { const manager = new RequestManager(transform); - afterEach(() => { - jest.clearAllMocks(); - }); - - test('requests and receives a glyph range', async () => { - const server = fakeServer.create(); - server.respondWith(bufferToArrayBuffer(fs.readFileSync(path.join(__dirname, '../../test/unit/assets/0-255.pbf')))); - - const promise = loadGlyphRange('Arial Unicode MS', 0, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); - server.respond(); - const result = await promise; - - expect(transform).toHaveBeenCalledTimes(1); - expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf', 'Glyphs'); - - expect(Object.keys(result)).toHaveLength(223); - for (const key in result) { - const id = Number(key); - const glyph = result[id]; - - expect(glyph.id).toBe(Number(id)); - expect(glyph.metrics).toBeTruthy(); - expect(typeof glyph.metrics.width).toBe('number'); - expect(typeof glyph.metrics.height).toBe('number'); - expect(typeof glyph.metrics.top).toBe('number'); - expect(typeof glyph.metrics.advance).toBe('number'); - } - expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf'); - }); - - test('warns on missing glyph range', async () => { - jest.spyOn(console, 'warn').mockImplementation(() => { }); - - const server = fakeServer.create(); - - const promise = loadGlyphRange('Arial Unicode MS', 2, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); - server.respond(); - expect(async () => { - const result = await promise; - expect(console.warn).toHaveBeenCalledTimes(1); - expect(Object.keys(result)).toHaveLength(0); - }).not.toThrow(); - - expect(transform).toHaveBeenCalledTimes(1); - expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/512-767.pbf', 'Glyphs'); - - expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/512-767.pbf'); - }); + const server = fakeServer.create(); + server.respondWith(bufferToArrayBuffer(fs.readFileSync(path.join(__dirname, '../../test/unit/assets/0-255.pbf')))); + + const promise = loadGlyphRange('Arial Unicode MS', 0, 'https://localhost/fonts/v1/{fontstack}/{range}.pbf', manager); + server.respond(); + const result = await promise; + + expect(transform).toHaveBeenCalledTimes(1); + expect(transform).toHaveBeenCalledWith('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf', 'Glyphs'); + + expect(Object.keys(result)).toHaveLength(223); + for (const key in result) { + const id = Number(key); + const glyph = result[id]; + + expect(glyph.id).toBe(Number(id)); + expect(glyph.metrics).toBeTruthy(); + expect(typeof glyph.metrics.width).toBe('number'); + expect(typeof glyph.metrics.height).toBe('number'); + expect(typeof glyph.metrics.top).toBe('number'); + expect(typeof glyph.metrics.advance).toBe('number'); + } + expect(server.requests[0].url).toBe('https://localhost/fonts/v1/Arial Unicode MS/0-255.pbf'); }); diff --git a/src/style/load_glyph_range.ts b/src/style/load_glyph_range.ts index 32203c3533..ba63c10a4b 100644 --- a/src/style/load_glyph_range.ts +++ b/src/style/load_glyph_range.ts @@ -18,18 +18,14 @@ export async function loadGlyphRange(fontstack: string, ResourceType.Glyphs ); + const response = await getArrayBuffer(request, new AbortController()); + if (!response || !response.data) { + throw new Error(`Could not load glyph range. range: ${range}, ${begin}-${end}`); + } const glyphs = {}; - try { - const response = await getArrayBuffer(request, new AbortController()); - if (!response || !response.data) { - throw new Error(`Could not load glyph range. range: ${range}, ${begin}-${end}`); - } - for (const glyph of parseGlyphPbf(response.data)) { - glyphs[glyph.id] = glyph; - } - } catch (e) { - console.warn(`Could not load glyph range. range: ${range}, ${begin}-${end}`, e); + for (const glyph of parseGlyphPbf(response.data)) { + glyphs[glyph.id] = glyph; } return glyphs; diff --git a/test/integration/render/tests/text-local-glyphs/missing/expected-mac.png b/test/integration/render/tests/text-local-glyphs/missing/expected-mac.png index 42cb9d520dea227d175137be52d41bf065c500a4..6a6bbfc88d539e5c5e3b04f459f1183a20bf3ef2 100644 GIT binary patch literal 23917 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 A5C8xG literal 16074 zcmeHuc~q0vx;KM@GK4Y@3D6#EtulioQKr*Ri!+u(g(x7CkRlmHlUJE!Rv^&U${^D{ zhl6+)W1x^wLdZapdKhvn7K4FIZ!5QjkmPcOc%X3KVDESR{yXdY^Dfq6v9tE#eV_gO z_VfIn-+tJ+|5?;2YYR6EBO@d0GpA4f$;im;k48p&`u3SYGi}CYbw))Ia zGB>~)nlyReW&=A^Zt4boHZr;!WSBED;xrf@Ffvk{H{BUYkBxUm^vup+)Rg&loId(? z#O^-63*Bzm7?NQ(WsHn=>B7ipmnw~R%LK#+yCu@dXjdNWDk~@zc2(uBJTOS4U3su8 z4-9dzdy3qZ2ZlJ01AVDO&;8(o6B|io_qd0)|x$iDD#JJFPt#{hq3z~of}Qs zPa7K-R^AKrem`#1BGBRU|Fp2U>V4ur|MD@rUiFjURarV3u1AC*yS&m8)8TvE7kU-!?KbW$;}315rJmV@27=C&Qqr4%6+Ng zGep@5x=AD1p1^Trn#g(Wdf4n~3VwgS`Qpo8ZnE|@>dr>w!-R*KJ}{wxiRe@xEsY_2 z$EF5_*La?V?5?#L{JD|*h}Qt1JxWHD`_9khh4eYqDUx(4xfbyU+oD8b*Fmd`ye#^& znwk^ZBcWCdu2uMbl&W?4=8>&^>!N4%T#@z;>m2l+{#Gl4FQyZB%fUF^K5xe2<377} z-l+C-*4|!$;On_4{#U{g`<1)B8#@0|XI0$fn!Ubju9|B~iVq3fBU0t)SB3um4 znpfv2*0q4u+UNl?5%CAt*VYN8QkU1a5|%|GvFZiwpEjGcx$ufOa4%XC)uAd-p1~Y~ z9=m*P2T6|Bfwkul2GgPX?CFyU?cUIrxOnXu+#0Cd!!jzb$9u_&&e86Kd6bzqsH644 zo5KdfUs)U0|67)un0t`<;pG7HCq#-tI@$i+@56EUKAJ$f1%)_NCJ?db1);%mgpb4(*SHv`92qG2KshPI^&&xUmK z<;l(0Sd}^l#C?16;hr@R{6v4L4XGT&q!BbiKQJXD#AA%sVL;aD+53=da|P3aO465! z8@^jGjVO-(qfdOr1Ks=c_Dg**V%_q~*o4x~P5tfTFyyb<`n!qJdnm;R^+@Rhty}IT z=q3H9ccN#DY_auTdA*dva`Y3SCdC=K_VRD8QJV@+xoM^(|6co><+NyYlJfCZ$X3S= zC_9@fKq>a3`SVD{LA@pJn`?h=uH;vJXSDrdW!RR;AFVp>+$(C|@!j9xyOaEYZuQlW zs~@*Db;R^V3e&w>5P+#D?sJP%1|}4#ou=_5MAZ0MZ-Lcpvb*m%weOiMWS`dp&IkE& z(6y;LjchWjJe%voKW(Vkas z0Uvr)+tclWGNeUI+S|Df8qTFP+CyNUN3pqL7A*m?$hP6tC}q~#<=->n6mRrZ z(G$9lLtSmg&rT+X^zd@DaKc<7G~-4cKQieu=nn5QYn;NvW5GL{zU++Wy$T!kP2=zi z2Dm|yTSakyBg3LZ_t6f;(II`t&Z+?*Xp679eKZR7s~Kx%Gohq_>*wjVo(xhHuR*x6XQ**Ztja;p;bzcq&v)h2b)!9I! zsW?d2fqpJ);MtRow%jMa48tmVwGY;4542Yhl@US;gkBqr`#1FdMa2i0pKBNH4n{8Q zC2|%f@j(Qh8>0GQeSZ!TEY~}Q6P{ZjuCW~JxlSV#Cy(p$W7fU=2V{0B`J?K<>p|g} z;)MI#<4+@-Y3&kk10;Xkfkf9-^k7n5j9KFR$4Qn|`O87iWG^HLcn34gRX^+Z&R=^` z&Gphfpon3p#{R4ctw}=Z7K0J<3E1Utx|_OKF^B za1rcSeklNK*riK!#}4pjsKqH4qU+TXORZ*YvVnpRn@#g!(|T2{Rd*abh%6d#aLcOG zkO(Cxg;@I`i061|-Ef0_zT=(R8z^Z-r!F&hpR?+0m%z%bsW?e^F+~W}h>{fWweEw= z5gof?X?a+j5>)$0{l&bg+(0x0X7sJhHeC-#quAzW3?!CbR1E^I z`K~dMVQ`J$Q(=xv%XNZW;Hfla3UQk3fe{r-SLsr995z-XO0CRG^9nECuDqx+>k?$( z1Q#O1_8056?EHAKVB-D7R7a1L=RX1wLst;JJT-l9D`$~BJUnXZ$qCXPst>q+FdruG zBQBUxkIJ0s{Fae@b>Ovu3(9by{9R=KI-FQN2t%y%K^pZyOAS>r=&5*vwyQz@3Tz(r z4ZLn~QE&rHEL~LOQPiFK3kk)Gt{Pilj|{6xEOl0@F=^|F>YysByR4|2qCUcc*ZBXs z2E6Y}MQWoS zf=UmMU`G~KBS=qlvbzjPSR9zHKhx#^D;WqzHmGI5w>pXF81~GH3@GTby6#x8+()=bTbehvl=dHZ42rsos>(o{AifIg64Jty;i6ad~ zcPRHHTpKD+9@eo-7>%v30aK6a;;Q3ttRgojBj{?0O~V+U{v43gH+n=rGP|Qisr!e} zeTikABvy1e=-)M@K@eG4q~cNPur4;mvFE`%NM!UqpPzly+NMP`(OgF~UjgsOf)Q2J zi%rR_UgZ)5X)X*4zlEOWd`fvFG@Vi}VDMYvWqzuy$nNpWXnD(ROWAd?x8NJytR%0I z+@^zZ?QrB|X^E!_XsZR2H)f-SBOZ;*qgiy*n2ZpYPRR6!mS22nSV48>WW6+UH5;~4 z?7B*In&uX`XuQwEHEuX$L=5xkd{nR$Pj&{oMPrg6xHfuT4q%nHUJ-+@*5KDBDcSI4 z_TlqzqS*{A_f&(_&YPi`RO|y2%kgWnK}p5IjQENJ?;7it;0WanWA1B{-z0|2&2Pc4 zRuL7Al4Qa;vUfF~*eHb*hZ!SKc1hn7M!i4WeAhUBN?fWh3tJEC;-76>sma7qC!)sx zCLFO_QYXb=${wN-=lb@Tr|c)xU=>%LM0Zcn7_)407&7_(++*@zA>04WCv^AtNqqYo zDM1cNmgSekWcbir-UKu?7d0LTCRQw|hly#HP{@SBM1!vuSD8;+Ha^I|_b_t7R0IYx zmd|$u%GUc9R9A`~kUxqN{ep&_0{thG&4TKMR*$_~+A%4t!8KYi)3)68mVxpAuid?< zdMSQVT(0$PqS*(e$uSitmR}xyOdn?lqz&;W)n>SX#o6QokmY?aE@b&g4mNnpni}{k zX47oTD1K6n4qX7G+LX%0S-`@hbR_Me>C7i@tzD3O!E!WE(B2)r=Olt9WD!KEoY;}Y zk3wx2LNaD0V}k4!#Z8-%Th(F`Vlv{d6B^acjeYye-3G0^CgpB98a&#$v+AGLI9?}- z7JUf3s51id%slDZ$Jzp znLlje1sNkl9*`)DUmmv9WwQ9VtV#UeMzj5Ep?X2+FTn9{qb)85$S$KNriPO5LwdAM zrFN3d=t7}7hu6cVMRjEB9>MW0ku3nrx0`X2-NE_G&Ta?;5jfW1JHU!x(9OJPSBeI7 zXP`CZ$~Wv($S3ExRPn>sM=eto$vaT6i>xGkSW5Ls_3}a7Dr;c0+ zCLr*Hg3<_KFk$YY1V_dRF9<_;Y_dNrP#d<1k01e~wr_^cs16}l- z4AK(;eJ{#Qb9zJg0p|L1Sl7e<@rW6IZ!x(&ItFkGzn7(skRN5lr@2XenzBf)kg?NE zg+yr(HGpxhZ))q7*Su|cy*h9+D7>g0y>E%+-Xpvu`9ing3e`3k3zoIaK0*JxN>Tx@ zqB_(jSB?(Youj?1fEz;dcWUbqtBQfY=%#s|%3%p^TTkuc|2ZT{b{_#EsDf;08$Hg>pevw2f#%>$tk=GA{$_ zl$L9~*}9|WrJ3eiZkk)k$E{|BBW`h$ycxhBVv-3O6&;&O8_n+0^@wi06NK_|9V}D; z1nHB|h+fXaS46Y*0W4CfMoWQ+@+3i0Ji1l5NRDW$7FudQ?;6ZmsgegW))jUeFA@Xr zLx-Cx+9k`J0XM0C+H*X~Ej)dF)4L^^oaY|mpFY$^wqs+(7nCi+kv%VV&U^nbHWvC8~dZ z)FZOZ2-!y!iPXaf$SAP6M*Tm&uhsN|p)6ysN%abFpoLZ-I;6!X&~8z#RP)L4^Uhf1 z>6{gF!1`)=W*eb24h#UowyaU9<k(g$SfyyrSk4*Joj01XG!lE5%iDyLDGKYzEI zFoa+T?X@?Xa0DVRPF;X<)lh(A(}FjWk_(cR3@LqoV;>Bqf@F4&fMU6LBiFOTO>;&c zC@Wo>M3#bD%%(-upuUI0AeBU8Uxsuj(O@0~+nIjO+k@_^6N2UpzL(v|TOgrA?V%G{ zmik+h^3=T<%kYBo9MvzvM(zPEDc4%g6-e$GPmmm{$K6SY+PPo;tPklz%G_A{4uLRX z&c_}VmSor1Gfmr5q*CLQF4-ZD9gkWobtVbFaI}|L9)3gA z$9)b|Ub8kE@Vr_mo?DkyC-Kx(3!tXQM_iF`0*N?WLGvj7FJJ$!sDSs-5ixo>s;ukrkHLaIwYuRkwy`*++q!7>xDHM z)Y)J&9BTN@x|_K?h(iTHW8VTG=Xipb(BDI~JG`bwWkdRQZU_?9nh3IWb)eKP)TK4B z;FM}hxZ#4_iSixu$NV=Va`#{4_o@I(FmltBoxGk{+5vU~$ZGoftV+$CUAZ06!?Dz% z&(8%lYLP62^ITq56~kjm4PO_8L85AHG)9X>JIj&R!;q=%(Wums;ZfUDs!~iwK2r4? z;N?5MPRiP3&mmJDwFO#Cs4Z5J zoU<62P~@jNq2DuG-+D`L&+;5AI;DuJM@BSi({qgqi23ZI4#lYc(|OMcb&EArSD>~G zay8qSlKl55lq!q)4_VH>d}D0t-+9OE#TQkbvg;DvNw_Cgf%-pCBthFHhns%N$kN@;wSOTExhUG^ z;RDh;rt}~9a@R@6dIGMSm8Tq>9$z5U4~IFFD$i#}(<>n<_B+Is3 zbvmS5M8nj$Q`CQI!jcnc43!`<%%fLCRkySXY$Fq^sXLMK)DS6ep3(Pqx&uRLKC>?) zD9NTs{j+`(@i;ef)LG1b_zG*uuF$AH51oE;kU1!z!Se^V=rl*S~=sP(?YVwa(FGVTun_y*vW4Y-@!0Ns4o*SpkvIsXaRB@;Wy6f`J$B z8F=wbe*q$$^>aNBmb1uaK8!{wQ(YG=^2e6tn1)@KSBD=>X3#u;MW3% zyBsOwLmbO#xm+RV__=6InO9%+n=L9Gn!Xqc0Z-AVpUrzr z=zMS}>5=ow5wumKHiP9Du|vv-et(xQ|D4tgaqW4x799#hDcusXIxaCCVf?B@X;qxk zG0>AZE>|R5VbY%etWWP655$eXZ6)te`-dCiMzUQ?P5Y}M6E9NH8>oMa+A@p3#-=Df z8W}Q08K8o_|JG8$kTNvabBq?F4nZmMfP-v9*XU`@!<|i7PLk?g=$%8YYj~OH?>D>o zFLXoz#je_^)ti!?e@HwnR0gu%+lEuQd1UjZl1rGv;=aA{Bzwa6Ev7@ADuQf_Gz7ta zq~Q$?erR4hsJ99SGiERq?HDM<%6udhc*EBHG`7=)e_DtSL8i9tAbMeEiH4`Y-XFBH zzlP}s|J~_bOm+ieCkA%2;Vlfi3}Il&U3&cATpKpG)&K7oWlW%(3cFX>3>fU*aNoVc zW{88`8}7ST*q|`j{Q}&-dWCH_Wel{jd+T#IWuP$l*KU38rp*7^l$kV|#{Ju=3x8yn9lHa0HYAs*nJdiLzwY;1uV=d4b@KYWDF!+Bb4^r{GZ)x#|xdu)>KOghE!Ry-K@bF`uPHHYMxw!JxI28Z7tHbd@ z_=Mt;+BZ3C7c2SrN#}&NKGj}qRzqjivM*q+dEtR*HLmTKlgu*rW0pG|LbtQtM*@a){RP>`L8=&{-|T! zC=uBenjxeuy1M3 zxkNqMyt`^$Un4`xo@{@7*mmF8cvs1Nqq_85Wxxa6JbvKr!u36JwH@UquWGctK+?@0`b0FuH=J7R+dl~x@ zs}a001Tim)RUasnDzlb8J{n0D?-gGh@e_L1wj~;}x@lsDUOcAH(@0HzLP1T|2|Q+0 zqeLEje(ztAeh~^5cW!Z!HVD+5bD2(?LWwF6{Yt*sB)b&ZAdO=Pfje%*>oA^AP-$JL zaF=a-fH;Jrz~p>|(b~74YtugV>b_NEx;00!o8=hHS6MOx`h@F0x90jF)E!7kO#NhV zq>zKsvk_$&o4!G;oG_^trMfHNH@w61Pc=i`G=%yXB@VG^jImiNMscrvh7&%Zlm@bM zN(==Qh+ydWKayj)*5y67V-$wVKO0E8`IkX-5gh-}?c-LwL{*n89JGuh>0AL}ih zhsjCPgjuGz!!pGKdooh}p|s)brZ@U|AX@Vx;g4C_b+Xd8P)OS_vb)ff>1scsIv)Os ztf9~IJs?&t$1R}lsTW42!8biNuxiv34~f(f6?YypZ*|XBMK)dt8msBUH=QXTkWX`a znYc-sL260ugQH1|<-$|J!kZUfYL8!<{}p1E1;Bh*tg}{V0%{vfS<*#`mu*CgB#Tns zRcpQG|2Cca7$>;ckKyld;&X zd6~&)@3f%us!)M05@u<_=_6GrEAQz$dz0b! zb9lkQk!X~l-FT*AerZt;O~1)?!DCBg`}}^-B>&U1rZriUsCnmty|kC3Ug$6Mkj{6} z+}Dd@sS_w(e%pR&LmKo=W$M+YDA6{8Hr_V2XZZ@-u59d?$_o<+*=H6lt@T2KBjOAU|Z-*!t zFhzd};NEpjP^DdZb?LF@(3`DeWgE|}t4MMdwr=XBTSi=$v=Ae zH4}{m8`avys|lLlLOIQ{{)AcHQ(VA!jYlw~mK3)~32PYH(T74s%hmHZu8So`qKn

LgxiW4S`&WMJngT(*iiJZ3yNc|B?@ra$VHb%paHL8at>2a<^Te&x*Rgm@XvAJC}dXUPtiBH_;F zsPwc|Js9`3^45-G<~b8I1?L>RQJQbcc&-j^?+KqhmtcpVrE0po^lh>%PfHLilIbIb zk*yjEPYW4EFD%SDCfMPI{!*_I71!a5Z?Z96!K*H0v0T;V&x0|Hr@>1wh6tbTfy5`1 zJy+|+E0YuO;7!jeYi!TMeoBD)bg>0=A_E5V} z$5i&`JJ*+`N}6q?eVtzFNsPCp7*J2F<-ZFXYZd(-VBR-Gn5tX&E5ga6Me{zST*u*_ zvrG`REb7lyq}G)SE2d$j+jxt6*BB?|TKg91hS|PC3)x@jr}k;w+4;ah6C8q*{1tu2 zQZ#TJBFFUEyI>Q9$r>`lBO`PJUf*%W>#qF!(Uvp)Y4iS%ci3mB8Mc_=V3hv#?6){B zT_o%uI@_C8$_$=7)=Z%=PfxB6YIW8N>B}hpnCn1ZCsthd`QY|aP%d|I&ZrDGN$9FS zzc^jX*D@Z$fRNUiy8Zh1utT@PiE3}U{QGZ==V?H>V_g>>GfupobDr$M^okkEB(9Tl zoEkf>m}GHpX}|-OrvsF(41Y&(MC_BF3;tlPKk7{T*IkH5oxC2ox;!k#IRnhSCgCAY zEOIP>F*la2)vsSGz}*0HI(2(UHiPF)^e~T7;}7As%Xg+ka^w9O@4R-|M4Kh0ri;F+ zF{InfP+(Rs*i*b&p$~fy`b;o6I(`Z5l$o(ht6@+C81E8XL<@*I5m#j+V0}!VvmQ52 zwI_wWX&v@dYTB;i8f06nkeUF^{Mm}Aa zVXD+9P~Za3fLpF6^yS{OeM*Qy%~79NoCff|0N|bd%$sNn)dypF4pGD)_f#-a#7L-! z4|Xp2D%BP{Wv(xyz3*zH2aH(l#Wb^bYEJz^HNfip3UPk{zQY8BMjx_iFwS*?uRBst%hkIG?TTKl85#Sk zX_i}eL3QbuSF!#MBXMtbTRUk$l6imylA2w zVY*P)=b0=~%veV~BS<1|4uubGz^oHOsT|1@V_!Kxkj8D_r$1&oV8_k1hrYXBQIZ0A zd~&Mq;SfH>=^2#-ujlNtJx@yOy|`DAclrN(`bA!|93_1FM}CyHZ(93OD9U+nl6v-u zAtv2$hci^eeXU_>^7bInlVT9ko}uh!c}x%<;|;7 zkdfz%^ytSYq6n}C5K`;I>6U?hK)8kN8_78J0P7ov+6X;54#C<(Q@vbQ=?=$-f7M$Z z&*dx4S3+{Bfct{Cs<%`kO3E@@5Ih5U#$#xQh6ucP2>lniEK8*3E~otHL-tVGr8hpg z*O->C&{JU(t)dU;B4ppH~$TY_CE}iNV&2}-O050Wp< zdN=F3_<shgVakus#xN6S;&sZX~~!fSKS!FYHB zPJmcbbm{;Ai*DoTjzJx};RFeLXy+V~`z|%AL{dlkGBSVHSny#`*XW0l;9mZurYMEA zAb$wO2KTC)b|hK6y7SG7j=+5cC}!v_vZr-j6$RdO@fEdMI$J)I^=9@!fNAUpgr@60 zy`bl`AlUGjSH|FSbxE&`CQO0b>-k0Zm`~RW&u?-3GiS7m7FqJ$xqmvLG7KND=ik}d zE*wfd<(<2z7OOOOvxl#8G)bnK>?#w?xV7ZiE3YsVlNf2!!ty*8qvGjX${#4)DAf=d z&?>{{RpTCj~IXwI7IC{z* za|XrX=zqju?$;u!<(5PtiB_7^Kb~tnxjdcLg%T|aV&6p%1{M#6lZp_g!jxmBS$~uQ zp9XLmP@P|8Jj4;GJMKOGagoENu%*%eZQUzad|yhzS$S@vj?o zAh=^E<`etm->xzNnKxn3Ev@a*wHKb#`Fs zS$r4u`m3VYx?FtNDbX$ zOIX(mgYkT;QSv@pH(J-dlOgpR)9I@~vYH3qxk!|&$aw73ILQvYu2L3-P6aDC~&QJ|M>JShrej7)jXxt+WwNWXzyfkv#df`uix&6=jt^M4kH` zPPJaRN_F=75F0k^VB57X)&J|`yK1p|{L3A|zJ=#(TSvtAdlpDMs7$#ug6!c7YLhi1 z)G4~8np&5{^L+^X&;6A~ObLezD^?X~KbZ<1@AOY4R|R}obtt8SYFAz2>x=@Yv3d7o zcJ6I{&2No7IdsKs&U{-^l5o#4IT{dpeW|tFGVlz1=Zgy%bh?P87y&QUj!+t1jt2vjusz4Yaeu$RooDD zetkW+A1MoRF#t_KUlU9*&uO5}1AF}E5+kH?6{(>#ay3EJkYe}XmAMN;7XR&$}g}6j;Euf6h_`6e-Wk}U&B=DNNt2!Y8ceWYA+o- zPUJAjgYVBF{^`M}XPJ6*$g6rU_KhY>`ML2lgSeWDtXAC)TCD@1RzrOxst@ zHkcS-4g&9Bh92X4AiUIi_ng>*A00YygZXqj2B;y1DD+@QbVH45mMs0HW}>haQV*5F zEED;$mbX{*_*DH(Vkn+^^*&aDjijyP1BJ4QYv>}XBMSrQ-2G-{!c}Qv4Y#P@XLDa8 zG9kRQxL0|xG-2baW2G2fgxDrAEN)45TWBwjdnGcJJLcOo& zftk+}=LK%lTEoPD%*+T&b6LN*&Y`QT(|0GeU|`-QrL8~Z?c_I!qNsZdo0MIY zdkypjszxPQD-tm3zP#WQffA#D>zPw{H9xw#=1%iiZBakR5c> zGqYvGJ!_AwQ8K5nm;R=AzA%U{hN6oyf94z^VV2F^dp^F2gqqY?kKazL_Fk)CAsv=r{6~c6AJVU&g$6(2hxCTE2*d?k!_JofqKSb zN((FT!-b)u0|lnY&I@m8LEYwEFbQd@l|4C3;${ydg&?39*lU_q&WLGP$XBS_m+pe) ztXbjff;lGiP_H*k2e3m3k2l~2d8PTT%ebI-gp4gA;i0hpryV;@Bq&ViJN@ul#HTWZ z=Jmo*E8^KL(S^LketAqWvwDB5v-`|PJPYHn(U>Y!sI$9w-aReYcB*EfF#05bUUc`4 zY!)49N_uBDwJE7ao1+$_wsv!&>ww?w%dGulxxd}Mdv%tYzc&@#UITN+pkqyvH+Pq4+Z%C zut>h=L` zwREX%q4zwYdjHh%JZ50uFKW$-zen*u?JoQSWxjxQ0k=`QdZky-5I2_{!_M?CTp2pz zzE5u1tSXCOqp6NpLW+UOU7CMI!KXN{G;yZejv@O5LeVTIF^(4KUF6zrZX6`#K$d)< zPv_W{Hkdo1%ZTx=n-ufTTMsPGovkv>9}H6HmqZ-B{$o-U|MTP>{QV29TLraOP0VsE zH#XVIHWrUoBfJLCIvd2vM-a_ZRkD>8v+Sq_FUlHmrZ#o2Q8XfpTZ&sTH@FrgccN)CiG zunR?Jdihg^#O7~TB0*Z@KZ_{cLFW`Gry`I^&OGBH)~azd ze^%Cyc>Mto&XM5h<@qpsau!Th2#9$fhT~Ce@;tGs6?ymZ8b&x7h2aZPV?E9=$lE2h zxLV2EOV^`t@vn;Rmy}_A7}$LvU0?ypn;+($P~@LgtIHcZEZ4sS@gw(uO`ydy>l&(xWZofdXLB=0RK}@ia=( zf#R*V@*d`mo@Z*jDwyK=po~)TP49=w2bFx`?^6&!8eUJ$*|;L%Fp@S4p3w1)&7rv* zCy(?>nhzE5d~mA3SmH%CU0$v;1*HPmuNRtw`VwHE&;YHw$Mi))sU9X7<;-hXJw(n@ zB}#eo3Q9aZpt_?y7V&*1_bS!*RXAb=s<3{#H7$~mG?ocw zUg%TcT^-y3Izi|{`37^Zt)ZQxI*do!*B`ly%H%S zDFKds0@Afjdxd0|WQbuv-p9N21PV;7stHmF9j8Vzig$d%)ad?U;v+@Y0)SPT#v)Cu>d=7@Zf79d0OXniMlh zlg2~nc#(f<;P+mZw)QEz=Qhmd`Tz@bH?Q)8#cUq23wP)u z(xYBZI~=4O$0x4_s)$GNFH*Eh8+-Z@nr4{wfd1Wip`04)1kGMyb5iVB?g)ZMYqB1) zej(zB7Uii7W(1+Gb*g_MWXa?>Ii=1nRu^HUMY3x6KnO)h@7*?qVJ2E?M7X#6bl2@e zet&ey@sORxFI>5Yf1ASnHIOHj?>6~B(o<3`B62=*N~?RSd+!pi-zI}2lIDIPxVtUqzaDD4&8;PA~Iv>n5J$^=7 zOadt}kZXRb0ecxQZVYvtlkm=Mf%?vQZXdeppVz7AKsdQ2clRu~z%huk40mo?uOdUc z4(^%mNA+^gj0r9&EsSKIbg?y7i1inevMWz5Kqw3U-X-Wqwp=FaZ7Z8)*ap`#+`@)Y z{YH%TUIpzVL-u{Cu{G8&d681&I*WFdZO#~ChzpggPb4Ls`67hYj}ngj3`+Zi{1Xd# zm0r#~`T%jlEVad{b;jn>>%4MiWGBtNB1b#0vonKv3`@GUtcPk1`z^NPu*IPxnYbCr zto;|X6Z}elM|NCoCGPZ!6@ND33k?*y1+IXbWQ)x)*~9CZuHL!jjLT7adc1VCWd6%K zeDs^w0QT%+KjKd378oM0aKxV*UQpgidp+AShr{8b!`}@JSI}dV@`Pc&>p7eQhbovbe)jj@TKr#6|0rv!uBqmc$VKHVa01C+SDr#-#%z9zPkHM?JhA6@~o_NzVy|py8 z=-qtr76fvprz62VLu>#I3crj1RSl_R%%r{lcwXX%kq>V^sM|NPj`xa_a!aOlk{jPA zgyujIax{PIa22WLte}H9gdAv6Flf`@%UzKwt|M+vvW?Qm)g##3NJAf|>LC*dL9JnZ z_xyKPo=UyS&*~LRQE!z3;;1mG)g4p$af*gm)Ar;1KoL0md4+6kQfT*gBxR6x=4fIG zj{gfa%v)_$>=njltaeStJ3Zr)Y5E?qM+c6!KpN=@ zCRti?g?3P{=|Ge0p3kwI9|&Q|q8l#?N0?zmFkt)%sN3`xrf$@Dk0HYFAL{Y&@3gb8 za=B8V(3H`PHV`I> zhgs`8khwdmNIveFkbW`ja4h0v^WRB=+O=MDJSMqUX}^Y-z+~@_r-x(|*SHScQ2Rxc zWzn*KEoxn_)&hRIIS}(IW3NEF*7N0&Ex*#7r#$VPk<94h6jdZty}>8z%Ti9SeB?$n zkJeCiU|sFKVdxb{4JrB}jw>a1;?5Mc1tz|i^&RgzttO}Dm!5<>WZL10lPf@WVx_RB zd$0yr;tB86^iDiXZ16NMIY8x~(YeedJelx-DKn5WXwiigNAga;Ta+@%zKD2${lw7o zB|6CEiU&sz3%N%l-~d4V3p;n15EG^M{>f|`FW>=Y1}lC7zLZ}plv^P=H6WiRl3qnx zI=0n44dS7Rl7Ec6mHZ`8$mnk`3`8P0J`ghZW_1WWn>YS~zce4@;xAQb*^gB&EeiR% zaLTy(QVBy$%tN^koz=^wbf+>u2+#GDNA+}0vXWC81OTALp@8;d{QECP8axLeaUe)* zulPkqxWvsJ?N^2Kf_hr!LBrWZ%kgtmB5A$Bl}@g62)sv z6he55)VH=XmTX)CZ%K8ZYZ>1Cs85qTZgURK39M}u-kQpPx_ql$vS2Jv^hGmNXd`SW ztykjyB~40TUjSkb#}=t$H*NpqN6CNQp)b7=sjhwpL%1PRPzgKy{gG$>4CB_&e0Eo< zQlybeKvoCGCgpU8FXcp(0ZuCFwrg6kQ-KtEga-42r$1x}K6n#3RDRa!x9N--98YV9 z5uQ^6nTZX>LF7Mf_zRT10b}?lmwb8;afesBXGwj1fD?aClk?E7WtaaLA1DOERd;d} z63$v){Jni2Qx>zU`TH-15#bhmB`=ztLbv+RNjlOt8ZBhW-luJm!#z0unSi_4qB^mZ zwD=doge2S`mb9h%ssYQdi#Vo5aLNQ zcJ#;oY?Y%QR{;1*W4G$YIXZi+EpFj_`=)q7iY zI*?=KQtOa`4LHX+aVkL2`med{Xr4x1uNyVLM4O|B;gf*|{2dEKi_T>)5zucn zzqE3ek8Amfc;cjN&f4K5z+>20d3TJ`CCL&DK@fd=D!XS)+0WR37GIIYAKrqK#C%kq z&6b~aoQ^|}cxGHY)t`J`jc*?>Nv_U6D9l1e>*=y}L#Hj;AUP4o|9mN|U#t7OZLdH% zLfI@$^o7>QL@!_Y%_&;glQXC1Y`2v@STuGR^r3Gvi<(CM+%kTG5AC8QVuuuH7bHHb zQ~8gR<-?o}IDnXA#VK~pZtQ3a*lrwSH2~@K7Ztv(&(o#muc$KGBYQqOM8Asg73MT8 zDiiEq>7KIzv!8accZO&1dz6odgc;#vjdkFjLi~y6Ph*nL1Hoq~>b`=gMa=DB~*l;F(j#dT0L=oPJ9OjWb z5-CWQ>9a-OY8TDhr)`|uzd`Z^+5!C=oWL~_X$l#Zg*~Y%p?bvCYxQQx|IpX|z zo1xtI8%h{l@H)EzF%Z%igpe=n35{QJ)~lD2wk^-J!%I9KZ%%n1Ha=)I5ECcs4lZ-D z$m&#|tV`u>7Vm3o&!cHZkyef%I~2J5Ngx! z?Nei&wVAfz-2K)8odCWj2y;#r4Op$u%YMdUfQ@T?_JEp~M1F^-lLdSI->cR+yUJ>h zY{$^TfVtBfVDe|exn2BCy20*}D}P7+??B}_Ryf|FBI^s_wj5Dv+MaovaoB-U`{JLa z<5-e#aJ|!Sa0?})-)4INpBACIpl@v^p}1PcBffOi&bLKcHYV$jszWUn%YKu2AU}K5 zPd=aLmcKm6*&=J8l>oQz3bjAej}6g#*Ckax7QTKgFtfu5y*Yo6BOV4Hs0;%(M7)2X zrB}x*ncXIiS+;ieWRGvsfhpmSa5>LVY^xAiMG-;`rMicaQl57>$zIk;r1FK<2NnV4QcUz&17lq zv{(r7ca)7~bCsz5<(83NYd6*qtDJGsLfZCYmxfoqu~Sh|y@Q9Qy5LhTxnC9|!)|l~ z+4G_Bt|kMR>9R##3b)J49`*NS>T;RT4&UKVvxU&*o9$w*-)^hf-BDiF!|~hOV6c^8 z!v-0;d_jLFUEKHn|Dncr1fH)dwYf1Pjo|k@>%UZ_i3F+p5)GNn1M#%;eR-C5o)S-w zmf<*x=;ANP0m6_WsibKd44jgx4iuv^o_?Fo?V8Poz9=MK3O?_y?I#qm5i3wd{1bMe zT^c6?zVVk^+Ktk@bZm6k>2%1^j~MImsws?c#>F&sm%nDPGs$a2qhvu|>iIaCKJ_O= zJr7fqY`dLT-b1L++f{vt(t8h|<=A`npYLgnVswZcOn( zNop@y^-C>5qs9kCOSKjg*K|wRPv_!(*f>FbI?TN# zCw#G+UCBA)%C&hkrlT2A~#w&xc7-Xeae%br&#?8M5})d<8nf^W&|tV7z?J z+45AQU`=;bKg|{AQ;L4+^GsMoiSqI(fw_%V{vZSv3&C2}cNoM4-oYYe!k77*erxBe z&V6ll zIJ#G1N=+?tNO(uXpM(6@7aow{0>0_DF7B2e!r@3}f1BF=3&F;$kMg-AxJLv}fMQ?k zif!<8D?B4~!R$TKC1-Q5>}b?JA{a4sjF{hHTuRRMSYG)}v}~`8TTpt(mA>rwp5y)7f-ubcw#eMs}NU{Ksgb1E&V{m&tmI>7ZG~ z7RlD^yScKx5(-vXos9_d?ngaBpO~R2=@lG*tV|gRRWzW#r1_N`pvZsr?^VKyZO(-Z z&)}yhK>_FA+rb(LjqW9#eqZ9{%$5)7v@g9%6_}CLQs#Z^_)8-m+8Db)&uXH z)8CNMj1={?2t@FgYAm+Q9^D`HTKpLn<-jygbCS=s3?Wgrdq(5AV(Ra!_|XQqlfb6c zcO^BVraZT5j`|h&^1*}juh(Hy0bj0A@8hi==IVbihW>r%+~1M#>1;#1m~I1xc%(FY z=6%8xOv1GTLKKTr8iKFgj8)&X)Hf1ZaJRoTm31ae2Nz*K^0Mi-TmH~)a2bbnfP}g; z5mu3Y8F5U#L6hLffL&RhSBV-rBYh?d5XcZ}vqzA-H=8;0}2SKC^mqBlgGxRvP#}bFJ@Q_-BU$ zsb`}-^Zl}Qi7&StX1vL&C=D}o6u^m*@aM0`}Cq2q5fe6yxbl7K1a60fF5w%vZzA{1+jTthN0uQ+QAhdxzu|d z@IdG^$X!3g-`pdTDds8U%ic&m0Z8ShQ~D9knvv|+Q|ECb12gH;c=4c1{oqD_&AInU zHgtNgH=s7SKUgca%0Fi6I1HT)UnfQNrO9t%0mO8@n5J=e)^qTQ?Ud*3yeZda0lDBH zd8jaA$o(^F1QEx(F51rKYnG}2Ny*UT<;lT&FfPi9AGdWq+>^aTO?KAGzIej~E_40N zWW8D|ha?Z2C}IEmhK#{Vmyjdv*EQ8>gAlsxTIXB)Av~%G%k7>H?}yW&6={|Yk_=yy zv>BmiH(;W?e|e&(&I(3x{8MA?$tSWTt0&vXiIgzQeaF)c5n1wBV{GEMH4xyooB9w1 zVzGPpVtKCRXHU#L!nkU@$GR`q4N=$msI(vyKT@SD)kx#=h(sRRm6*V>712*#Gv-mc z6g^_W0;{{kL0WGhQf+g3PEf9hccWE2b_tryA(@CF{)ytid^2QM4MOiqI$0>Ta)?9u zjXy^l6%vknv{N;|Tc3mLtN3$0_*=tY1*o=#^Z5=*_0KUBuctk)Z*miQHgwTFKO~9F z4ilNU)1M8-TX^ciX~A;pt5y{lAwa#l!enoc+A{0sCC@~c-IjsU))ex@O?b9brWq=QK0T| z8KKTU`pibv*Qy80@$5z{J6vFYq$70) z50msGad|9~OlR+<)FWYS!}j4`OnH-n-)rBIg`-F=oaJZ@1gMQ2~8$v>AwroyQIc_OlByDAdCr5oa7cOUXvkTON47XoFCFK(V_Vn` z${0XRo)y5Z>OEt1?I#fFJgw}-GS)&gz}te*r7rPm!{4$)NK=8>0-&e#g|@Z zc#YMhOu?jPs4n4}Kz)R;njNE5MRsFAChLKS$5u!@>XAcB+=fEB*Si8WKalPF+y>eM zjCN%;Zfw2(WO5z-66QUZ<&J(DhFfh$Dw+lOdqH{H1Hocn7jkwk>C;ZLfIj;#&~H%( znWB@n#{AMtZr^$iU8SF`0C2rXl*V(mE?dhB6RlkS`i4(#L7Erd+_+wm{g7!F1+3Ld z=t6C$IeTSS--BPHxQnP6FVq?5yi=>`S6r4(0JZJFOswD16}?9@8DQs}l%cczg(HpQ zS-fMx%hohO@2uj6rz1sptG!!vsfvO>JIJ)it)M9KeVHr|nSyss#T&m26ulk47pnx7 zcB5y!C}aA(N^jt4OtqRb!j70GN;+j-W=K}3M1sr;RG!TAs7s8e{cc*H8516jlAt^1 z(EonO!As9U9rD`Q{HlN+HpCD5-e=f^kxaw%;#^_kZgh^Xi8#&z1g}bv5d1HMoxP8@rWVm1;@){lLr8HIXxngC*etb`(DTMCuN*4nHVP_mT>AB< z&IMqvnqN>>ntV1BC7frfI;7DH*?>7tOC*cB)pF>6+tf@JFW+bvFt(`y8i9?uC`^D$yW^p~kV?B!))k{58|%TT_|F&RNfC zYG0oXAAdr64qc3`_Nz@@MWp(!55cjNiDf;#%M9dp6;{h6wc7tkcb$(1pXtZS{NhXT z^iWntk5gym3*RmH1_`8&XB643u3de4<7}!nRnM|V-jEjRe$-Fempn6`^?cN=9w_iz zzAEhExguqjajci`3+;T8gGSXbymLwHtM$sf$+q+d3Or*Xzq%%KRp){SyDBY3&_{Fv zQP}yAVdx$eCbeXa167lcTe=Nb(^aBu8k2*d@-x&gK+WMcL*FD#{+pqs+foqh!pm~h z2rv=mHDc0dTZUei<^(66r+nSw7q&K*QiR4S{S6fI2=dE>DVWCqCqfh0>d!bT_3iz5 zM)_F!s*YXzMTAC`fgZO#<(=B{ROTMxse6W$4~qE`D|@9|@DpQt^qkpT4I~J}kUy>y=Y!(gOM46z9wZ34 zN6qwQgBeG64@vu%?dsF`Owf&ZuIO)u+zOP?JN>EO5r$GSv%n6HcDqQcM`KY$%hH0x za2sGlM0-?9pNJp%G_d$0YnuHb43PDcJ({S)t-buAtMm6@l95bTlU$z9sPA?N!!m@> zLJ<$JLR&vS)?esHD^{ZhyvofP4_Yo9`W~#j72Em0Eg`f8DYR+mEI^p}>fo&VfaKQ4 z8+{S@)}K=WyfXkSwImv)6IafN-sTzvvM~0N(ZsR*X!q14{5Vw(T|^Toy)z?>?f!Cn zWCmfXMM}~+-5#SCq)|mS4eL%aLh`}`q<}@ENFg6y-w|`VVbe&Yd&rk4a)?QR2MnAO zz!3ozGYuQ&G06jXgwaih*jp)Ip}KB^+ChCMd(V1`gT`aRrUND6OR#V{;sn3il9e|m za`J^=svYU_9p@+6yo2v#<*p5q?!@fF=BTQ}BHH zZ5&sT|Iu4PfB0M^G(tV5Ot(jZHV<7J*@Rse#Fm;?EIeskqti3&U3#J}zf9j^IO;QL@_ex^v8?{vdAnvg;{s zv7=|#$~3oxs+?}k>QiVO;jy&>rr9yz?!S7>)t!of73fZ_PT4Zs$yy6IuaO{@dvHh* zJ6s)*zl$N6)1D)>ucy8pr@xOrA~mP`fLZhUs*0Ib3!k4&!G0Q|vvyFO8<@;X8A6sS zzXuRHzxII3bh8ceFjl1vsQ+Wabo#_TAKE!L7WDkwTGh)A+bcf2b8lKsu@@r@@?Sg{ zk6yN}wV3AV1o!cH=Ty@!_wsCfgXcZ!<&a*IeT9DGj<%9HE9ys(@z|3VIbaMcR{d*s z#+Pge1lJYUEOEv!W&QUnQ|m8v)xP{-mwC0BLuC|{!7m}`!_NKH(|H&sr`h5UWN|j9 zJ*A~;9*^C`K~gXYKqG;7cF&W7VG7Tw5R;6CFwt+n3WhvN6kI&0zWl+O7RD6>u&V9m z>@=O0fe?diJTvebfXBVO_JwcVg&Tb{o^8cBa(P9^a{zu+CXe64wF#=HUz(rZ=@4bn z=rfU#gadt{@mECn$HPS4)(Y$u`UNOo;olp)tYh6SRz+G2EN2xco*#tH9$?v`5F`hD zJ%b$Kf_e*9^$QHMuC<=Frd2kl@_$`%4i5vqR#zOn;eSl5Q|X3lmZznz*u~&3APIjN zue!7fTWq^Ge48=IRBNLI&8Ay5ofcgk%S?Qg4rUy{%<-Up)>9z7t;`SXiZI%aX}Z-8 zQW9K%O+Jp0TDWH$_WQa&8dzMSarN0vgZk>CRHp;7JDq10rowb#;y{_zka^d~kaI8n z{`&!rXG1_r?ziM&l15x_yRt1lfB{VgR_>3A(e1=C=0c2^-q+VJjxEB_y0CZ{JMZY6 zTHi%w)cJvWPkL#A8o|o{YY|ss2wuy^kTga*_?OF?$h^ z*m=fy*{Aza%K`;fV}USW(Mx^tY_gyu)#Gb^DW(8djeUqei&FKT8mJesqq(F&&iM$-fQpJuTq*cX{D`WHYwJy-@SY^YdqcO3UYFa@b^m zo-i5MIWNi6&Y?<$Jt2w!RcBVyvlN!MS8GlrZWPrU1&!8i@cMo%i3m{dy z53OJFLK;5%@* zrDE9GIh9u!!?gzvCIx3uLdHT-dRpXTutT~!@P`hO zx45)Om(XK_&jSU@7-jq5I=or?pNWs}6_4+g62IfR!7R;uXfITWAR13Kvf91YhV}v%m-g(RCGw6ESTL!y#_J|-hle<^o zOOQTD&_Q)!c#(QCS@3Nw@HL;2A{~Xtef?c^lB+mD5jsaQkN)VcUlIa)g8y_5a_g!| zdw>ivO(pyt&v1j?q4_#H!F0rh$oyQ-XOfp@mn4M6UMSXX$`A6qmAX;5n^5)k`&3a& zwTlAqo0-~=IM`BStKUw2TA7*BZZ>Q&Y!01@oYI&Iol>1LZ#H*bcdh2xKmvb#-_CEq zHzrmvD;^u38@3xB8|^E_D_^FJry8$atA-D@F5J8B(eJv`ln6I%@m<%bcH6_6HSfav zy>`0RtBRV7ng?A{+OE6qV7~=yByMD^oZFCLW9#D*U}GETH)}Fm)@boeyBQY3$(DNi5<45=>WJmW;bhYy;NG#lnSzxw8wp>odF<4F3)*lu{W1J; z4&X;bW1rmyuI(WJuYm&=!ust{x%>P7Wh?YxohirnID`)2|a=s9puOS$*Yh$la9 z|7kilwx6(J`{^)Ia zGB>~)nlyReW&=A^Zt4boHZr;!WSBED;xrf@Ffvk{H{BUYkBxUm^vup+)Rg&loId(? z#O^-63*Bzm7?NQ(WsHn=>B7ipmnw~R%LK#+yCu@dXjdNWDk~@zc2(uBJTOS4U3su8 z4-9dzdy3qZ2ZlJ01AVDO&;8(o6B|io_qd0)|x$iDD#JJFPt#{hq3z~of}Qs zPa7K-R^AKrem`#1BGBRU|Fp2U>V4ur|MD@rUiFjURarV3u1AC*yS&m8)8TvE7kU-!?KbW$;}315rJmV@27=C&Qqr4%6+Ng zGep@5x=AD1p1^Trn#g(Wdf4n~3VwgS`Qpo8ZnE|@>dr>w!-R*KJ}{wxiRe@xEsY_2 z$EF5_*La?V?5?#L{JD|*h}Qt1JxWHD`_9khh4eYqDUx(4xfbyU+oD8b*Fmd`ye#^& znwk^ZBcWCdu2uMbl&W?4=8>&^>!N4%T#@z;>m2l+{#Gl4FQyZB%fUF^K5xe2<377} z-l+C-*4|!$;On_4{#U{g`<1)B8#@0|XI0$fn!Ubju9|B~iVq3fBU0t)SB3um4 znpfv2*0q4u+UNl?5%CAt*VYN8QkU1a5|%|GvFZiwpEjGcx$ufOa4%XC)uAd-p1~Y~ z9=m*P2T6|Bfwkul2GgPX?CFyU?cUIrxOnXu+#0Cd!!jzb$9u_&&e86Kd6bzqsH644 zo5KdfUs)U0|67)un0t`<;pG7HCq#-tI@$i+@56EUKAJ$f1%)_NCJ?db1);%mgpb4(*SHv`92qG2KshPI^&&xUmK z<;l(0Sd}^l#C?16;hr@R{6v4L4XGT&q!BbiKQJXD#AA%sVL;aD+53=da|P3aO465! z8@^jGjVO-(qfdOr1Ks=c_Dg**V%_q~*o4x~P5tfTFyyb<`n!qJdnm;R^+@Rhty}IT z=q3H9ccN#DY_auTdA*dva`Y3SCdC=K_VRD8QJV@+xoM^(|6co><+NyYlJfCZ$X3S= zC_9@fKq>a3`SVD{LA@pJn`?h=uH;vJXSDrdW!RR;AFVp>+$(C|@!j9xyOaEYZuQlW zs~@*Db;R^V3e&w>5P+#D?sJP%1|}4#ou=_5MAZ0MZ-Lcpvb*m%weOiMWS`dp&IkE& z(6y;LjchWjJe%voKW(Vkas z0Uvr)+tclWGNeUI+S|Df8qTFP+CyNUN3pqL7A*m?$hP6tC}q~#<=->n6mRrZ z(G$9lLtSmg&rT+X^zd@DaKc<7G~-4cKQieu=nn5QYn;NvW5GL{zU++Wy$T!kP2=zi z2Dm|yTSakyBg3LZ_t6f;(II`t&Z+?*Xp679eKZR7s~Kx%Gohq_>*wjVo(xhHuR*x6XQ**Ztja;p;bzcq&v)h2b)!9I! zsW?d2fqpJ);MtRow%jMa48tmVwGY;4542Yhl@US;gkBqr`#1FdMa2i0pKBNH4n{8Q zC2|%f@j(Qh8>0GQeSZ!TEY~}Q6P{ZjuCW~JxlSV#Cy(p$W7fU=2V{0B`J?K<>p|g} z;)MI#<4+@-Y3&kk10;Xkfkf9-^k7n5j9KFR$4Qn|`O87iWG^HLcn34gRX^+Z&R=^` z&Gphfpon3p#{R4ctw}=Z7K0J<3E1Utx|_OKF^B za1rcSeklNK*riK!#}4pjsKqH4qU+TXORZ*YvVnpRn@#g!(|T2{Rd*abh%6d#aLcOG zkO(Cxg;@I`i061|-Ef0_zT=(R8z^Z-r!F&hpR?+0m%z%bsW?e^F+~W}h>{fWweEw= z5gof?X?a+j5>)$0{l&bg+(0x0X7sJhHeC-#quAzW3?!CbR1E^I z`K~dMVQ`J$Q(=xv%XNZW;Hfla3UQk3fe{r-SLsr995z-XO0CRG^9nECuDqx+>k?$( z1Q#O1_8056?EHAKVB-D7R7a1L=RX1wLst;JJT-l9D`$~BJUnXZ$qCXPst>q+FdruG zBQBUxkIJ0s{Fae@b>Ovu3(9by{9R=KI-FQN2t%y%K^pZyOAS>r=&5*vwyQz@3Tz(r z4ZLn~QE&rHEL~LOQPiFK3kk)Gt{Pilj|{6xEOl0@F=^|F>YysByR4|2qCUcc*ZBXs z2E6Y}MQWoS zf=UmMU`G~KBS=qlvbzjPSR9zHKhx#^D;WqzHmGI5w>pXF81~GH3@GTby6#x8+()=bTbehvl=dHZ42rsos>(o{AifIg64Jty;i6ad~ zcPRHHTpKD+9@eo-7>%v30aK6a;;Q3ttRgojBj{?0O~V+U{v43gH+n=rGP|Qisr!e} zeTikABvy1e=-)M@K@eG4q~cNPur4;mvFE`%NM!UqpPzly+NMP`(OgF~UjgsOf)Q2J zi%rR_UgZ)5X)X*4zlEOWd`fvFG@Vi}VDMYvWqzuy$nNpWXnD(ROWAd?x8NJytR%0I z+@^zZ?QrB|X^E!_XsZR2H)f-SBOZ;*qgiy*n2ZpYPRR6!mS22nSV48>WW6+UH5;~4 z?7B*In&uX`XuQwEHEuX$L=5xkd{nR$Pj&{oMPrg6xHfuT4q%nHUJ-+@*5KDBDcSI4 z_TlqzqS*{A_f&(_&YPi`RO|y2%kgWnK}p5IjQENJ?;7it;0WanWA1B{-z0|2&2Pc4 zRuL7Al4Qa;vUfF~*eHb*hZ!SKc1hn7M!i4WeAhUBN?fWh3tJEC;-76>sma7qC!)sx zCLFO_QYXb=${wN-=lb@Tr|c)xU=>%LM0Zcn7_)407&7_(++*@zA>04WCv^AtNqqYo zDM1cNmgSekWcbir-UKu?7d0LTCRQw|hly#HP{@SBM1!vuSD8;+Ha^I|_b_t7R0IYx zmd|$u%GUc9R9A`~kUxqN{ep&_0{thG&4TKMR*$_~+A%4t!8KYi)3)68mVxpAuid?< zdMSQVT(0$PqS*(e$uSitmR}xyOdn?lqz&;W)n>SX#o6QokmY?aE@b&g4mNnpni}{k zX47oTD1K6n4qX7G+LX%0S-`@hbR_Me>C7i@tzD3O!E!WE(B2)r=Olt9WD!KEoY;}Y zk3wx2LNaD0V}k4!#Z8-%Th(F`Vlv{d6B^acjeYye-3G0^CgpB98a&#$v+AGLI9?}- z7JUf3s51id%slDZ$Jzp znLlje1sNkl9*`)DUmmv9WwQ9VtV#UeMzj5Ep?X2+FTn9{qb)85$S$KNriPO5LwdAM zrFN3d=t7}7hu6cVMRjEB9>MW0ku3nrx0`X2-NE_G&Ta?;5jfW1JHU!x(9OJPSBeI7 zXP`CZ$~Wv($S3ExRPn>sM=eto$vaT6i>xGkSW5Ls_3}a7Dr;c0+ zCLr*Hg3<_KFk$YY1V_dRF9<_;Y_dNrP#d<1k01e~wr_^cs16}l- z4AK(;eJ{#Qb9zJg0p|L1Sl7e<@rW6IZ!x(&ItFkGzn7(skRN5lr@2XenzBf)kg?NE zg+yr(HGpxhZ))q7*Su|cy*h9+D7>g0y>E%+-Xpvu`9ing3e`3k3zoIaK0*JxN>Tx@ zqB_(jSB?(Youj?1fEz;dcWUbqtBQfY=%#s|%3%p^TTkuc|2ZT{b{_#EsDf;08$Hg>pevw2f#%>$tk=GA{$_ zl$L9~*}9|WrJ3eiZkk)k$E{|BBW`h$ycxhBVv-3O6&;&O8_n+0^@wi06NK_|9V}D; z1nHB|h+fXaS46Y*0W4CfMoWQ+@+3i0Ji1l5NRDW$7FudQ?;6ZmsgegW))jUeFA@Xr zLx-Cx+9k`J0XM0C+H*X~Ej)dF)4L^^oaY|mpFY$^wqs+(7nCi+kv%VV&U^nbHWvC8~dZ z)FZOZ2-!y!iPXaf$SAP6M*Tm&uhsN|p)6ysN%abFpoLZ-I;6!X&~8z#RP)L4^Uhf1 z>6{gF!1`)=W*eb24h#UowyaU9<k(g$SfyyrSk4*Joj01XG!lE5%iDyLDGKYzEI zFoa+T?X@?Xa0DVRPF;X<)lh(A(}FjWk_(cR3@LqoV;>Bqf@F4&fMU6LBiFOTO>;&c zC@Wo>M3#bD%%(-upuUI0AeBU8Uxsuj(O@0~+nIjO+k@_^6N2UpzL(v|TOgrA?V%G{ zmik+h^3=T<%kYBo9MvzvM(zPEDc4%g6-e$GPmmm{$K6SY+PPo;tPklz%G_A{4uLRX z&c_}VmSor1Gfmr5q*CLQF4-ZD9gkWobtVbFaI}|L9)3gA z$9)b|Ub8kE@Vr_mo?DkyC-Kx(3!tXQM_iF`0*N?WLGvj7FJJ$!sDSs-5ixo>s;ukrkHLaIwYuRkwy`*++q!7>xDHM z)Y)J&9BTN@x|_K?h(iTHW8VTG=Xipb(BDI~JG`bwWkdRQZU_?9nh3IWb)eKP)TK4B z;FM}hxZ#4_iSixu$NV=Va`#{4_o@I(FmltBoxGk{+5vU~$ZGoftV+$CUAZ06!?Dz% z&(8%lYLP62^ITq56~kjm4PO_8L85AHG)9X>JIj&R!;q=%(Wums;ZfUDs!~iwK2r4? z;N?5MPRiP3&mmJDwFO#Cs4Z5J zoU<62P~@jNq2DuG-+D`L&+;5AI;DuJM@BSi({qgqi23ZI4#lYc(|OMcb&EArSD>~G zay8qSlKl55lq!q)4_VH>d}D0t-+9OE#TQkbvg;DvNw_Cgf%-pCBthFHhns%N$kN@;wSOTExhUG^ z;RDh;rt}~9a@R@6dIGMSm8Tq>9$z5U4~IFFD$i#}(<>n<_B+Is3 zbvmS5M8nj$Q`CQI!jcnc43!`<%%fLCRkySXY$Fq^sXLMK)DS6ep3(Pqx&uRLKC>?) zD9NTs{j+`(@i;ef)LG1b_zG*uuF$AH51oE;kU1!z!Se^V=rl*S~=sP(?YVwa(FGVTun_y*vW4Y-@!0Ns4o*SpkvIsXaRB@;Wy6f`J$B z8F=wbe*q$$^>aNBmb1uaK8!{wQ(YG=^2e6tn1)@KSBD=>X3#u;MW3% zyBsOwLmbO#xm+RV__=6InO9%+n=L9Gn!Xqc0Z-AVpUrzr z=zMS}>5=ow5wumKHiP9Du|vv-et(xQ|D4tgaqW4x799#hDcusXIxaCCVf?B@X;qxk zG0>AZE>|R5VbY%etWWP655$eXZ6)te`-dCiMzUQ?P5Y}M6E9NH8>oMa+A@p3#-=Df z8W}Q08K8o_|JG8$kTNvabBq?F4nZmMfP-v9*XU`@!<|i7PLk?g=$%8YYj~OH?>D>o zFLXoz#je_^)ti!?e@HwnR0gu%+lEuQd1UjZl1rGv;=aA{Bzwa6Ev7@ADuQf_Gz7ta zq~Q$?erR4hsJ99SGiERq?HDM<%6udhc*EBHG`7=)e_DtSL8i9tAbMeEiH4`Y-XFBH zzlP}s|J~_bOm+ieCkA%2;Vlfi3}Il&U3&cATpKpG)&K7oWlW%(3cFX>3>fU*aNoVc zW{88`8}7ST*q|`j{Q}&-dWCH_Wel{jd+T#IWuP$l*KU38rp*7^l$kV|#{Ju=