From b34c7bee0e52cc760ad202f15a9ff2aca30539e8 Mon Sep 17 00:00:00 2001 From: Eduardo Russo Date: Sat, 17 Oct 2026 02:13:06 +0100 Subject: [PATCH 1/3] feat(core,ocr-tesseract): read scanned PDFs by OCR with "ocr" on the request A request for a PDF takes "ocr": true or { languages, always, dpi }. Pages with no text layer are rendered at the scan's own resolution (150 to 300 dpi), cleaned (background flattened, straightened, and binarized when the first read is poor), read by Tesseract and handed on as positioned text runs, so table, region and section work on a scan. The engine is the new @opencraw/ocr-tesseract package, loaded when a recipe asks for it and bundled in the extension. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01TjR6eM2tUwU3NGnKXsmEap --- apps/vscode-extension/package.json | 2 + .../packaging/package-vsix.mjs | 2 +- docs/how-it-works/06-documents.md | 7 +- docs/recipes/authoring.md | 19 +- docs/requirements.md | 4 +- package-lock.json | 1 + package.json | 2 + packages/core/package.json | 1 + .../core/schemas/input-recipe.schema.json | 29 +++ .../src/api-steps/send-request.use-case.ts | 1 + .../http-session/http-response.contract.ts | 3 + packages/core/src/http-session/http.client.ts | 10 +- packages/core/src/index.ts | 3 + packages/core/src/pdf-document/index.ts | 1 + .../core/src/pdf-document/read-pdf.client.ts | 39 +++- .../core/src/pdf-ocr/fixtures/scan-clean.pdf | Bin 0 -> 29811 bytes .../pdf-ocr/fixtures/scan-crooked-shaded.pdf | Bin 0 -> 171594 bytes .../core/src/pdf-ocr/fixtures/scan-poor.pdf | Bin 0 -> 197212 bytes packages/core/src/pdf-ocr/index.ts | 6 + .../src/pdf-ocr/native-dpi.client.test.ts | 36 ++++ .../core/src/pdf-ocr/native-dpi.client.ts | 33 ++++ .../core/src/pdf-ocr/ocr-engine.contract.ts | 59 +++++++ .../src/pdf-ocr/ocr-page.use-case.test.ts | 88 ++++++++++ .../core/src/pdf-ocr/ocr-page.use-case.ts | 34 ++++ .../core/src/pdf-ocr/ocr-runs.mapper.test.ts | 51 ++++++ packages/core/src/pdf-ocr/ocr-runs.mapper.ts | 55 ++++++ .../core/src/pdf-ocr/render-page.client.ts | 34 ++++ .../core/src/pdf-ocr/with-ocr.use-case.ts | 44 +++++ .../core/src/recipe-schema/step.contract.ts | 7 + packages/core/tools/make-scanned-fixtures.mjs | 95 ++++++++++ packages/ocr-tesseract/.spec.swcrc | 22 +++ packages/ocr-tesseract/.swcrc | 22 +++ packages/ocr-tesseract/README.md | 65 +++++++ packages/ocr-tesseract/jest-pdfjs.cjs | 8 + packages/ocr-tesseract/jest.config.cts | 23 +++ packages/ocr-tesseract/package.json | 49 ++++++ packages/ocr-tesseract/rollup.config.cjs | 116 ++++++++++++ packages/ocr-tesseract/src/index.ts | 5 + .../src/page-cleanup/binarize.algorithm.ts | 96 ++++++++++ .../src/page-cleanup/clean-page.use-case.ts | 73 ++++++++ .../src/page-cleanup/deskew.algorithm.ts | 159 +++++++++++++++++ .../flatten-background.algorithm.ts | 86 +++++++++ .../src/page-cleanup/gray-image.model.ts | 18 ++ .../ocr-tesseract/src/page-cleanup/index.ts | 9 + .../page-cleanup/integer-math.algorithm.ts | 35 ++++ .../page-cleanup/median-filter.algorithm.ts | 51 ++++++ .../src/page-cleanup/page-cleanup.test.ts | 166 ++++++++++++++++++ .../src/page-cleanup/png-gray.mapper.ts | 46 +++++ .../create-ocr-engine.use-case.test.ts | 85 +++++++++ .../recognition/create-ocr-engine.use-case.ts | 110 ++++++++++++ .../ocr-tesseract/src/recognition/index.ts | 4 + .../src/recognition/language-codes.policy.ts | 57 ++++++ .../src/recognition/language-data.client.ts | 51 ++++++ .../src/recognition/ocr-language.error.ts | 4 + .../request-ocr.integration.test.ts | 31 ++++ .../src/recognition/tesseract-ocr.client.ts | 73 ++++++++ packages/ocr-tesseract/tsconfig.json | 13 ++ packages/ocr-tesseract/tsconfig.lib.json | 29 +++ packages/ocr-tesseract/tsconfig.spec.json | 25 +++ tsconfig.json | 3 + 60 files changed, 2182 insertions(+), 18 deletions(-) create mode 100644 packages/core/src/pdf-ocr/fixtures/scan-clean.pdf create mode 100644 packages/core/src/pdf-ocr/fixtures/scan-crooked-shaded.pdf create mode 100644 packages/core/src/pdf-ocr/fixtures/scan-poor.pdf create mode 100644 packages/core/src/pdf-ocr/index.ts create mode 100644 packages/core/src/pdf-ocr/native-dpi.client.test.ts create mode 100644 packages/core/src/pdf-ocr/native-dpi.client.ts create mode 100644 packages/core/src/pdf-ocr/ocr-engine.contract.ts create mode 100644 packages/core/src/pdf-ocr/ocr-page.use-case.test.ts create mode 100644 packages/core/src/pdf-ocr/ocr-page.use-case.ts create mode 100644 packages/core/src/pdf-ocr/ocr-runs.mapper.test.ts create mode 100644 packages/core/src/pdf-ocr/ocr-runs.mapper.ts create mode 100644 packages/core/src/pdf-ocr/render-page.client.ts create mode 100644 packages/core/src/pdf-ocr/with-ocr.use-case.ts create mode 100644 packages/core/tools/make-scanned-fixtures.mjs create mode 100644 packages/ocr-tesseract/.spec.swcrc create mode 100644 packages/ocr-tesseract/.swcrc create mode 100644 packages/ocr-tesseract/README.md create mode 100644 packages/ocr-tesseract/jest-pdfjs.cjs create mode 100644 packages/ocr-tesseract/jest.config.cts create mode 100644 packages/ocr-tesseract/package.json create mode 100644 packages/ocr-tesseract/rollup.config.cjs create mode 100644 packages/ocr-tesseract/src/index.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/binarize.algorithm.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/clean-page.use-case.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/deskew.algorithm.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/flatten-background.algorithm.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/gray-image.model.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/index.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/integer-math.algorithm.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/median-filter.algorithm.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/page-cleanup.test.ts create mode 100644 packages/ocr-tesseract/src/page-cleanup/png-gray.mapper.ts create mode 100644 packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.test.ts create mode 100644 packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.ts create mode 100644 packages/ocr-tesseract/src/recognition/index.ts create mode 100644 packages/ocr-tesseract/src/recognition/language-codes.policy.ts create mode 100644 packages/ocr-tesseract/src/recognition/language-data.client.ts create mode 100644 packages/ocr-tesseract/src/recognition/ocr-language.error.ts create mode 100644 packages/ocr-tesseract/src/recognition/request-ocr.integration.test.ts create mode 100644 packages/ocr-tesseract/src/recognition/tesseract-ocr.client.ts create mode 100644 packages/ocr-tesseract/tsconfig.json create mode 100644 packages/ocr-tesseract/tsconfig.lib.json create mode 100644 packages/ocr-tesseract/tsconfig.spec.json diff --git a/apps/vscode-extension/package.json b/apps/vscode-extension/package.json index 604e8ec7..74c2546b 100644 --- a/apps/vscode-extension/package.json +++ b/apps/vscode-extension/package.json @@ -348,6 +348,7 @@ "build", "@opencraw/cli:build", "@opencraw/mcp:build", + "@opencraw/ocr-tesseract:build", "@opencraw/agent:build", "@opencraw/studio:build", "@opencraw/studio-ui:build" @@ -364,6 +365,7 @@ "build", "@opencraw/cli:build", "@opencraw/mcp:build", + "@opencraw/ocr-tesseract:build", "@opencraw/agent:build", "@opencraw/studio:build", "@opencraw/studio-ui:build" diff --git a/apps/vscode-extension/packaging/package-vsix.mjs b/apps/vscode-extension/packaging/package-vsix.mjs index 6e7f58bb..681be3dc 100644 --- a/apps/vscode-extension/packaging/package-vsix.mjs +++ b/apps/vscode-extension/packaging/package-vsix.mjs @@ -11,7 +11,7 @@ const appDir = resolve(dirname(fileURLToPath(import.meta.url)), '..') const repoRoot = resolve(appDir, '..', '..') const stage = join(appDir, 'dist-vsix') const tarballs = join(stage, 'tarballs') -const PACKAGES = ['core', 'office-reader', 'probe', 'studio', 'cli', 'mcp', 'agent'] +const PACKAGES = ['core', 'office-reader', 'ocr-tesseract', 'probe', 'studio', 'cli', 'mcp', 'agent'] // Run npm's own CLI with this Node: no shell, so no quoting to get wrong and no .cmd shim on Windows. const npmCli = process.env.npm_execpath ?? [ diff --git a/docs/how-it-works/06-documents.md b/docs/how-it-works/06-documents.md index 6e7bcf98..e90a6239 100644 --- a/docs/how-it-works/06-documents.md +++ b/docs/how-it-works/06-documents.md @@ -204,8 +204,9 @@ stellantis-it: 147 emitted, 0 rejected, 0 duplicates, 1 pages The font name, the direction (`dir`), the rotation part of the matrix, colours and every drawing are **not** kept: the reader works from text positions alone, and never sees table ruling. 5. The page's runs go through `assembleRows`. If **every** page ends with no row, the read fails with - `no page has a text layer (a scanned PDF? OCR is not supported)` (`:40`). A PDF where only some pages are - scans reads, and those pages have no rows. + `no page has a text layer: it is a scan. Read it with OCR…`. A PDF where only some pages are scans reads, and + those pages have no rows, unless the request has `ocr` (see below): then those pages are rendered, read by the OCR engine and their words + become runs like a text layer's. The result, `{ kind: 'pdf', pages: [{ number, width, height, rows: [{ top, bottom, cells, text }] }] }`, is what `jsonpath` queries. A cell is `{ x, y, width, height, text }`; a row's `top` is its highest `y + height`, @@ -676,7 +677,7 @@ as on workbooks ([`extract-from-document.use-case.ts:128`](../../packages/core/s | Case | What happens | Why | |---|---|---| -| A scanned page | No rows on it. If every page is a scan, the read fails. | pdf.js reads the text layer; there is no OCR. | +| A scanned page | No rows on it. If every page is a scan, the read fails. With `ocr` the page is read from its picture. | pdf.js reads the text layer; OCR is opt-in. | | Password-protected PDF | The read fails at load. | No password is passed to `getDocument`. | | Rotated or vertical text | Rows and columns come out wrong. | Only the origin and `width`/`height` are kept; every stage assumes horizontal, left-to-right baselines. A page with `/Rotate` reports its rotated size, but the item coordinates are not transformed. | | Two columns closer than `JOIN_GAP` | They merge into one cell (3.5 pt at 10 pt). | Nothing but the gap separates two runs on a line. | diff --git a/docs/recipes/authoring.md b/docs/recipes/authoring.md index 8da6f9ca..3edc1cd8 100644 --- a/docs/recipes/authoring.md +++ b/docs/recipes/authoring.md @@ -265,7 +265,7 @@ call their JSON endpoints: a report whose table the page reads from an API is re | Step | Fields | Notes | |---|---|---| -| `request` | `url` (template), `method?`, `query?`, `headers?`, `body?` or `form?`, `as?` (`json`, `jsonl`, `html`, `text`, `pdf`, `csv`, `xlsx`, `pptx`, `yaml`, `markdown`, `xml`, `docx`), `encoding?`, `delimiter?`, `scalars?` | The response becomes the current document and, if `id` is set, the id holds the parsed JSON, the read PDF, workbook or deck, the markup or the text. Relative URLs resolve against the current page; one with no page to resolve against fails with a message saying so. Without `as`, the content type decides (`application/pdf` is a PDF, `text/csv` a CSV, a spreadsheet type a workbook, a presentation type a deck, `application/yaml` YAML, `application/x-ndjson` JSON Lines, `text/markdown` Markdown, an XML type XML: §4.12, a Word type a document read as HTML: §4.13); a type that says nothing (below) is sniffed. A `file:` URL reads a local file, its kind from `as`, else the extension (`.pdf`, `.csv`, `.tsv`, `.xlsx`, `.xlsm`, `.pptx`, `.yaml`, `.yml`, `.json`, `.jsonl`, `.ndjson`, `.md`, `.html`, `.xml`, `.rss`, `.atom`, `.xml.gz`, `.docx`), else its bytes; a relative one (`file:data/listino.csv`) is read from the recipe file's folder (below). 4xx/5xx fail the step. | +| `request` | `url` (template), `method?`, `query?`, `headers?`, `body?` or `form?`, `as?` (`json`, `jsonl`, `html`, `text`, `pdf`, `csv`, `xlsx`, `pptx`, `yaml`, `markdown`, `xml`, `docx`), `encoding?`, `delimiter?`, `scalars?`, `ocr?` (a scanned PDF: see **A scanned PDF** in the PDF section) | The response becomes the current document and, if `id` is set, the id holds the parsed JSON, the read PDF, workbook or deck, the markup or the text. Relative URLs resolve against the current page; one with no page to resolve against fails with a message saying so. Without `as`, the content type decides (`application/pdf` is a PDF, `text/csv` a CSV, a spreadsheet type a workbook, a presentation type a deck, `application/yaml` YAML, `application/x-ndjson` JSON Lines, `text/markdown` Markdown, an XML type XML: §4.12, a Word type a document read as HTML: §4.13); a type that says nothing (below) is sniffed. A `file:` URL reads a local file, its kind from `as`, else the extension (`.pdf`, `.csv`, `.tsv`, `.xlsx`, `.xlsm`, `.pptx`, `.yaml`, `.yml`, `.json`, `.jsonl`, `.ndjson`, `.md`, `.html`, `.xml`, `.rss`, `.atom`, `.xml.gz`, `.docx`), else its bytes; a relative one (`file:data/listino.csv`) is read from the recipe file's folder (below). 4xx/5xx fail the step. | **A body served as anything** (`application/octet-stream`, `binary/octet-stream`, `text/plain`, `application/zip` and the like, or no content type: a file behind a bucket or a CDN, a download link, a raw file) is read by what it @@ -630,7 +630,7 @@ repeating element (`table.credit_group tr`, not `tr`) and check the first record `request` with `as: "pdf"` (or a response served as `application/pdf`, or a local `file:…pdf`) reads the PDF's text layer with pdf.js into pages of **rows**: text that sits side by side becomes a cell, cells whose vertical extents overlap become a row. A scanned page has no text layer and gives no rows; a PDF where no page -has one fails the step (no OCR). Five extract kinds read it: +has one fails the step, unless the request says `"ocr": true` (below). Five extract kinds read it: | `kind` | Reads | Use for | |---|---|---| @@ -640,6 +640,21 @@ has one fails the step (no OCR). Five extract kinds read it: | `regex` | the text: one line per row, cells separated by a tab, pages by a blank line | a value next to a label: `Valid until\t(\S+)` | | `jsonpath` | the structure: `{ kind: "pdf", pages: [{ number, width, height, rows: [{ text, top, bottom, cells: [{ x, y, width, height, text }] }] }] }` | positions, a given page | +**A scanned PDF** has pictures where the text should be. Say `"ocr": true` on the `request` and OpenCraw renders each page +that has no text, reads it with Tesseract, and hands the words on as the same positioned cells a text layer gives, so every kind +above (`table`, `region`, `section`) works on a scan as it does on a digital PDF: + +```json +{ "type": "request", "id": "doc", "url": "{{start.url}}", "as": "pdf", "ocr": { "languages": ["por", "eng"] } } +``` + +`ocr` is `true` (English, only the pages that have no text) or an object: `languages` (Tesseract codes; `eng` comes with the engine, any +other is `npm install @tesseract.js-data/`), `always` (read pages that have text too, for a PDF with a wrong text layer from bad OCR; +the text layer is then dropped) and `dpi` (default: the scan's own resolution, between 150 and 300; rendering a soft scan larger only blurs +it). The engine is the `@opencraw/ocr-tesseract` package, installed next to `@opencraw/core` (the request says how if it is not). It +straightens a crooked page, flattens a shaded one and tries a second, stronger cleaning when the first reads poorly. OCR reads +what is printed; it can still confuse a character (`8,0%` read as `8,09`), so check a number that matters against a second source. + **Prefer structure to position.** A `region` is a place on the page: it breaks when a description is longer, a table has one more row or a column is added. Two sheets of the same layout and different content are read with `section` (the text between two headings) and `regex` (the value after a label), which find their text wherever it diff --git a/docs/requirements.md b/docs/requirements.md index 1e39b511..3fec166c 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -175,7 +175,7 @@ steps; section 5). | `evaluate` | web | value | `script`, JavaScript run in the page; `args?`. Trusted recipes only. | | `screenshot` | web | – | `path` | | `captcha` | web | – | `solver?`, `selector?`, `verify?`, `attempts?`, `timeoutMs?`; for form captchas `image`, `refresh?`, `field`, `submit`; defaults from `session.captcha` | -| `request` | both | document | in web mode through the page's session, with `form?` (`{ selector, omit?, set? }`) instead of `body`; `method?`, `url` (`http(s):` or a local `file:`; relative to the current page, else a clear error), `query?`, `headers?`, `body?` (templated at every depth), `as: 'json' \| 'jsonl' \| 'html' \| 'text' \| 'pdf' \| 'csv' \| 'xlsx' \| 'pptx' \| 'yaml' \| 'markdown' \| 'xml' \| 'docx'`, `encoding?`, `delimiter?` (CSV), `scalars?` (YAML) | +| `request` | both | document | in web mode through the page's session, with `form?` (`{ selector, omit?, set? }`) instead of `body`; `method?`, `url` (`http(s):` or a local `file:`; relative to the current page, else a clear error), `query?`, `headers?`, `body?` (templated at every depth), `as: 'json' \| 'jsonl' \| 'html' \| 'text' \| 'pdf' \| 'csv' \| 'xlsx' \| 'pptx' \| 'yaml' \| 'markdown' \| 'xml' \| 'docx'`, `encoding?`, `delimiter?` (CSV), `scalars?` (YAML), `ocr?` (a scanned PDF: `true`, or `{ languages?, always?, dpi? }`) | | `extract` | both | value or list | `selector` (a template), `kind: 'css' \| 'xpath' \| 'jsonpath' \| 'regex' \| 'table' \| 'region'`, `take`, `many?`, `from?`; `table` also `columns?`, `until?`, `align?` (PDF), `fillDown?`, `sheet?`, `headerRows?`, `includeHidden?` (workbook), `slide?`, `shapes?` (deck) | | `set` | both | value | `value` (template or literal) | | `collect` | both | – | `into` (a list id bound in an enclosing scope), `value` (template or literal); appends, so values outlive the `forEach` iteration or `paginate` page that found them | @@ -197,7 +197,7 @@ the folder of the recipe file that names it when the recipe is read from a file `vars`, `matrix` values, every step `url`; a template's placeholders are kept), else against the process working directory. `allowedHosts` refuses `file:` URLs, relative or not. -A PDF (`as: 'pdf'`) is read into pages of rows of positioned cells (pdf.js, text layer only; a scan fails). +A PDF (`as: 'pdf'`) is read into pages of rows of positioned cells (pdf.js on the text layer; a scan fails unless the request has `ocr`, which reads its pages by OCR with `@opencraw/ocr-tesseract` and gives the words as the same positioned cells, so `table` and `region` work on a scan too). `table` finds tables by their header row and returns `{ page, title, header, rows }`, rows keyed by column: columns come from where the body's cells start, and lines of a wrapped cell are regrouped into their row. `regex` reads a PDF as text (one line per row, cells tab-separated), `jsonpath` reads its structure. `region` diff --git a/package-lock.json b/package-lock.json index 79a849bd..113de473 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38583,6 +38583,7 @@ "version": "0.0.1", "license": "MIT", "dependencies": { + "@napi-rs/canvas": "^1.0.0", "@opencraw/office-reader": "^0.0.1", "@xmldom/xmldom": "^0.9.12", "cheerio": "^1.2.0", diff --git a/package.json b/package.json index 13364e89..be78e4eb 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "captcha-tesseract:qa": "nx run captcha-tesseract:lint && nx run captcha-tesseract:test", "captcha-tesseract:build": "nx run captcha-tesseract:build", "captcha-tesseract:e2e": "nx run captcha-tesseract:e2e", + "ocr-tesseract:qa": "nx run ocr-tesseract:lint && nx run ocr-tesseract:test", + "ocr-tesseract:build": "nx run ocr-tesseract:build", "azure-durable:qa": "nx run azure-durable:lint && nx run azure-durable:test", "azure-durable:build": "nx run azure-durable:build", "azure-durable:e2e": "nx run azure-durable:e2e", diff --git a/packages/core/package.json b/packages/core/package.json index 4121cc6b..726c73aa 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,6 +20,7 @@ "!**/*.js.map" ], "dependencies": { + "@napi-rs/canvas": "^1.0.0", "@opencraw/office-reader": "^0.0.1", "@xmldom/xmldom": "^0.9.12", "cheerio": "^1.2.0", diff --git a/packages/core/schemas/input-recipe.schema.json b/packages/core/schemas/input-recipe.schema.json index 2467a185..03f44f90 100644 --- a/packages/core/schemas/input-recipe.schema.json +++ b/packages/core/schemas/input-recipe.schema.json @@ -1614,6 +1614,35 @@ "typed", "text" ] + }, + "ocr": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "properties": { + "languages": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z]{3}(?:_[a-z]+)?$" + } + }, + "always": { + "type": "boolean" + }, + "dpi": { + "type": "integer", + "minimum": 72, + "maximum": 600 + } + }, + "additionalProperties": false + } + ] } }, "required": [ diff --git a/packages/core/src/api-steps/send-request.use-case.ts b/packages/core/src/api-steps/send-request.use-case.ts index 9846511b..ef408290 100644 --- a/packages/core/src/api-steps/send-request.use-case.ts +++ b/packages/core/src/api-steps/send-request.use-case.ts @@ -43,6 +43,7 @@ export async function sendRequest (step: RequestStep, scope: ExtractionScope, cl encoding: step.encoding, delimiter: step.delimiter, scalars: step.scalars, + ocr: step.ocr === false ? undefined : step.ocr, timeoutMs: recipe.limits?.timeoutMs, } const rule = resolveRetryRule(recipe.limits?.retry) diff --git a/packages/core/src/http-session/http-response.contract.ts b/packages/core/src/http-session/http-response.contract.ts index 4abf6bed..df0a11c9 100644 --- a/packages/core/src/http-session/http-response.contract.ts +++ b/packages/core/src/http-session/http-response.contract.ts @@ -1,5 +1,6 @@ import type { DeckDocument } from '../deck-document' import type { PdfDocument } from '../pdf-document' +import type { OcrSetting } from '../pdf-ocr' import type { WorkbookDocument } from '../workbook-document' import type { XmlDocument } from '../xml-document' import type { BodyKind, HttpMethod } from '../recipe-schema' @@ -19,6 +20,8 @@ export interface HttpRequest { delimiter?: string /** A YAML body's scalars: `typed` (default) or `text`. */ scalars?: 'typed' | 'text' + /** Read a PDF that is a scan by OCR (needs `@opencraw/ocr-tesseract`): `true`, or the languages, `always` and `dpi`. */ + ocr?: true | OcrSetting timeoutMs?: number } diff --git a/packages/core/src/http-session/http.client.ts b/packages/core/src/http-session/http.client.ts index 21988127..83b2c8b8 100644 --- a/packages/core/src/http-session/http.client.ts +++ b/packages/core/src/http-session/http.client.ts @@ -9,6 +9,8 @@ import { readDocxHtml } from '../docx-document' import { readMarkdown } from '../markdown-document' import { openDocumentFormat } from '../opendocument-sniff' import { readPdf } from '../pdf-document' +import { withOcr } from '../pdf-ocr' +import type { OcrSetting } from '../pdf-ocr' import type { BodyKind } from '../recipe-schema' import { csvWorkbook, readXlsxWorkbook, sheetNameOf } from '../workbook-document' import { parseJsonLike, parseJsonLines } from '../selection' @@ -146,7 +148,7 @@ export class HttpClient implements HttpSender { * @param reading - `as`, `encoding`, `delimiter`, `scalars`. * @returns The document, what reading noticed, and the format. */ -export async function readFileBody (bytes: Uint8Array, name: string, reading: Pick = {}): Promise { +export async function readFileBody (bytes: Uint8Array, name: string, reading: Pick = {}): Promise { return parseBody(reading.as ?? formatOfFile(name, bytes), bytes, name, reading) } @@ -178,7 +180,7 @@ async function readLocalFile (httpRequest: HttpRequest): Promise { return { status: 200, url: httpRequest.url, headers: {}, body, format, ...(warnings.length > 0 && { warnings }) } } -async function parseBody (format: BodyKind, bytes: Uint8Array, url: string, reading: { encoding?: string, delimiter?: string, scalars?: 'typed' | 'text', charset?: string }): Promise { +async function parseBody (format: BodyKind, bytes: Uint8Array, url: string, reading: { encoding?: string, delimiter?: string, scalars?: 'typed' | 'text', charset?: string, ocr?: true | OcrSetting }): Promise { if (format === 'yaml') { const { text } = decodeText(bytes, reading) const { data, warnings } = await readYaml(text, url, reading.scalars) @@ -207,8 +209,8 @@ async function parseBody (format: BodyKind, bytes: Uint8Array, url: string, read return { body: await parseFormat(format, bytes, url, reading), warnings: [], format } } -async function parseFormat (format: BodyKind, bytes: Uint8Array, url: string, reading: { encoding?: string, delimiter?: string, charset?: string }): Promise { - if (format === 'pdf') return readPdf(bytes, url) +async function parseFormat (format: BodyKind, bytes: Uint8Array, url: string, reading: { encoding?: string, delimiter?: string, charset?: string, ocr?: true | OcrSetting }): Promise { + if (format === 'pdf') return reading.ocr === undefined ? readPdf(bytes, url) : withOcr(reading.ocr, async ocr => readPdf(bytes, url, { ocr })) if (format === 'xlsx') return readXlsxWorkbook(bytes, url) if (format === 'pptx') return readPptxDeck(bytes, url) const { text, encoding } = decodeText(bytes, reading) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f3c70392..86f7afd3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -31,6 +31,9 @@ export { tryParseJson, selectHtml, countMatches, matchesOf, NODE_ID_ATTRIBUTE } export type { HtmlMatch } from './selection' export { readPdf, PdfReadError, analyzeTables, findTables, pdfText, isPdfDocument, rowsOfCells, findSections, marginRows, parseRegion, regionSelector, regionText, regionCells, isInsideRegion } from './pdf-document' export type { DocumentRegion, PdfRegionMatch, PositionedBox, PdfSectionMatch, PdfSectionQuery } from './pdf-document' +export type { PdfPageHandle, PdfPageOcr, ReadPdfOptions } from './pdf-document' +export { pdfPageOcr, ocrRuns, withOcr } from './pdf-ocr' +export type { OcrEngine, OcrLine, OcrOptions, OcrPageImage, OcrWord, PdfOcr } from './pdf-ocr' export type { PdfDocument, PdfPage, PdfRow, PdfCell, PositionedText, PdfTable, TableQuery, TableAlign, TableDiagnostics, TableBandDiagnostics } from './pdf-document' export { parseCsv, detectDelimiter, csvWorkbook, readXlsxWorkbook, findGridTables, fillDown, workbookText, isWorkbookDocument, htmlTableSheets } from './workbook-document' export { readMarkdown } from './markdown-document' diff --git a/packages/core/src/pdf-document/index.ts b/packages/core/src/pdf-document/index.ts index 02e4abbf..08bf3f15 100644 --- a/packages/core/src/pdf-document/index.ts +++ b/packages/core/src/pdf-document/index.ts @@ -1,4 +1,5 @@ export { readPdf, PdfReadError } from './read-pdf.client' +export type { PdfPageHandle, PdfPageOcr, ReadPdfOptions } from './read-pdf.client' export { pdfText, isPdfDocument } from './pdf-document.model' export type { PdfDocument, PdfPage, PdfRow, PdfCell, PositionedText } from './pdf-document.model' export { assembleRows, rowsOfCells } from './row-assembly.algorithm' diff --git a/packages/core/src/pdf-document/read-pdf.client.ts b/packages/core/src/pdf-document/read-pdf.client.ts index e374e625..35313f77 100644 --- a/packages/core/src/pdf-document/read-pdf.client.ts +++ b/packages/core/src/pdf-document/read-pdf.client.ts @@ -1,3 +1,4 @@ +import type { PDFDocumentProxy } from 'pdfjs-dist/legacy/build/pdf.mjs' import type { PdfDocument, PdfPage, PositionedText } from './pdf-document.model' import { assembleRows } from './row-assembly.algorithm' @@ -6,18 +7,38 @@ export class PdfReadError extends Error { override readonly name = 'PdfReadError' } +/** A page as pdf.js gives it. */ +export type PdfPageHandle = Awaited> + +/** How to read a page that has no text layer: render it and read its picture. */ +export interface PdfPageOcr { + /** The text runs of the page, read from its picture; `height` is the page's height in points. */ + readPage: (page: PdfPageHandle, height: number) => Promise + /** Read every page this way and drop the text layer, for a PDF whose text layer is wrong. Default: only the pages with no text. */ + always?: boolean +} + +/** How to read a PDF beyond its text layer. */ +export interface ReadPdfOptions { + /** Read the pages that have no text layer (a scan) by OCR, or every page with `always`. Without it a PDF with no text at all is refused. */ + ocr?: PdfPageOcr +} + /** * Reads a PDF's text layer into rows of positioned cells, with pdf.js. pdf.js * is imported on first use, so recipes that never read a PDF never load it. - * Only text is read: no page is rendered, no script runs, no font is loaded. + * Only text is read: no page is rendered, no script runs, no font is loaded, unless a page is read by + * OCR (`options.ocr`): then that page, a scan with no text layer, is rendered and its picture read, and its + * words come back as the runs a text layer would have given. * * @param bytes - The file. * @param source - Where it came from, for messages. + * @param options - OCR, for a scanned PDF. * @returns The document. - * @throws PdfReadError when the bytes are not a readable PDF, or no page has a - * text layer (a scan: OCR is not supported). + * @throws PdfReadError when the bytes are not a readable PDF, or no page has any text: no text layer + * and no OCR asked for (a scan), or an OCR that found nothing. */ -export async function readPdf (bytes: Uint8Array, source = 'PDF'): Promise { +export async function readPdf (bytes: Uint8Array, source = 'PDF', options: ReadPdfOptions = {}): Promise { const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs') // pdf.js takes ownership of the buffer it is given, and refuses a Node // Buffer: hand it a plain copy. @@ -34,10 +55,16 @@ export async function readPdf (bytes: Uint8Array, source = 'PDF'): Promise ('str' in item ? [runOf(item)] : [])) + let runs = content.items.flatMap(item => ('str' in item ? [runOf(item)] : [])) + const { ocr } = options + if (ocr !== undefined && (ocr.always === true || runs.every(run => run.text.trim() === ''))) runs = await ocr.readPage(page, height) pages.push({ number, width, height, rows: assembleRows(runs) }) } - if (pages.every(page => page.rows.length === 0)) throw new PdfReadError(`${source}: no page has a text layer (a scanned PDF? OCR is not supported)`) + if (pages.every(page => page.rows.length === 0)) { + throw new PdfReadError(options.ocr === undefined + ? `${source}: no page has a text layer: it is a scan. Read it with OCR ("ocr": true on the request step; it needs @opencraw/ocr-tesseract)` + : `${source}: no page has a text layer, and OCR found no text on any page`) + } return { kind: 'pdf', pages } } finally { diff --git a/packages/core/src/pdf-ocr/fixtures/scan-clean.pdf b/packages/core/src/pdf-ocr/fixtures/scan-clean.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d089371b6aa28f64a3ed24297b28e02e8f5e4372 GIT binary patch literal 29811 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�_2ka5+%4+p}RSc6&|Y z>@(4z5cMR)&*Q7!XGIXMcN$&k9Ous1de1&5pQJ3p-cV3T)Hm_!FsyfWT*|IXiA_G@ z4;7gwq14rKM9f%yZV`=}r;RtV&Fu^j81A|~sq2RQP(ZFhaxbBt$S?BzcOke)%S*}h z)1WG5K(FfXBzSM;w~K`Np6EKLPKjq=x5?_WKd@~}wbF$gi$yetAx|fU6Yt%G*WgPX zz2*Ii6+lt$H`7MUjV^xLjOlb2y?B=(oc>z$;5gra)i2Qrz8{_kocD`md-ir}W-r3p zCOP5QhlJ$8mBDu|7q83Zh6het3a5>)DvnCnzazUt++R-y?IWP0uTsgO!psl9@;r^{ zpfSQa7(Y2iD!oi>Po2MHU=`J+IK#}EF+%8Ns|%ksgy^>BNIQ)*-QmoiZv1?J-@{rv zbxcUAu`0Hr4yVy+e3E@x`bGJu(PU{ykZ_?Ur_3FeRNZXLm(1|-Chf=kG5pV*`f&y; zM3kXR^IWs1C?3+S(;XZxHaAcv_b$R+?$4+GBxb%DzuAM{ySg8)1fV+4WRZdGB8iT5 zfUJ;}|M3-IgTJ=|5KxVS*uq^QzPpka_YY1tDcZDXAV^5w-SH=4gpx4IPT==DS_ zOm$lqADhG%#A!VHYDD!4AFncs^`V*KTsy+ECsxUel>Iw4erE_b;I}8Jw_i^|5r65FMl#|)b_aTIf{~o(49QL%-d9c=Sa67S17{)o;g$BBtL5JeMuiX2S4dUdnIfpa!leb-rLH1s2MG~GhZ}MPj-CWkimJivnZ>z!L;p*c}2{v6W zo(^hMmgx>d2^k@K06|t1OXMUhXbhmTM=gf3?jLi`8!8^}9F9w@Vw1ep##O+{LC#Wj z{THG3+2{6gVu9iU-Mrr*ca@(^h&WK^6WV4fYRl@z(sh@sR=5p7LiB z@8a88szns)@MWH_rhD23zyCT3+?#CB6Cqp(BMM+)X@-?)(i@~guOcIe^i*e_8n_wH zUhUPw{gDh89WKj}g`K^R*_YGu+FUUR?_d z>7nxZhF4f6q=yuw&Nsv&OMOX@FHwNSFyf1L-bW%0j8xGGv3+pe$Dra}%;}KP(;II> zKb>yKdVjHLEw>jf|MCa>!GxwCd-5mr<@~U^h)=cTDN5go?m5YPED(>$p37J}|@{%hESL92jH+z!&BTOjmBH+z5_UmiKmcdFI(p zm7%YBp(%|Ct7T5g4i;{KJ~^J=Oyt$^b<0xRl}#9YnF~B&nHkO|9%}tlfJ;?EB75`l zB;ksuTkk;G9zJ%F$m3GEtZL>jT{4#wFv3Q)O_I~Nnuk-Sy)F#KnaR@Z;?RVVe$v4o zA!E(=_fL?y#PWAok)7-?tSpjLt37Wf-c28{Wg%|8^LKJkDxz!$v#7wEZGYZzjn)2_ zbP$e}1j@`^u39?18Fp%WfMNiLG)%HyNwt((ysJ-Jt2fpD^*- zB_Ac~mz!w)>uHHZ{x+!>+FjMRFAZnvk>}VFoNq`yNx8q&t!Aep!>l+kPiXO51Be6C zES;GgZh4uM{n}>BpfVPNUZ6xI;KN9O8}EJs$(|y^k?L}tF1}>hqPmAI*)UNAzf$Gu z*Ffj|oo59crNk$a^=J$Slmb1;?#iezz8QX~Qg@EmfP^~0iyLPTf8_V2$OpOxbWCgs z0bj-TVm&cA*K?TfJ~-GC{0b}8PvY8YA)g0d`|!#jljCIa8*kZr>PYtxP=Y2Qi0ng@t^k?qBh=Z zzi?qS{M)Xg+L7M$U0-hr9ylHmEnCH(QBlo?`?a5ZrJm2`!wnln(q`p{0YRXIL^A#S zylJqEMfGuu4BHrAd&o%My%+Qu{Pe0Diq; zN&Bet7PrWR0M#9$XIIAq!4*b%eu9fY`tgORZ^f5=U)#byM?Eg-YEN-d?K}mn@=h(G zgHm=C_mW}?z%fCZ0@_=ooT%=Ob~+b-NcH`EkkKtCIq710ySb<)7J0FjmVgBt;PztW zhrMtt;DvGm&^5zPd993hI|mB_)6JgHJhW>~idM_pxZac4dihx1@G%tZ!7OD5Le6_{CP@;pAh_=V{mi%eri~Tby;jLbzFfkW+q1D=V^JrL)m! zoRJ+-U!~sSW@ku*x=A2gcn2{2Te%km#an%=kuj+HLT`gsohB>#1CAxll*cH5v9bz{FC5S#7hqbT17dKq7T$N*qM*&X z+REV%>~Z(a5U11Pqjq^^*X>?^9PX#rSyMZEk?il73xDvq)%~%|E2~`&EHB-%-Kl5+> zceIknUEa47%9`;SSV~a0EKm;6NCw9fuyc(V(q-X1#|Z!I)Kf1gnS7KVPklxTAgD1k z1J=)_hFCQJ-S3G426WW!i1V8wE}^2UZ@XoOlS|S(*XyQ_$Kz_A2RNHnDE{$bQx~aq zf<;k?xH6)zZh_1G3bpB}jl)99>YnWM;l#ZFq3``SVe0uo+R{>-r~$jfKbKuj%0`=+ z_crbN-x7U)^jHHQrwH1Ak4!^d#-nAi;ME0SBO6DCp_8KP21B|^%dBt+05n>mpws-_ zpoIVzW?i^W=vK7C8ODiSZRKdQZ=+5F?xa!&Sy^~XS72jEaTt%W{R?6ln z4y2xoiir9=W#gguXDZLJg+!3fi7WxU2PWCY3jNr2nh&W~a}jS+mz)NfcmVvK6IO~M z33Llk-87q(Egn}IG}VnLzr0x;vGKn=YF86@B#PlgVsr&J4<;RJHod=@jvm^?+V2;g z^z2#XXa9<#``B|H*?>+O>*NMyb?wgoYO`V5=m9Tw0zpCOUeCYo>)U4%6J*ePLJwB} zfk#L>_2h}+)ci>V9=#y&c1FNb7KbZhrmNgZ5k*`@vPJ4m(AR%Gffd4Ccu`(m(e z09|XfuLaXsznuZT^$=twTd2QTXZBi3q&M;pfFk=x3H747f;s0A6sKJ+Wuae>)%XGz zeb!Y)ePzwag~?>~STZyPaFm8bViQ8_-eG?-XZo)tNA&nY zKtavXX94t4B9m;?I)s{Cu__?BzeGkkk<{sFqbuBj`k9phZLH|ibH#}WRbUH40^*?P zD29Qj+=-YFNe{ICE&3*X@w{y09LjA~S)J;v#@q-gKogBE6Lgf#_uqi6_hKG5o9y+_ zlP1YAbMa1S)jS@dACbmWLFQ`D>bP~x=c2r+cUEE~S1T^H#yiYQ4gkqw7rRx3Ro;tk zx8g9Y!yP~!&dg~mHs8aQWjQVMMh`CEsYzKE;#tPnnumh+VCY90WDtygn;RQ~O&(ts zevGEG=HZIbPr|T?oiJtDuX+j@Ew5QfS<`}+}T*bu8 zA>^NnQhSiRZqDpS7_Y(9r?bj1v2+Ga+~`l)4sI|vpq|fukqUh(s_D93J*`MR-5SzU zmMw0Fb(&ePk1)kbOi70KXHl)MC=X7ueC^ml;gglKyA1Jk9rQ~^o{Smuk>iSk(WhI2 zERX)`%iK4eRza`3OPI1|i@-VBH^(#Q^azq&(}*(M+BaI0)!Qk5ZYsQml>O=;7&HV++vVf0boJ$ z$(h{IUu}T-9S$ZKxdgzo?YSkIqugbb6^5S(NL<7pV9f&^A#_32CvGMl^r#05!M^hh zl3X2A;ZHwd#DY3E1iuMNMMb22mTBT@ZaCm4}$@<-g>vKY-5qZjZ4H@wQu^k_*y_&@*gZVId@`$ZTl^ix6JMHWHit_si}jyy`XMip8z!q!r1!S!<<^gLzul8O>ELtO`JmthrIU#u2#U;6y6o`#}c4*v~xZQS_^ z`!-(cAjIOL*E^dRPU)1ncMrm!_B-GbGP%$;+&yweq+dG;Nh<$!`HdSBOx7O)(S90W zDNn7_7_t1a{xldG|1nBk(_HFa?joZNsIZ4Y)i7lG+VA8R$xAx>)tvQ2QGd1wHKGQS zQC@$y6St&9;ZjzIHd7L37f|Vm0v&(PI+0p@d9!cjG_cCW|M`M2+IGGB@5Z$nm)j7- zH#(94Fze-4lOR{Z_qnUwK03~YNAtapV-z;`W}P_e+bm-N4rA99nlw51q7rt=zO{&0$x-6{XVkNLf zPE=s{FP&sVZT4qqUiIA36YOTu4^5BeH2a@t7+9py%%aqjA<$Q#Gr@`XaUye&7w2-Y z;VACSr>mQ|b9aGsp~0d4aPb~>iTvQ_B@Ko<;!3huHz=v5fj7U5u|_2`*?sp;qI|5a zKlR{(Z)lq7E&#Pg8Hh$=YOQ_0BZ$<)7D9&S@G}wR4*Q%?*sS>T8MAzvv5c0FmhXY) zj2yK zL)LJwgfkV=ho&g!`!z}P(vWhdY7(B}e%;td?A6dtS{ zw%7kmztHo|Gi=iP8Rn#sT4TT1iXs-fP6v>Jfn;EVP;$HgDJ^H_aq`Od-5}D$r3a86 zp>~}LDE@G2)M-c>FG`g<-z*>DH_aWRG#B>Y>2O)?*kEf}KQTT2lPJKhne0?nwRb57 zNPd3*o<-Fdj4RSFo8K#EI1bV~OPA z47zpQFFqo*8=6@tS>D3CFrrYygHOrxVrpMifV3bg)U3sl+Ka>K@~CJT_9ipmKm7sy zst41I8SF*u6`WB~Q3pHoK8vmiu)y)sI~}mCH7R@%Y+UT!_iE5%^mqGh$6sX~4UxwY zmD!y6rS4s*U}TDFa2BL`+Wn1|Qv5D&-vg^zJmw~{u zPCMSa!IYbGVaX&WA|WI)fwSgj`4-mqmJ+}klzZ{Ubz?8+z8+`4{!@!it}*wN^P0pP z^5*7Me?w9Qgm(O{yu#rt{n_|<1(NSR47!U7vnWcrrS6*}o-&bO3eKr346Ws?F->J= z8V-iiKb4Zx8F^=XwoN9I{9@x`x+d@|j5M zEow(3Tu+Kv^AN3^m^>$E$p;@snBn~Z;U{cd+G343K`j2;&``&eOMad`t3+plWkWADsYKNY_ zJQMwVXs6KrgcOgr+{jBTBpPhTSk4~uq{A%yWze}y`9EHL8#-Al>On{(m_ZSCEgR=I zy;)REVBGnWEdv4(5wDy?npv#t{q6g#EpKAtI58D<$F=-J3qIY)4;7J0*W3B^EF+Sb z<#Dw#A9Q^)$L^lV+6-#cv*ek_;SOXjyP)-LTqgm=t>6P2Ee~JNU3G%d^V1E;PD^Gs z)CMtauGlQ-AKDwbUq|n$F6Q|{Gj@2;V1nHTQWTo@&pa{w@L(n+Hz94IzPx(#V7#pK zkN%+URyR;6Grg9zi&k&j=*wdV@NywXL zgQg__t2B_J@RL=)uA^QO5Mt8a>6bWCow;L_5_SBYxbT@{+&y+;y2%ijrGtyh(Z+?u z`5%(-0^)TY=D81?$aCe|*O&SL7Tw)`o%~5&z-d!!`+i**4gpq|cC-oT`_~q^8Tg3B${JSIZ`HH4 z%I3w)YyQB#ht-uQ8VITW{ivX#FcFl|s{O#Xs>&8(%AOZNJl9r4BGC+~a;v?p|6|V_uCB&ISZTLh*?7!+aYt zuijI9HZWFvBEZ3){=2Z&M}hjx)qi?=)#W;8KG|w4cnwu2O!z6XODOq74Z7UO$~l*5 z!fgaBJqoeia_XG7rh%z@sPG=wxZpB(JWC8mo(RhuCzNeBE$E**rIM=6(68CD&G%ya zZZT6}eGQg*6p`#Tr~LHsyv>CXIkq))$n9etZ+FN8UQB>uWBxI1x{yn$Hm zb%jkt^;|@cHj@{pSE+(PII>1rV%+I3lrBBV>t7UcAlnIWuLGzj;8jE2)TUR}_?iiF z&lX-htX<+z92W(ZCBcK9&NR@)v6O5UKUS8dJc8;!E{JgFTS2W*nH#r5pG7`O*|EmM zYLawgQ=K}9P*~Z5RUGRTNwss8gB`F~x$+O;+>YaEz?GD;%1qO)7~w{=-eTn4>Fe{U zJ_pP{bfrFg|6MTSQjPiVLS4$&TTVe7QpQHK4@?z>$gN5H$7deD9YoSr$;eTwg2ge2 zOP~*z5@0ip4wgz75N;+0g-@6Yv>`&>LFa`=?sU~5%Kf=%RI0T=Q0}XpqR>|d)9|Qm zwxpC;9on}#oxE;Rj}GflgenM*1(Em+2iwW%MGxLKUnPg*Pd)BGHcDhwKm6|k>}_#z zl3*Pd_dxrEw!?`ZUmOQGLi{$Q;V#Rsz_YED4_3;gx5EXhK}-Z?ZKgik-@?)1`?LJ| zbI&a7{-`L~?9W0x(i?ql1lJL*7114NT7Q3Iun#TZbosY#RA}grvM`gKzx1&5>Q`IO zyA@v_EJIBg4$nNxxR4}gbLd^O7`7WZpPvyqcmO&|NE)B`)J2X36%rBi_}xY3tICi- zgo$sHnbUi^Yu18z>cRa%O>?7{CDAJWMWK3-5Mpv`vGnD%={p^YCtFLSc4f+DotVA4 z^0(VK@$+><x))kO&e1rc@Md-C`I+K`V+a`~fA**M^f@cz(_l&Pkm z{MvXCpDD!TERfxkLe1GUV8eX;YJlJrT~fNtB=$PPz?TkHjY>8N8B3K9%xl|4c5apM z*wQymh9;pDyZSRB?ZcKu3tw-P>l;v$u+@;(E4n593VXXZ{v@)%MFf;B`%ZA?wCuzB zrrkz>K#0^ZWqp~eyWqSPObvcGXn#2uDZf3TU1s-fz^8&SN>#?7sU4xfUd(mgaU-R# zEz~8Lt9w7+?tPI1pUc|e=D+h`&aW*#xsKPx_4s!N<=I)8^~vrMgR%@}R~5#%EGscm zwZH8zH&B}7zv^3N3=dYfv(!$CxGVYRk&42R|gZ^scCSW2YeqNkR`SUGIYnZn>2aT#KIV*iHyp^ zNP1fv#K-#9GRV7R^equ;jvXS#s(Sv1^@X^^dNnJer@X>@X35!bbQo8GFDdKKnw?#|RYBaFcrjk3{Im@d zQ!#s>`)r7XKM*Wgo_3^Ku&N`P&85U6EE&9m3o$$+O*r$gXRTXiG?saw+khv$Trrom zM7;O2^u-!CZsd|~DfU^?hl8$*ye-#69RKG_{oZi>nposOPkH(En|iKoB$!{HQR>A4 zR>%Fr!|_;A0p${|o<1za^Ff32N@Jj4`ngB4{$nfi87ZLJ)T^|3@OOQpi<4TX`@;|X zUle-I0&4-#_bVl?D`A@hp>O*<*D3ig?1tNK{ERZG8mTdo7&=7jH-zIUYUV@@|U zn;@`y0=-)3oRv+PA~-YMfu#X#OxOi`Rdpi|V}FUTv;g2SV0QuJ#zoNo zon4zPlbZVCMc(OV@{qdh8_Rq6n!kV^FL~ZBx)^kkS?Hhb2NeA5aQb2)S8`0s_sj}# zN4|l*ti;0aP7WZ|vG~sM!^Jz5i+Fr()%wNDj_|MM7AVK&Q}9G;;qxwN8fhld)oNo7)kLaMt*^i5*P(msseoM~)U5O9G08C#mD>6t3hj)) z@}f>%4+W0WD*5zM3e__=Zoe1s5PpI!S78S7Q`Yl0W@f^|D9tY*!`e@^;)Ak##2;I8 z=r58iSk@2NG!kB|3Dtos*j}@jn?EI!B68B6BE8|GSpQln8mR@-s&6K00En8IF>>;z z=g9_UZ<@hQS2Z!H+a)7|ZqOKo5bj<{KqGA`m3 ze{!~w$U~XLXtr$hp!!}VOKmT&DI?DCMI!vxQm-PorkbPk%Fv^oFHJS&uAa?8S)D*f zE!EuRA6;yi-0lGvL;V(c89YgBGZ#bD39xugFsP(ToZ`h5Tb zC~VAU^^PXbtL|hS%t+-UDKo?q%0pC}lyw>~1yeL4U;JP}+*&=u|6L%t?52_n5KY@W zqyQfDSQej%dlYkp5(vnA1C$A`-Om&dVjDgcdnNNA%HD9-3->=EgL%NDA-nIt3%hU+ zw8XfetC+34?O+y>SVdMO{twfrYUv$$Yedd17i1sA?bZvlh*LoQM?bc|-q{A9Iq*P= zRUF2`N%_$>ZgMTQ7J63rX%-R+iVmUc*}sKq-4@%9l>ERm9~*sSWas)*7XMx=HS%|- zyAXlr%h3Cm-=KgRs>+%7u*D2c2cevkHy2z)nx@nxmtMK390iAqLg@hI@wM)8oi7$H zy(Dg^i)=Fg{(`I9_xm13dsJKa$Rz&dZ2uu%JCN zRkH_BXRe?}xEU}*lED7wF#UWnl7-9U;|%~fR+N&xpiWr?9k`&lU`^ixBl@oUiJNua;* z@M7Fj?@utnucxJ9$$dtO%fmSgYY%`XstvmOowz>eNY#*+^ z55A6xy6Q&i%I-Vb+xAFT2r*393)%?xKSW^w@{1E1yr+JrF;YAi-IlVbvsqM{@hsD~ zhr`n57-i>}`{mL13|TRTkKJKWpgyWSvWaKmuXNj-g~=UAfzk#Lza%>^E;4S<4ohED zPYL1_XiB>0m?u!!TDWBP2m^=bN`CSxArflQ%j5k|Se&T~ss+Lqny)7LLl&0H$bRRvI8J<3Om-k3C349TNnnwI;YBfsu z7^+jyHVgfS^yspd0C3}He@d|&_X*=DRiWM53(^ZlgCn}9Uf;wUba!~$CAnIO$pPfT z#Q0u{N~Ha~xDeyp;oN^5-7#$B7zPTWkD@bxScb>0Z|Xk-G#r(W5UA#K_I_VVBVmS-*3CO0L{WJ$$3R5u-%K3 zwz-T&VnU?u7KnSgBBgzFwVS|HL+uOo;G*-dfp3Zoci4VOhYV`5(RYGcHGr4obXllGrMvrFCS6&^ z^;!NtC_^Rqfd1xF4+3W;OEFhx;7+rt!2J?`WQ2+6 z;h#!!kWZ&mF-Xmx5_F&4Q)b0(rcmA3(38)(_5CrxY+la?xe57PPnHn9h643WYogOK za#K4VZi|Oe=dU(dYcY}hEWe#by7OEp2R`q)lF7D~jZ&fs_K%6E(HH5TnLo94`W&3P z%f>F`?>yI8UnkXshCWVbhcio#PRv^QSQz$oG@E2^ZHE4C%eCa~>^ui|(Z1KaA6mzs zC#V|bcQUc_@TI$WM~xW~S1aP=6bxBCr=Cv0{-ul?fWMv}&?RL5$Rzxw4Oa?_IfZSP zFoj{6H&+Hz_NA5ce_k~SwT{%Y?^n2iUdxkA+VXUkNnZqn96%lio48*{b?kZ zO3(!VHbg!pg3De_cBQJV9uscMEg6NsCKdXm+CC71GBGoJM&OxOHe6n9Kobc?V~tA- zthD}aDO^2+<#eqL>GB>fO|73M?^oO{ihnLb3Cy=GYx&^Yd24fXFX)cu9lxM41zemp zAB|MP9n#fH06Xvbho2A^=OjsBCx@H2AP*&-c($wr-S>X@EA%$5cT(cFe$luM9K3|D z%Hvb5CkO^W6Ok(1MkbCrdp0fRg;@Z&qvRw{+19{k4c0z$naxVKUS{)yFm3a+y& zs{3Qgl)`Vvd%b^1U0062_{qej!w=6p4}AF>nku>&VKG)y+EQ`>VEG3c%qE1q0ZlE+WxrL zyfDCa>%g+{Mow$%-T~=2pNVkYepUHH{lKBe^mX>d>8`-#h7)Sjjocf_Yj$XrrI-k- z`tR{is;d3^Y!|mbpxOL8veekxN}sEXH;+a2EZJRg^Juy$8j4&hFL%tX@Gkwr1`9m? zqZRq2oA!euJ|>zoXuD-Z^BN-ev60(S;}hWy5q%zI9P`==N>6A+(J4nf?1(c;yx=ou%jBL zy{eceN*qpwu*A!W)d5vw5x71(J{F%uAw*g{*WWEZ%jk>=+YB|#;>-s>|9dE z)Mg(hUV=+-v)||vtSBR4$y2$GH-D9)WRXB+o$}z2O~M1Edmc%RzT^DCCSX`i|ITgz zrQ-}=EUov)iv3NByf8{>PLLD!>`(UJLOPL_Of zK`_6QSs*MWF%;*ClBFIntZ&by&C$zPg0Q3J53)l`#<+qJo8QxKbiqx|M-hS@Ge4b} z__aJ*k=*U)8~l2=6J_+PnX1}1cJV%<9*W({)u_78&5=uT551!lkSPg@kT)$U#M6@v z(WWFot(_(101!CW(&T<(t)ph{o@~;EY*#(MGg-ru$N()7#ls09)l~mfQ-G-eR=uGG zNp4xMN5E&30=%f5JBDtD)L=-dwLm&gA^wSRWO-Zmhqf4M2UBE&RC#*b7`N@_`~Z`3 zQPinrVaJTE-S4!&JB z>Hm+Tv+!&3ecLb=ilPXLG$`E&O2a5j-U1iDp@5YF>=D^fMxk8>inYfrHMkt^iyj`rp zCm<*ep>rfPw5c#f(e!Jx=~dUYibZ%?J>Xi+FR4o|--4hFIxeb2Q^vB1%L;x4Z?_(c zLyj-DURfk@4|^6J?Qg!qt(a1mbPumgnaBOES&IIS$!#@+$SSfor8Y!8On^0H${pR% zR&pIad}|2{#m|8q4KyOo4=M@M#*v4Wajmo7zkdaDQV9k%M>*5>YAj==B-}VQ~uSI9p9Q6@ARM2jtzZ67pxW!D%n1qUK0ofXIU~|wI*6B zi3|0yziofXlKeGb!^-;HB)mg-*AYg=DtynXFlb3nwINhcPn${I)m<}2tteQ zirAzd&&D{Y>^)-~L`?w1Wsx%=@29|r;{iDDBH>W!y>y7ZUKG=nAL<7&WO#Kq0WWLr zk(oNG?6OG?^jxb!o zm#MglNpWPaox_gNKv^e>LkIsnzDe;Ahr8hR{%kKsI*4%U-$u~=2?5$yV~6ndwm?-e zJE_<5MXCPR1~dKkLKVhnSQb};uJq&rvB?ULe&9BV1w0 zPgz0uv|=YBI;d7 zQZD<;fV1DFDTb9$puyYQUOZa|UzPzZ7?Snjy~CtDJM;{VvG2_f z{Z>fzaDboLbHd{&JdT&;shg*d5=mpcpvNz9n(cRnVDV*HOevJt*Zs{;FP!DzBp`m5 z0^HD|i107OvG6>ng%b{@WMRr6C%lbC{675l!in+~Q$21D!gh=Bh;;8CS@YkJ*Ozs% z(53I-7Du6(vzWEzT*i#wPYWMfa#$UoV)OT9{Z~650re(g3-Gh!ogVbBt=_1`L!GmP zZ;3WyD-g}_{_a0lB5Mlwap1YD#~CMIBUIJJlQQeD2o)Su0bPiu9$p1o&B z{bR4yd}Jif5%5YPey)H)SCZXHP_=s8j#%>qW151bhB2^I0g8m~|0Bei{(^`&&8z)^ z@~YKF&(C=beZhPSF)m!Y009k>2M{*(16GVcN zVCz>RfPtfl7$249au0u-KqGA`&n7#JPy;$@Xtw)O5YQt~U!EVn&Dpb{bT>K3G%k+- zx{U^kn-DmK!YnY(co@kp8}PFwm{ia9eiwh^UBr^vvYh;x%SYkg3wMTg+u^fe+xlv9 zKIg}T>5niEZtKDBe5lm)KeEUEa@1`nuH}V4K1?bg$ApVU2X!BN`{c-~r_JxDMq9hK z0QldW1lPb+Y(qRN5AuEh5EY%z1D=E=fEf9WI)esVN0qTX_47owlv)g~6kz!rQ(I&ph z%5ZK1P*U`OEORHvk8rm+n3JdU)8YLqzTd6;0L^MICJhJ`-nas-3e@6d{TSir7gDL` z;)+f-;_LqlB|hjU`JagZ@j~h=ermvPy0QkIKlvJ2kAL>e(J94kE1CNr*(OUeuoZb+dsP0 zF~B|hyflkdV9h)Pg27awc;q1bGhUW0d=64Qf3w-FP;W}n2hhUK=OjZt7HaVq4}KZk zXu{k5#~PXyxdXR}VV8W$$FF9{qEL*K03H(nGIId>m`7X*!@=)0;yG*|Lc*X@=DsV? zpIX~Nmuya9vJR>R9(2o6<7z#SOCZ{83HV{<)12atO6rjo$FqR37IGQWrVjavf3pIu zNy+gXu5PdHuMYwJBjYA^0BoCUcTT*9l}m;X?jDTAwLo%O_HEAq>k;HVh-xi_8o$ZB z;T3qSo2%-}y3KP?KgvV>Vk}(GVyemYv#{cfZpNkGng5l@KHJ)rj367}Ck+{^PhPwE zebgE=nfszYwIe>#kzh*)Px-q%CNWgwL@*x_4p##f1f2)zfZv{Wm z#5ww#)8*!>VM}ALo#_mEvsxQ0w8%C$NmT-gA(M;O9A?kM5rl8a5{A(CvtGa4H~|up z;*HdH0qw!!(P)(;gds}iM%7Ypxrj(c1s7WQ8NWS+Igof1EWG!ouScL{Y(-{Q==H^~ z49qZgN^wBQk&m-8qi*x6A$F?Cxz+$t<+FD(IV5h}$mNuM;97lAg_+``DLISbf`85mTAIgIi=&TOQIi3&GR9r2Gq>BsW)Fc7A_m#MG zyoj@kB|4jE@_{!dLvy&I2ANy>BGCqFWlDbz#VBe!>PrwbfYAa#dKD`4q>3+zm$|t( zBsR<*v+8=4PMH1k!7WaS!~8>npM~5fp4Z$REW3=cU>M0f$ZbcDb1lskF@(t zo@2!E7ZqGDBiIydVJ=DDb2mMuM*=ZZ_-Y5B?LEP6pa4S_m&T-j;dGth4GL#=zGLZ~ zjFp&2b+5!FB)fc2k*zx0d{7q4slnvl8gw$Q5~_hL@7U(zTK0if3X=`3xvye>DZKNVE8YJcKl_wn$>bFu3$8HGO%GRaS1Y0Gzq z&dHzc%yG3(G`X1dQpwE%+j1#_SGvhe#~54N(NyCsSI?i;ZwTaR0jh!FzmiyDNPoL? zILq{3b5zWLLWZp?? zh>LORxgiXPZ_J7<4~lV^kJ&R};x7okr)~u1f@E7`mi-zlGmOnrJ87pBt9TR*Qs1>v zg^Vcwm0vR(q6eXnEWWL~eeyzV)0>8TiugOdO6<)A?Zk2U!zYSXC?vcXGC6!*)}`y9 z3#GQ9T0rL1chxE5#LiNoUa^{T5`09_`uxXg&~h-5xE1v<1(f<&zZ+XAMJ~xBC3EQw z_?$nM+1xc8&bh|q(Wd>FaPG3(Ht+9%l3{=LPMNG`i&bXf^e%?(iPX4jvYWTw`z!ms z*J8EO(PyF?)^6J7cilZA5dXOujWBq})A~A#>L;3GQqyvgpw7gb7z`Nd#^PoftOWMd zyb>?h)>cmWvpF#?2yS}60Z@FV<8Isuvt7VfW<6K^PMmT=Eje?=4)VD5&e#Fnac@|kI`JE)ED!hnp2GjPzteB3wTB$v zZeB*Aicb0R4Yh)=LaTtqehhaH4=V~h(OvD*DOAB)AeK5?2cJ;?BdhWAce2HpioaF! z6QRJYT2L(TexcQqR0mhre=CfxTL{p8VM~at7brlQAlh(c?EP!5ArUB-W=NE$CBRY-&xGkA`*$}mV+IBO5FGuAET zfHu+1W5NX6KQbD-*I86L&mGao4AL^oOBzjoVnQS>|DL=}r-kBzOl%^sn#6Qrs_6d+ zb9&~chM@KsM|vf`tfgEEo`zW5r`Pl%Eqp)l)njpQ6l+xQjK_CXkqe(*MUWBCZR&MU zPt3HR#fM~4CiTNRhShC#T>6wD1-vp{R6UJ|e&QGwg<|e$ar1T_0{{ z33|He5T<13=Xv9};~{gF#IBf}$*1oujqE9O5;Gt@+v-AR3h_t34iC>U#`8{fDJt1& zZA=J||96{_sxHo*8DF4VpeV+2kvHVCx*oq`#4G0D>0{!xdo-g`rsuVGaWFkVA^$gM zs^K)~x?XS?alnEST-^d$xi<%y{705o8}8cOE}kwqxO!0K$Hj-oGdQ_Ve1s{WIqtd)Aden>~OXMciS3qwH7hp(`RfIS|h$DpZs2E64OQ6 zTKmRu_@_RzUS_@!P^9?`X5gWU%vdp4ATBqE<1YTm zYjuJ53&30^Br~V*PJdmJ%HMwEo+*QTM&qu?N6+m%tm4B3YC(adto5@k9F!^?2L=7Y z+0DOZs&0FF&vs_h8l-^rFjn*H1nIU;sTw33NEw*Rr*26r{kdZMfp=?~rqudKoNeYRxK5rXV&E(5rKA&OwfTKyufNIwq zGAXNVZ4-#;mwCJBO6UHT6pt8FN)3B$<9Z&FK5n$(k^JqGT)9EO#pUr+4J~ug3a=Rb zb9fNPC`#lql-N20{FVDs_p3^(MHIynT>IZo+Ew3JN7;A+{N}Gj-J#RG`)m>6|Hz*9 z<|OzZtX%~iOQJy+4!``4&v$<4a+2ID`jN0LIktldoPq!#BVYl20Q%B{IA{P4$~{%r zd4RffTc4`#VEErH(F_KI0~ODDy%_wnX57rXri!?UJJ28^^IDhfbpDn5tTTl-S zNPG^Y^+H$>e@+f@qX742my5}eexUvAxGyyRN_IgDz>hvw_0C38)#GL558kN{-Xe5a z9FyPC#?5OYoR?s&Zom#31k9DL&A}uc+ups4!_@{MaD@SZ3mHM7q*oOLky(R4#gY0i9_C^s-mTmO6zdd^H3tgb8;hU&$PpdmVa~# z;Oy{cE6$hbk)ZeHLV-rh4U-)irk_*~BhswN-6hI;6LqCTS5ez#5-N+Se!VE|OFu0s z4cqh4nzXpI5@$8)oy2R%v`(b_&B4tZ^~FzIVoP z2}U$Xx)^De0W-q*d-+Z8c(ItN;ws6i-%VV(Byk%1Un^&n@^`yWJM0>9!o7>4P2#}U zvF7*EIPE5*qa*S0P{!8=YH+#`ir`jQ1xo6aq(= zM@m;3X?%&oiB5DmZ-LwkC(UZ+h_S*|(7mR2iMN?on73ZGN&X`PL)d#?cp@r_HLfdj zi?x=d^^aLLM0+hj9hO#fU8E)*%(9&PUODWGC<+b6_Im$0dJd!ocho$nzdAUe@(9PM zmtR-g4o#;_x%C&acxrSPqE$y*4ah zME`Bw!&PhL_-o^T-$}XCPt!RBeuu^j%ae|Emrh@5$j{|c9p-b<)7umL!UvJ?X3c1Z z$KkUiQs6~v!!yRL{*V2~q%BA-dRDQ7&qlK16Zd|>d5QQ~b!hfQkFo#L^o8lcz2a)h z#$gv0M4&({wf)m#L9n0JXatU3gQEdE8g#j*sGr0-x>WimBv`MyOoQ_6l2qll%Dm(> z2lhCQlj&(Nxu(6iv2`FQhurH?;G!HjwI=UDp3Xf%RSgI4jP1ScisbhN^+9w9T-=l_&72NT%C}D5r6?B7=_bz@O@;@XKvt(TK$Hgnm4k^ z)Xcj7eGKA|3K)>ZQ0pg04ZR5oqE!D~F5b%{0(8Wt)9AlfrR+}xvludnEeZ70ERFb0 z4-r2~8j(%z)1Gwd9F(^PCP=l^b?8s;kYv{)pJI-^Bg%z=Md)=nf2(h@AFkksr z6?cYQuCHeIFGv`}=eWFzxMDLDw^EQvf2+K2a%-&d+?l~ckvmLPt3NE-!DMNF3xQ;@ zH=qj+F&8b|`=V>9%nsZW#Y^;-ME*lG1kQ#rqJ1}Q`e*&e|Qr;rM zb+M097<-~3^}PgN0Ud-Eq&FX*ZAoy=x3L}stsoZ+Z_V`v&Fi|IwoV!{DJmAXg7wzB zGy*E^4#sa5X4+e+=!V#wyW+}TtElxI|4z}x2+d6H9b>mEO8=29iLy5Ir+#W&(}VUO z`h;2$!}`eI(~g#XBwzDu{ewB50LTc!?*YYnz5`wwCQ>qN{uTX_SfX%AsABnAd*Fyj z=tsR~inLjbj4_>3^ya-kHv-gRiA@qjBD$TDFV3j^&D3rFM69a(2$g)B|% zU@teGN90WLR9niQZ{gCqUmK`}Q`O+PkM9Wpt6`nn3k(0qB8g57 zM9&DKb9Zf;-GZvOhOEPz1k>GyElMP1%|cdFZqw!w0hM=Ui-GEe;$-O|VjK%3Q}+kI zXtbWL8v(+tGjozDapePWsCj`eJ`oq5#y?SWp&n&^;7OZ*!hPap*Z}EkPBPsCIL7vG zqGM=WJ3{;s_ek?-lA8OKgmrkYULEejX3=Ksol8YZd-Fc(n>5T8Otj7fJwii<0b=X? z_ougceO5<9@v^_3s$+`WfS?!Kl>uO(Qp1EW)f4@HC{Rb#X_t1${0ThwRk*j-$pZjy zcnI)Ygm-LL(iHs-xSmDzpHZ94%fLb~at@vXXx!05g#caQmZ;qgKtvUa+AUlrxOgfk zG~g#G0EqI=JO+ah0TfxvCaAX0=)+rLjNb^w1pY3!AUto(&? zoy3_h@Yh+KSm)470VNs>%mT?4ybsv@fO=cP6He$5>thA!S>R|~N6Z+(6{$H1)qVc) z%UaMItho3_$Hkq|#s_7hk&JECZv~`j{Y2CVn&kNl0!C}C$sH7Y$pK==qfc6D{|6;Uvn+r=4dV0HTMX4`oSwaj4NZ-X$?hrI!JhSLg{3TJM^F zWKD5_m&a_h1bw2jJi<-t#OrQy$(h6jpIBxB#M=*1Rv{di&PRWMt*j-ndaQ0S1#q@=g!C(( z(3E}_<#!=7>>mL(tkl>2VBNvnmtiwc+tinK_lPWBgVG`sg=eLJ6Ccqx%{rsjRX{UDQu zMeBvqQ8`ddo{r6ck^38h=`jJNFdAWm;+EHj9*vs`TRPBh_K?@#G&}X~VQ$`^F!lO9 zy)hKhA-dZDwPRnOx9*^oA`m=ZC1x#k{UBhYHaAP(nTtRs)ldw;jVv*_^84uGEF0E% zzBh*{le~hsjZy@q)zR-tuU?qihy&xzpWn3{^Wb}WZnO!Eoh@l>vynrVcF%ebd-MXw zA3g=p#owEJeQT4TN#Z)D+JQSwR1jv`-W8P9B(Jz-w8Q|wS-%rWyEwyq?_@mmu?8K) zJbTlOQ{m@dAH!T~Ony<&Z19xpMd_+&8vg)bO~jJ<33WIcz~*CaLIFt3UZhp>v#LL)T| zq#0WfYsmS1*(B@y)MHJ)W4WX6jVc0tsNtB+{v7Q&?N;S6Nt29o*M&VDmhQ7$7*@d} zR6d7mNN44efAQ!=v1M5nhpVC1YPGr=zel_ReA#dIF^kU!c~?YuZYxE+^DA`w2BwP? zv=be|g`R5s7278qy8H}!+ zY1_~oE5CD<>%$>ot`d5+F_~^<4HsL24P2~8EkC{Bd#ZCPNsNrYm3VYLHCh#J-qRcc zca0W37zH!Xn)+?72HlOmZhlNHCrH42mY(b=iK*=+`m$~Rw_v&;d^Gk(|6f{ zR?91;I+C>eXLoIc9@at>`Z=x6V#DEgi%;1`z*0yTze z_|wLiM^pLj9{Ky+jd+}D1IoT?E&C1`;u^rt9>`2OD04MR`DC#I{J-@6253?5uv6&C z?Cy{fHyh|8f~g@?)purD>0>-=2HGJpBv&W;*ydeb{SA*+*{)MN43tjfWfp!RAr5QDfFtno|>h2TkYD*um%Werw~O`3WnC&&msvC4>Y9Iq%z5qgFSA>6Q>)#Gb2}Xu z4Zli^+T?%lco}?D{CX7DTt2!huu|QUv$Ysui=Mmy+ z|5d|vT;44Z6D1Z*G|z*NnTDRvXIYh`Rwx?d{H`+!=^pEEGmq)2b481(mp#U1;lA5K% zEw=z`v8w(&@6RDi6Tfi_wXk2-ch=?DHkA}c(CR&hp4vNxZr14c##iC(E-c@;;uBNj z4~_GSBs7csbCv^6sx{t-g3=NE198`fVvim12W# zDwgI6uXt?J!^7}r?p zp7`V-8=;57R~HSWDBBB9yIyW8j&k+4;!PG|N3RDa)Wso$-3IemyKb{U%(p!`Hx(Yn zzchO#lkG>8jx^u6RTo(Vw)ZwGyJQu~TevWNbxrRN?X9gry&E%MN*Q*^IqA6IKB>k-ae)f?w}7i3dH%JD@BTv#UUa$ZWE6 zy3wTTdn!EML4bXjsD>U$?VoL>ISC4uvrC|WNr!UsUonceXQOfOa6wrlvj0L&TLO>6`Rd){KU< zyMq1Lb!vHoR>Bt)EuqMC@RQg@smXg{cOnxfkQUR^X6{B`ybG)9aew_G%QmNscVpgX zd?6z@l!G2lH-~S$747(zZ!m+FJ9}@6#2970SMW_z`@Vv(K9_9C30RjKWY=i%+ zrA^2xzs$L*$ys0+`b6HQ)xe-5vB9z!*%{U_)HeO+@8BMB)?Yo6&mt|LoG^Y*T{b(J z++s%c&qM~pSXkXtmV$w`RxrLe%z(4-Ls@{|!MF#czuzhi zjnZ~`(lbSS6hy8m-QoNpbgjULDcyAbxLe#lSF*UPDGvN{grZW z5;o3Tj~fXTLicIDVfXe{%WwM!8AlOLr{eG5?jrmnyAE@5ywg{>05Obrx%pgEh%lnS z8i)eL0qz140z6OR>FHyMe^Wzps!QV2lyuMz^g-ysc=R7`SsGoytKM2?PGPLE{kkE# zp##8OXYS;XmYphg$DB^gC|DO;J5|8JV$Z8u<9=oE&UnmSc$IG%#)x}+QsjCcQx)Bqvpkng5 zJu!vKrql-)nGyZ9$w-E|As$Yj!5Ng!>BDz+)1oNx?VQ{3SCU?UH36Osq`O`lWJ86A z_f-*ZwPAak#qxWkmW6aSihpEsg=aRW5YpM1+c^FTXi{AmHsA|b5O2Rb-ipo*7zt?w zl3BP5mX!}Id23C4mMy&-dJ0Wbiojmzf0pe1oF>mJ9egKU9o~*AHk*UtW>kbVRnBF@ z5%95>4f>x%jD^7Vs8L%s5F(#!c%b@hf?z7|^~ViIqzc7dQQ%p-8}Lc>NqnjvTf07O zeFRJys1E=#f*Og4&&2Rrk^{+1oeQXsE@VYdbu&^$lhnE)fK3rfLjCF9Z<89Xi%@%v zZ|w9&>FvM3w`srvMWXOf+iqgn$@}D@ck0<*@u{8hK(Lf)0VdK%vUQsyIkc%YrE;KO zbsM|FNYc|lOpOSNBt95h19!3j4_ht1n*aKyTlnqx1x4U-`GO01fr0m*)Z&5PDS33E zow8LuR2#|W%YszAbzj`X~#6r zJ7WzioU+oV-UuQ3%Z6@1Rr3E{GmQt z_x~!~ZotcWhT|~v9iMs4{WOt{9U()?Cpyvdf+~-qx6XmW-<(ptI*^TZlp)n-tLEnB zgk%DgOAB~c-}~FOcmw=1e9F)o)z?*d0y_cD^7SlLbq@1JU|UXPA4zZ-MSwmSYfN)-C_#Th%4{12 zm{tRr&#^B+hqnm`yfnrX&5NUZOg*Pj!wZlp;6jSl`$64TZs=vPwkwt9`nqfEHybp0={{SB32OU`&wrBzogG&wZw?$=Ez3LjMZt6Ny30)YVU67{FgpN03mR33aV;e48? z@(m*o485b0dA#X9r5qnlN!hLoc~-;q?8b~4{<}V`X>geqgh{n=Daw**g@V` zg61~9?X=hsBR%V=4zTi>>b6)OYrNI;kL>MvAgrFDAX&OU-~!fA!d(#%7_NmaS|V~j z74fgS6>zv&IsM`W$FaZzzz#G_qgAswS03cly-=Mkoz#{XbC#L-YI=XoB%L>4`futy z^IIJ@BoIkkIwec+r*^G_gZA|NNNx6UFZzprkR`M~wseT@LkK$j#I3uu^24icszgd9 zaEe;e9O6(~P^s_!s_Vnplj-szT-<7YD;taM>^la_PY3=1gO|=STCU=)sK-q}k{V>~ zlbDl1&Z_?*5Nx=K!Vz;NtN?;R&)r< z%jXTh9a=d3wx?un>HPKJZws?woMbIykRmP9RW);41=;%JNdd0P_wl&LBn8W)lGH(npE<~y z8ZcwUKx;h8EHUvVQx+nQ-X*>jG=SFw55Dy{%8`{)-)ifA&%lshU4BU$MtgIGMla#- zruI6wgcGxd03xpL-G}vR%|5Ad=RpwN0oot(2cX?(R}WJ6L)!r)<8}2T8&D3ropEuK zJgokvy?pA9M>a~24TVx(TFPw5EN5(bWmCHyP~u2{cfI-ke#Ms zFEQOXcLg(e>?&Oe&KM&R3$J=?Os(xe^IeNBY~Ykg1F(k zgeR3}TQBJdZqjg(@W(C%k3MUgyRXV$p*48FCSBKHM7K=$u=c}>Vn_;{ryH?IP1KAW7D#(F0`lix=;Q{Qhu96+;S|~Q# z&iHfBhuRN>v2609W=-sfrx~@#p#Id4vg&;pOXbQmn^p-~`%$KQy@y8%LE~H^Bb^B` zQF789)=6J)Z>;GG*BGCUtEZ`5#*ty7V8;&u_;?{C`!>qjLm!8$K_4tZ`@Xkm@(EPC z%Gp={Pm!qS!!4S-%*L^VwWk(J7?~eL88h4(;_!832CtvYE|#HzFW5B1z3zCgEKir&B7rYO!|TyI#GMtF)N`vjJ3XjHZKFR$Y2?L>K6rJ*f#2xM-CmCdzO2WA8y5Z4*Cyhe9u z%eUPhR`7fHpl_is;PhxhV1YJwOBk%Ct2bp0R(Y8CbAwn3Fc0o%n0DRA#}~*D8P)r3 zF~ogBeukRe6V*Rm<`?HznT5|+n1X$5axZ-$X{~l$iPLp?xfMQj9YSRZo02w{zBCig zy&T=fs|TAJ+5M^>Jm%#?IcC6;*F z6rnjGB`4QVtokZJS+-4$@piLyqMWpx=Vsuz4iDrRJS)5Nusk_ubb;+R6*p+PH1;R@ zYjO0*ArQ#t{dtysf#?jSWUzo)igzq*U z(JpOs@41(R7Xx3xVPdK(Z#q0iO-$|`Ac7S#lkLTx(FV2$A5j`$gl4bxYn`6Va_6i^ zTO9{u@Kr8oBNa-iQMr1E!!WN_yHn1sYpVU;pC(Q(y{eicPLTpf`?DVUj`X!MY3rBU zCWLp@my~cec`|+0jqBTlquDfw?!sW#AwoCP6rjlG%ScV!_U=ixX?K2^;jU$$*d*Lo z=DsLD>WrPr0RWwU$wFz2-R)~~lp!ycy=lD?;t|#5+HLG}rOh%cpGY~nYZnQxQYJsa z01_@sPKk@b?;5@1;uEo${DiesY}94POGRkeQ^!nU#4vHzk)xJVNix9`z*pUp4#T2- zQoA>IkGcPFa9id|N*&DRnOtb+r5s;u)Te3B{soML^zwB-R zJc=F;7E(_+b_~((0$+7ql`cI3N+u1Q;Vl&U>p!6gk8-gEI>GX> zyJy_7{cD^Kt7~Vc{s-g6{-+#fBO4^SbGI7`>W9z@;K}6|gf#JXc!uqs)#d0nmnOy3 zylSolsKsfpHBEg;`x9k_p#KbHtK}^F+k@*>GLUzhG*fpTufpv1X(jW727tOqAPVSWKtkTDB~t(be9#@J2W+J)1ePC1imG@}V8_A*RQ(D=8`0G84@ELe6ES5^Y*+Wz+?6`{VuJ2WsvsCl`Gm5JP%z0VfR%Du&*q{A!-@b6GK;!WOMGM&|{C57A(8rO@G8R<2nE))1GD>#D3Be2_9qGz`cK6OD z9Y@r};m6in-sb5Ek;gbb=S=JqwoSfV+K?~uRZ%W)QAV2twWkL zl^F|BQrPvQ@%L#zVb566ooux+o$R@@-?V?#cKGe<0k;LfcCY~a{eQ29q=s+B2D7o< z52}QUb4U$yvF5=ah|6AQDuPIq1JUTv^>E_yFE&gYa0TXBII+$H3*eTATx1DBet}c- z|GSZ_qECYB+dNQB_<{!ESs*>|;o8wQ%GQQRoosKTi>u4RuvyEV4wS0Ip_tq6d*z?O z2T1n_{Z2$NlEPFiUgN~jur=-TMti$Bu;%@ufFgxE5yUQFof`}i)ousznRVQ1xHHukygsJh|;-0EyQcP{0@-o5N| z)RXC(q;p-lgvZ>&W-|%FxxkU~%o7m=Xi#Y+kmh{D~IcA<03; zetAFY-5STQg6!5!)dfQuO%6h=)iPW0B=6=SF|4=r2DTrYZ%418`qMe3Sl3t9ikhxc z9~mqj9sagbpDTG25Jh3dYNEchsdAax7Jt-1)}{OLeTWu=51L|e zyq48@wp90TQj-h91%3GRSI4R{4YZr?^kC^kr&zjU#CW&=u*pA)^jg#uZ7O09X{AJm z<~q{7Jf2aZUEI*$dNaYP6StNrLy>J8N^*@T^9J*~kuASuEHo&S_(z5d_GGn~9LXy5 z9(=ft#OgC^lo^zoZIBc)otAM$cclXeXB+3vFX1mN3!1bJt{O`2=gdIo_GGlbj9)w85q) z*l0@rl%zYYUH*@X|zb)GVmcoCNmLX?-mzHz-}!=XI)W;cn+t?IbFs^{qa=)ySWHKkFtN z#vl?$>qRH7SqmaPo1cMvdUd3Sz25NMzXx(x?OO~+Van-)lxjkU{q0y?N)D(2fn5%> zvZCiidDCcj$-QLEpe~t1zh<*zEFPbqUWrLgcH}RU_o{A=W|Tz$1BMkHnk1p(U%Nn6 zHCDe-8`?`;wqOe!cQJCb#;yZlrK{s=!F7YezJtFgsiZk|x(eRIJtFEA#on8}QI(>7 z%#!o-K|JSgiDRrzfKOR!-&|FQn=Nw1(jB7ojOQO&>Bau|6VXz2;MCOd0;M>SIwcNm z(dI(Yt(TcU8TKxWS*tj`d@0LuzqaIheEW8pC(MqfOKSi80)XF$mOlR0EihK6#h+_p z@XG&M$kqJxPcv@%DuO>|_5Ub34@b88zYTYn4oa&wtyOC8O{qO=&(IpRqiXNgsu3&p zROB6lfeEtdTWiN@p2*rz@P_Tuh2 z2rf}D_NFF_(l)KPIfoOJ|7kEh*T$2YT1qhtozYt8*h9j}&sPfZ1tWg?2#VRs_%T0J)s_X!Q-Eo3gjoq(T22 z(vZC4XjS5wZ_Zbxd1ziX=7OTCslW z?DKp8_c8M!{dqSPUg?k$;u(}{P!wG#56|0bNFLdq5DG0vV~JQhpSRmTWlk@9FWT6u zO@jFkELBvZ4q#cyJ3{wf-@(;@viN(Z4B7Aqa@h1pLlINcwlPO(*mc%fU#^Aa=KVnH zaIv{9OQ~VvK1E?t=E^oJzr?BE`rq({^*=wGdsSF&CA=SYVeWwy66F=UQaG-|0!I?H zOmbdIM*&cDx;fxgo0A$3T}Up|`8xe8gipg3cCG zre0&M^ubX8i(NX3X0ytw`h+;V{xor+qdg+ONyF(zk&qzo9-;ouID?SXq9C#+_Hm0R zyquY|0}JdZsY)_RuI$S}9@NUP2I2heH_B>Dt77>z(wG`7LXR*Hl0J4Ii|^=sYfq2v&o=9_4F667ES_Ee!Mu|?8O}C!WqhGZH{Dc+lfULj zNw-hP?cp+AZ756W1Hw0DR*XZ@VREP8dzdi|GJRi1>_?>G-4@d@%}v1cW$tVc>`XlO zFW+Q!3HJGBYC}v9u5<2)Bn0T-({ICjJy#|)^YW0XdUUdqi2fsg3kQWe-Wi<`R^vS7 z=stRgD@zvIQVKpG?2%>IoUJ{G=1@ti9SG*qqrqoj#Iu0tNIIu5ua8bX0CHN2*v#FZ z`w~xP#eFm{QM2I3cxc&G`pAg}`LB^Eo>`xbUqtw!v0675-lv!PmOQW@di=jDTTz_g zfV%>ZE0~84%4Ldu`#F3mmw_=F|2&%){e=p{TY`3Vkm2dHzzkl{vm2d0YW`5E!sYz?S z0-Da`g(uavW$0Cu<+piloc(QhSDyzhRlaB~k5MygLFgG{$)}q<;FPv{U8k>alV>!t zhk~D2+zQ==gUl2DF4Ua@j21OU&7J2`zzx_$eGmNY$UO67*=5p>LcUJAdr`~n+bYpD z2umtYN~% ze&vNS8BQ}G+)jUze!w=b_;!i1WDLUn3pA6Leyfpo{@2XLySEl7tSlD&VuE)o?eBa$ z(tfj8*VqLDZ9D*(85&(f^)u1*dCjhnUi37LplFGm*`U-K-C&q((kGZpGjQ@^<>;(=#Z;rCPk?kfozQv#y_Il$K_XHd+ z$AuCOEiUunVfG(4=^hW9iuDC?~@YSVI;*s8@!TusN{Eq zJ}8HgKt<1Zr||K#1MG|@De`-o`f>*|$L@ARt9h|Qo%K9FI5RiIO@_Mq3u)f{SMERl zes(x?X1W4g(+Sp9fby6^JGp}bPtO9&CDK-6vz^hq&T7?jS}VtyW*LlEaedM*iQC(M zv}J=G$|4_h{mhOp)<3XAq7){rE76y@rGm0DmMc^#yk^Cn(L1WbH-hOi%47Mr`mEgK zMrFDM+KCbVmA>c6f2>D@;CVniWsX`v8+acC-*1qos;Uvk>9p(;p@Eb9!%9^zD-PBu zq+l-kZa~XBAf+AB446HbU)BMl;to2Qwh-Z^{L8uUQUAL8?aADP zuzM}c{CaVomt+J+m85nr*BMk?*k*L! zHdD4LdNpqdxeH?4 zIRqwve+{~Q*AI>;q@au>>f^X~#RtZ)SPek_e634zny^Hf6wdjTKhkxi3JdH34pbIw zPsI16!-FQIel?!rOO+x|V&%17<*jI?iK5|XeFoQOdpCFU97X%PM;|?mO)-vCu|+_1 z{uv(I<&2ikkG!Z8n|sYUzJGLxvtE81-x+#J(s3fBeZa$aj&bmdAIUxr5x#>IjDd}T z%P?qBcw_-k_E_ERb*cvI|8buc(A$w1|GC+(3M3xo<0=JS8`;8va*Rul#zVSZfzZ

XxUhM;Z#nr-NTcuu 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

y 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 -?U`#EaO#OF#`q;Nd z(ZG)uUgGQ;3P*peO|#6a7iaWy$5sz+fJ@x8EI-N^Aa~ZV%o;v!Vl8;$2a+55dDb(Z z<6NRU_O?dwLWkV#VLJK!8=0*ew_@Jfc&FC}!&z*@1?ncKw$LpgA0@BK`Mr@Ua=eLu zTtz=x(0;+iN;Ow-_GhkSBf6piFlVyQv5Kwq7K&GU8AOj#%ijh|x0Be;G3_pkBmswd#1DBNC^m4pm3V`1 z4ep3PKBG)jqR3xq9hw>R`#Z~}F)8N$MO@w?;>X`9ZxwmZ-0~jTM-TH}j%b)6Nm?_= z=rhWjJ6xPO^*+y5N~3o636aljUL=3l&Ez$u@%P|~3LywSe%)#`D}QVvNf+?VwT~+P zhr!D0e9L`$Mx5A|OCi?E7?XZZKEM5oMoGs9k{odym|GW%%=YtMeyDq@Ie8!;RE-U! zGhGm8KJQT#l%!vdv!|;rs_7rB*O7tBo<{m<`m~tFBUz}OE${KR5X$Axg?Ad1nyt(DQ=qB-zShaJk zMLEdHd#wHy0}I5UrPB`hyMDk_&Azx1=yHCsC(PD#k6@Sdk-mTt8r!aPv_K5^L2pe^p&aZupTX%9-NbvLcpfAd8~hV;0musEM;6Ezirs3?5% z{OF~v_#3|H`{*`EPZp}?O3KfN{?%^J$ONN_7G9j5sV zt%v^=yn4R5{N;Q;%tH~xvnzG2UygqLMYjWD`)+&P%60ZZ7&d(cg@u5&_=YW(v!x_{ z+kWHlMuJ`Oze-ii?9+rU%!3v`dziC9eZb2Z76OM0O$dieuT;b_%D3mWH*_>s26H(3 zF!LvVuM-hRC8RvK>(EobpVWFn%~7E}6p>aOe`XHT0&&OUrlAVsVGEX#THwGcp?q>A zsV4JU?AzqJsw&gY3x4)-3;ZAD)hm1)4t~~ZpQ3Q8DVTBBzdd!vyjm=I+#WiCIQmzs z>utP`=t1RT=C>LIO7pJ|6nHfT2eBqOmHZmNZmZFfIc}UN{(URGWKiq{!xd-jc&YB7 zje(7Sb*I}@y5=6}gVG;T`?u~``l&yM~|kaE9b90GeCcjI{$ABzLf^WzyR$|6N}((vEt z6J*(s7T$`*xRkvP5JxW%$?sa&{K?|$F-;ifCw;Hts>G3>PC{JS=PZEcpPu?}BchT$ zc`mq_gTJL$C>zB?n%1p ziU=Z$NiL8V`K$h|`@TRpZ#n7p>sS)Is@4$b7JX=sgV9!!gxt`;2V6P)(N%52hPE?G zv^dP1?(1F0x#h0VJ3T^9t$JWvyO_6J2a%+Pr;RMoO0sQ%ps4lJbCucRljW+m7NTrH z$3=8WGlegzo}S-VV)v-kH)cV(c^ClwUZ3*dhxdZ1BfVni%$4 znPXUcu_^svl=cMgE}A!6W_*Xhp~&}29>By3Y|WSHP;10+t`;{M<9@F$Qt9shg`W*M z-6cWbX=X^hvo8QsKy8nhg^6@H$mjAM@l7KzS+HaZVo%AqblOi^5mD()?uB0f=+&zG zVi=st!7CKx_Iju-@bsWD@F$Br)7A1r85-p!Ad(ZwR(SBE!d&oLQa#F75D+!6Lh?7( zqRDKU@Ect0_g9yNt4QOB*qOnYe=6!y&T=Yh>mHI9Q(fB?UEQM){Mdh=QTY~TJh#R) zNz|Dpao+qEtb;I-aQf1B?fGI~dQ(KWh;Wy3wNW9#xh({ju&|Q|7_nzKX^%67a8f!( zo2C=KZ9<^eRXbaD)(Qx%bz_te#NGmtzp&%Ka||z_q@?W)xu_3 z<~dmJ@ifJdvSctd;mPmHA8nK6Bd6mOWi35e_~26~x1!`1ZGw-4?1|xg0%uA+RvJUL zP#b{9zjPOZjn{1(l4k0K4RBlYb3kd#co-2vic9*Z1AcJfH)_RpX6zx^PsvJ*B!TnL z99`)sH3rO|-zs@=3BFB`q>YO_qd4b|g;#~vH->Vy@iH5eMrZdoFefuIoDe#Fj)$83 zZRzBa**q1-;7Ko!LOAa(pf2~rh+hXu1CCY~=3T`vyYP}wO&8j$Y!^^KzD1&%?#?_} z$?Fv*3CxLV92;)2rsQyX_=1crPeL{uDNZ==^fVujS|ZwZ0bh%N8rHSCW>G7dcGANLXer^@m?Z&S>VGeyy1oP}sSNnF6n<^za8?oICb7kos!xMp4OX%MuaZ`o&f zAgaYgd$%B6g2(R#pyjZfU~*(M_z6l#=L+m^@xYwiXXY# z1Q1buF=l1RRQ=#T~)v$?B2_ zrbjU+Uy6slE`ftYrr(Fu%6cikBjhv>=1OOZXQ&kbeEe*9E8>3J@B`IFUv%UIKPh=p zqvFklXH58VxHMqguW!q$^5Xz+gVv53Qu0koda;|qM^ZYbg(c7{fvytJzuOK@tj!fQ zjiA#rEJrZsMaR(qn0=|`GMWH3uN^nx2Y|wSkoCapSn?sGE214UjqvxBYb*fjmMk<22dD$+#9t> z?jj6=vOllXny+kYU#Q`Ic8XT}kq+12&`?P1Az;F2eMrd`_+<1|GxA5vFl+m4R5;+^ zcm4a(yW-5I z_i3hoDz#re8#xWKVjT)cGmcBqNahoA_SW={Wx^PMjTr^BdXQeP+#;z9DVGj7o7ox0=-T zGDb;|ZmD^yrsXO<5%H^pCt@KNR64YuFeeHdq9 zRBPUhfEVNcK`Jw>((YS~SMLU2Y1qJ!-(uTZz$7HwLZbDu?1f}7EDCvBX+*N+omO+;ktTAM%6tfsFUO(N3$jX!{{T*jf+7oGYG9`T7Ed^p?f&I7`l^fgtN_|p zxk?~Lvqp03=xMS!>YTB(Pp?dj)blw3)RUW4$%vM(q=7LQj-ZSWCr1g1#8>*S+W)cB;E~?^MneKC!d?9~t+rR0yKLvV z_tLIwt6rvR*oCEGJ6y}34P!w}pj6q+7S>pA!re(52z1g8vUy8{Ns9DR5_+=lHQZoR z&ZIa7@$za!?$0+jtH7QN?kL>%o2pe{#x%n)j8^@PZ45VA)EES`_7L6~Rf6cI~#Reu3h zygd7Fem?roAFJTP0sx2F1X(tDhtU+b_Ico}g9qyPkL@yNKcii=Zv$>b0QJYwbOSiXh;k7z$tmptk{IF8?`01 z-$gEb12&(;>@`@4DNAgumC%7)RivQTPxmcF6|LAbHG=pJ?ncjgBXE=UEVl0AaX^QJ z_sD%)y>F{`+c*6a@8b~s1J)T8Gj3bEnDbe-*--A=3f5z#R-Yull{2$f`fd&{*&PwJ z-Im{Z+2d)NasN@$Lc8~p_lvM2jLt(OY5n&Wl{VQ;!|b{M^mrMpnMb8?q8y0_$O^$$ zv9x3b4}bZ!YozV(WWX%_B1Kp@=O3=|f@A?+x4h)OOZnjdhaWXE*boKH3z2#}GJMpu zTy)s0^-_$OuoxkSEvg8&wN7YF1lO=r&D>U&4z0w(TEaNy%DYYUM*%WM;?nD!D<_^JJ^aKQ@Rb~`(Ih-eR?B0L9rEQiS!2Z9b{FS z_0;P9CfiQse7&`M;_4hTtzh+_KQiH8pZ4r*9{_u02+A2b75iRAOQB3D-DT7q`*Rhj$DHNFYi8VtgjV5d9{lBAVZ`nudPV-h)P%kTRHe@7IpZmwZ9F{pXm?E3MK+SAJHsz!wX z$zDq5K_Q6?J7PAB;9R(miqa=*R9@g?H*Rb%Fn%r8DmFtE--wlqiUL9Fkh!bVW^^37W zRYU03y{?aS0E`jc#NK}KIOfbPTYv@H<~7=czqr)BCf}8qbBP_C9lFt>ZB6+*x~q8x zH@`ai6Q85CM)H%+kv%A-I?0ATpE27SA2*SFZ(f zF4=fSPm)bl&k+E?@PG{nzM6EslJk8(1$n7Zkv^thje^7L`Ee<1I>t1&QBbsJuzsGGl0^q#X=S zskS5w^4wRea5Sg^Y1QUGGpzu2w+95j7Yw9pjwqW|`Ci)cu-}w7N|x=VW(VA4#MLGX zrU|QeF|LeY*7|Mb94!tJg?;y;114MKj1G$ghaeWq<4=THg}e7uXN&M5H3x3Y8A+iO zbg@dfupR{-TmTjvk6FwT^@aLO4q^+zW9tn&sQTpsV~Lvqmzro)t^p^qFi*=sdcu5r z0?q+>*i>-!ynx9^cyfIh087f+KL2~3HT;nZ)DV1rEH>a`%Z`M68}x$EnZ?@#AHHGx zoIrPs=FXO*qt-K!{j$mHE+Va32>OC(M9;B2KAsadFR4o&RN-!B>g+fcwOPu%M4mVW z9e!cgy5~fGduP)97RP3f60A;{uw*=N%6bR$rWKh5B8nphcj~4^Q@?>ml3HIRORSWu z8iR&0B=LidQ5v0&{5wqzYzb3q06MLW%c=?#s9zDbb(RiOz0#G!BDK7VPz~E+*w%Xu z+_`1&dCMpjp79bus!pe@4;)$vhioZz_7b7f`%q3P~1LG>lD6K3U zbX~cPf#9L+_}J)lp~9Ep3fuh93m96XnVr`8r?{?1E)l%XyWso+l+bui~L`98E3rzJ~PRFfqqWpLmG#F$;J7*3WG z2Z?BT_;i{|o5oLCNTj8l-`TLrpNM26q4AHUdZs&NSweCH)U0Z<09} zhzIPJ|7@u!zg!?EP0B$!vXcBNQH7OCV(I+U;!BC%aw&Fzp|+s-*If<3$)>{aL)=VC zVP?GlXTs*GByN1p)upSaxByTAWqZH+Fxe}Hv+MH8iWD~0dl$y4fnaIa6hMoYe&qM$ zuR#F+>!iySlk_0pi~e@1X#twwvO|YCxCw8>(uu>Y821J?FCEK+^?nyWdlX$fC-;~W z1b0TBivC{i` z+)L@?Ig`@Z&jee~LN8?#IDOY3cDmQot~jd!?Bp+(mMcwEFjAY``c2dHL%XBYQoqE} zAl|+}Fy5m$`TWknO4k1X|H+GcLzP{Fy41Uo(n(g#nUx8FppIHjS-7KZR)3pD_Th#j z#{?QQ2nU_`>ef(7j7u5D@io~2$9wxU>ollpj@GD?l(5ulFzzCMZV7@noZW9jPu~99N)W8tI1E9PD{_+o}$(WVqPLWn$gq2vv1DD z%=XBtk6|U%a3sJX;oFYi{#GoPwfRI1s<-}k5Tgzk_EgEaV(fDGVI$Ujh);02Fo1M^ z+VA2?EoT6yX86ePEIfrS%g^U~OjwQ-w~-@(YsAupK*+rYaDlCRIiR_4oplam5%{Uf zzPk^(P z+t(r0nr_cV21}br()y>hFldZcP`~OWuJG#LUmuko`B_`qhHk7=QzCDoU2S}kPXmCalsyHQe9aZ{un z-*v(_bg4}9!Rf2qqW}E1Z^m?M{V&TYmvBxGf}rrb1|HB z=7S-?;=Q$Xd?SlNq@nkB>gD}Zd7iVp7N*uXaMV?%s{3(hF3TJ`qH5y(jUp2?a&JH< z%^9n_WFacPPXmaCjY*R|@O$&eq4Q)d5C%bvm;!EW6B1nSJbIT2)2^sDI~ye<0LYc{ zXnJA8F>&NczVfm#WnnkSA3CThG2UK}pH?V25VCKMRzNMY6}wn(+afF4p`gtmztgdH z;LAR4Mc=89wfxgxgv=)HbH z5&M4#36UV7OVOuE%cr-cReLCTC~lOU6d`(D@QKaf;vb{HiP z_B-W?FRj@Ie=JN>8OER+S(e4QT^XM>y(dHqLpg<05J$m(t+6Q?k-oN_U51bvM!J2m zW{)@@NU!FB7mqwZMyQJK%t`@ux)#cvSJOEV6jfihFJsC1a7m*Je za0t4+sdKYQ;F!lGG2MbnW@@AAS-@1AQ*nuM_s9KE!Ipw}OuFs9x*}6pduNXj)dF!4 z>3ucYXZAQ3>#Q+?9=Ermk~E*Te6P5s4M>1D-TxUiirr#$7HoL21k z6Y`mE(F_@;FMcY0uxBnN*anfursPWcpN*E#bgsg!nEs8ZMYea#r7QJ;BLDd(^C2!w zIcEY#gLj26Ic7H8oXGUbrp+EA^JGCR80ixEtKSyf`C&52BINPS4s43at3e?44xGp?rM{QDK z&CYKJ`=_h`($jIfdJm)qBE!@YqHI`uKwW#M!>OrRHzbp;xhiP;nTr`d%T~a*-&wh! zBDLPcoDv0IIv*V`Wa+Z=QSnllZkg`)UsSGl_{3X#9NIhgjBBU~y+(bkztuPMEOfpX zZxxnM`ttOO$UtT(8@n;NiVZy2LA}}F55@+%OYrdsGt~^GBz8@`ed8(hF!m=tLZw zc)U+g9Z=&FJ?@;{{P{3Z?FMy3;>MGh>joz5bZ6kLZ_n;H&F9n$sWSgS<~f{coMcQs zk0YK1OG^u|P#lI}I18Zi(9PSqM&@d5H8Z$efDICjCXB=7a49PZBHlL-tZ8cHCnk}x zx!I|;#sXS#mpWc~Vp16xgxGc(4-`HQmC_j$AqUlA4GRWZj{vVT3s?&5O6Mx^O$rznULJw*=}E(O)&=o(sCP)PZsdrct1*y zb$owiV?@4>`>%}1j{gCkO@*V4`FZ#)bC4_ROMj|JCS}{C^PK&C7gGyI-U~y)kn@3O zH}w~Ino85l;WDyH3yx%n;`B>^b5zx8r9y z^rk=k_%h3VidS`UviP+l>k{FU3KPUjSCeEo|GYuV4<*Z(ZnFP8s2@rtL)<`uWep*U zsB=i3(k+4u5KLNv);RHz3PjHC$t}`5o7u>v326gMPoMGKSq)D8pn? z;p$b++HzyGYha{XQ(0dvkNFyzE{vqG=pUKJi86u|dXK8Axc1703w1K=7uMhB+*-L_ z*8YQ%-iiSvHFFrT)VU(I;0+s|&$QsC^$gW@O<nzN#_A;nIk&4hdaK3R8u{_)xVz^1|i zltl9c)o*5Lm*8$(Qd=cF*Jhce?5+B?C|?jX0sFUWd44IIU(g4S7 zpC^d+y%)tD_vy?YcsS(z5F^U`YTuFf;{{@%B56O8QxzE^y;eftEcuZe{^T1!YMMg_ zzxPQAy%~|zsITJXfyblEDP z7c5|$gp9EKLr~cdbr=Eqfqj<(*6pB1_iHy%C~&;C7-Ox59^fsh)43kM*(%v>?qEc& z*pWZ$&(T}np+B12%yM3v`>FFGb~Urv-T8__*0F7e_sT9kzpLO-lwOH=!H=}qOjzG_ zg2Ena6!NeS@4g-`h*qsMNIGt1&I!Iv%5lQx@%_hQ4Hz|LrKD4Z&~gvVv}<559>MUs zX~e5`do>|X?hNtWpz|sm?NMphP65t^^jR<|GZ|MYT3grTk+1&*j1AKm|Bd3Wg+UX* z@j4dw6K5Ugb3A4md{OR-u9rbT^sVSiE53s;#^0@jg>0Iov~ZT_GPmQErs}})a?utv z{-HwnH)WpsN)ctY_GY#Ri+|&ksKFF)P8bP&OJAqWi#spZ{YpiY{=sA${E-$s6nteX zW`K*@5~;-uau-UG>^!Ksk8@DJ><-LKl$aAMj_wz*PKLjg`|L!Q+62sDIw1J znqr=(4Ymt6TOYFWH^@rAP|R3S1QN0HyQ2PKbNw`xXZVAJ-~1d%F>Lc%UIzOI zqU_gx$sT77U^k|96~DOZf!i__vobHv{&u!w+dk=<8^o;l$4p}c@G|59Olkw+^eZO3 zR?O&s@HiZD})@p2k>xXB`J66#A@5Sm@94Kytk{&0TI1aQhi!RjkcEy0AJ zS)4Eh7h4DWPG2X94GoX0iaRW(_&5}hgHMKUOLbsXvb6Buw}M?Nx*|DU@p6gDk5xkd z%ov3VLcrdd^f9xxR(B|vo?U!PwqOooH6(-=PAA9J#~B`QT4@ZrJJ^8(KF2AkSW^=?1a0XzMd32v<_$U%UICy7~-+EJ%cwO4+#q6*+e|`&Md5Q?T z>8pYGId&K{N2E{t+wOp~?`sA`GEo65^7zz6EJ3ryI@j0m_V?*#D?)O~OqD>@*KKTG z{J8X_YoO@o%CEPYOhx17hw*@73fsduV|PW-)V5-ESN5Zrfcd;;D_9RW%FHg|=zz+g z%M(ofrg8kL?4J6dsy1MFrC(LdKY#MOG>u*0{{T1C4p}!!F|U16*~x#hgOQ`O`^csU zcaWtk&(XnAy)lmf4*^*9IliZAeRCsy&7Pk=S@QJi)mN@p84A2%X|x>t#!&}5?}PVZ z`<}B|(Z>NM@37vs*3?p-WGQ}LgycCilTD;Why4fnPFo&abMA!38Td&sU!0<+Kel%! z)h*4$7{Hl%=jfzXC9ajNYc|^Kc+RE@VXJORReM0vhKt#Hpcy0a-;V#-u{()A;IV(} zE!=I;?Zlvp;n>N^Q&||<%$xqa>~n&&Gp4!tEf&PDtx;Mv(9GI(^zi38rVeoOMkNNs z+4X#-Bh6BjZ=w)~Ncb~d&fdB?#Qs!CGHC2d_be>;{^>`sb8>cz_a5xu09xVFTY@}~ zoXpefesFd1{ipu?QvP+9uj9=Ovl5xD5yuLM2B$qUEb-s^G?f%>MLc}KcGR_!IYG}Z ztV+ubmwIoCD91%1u*fonOumK=tOQI~Jm*UKVIV7>^jMtOOh`_DKUW&HuvkbBe4r}{ z&C%JdXX95Je46jHpOAUVsBg2W;Ut%q5xK_Ou)I>3DlKLGtc z-I{K3@}HKSjA=@jKC~K{URV_FlLFqkCC)X%Q=569aNdHzgxgS+I9^aX} z-9LW4Z~(fR)DBo%Ta)}l4*;aMWCb^OB1`Uka|JZvH?WXKF;HZQ%f?XqfA(VMx?b$ICc7A=`!J*fzA zn=m2;;aqaz%JXAeRZT=;c6`;gfk7fcJ?Hdg*!z$5QJ)>_0JeFY5?3lOM~6~#7>p{Y zenGdvRcieYXMHbZN`A}ERmYo}4&l&OdCvc##}=P5C(;TmTGDQ2y5s@0a`VV-p<&1$ zJK>|PaE~$`JZWNe*GWYmSD=U;_IQZ@DKiywXl?oq91DNdLw>qBCuQFMz7&YWKv=xlcUX+w)0+f*WA0X1a2FNHV z#_e7zYq1`!L`e>kVzSQ^$?a(sdqeiZZwWj-B-m#`ZK}4jc19YVW@QzT<*;7>x`gSI z{{i01B*LxOClJ{HfZ7bXL(6_(Yf9{U96?LDKlxvTo3bIWcW?K@E% za5LjCJG-qnxkZnSbyWQiP(;!suxXoo4t~1SgzT;!c<>=1aoiihADlB;|?I5fbpdszk%D+kmz zwmcGr>G$OEohcu5*5Q9q{D2ut!PM4tVm@-*p5wv(K&cp-(F{`9ZaxVb(63KVwJ!{q zV0*G0xl@W2^&UZHvrOIHGCZuvXGuZ|LItk(>gQ|qdpd<$FSB{FQ7Pcp)9g={LMtC>GA2MKg~k6W?(S&QfEYkC#VPGE?{8b7N%8iVfV4u2 zq4;MNEiHFdH0n-@ZcRyBo~}IbyhQl?zQdiPBAGx8NPcsFeHZJ*CG*i!(dF8&`O4bE zaKQU_J$<1I!z?Y*aQLVVPy_|GcN)tJp$WF;n{rdWQo-?YwOkIAxL2?821%Wd)(&e4 z>Rc(@8{%2Kz2a7OkIvxAkQBJUg1CufO))ID32?UQLjRZhSY+d~91cbCdslcYba5ZF z(NPOm9k0k>j!NH~?(QD`IoojZ1#D)|Q$3_BLA0q0>?Esr4?3(fBli`#PQ@gn8v9t=OstuP?R~sB<;Od)7_IP&?|V_41Rl5_w8xVuN;^2DgydJ9f-Hr)9{S2K6{V|sw*5iM0LnID$IruJZO zB!B>ID1-uE17rSGkQRl1W#K^)EtHuiF0`>kec0Q*zDNQ4x@^^+R#^XT&!2fS2HYM( zw+=@Yu#(Uq2U31EPlQNI&sLXFuO!}X9LEV69*O>IYx~IVI4f;cqi7n(ynpzdI^WOo zijYPnVQ1N#f(TE_jp6XT(%5knM{DX$G^u4AJ(FhdX$%VO)LD#PF7N4!H>3)Uo47l zY8tgnIt5Z)&MxGeFvKEx^_ZT;@izhly`i<-iV}XqtMAzn$=wNKeVj9n1)_z`-`hyy zShC@0n}o`e@_(kx&#?oGU4O$sNq~fUdgN(wGL?%_g@s65n_P+X!aInIHLpE=bn#oN zqRl;fSE@;N_=ii6?JAgXN)Fzsc2~3C+Dh_8hol9p|8A}Mpz4_VQ?1u#`u!2is(NAs zYnJUVlL9!*#!R@m%?}ijr6>DmJmh&l6n-@DyBp$w5z$0V&5WkATY+jNXH;bd556e3 zki7vn4>%M>S`0p`yJ?v2A`P;uSm5qA1=y0>T*@jY_)O1_r^!N(mDq#f8yEcx?fG$B z1c@}KX`1v8;ea$qZsV_iUk>xjiLx51jL7q+fu-xcTKl0gw$WtZi;Za3wZn~(>yIt zI>J~5z`4ILZX5U3f|DCLep8XOAqcK9VjCoDQD$DJ&okdrQf+LXd?3}sx15j~WB@-R z9J4X-~w<6q&UdMV=J zS7JcO!!vV6E8=qukru(zGV^Z^5KQ*_-APT z?4eW8)x3Ed{$MWlhJ#?N2)xwI_7)D2T&i0U%9Rgp<3JAfKV2#BW|eWOIncf=i;%`b zMx%R+IB{WNaUbKlarz^h;+y9=I=|}JN3!Y#(_VhO#gX~&z(s6Ch)o)t_ zZ&?|w?rq8uxQVLnZ{p8(*iJl1a^yrxG9$N+X*452uL)tbs)vU8g~J-~ySS~c6>>?X ziZINg`RAW206y3A4I;X5$=E;F$WL4?t9a4)y_E`1$d|`|5@$K32>j}taaE)4jyz?c z8URRg6LE+~jGexF)-*M%-YT~a@+PWk?EI22mJPR>y|ZU_u74{qtCjut-t%HxugR!B zfZ<6rLCo6>SwISyY;#};q0Q@Z%lk$bX#99R84T;?I_H8xzY@R&8ZQ0B=jyJxXrZ&> z)J7W+F}Clpsm0F`4K3!gVz<`fdEqMZDkP%+INQ_;x|{R(Kwf5k^}%ML4Rf%K!3$_- zj!XLU{gZb`P*$aR8iy=RVsG3aZ@FCF_$ zG4e~jZyC{7d1Wf4RV_?3Cfy+`1+|G@W$IoHjzk;D<H8~a_`Aoqxm3j`)9xF}4vBuVFg zoC#q5So?Ils^MoYi+$zzQSFuvyQ=uYu4wYQw%CY@{w9K(6JeG+aZJPKxd|g+YJE;k z`jc!3xra!6f?H7RiIt+4_iduOE0nUeg&DX@vULmPFqOITo7Dyo+>&g4c}$$~`e_HT zjR@yZEsohBw%u(kiM^A{;wvn&d*-M%Q0u;yI2SV^sIQi9#|2{z0Vel1Y&F=lrKr|{ z>46sboqRCi9F3*%o-Ms({r6fVZ;5brjX;B-Sk?{Kw^y(KnkOlXxk(@~VAJC>{^k6V z5W5T0xC!Lo$vi!m9Vsl^C*rWb8NinOmg-)!%de`vUnX!}|NLi$`$s_9wjqK2p(mH6 zD^|m@v+P>v>^#PdNcO}#3ACS5YRGRfW><~mxbiXl#K((K_V6m#f%_GXKDo{|v!{-Ma8t)3|eIP)BBxxO2Lj3!b ziO=VaDUIE*E#PUk?a4kL8=49)ybhC`y2aVN6?}G+dDSp?7uC8CR}yx2n#AbI*{j)77v4q|JT27o~i^_Hfak?vw(Jv72ExM#nX^<80{ zdQPx&ue+-4=zawVujl(uf2a{4DkY$L4CsyTk6D+B@<=Pw`@nzz%|Er{xKor?df9)I z{qf!{cCT-vu_e!5WvshsTK%7*GmmG&|Ks?~+}GSU!(21h}>GC79P9MzmTbEVv7 zB6sd4M|0nDUy(D!NQgp2xs#BT;``h0zx}s89(z1K*ZcK)KEa61VQYWr%DY>lPDN$QI|I39xuQRKSXBJmm9tBikrD7zJLuSLJK6%d zNkSD97@}cG)Aza(xq$$NM={qvVU9LnpiL(iHPFH7?t6mGxPW*W<1Hbe;F|idtV0R}H9$2b{>P9N- zb6gl2Sr;F0H!SQOV{BaFgLpLa(;udK!|BoPY_d)`g1HBuxb;1)J*U6b$^KnUeAoYa ziyD(Hw9CLaFe6)3Cw3^^T+q^mWE@j*?oW2Z@C^eMy@eCG-jgxEGGFNf~yYo7o3T#9aY_VqlUhVTX;hum-~ z$d%3Oj#bT_$O-A-_GfRecD@e~i2SBvYxpXE^!t?^V;||e9@==(-b)uS#?p;Wf~4v5 z?a0%bI0sg~VQJitdCB!l7am&a^no_l-*=>6o&~Zt$BH(8Wj>8IHxY{|q1KANCjYJ6%fM zt4q1PiPwvP1usNTie0$;2LNY?e%xvenRfo*`^m8wtwL9}GxR(aN0UbaLO+nwAD;ew z&q#Iy4xaCga+pjrPOdP!PNqcbZnM<9NAou6fWt_nL%1-TBL zbj@Ri7eeGyyX$k!3#m7(hEq(7aYUxr>b8=*r&uZucau#)V;rBj{O7d=sq2mN?qon~ zuy{9fO&tnT^%(DN{&?t5iOP}^{szD}?z#8gi+X90yrtkx_ukUcgiBbb!PZa8oDIL$ z>CTdfFB!13h!j1gu)adOyO>dC8RJZsN8u+t48hj0cuNovawL^_ZetmoC};|aAy6t^tYDBNy(>gK`%qLop;Y7;k?>$cfFFi-XB@#;A@FvsVC z5;W3Mxr}}OBw!XGocxD>lT60ZkW5JlYQ%HV`#$8&XZFDhCa_5RF4SAc z*9f8E29ZX{P3OTzTEtVI1=00OI+44q0@d!;EJdzq*Kb#pd`^U?Ob-IAUA(OQS21=7 zA9t-kmJv09L;;E$9Q6B-eQYFP9hEHTj1R7d!Wzi%0iv<2_mbC;%I#yd$<(t~MLoN! zrs|E3{bJjvnm=kF7#hcRMNP=2*!yIApf<(zNg2fquKSMN?M=Gzt~#%sUJmq)=6F*b z<%tT6Ne;!8I`Y@-boKapr_40>PDtAqbDbi4E9)RdEoUB%E56sIlQVH#OqXLjw&r6m z0~!B3x8{_=hcRACI(;J#U2(oL@Z-2@Q~w6|s{lUKd>OX!A0VTkEU!5ksCC@>_dU3Z zEsy-rb&}BAdOnZLYaub087SrEUq^VWxeeVIfE2nuxpVE4>yV8{BZj?2=(?j9tIFTk zK?TEtuvgS=sXOvL7?CyRSznT6%9~6#VGf4GpS|OAxdn09pMP z&Uge~iHQje3nolLFBP?wRDtP(;K0p=Qol(J>!Z&^BkKp>sSJHYt#d0^z2x4+$iD~= z)jv-XrEi*jXCieT|00hJWV8PfbQONCvpw8;rG*wWAg1&CooT~{VU8~z?lH)kCLDNCiy%7P&~S1=Fcb#4O2_{pQ9QzuZaUX|b*E=|pg}b>P_gYw0=}1;e6=q; zQpT~QH?(jj1wG39S7+f4KD zPaR7WJM7=PZVw62B=BBw5Qr`w*F;m-kZEY881eG82*3m4HXJFS+h&iR{ZApi2iZ9*(1k{KT^jI5Fgb--UQ8# zYwLt@IM1mM)R!K$cZ&Q--ZZ=qxr2D!(;2n9VS^XFnVs7D7t1OV2L~`1au%O{*}y#& zw3od^=x6c!OMVQ0fv@PHvaxEJy}W_&|Cj$$Czv;B!g=UHe;MTOoJR5CcUg8MD# z5EE~oXK8#h4LI#HDwPeeLjh->`Es6})>&cYd=iLXy(?a2-C*e!@*ksdmV9^#ybFnQ z3dy`X>=#z16{vRlb_SXs9n2W9i*o7|ej;~Nw-B2PW?EE!bs^u_c>pq*H2aLaSjVp7uoBtEd8yFVd2JzS%v#op9)X@n z_a&7}T=iuJSLD`Uy2mgaTt6Ya+P{BR!!0t@O;&&d2X#2ZlGHL*K!W0?V=FHGHquw^ zvoj|Lw`!kt4M0@mMX&(B`JY_Fm-HE%Gw`~tS3-u8!mA%A!bhN<3*U2QxGX;=+)Lxmp%>|)rt&%cjMIt8>Epd%@~86X3PtHuj`z#yoTnkr1;r-ZxFoMRi{1%axd(tG)^IK`0kv6 zrm`?bP1=}s=2Ya#E#^$xyF#flpGoV{BCz78u7(*^pnm?fjXErzr-d;?_iP&D>6d>D zaKq*MeK`n=wThlsRupXO`YCoIVTXx_9Lg{!PKVr?DZ+hE8Io(v@3>O~cmx*p3F1Q2 zYoC{7a_uQ*10cjD@6ktCt2&dG)2H1`i2EB;M1oBc5cq+p<$bk{4$I6CY}8T=^75<4 zZ1vDXl37wien*Gd-u^?EhIzRxelXQ2XYP+0o97JLKm~S8;+suZ03A&9|T|fF> zq=Z^Yq!-f!xe<*jPcaO5!q@rh>)Hm>fOUE&h=-cPZ9R>eG5;ndYkANusi~w*=VAv1 z#*C2X9YSt69Pw>1C(w7uJ93w?0%sQM7~|~v-10^CjHH;A?F{<4MeihUJc`{Ir$KM_ z#UgU2pwf0Op}k^ReW@7BRjHy3Df4q}XMs(xWTv$cZ) zdh;J(uAj4h8$3~%OkjT`&`yQkV2H235j>VTit>xmYO{r7T4CBoU*e#sLv{04ENgF zPym6nGJ`@tScVF(SJNOw?oYf7l7N?%@ zqzRcjPX6Y^hkF@iJkakhT8e2sS->s~C{jRQk?8X4uwfh#BMj@MrT zg^t66|NN*j<;@VEk$gh2f60%UAxdN%H@%V$4{jal7C?vUS{<#Y z%Fj8oopgaL$)b{(gH=}UpX2grU3|A$m>AWzIP0>a>g(bE0aU6fb$~p!z-aMLNM3YP zCJpPPyU-rmm=hWgCH4z+X|z98H@a>W%NdivC8a;2kgtI^BaK1$6FL@8-X+-j4DBGC z`ZAEAv^0M$jdIlgdA`eCHX}!nN zs@f(nB&1yq7P2RPm1V{w0l6+!V!c9SL>$5Zm)x|0X?f_N!pe28JK!I7*l0|D2uuTL zy0*N7ya6nxW+b3J#)Tj&xLuNrUe2rH0GMovq_AJD=re4}JA@g>}0ow8eZsSLfA8M$~F^g z-7J_9u)?rd4e!c{%QnqJI3GrP^(zTA1T!lGG9#;06(0o%VoQDaLv&Vau>y}!T&To? z#ewIacH$^cAv+Rjy`ulTXmfa@60{RC_QUic{{ehbTN9FLvHb4i=B`~*^5Qo+LQcwX z1;bo*G+jEPkD~8es;bH3ze2|#j-ynZ+w&v9DT!zlJ4AZMOfF~yz*ujyp(*7|T+@=Q z869yxrZ+Z1_;OVF(;^+_oI2(Oau3kBjvvuBw6OAzgXrW~pIN-}e4DrcnbNNs1Jlr1 ze#dIE;iF&QIV!Nyjvx4BYx{88U-xTKRqAv@a!aE|h!`z?Mi*a+TLbm$Mt%NjDj9qfPn2#_mhoc4{g*DcqhGba-j zyWl7f=5$RJ3Zkv#<^kt%$?CZ#sB!K&_WKOP4QLaXBVO3er5Fu|%o<!i?X}GA^kBw< zeIR+HA9Z>!d9HlXP#P`dL-vcr-jcqk(`hA%;as6i9+`^s z&z~VPMe{I_xzKPg51G(OIwbKxhib5E7a<^X8UgZYQ71P>Z2-v_cTCBB3hiliV6z;K*r4y`9(EU;4Y!0!f)FrqrHi3Q)|deVk@3XUit5$b^Iq_1~th5A)Zt4xuvtQfy6oZ9ccmH-B1q_fDk3rHFo2xZyw|lpWDGKNL4Rz=E7?fEn<^kQU#k#)BYkW^Gi!&(&KR^-l5T*8q^TVs zK~h}$++=XX!|8Aaq(>7VUJ~gN6r}oPqN;+1B25xCRtTnjEWSyEbxPzIXOP^u z+uXzt@4~v`wv2_NYI3>%13*B6U7WzJ)AM&q#tew``-!t=+EH>k<4tq|uPHRqCM?;l z;LDX5hyZn1GN|BYrD_a+mJzz-aQpq^hipaxMR2Cfkj2$!CGnIWmj^~4T+*SO^qPK5 zWZ=Y;(v=>>;^cfFygYRRy6epuC!?XZJZx>NUc~G;?WASaep=}HA1k9=1Y@Q_40rw4 zxdW#!N`eYc&ru@n^@=oDYCO(TM|kAI#vtfe4Onh}xj$-GWV{0arJ;W}c+r|%t3_nt zqEUEN`sBnir_cbG9zunCE*)UFDujY{QbE6u%fP(&W_|Rl&npb41|z{a%*m=xN246V z4$Je>`9wdEK!#i9QEJF16BrSB%|>oNnqI5Ry&I`?i@NTLy+Ky0(sr?OU3e-XO~_c9 z^jHu{psH*xAJ;IyR4MvNFPN~38d@4ElomgvpQP(2hD_G?*#61vGqM^^52mf+uOe`% z*(Jn5J!ob}Pf%r987=8#YU4~Y(&(h=2Cro{y(DXX8hNq8QRN8Wkm-(Y?+N3jF696E za`l?JCj6*fHttggwL-IfVGp^Qt_KqPIvLdqW_>lR$k$Lt_a^3{jJ@$9`SE#n8E7Ks zJ+(cQ0OP$imr^ea#XphNRT^kr*AUc`o{OE!JSpQQK zuHq*agkaoA%bzk=n7gNR8))$t?}R30*mk_)q10nbQ{5OAxW$7jlih8oKmhGPa3Uh| z%aa^lJepvf|9fv?UBNg&Gh$KLu=}(I-~{*${)q0qSe&-u|C3JFoS-6Qx8(IY2hkl1 zJX`gg{X>a00{6?Cc|e$Rsl@9gbhxrUwoEev^kwzbW_2&vFRN~bL1 zxuUPHWHAQhm1u!E1Qu#7wI1bY54RXut9WQ&cBcYWgb_b3T;CB?#;bu2yOOB9S$l)i zH%R-BWD<*4Mz)+J3Y19$DO4W)UB%l!g=Jj_rprjW9N0QN)pD1S&7GZS;NiVakqvFs zO(5zj@8IZY*`9^>{;1e6tl!7F-t~}ZhT<$Z#PqIpcj@OqbD`X%>*1LDdk5Hm0~foP zfYh$*G^h_b!?*ty()}VWLa}VwaVlFWZ)k5>yl4{uciD%~alh)mW8qaHNLAF?*l2e8a=&7|vq|N=smkLN7gH0BiF`W2Te`HO&IqBwqfAlytE^@WS+I%CTu= znzBU8R85K9M#}f(JrBQm2^Bn94OH{hIi6i<5cm`SKz3(RHM(t24O|<~I1QfmQ4GNN zT(Yqe$Yheh-c}4)_;sS^zjU=?$aKgZP^13c;HyZeLk_)PA#)2ThM9eIAJ;UDz!Ky8IWOOfV57GJEE8{-P(zC_ zE@~?d!E5#gu=;zk=w=|AVYe}3V)c2d&j`D)NPiY+Ab&A7%iTSf_G;|Q`WKajUfYb1 z6LyE> z3gSt#b5T`%5co&5Q%=|N$!SdrV-BUxH+$-3sC}uDX*p{_J2&LuUPoP5xyisf{Q@=7 z49mb*DDzXVT^ao!n9E6m(uo=~jMq{lV5LA*pGbM?&)J13kF|z}{&y~YK=qEC`=Zzd z37}-6CI~?PDeOJ-?{p(ULq*b|h*roQXo%lIMjhi}| z0&w#R2647fOE;gC&mvP!4L-8e_q1X!#m7g7Gf7e5_XBM$M@{`}%_Vc1dC0jVH4ACW-17A+J56S>aL`i4Y$veK5uQ}AUQ zdWp6!6r)hEq2)hN&rq){W;1(%#_53^O$FDHd-kOgJ_goDg9N04*qs^)2e8R_c4C%h zo8yKvqYV-LoW@!vV&(=-#3QD?abmU~33u9{#HaYTL&!w~NhR(fw9qSE)#LQ;ogN5$ z^1;GlO{0xs&WGFA*<2&HWt{y7QFch3GF0OShXcjc*1i)FL^1Z8^BLv+ps|U+~f!jc>bx7g8#?bN6to-!804}dBezwFJQ&IR@d^Dj2!`fQy)O9I z)}50Ebao#sX2Jv*r~oMiO)e@;#f0U;JpldnNQct1@;a zcwE_usoa}?F|#Y`j)V+v$lkgxB#pxRsHt=cZwc3p1mc&nQM5-V=eMhL+A%r=SC^@(bnU(y$Uz!W;yp|w*9raX?nqIN`r@tegE-u z#y;4XQ<=#?=8QyrpV*}s11e+%V`^}4+0PQHpaPrXIQt;%i7^v07p7Cl<@-0#3t2l> z5J;}6Pb&<21|~nU!hR3=T_hB_+xaI=KL#?uU}jh)qCo7^RFPbGPCH~m$axUpmJsVg z?s&4Bj-;3+3`zP1#`f3*^FEv0rO1^ z3YrwjX+<&qHJkKWS1yxLFx7mAVAb|GphYNh`@+)e>`^}L6Zsn62Yn|f^pG4N?>&eu z!fzyRs?K7*vH+FOai#Y>{WTgA|Ti``gZK}M#$u77W-50I8msJ+mfJmTQ9`h(PYBjgDGgg9%vfqpFY#eJzG8~|k%&D3;XY)2bd5hyuo1bu>l~F!4tLlo9P4sSa?aqaYTOg<@_pnN7%%0Wp`;i-e47GW`x9XF`n}W`evRj$8Y-Nr9 z`i4tG_PDBCK_VF;Kr7ev~g};q+6}+$J>#b zWiJ}YyiJ8$9)FLwFe0Cw=oJe*SjHCoBSYswIWDC5wcdlu=S}swOiDH}f@Pwhx5suU zB^S7SE}zVD@QR0!4wq4+Pv8fozR4h^fs@;NqH&#nFJSR$zr-9L_qZS#lywGD=q7%q z?a11#EfivmoF(#@sAPv}w*4Wmop|gwbYs)>1%37%4$b>cQ!YUOHl5=#i^zCet9y^` z-QV*9((-34;}_;)-|xz4dFOZA%8Wq$|58nP-_oq%x!#!%_73%oBgiBfG-u@2G?pGymyRaHpc%Qk;g0c|v=S*`K z_n9xDd`D!TJ|%oBt*7j9tBq4ZbBZy1&_EP_=c&-^c%0tX-b8w3s<)TSQH3bzmunp% z{PfnzGy%EzlmKQ+&uyiR1z!%!(PM>It)t>@hPVmZqh%P^Dtkd7F2FlO5)CDC&sI)f zY+cviP@fD=eO z+_%?Kl;x_eWk08PbO4Ue5QZzItw`25x!7YZi)d#d<+lPNr3&H0yT%C;bP?cYm{ZD~4&SOTqPVM~o z-Vn?2->#_;d*x^|OrV2%n+@>opYVmI%QB2rrfr@z9a zZE9ZOJNkA$N%cXZ&qwO>S;oPfwZxN|;+y&m`~B2_2`HPQSDYzx(@wMV!(wf_o&bfB zP{Kj8pffYgv!lV{&D82USi%IScegCoY&$z9*RV^08RJ0-oIwjudL5BBIbV`_*OG1kj$=?O;Qj;ej8 zH6%M4tkf= zsSswhGj25Fn`(gE7!G-D^m|oV{dnPsHA3d}=pS~-z#abF;_OHb8fs`5I3!0A3M9h$ zeu+latcx8!KM`zi)Hq!6U{SHM!-5y9(@rl|R>Mr2A4?`WLxl(C4>9czXaq!vQLbU5 z^<0$#U`lP~XMpd}(5!Kl&XvL&xirs$r&)F^b8iKy(xKGuwLgoazYmviB*8At$P|y` zo)^6Dv86%84D_Z=<(bg#(P- z`RKo9^xb(DLqa{2f&)ObTZ6Tio0-74?a>>H$uh2x7#V{`qTj)bx{zs2XlGV-O(xqW z6s`KJs#J&HlUWhC&LGvxB{<+YJe83nGBibgeR(oD8=Y*Lqp@dS zU#pe!)oiM%(s5e^VXJ2hRO3cSzMH>D(aV+q%wC_5IA{Z9QBx$zPO(yNtLp>^G>+;A z4-@7bjXQGg9S$*z>j$#q_Tt=zD7%bjQPmp9Vr_a<7lHIqe=I1S!4l~{JUq@A^OJB% z^HtWCDXhR2y6h>m6CU=?9mQ(yGaPd{RMd-=nsB2lF?_KxG=F^a(wezpx~yEM1+D}B%GTAXs3%QlEYTeq%wr8zmaJF2KqfHZRk-n*Xejw-V6nfsKo=`xl;;o5uST zx1e<|wV&OW&z>rSte8+Nl14 zQuKRorxFVRg%g8a7!#}QE-MYll+&BKk@G;lzLp@JOIg2~9q$HzRe_|VIz2eIz95}7 z@CF z6M;mX;Sh|{`kDcO;l3a!B$!t^MMbHM&1|$_c$yDrhx4oBhS;#Bv)%xHTCz79n$hw` zHeG+HglV}T@4C;cXWVdddkU$P@aw3z9p93tJXTEoruEyCDtVw)k-fCn(RYFkvTjp2|N;i%PK9Z-E)090{=W~tc*ML!jsxRi_iOms%7Wds7 zV|2BzUypNronVs#N`#`->Z=Dd5M2fWe0*OvewFz5d-#?6NZrytBGa*?d?V9#YRa0c zN7?@y`JM~dwclKP%dy!py8=-adXw<$x!(q_JLZe3ut%F z&wcq4V7_(iaLJ@pNrHB>A40T+gRGH;`Fpur9RK#KS2BNHb)KwX~S9p;p#uQCmx0nU|>b{FsKTx{w7b7 zz(K8veH`Cw0cFGzw$J(O{=PQ%997gbReP?NZ>#CZhNO#l-?M$jYMN5)2$rOo_Wf1H zh!>S!ID1O#9$cCO=2KMC9Mj8MWyMG zgZ=p&7J3`)gj3FQi+YK|4=JzlOq_^omy-b9u?cVC5TzDTzpz`&UDopBEt)DCd!+dU zXtwj!=T&2%us`#|Hf|EDs(^mTSmQC-RZW9Tl)*nscV-u}VYw<|^t6mtuI02fmkXWL z4+2r1|8n*N`0k-7)VtVOXd@ZS*rC)l$CM9_0YVCzqAro@YGMSu2M^nqR!!;zG4hCJ zCifX~T32=^1rY-vN)@obz;>$O+^uDl4A^#ga-FYMNu+ruhn%ms&@(ek`r}MvUc^x~ zrd#Sy6@c3U+3Gx9TCNM}|H|%r^ z>*mHrmq6uT`LfXsBOdR%Kq=n7nir#SvUr=IM%V%X7qD=Ou}lc^GLK6Z9{8$T1El}irwj3vNwrx_&_J?q$$$MOQ{H! zZgu|;a3k>x8UScQprEOy*AYCzlLhG|t23>qIna27X!5sD-`PLwC+qC+0uVn)MQ$gWWJ# zQdu1fTrKo*R2R5M-llsTG8#XZ5!eM+lG+gyk&}4<&g*vxzo&jxcov#X>z!z&ME~^X zaS7TGfy5h}CT1FCZ0#E!qiKvD#8SPo4z+Wl>`&>(rEPt^HhGCetfv!++Q}aqc5}nC zASZM0hI>!f=*u_9#l`rd0UVbNL3fF`Mz=%=GC^0S%D)~UQsT5^cFMvvf+sbu zzM$^S+ctUFF(*mQ>mPD5jwCxZVyEzNw2s0<9&F`cnt=Cuf+70y38-L~ZRN##7TKR%zQm}=Om&Uuay zRR!wAyA7U0E*-09!|yVNw-ZeZmDlW6``}73T9N>CA+tni1vFd z%zzKXQL52&FG44&6sm+{*o^@pFPqvz-L%J`0)lC=;eO>txq;xg1ii~CvI0=mu8x?mf=V@ zD<4_8jrw)XHH;*qzYi_i0Y&vy<_f{If0k`Z>uTlP-6Ss-bN_7tINOei1KD|H-^>($rhx7-D6-Lf#3ahW{U8qtO z)d?9yK9ECdNS_x1%SvF5<$5PRwd&s zYHGE@f*w|`ziq4qjBN5AiG35!r!enivpMESSqi=VPB4CFmN@aE`ebdeSgF%DyR~`} z68TMb{KbUQLd21g2lWaT?Nzs3BFy!ruz%f<2LHjspoLE-CMs+m)6WaYiAz_%R{tpE zJ=?PAEYzTIWbn+Q&=zhlpf3ky>N*y>9V$LYJaMYC4DIFf|=q zv*LbX2}i&;LT-}tE6WvR<3U8;gWf^PQ7HqXhq&rw&QW(?w-&FGgN*Rv?W;_#hMXaI1HB12NuD16HnD^Am#62U^M8PmOR1D|ULHuG&gM zM2vDlZCF&SwN2uZIRR!O3j$>cQr=_yhhOaUQXF40WxTMC)<-v?9S4mei|V>Pa`d4# z*g*Gr@7OQBJ_i1E019s9au4}%u@pR$>IpTT*FyiZVpJIkwUd;Dh;>uxv;e8g<>Yb7 z6AST3Wt^%MTQE3C4FNJ{_0)C1?SB?>aI?g!t2bx zcnHqc`{Hs>*rFbS7MwzPGW0_;ObDKY-KxNxW3$TwTbi^RYE2A`_9J zMs7ME#wrb;mfJ(`Sn6)297NZjkDGx9-DkGf9`K z3dXm*TD~GD%mV|)vO>Z1g@V0C9+T{W!&Ot@(g@-nM<|d7gm1 zKK<{Iw^8 z62Jl;uYdaP@1e818ziQ`481Q|%#~|AdkObrcHc}) z&?uRlCPi2w+p3h8z5af;Ao0g>4Yxd`iP|1a>Db#x>Tt>d(`D7zwC)TowxbXq<4f?g zQLj#`ItLurpE-o zNDj&y1u&Ac{?8w*pk10f2hAh4%IBM&5(o-TL(E}JCOV1Pk*nEADAl|~%FB-2M4VxQ zY2s_uG%~?>o?o((!`CToLIyLU$`UOK~!njyewR1{Mm%JtKR|#5m zLbz-tnG-M3P=-%$%4r*ma;%L`Fxl*psN@`RB4Q-nG2O@t&3#r!p+1F2RAP*d`vb^@%Z`@Ee2m=TrqMRl zAlJ}L+&A=9o0n>d^Qu%@rjtWGDaq+uyiQI!lF~>_LodCrlZQ zU7{Xxs^G2!KrFx=;&3Ah_Ht14i$e^_=-JZvlW@3!iumrQ>3esNvDpwhN%r!3lF=*O zbq`oAJV)*lz&!p++g81;ltuulKg;*m{7;;Swr!yP!xo&|*6@4B*RkxU7xTSkj@xn? zLM5eYit~I%uU-Xbi<5YYB`g9B7}G>UEyu8p00oQp_4U5@+fVcg;!-4N71Po+_YP2j zMZam#qD$Ye1sgdBHUdy|&azJ{SL$w&RMVOBzQ3X31bI}JS=Zc5(Hqk>@r= z4}SFN+fTv!$yD1M`E_5hdYXhADi?2da9Omg5Vp>B%OpA3IG?TS9t>b?=qP!}pMO2R z4V9xZ@)zvaA$sn$i7d|3r-?cU0bJ>P@4W9xgwdmAO`}lFB%l}L0CJ| zq12B-?a#fO8i!yLo=rO996~Bv;71zP09%M=n7#YM3y2Uz0|Tz*f?T4E zUbAmxf~Nf;NR;;f)gWS z6m#HUu6gvMuJS^K(!vLn^=te2m3rks0Eakfa6fn*dZL_$wA%{0Ij(HiF${qcSfHGK zyESxrf;^d5)6GUDc23FCZbi2l1A?5^*1Q^Q5?D@fq}IH|)AH<$<$`7wHmCvT{s{53 z3Gq~L0WG`|^EDT$G6CYf74^x!Ic6n`_C_6-7Ha8F9f9kyaehYAUk{IVp24^GTjRvU zKUv1;O|l~;(epA|e=fY%!G+(NZ9l&*(VEMEqrdmZ^>Cq=4l(Y|uZL(sDAmh*U;NB% zX!&h&G679OY+b%QL0_39oo5W}BfDqftx~!!e~k&9eeubX^)c8frP79QN$6;$%KSD@ z)0ruEPvGiPYh!p#oEts$prQDSm!ei+O5Nwdj7>s;yFbTMhFBZs1rzc%P{gev?PNw- z`N`0ple3zS3DUkG6kn6b*$KIUQ&x^22u+ZB(RTl}be5dzvx&<~VeFwT%ki)YDBrYL z>3AI%fp`AhGe7RVvpQ@|gNw?$e$GLi`KF9)#A7x*t(Ti7H-fN@mK%icApujiZna5jgm04v|; zgdEP^VJ6df${YfjmZJM|q@}b?8#RC{nCsT4X8rzrFb8dCm2H54D-_6jp}lunA{b6C z{N*|K9{~8QYeM;xM-R*2LKuu)z=;7aK~Hc~B?Nq#2)8oURn= z;Y`@@(N#btXf9JdWhTrVWL`-FCfTu&AK0lnBLCe7*<;;8THFD_RYnO;( zv$4Ew3>v`g6zDq=Nw)*AEBip=yddwteNu?2h+Yp#MstI8){ra;<`TiGcq(gY@sF*y za~1Qnuw#Yu%KJGYXFjI1xBL%vz#;rF242s6xkXb{h*dhz&hVHeUAe7C_Rel*t1|Sd@ALqa#vQo*zt2xk;~XoDvX*NlOhcQ2MM?*^WW}x%g`;^G3Sz!pbh@mh7U= zzxlIAWbH)FSjYlK;>jG_Sf5z$HX@haG=q#wxNPu_;;`ve;>risoOxeZgjK8vLMN;R zjoA=QvP~OLGv-3xbIU39SI0zO4)H_}-a9NQ=q3@ z-1Pe8J-ZxZ!DoReijwo+cNlg)Gb}Os{Kc(dTV~3@`{6)`@E^M;hUf`6wHLR#fA8u^ zOAQ(Z+ywr*;^j9|{KqgJgG%_GG2W7E>()s?Ls!;61(NNcuG-nd?wa4c&7PJ$g+jr86KCkfV_S@QK{JL65-#Mh6eW zFT8rk)FTCPSwp~ALfQr<{kEuM}s$J<=zOJl2I|4Hj zBz_`gyw>oOb`zBRf!gcdG&(eHlqRZ7s(zNacFU6oIi?qvt0>@)w6roIXrrfHY;;(~YN%R;suO?MKYP1JDjs8Ai z_LY;0xhW;BRU@5JiO9A|2$Kg$Duzu+ZejKXm!La6#Ho3Nod0{LoWT@*cFgEN95l+h z*STY@CP9}{v%BE=WI-rPxq$D0Wux;-_`Fq=lRM6VR9Lb_BBumJ4EEOqaM%5whw!_< z&8c_3q+@zmo{$xf0;ocmW`11bolLa4F<3vGdVgs|vx-w80T5I{1~dITn`6a`AbA$i zv%c!W=f7tF1@17PlCyxK9xuWz6plp$5Beb%jzQAOnd-s))IgqnsWO=90YWH5WiPIZ z_&Q$s0ZpvOtH<`AK7L<31xM9OI=}NOMGqP?_9t-nzCEpX`b4YbrtcJb(Y;cvRP8Jn zlP7Y`U*^Q#k(Zs`1GG7*4nUeq!8dFVjC~*cy-=_+jLn@Uek4fc{i?@GZmFnc0}M7g z6wiLusgN$C6-lg{i%U6tf&q|WV*<{V;*2C37AnVo`gJC8w|mnoZ7i8cj_8=B^nH&gn<$Mn-E5A+LG zkNNeUozO&&A`Zu-lzD%ynJJTkv){_%N77Q=5?+|Awl(_6oLO8J6fMMh3AZoG1GYBH zSzW59<^8grG!4I*i^e7`=%H1$IZLI&snk@qUAgFSQzz7um)b)$8BED!Oz0V%DCd9} zJF;Sr*H8`|8H_+Y z>tMfeYX#@Ym_@40Me#_xq%%9>+MeQT&s<$KfIzWcQQ_YR)*S~`-n*|9&YK(q4JFzQRG{a(No&lW<$IDIupUPhH09uP-6neo#(d- zkL<5Mg;9Y8<9}x7ZqV}ED`(;(I@o2{9|T6EJ)%mzL{Ze6;7PG!&%}S8u5)J*&_xz0 z9W4Lqt=bI7vV40=jtF1it>0yG)TI9bNYbgIr9pzCX13M5xP+1IPKm{Ls;e}z1x0+y zEI$BWj`FDJQrxEt*{hU%YvGaC3-6EDpt6reJznd*zw{q5$=t9Cz2tbWtxhjgg9h}M zK*ip*qM}VQ^BXQJs-VDZ(c|-3C_O$73{^vy;LiFv zIp2Kes%}Q@-sm6SuSEA@A5`19=zNsAddx;tpmAvI{{U^{_=xdQim92|jk?~S`AJ3f{en{t8 z>U9V3m`VJ&xmYoqlo$UU0Due{++4fy#M>V4h)~Ca_Jn_a3{6+*qwU{fGd-_=1linw zcwsxBcVPYRgtbKenI|otP-rJlb*YQ0iqs?kj=hwp(m4vFLJ+vz-n_U+nCjB7AHGdx zH04|n0gWrr$y}nNyHzf%V6OK^?`d(}D**cW#dFG>n-Ep@m)CVOef{g6&HE~EtWjM! z#77NdL6QMy8;P6uPam(s2YCha`M|bkmItC~H1}tr@woWcbDPoSn#j*8K@I(p16Q23 z)69PhV_dCD{=U!^^*94s;!c_Cp$+hM7@;tt92tjG+IN{eGtW{_Pwlm)qsQ9Pl8WoQ zB~9w4zSm6-@Ljiox3r3Jbz`Z#MD(u$zntD$%}vbw67vk{)vrG}CiWNd;pI#`GW<~` zzR`vBrpPV2*%~hkS98ZxxdKUl+qWvIqVF!WS>5U$Gi-ijtY2R*!6jnzyu{yzLHdPM zPbj}Lf`#!*-EuV?r?Ktx6_YeJ+pO_|nG7WJ%7Xo)3&~{0TaGt5{TV3tXJF8PwdnCN zma`z@%HlLP^j`GAL=Wn6ys7Ue0mPHFB;p{fsn8c?vZS@JUmYT{vf*SLdBBh6dHU>~ z3n<*(=Y4uM`Z<401YdtzEiuCYP_t#;=eDb2*_XEG}t$Lw5Sb-M;+a z7CUdcV=AIm0L6yZq6Wqc@8#GUGn)C!Fpy7}eBi<}Xb40ZWXH$9S@CH?I*V*dB%aIZ z=DR&UoyB~mf^Yssz^v?7zJ2}Kj;I0|Pt7w4uD0|HSp#*6-A!AcSK>VKF zTQ9WsvkZI>#IL7J&(-j`9YUVt{mU~`HMoDoT2ZRgCD#opAy%FzTrjma2q1qPY+jwF zZ7p|8J@((@-Q4>p&!~n&a5nqfG>UYiDmg&Ls`!1&Q}tpakk_=`JH-2_30HCNK{ePr zTeEb-*4o7H+4i(jHZM~@ZuTeGnX6u7s|y$u znZPEOOP~8)$(A2z8goGK|4b#818WDA9P4qn6MPYW@g`NF(@!LuU3jZZ z8w76f0s(~pbN{1CX%$B`zW(5Ttmbz#Sc!90ogiTXBDq!$ta4tvy>>~O0Hk<%tKXSa zsImy!Mqk;5hl(Zy^RRmq5;)P~hU%0`wO$8f4AeG)XmZfEM&MP>yP}c<`ob=W03R$8 zzaY^AOGjh354=*)IjYXRfxeKenX5dGthf;0vCVZSCuearz;FUi>WzKwd@+1frMt+P zB*Ug~p(~NVU&qd0-tW_-3l`xu@|#_?(|4k>KcjjD3dv}W@jb2D>d#)Ba4wr?Ek`5I zfDaenVE|#E7$2kK3Be^%*$&~&*o`x%&zjt*5IW~Kr2ZR-fH=_7n6Ds(uzDGp)8}tl zq8L3e@kM&a$b@bmnzrPA&HSB2)Xf)(pge~m7)J_J_rwjJ?gn8sr0Kv&Vr=C@SzcxC ztUE`?l{&Z7c@yfzX0?AWIt{TIOvo2RW2E`Y-alU%NT~4T2qN+5dVW)a;LXO8dlUJk zl7{}!JpOK!LT9(>H@1xebo~|MNg-(KUe>t@!EE_K&qOZq-8Bm`Cc@fVeD!J`TrL3t z>p9b)L#bYH{Zkm`D2Yoyu;(afJBYHhL5f(DW+nYBgjE@>A0d&CN#r4_64vSI2Tn6} z;AT0U{`=*ruQuv2Y;r1cFCNJ;;U_S#X=26F!2vc1V7GH2lY`$?nurLHm)kvYo3H|j zZ!ZwD_5V!%?Fa#jnRX_Ow$A?nbgEEhZ+UVGN;tFPnB`T<3BI6h_M@qkfajDUq^o^0 zUFl#n;OSdm76I+OY_9&sg%Ai?VNWius~R9Lq_Jbh{{3^Y_7y8v<8S5M?Y2t)sVeu* z+gQ5Oz&>*&XE~Wf!gH)Q~B*ne4W1mx?0m z{3-_{aB*^HQ$g7qn46kKG#?)hs5H{>lRw)cH2kCeg=&S%v1?sjx=oRW1~$H)L=2Wa z_-PZK289$Vgwe~blbP!`%d>?snVl(RTLd*sK`MTsO>Baf&y|V?W9j>wbT$V_&yHK9 zP@p$%*#zGUxu42f>9{@=%=1&y{xZPo4j$xliH92wkMaMvr~QaWbsJ`4E#2q`R~A5m zMWku(%c`QUBrAtjKMezf3*lVX&yE6RAagbitKX}f8j+4#EMA<%Uq6X9aX8X!^321u z=nrTTC)ZCILHvZ@vKC0x*S^u2_&MObeQ+4&BE+* z3aH!&$tY_f>8(Zp&O-!}ZFcr@9tS@8r^OM*5w9oH9!%D7h9iQUgi;mD(j>M z#}GIB<2l?zRReIiH-1vrc-~5u5PE^c=}&GZX4b1?yd3h|VfRk?!8GfM8hw8d{Smar z+oJ+KOa;DUi}?fa!YXCW>UK1)lY} zw)R}CIgS;^zowUcs^@9t5?b3q7|=4?@l)nU#QC*AnXu~_J7m$+5*qFm7|-zUCy%^N zdp-##h^>6AQcIL}n*L@!Ggmcg`CYIVUi|?P)g`&2#vK-}U>o^cA<@@gSn_*fA?j7h z(<=5Jzh96bPmoeutAV@%uuzm&`u9$Lt|_4FuqrNS2PX2o8iAK{pCTG_Y2KKItI9D@WS0EK%cz*L5x?5#n|RpUR&db$BwK}*qMsL~hf1g8kO=P~ zw;!T93m2}2oe?p-UE~m8*xdwIPf0%^9=P$$E-I7GXV9v)z?>Tfskn4-BcJ0>2D6oO z&=6En`+&9c^sO60wwINgN~S-@lm(01F-r4psxOH&-^cQ%NxGslA}L4@9?mB9OaiWr)5Hk;oN`5=^EGg-y% zXNUID1S&=Ei}n?STHw7H9?*qib$gzg%-b`hth4*5fJvZf#hnivF9lDl=iC-}o?GpB zshB0RXLwPng$@zU^#GmA#{6NU7;Q2XsiFd5&|v+G&sLBwx+-CK5J&ss75!ovGn?Fd zFVx%JwAWH-uPzCFLlmb?A|B>OO)@__*ioox^T@4<82bJoQw|BW4gVIkA@o?TV2O#- z@0MWWpsP>;qjWFO=~G?B_KK#S1?J)FTs&n= zdwxo+g4;e-Lrp?+JY{FqU&$j^IpVVUyRpdGAb&O4H@HCy)*36^kCu)W;#6N!N6)Oa z-rv6>@H#oPxYx6O;h_991Iew!f)0?ks$XTSbL6$uPYuk*W7TY7W;*V-bhvGvSeZ^PP!2)K55zu`zHdLBRcZR5Y8NIIf)E2YN;(16#y_b^4=r1Gn)>=r8$i zq;^@P9#cKeTZK*G71IgyyJKUaD1-WiDQvzg&R*l?Qo+Q?((-I-)hd@O?^YDzn1n=IF%=eJBsP zOy-4S@rRQ!z8#_@-(lt1YtO@f|5H|iP(}M!EgSde?(2`tsy=(vd+O;xVkFPgx4ID% z&Rj=DsqtsN#r&}o5>N!BCcG$#exO%g zpM}}i|BXKQXggMIlYoNctoKKS))c;cDf2`9baWeyZqZGE{y4_iPbdL?a$&k#T{(Y( z5KmO!DPs~sxqr`F8OEoBRKl)r4AE(*hXU|V>hWmD^usSVJ|+v>8lmAb`>j_ug(@@B z8F7)Sx7YUki^xp7n%)>2jpczGmV*a*4uY%QYva;~ClERy=j*El3B7{}VaNG6X^K29Y0WJ?Otf>4 zRC>fEX~kpQ8{eyT4Fg6@cJ-N&aVW~;l~l`|SZB6xM-9svEln=zdXPzZa;G|U+I;0r zSP!8Q-J-2^0#lO zo>o?3eFW=gyieMaTRIM#@d+mi05IXTQk@NEi@Y~OFQaGL+4MNjK`2c1F4LsnpI>LX zk@$k~KJ{Mt;G2J*mMygJM3ro(OZVzQQ5Vnao3}YNU^+~m@{jLTo``(MZsX`v&$lP` z%hWqixrOI8r;_lGYzkCnO3=W8-=r$4su{Q)Nag!}KFj84IKTVx)`mfe;hF*TN+IE< zSGTNXk~KJI8(5F-F44PKqhfpIZbR59`QX3N4ypljTl(Tq-}9^q-E1R(D1a;L{r>>5 zP4rV!YKBmIo{O#g_I9tV9W1K(zU?TZe1K`E%a;rOu_?p?rx6>7uo+zS|oI-lbVqF>}Nb=yI;ltxyf7SWVt`~7I@?D#Fcz5V~5m1%G@@dV*O2!BMi~pwlzLoe{vJ< z(JP*;cFwcs`Bf%_R}?V#SW2Y&Rq1-N$8&%o_hbSLcO~{Gu%e&;%^Q2j{NvRIc`gBu zq2z%Z?w8Fg9%X@p`>b-+CDb|ko&`15mPYgJ|H_}-6xqx?6J2QP&CinH(omi2TB4;< z$`jsWtWKWj7)$#!pk|97y9f@7p5Vx<-xdmC?^rTAuvHoYk02*#{%V009{4E@IvFbW zR#@SSvy)>(z8+&AzkRaG+RMSq0kfn7omyOve!%Dt-iz-Ui_veEgJe;H!5!-HW|QG# zyVXCG>FO4rZ*|1#&+u5vedZdbUGW&rbPl`i-hExougIi|NUf8$EKHTupG*}%uvU+Mg*S3I-D=tC`@jEGUbGX8aL|H4r#jw8JMQ|KtM8WUBK0 z51=_JY*TFMUsPfozHXDf3|qe0Fsq-kwqXn45&Q~$fItuR!A zyY#|_*bZDW->MW`hFohp_3&m?qyr2vQLb%2G(evuXLqUQa8RIxxq%XOGRXnzLXk7) z<-gZw=KkAE{GCXla4TA0C?kOSq=e(G%-+l`Y~q-maPJ9i6%{Msnoyn@0MH%K&211< zm1T7-^vGS4aTvaS4P&rKk_jS9M*7}Wl$SYumxd^~*`~9l+5gr{SS;&K0I`i|Ae7&p zFGn(-JJKHqQk+0UQN<#Gy{QAbyfg_y&=JG6->FpYF|tVN4PxFq}^rMhg8vC^4&%xv9#VA7zkdyo;`zRRdK1Grg^#^kpELOr{X-;s!L|dsgf!>|3e4 zNMo>3XX);KoWB*ZM#(BdK1vYdtxT@{iriw1J(9h&@EecYg3_g{T~#;$s2qjThqLWO z4p-c*jLn%pE4XtcN1%FY`bAWxfb%@4JGm=zo#<0m13?NSJbvU9@S+ecdwZ33dQ2ng z^P?Ol?NQS9L1&*@!*2Ws- zeltC&ElpX$VozOQ$qyA&U1t>XY*dG^Es~|?zqvD#PUe@1bfF1pJ=|FXmz**jfTV6m zNmbt7%w z9%!r|gQf=0JB9ElPT@6ZEsdR?RP2j;6|Zww)I6Fk4;TPmaYEpEXKU0|0Zexj--)i~ zTkqLhHd%4!v%#*t(hTfpgYKCxv7Il9A3QflRR4-RvO{cg+Yue?Ex%dL8YS6op=g7n z=E#W0w;Gk5QaP#Ijy$a%=TZ9@5zU9>CKY%7?7V+Q`Vz4Byz0Ba$iba&iu9YOFdS$zids<9 zSR?Y&rNn%MUIF282Pr;T=0~zaODxo?>Ch%GtZ2y+{U*PuXzrld+kqi_LRA?(X9glF z>qpq6$fcT8TWtsbqMLVjC^mpXvt&-37bCw$@yq3MH3ZiAZ&nwECYx|}{_79(+prhH zC1J=Hk1X5QC#>C#zyJ*nN@jW1vyNlsi06{c(0STPK;RAC&;6nRsv{8Wp&38ljx=Y0 zE;0Q7(D+IbK_?)M$Hc$p2=nZ{2_35k{awxX98>qM2QtO=+ebzQa~cFHx#c?)4Fz#C#_QS zhhDO4{i!;EwobO*%!jLcR`^HopMAQR;d{?n4+h@ggt!gsYkxtn%j0V&`qb^~KP6q@ zB15GTB?gf$fot`1RqqO&@&Y4A2F zj(Da++zwFX4c54jnlc&Wb$Go5!^Cj~S^QZIb`o<1*cy|KT(`HMQDIj(Rg2bYY=+&0 zH9a*z>vv9eb&_Dhs*4vc||>qHa2V?P+t{@-dF{P{@bS`m8E|6 z0&dg?E-(kCpIe7rylwC@SYvI%R)tqJo$Ktn=WYcLmcn!gks>-~+~@;>20-9TM&FNJ zt(s(-aLMGPKECwwpASgyZOFzAj!a#Jo*aS13XOMg%O55SkN-78Q4*_+LU}IL$ca;V zd?O!q^h3Hf+0->l-yC16ar*7!U^C?xgXN0D{;uZh3-|;IOCut&N_^ma%+E{Iw^~H+ z04sroWBVlSVm5|g-8bg0vPj-gu`xcuw}fQuFNpf`Q}rO}+YP;KvBR<65NTI+R$O<6 zWb7JlC@-`pzFtQ*SS;a$o{GxTp4bn~bd_^>$kOcc`{}>+Z)xy=~yB7~5 zvhP+E_MWZ=tAg2F%Z}g`{8YzPHLC;ke-|YO@<7k60l4BugMgTY_hp7p8H&Zv0A#&C zZd4!pY$LNmdBEyNpda=9KQ-TY&BbfHa1B9aVQUVCRc-T#+90T6!r)~X&{Ilk*P}sh z@Gz0rTq<_peVn#~t)SB@t^4PLTH-FzPsrT*M42UvdgO=ZFb1`cY_&g%CZGS0A%5M` z`6H^dy)BnZ%oo^M$1KwP4%IR8_*(clR`Z$~H&eako4Geqf0qvTKD^Wa1N>r)d-vxk zJE_24|6B`-xzTM5oH26a*-FsB2^4^n%}N1U$E9Ky`MEJ~vrgmSQAc*ds#|e8gK!oQ zB-5ahdfq-Q{mlGoph;n_1`;Ar@VuDwY;?1h^`|m?K+l=^d*_!D9w~Do38c38$b099 z(cPF@RQ;w+tUf!1lI!LDtMcV=dUwIx(PX~-RUE z(xgmB`qxe*UnL+?^34&N#&>Cz#?D43Z^Wgsa9F{5w(Ila^~&_!EYJ^Rk8F+a%XTM6 z(@gyv76VBbb&Ex!pwd+E*A8Da&)X1V`y{l#mC;F|`3-k~lb=2=Bc!y8q**%!Mr47*)eq;e2;81B3TE)mNFPbPfqk+iRO9 z!6`_dny1NIZIFWZg9fMrnXhFmB(RXR6Awy9L`);?Fdcp8Se8U{(h46l9e} z2i{0);8ZLL6EE?3{{(es7?WIRpYs3bibrg|tu^pV(mysgDRV-!WUEjF;U{KMnVhVW zR!&O41-P?5uj!y68l_15GLa>%p;&+(PHMaOi{2I@$bEZ*bZE{!H4@w0rFmK!R_{gU zyr6wErqWjbK+*CiEwT?k^@V~wFY3_)w4*JpHaJ^FgYq-!!_@bODLn+?u zlYa%d;&jlrWz|#P&i?Y{`A!-@D~lJEXfCcVI9-0|;Hc~#-kLwX@^_3=RrT{;p0M!A zg0U17&wi>R#~{(mbW;=c7VD#lfCnzK)iF{;k4uFpG7A5u+>RIQxYPAq4GZy#SCR<3OSPGaXvXPTVRkuKh+{^KCNIc94e{GLx%)Q{2C{W!Z+{ z>R|6WpvLx-4!1vo+?R<6&_Ns5i_qz53$WzCpfQrHo2-?XUx6`rHbD$kNghzeX=KncDoaIl6g}zAaoOzYc=NY9RvX&$V$oR>6ZqVRs@K_6aGqVWK z`_N^$Qb~hLLsI=GP(sN?QI+ep8R9IzreJ9ytZWHxT@GrEE$hvE5NKuF8y?$5>#30>t=gAA7H{q%Qsuy<*vePZF` zq(0smV`zpb)3!1M5eZ9I^-TVD9cRZF(shQF@*c`tzYIkf4$Cl~-{J|tU#oQyL!U)W_xD?Qd z?K+oFK9G7$iet{bpgLwbVHah(E95nFzslQ{=);}Sx0`M~}9mL8s z^9#n^2#?5x4-0qzho_=mEoRUKmu0Nfmv1XX$nh^YnynSK$Huz*kqyS>H6L8ckh=`l zZkssVqVX&~^>~?ex17z2@Gerk;@(ao-|ouWS;T=}I&v4i|94Gnu!;y4RKPp@9C{ zQ2t(xb@m@MfVT{qQTS=HQXA!C>J51A$mFY1lfEpN4n%CQ37b{w^-dnD1EpQN)^zI% z1F4^EroivrJ-U+Y5`$uc(C54L#p15A$0r8$839qhJNB~P1Lcs*Y&j<@8lkkWPZ?RSm`k`Rj&o4W9h7LaeIN++feCj%S6d2;0@7G z-fEnVP;I^U$J@+Eldi3v1Z{*6{w39Y;Z`ux&XA_<xXP~ESQHOX6^52PH^?7gK|EHBS)y_Zj z%9hB*WIoAQbiZ?OC(34|9e?#*Zq1m?rCdgsCZL>G!|KNimnu2QUR%qOH>+Tm z@1u?DX#S5=wclb9XclQ1%?mPZvv79~bOusL=<;%Pz z3%9HPl497AMB@3Aokn<>v01deUkP6P#aJU^$cBen!IZuWaA5o>=5X$ic3+Wc_ab9w zBu(o4umitwWp%~Jy7c>!zAx;d-!4wn1I{-%z47Q{i3&i#vDevh)X?O1c!f2tE919{ z(h|>5A;ZL@-B)fJu6}#`D-_`24qKa8vH4v8J5D)Ajj}9!WX(BpTehQJ7%^I#T?WvgICils zMJ|h#(&`2;J(9naey8L~U+PP1NI7@^+6{;id!$t1jKU#S3Oo zEy<1x6DKV7=<#zC5ZSfO^=%OJdWF@L3(5MVE~j=Npi7^^kOn?WNeU!w);Uk=KG?$o ziyp>7{~9Xl)hkoTDQsDEJNJ0qaQOcKpI&k2n`K8#-qUo{sAtl&-NS(Bqp)YioJ=!b z4QZP3Xqc^}DFKI%8wftzsq{kk0jj4V)%0(8D~}9Qjs`bwPTn(I-X<)mW01X;YV+2P zoT3d5JRf8>4G*VN%v@4QZ#*gx^CKHq1+d*wmg@`mU41Tn4x?OExWixOrf&}yVvxK& zbHO{=jekEDU;&BRS!9kAo)sJw2qo94U|kchdZh;LwUNNkc(**P?8s$b*bJ$UJ}s{e1CV%5lJo>lII&-`15MDRe^+wv z{Mq!FGf2#~53}%Wv40d}Oqg>Wtf0bc_(D_pL zk?5*TGLP9_GozM?DITF+AxfgFt{P4n#O{G5j`nvwA;wvu$) zwujpV+7#FH=yMvfi-2lw&_J9Y1{0K3%JFUIj>4*cX?O#);!=t!P&n_6~0y}meZwYfmO@hpw(Odl}wC%xx1@fV+PVnjOV0k%sxfI$}zHUf% z8GLkQsOntn+h88DCyD{vXJlz-i`}?^uyyN*tL@TcfVk_{-fkr#|F+jnv|G3NO7v3Y z{{R~8mB`Cnk7fVVriFQ=VDik zmrO!0l>*Mw=}a{USAs{FY+ObYz3Ks|U7w(1XuP8H)B1|aK{@5{=($f&h=T^Uh&w?q zVlzERv60MAx^O^v46donPj@}r@7kK7As-+2KLAP;P3`9PsOid#F2DPd;G6E4@a_D` zj~CThiG_f|$8FIQq5<5x=}4bzy2rzia5SBS}a6J>7_CyU5KcDnasbFm^AATCZ zGa6h>wW@P*xS|}I*^woF!`Rxy-Raq<4znu_=frNlm_@^>L=hW_=w&Ook2C-xFgs=( zIFENFUA3(g3qACk$Mr0?r=9x=4>0@v05~x}!wXaeQTZyyH?B#@s+j53X~ zaYXKkt>5a{L|&D~u7bQ=WCd>PZI`id1*qWrL&LDrDH*+W(wodi0NMqK9n=M7}sPQJ)CvWyz1fT9tqbs^?U2VyfW4in{L* zCW|L6Czk@g*UD2)^5dz|SL<+#?WgE{EK{{x|_)KRUh!0W$AEM^_hRB=mw(6XuiEUcHcG0Dc<@T``;V8JCR!8 zM>JlMef(&;Ezu#w+oRq?ZTT5jGLM4d$;-xthPNl_KPBR8MTImdjcB7w z#U9$(MdnF!>o^rG4_P)ZYKAWRAx`#-?2bzTGRe}IQdydA)kU#(5iAH^N0!NEW6Pn}(6b~}FwgQjnL8B=K| z09Kp58`jp(x!^{8vSDR+9ERXH`K!l?0{#F0TMM3ixHU{^e&rwX=V;7fB=N-~e4I|( zZpjTYIv27GyU<*2(Z024VOOSoML_IE_?Lm{wj`EdGMY*PHU-GC?%6SuyfG9s*&^j{ z7+vvK_IiP4fKSaaABySqT~klyRtE89t?h+)F+6%kb!XY$3FYV}>h|TNlm4iL`Z>EZ zqfk$oZcy~UO70W6$acq)AF;wpN^{6*+k9+g4 zef+Bj^%`pNk#{oKc#-+{*9$xzbk?2wa^#?(!|KHX$%MeO(PQMr(`6=XZr#tjcZu!Z zT#zI-Xw!e*a3i`@)k9PMelD=<%eH+8Pr~*~vTVD1-U1s;SoW%kH<-9Rd;x3 z106`R_QJQN%a)d2t>JjW^(*@_=`5ndj+<~Mi@b!k(p!tQXZa}SJz^Z=Y3A7$P7ZI8 z4uZ$VGyTQ72e$tMn2_`YQA4>_CqLTANpz#L(Kzx`72S15FUQjWWq(nDd;WIb4yX(9 zGH;VQTC0>EE>T6(y%2+I%lHB&+>D~F-ITH;1Q_8|bot5ef%to|#7s9byG|OfliCUl z<}nEaz*GMdQI!Zj_QR{r@lhO3DcE|M&uTr}w)VI`1O+4KVh**2oed*=-P1}IA{+IJEt^V6V+#fo-S=`d? z64#n&7yPdwH@@vDK>jXgYtmJ)!canfpvYq*b_~Khg6X0Jg*1t_ZsJBlKs1j#fb*XH zZG%c2CFYWv=L~jkG*Uy0HPB{}GBY}J8<&JFaZhsJc12iiB-wy9CGh+>0CSEoHF8Pr za=xC&H&BCh0%w6D_5zJryzUW_NScq6Wi6S?+_oTXWMz061k>zW>y{4m*BV z-h38uz_Lq=17m7JejC7_XhB(YO4BEo51D-nHdH2FXu9Um!{D047PdGNr^WHhBY1XM z$0nJ8BCB}CbGkL>4GCeO@SxLXlV@9xKi(z+hf3AciCigNU08F+C->W^j%-5y4>N1G z!FM&yqtSn2{g_Y<)Tb117_@a{&wC5}I3B9G6v z|8&eBA|awWu17E3S-X>rc=UB#_15!)i9#HknJHy&9DZWP+A$%tXNglS#+QGs7ap40 zPX=rJ*{)4i6N-N!OB}E|=`3elk6H4NF&#CQQp1Zb59C5Vl?s5}WWHCXX)#E$n(vC+ zqxhcst0|VpSAru*r`AU+Unb}i&hLVz{&iHsM*D(Xl-UrIiNF|a3|8t}HX-%k&-Su0 zbw0i=9|Ef}0RLelzJpfpyMbhh!T3pK@<=3>sT6tC=7g#k2O&;8Zri{$DwvrmfZq(cX~GzUSA4_*12^K$qz?_02d zAO$_OuWK=X*Ay9p7X%81tIuaP2b3+=-9EueDu5auSfd#nCv97~DPIm}Geqvd4dG&p z9Qjk8L3Pnrdy`SA!W+1ht=SA=Y&O5RaHy&OAAhY2aMov=M(z}CncGLB(gd{Z3*R4R zapJqt7cOTkoQ}hfU+z8|8$!MC9rRxdCgg1BG>vfI&sWySpI-}g)R+u2rVfElt=H{d z(LjnLy00S@dY)UWtGWGiKUY&Rd*eZ(t|G)oxaj@iT)GJe6|SV0xX3w>R8_9YnWyTb zcYJeutS#aSpL<+~m2%;#uatYTtV01N-Z>DQgfD#10HEtry$+&xg}^VDAcX65pg(Wm zMC62A!^t-TulU_HWgR7U=;HciK4iH0;#A<>foAw(KZ-e`{AxM6YqL6s*PrqU_kf4y zb(d}z{QL%w8M;aL;5IeL=Zcl0jc5ip??V+vx5hqArJeyndpmW6Y_dUiDuBD@jMN*Z z9aeMcHu;vKiSZ1JejC5>+4}4s>K7wA&PM&Q$Bv+yoDOq=YtawGJ$Dj={&S1k)`I5V zRpMym7>f#-H}l3mdBU>@Imu_}TbY*hAde&H;>JDwn!KCEBR79pq|mTkYSmDWpx>?K zzh`%7`@Q>dP_MX{^4(^4<{u~EhuEyn3abJAG9`Bn82h#7QrZkv0xbdE%`*wQ{S}kvg|t_#|CLkf?;x5+>`9DYl>cGc%R?iWz9-4PPXB$Z0D zrc~qphO>M(;^|J@7%C)RxFllpd19G&z@%`~_JhGnW_3R=@0@3|FtvO<6Y{p z>z`@;M<)6Aeo%!?_O~Z)=#QN?cHqD{$m7?BmE^g+<6c{5WZ3OB@cf47UfQtj{^>vT{SCiu^)GQ64)AM73+V_6dU z0sRz=B7fIx-NhR7UP_#O$JwjD|9aF+!Siry z*+>cCO@2by;N{!-5!lIz&$3&BpO|{o?|JYduUBd@P7M)5{OA~$EURaYL-=vlK7XL0 z!CR*Jf=ILa87Uu$-SZC=Yl4>zVYsgKI>US zS0TAR>D9J1G9PgDg-gKct>d1vU&i~h0PRch)*#1pL((x%B2vKyfHH{H`RA*c@St-{ zh=5M6ml7NdxBL;`Pmnk3x__cMY@-nmA~8+MT-JNXUcl*i2SAE&{Z7jSoDIMbKk+5> z;`SAociXRvhn(@8rJK)mZ9{2;J#v9!>jP%n)fygX7V!|++goJ~vnoFhgr7iS^BLR< ziaIiET{!!y7*>!li?!OkQ`(F_ZJ(8+p0SyOuV;OCW7iyoOBTjwpQ`s{pP$C?agAOq zadcICERK$s-H_1Qttp5{1LeP=)C{(#<3s`f1H6oTf$_UHg-!gS>+y*@&}@o{r2>qx zqG1{$t$FFtK0PmCr<3M0_r!LEjBGJExfY*|z}l^*Wp#g(8gu*sT8krpUceZ|YS3@V zE|k z-S})J1vT8QjR`c=U0JubE?>d|^kdY|XD&0#?!QCDvBP8CbePW2T^vwNJcZ0 zSZMMP5{Jo&=BHsj%yg6sM5WHh;ZFS7Rs|CK9+4s+lwTH>Uvht6a(ymwT(laN7c&Uj zTgIyn=RWNovm2Z`m~9kNgrKNGcmE4yS`e$pnE%Jnx&Jf$J#c(u80LPzHq8AJ<~E7V zb+nlKH8Hkw%Pl2^u`t)%FGjVJxVmCmrp%DFdGTHTkXo19-fA`OxK^K%0k9 z8*)834-)BG{Q@pz8pDp)Bm<4Ffm@mVVY&@pwG7 z)}_6l86bZtV#!A4(*9B|JqF6jhGu1CY8yFt?@_AN!MIOEOy8qn)9b`g3Y!`L(72M$!N2Jy7a%BoZth|{RY|^x&0Wr^k2>kF z>6KDy{y_ULih)^rd)rBCl2RwAtilAj+&{nPkxIx94C**wyUBo3Z+>7Lc12aeMWFv_ z3arR}+Is?%PX}pcA4*-WkWfSa4NZm#G%)z!`qs$NluTezmUPuokV(p!(>ACaV9Oh; z93-oJ^th%(!RTt3I5P$DHX%m-vI2TUkDqfx6RS614L{Hr|8?GWJuV#}1mh&y%C80% z^hQH97x-%gewY~kb9dJeAHn*K=tcuOc}x$i2i0tj);n()_EMWLRW7;=Qi*DrjywMb zxZm?1ApKv6hc-XX4-n1Tk^xy$hvQfmVWdcb6Gxnjy;>N;k6+{ZtNHxGQCgac!j@?B z>6S*>jSjiI8}bY1zX}k}prsas06W2;K7^|$aTEu7y?Kd`t3K6EPusg<<4VOJtI)C2 zAwW`X_4jMpsG65fePn~qeb34Z&4S@2FS@7c7q6)Be-+qQDgJV0Wrw-z3nO1V3AFKLpY1@g)v2Sa47 zlnY3Kb77r}MEFflAWY@G$NJ%HvBD~(`bF=^5Bh6deLCa<>p_Un&|a%3Y8OF zyByfVljyZ=vB6Kb$BiqfkacPg^jfpZ98`I(%Ea7$KoQuNs3ZVao-F?g21P7fa^+TG zHCn4|OjAr}K^uH>cu8TxjT5}tBP36e*VS4cz{$5ie>e(X+5SyQi6A9Qs|yu#&i-_y zCvoT&L>7Pf6E_p;nSxhCH|Lo$b0~%Led+LcG*g3<7G{x1^+dS+>^`0yP;_-sk3^pG|04aZ-s35Ws>JAwg3bl2xAuD zvA=e*Uz@goYY4-Mx7k0OqYNoWh9t`arT=Yli|6rBl{7fF|4@A`RfUTEF?_r|nx0@T zs&&)=5a1CPK~pui6r>L532~&IuVZs_pdq`}ujUOUC(>EiIaH?wZpShQo{(i0cv4vS zfP?QezjB<>Ibhm>H4iEdJ!{gI{cU{^j84DA$7gh^>4TC3LeFVtI%K~* zT*Df^JaY#n$kTJ!V6O)0PEu^(x$6=3=df`fs_kqDW9?qw@uWPyHENCrBu(m^V0~OY z)$kc~LXTy_Yh;2ygoZX|0K+;qXUX#yM2)}VjE+v#;T#f0Rl5TL(Kr=Ess&z=caUs& zGKI$~rb9`~H<^ncx{KCwg38(z%s_Q#jw_=`O<1Gr1tv^rf=e<)`+*6JqsipBE30E?cP0p@O1`s3aU355Mx*|sI)q7aZN|7)ld z3>M;24Ew6ADmZuUt$5899YvmrdZrQj@H&K^Qr@g>aryh>c9#6t50LE3k)W8#>b!{K zRb56-WTN+(A7na@TJJ}}rh)f$a|6^qVD1ZXc}MHt9}e^u|D$06LtmPqfA}1{u!dxA zF=wT@V=nR9(lj}zS$M*g(W|;`f*)I3Le>rcdD|`NyCyj`14fkt&QKc!#X*dK=bky$ z)UR#?5ZTi|M1nmwVT;R0v;-@vH+Nax!T9_%ge#>y+mEk{O8a=5o^18z)9u|kY7MIz zWaux$*09s}mzV~;UdNxG<#o@*A(fZVjT63!6zV14Q+v&9EsER3S$;SDeY%BfrfZn` zba-l0%C>*HC_$SUXtlup?2c2!wBl!vHZmKfRDPjbs8P{=S%WsDByV*4n~k=QC1Y6k zKafz{5mqFhW>*mK_`PHl4IqA(4ax!&(xE=`@*@zEQAf7y?>A2t$%rZt4-iC>l1xrz zo2Uwl{C0RqB}yY40c}W6=WWj+1ti-Q3kYzs^_ zWF`NuCNHyxj);SMY|l;o50IV(1?iBkCJA%vu`u4<@`XhlP<4P@KSY<`1mMh`Z)UJZ zCHN;D;L{I2rMZ9oPw}|sSrRnp_a@TA_NqB_p~Co;qpRy9VN_OC-@Tg9J2z?lB8s!l z`h8~_!@XEpC|b@<0XIs`UfFT7_RxMVPJ(;LVp|8#65m8Zkh|^sxfUBZ1-aocCtr10Y05z8j}8 zvlNqOp@MZu);E?K22*td)#PxzdFS4co_Ni;mOQ6oZ?^n=v{lSRPbt}lAC&b*jdEEM zKnnso5gcuk*Lgc6%nNwfsw*3#>2y_c|I5-Nzi<;18quf7ue(15-s6THUsT?Lsp=x7 zKEEYCehm-&5<^L+|`qeOI7E?mVMlZ|_RB{m8@*6}$}Pr70vlxqH{u8VcD zfmjq?Y*BXPAT&(gJC&pkcAFs)C}ZnmEMt^-q6SHRmymdSZ;|vENu!Dapo3C;y_Tv) z8O?xvKh#5c6LsT%14u@n*9J@~Vj~1dX2;e=DXSe45`BfmiM1DKO++8=Xo|fAY{EJW z-L)2}&vLJr1+SQ88}{m^{Vyz;8f#3wz6%_A9<1=(B}h#O)dgQ{<`p^-_P>d6u}AuNi3-r18Z9B;XEggiK;M?yV3xikVyEsNcmuItGvw>L%2S0}e^TLm*VLKt zfFjP&>v$DcU6$_yh@$?;1(83^eRtPU5rd!u4us-ke#*Y{*oqY8N_{XZurobptAHT( zU-sXeTP3azNiy|ta9$Y4rzw)c!=H~D1Svk^<#AI4B^?+UMzjSDRS&e@6ukh2t*<{# zBU80CNu@%twnYck?E|k?ylRQ=y73v=>|k!AV5Dn+AlK{hAGhvj>}^4~eJ#tx9-W(I zvxWl4SOU4DJAG%;v5mQq#?{)idz}?*Z;dQe^1;5}7|5?K7G%h(1keKV_~!eREu3i7 zWAs%Bd)i>-1p%qv5}uO(0j`##C;522u;%tSSY40x;9!tQ1;)cpNPB)`WoLF-)Jj>! zr_blA<)gK1)0M7)TbAM2f3N+#CyjsBx6;my`MZ^k#7HJN-~fgTG|fK0kg20k6beq`{zryD46h0_R7 z(d27Z_vatJ5>770E%`8zE!u2r10CVTowjFeUAs(}f2Mrh#Du#x5!p5Mew`Vx*$hSS z+z;GH&&du*BY#2XNlm2^x$VS}TKE0r+Kg1Tpz@-*zS&8piU$ zKie=tCKq*uALzk9^V=&R?O(t)dEEKzr{TRyns)|Oy_2sgAJ&>o2&*qfBQu-NyymCF zwIs{QNtABNs4n#^>;rusx!%}E81;O)qkkx6{@9~8Y| zlu<1#k@Dn)E>btJqI#;FrTg{}?DNy*xJ|1y2wF@RHg9rcX|WZyik!7Aw{LyI%B1)b zzv?!yjlVJ$&!AOFVJK4bChc=eDL&R7uFVErI`?P)-JXfYS>w5*ETqam6&JB9LsADJ zAN`8kY*bcuocz8-*$3zVlJESZWpxssy)g#AOg{gOdIL{Tbb_^rx4L>WV!DfQ% zg%|!0thxFeZld6le_d1tqF#sw?N|!1>u(=$Z9wsfkAdZHP2;eNp`X`BU*`V zZXoVsXh-H(rI^kXYh8)VTm_X_U4@*JAa{*aDCD)jMcFJ#oF2W$NV?&DxyW)9DY4HA zSNG%CV2V@|nE{IiDVHVbH$4`ZIGyu945S$c`s`y13k?sKJ6_5v*H5cGM&VrnBd@Mc zEZk_v4{#0XZW4+>-@bc{rXs7M)7&BL>;#b55hdIYaum^+XLoo3s^QVXIvZTip6t@( z5Ai#pDhMMmLZX0MjL1_JV~`ah)8Bi)E@c4rT?z6(^IS{e^8 zMQI1N_XWW?SJvhLnMIxyUDD}0>GqS^WT$O^2)N_jAhD5Lg}pe3mDNC3)#mRCHy_zf z@+9i<;3q5)t%8=H9{F4y`5(X<>vQ5vKlnb-B%xs~px#8ZqRa@omJP_fG4?>|{KFzG zbYSA1z>fP3A};x1l~T++`h8fjo1(jsq385)Z^x6|O*i&2Mc-(lb(f$l?S2Rm%Fn@P z=af+VrYUtV?w*&#Gcpz?W1E?I`43fNvLC}u5M%leu1p0R4$I^u{igD-imK4HVMI&c z7MKB!+v~4o(#YH5cJpMh?xnxcoUDbn61FlJe}c*ydswb44Yf#&aj^I@d3E8`1}P!a z2p8hBTa2CclXs2~7iPDr(P-*&{69=HFAkjmJ8J#QaH@#WuF>%~Lqkkw1vH2ZpopMFykn&%|`fKiQ|S zpJj4Ok+24<9)xe58595L*aW?0vq*7Fjn= zgX(9GE&Gz<6~^pd=_IRPnqK&H@TacGJYQPK0QBu>dxY0r>%z@8V(6W-tBDy`EdcD! zH5;PWl#aeT8%O{MTtKmL1^Wc0M|W(dJ*&Jg986C}WBml@(|fF$pn%tSMb5EU=5ryt zQ+NQ*!adi|fO;8s!kPm52jtA;j46qm@o@$mV3 z{-~_cXu&{6%-YJDi<8Ckl?oSIwg%hd9mjUJ1=9I%4}E7!>omBM+4pY082|p%(J@zS zqVe-Z6bzZ8Ckb36z{-|xe@_g)pqS%a0qB~`IsWG4e<^eUAUUu9kXd=d11eDz?)YD8 ziLa3}{{yTWAv2LvDg>Zimp14t9?kOa&i2h_dMmd$`~J#=`W0;ovUiofq3C;3_Cz-a!ie^FDaUgIzHxNKh%P z;Z)5(uMCsyGz9Uu7F^+vRy)^6Fce*xp>2|VlHGWp*eAHK@)HLvA;la4jJPv$F5Q5l zf$_yrpe$iQAvpLwWC?3LJpXgkb6#3yP-$RbHZ%Qjo=R`BMUTFZQR0v>?hRHiZ9%+z ze2x^vZn^h6V_E`3#EP^SDC9hu&%^47dMTqN$uCbXMxUP*&$z!0;I?A=e%R z&=|ef_sW{2lk-!F)wbw;{Xv7oGjZ!K)-5r!7c+lDxrhy%Er4C=`15K{8Jq<=fRA=o zRTTaPpFk)EBR*w%;EA&iZLJH-X$>C_e_)$6>NZz!ygmA?PKzeZ#_BUC5YE8*F%=~K zDytv7B)aQFARg4pIXn01!!$k1%BT#bwA^4nTk$Wr#0NYm`RzeD^BOk&1+0y55rq0$ z2z-~hHRk~+!8tSU)yar`k_XlLLGr9m=Xu-8ii99#wcO9&IZqG1&Ilps#X^c#RHi>j zZ11C68=48kyF_HqwOb1=yj*lRn;{qO)2%&PAMX~alwb3FIP#L1DE}eO>mOmYAZ1V; z`njpKA!4tg&loWn`o1Cj&!d^^YJI>P2LA(unLHt{W21rj&ZYs{m^bBdi7dI=_R2SY zO4u$r4<6N(7y&bu%CwRvw>9TbbO6@;{%VSePO3oRYBr9uUbg$0^dnvZkc{G{^rSW}|Q z5E+~K=pOd>VX?QJ5x_D(xKB%Z+4~glECeCnAKg~E8h=$wK9l8=oBR;_Co4bUdPMS^ z%%{Kh2dO^#e$DlwqxzdWR+7?#_Kw&8p83`)`ZGW^RqBdFitV-S)q;@vW70@Y;J}9p4t65AIuQA ziyyp4(;eLOWMX`I+J90umRlA2RtC=ZzWix>x0H)66e|?a^gPHlbLF$RUIP)c(-sr_ z+Vh<~ZnjJyV0#5C{hvjulUC@p>-+25E+Sxw+g*Wg+HB59<`4O1Mhn3;Zh8X)76CsTolsYFvCB$!j_2nA3%r6J!tZ&Ov1-5gW&kVqcT z7g|B1VQS}WIeIYMKdBm72EZ=u!N{tk)8?BLuPl|7+HQNtnlK~N*jCG1_ zebz2Ze)WuM!V6;ZOq~D%&t?sY>JH2=6XTk@f#j? zzQ_sT#KH)oh9_L2H(P~+wAp^B=y}Msa7UlcA6$z`RSl4btF)BIg7<#ccG z%TE0{VX3ONZtv{BkK&T~U9AH>gml>&Wu*<90*RAN12MUlsImga6sUWYxZ%N5zV)(m zv5J%dCpZggf^KnD6)W0hVP1V-)n9T@z&^d>bA?5$?96b{H^%CQ@p@8;x&B_|eMVi{ z5{uYn@$Dj1txGQOZpW0LeXkYF@2Q+_ouVDl?;tLNV^l-Y#pF%<(1uNs&(`HrYh7Ca zsd#~w1begN0r+VBvnD3)YfaLkA6rt=ll0xC3K5S0cDvkYiR15mf0;>)u_Y3qNR%Vo zv^(V%Mpb?@THA29bE~RLL0v%US_5b|`-vTqm3%?Eax=d3F&r^^?j0gYK3pG!C>PG} zE)*}#GxZJFvAUG1P#0<-ZO9xj=vQQ6Q_#)}iQJ#1M1b*k=-D}QCSfj4biuJyxF9g( z+vFY%V1>)(ib>L0^EUPK@?@3$Dc0Mz9o*omYcDrirV)70DhpI@OI%Jb}v*f&Fc#cKAjT( zI4E*$>t20and{F$#k=_|C)TD1mR8(l7$EFox{1lJMy%@5R8$2<@M196Z*22(43*{Q z+n+A!pyrmYWzMzj6F2%9?KjBbtHz87W0wb(tUQGqI{Xg2`s{;Desfi^WBY$MR^Bx< z(V9Jy!`aZEQp=~X?gAd4OHYh#gd8ucj(i6I4OU*wQ-@!ul?EnK6+ZZqBh~CSicMl> zZF;YuAr0Oy5Vk^37bydyTjNX9fYw_p&5KFRhKp?0cb{8kSlCO&hUp@<6TYOvms+kLKWkyLu*Nhd|cw zyLbNkA=MeqaV3!FcD_k3jr@dv_2E`C6AP#_w^+@V_JjCb1_Oxu>crLe;RKY6OYDuO z(pQF}qOWo?h0|)R55|zmxdlqyj-tx#ma@PF>MrEXwfod&LMZ&q1NWZ5T%$QBn`u$5 zy&v>)q5~J0v1A~6?y+8iY8Ze=dex{cbKo5-E@OQALCP zxuf(xo=%IwY%2^&Io4_!MJAuA2ugPy2mat;_%6K$(6E63ZJ26+&dO7+N_8>N7d86s zqXdJd&{0T!H(8euHa7Ot0of^+C7@Y3YdlM&gV@}0xV=femDl;cOTV?a1?{G%>CLtqQRyAbIkMeLQjUz=~(c7T;5!tyOw-)~k#gT1QT4#m9G0 z;eCt=;dsmP8Cc2=%JYSQP+iNm*ZqEA(Z#Isw?^AjBpm?2u~6__tB~=+Nj>4Oe_xmL zf&RanYcsSf<1s)YA{xa6Nk5HyWORp7n}ZD`Z$7#FL1_$H04U?r5i)ygU7xC~>R*-w z0k*7wqp%S5=$o9vz&RDJ}Gx#^wQnfkH_sbC-*=xNciU45|-p8xs3*>P=f`omXM zKJ}t3eT;j*l>?*>dKFz@ctxblw)m$o8c+VE*~=OLv50{8c9bkDK&~We?EY!_uMjkV z%Jnn~D9SPXG*|^k^&n73s^R)kmA9CXiiQhGNpJr*wT?xa$ddP2TYqUfZiZVe z3(ZPKNa`NHL)fz5kx7L_-KC0u-y1a)w9rAKNkgacGLLBmp$(9*x}^j&TCz|s`@6gM zcy_jDXoJtb+J4Bsu^kK(%;<=EqE(!yb4c63u#ZQZod0?@wi#Dz@6T*@{$F*&eD%d!Q?>pXIeM+;n=ZcJf%#Dsc=_n1GmdvYvUzT?Bp=>^!`KI@CFNWoe`AGyx9Lu^8>b$F6)%GY?)=?({UM{y4`ILpMSv$!XAuXoQHm2 z38wa6ql5UZokPI)-qy@81*2;H20fj>zcoCQ;ao(e;5=wCYl&i|UqIyZcWY)PNKM?4cj8WN&plWymU0n5gZ51JtuN5U$t&6!INgRS3xU45P}e#ZswJ5@wf*=C4%C7OwGfQnQ5X=?N zqXq!L{?RqFcLT6yGOotDL(nyDYsg%Rz>p znyv#z-f@*6$Smkjm-Oy`o!qLdL@wMzoW|2uQn_d_06JANM>`mN#V!8@sl5r@P385Z zH(%4x-#pwC0gk1f>j+^}INO=D<}M_ryD`Y|!Vg^0aC2{;rphcLi$!TxF&D7hdoF(1 zERE<8SiNHvOoTi!@b*H(7H&n!c;x|7wK%S4RrUk2<8~Y9?4W|evhn7wrJ8>w0Uv=0Lthr91OxAhIY|KLg|5li)?H=P=B9zv6gTdO{;+Curzh{1yu} zJC*iyiF{PW$J@PI!yBW(L%?~o_n75ed5g~@gOzL-5dzx6RV|?fzMvIeIG872 zL@$XCmZ>j$>P3L~4@|VYbNJr9eSkHzx&zi~K>&6SZ_VU_H(&B%^ zTMdKf%G5Ogc&UnmIlKNL$;}XnNpJnvN9$Pa*DZ?6{I>3yQam*Nh6I1Mei%tIOoZ~H z&LL2*gO-?e_Y&5-NgvIk>jguLHLdHK2Ya}DZ*%W8D6AVwBAfprr{MP~? zU@X!ZF;>D8NK)fl8r(sZo%&&cK|+cs)}h*c!MSAC%ap|D)Q?`w5XWu#g>ROsL9ndK z8p64tS1FEVpP&ejhYI!v6<3;sixdZ%jq@+=oJ<-Oq{AgWgOjj! zPRknEU-?%&WWAW=8ep+_F`{3PjriWeZb=v0%r$`dz(|yxMvjx+pDSS5(s-E)c@y*D z9`vJlAyH=s)1OSh0rJf&!e4Q1)TX*CZP{NHj5`fBh%hJI`A>;$c`=y1t9CNK0sTSG zyD+5FjFHMU2-l$7cPx25&5KO%BSA5II=`#Fwm53Y&z9Nqeo9o5S^fXgS+T;(2v>JU}^Gj~L)9x=Yi6R{jqV6}S*yyH@05^P!ILaw?`W$2Rz!K)S2leb&tm*_?!}-d)kV^T2Y4D zi8vyNnS|bU1_-}Q=yH2g0w*>Dpl?JMcm{H&!phicme;K4>^}V`_YqWwzx3EY~!Ca z9k)R?)Jxy>?@#&8^oH(NB#qj{+8n#$bw}+oiU*NBtjkaLtr%$1f%TITIRPY!0n!Fb ziuW6?%bL{T75)d9XaBu2xhLYn?xqE@%H;Jv3im|e6`m)f<-ATG-J3zd5eUy{f-!67 zYP~?iv+UYi2~>7wRIT*SK(YhiR_uEfDG@i6Bw6P-4G5|?xS<3^>7u>_sY`byIa>1m z2!LkGS2-}0=&Ze8cEV^sZw5kQ7}s~Vvq8AakUEJZ1Ms(BHr*TSz^2&m25ng zmw+|%zj8eOHk!}7S6~uDbVy_REoF+4z^qX{XozeN!fBLYp{k7%(go(#1|mKuF|>H* z7s#^uly%SuzB$>FEL#L}gNTphq6;Jn6G9Axbo&aO5y?kac`ldiD_s*O2_5eVUyvVD zxvH+sei<&XJwfd*#s3g0$7wk%&r{sf&R+N4RX^x zYbRWd^l02e(2FltM_ain3_}JKPAI$S@^uuF)zI9FILPacrKfQc>28EvF*hZJJYn$D zNK?Q3qh!6Q&sJ`1^a}h829WZe33V6_ElFddFLYCJ6#4WrxLrGs$3OW-A9a(xOpgTiOgie0=GWW!^I1 z(Oz|mW|%EB-*D~s@hsx<`o9h?!mOCk$uU!1uZ);!`a}dnFSc(5DMcw}iZ}*v=>9TZ z!$LZMgBX^WS7|v5D#<*}v$nc{yX^CST%}a;3ZfqKB8k#r7a;3Vp3?@)WjfoV8EmfF zNYLvB8(!zy>yT0Y6tqFXD{dP#V!VQOSb$u%!NVIOo}Qod%KLNg#2cOdYIvQlju;UG zp-5P&%l`nmc;&mv;hpDs*g^cJL57{N+rvTG>IAk6B67t@fX7w#`(e{gDLdr^#|RL! zTx0hkYOc5?XFu5Zes!_j2#Mk!1`$U%7xwhYUI=wm`X|&o<)BH;wM0GJ zGF3Z1o~j{`!7BT=8Ln(E6Z>wE8!zF~mnXS6G(RJ=?gtc43T$cNcssb*$sjnFo1^kO z;B%76FVt_^6%?j|>P#2Z`EBJMoOm@+-kLUgfXzH7td>vGvTg753Ej8$G>P9zb{DUC z2JmAAG0pUuiR`pe6$F43{EhsjO$ADx{$>(iUkXblq~wRuZAy$uYzpe0sNOb~{{e2T z*XjaG9p(HOL)E{|t4UaE*b?MDNG$UQqv?@lE|w-kVZ6_eGOE;dSF@}}D;rP-o4@yK z(;p~bKkVkY_&s;k*prh^H@FC&);DdL+-hH zWuO3W2`#$>&XhF^YisaJt_O(kSUT(+Q)rYGH2*txkc5stO%4R*2S~J{JI`#=XQ}X2 zsN9>Eo-Ci=NyeViK8OO563s^jxL&2oGt}boE zvAN7~Ae;T+I5Gq1ts{nq$@-ksQ=pehlwM(z6FHi$b7d{r(Kd)z-Vaf(Mm1})1uif< zDe-5Kb;|4i-r$o21YWIXKyhaboGuOpz{eU78oKEs0CbXM^X%d$tZqXo?c;(kSl7Bb zjy9`ijjQ|Bw5rBFdhrzZH1>^hKq8-4zqMe$s|Mx+LEVHI@;TR)l_vOKSUkcZ1;$nk ztT+?7zT+ z7KAak=nMH@JR?b@mruNlqxrx2n>r^yuqYd?&(0VP5GaH+TgU_%AzE40Fq;3_w{8b( zTpI1;a6Yr;a3;>cnXA@;yxG00Cvsm{UQqvqOt);dD}5}rrkPz+!BO^TRwvKq*2X82 z$;p;_>R^6g3rwZs(_bvomQ>)V3yEdXpM9=FzZMV`2dshv2S z{O$x(XUEa;ZQR*PxVSZ|nc_XJ^_3|7{dPYWG)gNTZaW{xLWvsfGYB|8Nw=T(`WLST zK$GOGxBRS!??!(OH4OdI2MGtEX3Y|xXZRG|Ot#7@W530$dS!r}YVl+z=NE}y&!nXD zv4YL)lya}cGtb8}Sc?ExN)eqLC0xl`seRjiwkF@_ihzU9sDSOaYFL)XK5Kn=Xg`J>NKqI9ERFo9({{qmm?yf=%e zhTaDznM7KY4xn;Af77$QtnU8?ku~AO!c(Pp&Q%OE8i_9qZ!vYB>WqDCK3;Aw-8MN3 z_F~k-a_#e#E!Ld1q8M-40ZGgm!h7+r%99T0t?>|sRQY=bR_3eFvAva@wQ z#Q4lZir(-P+mq~n*^chu6hg&+G`*j%9GwDqR>gF(n!y5ZFPhFw>XiUkTL6)#A!Tk> z6A^vm2VlcfHSpl3MasB(a7QveAgGJoc#~+t=CO`AEuk$l?!}-DLm+a)@21K$mJvzdM&?Qqc%mW(EN;? z5hWK-zRF4pqx@{2_mkrLa$-salpuzpLbAVWGW=FHbaZ|tmBemMTT9}ha;Qp%{;Bag zDk;W)uTP@AjdgRj{iRRc8J+8S%8s}@Rg12vQtUcpyS(%7qvGT8tjK{!7M#sObTB1M z5n3l+Ab;(q!uNG&<#B$^kYt78xznvmqkKwU4Wz?2@wGW~g-3Vtiox+i=^k1Z!%_IA zg-{`+!*F|%!f=LfI5k3b%J;UzCEtE_0pf1ct<%N^6ZA%K;`zLN>LLFe7Aa8e*H@AK zFB`MYyzKSL!*{#0fHpaN6+V3`Li>GQ<_ZRAhtU%{8&i4l5w?b7Ap+l4T$BbDx^-K= zhrg8x$)y8r`Q+X}vxSHL1wAhvb^FiHwt0Ox=ofYQ+!e&_j#2OU*T1*vD%jrTBMF?> zzFEIWX^SQM1tEXvLhStgO59Oo24aFRsgqwr3nP^%d57crX+bpK}<38{~ zM@WGrx-G&`athJnd+s9-v!Nr8*`qM`Zt@U*xkk}BJycmaHn3u6_tl5zB{xQQqmlre zJZ6pe+#YXrLg+FdBuZaCxZaCx;HN;Kf3c_-;ul0fVJ^sL?_}FuAaA$Q_kxd2N8vLn zooPKQd81c$c6_ueJwy#y#Q7B(V|qD|ecIy)5Az2@_9wBk<~8QYT5#JuY2}G$9depi zlWp`_?@2<>=@Oi5STqcOwWDm^opDumeILUAe!ZyiJ`Q)w|XW+ zP^nr_rqyULlXYx(lxm~npZCRn7rFVnE*!gSg`p;jZp;6 zg$?1f%)DG=B(9-D|9c_cStcx|%J!yE9%ub9#(cDtzEZA1+8*l8GSAAW2bCEZ4|99} zrAgMd8Yo9;U0~hzjFvA>zG5ZRv>UUxx#me4R2RIM(Qgv=&C4&v2d)+>axnK)Em<2X z=4VkL=e8QQ^Ry8Tx0Dq-nOGT!dY;)DgOhU58L3U_#Rnu zCykzGFXDteEfoO?37OHqT`-FjVODHpeV??tnY(%%$AFGG3Y~P%%A$yNG__Mc!82l&o>tzgnGqg*pI=&iXF=oBjSn> z=rAMwSIcq;-1Y~J2uU^mcKbHgrzSNeK<4znGdq7NVONqrVgN%xNSN|y@W1v!#b*Q| zs-x1;yHOXBqe6|t_N0(oj)K64+W=&$faF{1mKqz5!9X|nETYMW4PmK)(vNw*O9q8Z zxv{N#ac18o;x>oKbObuQrVRzyplC3s#Iu@FuoGqb>LNqWQ$3N>qsmeTAWX^TdOSkTl%yih1kD=)~`pHVN($W+lsBG!j)X^0)2-Os2do^$S zFQZSy?Qa%byVNi{e1?`?E{8y2U)iP0T&|yWy@Ko;^2UeEpWSqAfub&0=USFdaw#4s zBe~DmRops?pj4s}mZSq;o^6;-WK>7hey6G9Hac~zL;#2dvO2H7;@+pCG&nUAzOsc& zPPB=SA;xr?mTs*bRztpt8I|I`aJy>I;M~Nye3&ofq1bO>P=~n2046o>npt=^1p|4Z z&^_+Y8sCF>?Mf`tr0(hG8CX$PHF4<)w1Hur0XQ|w8 z&_P+x=>4+?RJrj?NX_G*+?cte1B&A4gMQTPszchDA9<{tcLPV!PRfzJhcv&JK4hP4 z>*b?^Z&)mxLN`&?TCjO#yiu8%lBHV!3Gj_isHX^VF_!GB6QVuE&WR2h$OnYoTWVC1 zXKB=u8{N2~`ATj@KT_6XB;OF=o#r*osODC2>etsiciBOW(S^)qDHY9&kJtY?!@mi3 z5n2+|UHE=$wn2|yyd{gy=P7kP7!Huq5dTo2LAaCRK1%IR*R~_Y!dre(wH=GUx}myt zdj3XEwXm;5ZTMF%(RmwP*@N7Qg!p;)+fRCe1M%iEmJcmY(&SJrBDRFyl+DO#-?kO} zEk>A57xPp1QLv}@Mjq_-(`%Bk2hGusgjK**%R-`}vOOj$@=tD>9KI|r?^}6tHqKwm zuZ8V;+3C&W8Kc0rjDlycDdE9jhghImSm{-x>k7fVdCb)XRl})MrPDjqXRVN$G}!Ls zP)$sGJ%Lf#3Q~TK?&5Ivya^HPYYlrMd(Kr77~!J!l6kd|MBvQ`yW|^;=R(7?CR^N| z(flBB_V?#vdZy?AtviD%z$;gG4-Tkc-Mpft9!k&2w~sHYOfEJMmR^fQ(FtXMa&p1I z4KdjnmLi7N1u2x+`AC{9tP+6`3hQY6h1+CL^Gi##JG?QbWup3r3{xmgyws%*^YKI1BqujqTl|dHE@+(+vgd1boTZ%9%k2l z1r`!1Hr2wZbm37+Y&M^-tCiaj_SMgcXM+!7;_eDsz}3D+V;DC7%_6XeL^+3(PO{kU zv8&5yU*(T<2_k$2=>e#8*+ASQW>=?ZOpOEXO6I}Z*JfuX{$JL)$1@%Ne}9`f4>PCD zA;X*xZF7i1n^RV3jv;A=Ig?XFG$uyQIZR3;#W#4%cU&>$82{*X#9sL18cN5PnmotBQq3JVloPkyi83-zr4qG_I6|yD$U0 zS($+GgB=h)?QHm;@Zb=vX_W9!jK80V$XD#ZwhuBZ$RGTE297d5=D zlB;Ll+&K|;__fCBDuVwCGI7CWp#5uALS}coIKd4hz&%@xZ_FcUdfh(JyckRrBVz=g zmOLk9Z9SVVu<`_-y|vi?b+Y&z1_lJb?Edz?fSHiVVZ${2==1O<2z1!+8IldzV7q+s z0k49%UVQ%=ef6Z^SR_0p5K%>mdo5{4Y zwRp(*SdWFvW%tJ2nL3*aO(5A=+ERazO0$0R!ixhrTsbxBvp%@zG*a;*;loWEZuQ_- z2Y-n2wgo>lMX|c3%@gTJX$%>7ky_$j5>x4=+dRr-S%zwy-Th!!qI4(nQy zxmR9ILcMN&44$%4`O5t?WIDspXs>PzX{Tn63*>G|-Sn+95+1y&2A~oeH;ATs)S-qj zO6S<^ofVVR#tktXC!o%+BR&~H$nUSz#zHYqwiN@#b!%k=Qyc#K&NHJBS z{cZ9e%&d_@k2RbfF5arB(`i&LIu<>3oSoiY2VQjF?WKvD0G2W}3H7HU18TkQcDH6> zMbduEzWQAwGW3Euo`(t`fK$64-0cUEuN$t>WX){qHs2FGZ}}Q*QRI|VxC?+yw^=7v zlYa2Nw36ao#L|wl+rsTL_VqCmz7@qkLFmTq>#*%v4?!HEB4pn75 zBo9hqU%3(WwkOO}+7>Dv-Xh@4yO-#Iq9Jm&XV;j|Emk0CA_uc4h(VXHD|L`flf8 zUx-RLpJ}>aO#l9JL9}3sRpYwkBJAU1n+FtCFxeQaRRK#a26Ntc3e`B-MCLZ?&I}(W z(Ljpxf%fOGNQfwi0^VPIF2eUc-J6G05YK<_hOM2P%rkEr<2ZMw{@}$KjbKt>_a=K% zEkMH<gISk>esiR0N2f}>!Z6$6ile^;u`^wsW#K`J4(ZQXCc(d&PhyT%Mj%5#i^jk=@O| zb;=~(3`I3$%aY&uSer?}(vtG7-j4hfWk;+C70N>*pjR;ulfL2Vb;xbWCy=ft8#|_< znQc6or$(*8-RP1KFf-pC^n{qt#AKA$)Y==}kfX!**@3CTKPn z5%T7@!>FxrPdy1Vib$?nwN-L4Ui5ySz~90|hj7S2UVcowe)>-Fv|Xl0!7y;fB4pLt zoPj7I)Oh@yBQeq-5>iY32x<*(3(1rwOPU+pP!{-I>d?S z?rg5it6PgSy}qOq9J}jVeY3+A)DHHSnwlJ3voV!V*5n}#Uxf^%2XW9|9_>C)H91#S zpnwZ;PS~b0Sk~aPIx)P}WgzTU)(!rc08@)K8&3fP-GkUqfRRMJk=}i&^XiJdw^dJ# zUP{$&wU=C8JKds+C@CT0l|fX zwzW25dJZoYJ3=KS!bc{u*>+{_gmmkVEox~xom(2tDg}A<-T!7ssh86s*9G1`Z%Ap# zZnbexCzWO&KW6sh&Y)VI4m6N!byZtFE1}sf2V;XvkC=$(98-S>j4n-kb-c+`H>B*c zV4MO+Us^YN3L;Qpj%#+o zUdMl%p@~S2KQXy`IHNR1s`sEH7b6e$2AIWV^BOkVqg*X2cW-qb8cWY}7E3*ODPq+1zWoTxwZst}VmgN*#PH2sO) zmTK3K-OQRo8|!wa_AWl`X727~wX;Q2P2|ne+&MM9^E|Xq4oWPUr-QuFytAqG(-a;^ z^9SuapmV3x^T0!K;391k4LCcX-e7A!A-uTyz7DCjtWoiekITr?*-ZG2mWaOr+f8`K zNB+xXV>a)MHJ(aCmvVsO-7x8VH2H%NaE(}L8qp<_Fa?&dBO_P zaI;xeFu2yukw6`3Uq~M|qw4Pm0%pXy04Jv+g{OkqijNJ%DIkASu``0T)H!-47BUWj zou2g($=j4r47-i6a$-eipS4waK_H9TS32R zqGz2x2M2UZnr@!0K0lIQ2MUb3!vr{S^#NcWBH)YpDrY6MK&85J?XuwQt(hjfw@+%6 zzHCI!fAgJyb`$HXeKz|0SxdiQ2jZ3KyNIc6L(r~MPp+JXTiutP*kH%_=(ujTI@efz zg}K*mXpvq=3|{Q(vK|qINdm{el*54I+~j_Jt%97mMn|2^7v)U*QNgSyJATsk2I=l> znfEv)zYH>0R*P8D(Reiv@!^#PhF#_r;*+lbk z1W`-;`})J1z|k>tYtguCwArqEF3fs8lek54Y;pg5Mb+n&QnY{KgjGlXfrH5i;E`=H zOIr213Y_GFV=Ksfi450%t?BX7zj^BAt9=vMq#jj+LMO z-ojrFdm@pD*=VkBEX+QK%dqfMW$-q$E6oALlG;gqIJ2<5f?H9ds0?_d_PMsy;9lKE z`^?OJy@NDJMlEzFcN83M+cE9f&4?(pEnxd`8Xi(@#1Lgw>=vKK`bg^cZ}QWg7I*Q~ z>UwD^yTgobMUA7X&|)J4`5Bb@W%0%ID5ne9r9J)VsRMQ@8Mq51{rY0G22-zVe6n|nRS6Z@*w8& z*y8j#!9;u$6V4GC^1X^%{rzaQV5QKtzv9Pbax_pGReXbwo=(WP2(ql!Lf#+sb#G`F zOklGS<{b-Jwe9mcc3f->p?Aq`Ld=!A<~@eow=G`8K1}aJG~p!!V+VxemXq@fo4=fh^sK!V0;>yNUzFKt?(FwwwFIGMvcS zW{Nx`?r2_$^YrFZb{S>_PLygAu;zZAhn>UGQ*H97A%y-ha#Ew1Y-em)x;r~Y%aRqj zsN(U?tU>WS57}B%nRr4)eY@5nf~(5(WgaB1`VRF3cHsi*O4(+#yl$qkVNg*{zHZ0{q1Vdz;j@nYt3q71_ z$hKj_WJe09hZ*iMHQ^)@3`}!B-Tv+qu@po0SlgGp`lAB&MD!LzdfOWv)7~i)(!NhX zQ*PYbV({aXAe*8AQ{oK}=53S`3dYy;=j%kp8%Hl0|87wz_WtM$WR&Svml;SANC>dc zb8u9n$!ZH76ia_2AWWHQ&0Q|n<51^LOpIv&Z z-PyjxaRJegtf}bzX5bGI03eN0WqB!YMt^$!h40kdtj@wq4m+1Y^>hNGw=R$As#6zb=-08PqvQs>wJuz zd&v1eE>XY6tyKnH-tUX^_6IX-0QOieEUM}8;EvN9Aq@y7o|`TyaM2+c0$|4}s>O8P z(0+2c-L?b#qIH2$fjJW|LbZ`G;s5rm%a_Tmo7$~gha4?xu1qAUWW%#iN>h>7{(NU; zS^$Se3D7f|8~VN}!U^OOWH-WuwzR%uCxQfqpO9%;w(v7$JW-*x=n&_;ukO`Y(?=3m zD~Q)A{{ZjsDOsvH`EDGLxD`Xgso6GCISyMYw7P?<|FXKE%tlywn33z*kkik~$u5Ms z2jerYnP0CGw_Kik|NhlX#XkVOLD`4TN8hR_99|yTrf4kgQ+lL3Gxof66n4R#Gj5mZ z6tW1+*DF~KS{jH$X|j8wMwMabjhI^cwjb%Q)F};h$Z;&srJ1?r3SRU1B zfgM^hh6i-Fu9o@K^q=C4oTm5W2=y}}eeA4vrtHXdfWj`*j@@EhWM^lmaXpT~3?wARoHe327EAxU=K z8H5Od>+1?^{SaTjYxCPD4nbfLlgCK{YqYW+`&@|#0!H{MqTu<9dVSr1fnHm1Gz{scBfhb4Ku9@Y!c_7DkQplaq_>I^r53F3NMV zlinG?PJf(N2QLMoc6=p@>8O|Q`kC(MdR1&S(B26>g73$Q`&;;gcH2{O{ny0ePOLvX zzT5!fc|cwJ{jJNjkz<(4Y*fM=gS>p%c^sO@fs$CD0+(i*?p(<~F+F-OrfK$|j2E%n zg8~`*U)yH+W%EIs6<;3WQTLCpQTt`i-lS5xDIDL-hg8H)NnjxScLS!Y)!4z%?`;WqL36%j}sDm&z0meA)jJPV*2sQ;{BRUJFu0$l3T z+K(b8vt+`(hjH;&7xPCWg1?VyH~~zzw_WwEDHplnGBs>jxQJn-4j;Q(-s<>s8o{Bqses^ zG;(H?=cZGDv99a(sPocY7izjIxic@~AXYzDepT@>%}~mSMu3#U`#{&}v#kJ=JTb84 z@As^!E$QhF{-m8fyRxxvQs0;B1pzQLg;@UHQ(hX-Vya2pdUOhyBDgEjSuCg!b~?pL z45CRP3@d^EI1V>g!os zlT0&WKNY~Koy_v$UvB3_X5CFb{Zml%&wHz|P!E}uOty2}qbGz6?Rk>b^Na~7o%Ka! z4Y~bT-xodz2b1}W<1S0b1i}Df8qdU5Ou9zGM(aov9ii8?{3w*D6K~|VaR(219Kxcp zWR9b&fXUQxnXsrtX2uv)WS*Jy;w1&*?r+9Fa)}gFfml6=VTDvYsuu)6N^b%^M!#IG z&>)`I1p#NXR)p=*yAcibWQb?R*;iS`r3JDUj3dZ-frV=%9Pc}DBZBI_Sh4XBpq$IO zdh5MwSIU}j19xuLViqhiI+XsX&5U@{oDg67%CJ0ssZTGNGF9#BHE)dfEH2y(Kye*4 zc8UQ_SRUc*fv+(!Rb)s(amjc1Ju8~+)CGbM!VVDq+=90CXB9`V*=3I3ThExEC_TI8 zm`9&c_&ZX3InN-JZ zJnRfp!sdo9)PGrge{0XTn(P6!9KQVp@O8HesaARQwh%_*eTnXs66wF_T`n*!{N9iB z*zo%J+c~R#uz^Uw{_jUsSb&%wORMw95vsrK8}~vl5C=IQ_P5hF-VVmKtl>(WI3!k_FyqZc=H5T(xuQkrb_t)G8znI+r^{5~nO(HqQJGz+v z+!}(LLbn4XE*a=Kg%o!AX}6D<;Fx~%BTMPym|)otnik_o&%UAI z5nv&juxFPH&Shf>rz4{D}1rK-L+i3{xVm@!!Q4-FAtHRv}^&lJtd`8 zdlw{vXTW6V1q@6*a{D+?ECb3yMiZb*eV79Y|MClX<2jyQ7j9&Z?pHh3v{!n1hv7-) zVlA`qM{SrRdPiTvsjgg&pA7z1Gb~E9>P9V~4KXcM2oH-<$0{12Fhwm1Vw5@&_~7EV zA4_)ZYJz3SApCq~Wg$kF5fBPhv|`%96S&oH)K7KDm^2}AhtmNpPxElMHl_R2g zS%Z;3mbMAp!(8SgwJUgB@O{~4xOEQSk9*gfq@P=)JTLlU0T*k|Upcg4r~VE#Ay7T6 zdbJu~^GL<(_;7IB7QbKM;W0t*Tvm;XK}PZU+3hT2azX6xY;)k=0qw zg{KGhJ$>${zs0q$`E&^Qnn)_Dp}TE;Bm!7VmPYkSJf$vq_1?=ds$gB_+mIKu;jbtE z+7nAN`Es~A_5+%qlyStp0~mV#15`57#lLPUDF|9KZWYk2D`ry{V>(nS5a;T_e5BAf z-&%4e{0}t!SW0PaIcup{Rc?-dn!<3m$!Q zWZ;`LI+lT2mD{-AL>dE&=+%8z{M)p$innq(V7T~l)J0|pnT$S#56>pgNB?%fi9M5K zBsTUZ6d$%x5lja;PksvkVGxdWm&jEaU(m_R2^0Va3>!kq$CuN`1pJ zVxC?6QkHmKxh^%p6t8I`^X{z80bUL$ea z!26#+HauoHJ?2P;idcQ0SKD}~f(;P^a2xbtahm~SmHpD{W9~kgXX@{>HE|$QH9o^; zhfU(m*O#=@H7lXb!=#2q-NGp(2HitXR^vKp_GG^XyRMhahn7iAFK3?r2Z;Tygznmm z*{nX7IpaC%u{gP9=d@c$0Kt7?t_7LYFfKm=@DSE}smmO4%1$pO%Q;pCt8M#ebbGuC zcOr+^UacEUqbF|C6{EjjshlE}-x+)I`_`{2CEgS0(qq<8zlbbzwr5;)>ByrkPX~+Q zEc(eTg)rEOnFl&9NLJAd8=ltA${2f{_!c1w8A#+TQ^MMjDL&xG64q)D`Hj}V-8({@ z)UtP!7(%Pui3#rbpd~H1R=%e!0HBNJqtKOeHBGuta%HG67?IT80En;>I%vbv!5WCT z9Revjk-|)nuN5Pi+ye*fY}j$AnH!x$ptWW*c;snF$Q;09>tSku{Y5#EcBN%?eS-=W zQHY1*xSY0nM`*Hg;}gavjvF>*=`CaOtTBkrf!$-=QS>NC~&jISS zK9T}SYdKc-uk)wExHhL56ml`iB;vu-)v>tCM{RW=yu0jS>-jCEHUHs&q*|s7%avTP=MI4!-JQhEc?e;k%XXg;wp3nOFsVULW{V>O8c}0dt)8gn{yb~tp*p2qLH8T0Kl~|6X z-&J!8M$E-c!c>Mc*UMZub({-EejU1|zo{~EPAFKD%s(mk56~oU-{-PKkTY+5vE;b= zqDT?LF`$_Ae%p?qj$|Q@M*wrbU$8_$xE6mV-~#5DOQdBuIWz*NN7@LT{nFO(H0x;M zLC1w_M^`HZ+Xb;aFTT9^F8T5II6sF}+Ac7JTkbbazmhFqVC_XBD3n`YA?ncj0xpxA z!eJu)Uj36Oj)TOM$i)8H8z^z39wad0RDj7#OZM+Bix^P}Izg>lX=dm#wzI8qi+3kW z!#hDp4cR9eHl{s6;x}&raEKfL=PApdTWQD-btH2Rq!tx7@xu{moLGFRL?E@h3Mm%QaHt>5F-nl6 zoK)<+Kh2+Le?}@svGRf9ng_tj2kHEkujA9*wu|lNjXiYDtu6r-_MG(Z!|~%B(i!=nTBW0BbIehqrarlP+_kkY!^mE?e^u?I2$IzfaMmnwQ|3J-_8IoQO+D!0Hf{?u0E zD?{UgPLDn>;~dooARJ)skEOgSkcpC<1W2>f(ms#{g+wa~*dm1pi}vUg}hF-~QZU$}_YjCQzY1h1iT@sT-C8<#;fq2o27LX_FyXB|p{M&~2z zH1$lby-IUSPT~byCU|Qf#U5ShWBdMPr0k2?y4ADouP;alyPokkS>=naO?dz6XR`J5 zo!G;dUh;Ksvg>+H3SE!t9ry7gH3Z}fu;0q#J!jzcRBm!~uRrAchYcdG@>Ytwp?7@1 zSeCyg_S}xU4vWa!Z0wndjPU3Fs5=^E&mTQ{Hc>wz+?%<9!i|cG5rbw`r>MbV?HopD zA|933pF8D}D5teE7I~&jMD4?qWeGNv1g|}UKF}vmC_tUB>oRPr`Em|#6F?Efye^eW zmu$Ad0aIg)BG1_3zn9ST;$}{)=}g2_XeSEy0l0X@pr<*0&s9<`C`a5HbCSE%x^Ylb z_5>u2iKfc-{T4aq5>ISQtp`g>cjE3MhB=(Ts}ehM$+eE4Pezr*{!5lk^HI|{aagxj z(H9%_zOlcqB{Kf{=!QUrpOZHEcRJCw{i^Yv(JQPpR@c0MFzLZ)N?YBX6sRVeY z_5xJP^NXCPx%f@vA-qDd=%^KAWrzsQ7?AnUdd2tLT?%-IDHtsg{;D@s++-osOC}CR zsV7es*{9F{iL?~Cmgk9ZVC7J8Wwn$MOS9jt9)l9n6l;BXs+@X8xwABfZf_CQx@~yT zP>R6)W3}g0`Y7RgjR3gf4VGAU&1o9W?J~->NMn+mKlla)y1VMj^)hW2^&n=pK8in& zH`%h{<{YhTVGpf@Ei7mZE59w4LnV6KPGP616urplq8_m2$&c@g@9h^7zxa6Vme4&b zAB7$|m3#9WA$hcgl>kjZr5gx52hviWWCAQ`VnnS^v3^_v3pAzdDpRyY9StG8(T2wYExs$+jGkHHzi)& z#>!41gc(XTa2=O{qokYmYK#KU3)=nP(mPe5XTfYT3IIs>kKMy5o;#8)4D9fI2 zPaSoP$H#{ssjR)B2wHi>R?D2{B=(@5QuPlRpZB zLb??^w*5l>%v?c_U4PhCtl+Wxqoy3(sNDmxkV5{tAuMoYQFShUQg%RAzjX>>t`}e6 zrYiSp@RzoTNU%9PSd~|HF;fK^>tBw5viHpCY_aT$sAe}t-HgZfjjh~DB>NK+c;`d( z&n1_6m_N*JVeUwA{{ob0%Kr?E*!!2hbx6;%EY_iNpC$&gklCdeN6G!(T}kGt^ou3r^Cl( zg5gvVQ1`;GX-Rr`APW}J>+TwRafbL_t!4U7Px8x+E>@hX|MeMxlS6eJg{n6l4L9MU6H6pFT2RTCp=5Q#Hw>*FL8{w8)`(G2SvM!=$$GnEyHi;A@rS*g+X0>yZqx3G$oQ0uYNS26n+1Rf+KLQX0$IH<> zA5J`3I|!0zCU@<2U9{r}Hgv4>M*4tuONm6TFOMQ=*I7|mr|q3TcPpPF2 zJ-#C-pjveS7d=*27|jqW5y|wg7K}#(i%+<*&qaY{KOpJ)%B?L+^=s6cHnXK zE44a2W#;I%xWq{-16DwaDbg%~{<8V*b*)uA90V9Hj(#^;_IP%V##YEum6LFp?n$oN zQySv&=3kn(^?$LL<&uAfPYstQs{p&oIK6>oO5H?bekU;YC~E-YjRp4>0Fl%ni2*2@zgvAU#fE$o&ENFeePEu?;Q`gcEN zr^$i^Bj%m%(u+pNC@cv6r^@=SHHT#HwA%O!OuXBS5XjAf%qOe&VeuMgClV~(4N zx?og`)#i4m!bOl={X~zpY{;McCrc~)uCZWMS;#`Otld^+K~kaJ`qFzQUr#8^y(5Z~y4SVM~f0;7`a9=XxMJR1etfzS6cd zkV(P_M46*#I{J@^fR(>Fz+bB@GmMcfzk{xn=_j6&gb`lR9rMoiz1l=z?9NqjKwY+a z6Ap9=st{3MKtC2yC6%m-Fe9?4e&29LW@y_SnhL4s$LaLzm7|$MEvXGx^<~?dZ?dfU z=n;U~z3{%0B%5tD^31VgwzWiIH;*00Gpc!^^eg70)KgW=Vq%bNU-b6u%}``~tFN#H zMJ`5X_h-$ghoWzv$9)W+2~^=v>B(Qs5^JD=gDWuS5=Ybs2-5a;CsdpjZwh@LIocmw zic>;XbGVTU~puWNC@Jx`!5zUyDRykp^A_MOU|za)M}{P7-GQI#9Tc0;47#It}{iAV}UCW*+P`9@s1LCG$_J@wa~_CS@$2KT-z5y`UNn+&R=RshBG0*FO22h}0p4iPIwB_DYw|32k*l zp-(D}sSeoE;*}V^y;{mnzKzLePU_(S3$+arxDFc-EEnIJ_ykk>Kto4XIyzf<|0lV^!Lni{1DvfvS#)~+tt0zy=q<10l?a) zbFDw57LQ3*qd^BFNRYxU3&^j;kMIJHUBO=lKCD7sPC3>*FTmox&;0!+ZfUJGtR00h zG4D`IWX-`%0MDFXWrpu?NDqq6TJP}~*sHb|;mWQMW&I+WJnuY?6S{RP2Oh6x+9Ef< z?c9X>>aNlq=k3#xRV%=#e47uY2?Vk7sA}!xp`l8GIgLKZAHF9OZn_niNEFOZx;r<4 zGS5bkaGq?IXUZGTHayWG1?6!y-`&f+Rc1G7l4+b~RC( zV1pO)ZvAj01@0CMyeZbkc`jgy^^CN81-mlCd`V1$Yty#xdQ}v4{{h@@XgW9HQDm68 z!Sj~^>(1Sh=rZ@!W$xjiQwPp|4$PY84mf~%Lz=?XrOFCNY`vI&K{820XH(UoO0aJz zsa0!4FYQ0dnn58kfwgA14Oblty-mKwuwmo7 zwY?Y44Z3O_IUzIq>zZD+H~CIUzO`!wUT8n?NWK*?n@cfskzH3pggWofMom|sl~NbZFGu4 z<{I^?Rb?pt10db*DJ(3T{#A8gdJ2=-TT$5-qum)pKZp9%#0|*yJ037(e^~Jrk(D z(Xwwsr89Y76c!flt~xha$2wg->DXNai`Zk9oqGlw&04%C&i8A#);WG{C@uM@H2D_d zjBRFTMiYcBrz$aRjFHn-|8`^?*NS@O>I3vcn(>8KZh!rq<%Z92N31D z9In}$KRS#f57>DJ>hI4q`O;420?;-hj)nfZSE_b$a;N)YlQ93&ti2Zc`NOh^sy8vv zV&~z-i6>+oxO)NP1${hnqtjOG0eW!uF1EWr#NU7y8*9_v2(8`p&;*I*I|$%!Kl0c^4j4J5=d4-c@)m zJI*CTNA@4ZC|@5x5Of$oW#d`95C3{P_er(}64?CkGIt5WO2thOt8l0x%R1yF75tqr z0gmv~LE>xZ)d|ECHHHG7)^&Q?cS=G+<&m7pO@k%Y`F)Go2W^crZR{Mpz?xnPS60wY z2ICh3DxMv4h=-bI0y2-!*7{Bf%V7}Mk=kwXi@rU%>JVNlZ*mxhHK2agq+~TMB!kVB zT9#;qVyXIsPSiSA@bD`LK8N5ymgLMp~Nh6o>5^7!l_Vc*Q2261t0? zs)A&4gSVGDeW!#3Gf&Fg9qsF2vSG^9Bad5n26}~gBQ?=TLqneb(=8aOg+;Ua zppn{o|LKcHx(6VS69UjklOUw^|9rj35KjsZ8mYsB{=XYiM_XG{8%aU_cbgvazaB*f z{&$N3+Aw-LdRjXF-7hS}&Bxy}l5XP)IlD%2?`2B gvb+LFoBusBw~(;^`kWZO6KJdskG#C;c{85>1%wh_3jhEB literal 0 HcmV?d00001 diff --git a/packages/core/src/pdf-ocr/index.ts b/packages/core/src/pdf-ocr/index.ts new file mode 100644 index 00000000..82abdae9 --- /dev/null +++ b/packages/core/src/pdf-ocr/index.ts @@ -0,0 +1,6 @@ +export { ocrPage, pdfPageOcr } from './ocr-page.use-case' +export { ocrRuns } from './ocr-runs.mapper' +export { withOcr } from './with-ocr.use-case' +export { renderPagePng, scaleOfDpi, DEFAULT_DPI } from './render-page.client' +export { ocrDpi } from './native-dpi.client' +export type { OcrEngine, OcrLine, OcrOptions, OcrPageImage, OcrSetting, OcrWord, PdfOcr } from './ocr-engine.contract' diff --git a/packages/core/src/pdf-ocr/native-dpi.client.test.ts b/packages/core/src/pdf-ocr/native-dpi.client.test.ts new file mode 100644 index 00000000..265766f0 --- /dev/null +++ b/packages/core/src/pdf-ocr/native-dpi.client.test.ts @@ -0,0 +1,36 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { ocrDpi } from './native-dpi.client' +import type { PdfPageHandle } from '../pdf-document' + +async function firstPage (path: string[]): Promise<{ page: PdfPageHandle, destroy: () => Promise }> { + const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs') + const bytes = readFileSync(join(__dirname, ...path)) + const task = pdfjs.getDocument({ data: new Uint8Array(bytes), verbosity: 0 }) + const document = await task.promise + + return { page: await document.getPage(1), destroy: async () => { await task.destroy() } } +} + +describe('ocrDpi', () => { + it('is the scan\'s own resolution: the pixels of its picture across the width of the page', async () => { + const clean = await firstPage(['fixtures', 'scan-clean.pdf']) + const poor = await firstPage(['fixtures', 'scan-poor.pdf']) + + expect(await ocrDpi(clean.page)).toBe(180) + // 840 pixels across 420 points is 144 dpi: held at the 150 floor. + expect(await ocrDpi(poor.page)).toBe(150) + await clean.destroy() + await poor.destroy() + }) + + it('is 300 for a page with no picture, and what was asked for when something was', async () => { + const text = await firstPage(['..', 'pdf-document', 'fixtures', 'discounts.pdf']) + const clean = await firstPage(['fixtures', 'scan-clean.pdf']) + + expect(await ocrDpi(text.page)).toBe(300) + expect(await ocrDpi(clean.page, 220)).toBe(220) + await text.destroy() + await clean.destroy() + }) +}) diff --git a/packages/core/src/pdf-ocr/native-dpi.client.ts b/packages/core/src/pdf-ocr/native-dpi.client.ts new file mode 100644 index 00000000..9b1461ad --- /dev/null +++ b/packages/core/src/pdf-ocr/native-dpi.client.ts @@ -0,0 +1,33 @@ +import type { PdfPageHandle } from '../pdf-document' +import { DEFAULT_DPI } from './render-page.client' + +/** Below this the scan is too coarse for any reading to gain from being rendered smaller: pages are read at least this sharply. */ +const MIN_DPI = 150 + +/** The names of the operators that paint a picture. */ +const PICTURE_OPERATORS = new Set(['paintImageXObject', 'paintInlineImageXObject', 'paintImageMaskXObject', 'paintJpegXObject']) + +/** + * The resolution to render a page for OCR at. A scan is read best at its own resolution: rendered larger, a soft picture only gets blurrier + * (Tesseract reads a 144 dpi scan well at 150 and not at all at 300), rendered smaller, it loses detail. So the page's largest picture says + * (its pixels across the page's width), held between 150 and 300 dpi; a page with no picture (text drawn as outlines) is read at 300. + * + * @param page - The pdf.js page. + * @param requested - A resolution the recipe asked for, used as it is. + * @returns The dots per inch to render at. + */ +export async function ocrDpi (page: PdfPageHandle, requested?: number): Promise { + if (requested !== undefined) return requested + const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs') + const operators = await page.getOperatorList() + const names = new Map(Object.entries(pdfjs.OPS).map(([name, code]) => [code, name])) + const { width, height } = page.getViewport({ scale: 1 }) + let widest = 0 + for (const [index, code] of operators.fnArray.entries()) { + if (!PICTURE_OPERATORS.has(names.get(code) ?? '')) continue + const [, across, down] = (operators.argsArray[index] ?? []) as [unknown, unknown, unknown] + if (typeof across === 'number' && typeof down === 'number' && across > 0 && down > 0) widest = Math.max(widest, Math.max((across / width), (down / height)) * 72) + } + + return widest === 0 ? DEFAULT_DPI : Math.round(Math.min(DEFAULT_DPI, Math.max(MIN_DPI, widest))) +} diff --git a/packages/core/src/pdf-ocr/ocr-engine.contract.ts b/packages/core/src/pdf-ocr/ocr-engine.contract.ts new file mode 100644 index 00000000..eedb26c3 --- /dev/null +++ b/packages/core/src/pdf-ocr/ocr-engine.contract.ts @@ -0,0 +1,59 @@ +/** A PDF page as an OCR engine reads it: the page rendered to a PNG, `scale` pixels to each point of the page. */ +export interface OcrPageImage { + png: Uint8Array + width: number + height: number + scale: number +} + +/** One word an engine found, its box in the image's pixels, y growing downwards from the top edge. */ +export interface OcrWord { + text: string + x0: number + y0: number + x1: number + y1: number + /** How sure the engine is, 0 to 100. */ + confidence: number +} + +/** One line of text an engine found: its words left to right, and the line the baseline runs along, when the engine measures it. */ +export interface OcrLine { + words: OcrWord[] + /** The baseline under the line's letters, from its left end to its right end, in the image's pixels. It follows a scan that was fed in crooked. */ + baseline?: { x0: number, y0: number, x1: number, y1: number } +} + +/** What to read a page for. */ +export interface OcrOptions { + /** The languages the page is written in, as Tesseract names them (`eng`, `ita`, `por`, `chi_sim`); the engine's own default when empty. */ + languages: readonly string[] +} + +/** + * Reads text from the picture of a page. `@opencraw/ocr-tesseract` is the engine OpenCraw ships; anything that answers this can stand in for it + * (a cloud service, another local engine), handed to the crawler as `ocr`. + */ +export interface OcrEngine { + readonly name: string + recognize: (image: OcrPageImage, options: OcrOptions) => Promise + /** Stops what the engine started (worker threads, a loaded model); called when the client that loaded it is disposed. */ + dispose?: () => Promise +} + +/** What a recipe's `ocr` says: the languages (Tesseract codes, default English), whether pages that have text are read again, the resolution to render at. */ +export interface OcrSetting { + languages?: readonly string[] + always?: boolean + dpi?: number +} + +/** The OCR a PDF is read with: which engine (loaded when a page first needs it), in which languages, and whether pages that have text are read again. */ +export interface PdfOcr { + engine: () => Promise + languages?: readonly string[] + /** Read every page by OCR and drop the text layer, for a PDF whose text layer is wrong (a scan somebody ran bad OCR over). Default: only pages with no text. */ + always?: boolean + /** The resolution a page is rendered at for the engine, in dots per inch. Default: the scan's own resolution, between 150 and 300; more only blurs a soft scan. */ + dpi?: number +} diff --git a/packages/core/src/pdf-ocr/ocr-page.use-case.test.ts b/packages/core/src/pdf-ocr/ocr-page.use-case.test.ts new file mode 100644 index 00000000..e9952d94 --- /dev/null +++ b/packages/core/src/pdf-ocr/ocr-page.use-case.test.ts @@ -0,0 +1,88 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { readPdf } from '../pdf-document' +import { pdfPageOcr } from './ocr-page.use-case' +import type { OcrEngine, OcrLine, OcrOptions, OcrPageImage } from './ocr-engine.contract' + +const PNG_SIGNATURE = [0x89, 0x50, 0x4E, 0x47] + +/** An engine that reads what it is told to, and remembers the pictures and options it was given. */ +function fakeEngine (lines: OcrLine[]): OcrEngine & { seen: { image: OcrPageImage, options: OcrOptions }[] } { + const seen: { image: OcrPageImage, options: OcrOptions }[] = [] + + return { + name: 'fake', + seen, + recognize: (image, options) => { + seen.push({ image, options }) + + return Promise.resolve(lines) + }, + } +} + +const word = (text: string, x0: number, y0: number, x1: number, y1: number): OcrLine['words'][number] => ({ text, x0, y0, x1, y1, confidence: 95 }) + +describe('reading a scanned PDF by OCR', () => { + const scan = new Uint8Array(readFileSync(join(__dirname, 'fixtures', 'scan-clean.pdf'))) + + it('is refused without OCR, saying it is a scan and what to do', async () => { + await expect(readPdf(scan, 'scan.pdf')).rejects.toThrow(/scan\.pdf: no page has a text layer: it is a scan\. Read it with OCR/) + }) + + it('renders the page, gives the engine its picture, and reads the words as rows and cells in points', async () => { + const engine = fakeEngine([ + { words: [word('Model', 150, 200, 280, 240), word('Price', 700, 200, 820, 240)] }, + { words: [word('Pandina', 150, 300, 330, 340), word('15950', 700, 300, 820, 340)] }, + ]) + + const document = await readPdf(scan, 'scan.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine), languages: ['eng', 'ita'] }) }) + + const [page] = document.pages + expect([page.width, page.height]).toEqual([420, 595]) + expect(page.rows.map(row => row.cells.map(cell => cell.text))).toEqual([['Model', 'Price'], ['Pandina', '15950']]) + const [first] = page.rows + expect(first.cells[0].x).toBeCloseTo(60, 5) + expect(first.cells[1].x).toBeCloseTo(280, 5) + expect(first.cells[0].y).toBeCloseTo(595 - 96, 5) + expect(engine.seen).toHaveLength(1) + expect([...engine.seen[0].image.png.subarray(0, 4)]).toEqual(PNG_SIGNATURE) + // The scan is 1050 pixels across 420 points: 180 dpi, and that is what it is read at. + expect(engine.seen[0].image.scale).toBeCloseTo(2.5, 5) + expect([engine.seen[0].image.width, engine.seen[0].image.height]).toEqual([1050, 1488]) + expect(engine.seen[0].options.languages).toEqual(['eng', 'ita']) + }) + + it('loads the engine only when a page needs it', async () => { + let loaded = 0 + const ocr = pdfPageOcr({ + engine: () => { + loaded += 1 + + return Promise.resolve(fakeEngine([{ words: [word('x', 0, 0, 10, 20)] }])) + }, + }) + const withText = readFileSync(join(__dirname, '..', 'pdf-document', 'fixtures', 'discounts.pdf')) + + await readPdf(new Uint8Array(withText), 'discounts.pdf', { ocr }) + expect(loaded).toBe(0) + await readPdf(scan, 'scan.pdf', { ocr }) + expect(loaded).toBe(1) + }) + + it('leaves the pages that have text as they are, unless every page is to be read by OCR', async () => { + const withText = new Uint8Array(readFileSync(join(__dirname, '..', 'pdf-document', 'fixtures', 'discounts.pdf'))) + const plain = await readPdf(withText, 'discounts.pdf') + const engine = fakeEngine([{ words: [word('replaced', 100, 100, 300, 140)] }]) + + const untouched = await readPdf(withText, 'discounts.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine) }) }) + const forced = await readPdf(withText, 'discounts.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine), always: true }) }) + + expect(untouched).toEqual(plain) + expect(forced.pages[0].rows.map(row => row.text)).toEqual(['replaced']) + }) + + it('says so when OCR finds nothing on any page', async () => { + await expect(readPdf(scan, 'scan.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(fakeEngine([])) }) })).rejects.toThrow('scan.pdf: no page has a text layer, and OCR found no text on any page') + }) +}) diff --git a/packages/core/src/pdf-ocr/ocr-page.use-case.ts b/packages/core/src/pdf-ocr/ocr-page.use-case.ts new file mode 100644 index 00000000..02694ebd --- /dev/null +++ b/packages/core/src/pdf-ocr/ocr-page.use-case.ts @@ -0,0 +1,34 @@ +import type { PdfPageHandle, PdfPageOcr, PositionedText } from '../pdf-document' +import type { OcrEngine, PdfOcr } from './ocr-engine.contract' +import { ocrDpi } from './native-dpi.client' +import { ocrRuns } from './ocr-runs.mapper' +import { renderPagePng } from './render-page.client' + +/** + * Reads a PDF page that has no text layer by OCR: renders it, has the engine read the picture, and gives the words as the text runs a text layer + * would have. + * + * @param page - The pdf.js page. + * @param pageHeight - The page's height in points. + * @param engine - The OCR engine. + * @param languages - The languages to read for. + * @param dpi - The resolution to render the page at; default: the scan's own, between 150 and 300. + * @returns The page's text runs. + */ +export async function ocrPage (page: PdfPageHandle, pageHeight: number, engine: OcrEngine, languages: readonly string[], dpi?: number): Promise { + const image = await renderPagePng(page, await ocrDpi(page, dpi)) + const lines = await engine.recognize(image, { languages }) + + return ocrRuns(lines, image.scale, pageHeight) +} + +/** + * The way `readPdf` reads a page that has no text layer, from an OCR setting: the engine is loaded when a page first needs it, and every page read + * goes through it. + * + * @param ocr - The engine (as a loader), the languages, and whether pages with text are read again. + * @returns What `readPdf` takes as `ocr`. + */ +export function pdfPageOcr (ocr: PdfOcr): PdfPageOcr { + return { readPage: async (page, height) => await ocrPage(page, height, await ocr.engine(), ocr.languages ?? [], ocr.dpi), ...(ocr.always !== undefined && { always: ocr.always }) } +} diff --git a/packages/core/src/pdf-ocr/ocr-runs.mapper.test.ts b/packages/core/src/pdf-ocr/ocr-runs.mapper.test.ts new file mode 100644 index 00000000..3f0718f6 --- /dev/null +++ b/packages/core/src/pdf-ocr/ocr-runs.mapper.test.ts @@ -0,0 +1,51 @@ +import { ocrRuns } from './ocr-runs.mapper' +import type { OcrLine, OcrWord } from './ocr-engine.contract' + +const word = (text: string, x0: number, y0: number, x1: number, y1: number, confidence = 90): OcrWord => ({ text, x0, y0, x1, y1, confidence }) + +describe('ocrRuns', () => { + it('turns words in pixels into runs in points, y growing upwards from the bottom of the page', () => { + const lines: OcrLine[] = [{ words: [word('Price', 200, 100, 300, 140), word('list', 320, 100, 380, 140)] }] + + const runs = ocrRuns(lines, 2, 800) + + expect(runs.map(run => [run.x, run.y, run.width, run.text])).toEqual([[100, 730, 50, 'Price'], [160, 730, 30, 'list']]) + expect(runs[0].height).toBeCloseTo(26.67, 1) + }) + + it('puts every word of a line on the line\'s baseline, whatever hangs below it (a g, a y)', () => { + // "Typing" has two tails: its box ends 12 px below the baseline the other words end on. + const lines: OcrLine[] = [{ words: [word('Fast', 0, 100, 80, 140), word('Typing', 100, 100, 220, 152), word('works', 240, 100, 340, 140)] }] + + const ys = ocrRuns(lines, 1, 500).map(run => run.y) + + expect(new Set(ys).size).toBe(1) + expect(ys[0]).toBe(500 - 140) + }) + + it('follows the slanted baseline of a line that was scanned crooked', () => { + const baseline = { x0: 0, y0: 200, x1: 400, y1: 220 } + const lines: OcrLine[] = [{ baseline, words: [word('left', 0, 170, 50, 200), word('right', 350, 190, 400, 220)] }] + + const [left, right] = ocrRuns(lines, 1, 1000) + + // The baseline is at 201.25 under the middle of "left" and at 218.75 under the middle of "right". + expect(left.y).toBeCloseTo(1000 - 201.25, 5) + expect(right.y).toBeCloseTo(1000 - 218.75, 5) + expect(right.y).toBeLessThan(left.y) + }) + + it('leaves out words the engine is not sure of, and empty ones, and gives nothing for a line with none left', () => { + const lines: OcrLine[] = [ + { words: [word('real', 0, 0, 40, 20, 88), word('speck', 50, 0, 90, 20, 8), word(' '.repeat(3), 100, 0, 120, 20, 90)] }, + { words: [word('smudge', 0, 40, 60, 60, 3)] }, + ] + + expect(ocrRuns(lines, 1, 100).map(run => run.text)).toEqual(['real']) + }) + + it('trims the text of a word, and handles no lines', () => { + expect(ocrRuns([{ words: [word(' 15.950 ', 0, 0, 80, 20)] }], 1, 100)[0].text).toBe('15.950') + expect(ocrRuns([], 1, 100)).toEqual([]) + }) +}) diff --git a/packages/core/src/pdf-ocr/ocr-runs.mapper.ts b/packages/core/src/pdf-ocr/ocr-runs.mapper.ts new file mode 100644 index 00000000..05c3481e --- /dev/null +++ b/packages/core/src/pdf-ocr/ocr-runs.mapper.ts @@ -0,0 +1,55 @@ +import type { PositionedText } from '../pdf-document' +import type { OcrLine, OcrWord } from './ocr-engine.contract' + +/** Below this confidence (0 to 100) a word is the engine guessing at a speck or a stain, not reading: it is left out. */ +const MIN_CONFIDENCE = 20 +/** The share of an em a word's box rises above the baseline: capitals and ascenders reach about this far. */ +const ASCENDER_SHARE = 0.75 + +function median (values: readonly number[]): number { + const sorted = [...values].sort((a, b) => a - b) + const middle = Math.floor(sorted.length / 2) + + return sorted.length % 2 === 0 ? ((sorted[middle - 1] ?? 0) + (sorted[middle] ?? 0)) / 2 : (sorted[middle] ?? 0) +} + +/** Where the baseline is under a word, in pixels: on the line the engine measured, else where most of the line's words end (a word with a tail, g or y, ends lower). */ +function baselineAt (line: OcrLine, word: OcrWord, fallback: number): number { + const { baseline } = line + if (baseline === undefined) return fallback + const run = baseline.x1 - baseline.x0 + if (run <= 0) return baseline.y0 + const centre = (word.x0 + word.x1) / 2 + const at = Math.min(1, Math.max(0, (centre - baseline.x0) / run)) + + return baseline.y0 + ((baseline.y1 - baseline.y0) * at) +} + +/** + * The words of a page as the text runs a PDF's text layer gives (`PositionedText`: points, y growing upwards, the baseline), so rows, cells, + * tables and regions are found on a scan exactly as they are on a PDF with text. A word on a crooked scan sits on its line's slanted baseline; + * the font size is what the capitals and ascenders of the line imply. + * + * @param lines - What the engine read, in the page image's pixels. + * @param scale - Pixels to each point of the page. + * @param pageHeight - The page's height in points. + * @returns One run per word the engine is sure enough of. + */ +export function ocrRuns (lines: readonly OcrLine[], scale: number, pageHeight: number): PositionedText[] { + return lines.flatMap((line) => { + const words = line.words.filter(word => word.text.trim() !== '' && word.confidence >= MIN_CONFIDENCE) + if (words.length === 0) return [] + const fallback = median(words.map(word => word.y1)) + const rise = median(words.map(word => fallback - word.y0)) + const boxes = median(words.map(word => word.y1 - word.y0)) + const size = (rise > 0 ? rise / ASCENDER_SHARE : boxes) / scale + + return words.map(word => ({ + x: word.x0 / scale, + y: pageHeight - (baselineAt(line, word, fallback) / scale), + width: (word.x1 - word.x0) / scale, + height: size, + text: word.text.trim(), + })) + }) +} diff --git a/packages/core/src/pdf-ocr/render-page.client.ts b/packages/core/src/pdf-ocr/render-page.client.ts new file mode 100644 index 00000000..9a2b2db0 --- /dev/null +++ b/packages/core/src/pdf-ocr/render-page.client.ts @@ -0,0 +1,34 @@ +import type { PdfPageHandle } from '../pdf-document' +import type { OcrPageImage } from './ocr-engine.contract' + +/** A PDF point is 1/72 inch: the pixels to each point of a page rendered at this many dots per inch. */ +export function scaleOfDpi (dpi: number): number { + return dpi / 72 +} + +/** 300 dpi, what Tesseract is trained for: text a few points tall still has glyphs it can read, and most scans are at least this sharp. */ +export const DEFAULT_DPI = 300 + +/** The widest side a rendered page may have, in pixels: a poster or a very large MediaBox is scaled down to this. */ +const MAX_SIDE = 6000 + +/** + * Renders a PDF page to a PNG with pdf.js and `@napi-rs/canvas` (the canvas pdf.js itself uses in Node), the way a scanner would give it: only + * the page's pictures and drawing matter here, so a scan comes out as the scan. + * + * @param page - The pdf.js page. + * @param dpi - Dots per inch to render at; default {@link DEFAULT_DPI}, lowered for a page so big its longer side would pass 6000 pixels. + * @returns The page's image. + * @throws Error when `@napi-rs/canvas` cannot be loaded (its native part is missing for this system). + */ +export async function renderPagePng (page: PdfPageHandle, dpi = DEFAULT_DPI): Promise { + const natural = page.getViewport({ scale: 1 }) + const effective = Math.min(scaleOfDpi(dpi), MAX_SIDE / Math.max(natural.width, natural.height)) + const viewport = page.getViewport({ scale: effective }) + const { createCanvas } = await import('@napi-rs/canvas') + const canvas = createCanvas(Math.ceil(viewport.width), Math.ceil(viewport.height)) + // The canvas is @napi-rs/canvas's: the one pdf.js itself uses in Node, whose types are not the DOM's. + await page.render({ canvasContext: canvas.getContext('2d') as never, canvas: canvas as never, viewport }).promise + + return { png: canvas.toBuffer('image/png'), width: canvas.width, height: canvas.height, scale: effective } +} diff --git a/packages/core/src/pdf-ocr/with-ocr.use-case.ts b/packages/core/src/pdf-ocr/with-ocr.use-case.ts new file mode 100644 index 00000000..54154e1e --- /dev/null +++ b/packages/core/src/pdf-ocr/with-ocr.use-case.ts @@ -0,0 +1,44 @@ +import type { PdfPageOcr } from '../pdf-document' +import type { OcrEngine, OcrSetting } from './ocr-engine.contract' +import { pdfPageOcr } from './ocr-page.use-case' + +/** The package that reads pictures; it is not a dependency of core (it brings a WebAssembly engine and a language model), so it is loaded when a recipe asks for OCR. */ +const ENGINE_PACKAGE = '@opencraw/ocr-tesseract' + +/** The engine package, loaded by name so no bundler or compiler tries to resolve it ahead of time. */ +async function loadEngine (): Promise { + let loaded: { createOcrEngine?: () => OcrEngine } + try { + loaded = await import(/* webpackIgnore: true */ ENGINE_PACKAGE) as typeof loaded + } catch (error) { + throw new Error(`OCR needs the ${ENGINE_PACKAGE} package: install it (npm install ${ENGINE_PACKAGE}) next to @opencraw/core`, { cause: error }) + } + if (loaded.createOcrEngine === undefined) throw new Error(`${ENGINE_PACKAGE} does not export createOcrEngine: it is too old for this version of @opencraw/core`) + + return loaded.createOcrEngine() +} + +/** + * Runs a PDF read with OCR from a recipe's `ocr` setting. The engine starts when a page first needs it and its worker threads are stopped when the + * read ends, whether it succeeds or not. + * + * @param setting - `true` for the defaults (English, pages with no text), or the languages, `always` and `dpi`. + * @param run - The read, given the OCR to pass to `readPdf`. + * @returns What the read returns. + */ +export async function withOcr (setting: true | OcrSetting, run: (ocr: PdfPageOcr) => Promise): Promise { + const options = setting === true ? {} : setting + let engine: OcrEngine | undefined + try { + return await run(pdfPageOcr({ + ...options, + engine: async () => { + engine ??= await loadEngine() + + return engine + }, + })) + } finally { + await engine?.dispose?.() + } +} diff --git a/packages/core/src/recipe-schema/step.contract.ts b/packages/core/src/recipe-schema/step.contract.ts index 9a3fc7ed..36c4e098 100644 --- a/packages/core/src/recipe-schema/step.contract.ts +++ b/packages/core/src/recipe-schema/step.contract.ts @@ -145,6 +145,8 @@ export interface RequestStep extends StepBaseFields { delimiter?: string /** A YAML body's scalars: `typed` (default, YAML 1.2) or `text`, every scalar as written (`0123` stays `"0123"`). */ scalars?: 'typed' | 'text' + /** Read a PDF that is a scan by OCR (needs `@opencraw/ocr-tesseract`): `true` reads the pages that have no text, in English; or give the Tesseract `languages`, `always` (read pages that have text too, for a wrong text layer) and `dpi`. */ + ocr?: boolean | { languages?: string[], always?: boolean, dpi?: number } } export interface ExtractStep extends StepBaseFields { type: 'extract' @@ -312,6 +314,9 @@ const waitStep = z.strictObject({ ...base, type: z.literal('wait'), selector: pl const evaluateStep = z.strictObject({ ...base, type: z.literal('evaluate'), script: z.string().min(1), args: z.record(z.string(), z.unknown()).optional() }) const screenshotStep = z.strictObject({ ...base, type: z.literal('screenshot'), path: z.string().min(1) }) const formFields = z.array(z.string().min(1)) +const ocrLanguage = z.string().regex(/^[a-z]{3}(?:_[a-z]+)?$/, 'a Tesseract language code: eng, por, ita, chi_sim') +const ocrOptions = z.strictObject({ languages: z.array(ocrLanguage).min(1).optional(), always: z.boolean().optional(), dpi: z.int().min(72).max(600).optional() }) +const ocrSetting = z.union([z.boolean(), ocrOptions]) const requestForm = z.strictObject({ selector: plainSelector, omit: formFields.optional(), set: stringMap.optional() }) const requestStep = z.strictObject({ ...base, @@ -326,10 +331,12 @@ const requestStep = z.strictObject({ encoding: z.string().min(1).optional(), delimiter: z.string().length(1).optional(), scalars: z.enum(YAML_SCALARS).optional(), + ocr: ocrSetting.optional(), }) .refine(step => step.body === undefined || step.form === undefined, { message: 'give body or form, not both', path: ['form'] }) .refine(step => step.delimiter === undefined || step.as === undefined || step.as === 'csv', { message: '"delimiter" reads CSV only: drop it or set "as": "csv"', path: ['delimiter'] }) .refine(step => step.scalars === undefined || step.as === undefined || step.as === 'yaml', { message: '"scalars" reads YAML only: drop it or set "as": "yaml"', path: ['scalars'] }) + .refine(step => step.ocr === undefined || step.ocr === false || step.as === undefined || step.as === 'pdf', { message: '"ocr" reads PDF scans only: drop it or set "as": "pdf"', path: ['ocr'] }) const tableOnly = ['columns', 'until', 'align', 'sheet', 'headerRows', 'fillDown', 'includeHidden', 'slide', 'shapes'] as const const extractStep = z.strictObject({ ...base, diff --git a/packages/core/tools/make-scanned-fixtures.mjs b/packages/core/tools/make-scanned-fixtures.mjs new file mode 100644 index 00000000..52f9aa90 --- /dev/null +++ b/packages/core/tools/make-scanned-fixtures.mjs @@ -0,0 +1,95 @@ +// Writes the scanned-PDF fixtures the OCR tests read into src/pdf-ocr/fixtures/: one-page PDFs whose only content is a JPEG of text, what a scanner makes. They have no +// text layer. The text is drawn with the system's sans-serif font, so run this on a machine that has one, then commit the files: the tests read them, they do not make them. +// Run: node tools/make-scanned-fixtures.mjs +import { mkdirSync, writeFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { createCanvas } from '@napi-rs/canvas' + +const here = dirname(fileURLToPath(import.meta.url)) +const target = join(here, '..', 'src', 'pdf-ocr', 'fixtures') +mkdirSync(target, { recursive: true }) + +/** A one-page PDF with one JPEG filling it. */ +function pdfWithJpeg (jpeg, width, height, pageWidth, pageHeight) { + const parts = [] + const offsets = [] + let length = 0 + const push = (chunk) => { + const buffer = typeof chunk === 'string' ? Buffer.from(chunk, 'latin1') : chunk + parts.push(buffer) + length += buffer.length + } + const object = (number, body) => { + offsets[number] = length + push(`${number} 0 obj\n${body}\nendobj\n`) + } + push('%PDF-1.4\n') + object(1, '<< /Type /Catalog /Pages 2 0 R >>') + object(2, '<< /Type /Pages /Kids [3 0 R] /Count 1 >>') + object(3, `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pageWidth} ${pageHeight}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`) + offsets[4] = length + push(`4 0 obj\n<< /Type /XObject /Subtype /Image /Width ${width} /Height ${height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${jpeg.length} >>\nstream\n`) + push(jpeg) + push('\nendstream\nendobj\n') + const content = `q ${pageWidth} 0 0 ${pageHeight} 0 0 cm /Im0 Do Q` + object(5, `<< /Length ${content.length} >>\nstream\n${content}\nendstream`) + const xref = length + push(`xref\n0 6\n0000000000 65535 f \n${[1, 2, 3, 4, 5].map(number => `${String(offsets[number]).padStart(10, '0')} 00000 n \n`).join('')}`) + push(`trailer\n<< /Size 6 /Root 1 0 R >>\nstartxref\n${xref}\n%%EOF\n`) + + return Buffer.concat(parts) +} + +/** Draws lines of text on a sheet and scans it: `tiltDegrees` is how crooked the paper went in, `noise` (0 to 1) the scanner's grain. */ +function scan ({ lines, pageWidth = 420, pageHeight = 595, pixelsPerPoint = 2.5, fontPoints = 14, tiltDegrees = 0, noise = 0, shade = 0, quality = 70 }) { + const width = Math.round(pageWidth * pixelsPerPoint) + const height = Math.round(pageHeight * pixelsPerPoint) + const canvas = createCanvas(width, height) + const context = canvas.getContext('2d') + // Paper that is darker at one side, as a scan near a book's spine is: `shade` is how many levels darker. + const paper = context.createLinearGradient(0, 0, width, 0) + paper.addColorStop(0, `rgb(${246 - shade}, ${243 - shade}, ${236 - shade})`) + paper.addColorStop(1, '#f6f3ec') + context.fillStyle = paper + context.fillRect(0, 0, width, height) + context.save() + context.translate(width / 2, height / 2) + context.rotate((tiltDegrees * Math.PI) / 180) + context.translate(-width / 2, -height / 2) + context.fillStyle = '#1c1c1c' + const size = fontPoints * pixelsPerPoint + context.font = `${size}px sans-serif` + for (const [index, line] of lines.entries()) context.fillText(line, 40 * pixelsPerPoint, (70 * pixelsPerPoint) + (index * size * 1.9)) + context.restore() + if (noise > 0) { + const image = context.getImageData(0, 0, width, height) + // A fixed sequence, so the fixture is the same file every time it is made. + let seed = 12_345 + const random = () => { + seed = (Math.imul(seed, 1_103_515_245) + 12_345) >>> 0 + + return seed / 4_294_967_296 + } + for (let at = 0; at < image.data.length; at += 4) { + const shift = Math.round((random() - 0.5) * 110 * noise) + for (let channel = 0; channel < 3; channel += 1) image.data[at + channel] = Math.min(255, Math.max(0, image.data[at + channel] + shift)) + } + context.putImageData(image, 0, 0) + } + + return pdfWithJpeg(canvas.toBuffer('image/jpeg', quality), width, height, pageWidth, pageHeight) +} + +const TABLE = ['Incentivi giugno 2026', 'Marca Modello Prezzo Sconto', 'Fiat Pandina 15950 12,5%', 'Jeep Avenger 24950 8,0%', 'Totale ordini: 1.250'] + +const fixtures = { + 'scan-clean.pdf': scan({ lines: TABLE }), + 'scan-poor.pdf': scan({ lines: TABLE, pixelsPerPoint: 2, tiltDegrees: 2.2, noise: 0.5 }), + // 200 dpi, fed in 4.5 degrees crooked, with shaded paper: read as it is, Tesseract finds nothing; cleaned, every character. + 'scan-crooked-shaded.pdf': scan({ lines: TABLE, pageHeight: 300, pixelsPerPoint: 2.8, fontPoints: 10, tiltDegrees: 4.5, noise: 0.5, shade: 60, quality: 60 }), +} +for (const [name, bytes] of Object.entries(fixtures)) { + writeFileSync(join(target, name), bytes) + console.log(`wrote ${name} (${bytes.length} bytes)`) +} diff --git a/packages/ocr-tesseract/.spec.swcrc b/packages/ocr-tesseract/.spec.swcrc new file mode 100644 index 00000000..3b52a537 --- /dev/null +++ b/packages/ocr-tesseract/.spec.swcrc @@ -0,0 +1,22 @@ +{ + "jsc": { + "target": "es2017", + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "decoratorMetadata": true, + "legacyDecorator": true + }, + "keepClassNames": true, + "externalHelpers": true, + "loose": true + }, + "module": { + "type": "es6" + }, + "sourceMaps": true, + "exclude": [] +} diff --git a/packages/ocr-tesseract/.swcrc b/packages/ocr-tesseract/.swcrc new file mode 100644 index 00000000..3ced5f17 --- /dev/null +++ b/packages/ocr-tesseract/.swcrc @@ -0,0 +1,22 @@ +{ + "jsc": { + "target": "es2017", + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "decoratorMetadata": true, + "legacyDecorator": true + }, + "keepClassNames": true, + "externalHelpers": true, + "loose": true + }, + "module": { + "type": "es6" + }, + "sourceMaps": true, + "exclude": ["jest.config.[ct]s",".*\\.spec.tsx?$",".*\\.test.tsx?$","./src/jest-setup.ts$","./**/jest-setup.ts$",".*.js$"] +} diff --git a/packages/ocr-tesseract/README.md b/packages/ocr-tesseract/README.md new file mode 100644 index 00000000..1763a9a0 --- /dev/null +++ b/packages/ocr-tesseract/README.md @@ -0,0 +1,65 @@ +

+ OpenCraw +

+ +# @opencraw/ocr-tesseract + +OCR for scanned PDFs, for [OpenCraw](https://github.com/Open-Craw/OpenCraw/blob/main/README.md). A scanned PDF is a picture of a page with no text in it; +this package reads the picture with Tesseract and gives the words back where they sit on the page, so a recipe's `table`, `region` and `section` +work on a scan as they do on a digital PDF. + +```sh +npm install @opencraw/ocr-tesseract +``` + +Tesseract runs in WebAssembly in worker threads, and the English model comes with the package, so nothing is downloaded at run time. Another +language is one install away: `npm install @tesseract.js-data/por`. + +## Use in a recipe + +Install the package next to `@opencraw/core` and ask for OCR on the `request`: + +```json +{ "type": "request", "id": "doc", "url": "{{start.url}}", "as": "pdf", "ocr": true } +{ "type": "request", "id": "doc", "url": "{{start.url}}", "as": "pdf", "ocr": { "languages": ["por", "eng"], "dpi": 200 } } +``` + +`ocr` is `true` (English, and only the pages that have no text layer) or an object: + +| Option | Meaning | +|---|---| +| `languages` | Tesseract codes (`eng`, `por`, `ita`, `chi_sim`…). Each needs its `@tesseract.js-data/` package, except `eng`. | +| `always` | Read every page by OCR and drop the text layer, for a PDF somebody ran bad OCR over. | +| `dpi` | The resolution a page is rendered at. Default: the scan's own, between 150 and 300. More only blurs a soft scan. | + +Without the package, a request with `ocr` fails and says to install it. A scan read without `ocr` fails and says to ask for it. + +## Use from code + +```ts +import { createOcrEngine } from '@opencraw/ocr-tesseract' +import { pdfPageOcr, readPdf } from '@opencraw/core' + +const engine = createOcrEngine() +const pdf = await readPdf(bytes, 'scan.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine), languages: ['eng'] }) }) +await engine.dispose?.() +``` + +`createOcrEngine(options)` takes `languages` (used when a recipe names none), `langPath` (a folder of your own `.traineddata.gz` models), +`segmentation` (Tesseract's page segmentation mode, default automatic) and `cleanup` (one way of cleaning a page, a list of ways tried in turn, +or `false` for the picture as it is). Anything that answers the `OcrEngine` contract of `@opencraw/core` can stand in for it: a cloud +service, another local engine. + +## What it does to a page before reading it + +Scans are rarely clean, and Tesseract reads clean pages. Each page is cleaned first, and every word comes back mapped to the original page's +coordinates, not the cleaned one's: + +- **Background flattening** divides out yellowed paper, a dark spine and uneven lighting. +- **Deskew** measures the tilt from the rows of text and straightens the page (up to 5 degrees either way). +- **Adaptive binarisation and a median filter** turn a grainy, low-contrast scan into black ink on white. + +No single cleaning is best for every scan, so the engine reads with a gentle one first, keeps it when the read is confident, and otherwise +tries a stronger one and keeps whichever read better. + +OCR reads what is printed; it can still confuse a character (`8,0%` read as `8,09`). Check a number that matters against a second source. diff --git a/packages/ocr-tesseract/jest-pdfjs.cjs b/packages/ocr-tesseract/jest-pdfjs.cjs new file mode 100644 index 00000000..8dd5830e --- /dev/null +++ b/packages/ocr-tesseract/jest-pdfjs.cjs @@ -0,0 +1,8 @@ +// Jest runs tests as CommonJS in its own module registry, which cannot load +// pdf.js (an ES module that reads import.meta), and it hands tests its own +// `module` builtin. Node's real one, from process.getBuiltinModule, gives a +// native require, which loads ES modules. Tests only: the published build +// imports pdf.js natively. +const { createRequire } = process.getBuiltinModule('node:module') + +module.exports = createRequire(__filename)('pdfjs-dist/legacy/build/pdf.mjs') diff --git a/packages/ocr-tesseract/jest.config.cts b/packages/ocr-tesseract/jest.config.cts new file mode 100644 index 00000000..9f0c32ea --- /dev/null +++ b/packages/ocr-tesseract/jest.config.cts @@ -0,0 +1,23 @@ +/* eslint-disable */ +const { readFileSync } = require('fs') + +// Reading the SWC compilation config for the spec files +const swcJestConfig = JSON.parse(readFileSync(`${__dirname}/.spec.swcrc`, 'utf-8')) + +// Disable .swcrc look-up by SWC core because we're passing in swcJestConfig ourselves +swcJestConfig.swcrc = false + +module.exports = { + displayName: '@opencraw/ocr-tesseract', + preset: '../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['@swc/jest', swcJestConfig], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + // pdf.js is an ES module Jest cannot load itself: see jest-pdfjs.cjs. + moduleNameMapper: { '^pdfjs-dist/legacy/build/pdf\\.mjs$': '/jest-pdfjs.cjs' }, + // marked ships as an ES module only: transform it like the sources (@opencraw/core is read from its sources). + transformIgnorePatterns: ['/node_modules/(?!marked/)'], + coverageDirectory: 'test-output/jest/coverage', +} diff --git a/packages/ocr-tesseract/package.json b/packages/ocr-tesseract/package.json new file mode 100644 index 00000000..443af9db --- /dev/null +++ b/packages/ocr-tesseract/package.json @@ -0,0 +1,49 @@ +{ + "name": "@opencraw/ocr-tesseract", + "version": "0.0.1", + "type": "module", + "main": "./dist/index.esm.js", + "module": "./dist/index.esm.js", + "types": "./dist/src/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/index.esm.js", + "default": "./dist/index.esm.js" + } + }, + "files": [ + "dist", + "!**/*.tsbuildinfo", + "!**/*.d.ts.map", + "!**/*.js.map" + ], + "dependencies": { + "@tesseract.js-data/eng": "^1.0.0", + "pngjs": "^7.0.0", + "tesseract.js": "^7.0.0" + }, + "publishConfig": { + "access": "public" + }, + "description": "OCR for scanned PDFs, for OpenCraw: Tesseract (WebAssembly, bundled English model, other languages from @tesseract.js-data packages) behind the engine contract @opencraw/core reads a scan with. Each page is cleaned before it is read (background flattened, straightened, binarized), and every word comes back where it was on the original page.", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/Open-Craw/OpenCraw.git", + "directory": "packages/ocr-tesseract" + }, + "keywords": [ + "ocr", + "tesseract", + "pdf", + "scan", + "crawler", + "opencraw" + ], + "engines": { + "node": ">=22" + }, + "sideEffects": false +} diff --git a/packages/ocr-tesseract/rollup.config.cjs b/packages/ocr-tesseract/rollup.config.cjs new file mode 100644 index 00000000..3596d961 --- /dev/null +++ b/packages/ocr-tesseract/rollup.config.cjs @@ -0,0 +1,116 @@ +const { withNx } = require('@nx/rollup/with-nx') + +module.exports = withNx( + { + main: './src/index.ts', + outputPath: './dist', + tsConfig: './tsconfig.lib.json', + // Swapped from swc by MoNecromanCI. @nx/rollup runs swc without + // sourceMaps, so it returns no map and the bundle's map comes out empty - + // valid-looking, and useless for debugging. See ROADMAP. + compiler: 'babel', + format: ['esm'], + // Added by MoNecromanCI: without this rollup emits no .js.map at all, so + // a breakpoint in a .ts file can never bind. Not published - see `files`. + sourceMap: true, + }, + { + // Added by MoNecromanCI. rollup hands sourcemapPathTransform an OS-NATIVE + // path with one parent segment too many, so `sources` resolve to nothing + // and no breakpoint can bind. Separators are normalised too: a sources + // entry is URL-style, so a backslash is wrong on every platform. + output: { + sourcemapPathTransform: relativeSourcePath => + relativeSourcePath + .replaceAll(String.fromCodePoint(92), '/') + .replace(/^(\.\.\/)+/, '../'), + }, + // Added by MoNecromanCI. @nx/rollup's dts-bundle plugin writes dist/index.d.ts + // as a stub re-exporting the real declarations, and builds that specifier with + // path.relative() - an OS-NATIVE path. On Windows it emits + // export * from "./src\\index"; + // which is not a valid module specifier on ANY platform: a specifier is + // URL-style, so / is correct everywhere and a backslash nowhere. It resolves on + // Windows only because the resolver normalises separators there, leaving the + // package untyped on Linux and macOS. + // + // mnci also points `types` past this stub, so nothing depends on it being + // correct; this makes the emitted file correct too. Remove once Nx fixes the + // plugin - its own devkit already exports normalizePath for exactly this. + // + // The second half fixes a separate defect in the REAL declarations `types` + // points at: tsconfig.lib.json declares under moduleResolution "bundler", + // where a bare relative specifier ("./lib/align") is valid, so every emitted + // .d.ts keeps the source's own extensionless imports verbatim. A consumer on + // "moduleResolution": "nodenext" - the workspace root default - requires an + // explicit extension on every relative specifier and gets TS2834 (or, + // combined with skipLibCheck, a silent zero-export module) instead. Declared + // extensions are left untouched; only a bare relative specifier gets .js + // appended, matching what tsc itself emits under node16/nodenext. + plugins: [ + { + name: 'mnci-normalise-declaration-specifiers', + writeBundle (outputOptions) { + const { existsSync, readdirSync, readFileSync, writeFileSync } = require('node:fs') + const { join } = require('node:path') + const dir = outputOptions.dir ?? './dist' + const stub = join(dir, 'index.d.ts') + let source + try { + source = readFileSync(stub, 'utf8') + } catch { + return + } + // The stub carries a TWO-character escape (JSON.stringify escaped one + // backslash), so this must not match a single one - that would turn + // "./src\index" into "./src//index". Built from char codes so there is + // no escaping in this file to get wrong. + const separator = String.fromCodePoint(92, 92) + const normalised = source.replaceAll(separator, '/') + if (normalised !== source) writeFileSync(stub, normalised) + + const bareRelativeSpecifier = /from(\s+)(['"])(\.[^'"]+)\2/g + const hasExtension = /\.(?:mjs|cjs|jsx?|json)$/ + let entries + try { + entries = readdirSync(dir, { recursive: true, withFileTypes: true }) + } catch { + return + } + for (const entry of entries) { + if (!entry.name.endsWith('.d.ts')) continue + const from = entry.parentPath ?? entry.path + const filePath = join(from, entry.name) + let declaration + try { + declaration = readFileSync(filePath, 'utf8') + } catch { + continue + } + // A bare specifier may name a FILE or a DIRECTORY BARREL - resolved + // against what rollup actually emitted next to this file, never + // guessed. A directory needs /index.js, not .js (a file that was + // never written); anything neither form matches is left alone rather + // than rewritten to a specifier that cannot resolve. + const resolveSpecifierSuffix = (specifier) => { + if (hasExtension.test(specifier)) return null + if (existsSync(join(from, specifier + '.d.ts'))) return specifier + '.js' + if (existsSync(join(from, specifier, 'index.d.ts'))) return specifier + '/index.js' + + return null + } + const withExtensions = declaration.replaceAll( + bareRelativeSpecifier, + (match, space, quote, specifier) => { + const resolved = resolveSpecifierSuffix(specifier) + + return resolved === null ? match : `from${space}${quote}${resolved}${quote}` + }, + ) + if (withExtensions !== declaration) writeFileSync(filePath, withExtensions) + } + }, + }, + ], + }, +) diff --git a/packages/ocr-tesseract/src/index.ts b/packages/ocr-tesseract/src/index.ts new file mode 100644 index 00000000..02d7dd10 --- /dev/null +++ b/packages/ocr-tesseract/src/index.ts @@ -0,0 +1,5 @@ +export { createOcrEngine } from './recognition' +export type { OcrEngineOptions } from './recognition' +export { OcrLanguageError } from './recognition' +export { cleanPage } from './page-cleanup' +export type { CleanPage, CleanupOptions } from './page-cleanup' diff --git a/packages/ocr-tesseract/src/page-cleanup/binarize.algorithm.ts b/packages/ocr-tesseract/src/page-cleanup/binarize.algorithm.ts new file mode 100644 index 00000000..a5543677 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/binarize.algorithm.ts @@ -0,0 +1,96 @@ +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { higherOf, lowerOf, roundedUp, wholePartOf } from './integer-math.algorithm' + +const BLACK = 0 +const WHITE = 255 + +/** + * The threshold that best splits the values in two groups (Otsu's method): the one maximising the variance between ink and ground. + * + * @param values - One 0 to 255 value per pixel. + * @returns The threshold: values at or under it are ink. + */ +export function otsuThreshold (values: Uint8Array): number { + const histogram: number[] = Array.from({ length: 256 }, () => 0) + for (const value of values) histogram[value] = (histogram[value] ?? 0) + 1 + const total = values.length + let weighted = 0 + for (let level = 0; level < 256; level += 1) weighted += level * (histogram[level] ?? 0) + let below = 0 + let belowWeighted = 0 + let best = 0 + let bestVariance = -1 + for (let level = 0; level < 256; level += 1) { + below += histogram[level] ?? 0 + if (below === 0) continue + const above = total - below + if (above === 0) break + belowWeighted += level * (histogram[level] ?? 0) + const spread = (belowWeighted / below) - ((weighted - belowWeighted) / above) + const variance = below * above * spread * spread + if (variance > bestVariance) { + bestVariance = variance + best = level + } + } + + return best +} + +/** Black ink on white from one global threshold. */ +export function globalBinarize (image: GrayImage): GrayImage { + const threshold = otsuThreshold(image.pixels) + const out = grayImage(image.width, image.height) + for (let at = 0; at < image.pixels.length; at += 1) out.pixels[at] = (image.pixels[at] ?? WHITE) <= threshold ? BLACK : WHITE + + return out +} + +/** + * Black ink on white from a threshold that follows the page (Sauvola's method): each pixel is compared with the mean of the window around it, + * lowered where the window is flat, so shading and stains do not turn paper into ink and faint strokes are kept. Integral images make the cost + * independent of the window's size. + * + * @param image - The scan, in gray. + * @param window - The window's side in pixels, about the height of a line of text; default a sixteenth of the shorter side, at least 15. + * @param sensitivity - How far below the local mean ink is taken to start; 0.2 for ordinary print. + * @returns The picture, only black and white. + */ +export function adaptiveBinarize (image: GrayImage, window = higherOf(15, roundedUp(lowerOf(image.width, image.height) / 16)), sensitivity = 0.2): GrayImage { + const { width, height, pixels } = image + const columns = width + 1 + const sums = new Float64Array(columns * (height + 1)) + const squares = new Float64Array(columns * (height + 1)) + for (let y = 0; y < height; y += 1) { + let rowSum = 0 + let rowSquare = 0 + for (let x = 0; x < width; x += 1) { + const value = pixels[(y * width) + x] ?? WHITE + rowSum += value + rowSquare += value * value + sums[((y + 1) * columns) + x + 1] = (sums[(y * columns) + x + 1] ?? 0) + rowSum + squares[((y + 1) * columns) + x + 1] = (squares[(y * columns) + x + 1] ?? 0) + rowSquare + } + } + const half = wholePartOf(window / 2) + const out = grayImage(width, height) + for (let y = 0; y < height; y += 1) { + const top = higherOf(0, y - half) + const bottom = lowerOf(height - 1, y + half) + 1 + for (let x = 0; x < width; x += 1) { + const left = higherOf(0, x - half) + const right = lowerOf(width - 1, x + half) + 1 + const area = (right - left) * (bottom - top) + const sum = (sums[(bottom * columns) + right] ?? 0) - (sums[(top * columns) + right] ?? 0) - (sums[(bottom * columns) + left] ?? 0) + (sums[(top * columns) + left] ?? 0) + const square = (squares[(bottom * columns) + right] ?? 0) - (squares[(top * columns) + right] ?? 0) - (squares[(bottom * columns) + left] ?? 0) + (squares[(top * columns) + left] ?? 0) + const mean = sum / area + const variance = (square / area) - (mean * mean) + const deviation = variance > 0 ? Math.sqrt(variance) : 0 + const threshold = mean * (1 + (sensitivity * ((deviation / 128) - 1))) + out.pixels[(y * width) + x] = (pixels[(y * width) + x] ?? WHITE) <= threshold ? BLACK : WHITE + } + } + + return out +} diff --git a/packages/ocr-tesseract/src/page-cleanup/clean-page.use-case.ts b/packages/ocr-tesseract/src/page-cleanup/clean-page.use-case.ts new file mode 100644 index 00000000..7538356d --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/clean-page.use-case.ts @@ -0,0 +1,73 @@ +import { adaptiveBinarize, globalBinarize } from './binarize.algorithm' +import { estimateSkew, rotate, unrotate } from './deskew.algorithm' +import { flattenBackground } from './flatten-background.algorithm' +import { medianFilter } from './median-filter.algorithm' +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { grayOfPng, pngOfGray } from './png-gray.mapper' + +/** + * How a scanned page is cleaned before Tesseract reads it. Flattening the background and levelling the lines are on by default: measured on scans with shaded + * paper or a crooked feed, they are the difference between reading nothing and reading every character. Binarizing is off by default: on a flattened page it gains + * nothing over Tesseract's own, and at low resolution it thins strokes. + */ +export interface CleanupOptions { + /** Take out shading and a tinted paper. Default true. */ + flatten?: boolean + /** Level the lines of a page that was fed in crooked: `true` finds the angle, a number is the angle to turn by (clockwise, degrees). Default true. */ + deskew?: boolean | number + /** Ink as pure black on white: `adaptive` follows the page, `global` is one threshold for all of it, `none` keeps the grays. Default none. */ + binarize?: 'adaptive' | 'global' | 'none' + /** Take the grain out (a 3 by 3 median) before the ink is made black on white. Default false. */ + denoise?: boolean + /** White margin around the page, in pixels: Tesseract misses glyphs that touch the edge. Default 12. */ + padding?: number +} + +/** A cleaned page: its picture, and where its pixels came from on the picture it was made from. */ +export interface CleanPage { + png: Uint8Array + width: number + height: number + /** How far the page was turned to level its lines, clockwise degrees; 0 when it was level. */ + skewDegrees: number + /** A position on the cleaned picture as a position on the original, undoing the margin and the turn. */ + toSource: (point: { x: number, y: number }) => { x: number, y: number } +} + +/** A skew smaller than this is the measurement's noise, not paper: the page is left as it is. */ +const MIN_SKEW = 0.3 + +/** + * Cleans a page picture for OCR: grayscale, the background flattened, the lines levelled, optionally the ink made black on white by a threshold that + * follows the page, and a white margin. A scan is read better when it looks like a clean copy of what it was a picture of. + * + * @param png - The page, as PNG bytes. + * @param options - What to do. + * @returns The cleaned picture and how to map positions on it back to the original. + */ +export function cleanPage (png: Uint8Array, options: CleanupOptions = {}): CleanPage { + let image: GrayImage = grayOfPng(png) + const original = { width: image.width, height: image.height } + if (options.flatten !== false) image = flattenBackground(image) + let skew = 0 + if (typeof options.deskew === 'number') skew = options.deskew + else if (options.deskew !== false) skew = estimateSkew(image) + if (Math.abs(skew) < MIN_SKEW) skew = 0 + image = rotate(image, skew) + if (options.denoise === true) image = medianFilter(image) + const binarize = options.binarize ?? 'none' + if (binarize === 'adaptive') image = adaptiveBinarize(image) + else if (binarize === 'global') image = globalBinarize(image) + const padding = Math.max(0, Math.round(options.padding ?? 12)) + const padded = grayImage(image.width + (2 * padding), image.height + (2 * padding)) + for (let y = 0; y < image.height; y += 1) padded.pixels.set(image.pixels.subarray(y * image.width, (y + 1) * image.width), ((y + padding) * padded.width) + padding) + + return { + png: pngOfGray(padded), + width: padded.width, + height: padded.height, + skewDegrees: skew, + toSource: point => unrotate({ x: point.x - padding, y: point.y - padding }, skew, original), + } +} diff --git a/packages/ocr-tesseract/src/page-cleanup/deskew.algorithm.ts b/packages/ocr-tesseract/src/page-cleanup/deskew.algorithm.ts new file mode 100644 index 00000000..7e0a7bb2 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/deskew.algorithm.ts @@ -0,0 +1,159 @@ +import { otsuThreshold } from './binarize.algorithm' +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { higherOf, roundedUp, wholePartOf } from './integer-math.algorithm' + +/** The long side the skew is measured on: a scan's skew shows at a fraction of its size, and the measure is quadratic in pixels. */ +const MEASURE_SIDE = 700 +/** The most points of ink looked at: the skew shows in a sample as well as in all of them. */ +const MAX_POINTS = 60_000 + +interface Point { + x: number + y: number +} + +/** The picture shrunk by whole-pixel averaging so its long side is about `side`, and how many times smaller it is. */ +function shrunk (image: GrayImage, side: number): { image: GrayImage, factor: number } { + const factor = higherOf(1, wholePartOf(higherOf(image.width, image.height) / side)) + if (factor === 1) return { image, factor } + const width = wholePartOf(image.width / factor) + const height = wholePartOf(image.height / factor) + const out = grayImage(width, height) + for (let y = 0; y < height; y += 1) { + for (let x = 0; x < width; x += 1) { + let sum = 0 + for (let dy = 0; dy < factor; dy += 1) for (let dx = 0; dx < factor; dx += 1) sum += image.pixels[(((y * factor) + dy) * image.width) + (x * factor) + dx] ?? 255 + out.pixels[(y * width) + x] = roundedUp(sum / (factor * factor)) + } + } + + return { image: out, factor } +} + +/** The ink's coordinates around the picture's centre, thinned to at most {@link MAX_POINTS}. */ +function inkPoints (image: GrayImage): Point[] { + const threshold = otsuThreshold(image.pixels) + const points: Point[] = [] + for (let y = 0; y < image.height; y += 1) { + for (let x = 0; x < image.width; x += 1) if ((image.pixels[(y * image.width) + x] ?? 255) <= threshold) points.push({ x: x - (image.width / 2), y: y - (image.height / 2) }) + } + const every = higherOf(1, Math.ceil(points.length / MAX_POINTS)) + + return every === 1 ? points : points.filter((_, index) => index % every === 0) +} + +/** How sharply the ink falls into rows when the page is turned by `degrees`: rows of text and the gaps between them make a spiky histogram only when the lines are level. */ +function sharpness (points: readonly Point[], degrees: number, rows: number): number { + const radians = (degrees * Math.PI) / 180 + const sine = Math.sin(radians) + const cosine = Math.cos(radians) + const histogram = new Float64Array(rows) + for (const point of points) { + const position = (point.x * sine) + (point.y * cosine) + (rows / 2) + const row = position < 0 ? -1 : roundedUp(position) + if (row >= 0 && row < rows) histogram[row] = (histogram[row] ?? 0) + 1 + } + let sum = 0 + for (const count of histogram) sum += count * count + + return sum +} + +/** + * How much a scan was fed in crooked, in degrees, from the sharpness of its rows of text: turning the page by the right amount makes the lines + * level, and the ink then falls into few, full rows. Searched coarsely over `maxDegrees` either way, then finely around the best. + * + * @param image - The scan, in gray. + * @param maxDegrees - The most skew looked for either way; default 5. + * @returns The angle to turn the picture by (clockwise, degrees) to level the text; 0 when there is no text to measure. + */ +export function estimateSkew (image: GrayImage, maxDegrees = 5): number { + const { image: small } = shrunk(image, MEASURE_SIDE) + const points = inkPoints(small) + if (points.length < 200) return 0 + const rows = Math.ceil(Math.hypot(small.width, small.height)) + 2 + let best = 0 + let bestScore = sharpness(points, 0, rows) + for (let degrees = -maxDegrees; degrees <= maxDegrees; degrees += 0.5) { + const score = sharpness(points, degrees, rows) + if (score > bestScore) { + best = degrees + bestScore = score + } + } + const around = best + for (let degrees = around - 0.5; degrees <= around + 0.5; degrees += 0.05) { + const score = sharpness(points, degrees, rows) + if (score > bestScore) { + best = degrees + bestScore = score + } + } + + return Math.round(best * 100) / 100 +} + +/** The picture's value at a position between pixels (bilinear), white where the position is off the picture. */ +function sampled (image: GrayImage, x: number, y: number): number { + const { width, height, pixels } = image + if (x < 0 || y < 0 || x > width - 1 || y > height - 1) return 255 + const left = wholePartOf(x) + const top = wholePartOf(y) + const right = left < width - 1 ? left + 1 : left + const below = top < height - 1 ? top + 1 : top + const fx = x - left + const fy = y - top + const value = ((pixels[(top * width) + left] ?? 255) * (1 - fx) * (1 - fy)) + ((pixels[(top * width) + right] ?? 255) * fx * (1 - fy)) + ((pixels[(below * width) + left] ?? 255) * (1 - fx) * fy) + ((pixels[(below * width) + right] ?? 255) * fx * fy) + + return roundedUp(value) +} + +/** + * Turns a picture clockwise about its centre, the corners it uncovers white and the edges smoothed (bilinear). The picture keeps its size. + * + * @param image - The picture. + * @param degrees - How far to turn it, clockwise. + * @returns The turned picture. + */ +export function rotate (image: GrayImage, degrees: number): GrayImage { + if (degrees === 0) return image + const radians = (degrees * Math.PI) / 180 + const sine = Math.sin(radians) + const cosine = Math.cos(radians) + const centreX = image.width / 2 + const centreY = image.height / 2 + const out = grayImage(image.width, image.height) + for (let y = 0; y < image.height; y += 1) { + for (let x = 0; x < image.width; x += 1) { + // Where this pixel came from: the output turned back by the same angle. + const dx = x - centreX + const dy = y - centreY + const sourceX = (dx * cosine) + (dy * sine) + centreX + const sourceY = (-dx * sine) + (dy * cosine) + centreY + out.pixels[(y * image.width) + x] = sampled(image, sourceX, sourceY) + } + } + + return out +} + +/** + * Where a point of the turned picture was in the picture before it was turned: the inverse of {@link rotate}, to put what was read from a straightened + * page back where it sits on the original. + * + * @param point - A position in the turned picture. + * @param degrees - The angle the picture was turned by. + * @param size - The picture's size. + * @returns The position in the original. + */ +export function unrotate (point: { x: number, y: number }, degrees: number, size: { width: number, height: number }): { x: number, y: number } { + const radians = (degrees * Math.PI) / 180 + const sine = Math.sin(radians) + const cosine = Math.cos(radians) + const dx = point.x - (size.width / 2) + const dy = point.y - (size.height / 2) + + // The same mapping `rotate` uses to find where each output pixel came from. + return { x: (dx * cosine) + (dy * sine) + (size.width / 2), y: (-dx * sine) + (dy * cosine) + (size.height / 2) } +} diff --git a/packages/ocr-tesseract/src/page-cleanup/flatten-background.algorithm.ts b/packages/ocr-tesseract/src/page-cleanup/flatten-background.algorithm.ts new file mode 100644 index 00000000..94734ec8 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/flatten-background.algorithm.ts @@ -0,0 +1,86 @@ +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { higherOf, lowerOf, roundedUp } from './integer-math.algorithm' + +/** The ink is thinner than this many pixels at the page's usual scale, so the background estimate (the lightest pixel around) steps over it. */ +const INK_RADIUS = 6 + +/** Running maximum along one axis, window `2 * radius + 1`: the lightest value around each pixel. */ +function lightest (values: Uint8Array, width: number, height: number, radius: number, vertical: boolean): Uint8Array { + const out = new Uint8Array(values.length) + const length = vertical ? height : width + const lines = vertical ? width : height + const stride = vertical ? width : 1 + const step = vertical ? 1 : width + for (let line = 0; line < lines; line += 1) { + const start = line * step + for (let at = 0; at < length; at += 1) { + const from = higherOf(0, at - radius) + const to = lowerOf(length - 1, at + radius) + let best = 0 + for (let near = from; near <= to; near += 1) { + const value = values[start + (near * stride)] ?? 0 + if (value > best) best = value + } + out[start + (at * stride)] = best + } + } + + return out +} + +/** Box blur along one axis, window `2 * radius + 1`, by running sums: the cost does not grow with the radius. */ +function averaged (values: Uint8Array, width: number, height: number, radius: number, vertical: boolean): Uint8Array { + const out = new Uint8Array(values.length) + const length = vertical ? height : width + const lines = vertical ? width : height + const stride = vertical ? width : 1 + const step = vertical ? 1 : width + for (let line = 0; line < lines; line += 1) { + const start = line * step + let sum = 0 + let count = 0 + for (let near = 0; near <= lowerOf(length - 1, radius); near += 1) { + sum += values[start + (near * stride)] ?? 0 + count += 1 + } + for (let at = 0; at < length; at += 1) { + out[start + (at * stride)] = roundedUp(sum / count) + const entering = at + radius + 1 + const leaving = at - radius + if (entering < length) { + sum += values[start + (entering * stride)] ?? 0 + count += 1 + } + if (leaving >= 0) { + sum -= values[start + (leaving * stride)] ?? 0 + count -= 1 + } + } + } + + return out +} + +/** + * Takes the shading out of a scan: yellowed paper, a darker edge near the spine, the lamp's fall-off. The page's background is estimated as the + * lightest pixel around each one (which steps over ink), smoothed, and every pixel is divided by it, so paper comes out white wherever it was + * and ink stays dark. Like photocopying with the lid raised. + * + * @param image - The scan, in gray. + * @returns The flattened picture. + */ +export function flattenBackground (image: GrayImage): GrayImage { + const { width, height, pixels } = image + const smooth = higherOf(12, roundedUp(lowerOf(width, height) / 25)) + let background = lightest(lightest(pixels, width, height, INK_RADIUS, false), width, height, INK_RADIUS, true) + background = averaged(averaged(background, width, height, smooth, false), width, height, smooth, true) + const out = grayImage(width, height) + for (const [at, pixel] of pixels.entries()) { + const paper = background[at] ?? 255 + const value = roundedUp(((pixel ?? 255) * 255) / (Math.max(paper, 1))) + out.pixels[at] = Math.min(value, 255) + } + + return out +} diff --git a/packages/ocr-tesseract/src/page-cleanup/gray-image.model.ts b/packages/ocr-tesseract/src/page-cleanup/gray-image.model.ts new file mode 100644 index 00000000..d0ea9652 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/gray-image.model.ts @@ -0,0 +1,18 @@ +/** A picture in shades of gray: one 0 (black) to 255 (white) value per pixel, rows top to bottom. */ +export interface GrayImage { + width: number + height: number + pixels: Uint8Array +} + +/** + * A blank picture. + * + * @param width - Pixels across. + * @param height - Pixels down. + * @param fill - The gray every pixel starts as; default white. + * @returns The picture. + */ +export function grayImage (width: number, height: number, fill = 255): GrayImage { + return { width, height, pixels: new Uint8Array(width * height).fill(fill) } +} diff --git a/packages/ocr-tesseract/src/page-cleanup/index.ts b/packages/ocr-tesseract/src/page-cleanup/index.ts new file mode 100644 index 00000000..1df56b0a --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/index.ts @@ -0,0 +1,9 @@ +export { cleanPage } from './clean-page.use-case' +export type { CleanPage, CleanupOptions } from './clean-page.use-case' +export { adaptiveBinarize, globalBinarize, otsuThreshold } from './binarize.algorithm' +export { estimateSkew, rotate, unrotate } from './deskew.algorithm' +export { flattenBackground } from './flatten-background.algorithm' +export { grayImage } from './gray-image.model' +export { medianFilter } from './median-filter.algorithm' +export type { GrayImage } from './gray-image.model' +export { grayOfPng, pngOfGray } from './png-gray.mapper' diff --git a/packages/ocr-tesseract/src/page-cleanup/integer-math.algorithm.ts b/packages/ocr-tesseract/src/page-cleanup/integer-math.algorithm.ts new file mode 100644 index 00000000..4e4acf50 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/integer-math.algorithm.ts @@ -0,0 +1,35 @@ +/* eslint-disable unicorn/prefer-math-min-max, unicorn/prefer-math-trunc -- see below: these helpers exist to not call Math.* */ +/** + * The few arithmetic helpers the per-pixel loops use. They are plain comparisons and bit operations on purpose: a call to `Math.min`, `Math.max`, + * `Math.floor` or `Math.round` is about a hundred times slower inside a sandboxed test runner than in Node (measured: 150 ns against 1 ns), and these + * loops make tens of millions of them a page. With these the cleanup of a page takes a third of a second under the test runner, not fifteen seconds. + * Written as `Math.*` the rules above would be right; do not "simplify" them. + */ + +/** The smaller of two numbers. */ +export function lowerOf (a: number, b: number): number { + return a < b ? a : b +} + +/** The larger of two numbers. */ +export function higherOf (a: number, b: number): number { + return a > b ? a : b +} + +/** A number held between two limits. */ +export function clampedTo (value: number, low: number, high: number): number { + if (value < low) return low + if (value > high) return high + + return value +} + +/** A non-negative number rounded to the nearest integer (halves up), as `Math.round` does for it. */ +export function roundedUp (value: number): number { + return (value + 0.5) | 0 +} + +/** A non-negative number with its fraction dropped, as `Math.floor` does for it. */ +export function wholePartOf (value: number): number { + return value | 0 +} diff --git a/packages/ocr-tesseract/src/page-cleanup/median-filter.algorithm.ts b/packages/ocr-tesseract/src/page-cleanup/median-filter.algorithm.ts new file mode 100644 index 00000000..5356398d --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/median-filter.algorithm.ts @@ -0,0 +1,51 @@ +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' + +/** The middle value of nine, by insertion sort on a small buffer: no allocation and no generic sort per pixel. */ +function medianOfNine (values: Uint8Array): number { + for (let at = 1; at < 9; at += 1) { + const value = values[at] ?? 0 + let before = at - 1 + while (before >= 0 && (values[before] ?? 0) > value) { + values[before + 1] = values[before] ?? 0 + before -= 1 + } + values[before + 1] = value + } + + return values[4] ?? 255 +} + +/** + * Replaces each pixel by the median of the 3 by 3 around it: the speckle of a grainy scan or a photocopy goes, and strokes keep their edges (a mean + * would smear them). The picture's edge repeats outward. + * + * @param image - The picture. + * @returns The picture without the grain. + */ +export function medianFilter (image: GrayImage): GrayImage { + const { width, height, pixels } = image + const out = grayImage(width, height) + const around = new Uint8Array(9) + for (let y = 0; y < height; y += 1) { + const above = (y > 0 ? y - 1 : 0) * width + const here = y * width + const below = (y < height - 1 ? y + 1 : y) * width + for (let x = 0; x < width; x += 1) { + const left = x > 0 ? x - 1 : 0 + const right = x < width - 1 ? x + 1 : x + around[0] = pixels[above + left] ?? 255 + around[1] = pixels[above + x] ?? 255 + around[2] = pixels[above + right] ?? 255 + around[3] = pixels[here + left] ?? 255 + around[4] = pixels[here + x] ?? 255 + around[5] = pixels[here + right] ?? 255 + around[6] = pixels[below + left] ?? 255 + around[7] = pixels[below + x] ?? 255 + around[8] = pixels[below + right] ?? 255 + out.pixels[here + x] = medianOfNine(around) + } + } + + return out +} diff --git a/packages/ocr-tesseract/src/page-cleanup/page-cleanup.test.ts b/packages/ocr-tesseract/src/page-cleanup/page-cleanup.test.ts new file mode 100644 index 00000000..dfe0d721 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/page-cleanup.test.ts @@ -0,0 +1,166 @@ +import { adaptiveBinarize, globalBinarize, otsuThreshold } from './binarize.algorithm' +import { cleanPage } from './clean-page.use-case' +import { estimateSkew, rotate, unrotate } from './deskew.algorithm' +import { flattenBackground } from './flatten-background.algorithm' +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { medianFilter } from './median-filter.algorithm' +import { grayOfPng, pngOfGray } from './png-gray.mapper' + +/** A page of text-like lines: rows of black dashes (words) on white, level. */ +function textLikePage (width = 800, height = 600): GrayImage { + const image = grayImage(width, height) + for (let line = 0; line < 12; line += 1) { + const top = 60 + (line * 40) + let x = 60 + while (x < width - 80) { + const word = 30 + ((x * 7 + line * 13) % 60) + for (let y = top; y < top + 14; y += 1) for (let dx = 0; dx < word; dx += 1) image.pixels[(y * width) + x + dx] = 0 + x += word + 14 + } + } + + return image +} + +describe('png-gray', () => { + it('goes from a gray picture to a PNG and back, and counts a transparent pixel as paper', () => { + const image = grayImage(4, 2) + image.pixels.set([0, 50, 100, 150, 200, 255, 10, 20]) + + const back = grayOfPng(pngOfGray(image)) + + expect([back.width, back.height, [...back.pixels]]).toEqual([4, 2, [0, 50, 100, 150, 200, 255, 10, 20]]) + }) +}) + +describe('flattenBackground', () => { + it('brings paper that is shaded across the page to white and leaves the ink dark', () => { + const image = grayImage(400, 300) + // The paper goes from 120 on the left to 230 on the right; a bar of ink sits in the dark part and one in the light part. + for (let y = 0; y < 300; y += 1) for (let x = 0; x < 400; x += 1) image.pixels[(y * 400) + x] = Math.round(120 + ((x / 399) * 110)) + for (let y = 100; y < 112; y += 1) for (let x = 40; x < 140; x += 1) image.pixels[(y * 400) + x] = 20 + for (let y = 100; y < 112; y += 1) for (let x = 260; x < 360; x += 1) image.pixels[(y * 400) + x] = 90 + + const flat = flattenBackground(image) + + const paper = [10, 200, 390].map(x => flat.pixels[(250 * 400) + x] ?? 0) + expect(Math.min(...paper)).toBeGreaterThanOrEqual(245) + expect(flat.pixels[(105 * 400) + 90]).toBeLessThan(40) + expect(flat.pixels[(105 * 400) + 310]).toBeLessThan(140) + }) +}) + +describe('skew', () => { + it('finds how far a page was turned, from its lines of text', () => { + const level = textLikePage() + const crooked = rotate(level, 2.5) + + expect(Math.abs(estimateSkew(level))).toBeLessThan(0.3) + expect(estimateSkew(crooked)).toBeCloseTo(-2.5, 0) + expect(Math.abs(estimateSkew(crooked) + 2.5)).toBeLessThan(0.3) + }) + + it('has no skew to find in a page with nothing on it', () => { + expect(estimateSkew(grayImage(300, 300))).toBe(0) + }) + + it('turns a picture and puts a position back where it was', () => { + const image = grayImage(300, 200) + for (let y = 58; y < 62; y += 1) for (let x = 218; x < 222; x += 1) image.pixels[(y * 300) + x] = 0 + + const turned = rotate(image, 12) + // eslint-disable-next-line unicorn/prefer-iterator-to-array -- this package's lib has no Iterator#toArray + const ink = [...turned.pixels.entries()].filter(([, value]) => value < 128).map(([at]) => ({ x: at % 300, y: Math.floor(at / 300) })) + const count = ink.length + const found = { x: ink.reduce((sum, point) => sum + point.x, 0) / count, y: ink.reduce((sum, point) => sum + point.y, 0) / count } + + expect(count).toBeGreaterThan(8) + expect(Math.hypot(found.x - 220, found.y - 60)).toBeGreaterThan(10) + const back = unrotate(found, 12, { width: 300, height: 200 }) + // Within a pixel: the turn smooths the dot, which moves its centre a little. + expect(Math.hypot(back.x - 220, back.y - 60)).toBeLessThan(1.5) + }) + + it('leaves a picture alone for no turn', () => { + const image = textLikePage(100, 100) + + expect(rotate(image, 0)).toBe(image) + }) +}) + +describe('binarize', () => { + it('splits a page of two grays at the threshold between them', () => { + const values = new Uint8Array(1000) + values.fill(220, 0, 700) + values.fill(40, 700) + + const threshold = otsuThreshold(values) + + expect(threshold).toBeGreaterThanOrEqual(40) + expect(threshold).toBeLessThan(220) + }) + + it('makes ink black on white, one global threshold or one that follows the page', () => { + const image = grayImage(300, 200) + for (let y = 0; y < 200; y += 1) for (let x = 0; x < 300; x += 1) image.pixels[(y * 300) + x] = 150 + Math.round((x / 299) * 90) + for (let y = 90; y < 100; y += 1) for (let x = 20; x < 120; x += 1) image.pixels[(y * 300) + x] = 80 + for (let y = 90; y < 100; y += 1) for (let x = 190; x < 290; x += 1) image.pixels[(y * 300) + x] = 160 + + // A window wider than the strokes: the default scales with a real page, which this small picture is not. + const adaptive = adaptiveBinarize(image, 41) + const global = globalBinarize(image) + + expect(new Set(adaptive.pixels)).toEqual(new Set([0, 255])) + // The ink in the dark part and the faint ink in the light part are both found, the shaded paper is not turned to ink. + expect(adaptive.pixels[(95 * 300) + 70]).toBe(0) + expect(adaptive.pixels[(95 * 300) + 240]).toBe(0) + expect(adaptive.pixels[(30 * 300) + 20]).toBe(255) + expect(adaptive.pixels[(30 * 300) + 280]).toBe(255) + expect(new Set(global.pixels)).toEqual(new Set([0, 255])) + }) +}) + +describe('cleanPage', () => { + it('levels a crooked page, adds a margin, and says where each position on the clean picture is on the original', () => { + const level = textLikePage() + const crooked = rotate(level, 2.2) + + const clean = cleanPage(pngOfGray(crooked), { padding: 10, binarize: 'adaptive' }) + + expect(Math.abs(clean.skewDegrees + 2.2)).toBeLessThan(0.3) + expect([clean.width, clean.height]).toEqual([820, 620]) + // The page's centre is the centre of the original, whatever the margin and the turn. + const centre = clean.toSource({ x: 410, y: 310 }) + expect(centre.x).toBeCloseTo(400, 0) + expect(centre.y).toBeCloseTo(300, 0) + // A position at the top left of the clean text maps back near the top of the tilted page. + const decoded = grayOfPng(clean.png) + expect(new Set(decoded.pixels)).toEqual(new Set([0, 255])) + }) + + it('leaves a level page unturned, and does only what it is asked to', () => { + const level = textLikePage() + const clean = cleanPage(pngOfGray(level), { padding: 0, binarize: 'none', flatten: false, deskew: false }) + + expect(clean.skewDegrees).toBe(0) + expect([...grayOfPng(clean.png).pixels]).toEqual([...level.pixels]) + expect(cleanPage(pngOfGray(level), { padding: 0, deskew: 4 }).skewDegrees).toBe(4) + }) +}) + +describe('medianFilter', () => { + it('takes isolated specks out and keeps a stroke\'s edge where it is', () => { + const image = grayImage(40, 20) + for (let y = 0; y < 20; y += 1) for (let x = 20; x < 40; x += 1) image.pixels[(y * 40) + x] = 0 + image.pixels[(10 * 40) + 5] = 0 + image.pixels[(5 * 40) + 30] = 255 + + const filtered = medianFilter(image) + + expect(filtered.pixels[(10 * 40) + 5]).toBe(255) + expect(filtered.pixels[(5 * 40) + 30]).toBe(0) + expect(filtered.pixels[(10 * 40) + 19]).toBe(255) + expect(filtered.pixels[(10 * 40) + 20]).toBe(0) + }) +}) diff --git a/packages/ocr-tesseract/src/page-cleanup/png-gray.mapper.ts b/packages/ocr-tesseract/src/page-cleanup/png-gray.mapper.ts new file mode 100644 index 00000000..dabbf239 --- /dev/null +++ b/packages/ocr-tesseract/src/page-cleanup/png-gray.mapper.ts @@ -0,0 +1,46 @@ +import { PNG } from 'pngjs' +import { grayImage } from './gray-image.model' +import type { GrayImage } from './gray-image.model' +import { roundedUp } from './integer-math.algorithm' + +/** PNG output for Tesseract, not for storage: no row filter search and light compression, many times faster to write. */ +const FAST_PNG = { filterType: 0, deflateLevel: 1 } + +/** + * A PNG as a gray picture: luminance by the usual weights, a transparent pixel counted as white paper. + * + * @param png - The PNG's bytes. + * @returns The picture. + */ +export function grayOfPng (png: Uint8Array): GrayImage { + const decoded = PNG.sync.read(Buffer.from(png)) + const image = grayImage(decoded.width, decoded.height) + for (let pixel = 0; pixel < decoded.width * decoded.height; pixel += 1) { + const at = pixel * 4 + const alpha = (decoded.data[at + 3] ?? 255) / 255 + const luminance = (0.299 * (decoded.data[at] ?? 0)) + (0.587 * (decoded.data[at + 1] ?? 0)) + (0.114 * (decoded.data[at + 2] ?? 0)) + image.pixels[pixel] = roundedUp((luminance * alpha) + (255 * (1 - alpha))) + } + + return image +} + +/** + * A gray picture as a PNG. + * + * @param image - The picture. + * @returns The PNG's bytes. + */ +export function pngOfGray (image: GrayImage): Buffer { + const png = new PNG({ width: image.width, height: image.height }) + for (let pixel = 0; pixel < image.width * image.height; pixel += 1) { + const value = image.pixels[pixel] ?? 255 + const at = pixel * 4 + png.data[at] = value + png.data[at + 1] = value + png.data[at + 2] = value + png.data[at + 3] = 255 + } + + return PNG.sync.write(png, FAST_PNG) +} diff --git a/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.test.ts b/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.test.ts new file mode 100644 index 00000000..e642d529 --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.test.ts @@ -0,0 +1,85 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { pdfPageOcr, readPdf } from '@opencraw/core' +import type { OcrEngine } from '@opencraw/core' +import { createOcrEngine } from './create-ocr-engine.use-case' + +const fixtures = join(__dirname, '..', '..', '..', 'core', 'src', 'pdf-ocr', 'fixtures') +const scan = (name: string): Uint8Array => new Uint8Array(readFileSync(join(fixtures, name))) + +/** The text that was drawn on every fixture, one line each (spaces between the cells collapse). */ +const TABLE = ['Incentivi giugno 2026', 'Marca Modello Prezzo Sconto', 'Fiat Pandina 15950 12,5%', 'Jeep Avenger 24950 8,0%', 'Totale ordini: 1.250'] + +async function rowsOf (name: string, engine: OcrEngine): Promise { + const document = await readPdf(scan(name), name, { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine) }) }) + + return document.pages[0].rows.map(row => row.cells.map(cell => cell.text).join(' ')) +} + +describe('the Tesseract engine', () => { + let engine: OcrEngine + beforeAll(() => { engine = createOcrEngine() }) + afterAll(async () => { await engine.dispose?.() }) + + it('reads a scanned PDF into the rows that were drawn on it', async () => { + expect(await rowsOf('scan-clean.pdf', engine)).toEqual(TABLE) + }, 60_000) + + it('reads cells where they sit on the page, in points from the bottom left', async () => { + const document = await readPdf(scan('scan-clean.pdf'), 'scan-clean.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine) }) }) + + const [page] = document.pages + const brand = page.rows[2].cells.find(cell => cell.text === 'Fiat') + // Drawn at x = 40 pt on a 420 x 595 pt page, the third line down: the engine finds it within a few points. + expect(brand?.x).toBeGreaterThan(36) + expect(brand?.x).toBeLessThan(48) + expect(brand?.y).toBeGreaterThan(595 - 140) + expect(brand?.y).toBeLessThan(595 - 90) + // The cells of a row come left to right, as they are on the page. + for (const row of page.rows) expect(row.cells.map(cell => cell.x)).toEqual(row.cells.map(cell => cell.x).sort((a, b) => a - b)) + }, 60_000) + + it('reads a scan that is tilted and shaded: the plain cleaning reads nothing of it, the second try, with the grain out and the ink black, reads it', async () => { + const rows = await rowsOf('scan-crooked-shaded.pdf', engine) + + expect(rows).toHaveLength(5) + for (const token of ['Incentivi', 'Pandina', '15950', 'Avenger', '24950', 'Totale']) expect(rows.join(' ')).toContain(token) + }, 60_000) + + it('puts cells where they are on the tilted page, not where they would be on a straightened one', async () => { + const document = await readPdf(scan('scan-crooked-shaded.pdf'), 'scan-crooked-shaded.pdf', { ocr: pdfPageOcr({ engine: () => Promise.resolve(engine) }) }) + + const [page] = document.pages + const first = page.rows[0].cells[0] + const last = page.rows.at(-1)?.cells[0] + // The page was fed in 4.5 degrees clockwise: its left margin leans, so the last line starts a few points to the left of the first. On a straightened page both would start at 40. + expect(first.x - (last?.x ?? first.x)).toBeGreaterThan(3) + expect(page.rows[0].top).toBeGreaterThan(page.rows.at(-1)?.top ?? 0) + }, 60_000) + + it('reads one way of cleaning when told one, and nothing from the tilted and shaded scan when told none', async () => { + const once = createOcrEngine({ cleanup: { binarize: 'adaptive', denoise: true } }) + try { + const rows = await rowsOf('scan-crooked-shaded.pdf', once) + expect(rows.join(' ')).toContain('Pandina') + } finally { + await once.dispose?.() + } + + const raw = createOcrEngine({ cleanup: false }) + try { + await expect(rowsOf('scan-crooked-shaded.pdf', raw)).rejects.toThrow('OCR found no text on any page') + } finally { + await raw.dispose?.() + } + }, 60_000) + + it('names a language whose model is not installed, and what to install', async () => { + const italian = createOcrEngine({ languages: ['ita'] }) + try { + await expect(rowsOf('scan-clean.pdf', italian)).rejects.toThrow(/language data for "ita" is not installed: npm install @tesseract\.js-data\/ita/) + } finally { + await italian.dispose?.() + } + }, 60_000) +}) diff --git a/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.ts b/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.ts new file mode 100644 index 00000000..7b56dcb5 --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/create-ocr-engine.use-case.ts @@ -0,0 +1,110 @@ +import type { OcrEngine, OcrLine, OcrPageImage, OcrWord } from '@opencraw/core' +import type { Block } from 'tesseract.js' +import { cleanPage } from '../page-cleanup' +import type { CleanPage, CleanupOptions } from '../page-cleanup' +import { DEFAULT_LANGUAGE, tesseractLanguages } from './language-codes.policy' +import { TesseractWorkers } from './tesseract-ocr.client' +import type { TesseractOptions } from './tesseract-ocr.client' + +/** How the engine reads pages. */ +export interface OcrEngineOptions extends TesseractOptions { + /** The languages to read when the recipe names none, as codes (`eng`, `ita`) or two-letter ones (`en`, `it`); default English. */ + languages?: readonly string[] + /** + * How each page is cleaned before it is read: one way, `false` for the picture as it is, or a list of ways tried in turn (the first whose reading is + * good enough is kept, else the best). Default: flatten and straighten, and if that reads poorly, take the grain out and binarize. + */ + cleanup?: CleanupOptions | readonly CleanupOptions[] | false +} + +interface Point { + x: number + y: number +} + +/** The ways a page is cleaned, in the order tried: the gentle one reads most scans; one that reads poorly (grain, a stained page) is tried again binarized. */ +const DEFAULT_PASSES: readonly CleanupOptions[] = [{ binarize: 'none' }, { binarize: 'adaptive', denoise: true }] + +/** A reading with this many characters the engine is sure of, and a high average confidence, is good enough to stop: the next way of cleaning is not tried. */ +const GOOD_CHARACTERS = 20 +const GOOD_CONFIDENCE = 85 +/** A word below this confidence is a guess: it does not count towards how good a reading is. */ +const SURE = 60 + +/** How good a reading is: the characters in the words the engine is sure of, and their average confidence. */ +function qualityOf (lines: readonly OcrLine[]): { characters: number, confidence: number } { + const sure = lines.flatMap(line => line.words).filter(word => word.confidence >= SURE) + const characters = sure.reduce((sum, word) => sum + word.text.trim().length, 0) + + return { characters, confidence: sure.length === 0 ? 0 : sure.reduce((sum, word) => sum + word.confidence, 0) / sure.length } +} + +/** A box on the cleaned picture as a box on the original: the corners, put back where they were, and the box around them. */ +function boxOnSource (clean: CleanPage, box: { x0: number, y0: number, x1: number, y1: number }): { x0: number, y0: number, x1: number, y1: number } { + const corners: Point[] = [{ x: box.x0, y: box.y0 }, { x: box.x1, y: box.y0 }, { x: box.x0, y: box.y1 }, { x: box.x1, y: box.y1 }].map(corner => clean.toSource(corner)) + const xs = corners.map(corner => corner.x) + const ys = corners.map(corner => corner.y) + + return { x0: Math.min(...xs), y0: Math.min(...ys), x1: Math.max(...xs), y1: Math.max(...ys) } +} + +/** The lines Tesseract found, with every position put back on the original picture, the baseline's slant included. */ +function linesOf (blocks: readonly Block[], clean: CleanPage): OcrLine[] { + return blocks.flatMap(block => block.paragraphs.flatMap(paragraph => paragraph.lines.map((line): OcrLine => { + const words: OcrWord[] = line.words.map(word => ({ text: word.text, confidence: word.confidence, ...boxOnSource(clean, word.bbox) })) + const { baseline } = line + // A line Tesseract found no baseline for has one with no length. + if (baseline.x1 <= baseline.x0) return { words } + const from = clean.toSource({ x: baseline.x0, y: baseline.y0 }) + const to = clean.toSource({ x: baseline.x1, y: baseline.y1 }) + + return { words, baseline: { x0: from.x, y0: from.y, x1: to.x, y1: to.y } } + }))) +} + +/** The ways to clean a page, as the engine was configured: a list is a list of passes, one way is one pass, `false` is the picture as it is. */ +function passes (cleanup: OcrEngineOptions['cleanup']): readonly (CleanupOptions | false)[] { + if (cleanup === undefined) return DEFAULT_PASSES + if (cleanup === false) return [false] + + return Array.isArray(cleanup) ? cleanup : [cleanup as CleanupOptions] +} + +/** A cleaned page that is the picture as it was given. */ +function untouched (image: OcrPageImage): CleanPage { + return { png: image.png, width: image.width, height: image.height, skewDegrees: 0, toSource: point => point } +} + +/** Reads the page with each way of cleaning it in turn: the first reading that is good enough is kept, else the one with the most characters the engine is sure of. */ +async function readPasses (ways: readonly (CleanupOptions | false)[], image: OcrPageImage, languages: readonly string[], workers: TesseractWorkers): Promise { + let best: { lines: OcrLine[], characters: number } | undefined + for (const way of ways) { + const clean = way === false ? untouched(image) : cleanPage(image.png, way) + const lines = linesOf(await workers.read(clean.png, languages, image.scale * 72), clean) + const quality = qualityOf(lines) + if (quality.characters >= GOOD_CHARACTERS && quality.confidence >= GOOD_CONFIDENCE) return lines + if (best === undefined || quality.characters > best.characters) best = { lines, characters: quality.characters } + } + + return best?.lines ?? [] +} + +/** + * An OCR engine for `@opencraw/core`: each page picture is cleaned (background flattened, lines levelled; if that reads poorly, the grain taken out and + * the ink made black on white), read by Tesseract, and every word handed back where it sits on the picture it was given, whatever the cleaning did to + * the geometry. + * + * @param options - Default languages, cleanup, and where models live. + * @returns The engine. Call `dispose` when done, to stop the Tesseract worker threads. + */ +export function createOcrEngine (options: OcrEngineOptions = {}): OcrEngine { + const workers = new TesseractWorkers(options) + const defaults = tesseractLanguages(options.languages ?? [DEFAULT_LANGUAGE]) + const ways = passes(options.cleanup) + + return { + name: 'tesseract', + recognize: async (image, requested) => await readPasses(ways, image, requested.languages.length > 0 ? tesseractLanguages(requested.languages) : defaults, workers), + dispose: async () => { await workers.close() }, + } +} diff --git a/packages/ocr-tesseract/src/recognition/index.ts b/packages/ocr-tesseract/src/recognition/index.ts new file mode 100644 index 00000000..97f22c6a --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/index.ts @@ -0,0 +1,4 @@ +export { createOcrEngine } from './create-ocr-engine.use-case' +export type { OcrEngineOptions } from './create-ocr-engine.use-case' +export { OcrLanguageError } from './ocr-language.error' +export { tesseractLanguages } from './language-codes.policy' diff --git a/packages/ocr-tesseract/src/recognition/language-codes.policy.ts b/packages/ocr-tesseract/src/recognition/language-codes.policy.ts new file mode 100644 index 00000000..c59b89ec --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/language-codes.policy.ts @@ -0,0 +1,57 @@ +/** The Tesseract code of each two-letter language code a recipe may use, for the languages with a model people ask for. */ +const TESSERACT_CODES: Readonly> = { + ar: 'ara', + bg: 'bul', + ca: 'cat', + cs: 'ces', + da: 'dan', + de: 'deu', + el: 'ell', + en: 'eng', + es: 'spa', + et: 'est', + fi: 'fin', + fr: 'fra', + he: 'heb', + hi: 'hin', + hr: 'hrv', + hu: 'hun', + id: 'ind', + it: 'ita', + ja: 'jpn', + ko: 'kor', + lt: 'lit', + lv: 'lav', + nb: 'nor', + nl: 'nld', + no: 'nor', + pl: 'pol', + pt: 'por', + ro: 'ron', + ru: 'rus', + sk: 'slk', + sl: 'slv', + sv: 'swe', + th: 'tha', + tr: 'tur', + uk: 'ukr', + vi: 'vie', + zh: 'chi_sim', +} + +/** The language a page is read in when nothing says. */ +export const DEFAULT_LANGUAGE = 'eng' + +/** + * The Tesseract languages for the ones asked for: two-letter codes (`it`, `pt`) become Tesseract's (`ita`, `por`), Tesseract's own are kept + * (`eng`, `chi_sim`, `por+eng` as two), lower-cased and without repeats. English when none is asked for. + * + * @param languages - The languages, as a recipe wrote them. + * @returns The Tesseract codes, in the order asked for. + */ +export function tesseractLanguages (languages: readonly string[]): string[] { + const codes = languages.flatMap(language => language.toLowerCase().split('+')).map(code => code.trim()).filter(code => code !== '').map(code => TESSERACT_CODES[code] ?? code) + const unique = [...new Set(codes)] + + return unique.length === 0 ? [DEFAULT_LANGUAGE] : unique +} diff --git a/packages/ocr-tesseract/src/recognition/language-data.client.ts b/packages/ocr-tesseract/src/recognition/language-data.client.ts new file mode 100644 index 00000000..ec8da1c2 --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/language-data.client.ts @@ -0,0 +1,51 @@ +import { copyFileSync, existsSync, mkdirSync } from 'node:fs' +import { createRequire } from 'node:module' +import { tmpdir } from 'node:os' +import { basename, dirname, join } from 'node:path' +import { OcrLanguageError } from './ocr-language.error' + +/** The model the data packages keep the small LSTM ("best", quantised) models in: the size of a quick read, the accuracy of the slow one. */ +const MODEL_FOLDER = '4.0.0_best_int' + +/** + * Where a language's model file is: in `langPath` when the caller keeps its own models, else in the `@tesseract.js-data/` package (English + * comes with this package; any other language is one `npm install @tesseract.js-data/` away). + */ +function modelFile (language: string, langPath: string | undefined): string { + if (langPath !== undefined) { + const own = join(langPath, `${language}.traineddata.gz`) + if (!existsSync(own)) throw new OcrLanguageError(`there is no "${language}.traineddata.gz" in ${langPath}`) + + return own + } + const require = createRequire(import.meta.url) + try { + return join(dirname(require.resolve(`@tesseract.js-data/${language}/package.json`)), MODEL_FOLDER, `${language}.traineddata.gz`) + } catch (error) { + throw new OcrLanguageError(`the OCR language data for "${language}" is not installed: npm install @tesseract.js-data/${language}, or give "langPath" a folder with ${language}.traineddata.gz`, { cause: error }) + } +} + +/** + * The folder Tesseract reads the models of these languages from. One language already lies in a folder of its own; several are gathered into one + * (a folder under the system's temp folder, made once and reused) because Tesseract takes a single folder. + * + * @param languages - The Tesseract codes of the languages. + * @param langPath - A folder of the caller's own models, if it keeps any. + * @returns The folder. + * @throws OcrLanguageError for a language with no model installed. + */ +export function languageFolder (languages: readonly string[], langPath: string | undefined): string { + const files = languages.map(language => modelFile(language, langPath)) + if (langPath !== undefined) return langPath + const [first] = files + if (first !== undefined && files.length === 1) return dirname(first) + const folder = join(tmpdir(), 'opencraw-ocr-models', [...languages].sort((a, b) => a.localeCompare(b)).join('+')) + mkdirSync(folder, { recursive: true }) + for (const file of files) { + const target = join(folder, basename(file)) + if (!existsSync(target)) copyFileSync(file, target) + } + + return folder +} diff --git a/packages/ocr-tesseract/src/recognition/ocr-language.error.ts b/packages/ocr-tesseract/src/recognition/ocr-language.error.ts new file mode 100644 index 00000000..6cc00e49 --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/ocr-language.error.ts @@ -0,0 +1,4 @@ +/** A language the page is to be read in has no model installed, with what to install. */ +export class OcrLanguageError extends Error { + override readonly name = 'OcrLanguageError' +} diff --git a/packages/ocr-tesseract/src/recognition/request-ocr.integration.test.ts b/packages/ocr-tesseract/src/recognition/request-ocr.integration.test.ts new file mode 100644 index 00000000..04f12dcd --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/request-ocr.integration.test.ts @@ -0,0 +1,31 @@ +import { join } from 'node:path' +import { pathToFileURL } from 'node:url' +import { HttpClient } from '@opencraw/core' + +const scan = pathToFileURL(join(__dirname, '..', '..', '..', 'core', 'src', 'pdf-ocr', 'fixtures', 'scan-clean.pdf')).href + +describe('a request for a scanned PDF with "ocr"', () => { + it('reads the scan through the installed engine and stops its workers', async () => { + const client = await HttpClient.open() + try { + const response = await client.send({ url: scan, ocr: true }) + + expect(response.format).toBe('pdf') + expect(response.body.kind).toBe('pdf') + const text = response.body.kind === 'pdf' ? response.body.pages.flatMap(page => page.rows).map(row => row.cells.map(cell => cell.text).join(' ')).join('\n') : '' + expect(text).toContain('Totale ordini') + expect(text).toContain('24950') + } finally { + await client.dispose() + } + }, 60_000) + + it('says what is wrong when the request does not ask for OCR', async () => { + const client = await HttpClient.open() + try { + await expect(client.send({ url: scan })).rejects.toThrow('ocr') + } finally { + await client.dispose() + } + }, 60_000) +}) diff --git a/packages/ocr-tesseract/src/recognition/tesseract-ocr.client.ts b/packages/ocr-tesseract/src/recognition/tesseract-ocr.client.ts new file mode 100644 index 00000000..773c5c4a --- /dev/null +++ b/packages/ocr-tesseract/src/recognition/tesseract-ocr.client.ts @@ -0,0 +1,73 @@ +import { createWorker, OEM } from 'tesseract.js' +import type { Block, PSM, Worker } from 'tesseract.js' +import { languageFolder } from './language-data.client' + +/** The page segmentation Tesseract is run with: it finds the blocks and lines itself (`3`), which is what a page of columns, tables and paragraphs needs. */ +const AUTO_SEGMENTATION = '3' + +export interface TesseractOptions { + /** A folder of `.traineddata.gz` files of the caller's own; default: the `@tesseract.js-data` packages. */ + langPath?: string + /** Tesseract's page segmentation mode; default 3, automatic. */ + segmentation?: string +} + +/** + * Tesseract, in worker threads running WebAssembly, one per set of languages and started when a page first needs it. Models come from disk, + * never from a CDN, and nothing is cached in the working directory. Pages queue on their worker. + */ +export class TesseractWorkers { + private readonly workers = new Map>() + + constructor (private readonly options: TesseractOptions = {}) {} + + private async start (languages: readonly string[]): Promise { + const key = languages.join('+') + const existing = this.workers.get(key) + if (existing !== undefined) return await existing + const pending = createWorker([...languages], OEM.LSTM_ONLY, { langPath: languageFolder(languages, this.options.langPath), gzip: true, cacheMethod: 'none' }) + this.workers.set(key, pending) + try { + const worker = await pending + await worker.setParameters({ tessedit_pageseg_mode: (this.options.segmentation ?? AUTO_SEGMENTATION) as PSM, preserve_interword_spaces: '1' }) + + return worker + } catch (error) { + // A failed start is not kept: the next page tries again (a model installed in the meantime is found). + this.workers.delete(key) + throw error + } + } + + /** + * Reads one picture. + * + * @param png - The page, cleaned. + * @param languages - The Tesseract codes of the languages it is written in. + * @param dpi - The picture's resolution: Tesseract sizes its reading by it, and guesses (and says so on the console) when it is not told. + * @returns Tesseract's blocks: paragraphs, lines and words with their boxes and confidence. + */ + async read (png: Uint8Array, languages: readonly string[], dpi: number): Promise { + const worker = await this.start(languages) + const resolution = Math.max(70, Math.round(dpi)) + await worker.setParameters({ user_defined_dpi: String(resolution) }) + const { data } = await worker.recognize(Buffer.from(png), {}, { blocks: true }) + + return data.blocks ?? [] + } + + /** Stops every worker thread. */ + async close (): Promise { + // eslint-disable-next-line unicorn/prefer-iterator-to-array -- this package's lib has no Iterator#toArray + const started = [...this.workers.values()] + this.workers.clear() + for (const pending of started) { + try { + const worker = await pending + await worker.terminate() + } catch { + // A worker that never started has nothing to stop. + } + } + } +} diff --git a/packages/ocr-tesseract/tsconfig.json b/packages/ocr-tesseract/tsconfig.json new file mode 100644 index 00000000..62ebbd94 --- /dev/null +++ b/packages/ocr-tesseract/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/ocr-tesseract/tsconfig.lib.json b/packages/ocr-tesseract/tsconfig.lib.json new file mode 100644 index 00000000..12204465 --- /dev/null +++ b/packages/ocr-tesseract/tsconfig.lib.json @@ -0,0 +1,29 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", + "emitDeclarationOnly": true, + "module": "esnext", + "moduleResolution": "bundler", + "forceConsistentCasingInFileNames": true, + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { + "path": "../core/tsconfig.lib.json" + } + ], + "exclude": [ + "jest.config.ts", + "jest.config.cts", + "src/**/*.spec.ts", + "src/**/*.test.ts" + ] +} diff --git a/packages/ocr-tesseract/tsconfig.spec.json b/packages/ocr-tesseract/tsconfig.spec.json new file mode 100644 index 00000000..2d74c1fc --- /dev/null +++ b/packages/ocr-tesseract/tsconfig.spec.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out-tsc/jest", + "types": [ + "jest", + "node" + ], + "module": "esnext", + "moduleResolution": "bundler", + "forceConsistentCasingInFileNames": true + }, + "include": [ + "jest.config.ts", + "jest.config.cts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index 9c27a0f9..274afad5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,6 +41,9 @@ }, { "path": "./apps/vscode-extension" + }, + { + "path": "./packages/ocr-tesseract" } ], "compilerOptions": {} From 29e79f3dc49fc4219799b7ffbc6ecb8383bc4a47 Mon Sep 17 00:00:00 2001 From: Eduardo Russo Date: Sat, 17 Oct 2026 02:19:55 +0100 Subject: [PATCH 2/3] fix(ocr-tesseract): declare core as a peer dependency; lint fixture tool Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01TjR6eM2tUwU3NGnKXsmEap --- package-lock.json | 3 +++ packages/core/tools/make-scanned-fixtures.mjs | 4 ++-- packages/ocr-tesseract/package.json | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 163832e2..65dd4d10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38632,6 +38632,9 @@ "pngjs": "^7.0.0", "tesseract.js": "^7.0.0" }, + "peerDependencies": { + "@opencraw/core": "^0.0.1" + }, "engines": { "node": ">=22" } diff --git a/packages/core/tools/make-scanned-fixtures.mjs b/packages/core/tools/make-scanned-fixtures.mjs index 52f9aa90..50bbb7fc 100644 --- a/packages/core/tools/make-scanned-fixtures.mjs +++ b/packages/core/tools/make-scanned-fixtures.mjs @@ -84,8 +84,8 @@ function scan ({ lines, pageWidth = 420, pageHeight = 595, pixelsPerPoint = 2.5, const TABLE = ['Incentivi giugno 2026', 'Marca Modello Prezzo Sconto', 'Fiat Pandina 15950 12,5%', 'Jeep Avenger 24950 8,0%', 'Totale ordini: 1.250'] const fixtures = { - 'scan-clean.pdf': scan({ lines: TABLE }), - 'scan-poor.pdf': scan({ lines: TABLE, pixelsPerPoint: 2, tiltDegrees: 2.2, noise: 0.5 }), + 'scan-clean.pdf': scan({ lines: TABLE }), + 'scan-poor.pdf': scan({ lines: TABLE, pixelsPerPoint: 2, tiltDegrees: 2.2, noise: 0.5 }), // 200 dpi, fed in 4.5 degrees crooked, with shaded paper: read as it is, Tesseract finds nothing; cleaned, every character. 'scan-crooked-shaded.pdf': scan({ lines: TABLE, pageHeight: 300, pixelsPerPoint: 2.8, fontPoints: 10, tiltDegrees: 4.5, noise: 0.5, shade: 60, quality: 60 }), } diff --git a/packages/ocr-tesseract/package.json b/packages/ocr-tesseract/package.json index 443af9db..3b87c785 100644 --- a/packages/ocr-tesseract/package.json +++ b/packages/ocr-tesseract/package.json @@ -24,6 +24,9 @@ "pngjs": "^7.0.0", "tesseract.js": "^7.0.0" }, + "peerDependencies": { + "@opencraw/core": "^0.0.1" + }, "publishConfig": { "access": "public" }, From 83bcfb5dc2c66443b436578f2e6285dbce8e99a2 Mon Sep 17 00:00:00 2001 From: Eduardo Russo Date: Sat, 17 Oct 2026 02:31:45 +0100 Subject: [PATCH 3/3] test(ocr-tesseract): load the engine from sources in the request test Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01TjR6eM2tUwU3NGnKXsmEap --- packages/ocr-tesseract/jest.config.cts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ocr-tesseract/jest.config.cts b/packages/ocr-tesseract/jest.config.cts index 9f0c32ea..9eff3f14 100644 --- a/packages/ocr-tesseract/jest.config.cts +++ b/packages/ocr-tesseract/jest.config.cts @@ -16,7 +16,7 @@ module.exports = { }, moduleFileExtensions: ['ts', 'js', 'html'], // pdf.js is an ES module Jest cannot load itself: see jest-pdfjs.cjs. - moduleNameMapper: { '^pdfjs-dist/legacy/build/pdf\\.mjs$': '/jest-pdfjs.cjs' }, + moduleNameMapper: { '^pdfjs-dist/legacy/build/pdf\\.mjs$': '/jest-pdfjs.cjs', '^@opencraw/ocr-tesseract$': '/src/index.ts' }, // marked ships as an ES module only: transform it like the sources (@opencraw/core is read from its sources). transformIgnorePatterns: ['/node_modules/(?!marked/)'], coverageDirectory: 'test-output/jest/coverage',