From baa91124d55007b0a8af4eaa27346120fe4b9ea5 Mon Sep 17 00:00:00 2001 From: taherd <183945978+taherdhanera@users.noreply.github.com> Date: Fri, 22 May 2026 23:40:03 +0530 Subject: [PATCH] Add geospatial sample provenance guard --- geospatial-sample-provenance-guard/README.md | 38 +++ .../demo-video.js | 173 ++++++++++ geospatial-sample-provenance-guard/demo.js | 18 + geospatial-sample-provenance-guard/index.js | 307 ++++++++++++++++++ .../package.json | 14 + .../reports/demo.webm | Bin 0 -> 76921 bytes .../reports/reviewer-packet.md | 46 +++ .../reports/summary.json | 158 +++++++++ .../reports/summary.svg | 16 + .../requirements-map.md | 18 + .../sample-data.js | 85 +++++ geospatial-sample-provenance-guard/test.js | 90 +++++ 12 files changed, 963 insertions(+) create mode 100644 geospatial-sample-provenance-guard/README.md create mode 100644 geospatial-sample-provenance-guard/demo-video.js create mode 100644 geospatial-sample-provenance-guard/demo.js create mode 100644 geospatial-sample-provenance-guard/index.js create mode 100644 geospatial-sample-provenance-guard/package.json create mode 100644 geospatial-sample-provenance-guard/reports/demo.webm create mode 100644 geospatial-sample-provenance-guard/reports/reviewer-packet.md create mode 100644 geospatial-sample-provenance-guard/reports/summary.json create mode 100644 geospatial-sample-provenance-guard/reports/summary.svg create mode 100644 geospatial-sample-provenance-guard/requirements-map.md create mode 100644 geospatial-sample-provenance-guard/sample-data.js create mode 100644 geospatial-sample-provenance-guard/test.js diff --git a/geospatial-sample-provenance-guard/README.md b/geospatial-sample-provenance-guard/README.md new file mode 100644 index 00000000..de436433 --- /dev/null +++ b/geospatial-sample-provenance-guard/README.md @@ -0,0 +1,38 @@ +# Geospatial Sample Provenance Guard + +Self-contained Scientific Knowledge Graph Integration slice for +`SCIBASE-AI/SCIBASE.AI#17`. + +The guard evaluates field-sample and specimen location graph edges before they +appear on entity pages or public discovery recommendations. It checks coordinate +ranges, CRS normalization, country/coordinate consistency, coordinate precision, +sensitive-site redaction, voucher identifiers, dataset DOI resolution, +collection-date plausibility, and sample-to-dataset edge alignment. + +This is intentionally separate from broad graph extraction/navigation, link +audit, ontology drift/alias/synonym controls, relationship conflict arbitration, +author-affiliation disambiguation, artifact lineage, evidence freshness, +instrument-method compatibility, reproducibility routes, recommendation +visibility/diversity, negative-result replication, measurement harmonization, +claim qualifier, ethics provenance, funder award lineage, clinical trial +registry, and software/runtime compatibility slices. + +## Run + +```bash +npm run check +npm test +npm run demo +npm run demo:video +``` + +## Outputs + +- `reports/summary.json` +- `reports/reviewer-packet.md` +- `reports/summary.svg` +- `reports/demo.webm` + +All data is synthetic. The module does not call geocoders, repositories, GIS +systems, ontology services, specimen registries, journal systems, or external +APIs. diff --git a/geospatial-sample-provenance-guard/demo-video.js b/geospatial-sample-provenance-guard/demo-video.js new file mode 100644 index 00000000..fa05eb47 --- /dev/null +++ b/geospatial-sample-provenance-guard/demo-video.js @@ -0,0 +1,173 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { execFileSync } = require("child_process"); + +const reportDir = path.join(__dirname, "reports"); +const outputPath = path.join(reportDir, "demo.webm"); + +const chromeCandidates = [ + process.env.CHROME_PATH, + "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe", + "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" +].filter(Boolean); + +function findBrowser() { + const found = chromeCandidates.find((candidate) => fs.existsSync(candidate)); + if (!found) { + throw new Error("Chrome or Edge was not found. Set CHROME_PATH to generate reports/demo.webm."); + } + return found; +} + +function fileUrl(filePath) { + return `file:///${filePath.replace(/\\/g, "/")}`; +} + +const html = String.raw` + +
+ +recording+ + +`; + +fs.mkdirSync(reportDir, { recursive: true }); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "geospatial-provenance-demo-")); +const htmlPath = path.join(tempDir, "demo.html"); +const profileDir = path.join(tempDir, "profile"); +fs.writeFileSync(htmlPath, html, "utf8"); + +const stdout = execFileSync( + findBrowser(), + [ + "--headless=new", + "--disable-gpu", + "--disable-dev-shm-usage", + "--autoplay-policy=no-user-gesture-required", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=7500", + `--user-data-dir=${profileDir}`, + "--dump-dom", + fileUrl(htmlPath) + ], + { encoding: "utf8", maxBuffer: 30 * 1024 * 1024 } +); + +const match = stdout.match(/data:video\/webm;base64,([A-Za-z0-9+/=]+)/); +if (!match) { + throw new Error(`Demo video generation failed. Browser output ended with: ${stdout.slice(-600)}`); +} + +fs.writeFileSync(outputPath, Buffer.from(match[1], "base64")); +console.log(`Generated ${path.relative(process.cwd(), outputPath)}`); diff --git a/geospatial-sample-provenance-guard/demo.js b/geospatial-sample-provenance-guard/demo.js new file mode 100644 index 00000000..97c3730c --- /dev/null +++ b/geospatial-sample-provenance-guard/demo.js @@ -0,0 +1,18 @@ +const fs = require("fs"); +const path = require("path"); +const { project } = require("./sample-data"); +const { buildReviewPacket, renderMarkdownReport, renderSvgSummary } = require("./index"); + +const reportDir = path.join(__dirname, "reports"); +fs.mkdirSync(reportDir, { recursive: true }); + +const packet = buildReviewPacket(project); + +fs.writeFileSync(path.join(reportDir, "summary.json"), `${JSON.stringify(packet, null, 2)}\n`, "utf8"); +fs.writeFileSync(path.join(reportDir, "reviewer-packet.md"), renderMarkdownReport(packet), "utf8"); +fs.writeFileSync(path.join(reportDir, "summary.svg"), renderSvgSummary(packet), "utf8"); + +console.log(`Generated reports for ${packet.guard}`); +console.log(`Decision: ${packet.decision}`); +console.log(`Score: ${packet.score}`); +console.log(`Findings: ${packet.findings.length}`); diff --git a/geospatial-sample-provenance-guard/index.js b/geospatial-sample-provenance-guard/index.js new file mode 100644 index 00000000..09c037da --- /dev/null +++ b/geospatial-sample-provenance-guard/index.js @@ -0,0 +1,307 @@ +const SEVERITY_WEIGHTS = { + critical: 34, + high: 22, + medium: 10, + low: 4 +}; + +function addFinding(findings, severity, rule, message, action, refs = []) { + findings.push({ severity, rule, message, action, refs }); +} + +function daysBetween(a, b) { + const left = new Date(a).getTime(); + const right = new Date(b).getTime(); + return Math.floor((right - left) / (24 * 60 * 60 * 1000)); +} + +function datasetByDoi(project) { + return new Map(project.datasets.map((dataset) => [dataset.doi, dataset])); +} + +function datasetById(project) { + return new Map(project.datasets.map((dataset) => [dataset.id, dataset])); +} + +function sampleById(project) { + return new Map(project.samples.map((sample) => [sample.id, sample])); +} + +function coordinatesInRange(sample) { + return ( + Number.isFinite(sample.latitude) && + Number.isFinite(sample.longitude) && + sample.latitude >= -90 && + sample.latitude <= 90 && + sample.longitude >= -180 && + sample.longitude <= 180 + ); +} + +function countryBoundsMatch(project, sample) { + const bounds = project.policy.acceptedCountryBounds[sample.country]; + if (!bounds || !coordinatesInRange(sample)) { + return true; + } + return ( + sample.latitude >= bounds.minLat && + sample.latitude <= bounds.maxLat && + sample.longitude >= bounds.minLon && + sample.longitude <= bounds.maxLon + ); +} + +function evaluateSample(sample, project, datasetIndex, findings) { + if (!coordinatesInRange(sample)) { + addFinding( + findings, + "critical", + "coordinate-range-invalid", + `${sample.id} has coordinates outside valid latitude/longitude ranges.`, + "Suppress the sample node and repair coordinates before graph publication.", + [sample.id] + ); + } + + if (sample.crs !== project.policy.requiredCrs) { + addFinding( + findings, + "high", + "coordinate-crs-not-normalized", + `${sample.id} uses ${sample.crs}, not ${project.policy.requiredCrs}.`, + "Normalize coordinates to the graph CRS before entity pages or recommendations are shown.", + [sample.id, sample.crs] + ); + } + + if (!countryBoundsMatch(project, sample)) { + addFinding( + findings, + "high", + "country-coordinate-mismatch", + `${sample.id} coordinates do not fall inside the expected ${sample.country} bounds.`, + "Hold location-derived graph edges until country and coordinate provenance are reconciled.", + [sample.id, sample.country] + ); + } + + const sensitiveLabels = sample.labels.filter((label) => project.policy.sensitiveLabels.includes(label)); + if (sensitiveLabels.length > 0 && sample.precisionDecimals > project.policy.maxPublicPrecisionDecimals) { + addFinding( + findings, + "critical", + "sensitive-site-overprecise-public-coordinate", + `${sample.id} exposes ${sample.precisionDecimals} decimal coordinates for ${sensitiveLabels.join(", ")}.`, + "Round or redact the location before public discovery recommendations are enabled.", + [sample.id, ...sensitiveLabels] + ); + } + + if (!sample.voucherId) { + addFinding( + findings, + "high", + "sample-voucher-missing", + `${sample.id} has no specimen or field voucher identifier.`, + "Attach a voucher/specimen accession before the sample appears in entity pages.", + [sample.id] + ); + } + + if (!datasetIndex.has(sample.datasetDoi)) { + addFinding( + findings, + "high", + "sample-dataset-doi-unresolved", + `${sample.id} references unresolved dataset DOI ${sample.datasetDoi}.`, + "Repair DOI alignment before graph edges are emitted.", + [sample.id, sample.datasetDoi] + ); + } + + if (daysBetween(project.asOfDate, sample.collectionDate) > project.policy.maxCollectionFutureDays) { + addFinding( + findings, + "medium", + "collection-date-in-future", + `${sample.id} collection date ${sample.collectionDate} is after the graph packet date.`, + "Hold temporal graph edges until the collection date is corrected or the packet date advances.", + [sample.id, sample.collectionDate] + ); + } + + if (project.policy.publicRecommendationRequiresDatasetDoi && sample.publicRecommendation && !sample.datasetDoi) { + addFinding( + findings, + "high", + "public-recommendation-without-dataset-doi", + `${sample.id} is eligible for public recommendations without a dataset DOI.`, + "Disable public discovery for the sample until dataset DOI provenance is present.", + [sample.id] + ); + } +} + +function evaluateEdges(project, findings) { + const samples = sampleById(project); + const datasets = datasetById(project); + const sampleDatasetDoi = datasetByDoi(project); + + for (const edge of project.edges) { + const sample = samples.get(edge.from); + const dataset = datasets.get(edge.to); + if (!sample || !dataset) { + addFinding( + findings, + "critical", + "graph-edge-endpoint-missing", + `${edge.id} references a missing sample or dataset node.`, + "Drop the edge until both graph endpoints exist.", + [edge.id, edge.from, edge.to] + ); + continue; + } + + const declaredDataset = sampleDatasetDoi.get(sample.datasetDoi); + if (!declaredDataset || declaredDataset.id !== dataset.id) { + addFinding( + findings, + "high", + "sample-dataset-edge-doi-mismatch", + `${edge.id} links ${sample.id} to ${dataset.id}, but the sample declares ${sample.datasetDoi}.`, + "Rebuild the graph edge from DOI-resolved dataset metadata.", + [edge.id, sample.id, dataset.id] + ); + } + } +} + +function evaluateGeospatialProvenance(project) { + const findings = []; + const datasets = datasetByDoi(project); + + for (const sample of project.samples) { + evaluateSample(sample, project, datasets, findings); + } + evaluateEdges(project, findings); + + const severitySummary = findings.reduce( + (summary, finding) => { + summary[finding.severity] += 1; + return summary; + }, + { critical: 0, high: 0, medium: 0, low: 0 } + ); + const score = Math.max(0, 100 - findings.reduce((sum, finding) => sum + SEVERITY_WEIGHTS[finding.severity], 0)); + + return { findings, severitySummary, score }; +} + +function decisionFromEvaluation(evaluation) { + if (evaluation.severitySummary.critical > 0) { + return "block-geospatial-graph-publication"; + } + if (evaluation.severitySummary.high > 0 || evaluation.score < 75) { + return "hold-geospatial-edges-for-curator-review"; + } + if (evaluation.score < 90) { + return "manual-review-before-recommendation"; + } + return "geospatial-provenance-ready"; +} + +function buildCuratorActions(findings) { + return findings.map((finding) => ({ + priority: finding.severity === "critical" || finding.severity === "high" ? "blocking" : "review", + rule: finding.rule, + action: finding.action, + refs: finding.refs + })); +} + +function buildReviewPacket(project) { + const evaluation = evaluateGeospatialProvenance(project); + return { + guard: "geospatial-sample-provenance-guard", + issue: "SCIBASE-AI/SCIBASE.AI#17", + graphPacketId: project.graphPacket.id, + entityPage: project.graphPacket.entityPage, + recommendationMode: project.graphPacket.recommendationMode, + asOfDate: project.asOfDate, + decision: decisionFromEvaluation(evaluation), + score: evaluation.score, + severitySummary: evaluation.severitySummary, + findings: evaluation.findings, + curatorActions: buildCuratorActions(evaluation.findings), + safety: [ + "Synthetic sample, dataset, coordinate, and graph-edge metadata only", + "No geocoder, repository, GIS, ontology, specimen, journal, or external API calls", + "No private field locations, real endangered species data, credentials, or live graph mutations" + ] + }; +} + +function renderMarkdownReport(packet) { + const lines = [ + "# Geospatial Sample Provenance Guard", + "", + `Issue: ${packet.issue}`, + `Graph packet: ${packet.graphPacketId}`, + `Entity page: ${packet.entityPage}`, + `Decision: ${packet.decision}`, + `Score: ${packet.score}`, + "", + "## Severity Summary", + "", + "| Severity | Count |", + "| --- | ---: |" + ]; + + for (const severity of ["critical", "high", "medium", "low"]) { + lines.push(`| ${severity} | ${packet.severitySummary[severity]} |`); + } + + lines.push("", "## Findings", ""); + for (const finding of packet.findings) { + lines.push(`- **${finding.severity} / ${finding.rule}**: ${finding.message}`); + lines.push(` - Action: ${finding.action}`); + lines.push(` - Refs: ${finding.refs.join(", ") || "none"}`); + } + + lines.push("", "## Safety", ""); + for (const item of packet.safety) { + lines.push(`- ${item}`); + } + + return `${lines.join("\n")}\n`; +} + +function renderSvgSummary(packet) { + const scoreWidth = Math.max(44, Math.min(760, packet.score * 7.6)); + return ` +`; +} + +module.exports = { + buildReviewPacket, + countryBoundsMatch, + decisionFromEvaluation, + evaluateGeospatialProvenance, + renderMarkdownReport, + renderSvgSummary +}; diff --git a/geospatial-sample-provenance-guard/package.json b/geospatial-sample-provenance-guard/package.json new file mode 100644 index 00000000..43670862 --- /dev/null +++ b/geospatial-sample-provenance-guard/package.json @@ -0,0 +1,14 @@ +{ + "name": "geospatial-sample-provenance-guard", + "version": "1.0.0", + "description": "Deterministic knowledge-graph guard for geospatial field-sample provenance.", + "main": "index.js", + "private": true, + "type": "commonjs", + "scripts": { + "check": "node --check index.js && node --check sample-data.js && node --check demo.js && node --check demo-video.js && node --check test.js", + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "node demo-video.js" + } +} diff --git a/geospatial-sample-provenance-guard/reports/demo.webm b/geospatial-sample-provenance-guard/reports/demo.webm new file mode 100644 index 0000000000000000000000000000000000000000..b8f79e02e18aee9a786ba9c0dc6efdaf6a6b2523 GIT binary patch literal 76921 zcmeFZbCf2*wkP_PZQIpl+qSJPbyb&be`VXYZFkwWU0u~>Td&VM=iZsQbKksKv)24~ zV`WC}9o+HTkr_KOBNA79r!ZF}#2-ZD>F;^#4=!@&4=oZ9
T;Mf96R9OiTwgPF&L~>ud zz3uh$Oc0vDSl54atiSzB0Pwj<$~2zc>hGwcsv>eh#?2JfBAyB67z%VOE_u;~Oqx*& zE)XBA7~OnMm$m!>v8G2Y6^NAyadXwGNZ)+=t#7=Z7QN$S8Or(_RT8;hD92gY^Q}W^ zm4Mr9Q8zB`d+kFFv~my}u1Km-$2Owj@Yp7I!M(aCPs`RDc zWMla6D80$_cg*^Gfhdb6aI@0&%KN`gE|}TWLwUL-7r9rJp3C3^v~_Pz;;cOF3*V^T z3r%>ipo3)@Ioi > xqIkn;)?0 zvCwUCGpN{yTCrwtf?qHzM|aqQLW&vTja;o9fLMJm@z=z~MX+eXT~u5*SFFi&u&tEO zTTb(=MtJ(Uc2)n_v~j= if6UXNs=?N_2UpT6uwIFJMOYez2Q+jd%*|u^g96FJnYu>3G6=9^v )+z+g>+s4H^Zh0N1r>>|y+ZtLob;i8 +QcEw zJqjNJo*?N|vC*S~muL5lsuQ-#0d73%Qi7@lwOp@*O)rO72&`{~&QHt93!C6-UZHW> zYu?&>l z66Ef3LV=ONyKI`(m|34cg7>7(psj}#{oH{zVND_txey14w#LhJOuo_sZixCahSFc! z;!8&lMJmz#7mbp=ahai$Rf))Z6Jv5Pf@f46UE56&%5C3U%%4%w>|c@-jPbcWsQtfv zm||&WF2~Do!nI5hfr{7?u{6kuhB8txk$+VcoZflPQ%mf*t`+V|$qyW9NQc?~J}d#x zeMtJQpZ0-2**Nvf91Qt7VO|d_Q>c~x%W>!FzxSMQu?WDXhRZ7;AT+zFi0M{rdLLGc za|BxPhWP#U?%0)^1KIid(Ab0Ci{_2nb<~2*kjjeR0!sKnsrOZS`-S7=t0NLVZ@n)I z_0j)?-n{uOtvnyQLjzoq78YGLxK>;~{gyTP%}-M?R@k{E(&j*aza8l0 NM;ugc;c=!|SYp|KYWv-OWKalN z-xZth3c9Q^x>yH9-tvn0NZ-Rm4O8L}aw3dN)RavnWfJ{v-1E(>r$I8EYXZ{lDGkE& z#nxB`lnv*Ndn#ILCqPutjJpA@&%9;Kn-X#5N8Pj+vzQVJ@dlQ;%FvI{VI_G;_zq4& z&M+)7qLYKL0Oq-Y;xBkxpe95c@s7yf8|p!uOABA1n~DsYiX$ZanyYSizI2jpfT`6i z`06Sk8qsWA-L{}H6TWaqre`llS1qyhv8jObOpD#Iv>2Z4`DJw(dkjnBP!PCj!VPfN2q zukBFM*wq@Fx~OGFf)-4s;FC6hsrsXYtHs!E%&VKZ2dXdYcSehVnaY;Zq=?nt&k1ae zBqE6B!o?*Trdci)24$nKvVPo=WY}Nw;9%Bg%cx?|n5hq$Dnc; V$B@cl}rtlb*-omtL%o7`m^vC=t(=#A^P5UFbI)usNN#veyo`k+5*+ zYC=oU{zgr)hqDIClzu*Y8CD#V=7nZm`#Q<){D&HxN`M pjwCEe?A#^!tW z%Yxg-lBZpoMH}eR*%AH8CG>adI8`$7kBQ^3GBkh&r5At=z}8~C$9jc?1V9790RSKX zc|*K7i!z;7ILIcuZwmHhg2o6NoQ5cK;JC32gH#q#@euK$_JEBN(p`}O_n z%L@(jPM7Y12z;Dzqa-3AHti(WiSm%>>-{(us O7>mY! zu2tT`NNfiEMNX(r7xROyXx1Z4P@j$ov1=0Ml#dx1^!UC;yr2)~12KJQ1pW9_FFxM< zZ^EGwf +Ol$HK*$%GdRfaQ>FP%Zw!vbL;d9$uvg8M#s@Kd*1A~u zu5iYaYbwu|V!CU8<2@4oHY>#JQSWmif%)fDQTi%< s3}+S`bnpVA6I>xPtw`KLFOjv7;jQkqWnnlOk<^a|QE#p1 z@Xzx4`)G^;R@)BhENb$Gzp_PZ2S1QmUsDC^?kNJGY0P;c>U6P)s6RX~zrIoaGn3N; zeOROZNJ+y^!|^QQ0Tx&LN2*|D$LXa)S0)1(3VP#16YGlkL7gr*Cq%t-ii iw;~VFFu}^^L*L zbVeWAd6>}B=kLbJn79B}IKvhOu5-+xdF`;K$iGEC>cwZ)n$DcJzn=j
;wJ9 zAPUGXhY`>{sRryUvxChYN&or#_VJSP&ZF-Aqm@?3ec55vsuLu38~djclQ#ib5>ENv zEF@4}Ey2x5SHiaUjAi>4+8k{MA<=!s7(mNxEfB2XRPEGzsxq}j1#42u!7OYzLvr#N z%8>k$RY={HVyt$pRed@z(PH-8Ik< McK%g-d=z}VJ z6!Dd^p;e^juPmYbkZ#afM5JzTC<3NL)o?3{nyfW~!w%3JQXed__5Uel{v+$9FxHV8 zr8?%hhU%EO9ZhPl-qvatKmHe@2B~VN8$OP#_RepgOT+_0PEb>&XkLCil&t|mHK9Vh zxOS~Fv>Q{0kR$kdwk=dqnFM&C)}xp3))ZOkZ^oMsDJ&vd_Hmsc!$PcmW0)ra>Y-ni zV&+{HvY~OM@Z=_5UPUQUS1@B%dap)%vLJ_x_$nB6iD=ol`%Acjk3$6*bZo?3?xL)Y zs$R58Z>4$)ea=4|0OY*GzCul7H?A;JV8l1Y-Pu8?eb!^iPH1?F#Ru?;)RY0^$EWL6 z-Zp7(qQGSGsGA1dT|Xgi#%yxC7lHgN5z6R2H(RpV;=QEb-}sxKgW~BN$|~ Oy|UY!f+gT$0KUw`qo2-RzWrzRE4g|A@aJfVk-HdS}2+ssPzY!MmryOm#NnJsvQ} zx+<{Q)BcePpc?<0`= nGVPC&O1TA0wc%Dp>8fW|Y1z)@> zRpk=lsVazCiRXfEgQ9-SNAkxElQ5}arpz>D=IcC0MCQ5=U+^B=;dbrZEu&2CBx17X zdgC XQK{HM{)#qPnSX)^@k zGz`Yg7dK}c(@oYg*J^xeadB^5NabeSV _sJLkI3w@&szMJDh43Ni zTr)R@{b66qzXLH5Bl5uubdG6dGDJ^!I+tvSd;2}+1e&Mj=mNtbb_UR$H8zEUMQ^-m zjAp1`P!-{NzK2~4+g}{zU6ET?DM;c saYowKge z2w%%0KCGNZ@|Lt;7>ig4#|o4&$x**1Vk`7W@WVgToEK3 *I4h<1_9Xvo$P>UvUL#q0;j*r*-F?bGJ#9hXspn-W%Jcwi>WOG}{@R_o>h ztE_1>&S1Lr6DtO}KTgu-tWyamV?R8u4)-pI%(6tfFV%qYr8y&$Tpiwu45yIB(&ND& zmA`n ZfcD -n?lhwQ%*RrFaH-=kxlJeC2hoe|jK_T{!tO$XB#$Ugb2e~c8g6xu zqtEehmJJc$_NYV-XM}t5o$d gbL#m-M0`3Pubf;nJ7cLqb$9Mun)=%O zkv!>{%?nk=8<#(vLI8nqFd-K*)>v9GP_mx9w6AbA;a>?YXwVRtf!c0~lR>e|=^08{ zuzvVf>k9H-7dV(NK^Uz@-_Bf<#hV3LBmuQ0E>45xP_DaBZ_!e$N5}7x?cv#?P%jZ8 zyCySBujzwUi!GTLC>{wayU-_d?S|AQ9a^u_a!LUuzF;QqK*dO!I=GEi+ LT7E2Es7$my6hKId(DUYZKkkpnPlT{`b#g+jI{72lKrMSTA4U z8621ZMDjPaAe2kl>Ib0|djK2=1PjWk%rpJCAU+95?p@%87{bF>O{<{`4cs*qICy+B z;VS9(W!+PMx?KP!D69$DV)C_ak}sDCnBXzgdKli>*LU0AQ#GtzC1@BjOa3~s&Z^cW zQ0-m-9XR@^WI63_E7iMw5TxHUQZq8=%4f%x|6& 9$og>hkDttqXuL4_oo-gsw9L(wE>%j zH~q*sUt9u PT=1LU9F@3|n# z`(PO$zsdY2H|T?~@6kvFb4^{){|!j6`H3)PY6NtzaZiUW5R<_sN4j$GG0Lj3Ry0Nj z6RV&sK!t@kRr$5qf@Cby*1{{dK+KbbF|eWt)M7N*cTaK`0;^=$;#h>z%V)=MLhmKZ z`xf5&`jMU0*!SggRdv~^ijHlqinYMn`zE``d?DY3I3IAqI1b)J7*pj-gD#*-sp%K| zwnwt}L}+Azi@xsu@Oa_6G!1Lus#bU52ab!$EUvBnB2bkQBu1sy9O*7FRr7@hpjX#3 z)uCraXMy8t=#XSoOuw;;q^UUN>OFwQ7m!GB!Cxuhi9n`?T!VRz{0tjS>iq%a8a(r| zQ^Mp7R`bO~2Y+Is&* {VM?iV_IopxKn^W*~;A1&rCwa^D5~KdgNPRNdaw;Cr~c>qCmW zySr rjHwbmV{Xls3IGr|t+Hi_9fxJ2dPKkmgN+J8D_r|4J4toA1x^l}O3 zx&4&ozXW5_dgpJ6aB)=pNJWc&&`>=>@b@K^VJ-b6aEsQ68eDUfiYL^d+8bzypTt}i zGM|_iG9;Djy+q$wiK=0oZ$*pbS7wKIk^){(vcF;c_@NV;74r)X)^-RKP{#HY7dO)J zcc4#1eLB44tg?7FL@VQ|6$|U(42Y&*S~0YX9;^D+A9u>)Ne2J&kl)_tUbT8o4)u2b z;cZmP)ReJKm@6lE`fJ3o-p?>3_@}zusr{M#z^#DEDB=#;Pvet9@*Rh?T3*(!-QPw% zr@e3ZZ+>q22fkL({!`lcU|S*5kKFH7+o1U|l+nwy<{OaRmiLG8#T_0aHeRDEt(Qgh z2?OjNWjpk&{DCmOXIyh;PO-Gtj7r(n%zp0MZd98bOn=pCFD&$5UDX5EL)X4HrsmF2 zv5r2Sz{4-HAsFBKgg}b!MjRXqp2sa|Yu_Yn&n#Z`E3UY??>XL>=e>wBp3?(Tk2+$N z{l dZVD?A|cn5{JStP{kLj zX+&<3D?T?O27CDE5<#mFa{D%%NQqdUO&UbOSH)@np3F2T-u^8fqS&+zhZ&j?qJ@Em zLSkiFk*~QtG(@+amW&QGjLU$$epM-v$RG yE2lfhH}~EvqL@dFMa%j zCMOC~0?_>{ag_~O_9Ruy&rydKqahP`{q`EpZV6Y)GvACLN+i4L)qE*EzD$&cE!Y{} zUn9&wxe@Yo@HbP5O83BUEj}s=Ju7W<=ctxo3XF0kDI;XWugFT#jWb%xj@mATnW;)r zD1YNit+F{kC=E#q{_=~FBHg7~s)sKIce_1)7S)b_a$25iu?C9Nb1NjwVl@qodBX7F zZ031mxmxyrwF=*1QrNr}`P2Xc9Jp03NNc}R#;{f6PL_CbvtQ)E6-E_VoGYN22Hfhx z@bacZI~-4F=ptjhzLls1nfxWw@qDubwix;RRDjt!Q2lxg5UiRA0MT=^gN4R~_!V>4 zWTB~$-FFQSdIpaN`O4s-0=9Nalc8_e@EPwLshLX5Qix5BI)TPw@Jev?KTRn2eiJ%L zm}aKiNNx~UDo_R4EW!yUkxPh_Z}%Y%x#d8qX L&7pu_?Vagoo z({FctoHE8UCsco2hwVfd{$n5U>rv0ow@;+n&9`%-PyR>Jxc#(G)7ND5mBWo)=)|u6 z+_!|)*%Kk8a}|Ti!)x`N3aC*v`entrwr+quEnJ8^O j%SzRHQ74 b{AWPb+z_XC7pU;6#(qyRf#SL(t(|hPNBT9+Va9wuJ;qq#tg+b%!Nea-V zPxdvsj&-iGOx-UL!%d`I-A#d?$MQ5mOE{No^{!c;D5S2`iZiw88kb?Tr`O=8bM9Wg z4;@oBBr21sZCj={AK8Sq$$Qco4a^_SLi(j(8_9=Uq?t{x-2(J2l~sU8i|I(j;qQiL za9Uy$`U%Q16r{eZfX8bi!=ATHVk;{ 6m2x@bDfrH|A`c_>(c5t`9xvHAfL|BmM5P!RFSA%4M2C)QoJfV5w;f? zJiM{53G&D>wx>O)kSu5iefbV6ZePUp6aFh#iB(Sped?A* WkxGlXNmcMHt=z>cIBW2{UQHGolO3 znXH$^usFsqNDwSC*FD3$u-(%+#b6!B=MP5;?KtQ@oJxRUWef7q$TZB6B{t5YkPGV^ zoX43Z#lmB=lHNJkP4I^}-jcWzZMX{3X?_hp==A3Bpdnae*xH@f>yTs<)<)KXr)eSj z9bi8A3+EkJde;QvqXR1lebu&5Kv|V`8Rm?v5kBAaBdz~3z4glTYfF*6^m{yL%myp; zp>JS`ilsN^7=Lgm&r?54`dkSawJ=n;xExt6ch(93m7BNvlVW;;Zmy70AR}}PRbl&{ z)(3(On^DV0I3nJ}no{Sz{Ydc?QBT7tUaXmn^g5apHTp+YBNvwo%I(3>fbvu?_W%^G zf;_n<_6PKmLqg)KzJ&^Uypi(rqYY4|8moE>UHcL42-(f8_&53}3@v_8tH;O%rDrAU zVKI7y9cikEv@c4dZY6uLL6$!po}A+rR{iJo_~Vit`8Q7p-Sd0s>UHa*yRSL1UXt_i zk`*k?cOQ0sy<3CKqt>NFPU^FK 6w8>-NQ7(9RtfI^vIm!n#TvRYuk ziZ7Q~VlHO=T44aQ$(71nY#Jl+s)Qgt=9clqjW2zs(j2%opA029X0m8;cqKn6^Cu#2 zF0K$lAt9)b9X^{BrAbTD0Eql0SsuEe^B8QfdDJ=U0Iwcr^$}&Z u(c0-Vm2?)6E;SiWK2#H18=FrWxQNXG#CM4dU_o-0>sYYDl*nl@nwmSB|DWbO(RiY700#uYXs@G$N z-&R|4P^G#8iA&Wmj7aLYKrXG)PVTH5DgZ7u)tf*}A{No95_0BoHr(R_0wGeb$kPue z(OChhq=TXe+Xygbc8Y1%<|282v)=u&`1D4O40)DOeu>clNf}htpVaVcbEDmJaWbIK zN!TLv#<1poCZF8Kh~66a(SBs$61gzUBSly4H|+y14eK!f(3Y#wa{KdPXs4Vz=>;|N zsIrZefQvW>6Hq01;4lc)wd5!=Hi)`B8@|3BMIizdpgxw0%%3@Wqzx(^NEicPziy!v zkaaA;Hi;cvA*tfXdOM&$K1G-yv#s9$5FiIge*(Nan1)LR|8X$&OvC>-4yOO0b16Sh zB`04+F%WnPm{xgrE@1%3g0kKApQ|LzL-a?(Lxr08F`43C$@k@knQW;K$Ix-BpV)w< zh^YTxpd_8^vVCJj#c-H;ttxqEzDIEW=JPp3Sp2-49z<4PDOcoA`j#o>=ay3D5fh7; zEq DEW7cZ_ohMg@Ki&%LdHgKq`-VlcDcw$1oA5~ zqo`d-=QU`~uR^vdg_7RAkWaWmwpr3UFxFYkXP4 -Ca @EqWh4k=Cf0`jeQaKw>tj6aPm(fK<~`+ z*Pm0+T)ax-#4SoT75HB~XFLjr_+j ub_CK1sDis!AQz_-VIkx=OEO%Fql_u}gY_6>#Tt>>cb!#_IwOr)2n0tqxlH9n8!4+t+uNB(uzOkWv-AG}(hq*yNM8&9}<*D}?dKeNd@OJwtS z?{21ONeX|e40F<>^&_%81b;-${u7=uXjtQKvAtZ*9X;GVzEIon8pc-Q!n-~ueW56T zJ5!wSyHX8=ugfh`7lB+m5vV~Y3O|t#WJ@7nrOLL%P5GV34dp$kiQUOC(DKEZF Xc$so>gBg04799 zHRG=|6cgff8*;$`>}Q-a1*^=|C{dTZOfuN8vx^1p&YZ;tXmec{_vX5}3TEf>9b*xj z589Yyee*lF)=Y6M8%k*D+M_~y;h)a0v;@v<$MizXYIc6zi+&p$;sSSnC$v!N#j9fN zjh`hK+b_&VMjmIIRk>LUHvjHd|A(MnoD|8g7Yvk^wRaUl)djiqZjt^?Y z&EjeM4UIf@kR;*Nj$IYTim=bw{d*dBv)r49zf|buJWX}qP2H&guFxXQN)QOORB158 zlLzjecor|EEJu~RSvw08bGfBEP^o0)kAYpAZW34PYH7Kp)w{5``Hi7HDI U-XbPUV+owAQWD9lw5 z2TQWgX>)ZD(p8wh&|80?w9`kHEW_fghyZ23%ev+YAtxpKVD~2b>I*@B_|cDnKTQ|o zcy@Z*UZb089BqplyZ~ldV$g({76C<;$aq3S@&KVufb(z!Cxjmez%B^MAqdq9jR6l_ zRSh9g=70m^DiGiT!#_j74Y6XZUYnMBd$iqBw4q2~cq25CDJg8gf 1sG~oPu07k&u!p7VDdf$Iu&$GC+ zUsl^hp=)^^8`z90O*AxB<1w**4ZyYepRI=yZIS5?1in14X0C=@VGpS>`t}O_R(1pY zzTqTgq5l{pUqnj6nj$=AQ@Xy#t$FTBRDS<6R_l3npu+FWOk3ohy&~5qZC p^uO0n8_4WamO#lI8P)9P zQ`w<5d>&oY65X42bKZ6LmWHW-ra#}khcXFROg1MyL4!>5YRNwu%4MqaR)4ehmC8d# zkVNBa{zYWTlEF~CDGDrm#_e;%wlt`}vN<|o25{%(b4ALCukL4piKYsn7iFjj=4yaX z^hK?pC)Mmw4+!V8T4x*ueoN=R(JduJu=a1&NqUQ4LSEI4v6=ecC4Ts z5AAQj+sNJ!N0sGPmZ~c&P77Ilc_cMv>u011r9Ldrn#f7ZiQi$+kuT+qjF6#U#wLTr zHL!frJu6!>KE~bs({6c((F0tv>W1Y;qut{|;qrDwlifA=xBb7@<)G`PgOF@URMY&s z9MFcG%{ sj%S~r4+t|NN-DcNhpgk>tfl!VM|!Q7kjKCm9Q01@8_W|i?N1r zCJ{1gYIK$9f~3~mU3#pguxO4eQ?V65iM)mebs6gKec#b;$V>#a@}dqCO|m%Sh(*~b z-W*M25hVnkiuEG?j;BgWE!fyjX3v8}N24Y<2jk~2AA`PKLNUVkVAEwxH8p&U2_p!q zP`{+c0+c-v{wO5^GdU)(2tOMEgj@mJp|f46q=?&MFPR)CJOKmamydTCcd51pvW8)C z qWPgAzmuw|1kfdTA{q)gwjKxegQr_z728XtJjnE$a@;AYlB5B?O?5M_55^ zBkY)NHJ1tD!`tWuLr=20v *|FrM z3QD&CP$KNw7MIA;xQL$SSwN#sd=k53JU5LpKitpWvH4;cRlVePntq$0SSBf$z7#<8 z{RC-S>)37lgD)y5k2-SntdlQhNJ|CbtFm>`ITM$Nm>GnnhxBd3v@djkodd@7p^=A1 zEao$wW#15H^w!u?IuyIFUM4n3hBcbg)EuGz($Y>Tkf4icJTid_zdybHe?}2j>PDr5 z0Ybyd5w-M-2>^XD2mw`m4dQU%9 zh%NNgJmQ?kX@$Z|n_(Vhb2ie1;Obg%O}V7PF&6N8suYIVoKa0`2`DUa5;-vIq2mFo zF?CAcq7j^ObY6|M3*aV0u=k*YVf}$Np5OtJ2urz6OfWRb`4&|lF&F$eQgs9yULJI# z1nCL#5OgPAn3m^2^OrvjG9>er2b`M;eBg4D7lO7M#m#D}Q9egEykD__?d>6Os{Iw< zLm{ZcER$;IzqHbQ(9&{=eKBh+rZ8;SQbD(hLX$WD5Jo?T!u!Y!w|*j^<>7(E%A{ z;Wj<+P#sVhcpuh6oxy&!qnTxX$f{fZc}N;-R)bi61siE?G7}4_4OtOu!Ov3P8(F*5 zX0!?{)uElqIOT#c{S9Yp6sC?!2*NanrZI8LV6amll7pm*^(^(yw*4uu(k=}R7d8CY zp`E>dBjyQ?{%#6JVmNH?1ckwCyafRZINYoyQgJeJ0{6G-Moj`I*_NjQXCgEYzZy9# zjIN~jtIT9fKO^SPA)MV*KlW`L)lslYus*~luOS*|-*YBr{LGcq;jl8$tp_uJ(C{Mf zG{g;GVr({Kb&<<+yP-ku5MOyPGF6a4J|6U%{xJ-2Trlg0C*&97E1u*hah5%h`hrUc z?~7F+2~}iGVy>f|q?abo6r&_FRG}xOX2~~o>~Oy~#R8r+^U&UMp%16h`l0ppZ2hVp z*DCi$-<4c=pB{#F?dnRdUzBRQ(BfK=gSrS-;8Sa1 `#+KNSw2ZV$?Q6GPzoM4gZ(+_FFnD
dw%r{-UnBE07bgVHKV@vt>p8Wu$9 zJGdp! ih_{QK{(^zkv=8 y9BV+eDB{@wwGN}NMc<6E<9 9 c^>W|@GqeRmL+#2zVUY3kMqUQq-f$fvU4$SQ=AW)a4HhXRqauSar#3ByHVSX;z0 z_3=_n Ze`(j-=00jkfahlL75lG10JqT(Y0H2YN?7F6iIFsBkD@&ua}LEk7nK zGOW3QaQ(cyHl^gZEJrBlV_lCIMLJzRqzh0e7csg|5$)>NfagcMgzXRz!apB;JkH}D z`C$mfU1)8iJuSOf 7`dj>Vc3nJ zzo#B31rgK&N8huhilgX&cX!*cL1By#m#a0z1fC-AXkZQI);h~fy}Nc|hof2g>Gr=a z^-i}_uG#mbavn9sp$*#PXT8CWM_1=Nn;bN5|6KMX+;Og2(V_ODm~Dzv&(p1=A$4{{ z#YG&;J3r_bE@qyk@55GPv44$S|CgK7ID;!=B LCu 0bl zhg%iI6Hy=0*NI mN5MD woIF89MkjeV>T(TQgKGlf?$pwt8t?m;EW+4A|OeQi*<4p?)=1h~l$;f!Nfm(j^ss zV;EEbyvEOSEq6w6ci6%{6#kQmN}n@aazfkVDobx$wy0e}I6_q>@%<^4QfHNr@iPf` zp5Ko)_6!McrwMA~QgqdJKF+<-&_B(5F@;L-H$6An70r8aitB?gmM~>YQtJW-<}R_? zK!qor+N$L+Fga@29gcL`vnvCh# Z+!{@9Y|^E%@EeUkMgp*SGm|>;G(uO)C?Btn z2<$iz%?$4_)=V6_C_={o7+dq4P(p@?2ser{VU3m!KI{QT4ne2Q$8WcxB)F$8=35$- zHGI`B+eaZzlM}1oUU*Z!{GP*LVLD=>8lw_g3nDKo@{Ef3IzbUVG`|31b(4s#>Co1j zm3v#(+S8awd7jUdg}vHE?0&KCPsk2u?hlHPb`gH#n|^~wYG5Z2BCg$q`*|D9hDm{n zz&858&OskBU=Y0LRd3kBRT+1E6!DuqNq*azhmgdlCZxI$(j)JQ*p*| y zFr>E`3Exm2_KK9_z|moOZA+i-YKEpZL
ErFko>T`^At503J0)E1?f9lP$0Z!mXn+z@Nv z(caA~d$ld5sO??DG1lky)-4fT0T%nr1TvY28fNPa2Rm!HKylw$bkyjYzz889g1w=f z%G_Crk9t5C2`ft6EE9RjOrc7+Fef!^DU+U;i^_}OwfpNYKwY(lqotVY%^-$pB=JGH z9W`C )Whh2k;p7lR(9CJ|>$sJ^?$)+%Hr90sF$#PPJO{VzTDf#ZBr*G*V zG|>58;H4ImpppZ=pDArk{o-uzUoZMC6ImFi&@U6ag&?(Vn>ov?nCNAPlA;EuSC{}C z1(Oh>Uh{M9Ah#(SmZ4!P@%T4;RGfLuOzwl>YG7CV#RK_w-NDHEn~GvWr8v`kAYnjI zV67N@8MIf=J<6 ^`Id zXv2(d)%=(lATVxd{JVQFT%shVl=71dNu=P8T5{JxHYmQVGZN!bKXIe*h}Bd| zSKNYi3I*ru4%7~lhD2#|10~$-<*`aOW}5%EmE@ ;Lyw3yWo0>6vg1)du;@^*TD`P$lprUuL6oL$l~qUGVCAG38(8ku(Kn91k`T( zZ+N*_cX_?)bT8JwH^|)x8;#RNE!1a$=`>sA2b-%Hhr5HyRcf1pRdd@}FTdjWU6~-i z4jVzU7(r7WhEil~uk`%I{3eRZ%CnYEv~eb3{p*hJ!A!p1rWl{lM$3W+$opxzN}1@b z%iHWGU@phlmfFX+2Iy+zl_ZeGf4gIN_C6HtCGUnZbMq>vLvr}Ti1EETbo+5H4 59@1GVg>m_%tQpUjBY8w91Ao^W`m35ON2K=( bETs>(W#U17Z$W!EU}` zPc{qHXliRp=ccoyYS&al3Dxo1XH86?7P`-tRuYnjTOJ+Z-_l }BOn&d *M7M(i70i^ zVXLkcGT*^j`ujZQ&k4bvaKx}KGK1XOc`->NiwZH));!JKE^_;!{=`&9bhUG>CX|8N z{w<3cLxUQ5pqxZ3E|q<;*Lcna)s48-aK`eg>Wy2r_58OJebq~)a_%dJ0;B>{V@3Ty z)T{FeE}PBoP}!D*esaQ|OO(rh_sdBtdr}xEv1YZ>sXtZZ^bKN=A3)$UQ3MuN^O>=C zVqZVfUmH-DjOGi)E5iM>W!^5z$3|E{vBRO0VZT{V%Gxyf9H3oKS-q>@ejF*-nI1zN z!4bEz=>;g;^ed`h0>Y|_JkR%=Nw!K@ja(L!Rc2w_{jwx9;wn56Z HB`y7fc>kZ0p zNqr=hv13sRhMUhM0cYzYkq#2;B+Q kHz&i7bO|&9xy0#@uF@m}aD|wE^8PA?$QiPUBopOsV|`?6aOY zt$M?~HV{R5FABI6t8S)M-QSazgUGU5;TQk+Ueg1?<@n@D|!?rVe1$5{VvI1`cW)mq3*1e;M-RE zoitb2tyV`u(m4liDldJ1_iIXwj5YTAD^=@s9B8x07mfRk`^tUFKHCQzU7_c9{T P(;Un^(I zOP!Z5{M)D5y;_8{@{=lGsK2_A-UmZx4DQuHv1P&=z&hmkeY$=mY7RjJ2FFHQa#vQG zoOghbIm(6Y0~I@5gvw!*`X(}MHSUX?id5jQjn4pd#EOJ#o18PI;{dfe*X71l_HeB? zs$UGz#%~*vXE8qVvU6WhiQA6iit7zOZE&wl8#2+`jC3gpDUn!5w ^hn`v{KIfZQYi!l207ukAiopWAhc70-e{5y(ntwrI}Zk05*P9oVne9 zKt_PYzra%Y`L@A+ lZZZW!R0LUHUEpzhG$erE0nrWFaDADABXF2mb`XK zEk6jDc?!J6h#*$R1pJEd6wtGLP1bG*@=okOw7j-c?u3YICZTNL$Er#EdyR<_2y$J2 zNF+B-T~-9{*JRqh>T@@jV3Vaz4(mwOUjP8VL!jD&{^__q>7JsO64Bp#cXSI0ZD6E? z1#?NU7~2(sI1!!)zptamqF|-fT-K6A`ll5PyJ>gwnU7IdpoA +C%nBVFJ= s@0&oPn3v`)7ss5p+jkTs@Ri>Z8F#`% za`RLys~XwRAsduRMRI`|qqw8MlYij*CtDL*;*70e1&TZ2^aN)j@FCBrRA8+BQ?H7c z0GcN8wr|cIeug^|xdYR9bJuM%a$4H?a22YD;zdEYbcFw_!9H1;Ou@ gV2iepzIOIy7esii!P z0W1Wviu(JUlaxqP-H?M6*@PGjS=u0cqUAEu7ASKM2Pi)zSP$)Yl#*BfwqYxb=PX!1 zznN5H;C_*9>fW}>5;7u0?*s!OvTiaT92L$|ka583cpLWqR?5tct%FKeIcE34({O_F zKl6pH=EbT!$o{M|A^)92X}rN!FN1ccQ~zxOWtZ(|u;?-W!)p*Xjq`%f$G@pP?d#{J zQ-bC3xW#y_j=cwz5(~tyqSyMUv9G3|5kSWi-ExhMM5-4wVI5MEm-RjZ=jGKnt;|}r zbjTV@2MDiUflz#Wx2!Cr3HdSOO2XHKAMC0-BY m#m*mn z4F{CF`X+z$$17n;F{41Y-Cg4 FE=jwBTMTl9ryuG5SN_#{i ze<{tR#WfoVmW-y^t^$9sEQx%kL~|w$(vfUu!hFE@ug&Z={P`LXzOFPgHbSRS=v3uv zDNw!rz5YgH-|k30g`Nxkv8qbWQgzT(om2`wvbQMC%)KZ`>tbXhx`4(WELyes L{5u}2HNt15liw@8W0xa^QP*>OQB*sE4Ix&n&>+-yyuu6EKW zZ4eQ#S7SrZzh)iFil2Ndr`I;iDp_NDUu8`V=EZ{nhQ}&ca2w5)C!VMGIr}HKa3?7c zv x0`M7Zp3rBBj(1t)y(_<@b1w6p$$OqpIP@0qimsW-bVMlLXpnv2=1m4)q z!|_&)*Z$oK=_?3t;P_Hy=0`_JeGVO2W(PDL>m}`-Muv?*EHBT5tUowuliY~oBPEgt z6nm#?CBS!gZtPX2!eF>4`8?|OI9K`JmrMU}<%7}s_>n85QUfFNCR?qbC`x=C*u#IJ z7I|4K?1*jQDYB|<^&xl%&q`HXoTQneo|r9QJs9DNvmu8X?aRwXtjj4NI_bt*WW__n zy?b~`zK!BTqvCH$e;4l|?r4 ~g%$2)87w7mnTA_Hz5m65jV~4nOqY8}10c zV=>P@74xT)ePGquS1z|m)%zbn*ciVN9YaP$U)U^BkOs4pg%mj}$0yA5->5)Pf_gyI zh)`k)M7q_ow0ms7mW33IY9}%^MwuG^D`fhIze|Dk1GFI@;;0sZDM9 c3{w(B)UOZ#4)~wnnOI`)8-Ah~>7IJIJS8d&iHvorn4sH6udg59GW+%i z-*eq4QF(89R^|Ap4vdLJ$c3-``yEn@(uz96XE>>MREzOl)j?~1P?-OF^|9X5*a4Dz z`4T|h$2&oCy~^1aK`JJPNm1AbFVjVlyM1;s5BZlU6z2_$dCrArB}K3$-p42%rjuJ1 z7hcDtsb#E+HMm4_t>~KozJf2We0RCq1*b>v!oQ=Tf?u!OW+|mttjVRxa2grZ@jqJO z*RaAsI%OQ kn;@!zAvyLnyG06nWNyh@H_2uut!xyDw1TdfB`2pDey z)D8%kwc7{4);fnqUo2FiDJ0+xW+?@62W9bhbx++->=GtWvhYL *kO$8s;yH7)8htGy5{Uu{*>L=Y{o>~MHA5lp?C;q~4 zD2v*1U2Bl+#2ZJ=h}eGtnh^XoIz^r;8kWDZnq3M-#I4W*DKmrR|ME_(%>jUL^39eN z!h049m`R3ektn$CJz!tCb(#dC7+p%Eg;24ZrXYi?yDXZyRYd+31dhq-*zzB2j!(6|q5_jv>+R}wy2r5b`z=8@Vs<$lZe*OJ8)wxdF_9(31Xb6Y&$03> 3x4{HcxG|x#0m71=0j@@$LF0H3HU7iV8avxR zV;Vx IXXWQ*j=4vx#1t0@P?m_dO;5`TWys0o5}`$e~U^LNB!dy{vM|P;q}K{ zRvQ~Je5jg0ki5MT0--)l)u8Nfz09AlLimc3l!i|qGa>FjKvpkGn9oxzU26cgT=Dn0 zO5Ck>FUr+k+Rqa}9#~5%C1H87=u?*<|a7AmmNhz6X6j<1xrI`d^5jKG(IO6<{NdI^1l_ccETEZjQ_K1%^bl?R~ zSMVnQ^NH$EZY&s38~jZgs_28VGZ32poAu5oWM(ldkHK>P-q^~izU2hrG+^!$*a!@( za4SYK!$xv8T|^*M2}WmcJkJM|deh-09B!$NJ0VSCfvL8apkjc~5E7)_rBwzjVgO ujK=6mj8AV)>*RLHWSA=O){Cln$8;y0%QgA7at8`N-AfZ?$mG)=&S8 zt^vAunc|`^2O&ZB2^hunG@=m+Vkd}yf-}uMQN0!AIEwHRe#)jnL7J9Z@u4ZIYxU*1 zk515+)4yjJ20GNLg>0VIWzRTy%WoavC2;R970O!!QnYm9*#Hig8gosS80JpkL+Ka} zdkteV51c5l@db@12gsxX@sAD+_N94V;MuvK?+BZfQ6+>eQUugPevp!tOe9$o>i4xI zs4=P}?I6>rk$+^*U{^X^2b3%G0zE@7lwgfnhFqQRnmvJncgY%}KQm|c$;3)POrooO zR$Q-NQ^`%aRxfMUmBpo?w=zMs&>wh+lOx9!F$cRa^>bn$4%zd25A&f7do^1VDTv~; z;bC6YR(Xj4&0^Jr%g^up>L&9;w9~%;H&Lq8L{c_T$5saWuEDS!iko;h%>)Z+pU@I8 zYHM!BS+TR~Vfox_Obu}j_V3}mO~1FWNgGACL}@YOU8jQ8%z{#aiz>FY=(?D<0F}8{J|Cpd^C)LkScj~!+p5H z-=b^Z%`ac2e%6M5>DTaGW)7mOj&BXkFDOQ60WyzWJ4jB^o2G(Je!!M@eJ^RZbyV0p z>{g!zA%cD(lk^mwfv<0Vp|!=)Pg$RA*v ZI424FBhzr^PE~une46M5%aC zgt7hl`>3Da4z|!*tds>andJQM#s-E9dmh@+%V(vd%#UAxwIa*R1T#*6&6e-K)i+;) zaEjZUHdxSru!?Lx`iOy~iVa`{1|z(UksH~;xUct6l&Qwz8n+auws2fHyLI;TEn?7c z3-2#K0Nc;u(cc*0^Jyll#|fHo5 h}Y#^YBB1LZDo4VewQWJ1)%&p(Xt=yoy51*%Wrw6 +We`qXiqux7ywS6ng1H2jrjPG&=JEOcMp- z6S8!yei#9pjj=V0L9ts7Kmpa9u%fhM6 1Y!dAf}z~-p1%P|g8F{e&>wVgq$r{;j0f<*pK?`vm7pEPDCKPd^flt8h;sPB zJGk>dR!QZRA@D3NhapIIIV!X^4FIh0=}!2}74APSqdbKt&~FbYY<{iex~E=r`3$pk zNsj|FMisMkDRr4;Qui9ej_umN4dv32t-+c#!3MZ9e3D<9SQH5cN6rN`Z8FHYe(gO+ z2*S->QjdvK5RahZtfM3F?7H;Y2YGx_V4)#{gW|`>Mu!FhNutwa`}=w!5V7|~(-*TE z%ux1>-BqV1xhJ;6^`{wn32No4Eye^D+8oTvh5{f30|~ZzD83j8t?x^r0~DO0a#F La7GFcEc(9!V+K{#wh>BwgbHm zuf!O+PsUS#X80~p)>2}O>kwd?T*1BzS#A|r(-JW3))@n|A4plP#_7Sh-=| l)1PoBfdsjA4s1@3Cz5!~F$dI{lLoX^!xMiIdz)=YD zhVunc{wN9chj%iIS|EkU`v~u%qO?r)j5TL)T#V BB3Zn~OUiTg4r&qSCg8*G$cQCGB>UcgDF4tlTQM;D-^= zxE2@4%lD60;FYMlmO&<9iL4tx{kcHY9n7(k#`KA{eYl&*smF2UIS%mG)d+ut;vj%| zVj?J$#1Hq5VE8Cp7UXrO+vJS;z^Z$&wlO%9umy!nVWu Wgl*DN zI#YAHRt%Qo)AP=+!@<~w?uJ`j4|8shep0WK6qZ`t5@|Ihc)$Yr<)X;a1yf=t^|R8c z2OiEmV?^|$`ovXQ%6#2Zgx1l~uFL@GruW(GqUNt%zKo*~Q M)1r%5ZA{>bwejoec;o~j`(2DN7o zpS }+rIZ~SLj|O;M9Plq-{v$Zu%fi zSv~mZr!%@e2u=~eL%=)|nnLme(?b-+OX@lB_oJk<78^G=m_JIm@WNRYK`~jF29cO< zO d#>3hS&t$-gji@yw=B?j^wx1MVfyB`q5 zaX+G2LzentJfWQwUh6z%Ex%rsDX5<;P5@zs56_9&^7aoXGxRg6`3kp!xEunfM3ZsQ zf$;up71NRx&TG77*JaF^NTLZOD>3K{*EGl|f ABr~ZQlFnuNRg(ZCiMT$MTh)8D<`l9=4^` zxIh5Z612%Z#bC+o^?UGfjQp>KQ5S$=;w=lg99^O^_7iXp#5#OnmLSo&c?O_+mH>Sr zQ89pBW;k#+hk^;{WR)9h?__FfB#;LfSVeupX2ico&iMYb$QdwSj>=1}O0h2pJ0R8+ zz=YThz#oLGU2FBRc+ekOnnI|kO7IFU3#Qsc{xC@X1)hx^(&LfJQed}y*|<7&oc>lV zjGhMY8B1RPgp0sA%*#ZY_Efor&QxNuOv!Vw` zlCME;kzQXr#?ppdR|syDWZ^^~aK- 0uTuP+;LT42BVLGM%ylj+niBn^C9GG+g( *b)AZI zx9Lyxveondg#s{`2kk{YbKnFNDTMl_nm-}yr_Reue?$Hk>xlAn$En#oU4KKChagOP z{h~hef#Ryyg|G^HtY8x%&TDGLTUTUvv)_6tKuY1s2Inm0D{S{K1*rAVam-9Q7gwr6 zr@@&r^=m_!`526^yUw+jj=}ita%oUhMlZddqS05qAYX%Es6-5Ufd58FY!`S!bA14O z85)4cHTJN1-8V-=SnzUoHT;ph+#dOF&ct?QZ0=WWq6>un$e{AKqA%~r#r~P@e?-ty z%{ Zr*}o%jnM>5rgG+uX=xeo{-cGfy_Zei-h6g=kvRsk8nnn= zrp {!!fowN3E_ro7j61jKyNX(L@R z`%kX%V*F{qzixd9(Pe|)*rMWR>#7bb`4$3_u#4}^ADXrVOAn6R)VUfVj!NltxarR? zO5${X9K<#M`J+7^rVK$^#_xL^X=JhtulQrDi%dyy{%&V0gBTO+Y`ma^xYL|Epham} zhg } zJKGZ2s_P(%Yp_!wNu0l5NJVo2eM>6)S;N+=V7g>`xB0VD9R1VCI%)vBQ qP0TM> zcmNW~YsGn@> Qd?ib`J+%@wboQe$RaClHoBtekuEJp`}OYLy=+5WkIP=g=Wp*|z+0 zWUtbjd9VfD;&e=)P1+PZETge1vP3K3)O^(9@O2M!f%*0Eqdw5G^}6|a(N;R?zdz_m z;4rFqqvLNr3t)R?8bHk{lh7!6#MzFBU)7;WXX*VpxMpx}m?^zbgPaQNC;5|6*Z4Cz zFW-tpwstN;J^*gU&A9!!lGtBA&M=!bH@H8}3SmAXx>|0IdMu2?jdNRy#=T5P#1Zqm zpP)S`Y=QF?0HnqihVgW9DNZW)`-dzUb^uV*;m7iAW%j`~(YP5k{M-4D5J)H|Rmz)s z;TX@~#AsbDH&P{uLkg)*F8wL8vLC(Rnp>~r%Sb#*->>R&UV*(F5F+6*y>a$afr6O# zlOi>lZRxJD)Gx_jmbjm|XSXSfmn;=3WV4-QcEPX&t#@mQg(DrlAKdjJpb(=EQ0}&n z9BNAvDL8R6l$4+urb-8l+3c~2$+_?H=(0dvm4Wj47)hKp!5c=-=vX~G#eNQf(Z7k> z2oh91#a~Z )5Vx85qpm=hNqQnH=0D)vg-7uwT1b&(;l?tBe__{o&?3nteeW zh~hiGrC&S&?eYUSQBDCT!BoHLb)miVz1UnZl8fAP6&W}XD!Oo9p4AbMZ! L z^_6Idl(I*c02lxRd4zs?SC8CH2{t#s?-R@Uu4{{YYbOr8cuw!IUH gsYSS(VChU{}l^!F~iySgApBNMnAt|U&bcrfy zVCi kU(;KxKiNN`9VcywQVwOR!zcAaF*8L97MWn|a&knwDZQ&~?2pAPZP z`+9je!0~Csd@yKdUc`h10!Ac<8LbeXOAbIhn+j(QgT %G6dvpu*5cn`M_ z7-XLx`>Hc^s_HKc&d*;adSt!49&$E|FBL~6B`bPXLF|61!SX;$QHPf;d!Qz(``3f- zo-`5yLwDJyn7)k)f$74-;lu>FBYyAGD@&F>20Huf?|O*tw>W%h3w4;Ln|7aI(srIh zCD^ZUH5pdHlnIlaHqhRB=6tlA(HOcaBA7?9BFoIRn7%Q*pPsv8555Oo6E`u{xZ_IY zc4U5s*UJvq!0~x%;_`mM4%WT%^-9t<>s85`in}lo;3Z} BTT$gnLf?9F+k;{HJPxNf z%zC!4q)W#vni=v$ytZrCj`CD2gg)t?lrYsZ5P%%K!MBxTGtGL0a|ibV{tn{h+x4GT zK!qx1Ur+1N>2wduQ@J5S4e?5l=qIn;ly+nKJWpv7%z$?U;0^}8po07)_+&_T1pkgt znA~vWYivCEnq|5{Q-q3Hws2!7$>0WU?TWmhEQwFcMN3SIk}87Cw}X1H28q9upy(=u zjWA9R d|0usez(YcE_>WX%S$3zH>Uy{I@84W&rJ`P2jzPM9?pBS6`91b7oI6I$XCZB2NCc zX!2h1-6_Igh>>YHVs0i;=Me?P0_MegqOt7Oi^75JD;>oFNJ;E(>MUjFgYY)$KdB{d zE}|=qB(4lglAri^VyRg5W6o}Wgmn_2Xxy*J3)^Lib>{iEE5!QC%DawMSdoh8hKLR) zqY&x OG|B&JEU0U!*huLskhz}`UU}d`;w30K!8DBA7~hb`t$=6VXKux}&_}%@ zUFf|@WVVsqs)(D`rc3pDphiJUU^-e!%{_Mc&ADCA!T!N=D39^Ao+B086*pGO6L#f8 zFfCVjQ?GlQ`(cOCyOyfTG5>~~IB~g1MMaH1j(P0>joZpJ5IL`9x%?HUS_|3!4BV}v zbO_9SI7iIa^L0A=3dm72$xpK$WV=1dhA~%h*Mu-f&L?F2u9gen1c45Cajb#w-krfa zT)xz#p9DZ-;ssc^e$Dfwf};CGlPGcCKz;|% be%vtuTapSWIX_w!{}iP`lQR` zLJtd%eW+AKXUjWr3Ka$lurCub+Wf#yVw0zY_;IfRuGqOC0s-Xld|(Zu{a$T!$^G+a zyxeLX@IJ{U@8AL$=TN|{<&xXe9>WB+xHIN}% ztv8_El(s9SI>=|>Y71brI4sn=T0UdgIfZ@3g&vYMSO!X8z#~&bwkfuqei)PZ s>AHQ*!a+XjrMp@|G9!zu7 z^+}T9Gq*Jo)UBMILrLShyc5;y=hpse&$SKu{-~`V1qzUuL_g0Ro#Is-H*IEJ|J-;k zgjS{}yfj{ODXW*F$8Pp8vP1hByhuG~GaYzLMy&RL8Zw2Cu)20YR_^g_|7=K9;v2qH zTfZLGQCOU@8vA|%A1LR2OF%iq?v&xFflBvme!df=6lO$+Z6tQHO^MA!0}V#cO?##@ zRa8Y*L=7+Q0L%kQFy!`Yj3yfyo~C&1jdPzpdt0hgt?H56g|`s%&oqa;R*+YY%iFAQ zNnn_f0V7%DwZ!&2V1!=%96QkkbE4*sqq>vr96d;Fy-O`AbF7r+V#H_9gg1zj`OV0o z6@p9$0-8E_fX^>(3bFd6o&g@rsMKS1ru0$@N?WQ!K*%Dtcum#GO^v^`hn=Ntx_j3` zq|=}$ Ao0zf(--;gi`fP$^4d;)sqERI<53#SaR)sv2A zdykfYU6C0|vV5(<1{8dtab#I?YFKlHbi~0ThOi!JTEglq6%_#KYjD6n?Mk71;wnHS zfI26|LvQrF56YFjDPu0+|H1&wX3{%B>rQi;3nb=N7vg*?WFbPFqhP 5YerHE=ikF+LF+hP4l9Oo%@ZZ{8i~ zJ-|6GTxD!Q-?(JIla}&A353XOBRp(s>nvTqAO(U4%G10vzOhEq@qu;ehSZuyj`fTn zZf=~8_oo_XCqJ&nv>o+ p_z<=+vD8vL6lR@p@7xe;RW18=r)kv>)zeO zRBUyRUTc$v#Dt;w?AHquC&tRNX?pG*jf70$$6~DnTewc9s9~*Y^G<6F`YR(6cJvf+ zc6$kgm3s5=S!nhlAc=FXi+%?Xt~~<0x0GZLX~TynQu}L&S0AHnn+cOdo8I)WEOjAW z3s&p|Nu#OgJE5HK9zS&dpe$PHhzBq~`mqytHx@?hXwRv=c|w~~Vjrz7%}k4FX_MXG zis+g)@B}N6xl*aZ0Z^ qWeOs)*nVG@a?bn-dEbf$s0k~E*o1ORAQBN7+6_wf`tfX#cXv}h*$mp9&6Cn7 zLtg<$_I>IS|E?AffT))r%OA)RN)>-HSpnw@ybG#3;$ERh>05{T4Uhjl#PNf_ThChf zkp_Q_3j1>}(cz_C%Z*@;f3#ICWTu$yph%uAQlPCJi_@QDHzS6uUd;XLQyH(`htn-# zKL?g^!+jsKU=4+#gQtL%PpsaW;amRnvxdkLkKuc<5{As*$3a@4Zjn>F2$au G_W2C-^B2wB&`Ie}Ya`K%|jfTvdO@Y?ybO<&pgg#r% z49{%`)rHX)M&BaeX>Q~|gQ`c-I+5b~F5>t{J_wq=Lh)^smp#^{P&sI9fU4q$Hl?y& z?X^TX>RX9k==;RP_^bur51@Pd2L54Ead?pu|1wV=CFCLHaiPNR_3+sqQ~dT{SqYjf zXDYtGy-GuzLg%F*nrh>c^LFe$AGMojt~9{M+RaOk@-8R@o@a>rSgEwzcxklM13G?U zSs9i%G7 %~`g$tiFYKRu?=s<3!E#6M#WU*$w82r$iJb-mX&UWZ&6 zkp)C^Rur00jrTmrL${Vqvu$lU$slw#xFkoewXJg%X2jd&-&TJQ@@=^nS6J71HAC5` zKxVCbYe-9wc=>0t*`-Qx-QvWW! F_$MDfhm(>3oSgcuC^yu4u?>qaGeqLRBq{UNP zVe$vLc=O!MRVk_d8rSY?Bctjxw5q*8+d5YVQwOl+ZPO9 c9AuClp`Tr#~nw% zrFKOEVH?yZ(OH1~)$F3K!x`KGQodp=`n9v~k%?o`&IEmT3Z#yO3J;AXO7Av!lB8Bc zy7H OI0BP$-dKA2C25!%=8-(Dh0%UzPohSNc7A`;5|F<1O7m ze-pLmz%-#db50Z;nK)eC5H`L7uXaM$`QQU`d@8C%)njaz;KjJ_98vi5DRn&2*TWYQ z#h@co5sQU$ n9pZZkP?J2 zAAHptJ6!<74nETV*FowB_E$u@(mcV%G#c`%E0IbmUncTR6d`&h6BiRI0m!px&{8^8 z++Y_70y`=x x}WGTMO>xDJys~*aKlG)|)a*eFxA{d3BklIfk zYo>4S=0*1LS`Y3+ d)3Pg+!dWLh*JPXmb&r$0qBIHYfjG%`dG@rs9Wxsoe lh>KEgglA1bzZ=d|P7fThj_5LaXp(PzBB!y+h&-B4YI1q-aC^4U(FXc&mP$ zoaEn~*%DP3pr_k44Il;}0)PPkK`ZnoV-`)kLX30pIwKYwtb7d1gE~XzHMqRRv%zwM z`n>m?Ma!am17>|fz^fk!dydXiu1=vZC?nvv4}bx&0D#|Rpn312>RJ4#!{-_PS^m0J zgJ=7*^pol1@+y0q_w)1fVazVe$E{8JqGkPxqw?dh)cf;8;ivG@XIB^4S2_}q3WDyd z&*$nBZy#PC9%JtioPt~85B4|jD~HF=r=TbJ>EcY$Kc7ClU7y{aCLMlWC7(^NK#SdB zk_023A0FIWIQBw1&s?0|@$Z2jNLO@k&f?huI^!LH&&RKC=+i%{XRGH9OCTnv7E#{4 zGXSNm1jDqmCL>V(X pBpD9zYy^)) z7VwNDd0~m_9$H>YVb1|7c>!tKcQ9KNovFf0wOz&!c$UdRd?ocko62lH%@Km^rDR}k z(S}}FictSn K |IAFm7o R6C;x}6;RdWt(;WHP~X5H;N9m`v=0vWRRHl+CQ$wM3vnkm>oy&$bZoIlWa` zaSXqJG!&n`MHs*i>!rdn5d|62HyfKAby26w)becG{Z-|baX|Re4-rcpdk0}NdN5Zt zPaByR*avXDpQ S5*a42aT99zY^pPQLP8|y z^gqcHXcXM*{YXi_M@mvXW@^vQ>2X0a3P3%L^rJZI3l`QNoh?}s*f9fiFBLSoI>-oK zI>EEe@bVm>D1dLWg~XmVn|tvdEi=IohLOOR@Oqr9q07}!@wtZJzsvtACq;-C z%1je|_f4|XE_<2=ZPF-Vu5T(LTF^sO#g0OH?8)`lMt57p-4VZ&&tKzJEAg8p#zL$p z#9+(uqY96(r}?cmAK5F2?s8F1@<0)EsRN+K%^8jmWa;aA9*Ql_d?`83Z~~L?MJONB ze*Kw3RkzQwjLLEbNqm%SLDTy!BRH70dXusy`3w#RHS+ vSN zjL ywC5ndA|?9JHDL49xE7H8vNA#+@UB;;HSm6)UDMjqz2 zT#7t*{^vsYfwQ57DpCO_j2f`R(YgfFi3$1l@AA*IK4ZcPLL-hPi0gG7UP1~(%ix1! zRh#l~5lZAaICcb;bzs`C%E^`m!M`Ycpw;RFqz%@g62MGu;G#Y>f>P%y^gfwv)ova! zC&e*LcGJ)h8>e^WNni6Q5J$4D_N4Db-3wNtXVDbO3Up>5I~GvR4X$vD!6rp8!kGbN z=7$;H9}`H$o-MiH=?Ks29wn~i{^~IACGL8wS fDJ+FT^;#vWb{lwVL$G_ccKM+kaY0hxfplq)09rK=;-g?rvlXzP@eng| zI%a!adeTJS4&GL{pNZKBn~Z*JkD6T$t XZh&Qa)3Rf0!xa45} zWTWODr|A#k_JtPUfOdTCj?`O2@^rqcJ=`i+*40JZ+vSy1hiM5mt;M1`^Qx^>oV-&K z47%B0!@ox=y^JonahsL)8&iQ@NOsilVGSURNAS40&d#q z&wP_ow+?Xp`aXbyyGgXJX6rGOaih|67{^R6V1(RfJ9gO6J1ZFk1c;2c&vqu8@->Cl z(~DIy%l@|^1FZ=3>H7Cmxz@a_Tg9O{9WNvV|+ J(J`=Yi}a_rgf;m zS&ryl3IT5O_<3-4Iq)4{M#ay~fWcxX0?XsD$;RW619`{pQ sKp0&29+xDG3sxA{Z$^THV?sL`*BJ_lHh)4c@8^k;~y6ju34dc2H??TYPOoSgj zxNEEl!wxT5DE3+m8h14vSugJ$gzYt}?wX)^3cUO6=U^*>bo 5LBS8jYb1Qd3 zmiVkYm|Yv0HrRJP`vtXu#3iP%c)Ok@1eW_*q=7nIA}?0~y8vRT;2tPS38-27zwLID zmBZZU!wEd*<}=8oqT=&rzXzL%Jyou-pqA&yQRfKULyv0fH ;`w*`ygSBUCg5GJk>A%kQ`i5; tPZI?Y)n+e~tWP|7&MCyxdp5y=rDYG1?ATh_iayRN-|1|m?nXxlGOKl!q zQ&q@)6QbZeGLc0!a1BjIFk>HnKXMpFw_GI4W#=`(=(-pFKp8)UtMgkb%VqaH% 7oZzhm*T~e4Xbte=jQlLK1ku_kd}6B+omH}K54&1JsEaSS-4pbRg9jMn1#sk4 zJX_{MlYX}7oqLU{2@t4)Q5@C8v%aq(0@GTkb9kGb(J2dJ#;5rssmZAW8?@ftGFV%r zBN2AFV$L?ue0#x7Bkcn5tiD}M@2RD;!7W1BUOXHU;{-k_?%}xyv#y?39oTAz-jzyW ztn7dk;xQoquCQjyxT4KT!Xu4;avLh9Nm_>7M+SXKvoSJif(ZowGoEoQ=s`~wyc+tL z+!rLMwI~zS x@*QOZlek+YZWhYZHS77K y>Crl=b|pE!RD`kcZ|aR6V5@-ftaR&vv$DS+HG59Xp1`SB~dYHCEyL z3(k*Stq6G&^Vu7VHlIy}Fb)snPP8A{UOaQOpZ2YtET8A-rwKtS8m`Jbc?|j*k6h A$Kul;vs^v~HH7w=z>3A2G?ia5;eE<% zdQxw^1tY=e`f_)?&sUd5!~JTo5uKTt!!}g7Im&*XLD+C53oQ!EBBq`TxLK?<#SmrH zB}CQ+CIa71y|V$^&K_{IHFel%f6pGP^5e*#=&Q8v*eoM!b1gk&8?PeVzM~1BK+&OS zp_(`dt8@?lZOzZ2Epp8EDx)TGKflady3~hAxOLOHsW3@(qS;Vx7k-qsX5Gf&>ke*S zqktZtEjL@McM?K;Q7;ga50S(E)Z~d>B;xtBQK4`)m3~nSQdnor>;J}!JH$(m^{pw# z7hH51kE~DF+qK^f2W*2WTSsJ9$8SwH+%J8$p_7FGaQ1=A&dO?Q0pWgV^Z^x6gQcs? zeVT3DX`=dRdgw#IRWbstYqoHbt$R^XT Q%#?!y+B-8_o{Z zZN&;wtR6&Kf6$b>c>jte99CNU%O^e}^Ak{OkzE7Bv$sYz4tvRgVn3dpI|S-d_i>Bx zmk*yG$Nk0S14O`=6FOX$S1>Q1%43NDYmEP8oIWg*Cbb^i9pPu1Ju-5u64V%VFBp7$ z?p5=bM_jD@Wvg`*rX+gfX?wOSsJSW^h1;F;KDq#oh9hBLl5BKA4#p)6x!H%!27*?; zayM=X9J&-rjsp^~?nFWFk>_xs@zwUeV{ zLZ~SmZRE?KR 2gfuK
+`~MgA0UTuY6pVx@b`oZt~9x=`T&C<(#@!MY?B$S=c#M3 zx*SvMvb65d_11^~^MuF!ujLO;B _lCIpddl%sd3HmlM>C`)Dzc%65Lpx7%7NzccT&GWI}48f(W3T( z#F!SLCpHuO!jEWa u`sZeZQvszDDcYJkiBV8*W4Wtm^{v) z@JB7B=SFml!r$!o>+#Ve;EdL{NV-ND?T=9o%stgWvbfumVX%Suyr _NIz@^|5WI?6_u?nW4Lm-c;r9w3EHsyscxwGEceg75F_*Ez3Cqo8s=i+ z$nAS>M#lSq|6(#y8>Q$Hl-Rnt#Eherzs cfFrIkA&QiRL1;mx$zr1DIq8=2F%$le;Zu-y;V! zLk=NrO35`H_0gRJ*hmi(O=~MU #ZNjxyX zd?xUZHKE1IJ2B5%@oNgfKwow8E>O*elnu2#Ss8~XrU4!$^~IaVp=NLWlh9E=`rUIN zF>(X+`n|VqjFcTSd!p)*{Vlt?;pI0mC?>mGGUHJv-FV?q9*4>u4G&^ReHb@aLeq#0 z<@nW%ftv<>ZH<7YM*0mY%bW&3<-u`gu;XNkp#9Q+++?DPAc6@dD#M4fT&?{6>HkB* zIXaY5yLk7VlpW*$TufNb6fVgF+ehRpD4A63j`Fi9Buj-fs20 CgPn zDSIGSs Tq`#CBWhhZcR1}OYD zz2@&zZ+kmDKkvkRKN{d1Xz{v9A)`^&_ahEL-yYUa@0)b|pcMn8k$D 97F+rdkjFO ziLjs>yuqlBTLo~$HyntaPEK0xDb(hyTM%uJntJC~COEDgq$c7N;3MxvfzgXI;v9i_ zEMqdSVWGj~_$oP(^E3&d+`Q^O^&Q;%*zRp*HD?$N7C5>uHnB=wpN^$@Uz5h+Tzw+C z&}IQiN+}cTL`wKZo&@bT-p&*$nDQbRXT)!;jWw7%?upRdr4)>Di%EzG0>jCdj$2Ql zwPI-md12o%2wa532AP}09_0dZ;^v3o-3|;aX(0^?L`@bgJo%I-*tdqv7GQ4UM7`_Q zZ%c>j4CWp@jb*A8t#(h#)$xsz?0IfCI|j2iGC_%D@>$(%6aKp#eD~9+Crlq|Ea~JO zY%8ircDtq^CHO54Tzj-5kh}oiWyE1$>$mj;H4VN1{a!6GQdT>=ANhzFtQ?Deizm5f zIeY1y1=grEBt)Rt;}FQ8S^|6T78Vt^&pV|+tzxE7_1eNdI5ex!;uQ8SeDKQ!oO?!LLHQyB(m<_d;E@)yfT)|HgUxTgFD`-pE~Gh^x2m`rSqnW3 zSS!>88CR~QgOV_EccBD#ZWpI +ckx z)d{Yx6WIYq8bUQ>EPU=IX&*r?mR|HnJJtZFh#?9<>H6!FdYfd2fG*cCnpz1r1yAFR zcdISYaljo03&lJIxd{RdN=EpbDe$`DV5)OW1&Sy>!{Jblfh#+rNM5i|2HsqRRsmD_ z9_Y&Q(Te;+7b*%dgRAP 0>yyiO$C`lMnVTL=fxxe0G71zn@f4ZU+bHKg6 zvQ=D3+wJp@1D(yoF%3Lr{mGsNNq@dn2TxA}yBu?v1yM|~tP HsL_HQ8kq!)P&qW<>#m*`A7o4RjKk9=~4_$ zVR&0?lc)XK$tuj`QM;20NJ}fj#9`Kay_4er-R-qXf7N5cSwe1)($rns|HM$CEkm z6#+TJwmCo(BcI}`8?eP=SsQsj_Ji%aUN3Pr&a3FGQ8N{z|8K+iCL-AT$phwUT3v?D zC&2agL(U;wY<&OxjXL(vt5QxNG=!exb@W;qY~L8tD*V+J$S@}OMQ<$0$U`YVG%9@W z@g6}FGgfdCNj=_9CqxYX>dtbE35-r}Tt7Y^L-y(J@<;8qG3e7$Q93hz0`de5NeXgJ zMnt8c$sVu=x!UWa4m4H)GuvKk!`C)hPktuJ*4NKH4Uoc2HBj>!GwbEwI*8zaLw}-) zl7b>O3eb#>-f)O|SeD^+$vFzr0$<*!g~?!oc*z}q4PZkoAl{}4@>fV=ky~oJ-%wbD zd-qNJulCvvC;Z;^oMCM9cG1)W@F&R5ar4r4ayvs%DNUg+L54?7ZxfY&EUvk9#6j3M zrSA<;{EYM!Qb4kE`QZR3&XMpCE$Fd+3gvxg 4!(}h+v05}+zlj^R0FJ~*2VBufQMxGg z!{Kdwnu2{`TfEsVpW|2HH{6R^5XbZOyCb@Pw`)rBKw@dKpXR-m4GJ~_iUPM pZ^^;%+&n%0^ETpO_qNoG#ZK#4k@zW&qDL7y#x?sxBYp2dl8B zW8E~Z8n}+ro(~ds_7R&1+c*FyA3)o}>jTqWh3x~JB`L|9jsXy=iXn{vY@Y_(0yHa+ znE62Ka-adwD^+Yju%#b9m~dr;088;BvSqoi0R1OsyvOA z4OCrxmX3@bxt=S=!$+^aC7Xa>K((>9RXD8RPZj1u_|&R_Xz~V&{fbW@wl=f+^3x|h zo$OJo2n8& K-Y*cV_y%HXliRXHaBR7zhR%plmp z6`62JA`0tjL?TI~h2~C5y<40t1$9MdIVKsPK0Z?zuoh7M<~l(ba4?7TH2{rn78X}l zJ-+*)Vlsn04Xc)w4<$`!HxqF0F)5`yeTxn$L%#m5uV6?BINij}(DA~Wh>`832T9&V zTB@37o#mMn7`gi^EBvd{({q~K<%x>$S5{Fz5cJJB_ktm?q5$wJ9iGMNK3+5~Y9Bzn zbh+OT)D~h3f>o$zWks7Dm4dZ4yTUvQ1D&wxvTY0fbNQHQ*6GO8`Lq~A<=N)lyg;B( z-Th2$Rzw|s9ZEvJ*O#|!F$jQ2x|k=k>8vbhocHN#49(ze<9Hp_kdEo2;k+mFIzr69 zP5mRD{b%b~Kq7L~v2&HjeL({O*T#VFhzS53)^C)W^q(IKmsJO9v1WDm;fH2_=)^0S zV;nvoK0l@%fM%VCKl^eB?7hrBH`}JX)`w0pKFNO!|ElL*280cS#0b#{`4Q=pBEcXL zhNy*t3iOK+qZ9KZ{zirj{1>6k{^M=Cx)U{ylDvq?ax%v7-(o(q(aKD&RtEODOk@Ul z^Rh~By%3WG;CtN-{wnr(3P2!8G_@`O5DBbHsd)QU7Km3pqZgJdY$mkA1{dVbs{I{8 z>@e>#Z&FRK+2=B<(;^~$z7z}VrSa!3gBZVU;);Th>&zJ?b=530Uiy>Y74Z>>fu=sS zB=j#RYkc$}9+Z_WJzxg2D66D0hezUt4bDN$cQvAXb=6s>_)CtART-!rS1g`T&7roD z53y?px2K&V3RM)E#4}Ck5Xban845)AU(A=K3a9HzeIWhI%2;8nY<*!=W6w}@Qf|!t z<1rf0e_~4=j$GpsGoy+kpXp2$?l0JXafxN?89w-p!y!@Qacle)`7fdPQx;|!8GM5( zxNRPrJT3`E@6IPhiK&wDwje1M;Rv`GBYzxhjG;d%77?AUcBxChDASo(Uc^*c`QLW} z>5~%bB$@;zlYO+({qn#w6jeU; xaU ze*$M=PEKzWYNTZLorOqawWaBy8?mIMm1VU%*)rDYo|}j)vr(S@M8tRuy#m4Tlif?- z##E8!6lji+-#^~+^oK$+v3KH+v)k^u$m4#ICy1aI-sqY8z_x+#d+^9JidFE;u9XUV za%+Dstqm=*jG}BA^1nPuw!W5YY0~kKs!{a|^Ix2rDj0(Lke8K9)#v>Bu8*3p+UNW0 zJ&0&RS-JY`%YRB&Ul<++3NYCj=SzKx9s4ka8lsp62a$KH@=0`w3@EW(LGmvGble zqP9&90n{%utpo;fPf)u54aNgu1lKxvdC!q&2oJ3PX!svM{>P<5k$gU0>$M(}M6Q-o z5d@q`tU|9s9RuUqawq)Yugfif+Af910F&Tox=rNu6O4)IziK(spmog8pqO?J$h!&& z@@B)Nxa2%zy!Gmn5d)nUNfUqGvVs<{QKqDOe$dez9|J>w+b8c(&w%IUDT?h71IciT z3gJr@tWVsm&8T6cxawo4^q%U}?aKr3hw7{D)l)Nuw#o $HcgAp%0!(c z-GJIh##w3k`SVUgP$Pt+kur>@WdNfd7KQTq05N>rpFwExn&N}UXhJ3(;2A~r3x@6T zR)H(jB(q5WPTaN3hkhYk_6_8xulA}FL))qwzu5n_PU`}ShVbVJpDOL0nophzn^WeP zZB87@W6&HNMzD}y%Zg5bF*Y9^t!RnK1!1^dB}f6%v^8caf~d%8-!S&m=Z~Mz&>GqK zx);VEJgV|?b(XR#s7E-lPVtqgL{vA_@Yue_G|)!(*=12=y0`7p4a=IR$V1>*Y5Y}N zPX`ytGw^B-86ox{JHN1;KgpjXUxhSYg+kLL8`usKpkSmGdWuiu$Ih4$ <(c =e4`qE= JN? 1B z*Q0b8iJLvvc!bT3A4^X4ORz2eWH)YH(Nmx9y)^4tR<8AEqiS&ms6R*HDz&Ms8BmD) zCU-ejvvHkGdRWlI*ZS}HEL;T-sPx5kEWH<_xTF&z&%WfYk|@WCC>H^oF%8c3l^hFVPOtS6xhsT zuZ2*6Elsf38#&9b9-bq-Fn*A^FPHH>*uq15uc$O)_)K-zbW d3Y;2Qxtvxq4w0DBE=8 +ej)^qo0|AZvum_&;QWy3D z^slA5tnD1hDxg3bhZoWh